feat: add email_send orchestrator tool

Wraps the existing email_utils.send_email helper as an admin-only tool.
Accepts to, subject, body (plain text); newlines converted to <br> for HTML part.
Registered in _CALLABLES, _ALL_DECLARATIONS, and TOOL_ROLES (admin).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-04-29 21:35:29 -04:00
parent a5658eb3c4
commit fd0fb76c08
2 changed files with 40 additions and 2 deletions

View File

@@ -48,7 +48,7 @@ from tools.scratch import (
from tools.system import cortex_restart as _cortex_restart, cortex_logs as _cortex_logs
from tools.web import http_fetch as _http_fetch
from tools.files import file_list as _file_list, file_write as _file_write
from tools.notify import nc_talk_send as _nc_talk_send
from tools.notify import nc_talk_send as _nc_talk_send, email_send as _email_send
# ---------------------------------------------------------------------------
@@ -296,6 +296,7 @@ _CALLABLES: dict[str, callable] = {
"cortex_restart": _cortex_restart,
"cortex_logs": _cortex_logs,
"http_fetch": _http_fetch,
"email_send": _email_send,
"nc_talk_send": _nc_talk_send,
"task_list": _task_list,
"task_create": _task_create,
@@ -755,6 +756,24 @@ _file_write_declaration = types.FunctionDeclaration(
),
)
_email_send_declaration = types.FunctionDeclaration(
name="email_send",
description=(
"Send an email from the server's configured SMTP account. Use for delivering "
"summaries, reports, reminders, or any content the user wants emailed. "
"body is plain text; newlines are preserved."
),
parameters=types.Schema(
type=types.Type.OBJECT,
properties={
"to": types.Schema(type=types.Type.STRING, description="Recipient email address"),
"subject": types.Schema(type=types.Type.STRING, description="Email subject line"),
"body": types.Schema(type=types.Type.STRING, description="Plain-text email body"),
},
required=["to", "subject", "body"],
),
)
_nc_talk_send_declaration = types.FunctionDeclaration(
name="nc_talk_send",
description=(
@@ -791,6 +810,8 @@ TOOL_ROLES: dict[str, str] = {
"file_list": "admin",
"file_write": "admin",
"ae_task_list": "admin", # reads agents_sync kanban
"email_send": "admin", # sends from server SMTP account
"nc_talk_send": "admin",
}
# Tools that require explicit user confirmation before executing.
@@ -831,6 +852,7 @@ _ALL_DECLARATIONS: list[types.FunctionDeclaration] = [
_cortex_restart_declaration,
_cortex_logs_declaration,
_http_fetch_declaration,
_email_send_declaration,
_nc_talk_send_declaration,
_task_list_declaration,
_task_create_declaration,