@elizaos/plugin-agent-orchestrator 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/coding-task-handlers.d.ts +1 -1
- package/dist/actions/coding-task-handlers.d.ts.map +1 -1
- package/dist/actions/coding-task-helpers.d.ts +2 -11
- package/dist/actions/coding-task-helpers.d.ts.map +1 -1
- package/dist/actions/eval-metadata.d.ts +11 -0
- package/dist/actions/eval-metadata.d.ts.map +1 -0
- package/dist/actions/send-to-agent.d.ts.map +1 -1
- package/dist/actions/spawn-agent.d.ts.map +1 -1
- package/dist/actions/start-coding-task.d.ts +6 -2
- package/dist/actions/start-coding-task.d.ts.map +1 -1
- package/dist/actions/task-control.d.ts +3 -0
- package/dist/actions/task-control.d.ts.map +1 -0
- package/dist/actions/task-history.d.ts +3 -0
- package/dist/actions/task-history.d.ts.map +1 -0
- package/dist/actions/task-share.d.ts +3 -0
- package/dist/actions/task-share.d.ts.map +1 -0
- package/dist/actions/task-thread-target.d.ts +11 -0
- package/dist/actions/task-thread-target.d.ts.map +1 -0
- package/dist/api/agent-routes.d.ts.map +1 -1
- package/dist/api/coordinator-routes.d.ts.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4930 -1686
- package/dist/index.js.map +32 -24
- package/dist/providers/action-examples.d.ts.map +1 -1
- package/dist/services/agent-credentials.d.ts +4 -0
- package/dist/services/agent-credentials.d.ts.map +1 -0
- package/dist/services/pty-auto-response.d.ts.map +1 -1
- package/dist/services/pty-service.d.ts +14 -1
- package/dist/services/pty-service.d.ts.map +1 -1
- package/dist/services/pty-spawn.d.ts.map +1 -1
- package/dist/services/swarm-coordinator-prompts.d.ts.map +1 -1
- package/dist/services/swarm-coordinator.d.ts +85 -3
- package/dist/services/swarm-coordinator.d.ts.map +1 -1
- package/dist/services/swarm-decision-loop.d.ts.map +1 -1
- package/dist/services/swarm-idle-watchdog.d.ts.map +1 -1
- package/dist/services/task-agent-frameworks.d.ts.map +1 -1
- package/dist/services/task-kind.d.ts +3 -0
- package/dist/services/task-kind.d.ts.map +1 -0
- package/dist/services/task-policy.d.ts.map +1 -1
- package/dist/services/task-registry.d.ts +289 -1
- package/dist/services/task-registry.d.ts.map +1 -1
- package/dist/services/task-share.d.ts +18 -0
- package/dist/services/task-share.d.ts.map +1 -0
- package/dist/services/task-validation.d.ts +43 -0
- package/dist/services/task-validation.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/services/ansi-utils.ts", "../src/services/trajectory-context.ts", "../src/services/swarm-coordinator-prompts.ts", "../src/services/swarm-event-triage.ts", "../src/services/task-validation.ts", "../src/services/swarm-decision-loop.ts", "../node_modules/drizzle-orm/entity.js", "../node_modules/drizzle-orm/column.js", "../node_modules/drizzle-orm/column-builder.js", "../node_modules/drizzle-orm/table.utils.js", "../node_modules/drizzle-orm/tracing-utils.js", "../node_modules/drizzle-orm/pg-core/unique-constraint.js", "../node_modules/drizzle-orm/pg-core/columns/common.js", "../node_modules/drizzle-orm/pg-core/columns/enum.js", "../node_modules/drizzle-orm/subquery.js", "../node_modules/drizzle-orm/version.js", "../node_modules/drizzle-orm/tracing.js", "../node_modules/drizzle-orm/view-common.js", "../node_modules/drizzle-orm/table.js", "../node_modules/drizzle-orm/sql/sql.js", "../node_modules/drizzle-orm/alias.js", "../node_modules/drizzle-orm/errors.js", "../node_modules/drizzle-orm/logger.js", "../node_modules/drizzle-orm/query-promise.js", "../node_modules/drizzle-orm/utils.js", "../node_modules/drizzle-orm/pg-core/table.js", "../node_modules/drizzle-orm/pg-core/primary-keys.js", "../node_modules/drizzle-orm/sql/expressions/conditions.js", "../node_modules/drizzle-orm/sql/expressions/select.js", "../node_modules/drizzle-orm/sql/expressions/index.js", "../node_modules/drizzle-orm/relations.js", "../node_modules/drizzle-orm/sql/functions/aggregate.js", "../node_modules/drizzle-orm/sql/functions/vector.js", "../node_modules/drizzle-orm/sql/functions/index.js", "../node_modules/drizzle-orm/sql/index.js", "../node_modules/drizzle-orm/index.js", "../src/actions/finalize-workspace.ts", "../src/services/pty-service.ts", "../src/services/agent-metrics.ts", "../src/services/config-env.ts", "../src/services/pty-auto-response.ts", "../src/services/pty-init.ts", "../src/services/pty-session-io.ts", "../src/services/pty-spawn.ts", "../src/services/pty-types.ts", "../src/services/stall-classifier.ts", "../src/services/swarm-coordinator.ts", "../src/services/swarm-history.ts", "../src/services/
|
|
3
|
+
"sources": ["../src/services/ansi-utils.ts", "../src/services/trajectory-context.ts", "../src/services/swarm-coordinator-prompts.ts", "../src/services/swarm-event-triage.ts", "../src/services/task-validation.ts", "../src/services/swarm-decision-loop.ts", "../node_modules/drizzle-orm/entity.js", "../node_modules/drizzle-orm/column.js", "../node_modules/drizzle-orm/column-builder.js", "../node_modules/drizzle-orm/table.utils.js", "../node_modules/drizzle-orm/tracing-utils.js", "../node_modules/drizzle-orm/pg-core/unique-constraint.js", "../node_modules/drizzle-orm/pg-core/columns/common.js", "../node_modules/drizzle-orm/pg-core/columns/enum.js", "../node_modules/drizzle-orm/subquery.js", "../node_modules/drizzle-orm/version.js", "../node_modules/drizzle-orm/tracing.js", "../node_modules/drizzle-orm/view-common.js", "../node_modules/drizzle-orm/table.js", "../node_modules/drizzle-orm/sql/sql.js", "../node_modules/drizzle-orm/alias.js", "../node_modules/drizzle-orm/errors.js", "../node_modules/drizzle-orm/logger.js", "../node_modules/drizzle-orm/query-promise.js", "../node_modules/drizzle-orm/utils.js", "../node_modules/drizzle-orm/pg-core/table.js", "../node_modules/drizzle-orm/pg-core/primary-keys.js", "../node_modules/drizzle-orm/sql/expressions/conditions.js", "../node_modules/drizzle-orm/sql/expressions/select.js", "../node_modules/drizzle-orm/sql/expressions/index.js", "../node_modules/drizzle-orm/relations.js", "../node_modules/drizzle-orm/sql/functions/aggregate.js", "../node_modules/drizzle-orm/sql/functions/vector.js", "../node_modules/drizzle-orm/sql/functions/index.js", "../node_modules/drizzle-orm/sql/index.js", "../node_modules/drizzle-orm/index.js", "../src/actions/finalize-workspace.ts", "../src/services/pty-service.ts", "../src/services/agent-metrics.ts", "../src/services/config-env.ts", "../src/services/debug-capture.ts", "../src/services/pty-auto-response.ts", "../src/services/pty-init.ts", "../src/services/pty-session-io.ts", "../src/services/pty-spawn.ts", "../src/services/pty-types.ts", "../src/services/stall-classifier.ts", "../src/services/swarm-coordinator.ts", "../src/services/agent-credentials.ts", "../src/services/swarm-history.ts", "../src/services/swarm-idle-watchdog.ts", "../src/services/task-acceptance.ts", "../src/services/task-agent-frameworks.ts", "../src/services/task-kind.ts", "../src/services/task-registry.ts", "../src/actions/list-agents.ts", "../src/services/task-policy.ts", "../src/actions/task-thread-target.ts", "../src/actions/task-control.ts", "../src/actions/task-history.ts", "../src/services/task-share.ts", "../src/actions/task-share.ts", "../src/actions/manage-issues.ts", "../src/actions/provision-workspace.ts", "../src/actions/eval-metadata.ts", "../src/actions/send-to-agent.ts", "../src/actions/spawn-agent.ts", "../src/actions/start-coding-task.ts", "../src/actions/coding-task-handlers.ts", "../src/services/trajectory-feedback.ts", "../src/actions/coding-task-helpers.ts", "../src/actions/stop-agent.ts", "../src/providers/action-examples.ts", "../src/providers/active-workspace-context.ts", "../src/services/workspace-service.ts", "../src/services/workspace-github.ts", "../src/services/workspace-git-ops.ts", "../src/services/workspace-lifecycle.ts", "../src/api/agent-routes.ts", "../src/api/coordinator-routes.ts", "../src/api/hook-routes.ts", "../src/api/issue-routes.ts", "../src/api/workspace-routes.ts", "../src/api/routes.ts", "../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * ANSI/terminal utility functions for processing PTY output.\n *\n * Pure functions — no state, no dependencies beyond the standard library.\n *\n * @module services/ansi-utils\n */\n\n// ANSI escape sequence patterns for terminal output stripping.\n// These intentionally match control characters (\\x1b, \\x00-\\x1f, \\x7f).\n/* eslint-disable no-control-regex */\n// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI stripping requires control chars\nconst CURSOR_MOVEMENT = /\\x1b\\[\\d*[CDABGdEF]/g;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI stripping requires control chars\nconst CURSOR_POSITION = /\\x1b\\[\\d*(?:;\\d+)?[Hf]/g;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI stripping requires control chars\nconst ERASE = /\\x1b\\[\\d*[JK]/g;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI stripping requires control chars\nconst OSC = /\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)/g;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI stripping requires control chars\nconst ALL_ANSI = /\\x1B(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~])/g;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI stripping requires control chars\nconst CONTROL_CHARS = /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/g;\n/** Orphaned SGR fragments left when buffer boundaries split `\\x1b[...m` sequences. */\nconst ORPHAN_SGR = /\\[[\\d;]*m/g;\nconst LONG_SPACES = / {3,}/g;\n\n/** Apply all ANSI stripping patterns to a string */\nfunction applyAnsiStrip(input: string): string {\n return (\n input\n // Pre-process: rejoin SGR sequences split across lines by chunk boundaries.\n // e.g. \"[38;2;153;\\n153;153m\" → \"[38;2;153;153;153m\"\n .replace(/(\\[[\\d;]*)\\r?\\n([\\d;]*m)/g, \"$1$2\")\n .replace(CURSOR_MOVEMENT, \" \")\n .replace(CURSOR_POSITION, \" \")\n .replace(ERASE, \"\")\n .replace(OSC, \"\")\n .replace(ALL_ANSI, \"\")\n .replace(CONTROL_CHARS, \"\")\n .replace(ORPHAN_SGR, \"\")\n .replace(LONG_SPACES, \" \")\n .trim()\n );\n}\n\n/**\n * Strip ANSI escape sequences from raw terminal output for readable text.\n * Replaces cursor-forward codes with spaces (TUI uses these instead of actual spaces).\n */\nexport function stripAnsi(raw: string): string {\n return applyAnsiStrip(raw);\n}\n\n// ─── Chat-Ready Output Cleaning ───\n\n/** Unicode spinner, box-drawing, and decorative characters used by CLI TUIs. */\nconst TUI_DECORATIVE =\n /[│╭╰╮╯─═╌║╔╗╚╝╠╣╦╩╬┌┐└┘├┤┬┴┼●○❮❯▶◀⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏⣾⣽⣻⢿⡿⣟⣯⣷✽✻✶✳✢⏺←→↑↓⬆⬇◆▪▫■□▲△▼▽◈⟨⟩⌘⏎⏏⌫⌦⇧⇪⌥·⎿✔◼]/g;\n\n/**\n * Lines that are just CLI loading/thinking status — no meaningful content.\n * Claude Code uses random gerund spinner words (\"Tomfoolering…\", \"Recombobulating…\")\n * that rotate frequently. Requires an ellipsis (…/...) or status suffix\n * (parenthetical / \"for Ns\") — plain words like \"Completed\" won't match.\n */\nconst LOADING_LINE =\n /^\\s*(?:[A-Z][a-z]+(?:-[a-z]+)?(?:ing|ed)\\w*|thinking|Loading|processing)(?:…|\\.{3})(?:\\s*\\(.*\\)|\\s+for\\s+\\d+[smh](?:\\s+\\d+[smh])*)?\\s*$|^\\s*(?:[A-Z][a-z]+(?:-[a-z]+)?(?:ing|ed)\\w*|thinking|Loading|processing)\\s+for\\s+\\d+[smh](?:\\s+\\d+[smh])*\\s*$/;\n\n/** Lines that are just token/timing metadata from the spinner status bar. */\nconst STATUS_LINE =\n /^\\s*(?:\\d+[smh]\\s+\\d+s?\\s*·|↓\\s*[\\d.]+k?\\s*tokens|·\\s*↓|esc\\s+to\\s+interrupt|[Uu]pdate available|ate available|Run:\\s+brew|brew\\s+upgrade|\\d+\\s+files?\\s+\\+\\d+\\s+-\\d+|ctrl\\+\\w|\\+\\d+\\s+lines|Wrote\\s+\\d+\\s+lines\\s+to|\\?\\s+for\\s+shortcuts|Cooked for|Baked for|Cogitated for)/i;\n\n/** Claude Code tool execution markers — not meaningful for coordination decisions. */\nconst TOOL_MARKER_LINE =\n /^\\s*(?:Bash|Write|Read|Edit|Glob|Grep|Search|TodoWrite|Agent)\\s*\\(.*\\)\\s*$/;\n\n/** Git status/diff noise that's not meaningful for coordination. */\nconst GIT_NOISE_LINE =\n /^\\s*(?:On branch\\s+\\w|Your branch is|modified:|new file:|deleted:|renamed:|Untracked files:|Changes (?:not staged|to be committed)|\\d+\\s+files?\\s+changed.*(?:insertion|deletion))/i;\n\n/**\n * Clean terminal output for display in chat messages.\n *\n * Goes beyond {@link stripAnsi} by also removing:\n * - Unicode spinner/box-drawing/decorative characters from CLI TUIs\n * - Lines that are only loading/thinking status text\n * - Spinner status bar metadata (token counts, timing)\n * - Consecutive blank lines (collapsed to one)\n */\nexport function cleanForChat(raw: string): string {\n const stripped = applyAnsiStrip(raw);\n return stripped\n .replace(TUI_DECORATIVE, \" \")\n .replace(/\\xa0/g, \" \")\n .split(\"\\n\")\n .filter((line) => {\n const trimmed = line.trim();\n if (!trimmed) return false; // blank line — will re-add separators below\n if (LOADING_LINE.test(trimmed)) return false;\n if (STATUS_LINE.test(trimmed)) return false;\n if (TOOL_MARKER_LINE.test(trimmed)) return false;\n if (GIT_NOISE_LINE.test(trimmed)) return false;\n // Lines with only whitespace/punctuation and no alphanumeric content\n if (!/[a-zA-Z0-9]/.test(trimmed)) return false;\n // Very short lines (≤3 chars) are likely TUI fragments\n if (trimmed.length <= 3) return false;\n return true;\n })\n .map((line) => line.replace(/ {2,}/g, \" \").trim())\n .filter((line) => line.length > 0)\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\n/**\n * Extract meaningful artifacts (PR URLs, commit hashes, key results) from raw\n * terminal output. Returns a compact summary suitable for chat messages,\n * without dumping raw TUI output.\n */\nexport function extractCompletionSummary(raw: string): string {\n const stripped = applyAnsiStrip(raw);\n const lines: string[] = [];\n\n // PR / issue URLs\n const prUrls = stripped.match(\n /https?:\\/\\/github\\.com\\/[\\w.-]+\\/[\\w.-]+\\/pull\\/\\d+/g,\n );\n if (prUrls) {\n for (const url of [...new Set(prUrls)]) lines.push(url);\n }\n\n // \"Created pull request #N\" style messages\n const prCreated = stripped.match(\n /(?:Created|Opened)\\s+pull\\s+request\\s+#\\d+[^\\n]*/gi,\n );\n if (prCreated && !prUrls) {\n for (const m of prCreated) lines.push(m.trim());\n }\n\n // Commit hashes\n const commits = stripped.match(/(?:committed|commit)\\s+[a-f0-9]{7,40}/gi);\n if (commits) {\n for (const m of [...new Set(commits)]) lines.push(m.trim());\n }\n\n // Files changed summary (e.g. \"2 files changed, 15 insertions(+), 3 deletions(-)\")\n const diffStat = stripped.match(\n /\\d+\\s+files?\\s+changed.*?(?:insertion|deletion)[^\\n]*/gi,\n );\n if (diffStat) {\n for (const m of diffStat) lines.push(m.trim());\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Extract a dev server URL from recent terminal output, if present.\n *\n * Looks for common patterns like:\n * - http://localhost:3000\n * - http://127.0.0.1:8080\n * - http://0.0.0.0:5173\n * - https://localhost:4200\n *\n * Returns the first match, or null if no dev server URL is found.\n */\nexport function extractDevServerUrl(raw: string): string | null {\n const stripped = applyAnsiStrip(raw);\n // Match local dev server URLs with a port number\n const match = stripped.match(\n /https?:\\/\\/(?:localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0):\\d{1,5}[^\\s)}\\]'\"`,]*/,\n );\n return match ? match[0] : null;\n}\n\n/**\n * Capture the agent's output since the last task was sent, cleaned for chat display.\n * Returns readable text with TUI noise removed, or empty string if no marker exists.\n *\n * Mutates `markers` by deleting the entry for `sessionId` after capture.\n */\nexport function captureTaskResponse(\n sessionId: string,\n buffers: Map<string, string[]>,\n markers: Map<string, number>,\n): string {\n const buffer = buffers.get(sessionId);\n const marker = markers.get(sessionId);\n if (!buffer || marker === undefined) return \"\";\n\n const responseLines = buffer.slice(marker);\n markers.delete(sessionId);\n\n return cleanForChat(responseLines.join(\"\\n\"));\n}\n",
|
|
6
6
|
"/**\n * Trajectory Context — Tag orchestrator LLM calls for trajectory logging.\n *\n * Sets a lightweight context object on the runtime before `useModel()` calls\n * so the trajectory logger can identify orchestrator-specific LLM invocations\n * (coordination decisions, stall classification, idle checks, etc.) and tag\n * them with meaningful metadata instead of the generic \"action\" / \"runtime.useModel\".\n *\n * The milaidy trajectory-persistence layer reads `runtime.__orchestratorTrajectoryCtx`\n * in its `appendLlmCall` patch and writes the context into the trajectory record.\n *\n * @module services/trajectory-context\n */\n\n/**\n * Any runtime-like object. We accept both `AgentRuntime` and `IAgentRuntime`\n * since different call sites use different types. Using a minimal interface\n * avoids index-signature incompatibilities with ElizaOS types.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface RuntimeLike {}\n\n/**\n * Orchestrator decision types that map to specific LLM call sites.\n */\nexport type OrchestratorDecisionType =\n | \"coordination\"\n | \"turn-complete\"\n | \"idle-check\"\n | \"stall-classification\"\n | \"stall-classify-decide\"\n | \"swarm-context-generation\"\n | \"event-triage\"\n | \"task-validation\";\n\nexport interface OrchestratorTrajectoryContext {\n /** Source identifier — always \"orchestrator\" */\n source: \"orchestrator\";\n /** Which decision type triggered this LLM call */\n decisionType: OrchestratorDecisionType;\n /** PTY session ID of the agent being evaluated */\n sessionId?: string;\n /** Human-readable task label */\n taskLabel?: string;\n /** Repository URL or identifier (for trajectory feedback filtering) */\n repo?: string;\n /** Workspace directory path */\n workdir?: string;\n /** Original task description assigned to the agent */\n originalTask?: string;\n}\n\nconst CTX_KEY = \"__orchestratorTrajectoryCtx\";\n\n/**\n * Set orchestrator trajectory context on the runtime.\n * Call this before `runtime.useModel()` and clear it after.\n */\nexport function setTrajectoryContext(\n runtime: RuntimeLike,\n ctx: OrchestratorTrajectoryContext,\n): void {\n (runtime as Record<string, unknown>)[CTX_KEY] = ctx;\n}\n\n/**\n * Clear orchestrator trajectory context from the runtime.\n */\nexport function clearTrajectoryContext(runtime: RuntimeLike): void {\n (runtime as Record<string, unknown>)[CTX_KEY] = undefined;\n}\n\n/**\n * Read the current orchestrator trajectory context (if any).\n * Used by the trajectory logger on the milaidy side.\n */\nexport function readTrajectoryContext(\n runtime: unknown,\n): OrchestratorTrajectoryContext | undefined {\n if (!runtime || typeof runtime !== \"object\") return undefined;\n const ctx = (runtime as Record<string, unknown>)[CTX_KEY];\n if (!ctx || typeof ctx !== \"object\") return undefined;\n const candidate = ctx as Partial<OrchestratorTrajectoryContext>;\n if (candidate.source !== \"orchestrator\" || !candidate.decisionType)\n return undefined;\n return candidate as OrchestratorTrajectoryContext;\n}\n\n/**\n * Wrap a `useModel()` call with trajectory context tagging.\n * Ensures the context is always cleared, even if the call throws.\n *\n * @example\n * ```ts\n * const result = await withTrajectoryContext(\n * ctx.runtime,\n * { source: \"orchestrator\", decisionType: \"coordination\", sessionId },\n * () => ctx.runtime.useModel(ModelType.TEXT_SMALL, { prompt }),\n * );\n * ```\n */\nexport async function withTrajectoryContext<T>(\n runtime: RuntimeLike,\n ctx: OrchestratorTrajectoryContext,\n fn: () => Promise<T>,\n): Promise<T> {\n setTrajectoryContext(runtime, ctx);\n try {\n return await fn();\n } finally {\n clearTrajectoryContext(runtime);\n }\n}\n",
|
|
7
|
-
"/**\n * Prompt construction and response parsing for the Swarm Coordinator's\n * LLM-driven coordination decisions.\n *\n * Pure functions — no side effects, easy to test.\n * Pattern follows stall-classifier.ts:buildStallClassificationPrompt().\n *\n * @module services/swarm-coordinator-prompts\n */\n\n/** Per-session task context provided to the LLM for decision-making. */\nexport interface TaskContextSummary {\n sessionId: string;\n agentType: string;\n label: string;\n originalTask: string;\n workdir: string;\n repo?: string;\n}\n\n/** A previous coordination decision, included for context continuity. */\nexport interface DecisionHistoryEntry {\n event: string;\n promptText: string;\n action: string;\n response?: string;\n reasoning: string;\n}\n\n/** Summary of a sibling task in the same swarm — for cross-task context. */\nexport interface SiblingTaskSummary {\n label: string;\n agentType: string;\n originalTask: string;\n status: string;\n /** Last significant decision or action taken by this sibling. */\n lastKeyDecision?: string;\n /** Summary of what the sibling accomplished (populated on completion). */\n completionSummary?: string;\n}\n\n/** A significant creative or architectural decision made by an agent in the swarm. */\nexport interface SharedDecision {\n /** Which agent made this decision. */\n agentLabel: string;\n /** Brief description of the decision. */\n summary: string;\n /** When it was recorded. */\n timestamp: number;\n}\n\n/**\n * Build a context section describing sibling tasks in the same swarm.\n * Helps the coordinator make decisions with awareness of the broader project.\n */\nfunction buildSiblingSection(siblings?: SiblingTaskSummary[]): string {\n if (!siblings || siblings.length === 0) return \"\";\n const lines = siblings.map((s) => {\n let line = ` - [${s.status}] \"${s.label}\" (${s.agentType}): ${s.originalTask}`;\n if (s.completionSummary) {\n line += `\\n Result: ${s.completionSummary}`;\n } else if (s.lastKeyDecision) {\n line += `\\n Latest: ${s.lastKeyDecision}`;\n }\n return line;\n });\n return (\n `\\nOther agents in this swarm:\\n` +\n lines.join(\"\\n\") +\n `\\nUse this context when the agent asks creative or architectural questions — ` +\n `your answer should be consistent with what sibling agents are doing.\\n`\n );\n}\n\n/**\n * Build a context section describing significant decisions made by other agents.\n * Helps maintain consistency across the swarm regardless of task type.\n */\nfunction buildSharedDecisionsSection(decisions?: SharedDecision[]): string {\n if (!decisions || decisions.length === 0) return \"\";\n return (\n `\\nKey decisions made by other agents in this swarm:\\n` +\n decisions\n .slice(-10)\n .map((d) => ` - [${d.agentLabel}] ${d.summary}`)\n .join(\"\\n\") +\n `\\nAlign with these decisions for consistency — don't contradict them unless the task requires it.\\n`\n );\n}\n\n/** Build a project context section from the swarm planning phase. */\nfunction buildSwarmContextSection(swarmContext?: string): string {\n if (!swarmContext) return \"\";\n return `\\nProject context (from planning phase):\\n${swarmContext}\\n`;\n}\n\n/** Parsed LLM response for a coordination decision. */\nexport interface CoordinationLLMResponse {\n action: \"respond\" | \"escalate\" | \"ignore\" | \"complete\";\n /** Text to send (for action=respond with plain text input). */\n response?: string;\n /** Whether to use sendKeysToSession instead of sendToSession. */\n useKeys?: boolean;\n /** Key sequence to send (for TUI interactions). e.g. [\"enter\"] or [\"down\",\"enter\"]. */\n keys?: string[];\n /** LLM's reasoning for the decision. */\n reasoning: string;\n /** Brief summary of a significant creative/architectural decision the agent made, if any. */\n keyDecision?: string;\n}\n\n/**\n * Build the LLM prompt for making a coordination decision about a blocked agent.\n */\nexport function buildCoordinationPrompt(\n taskCtx: TaskContextSummary,\n promptText: string,\n recentOutput: string,\n decisionHistory: DecisionHistoryEntry[],\n siblingTasks?: SiblingTaskSummary[],\n sharedDecisions?: SharedDecision[],\n swarmContext?: string,\n): string {\n const historySection =\n decisionHistory.length > 0\n ? `\\nPrevious decisions for this session:\\n${decisionHistory\n .slice(-5)\n .map(\n (d, i) =>\n ` ${i + 1}. [${d.event}] prompt=\"${d.promptText}\" → ${d.action}${d.response ? ` (\"${d.response}\")` : \"\"} — ${d.reasoning}`,\n )\n .join(\"\\n\")}\\n`\n : \"\";\n\n return (\n `You are Milady, an AI orchestrator managing a swarm of task agents. ` +\n `A ${taskCtx.agentType} task agent (\"${taskCtx.label}\", session: ${taskCtx.sessionId}) ` +\n `is blocked and waiting for input.\\n\\n` +\n `Original task: \"${taskCtx.originalTask}\"\\n` +\n `Working directory: ${taskCtx.workdir}\\n` +\n `Repository: ${taskCtx.repo ?? \"none (scratch directory)\"}\\n` +\n buildSwarmContextSection(swarmContext) +\n buildSiblingSection(siblingTasks) +\n buildSharedDecisionsSection(sharedDecisions) +\n historySection +\n `\\nRecent terminal output (last 50 lines):\\n` +\n `---\\n${recentOutput.slice(-3000)}\\n---\\n\\n` +\n `The agent is showing this blocking prompt:\\n` +\n `\"${promptText}\"\\n\\n` +\n `Decide how to respond. Your options:\\n\\n` +\n `1. \"respond\" — Send a response to unblock the agent. For text prompts (Y/n, questions), ` +\n `set \"response\" to the text to send. For TUI menus or interactive prompts that need ` +\n `special keys, set \"useKeys\": true and \"keys\" to the key sequence ` +\n `(e.g. [\"enter\"], [\"down\",\"enter\"], [\"y\",\"enter\"]).\\n\\n` +\n `2. \"complete\" — The original task has been fulfilled. The agent has finished its work ` +\n `(e.g. code written, PR created, tests passed) and is back at the idle prompt. ` +\n `Use this when the terminal output shows the task objectives have been met.\\n\\n` +\n `3. \"escalate\" — The prompt requires human judgment (e.g. design decisions, ` +\n `ambiguous requirements, security-sensitive actions). Do NOT respond yourself.\\n\\n` +\n `4. \"ignore\" — The prompt is not actually blocking or is already being handled.\\n\\n` +\n `Guidelines:\\n` +\n `- IMPORTANT: If the prompt asks to approve access to files or directories OUTSIDE the working ` +\n `directory (${taskCtx.workdir}), DECLINE the request and REDIRECT the agent. Do NOT approve ` +\n `access to paths like /etc, ~/.ssh, ~/, /tmp, or any path that doesn't start with the working ` +\n `directory. Instead, respond with \"n\" (or the decline option) and tell the agent: ` +\n `\"That path is outside your workspace. Use ${taskCtx.workdir} instead — ` +\n `create any files or directories you need there.\" This keeps the agent moving without ` +\n `granting out-of-scope access. The coordinator will also notify the human in case ` +\n `broader access was intended.\\n` +\n `- For tool approval prompts (file writes, shell commands, etc.), respond \"y\" or use keys:[\"enter\"] to approve.\\n` +\n `- For Y/n confirmations that align with the original task, respond \"y\".\\n` +\n `- For design questions or choices that could go either way, escalate.\\n` +\n `- For error recovery prompts, try to respond if the path forward is clear.\\n` +\n `- If the output shows a PR was just created (e.g. \"Created pull request #N\"), use \"complete\" — the task is done.\\n` +\n `- If the agent is asking for information that was NOT provided in the original task ` +\n `(e.g. which repository to use, project requirements, credentials), ESCALATE. ` +\n `The coordinator does not have this information — the human must provide it.\\n` +\n `- When in doubt, escalate — it's better to ask the human than to make a wrong choice.\\n` +\n `- If the agent's output reveals a significant decision that sibling agents should know about ` +\n `(e.g. chose a library, designed an API shape, picked a UI pattern, established a writing style, ` +\n `narrowed a research scope, made any choice that affects the shared project), ` +\n `include \"keyDecision\" with a brief one-line summary. Skip this for routine tool approvals.\\n` +\n `- Look for explicit \"DECISION:\" markers in the agent's output — these are the agent deliberately ` +\n `surfacing design choices. Always capture these as keyDecision.\\n\\n` +\n `Respond with ONLY a JSON object:\\n` +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\", \"keyDecision\": \"...\"}`\n );\n}\n\n/**\n * Build the LLM prompt for checking on an idle session that hasn't\n * produced any events for a while.\n */\nexport function buildIdleCheckPrompt(\n taskCtx: TaskContextSummary,\n recentOutput: string,\n idleMinutes: number,\n idleCheckNumber: number,\n maxIdleChecks: number,\n decisionHistory: DecisionHistoryEntry[],\n siblingTasks?: SiblingTaskSummary[],\n sharedDecisions?: SharedDecision[],\n swarmContext?: string,\n): string {\n const historySection =\n decisionHistory.length > 0\n ? `\\nPrevious decisions for this session:\\n${decisionHistory\n .slice(-5)\n .map(\n (d, i) =>\n ` ${i + 1}. [${d.event}] prompt=\"${d.promptText}\" → ${d.action}${d.response ? ` (\"${d.response}\")` : \"\"} — ${d.reasoning}`,\n )\n .join(\"\\n\")}\\n`\n : \"\";\n\n return (\n `You are Milady, an AI orchestrator managing a swarm of task agents. ` +\n `A ${taskCtx.agentType} task agent (\"${taskCtx.label}\", session: ${taskCtx.sessionId}) ` +\n `has been idle for ${idleMinutes} minutes with no events or output changes.\\n\\n` +\n `Original task: \"${taskCtx.originalTask}\"\\n` +\n `Working directory: ${taskCtx.workdir}\\n` +\n `Repository: ${taskCtx.repo ?? \"none (scratch directory)\"}\\n` +\n `Idle check: ${idleCheckNumber} of ${maxIdleChecks} (session will be force-escalated after ${maxIdleChecks})\\n` +\n buildSwarmContextSection(swarmContext) +\n buildSiblingSection(siblingTasks) +\n buildSharedDecisionsSection(sharedDecisions) +\n historySection +\n `\\nRecent terminal output (last 50 lines):\\n` +\n `---\\n${recentOutput.slice(-3000)}\\n---\\n\\n` +\n `The session has gone silent. Analyze the terminal output and decide:\\n\\n` +\n `1. \"complete\" — The task is FULLY done. ALL objectives in the original task were met ` +\n `AND the final deliverable is visible in the output (e.g. a PR URL was printed, or the ` +\n `task explicitly did not require a PR). The agent is back at the idle prompt.\\n\\n` +\n `2. \"respond\" — The agent appears stuck or waiting for input that wasn't detected ` +\n `as a blocking prompt. Send a message to nudge it (e.g. \"continue\", or answer a question ` +\n `visible in the output). If code was committed but no PR was created yet, respond with ` +\n `\"please create a pull request with your changes\" or similar.\\n\\n` +\n `3. \"escalate\" — Something looks wrong or unclear. The human should review.\\n\\n` +\n `4. \"ignore\" — The agent is still actively working (e.g. compiling, running tests, ` +\n `pushing to remote, creating a PR). The idle period is expected and it will produce output soon.\\n\\n` +\n `Guidelines:\\n` +\n `- IMPORTANT: Do NOT mark \"complete\" if the original task involves creating a PR and no PR URL ` +\n `(e.g. github.com/...pull/...) appears in the output. Instead use \"respond\" to nudge the agent ` +\n `to create the PR.\\n` +\n `- Do NOT mark \"complete\" just because code was committed — commits alone don't finish a task ` +\n `that requires a PR.\\n` +\n `- Network operations (git push, gh pr create, API calls) can cause several minutes of silence — ` +\n `prefer \"ignore\" for early idle checks if the agent was mid-workflow.\\n` +\n `- If the output ends with a command prompt ($ or >) and ALL task objectives are confirmed met, use \"complete\".\\n` +\n `- If the output shows an error or the agent seems stuck in a loop, escalate.\\n` +\n `- If the agent is clearly mid-operation (build output, test runner, git operations), use \"ignore\".\\n` +\n `- On check ${idleCheckNumber} of ${maxIdleChecks} — if unsure, lean toward \"respond\" with a nudge rather than \"complete\".\\n` +\n `- If the agent's output reveals a significant creative or architectural decision, ` +\n `include \"keyDecision\" with a brief one-line summary.\\n` +\n `- Look for explicit \"DECISION:\" markers in the agent's output — always capture these as keyDecision.\\n\\n` +\n `Respond with ONLY a JSON object:\\n` +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\", \"keyDecision\": \"...\"}`\n );\n}\n\n/**\n * Build the LLM prompt for assessing whether a completed turn means the\n * overall task is done, or if the agent needs more turns.\n *\n * Called when the adapter detects \"task_complete\" (agent finished a turn and\n * returned to the idle prompt). The LLM decides whether to stop the session\n * or send a follow-up instruction.\n */\nexport function buildTurnCompletePrompt(\n taskCtx: TaskContextSummary,\n turnOutput: string,\n decisionHistory: DecisionHistoryEntry[],\n siblingTasks?: SiblingTaskSummary[],\n sharedDecisions?: SharedDecision[],\n swarmContext?: string,\n): string {\n const historySection =\n decisionHistory.length > 0\n ? `\\nPrevious decisions for this session:\\n${decisionHistory\n .slice(-5)\n .map(\n (d, i) =>\n ` ${i + 1}. [${d.event}] prompt=\"${d.promptText}\" → ${d.action}${d.response ? ` (\"${d.response}\")` : \"\"} — ${d.reasoning}`,\n )\n .join(\"\\n\")}\\n`\n : \"\";\n\n return (\n `You are Milady, an AI orchestrator managing a swarm of task agents. ` +\n `A ${taskCtx.agentType} task agent (\"${taskCtx.label}\", session: ${taskCtx.sessionId}) ` +\n `just finished a turn and is back at the idle prompt waiting for input.\\n\\n` +\n `Original task: \"${taskCtx.originalTask}\"\\n` +\n `Working directory: ${taskCtx.workdir}\\n` +\n `Repository: ${taskCtx.repo ?? \"none (scratch directory)\"}\\n` +\n buildSwarmContextSection(swarmContext) +\n buildSiblingSection(siblingTasks) +\n buildSharedDecisionsSection(sharedDecisions) +\n historySection +\n `\\nOutput from this turn:\\n` +\n `---\\n${turnOutput.slice(-3000)}\\n---\\n\\n` +\n `The agent completed a turn. Decide if the task is done or needs more work.\\n\\n` +\n `Options:\\n` +\n `1. \"complete\" — The task objectives have been met.\\n` +\n ` - For repo tasks: ONLY when a PR creation signal appears (\"Created pull request #N\"). ` +\n `A generic \"done\" or \"finished\" statement is NOT sufficient for repo tasks — a PR must exist.\\n` +\n ` - For scratch/research tasks (no repo): when the agent has produced its deliverable.\\n` +\n `2. \"respond\" — The agent needs to do more work.\\n` +\n `3. \"escalate\" — Something is wrong. Let the human decide.\\n` +\n `4. \"ignore\" — The agent is still working (e.g., spinner text like \"Germinating...\", \"Frosting...\"). ` +\n `Wait for the next turn.\\n\\n` +\n `CRITICAL RULES:\\n` +\n `- For repo tasks: use \"complete\" ONLY when \"Created pull request #N\" appears in output.\\n` +\n `- For scratch/research tasks: use \"complete\" when the agent delivers its output.\\n` +\n `- Do NOT ask the agent to review, verify, or re-check work it already completed.\\n` +\n `- If output is only spinner text, use \"ignore\" and wait for the next turn.\\n` +\n `- Use \"respond\" when the agent hasn't started, or when code was written but not yet committed/pushed/PR'd.\\n\\n` +\n `If the agent's output reveals a significant decision, include \"keyDecision\" with a brief summary.\\n\\n` +\n `Respond with ONLY a JSON object:\\n` +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\", \"keyDecision\": \"...\"}`\n );\n}\n\n// ─── Event Messages for Milaidy Pipeline ───\n\n/**\n * Build a natural language event message describing a blocked agent, intended\n * to be processed by Milaidy's full ElizaOS pipeline (with conversation memory,\n * personality, and actions). Unlike buildCoordinationPrompt(), this omits the\n * \"You are Milady\" preamble (she already IS Milady in the pipeline) and asks\n * for a fenced JSON action block at the end of her response.\n */\nexport function buildBlockedEventMessage(\n taskCtx: TaskContextSummary,\n promptText: string,\n recentOutput: string,\n decisionHistory: DecisionHistoryEntry[],\n siblingTasks?: SiblingTaskSummary[],\n sharedDecisions?: SharedDecision[],\n swarmContext?: string,\n): string {\n const historySection =\n decisionHistory.length > 0\n ? `\\nPrevious decisions:\\n${decisionHistory\n .slice(-5)\n .map(\n (d, i) =>\n ` ${i + 1}. [${d.event}] \"${d.promptText}\" → ${d.action}${d.response ? ` (\"${d.response}\")` : \"\"} — ${d.reasoning}`,\n )\n .join(\"\\n\")}\\n`\n : \"\";\n\n return (\n `[Task Agent Event] A ${taskCtx.agentType} agent (\"${taskCtx.label}\") is blocked and waiting for input.\\n\\n` +\n `Task: \"${taskCtx.originalTask}\"\\n` +\n `Workdir: ${taskCtx.workdir}\\n` +\n `Repo: ${taskCtx.repo ?? \"none (scratch directory)\"}\\n` +\n buildSwarmContextSection(swarmContext) +\n buildSiblingSection(siblingTasks) +\n buildSharedDecisionsSection(sharedDecisions) +\n historySection +\n `\\nRecent terminal output:\\n---\\n${recentOutput.slice(-3000)}\\n---\\n\\n` +\n `Blocking prompt: \"${promptText}\"\\n\\n` +\n `Decide how to handle this. Options:\\n` +\n `- \"respond\" — send text or keys to unblock the agent\\n` +\n `- \"complete\" — the task is fully done\\n` +\n `- \"escalate\" — you need the user's input\\n` +\n `- \"ignore\" — not actually blocking\\n\\n` +\n `Guidelines:\\n` +\n `- For tool approvals / Y/n that align with the task, respond \"y\" or keys:[\"enter\"].\\n` +\n `- If the prompt asks for info NOT in the original task, escalate.\\n` +\n `- Decline access to paths outside ${taskCtx.workdir}.\\n` +\n `- If a PR was just created, the task is done — use \"complete\".\\n` +\n `- When in doubt, escalate.\\n\\n` +\n `If the agent's output reveals a significant decision that sibling agents should know about, include \"keyDecision\" with a brief summary.\\n` +\n `Look for explicit \"DECISION:\" markers in the agent's output — always capture these as keyDecision.\\n\\n` +\n `Include a JSON action block at the end of your response:\\n` +\n \"```json\\n\" +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\", \"keyDecision\": \"...\"}\\n` +\n \"```\"\n );\n}\n\n/**\n * Build a natural language event message describing a turn completion, intended\n * to be processed by Milaidy's full ElizaOS pipeline.\n */\nexport function buildTurnCompleteEventMessage(\n taskCtx: TaskContextSummary,\n turnOutput: string,\n decisionHistory: DecisionHistoryEntry[],\n siblingTasks?: SiblingTaskSummary[],\n sharedDecisions?: SharedDecision[],\n swarmContext?: string,\n): string {\n const historySection =\n decisionHistory.length > 0\n ? `\\nPrevious decisions:\\n${decisionHistory\n .slice(-5)\n .map(\n (d, i) =>\n ` ${i + 1}. [${d.event}] \"${d.promptText}\" → ${d.action}${d.response ? ` (\"${d.response}\")` : \"\"} — ${d.reasoning}`,\n )\n .join(\"\\n\")}\\n`\n : \"\";\n\n return (\n `[Task Agent Event] A ${taskCtx.agentType} agent (\"${taskCtx.label}\") just finished a turn and is idle.\\n\\n` +\n `Task: \"${taskCtx.originalTask}\"\\n` +\n `Workdir: ${taskCtx.workdir}\\n` +\n `Repo: ${taskCtx.repo ?? \"none (scratch directory)\"}\\n` +\n buildSwarmContextSection(swarmContext) +\n buildSiblingSection(siblingTasks) +\n buildSharedDecisionsSection(sharedDecisions) +\n historySection +\n `\\nTurn output:\\n---\\n${turnOutput.slice(-3000)}\\n---\\n\\n` +\n `Decide if the overall task is done or if the agent needs more work.\\n\\n` +\n `Options:\\n` +\n `- \"respond\" — send a follow-up instruction (DEFAULT for intermediate steps)\\n` +\n `- \"complete\" — For repo tasks: ONLY when \"Created pull request #N\" appears. ` +\n `For scratch/research tasks: when the agent delivers its output.\\n` +\n `- \"escalate\" — something looks wrong, ask the user\\n` +\n `- \"ignore\" — spinner/loading output, agent still working\\n\\n` +\n `Guidelines:\\n` +\n `- For repo tasks, a generic \"done\" is NOT enough — require a PR creation signal.\\n` +\n `- If code was written but not committed/pushed/PR'd, respond with next step.\\n` +\n `- Do NOT ask the agent to re-verify work it already completed.\\n` +\n `- If the agent's output reveals a significant creative or architectural decision, include \"keyDecision\" with a brief summary.\\n` +\n `- Look for explicit \"DECISION:\" markers in the agent's output — always capture these as keyDecision.\\n\\n` +\n `Include a JSON action block at the end of your response:\\n` +\n \"```json\\n\" +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\", \"keyDecision\": \"...\"}\\n` +\n \"```\"\n );\n}\n\n/**\n * Parse the LLM's coordination response from raw text output.\n * Returns null if the response is invalid or unparseable.\n */\nexport function parseCoordinationResponse(\n llmOutput: string,\n): CoordinationLLMResponse | null {\n const jsonMatch = llmOutput.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) return null;\n\n try {\n const parsed = JSON.parse(jsonMatch[0]);\n\n const validActions = [\"respond\", \"escalate\", \"ignore\", \"complete\"];\n if (!validActions.includes(parsed.action)) return null;\n\n const result: CoordinationLLMResponse = {\n action: parsed.action,\n reasoning: parsed.reasoning || \"No reasoning provided\",\n };\n\n if (parsed.action === \"respond\") {\n if (parsed.useKeys && Array.isArray(parsed.keys)) {\n result.useKeys = true;\n result.keys = parsed.keys.map(String);\n } else if (typeof parsed.response === \"string\") {\n result.response = parsed.response;\n } else {\n // respond action but no response or keys — invalid\n return null;\n }\n }\n\n if (typeof parsed.keyDecision === \"string\" && parsed.keyDecision.trim()) {\n result.keyDecision = parsed.keyDecision.trim().slice(0, 240);\n }\n\n return result;\n } catch {\n return null;\n }\n}\n",
|
|
7
|
+
"/**\n * Prompt construction and response parsing for the Swarm Coordinator's\n * LLM-driven coordination decisions.\n *\n * Pure functions — no side effects, easy to test.\n * Pattern follows stall-classifier.ts:buildStallClassificationPrompt().\n *\n * @module services/swarm-coordinator-prompts\n */\n\n/** Per-session task context provided to the LLM for decision-making. */\nexport interface TaskContextSummary {\n sessionId: string;\n agentType: string;\n label: string;\n originalTask: string;\n workdir: string;\n repo?: string;\n}\n\n/** A previous coordination decision, included for context continuity. */\nexport interface DecisionHistoryEntry {\n event: string;\n promptText: string;\n action: string;\n response?: string;\n reasoning: string;\n}\n\n/** Summary of a sibling task in the same swarm — for cross-task context. */\nexport interface SiblingTaskSummary {\n label: string;\n agentType: string;\n originalTask: string;\n status: string;\n /** Last significant decision or action taken by this sibling. */\n lastKeyDecision?: string;\n /** Summary of what the sibling accomplished (populated on completion). */\n completionSummary?: string;\n}\n\n/** A significant creative or architectural decision made by an agent in the swarm. */\nexport interface SharedDecision {\n /** Which agent made this decision. */\n agentLabel: string;\n /** Brief description of the decision. */\n summary: string;\n /** When it was recorded. */\n timestamp: number;\n}\n\n/**\n * Build a context section describing sibling tasks in the same swarm.\n * Helps the coordinator make decisions with awareness of the broader project.\n */\nfunction buildSiblingSection(siblings?: SiblingTaskSummary[]): string {\n if (!siblings || siblings.length === 0) return \"\";\n const lines = siblings.map((s) => {\n let line = ` - [${s.status}] \"${s.label}\" (${s.agentType}): ${s.originalTask}`;\n if (s.completionSummary) {\n line += `\\n Result: ${s.completionSummary}`;\n } else if (s.lastKeyDecision) {\n line += `\\n Latest: ${s.lastKeyDecision}`;\n }\n return line;\n });\n return (\n `\\nOther agents in this swarm:\\n` +\n lines.join(\"\\n\") +\n `\\nUse this context when the agent asks creative or architectural questions — ` +\n `your answer should be consistent with what sibling agents are doing.\\n`\n );\n}\n\n/**\n * Build a context section describing significant decisions made by other agents.\n * Helps maintain consistency across the swarm regardless of task type.\n */\nfunction buildSharedDecisionsSection(decisions?: SharedDecision[]): string {\n if (!decisions || decisions.length === 0) return \"\";\n return (\n `\\nKey decisions made by other agents in this swarm:\\n` +\n decisions\n .slice(-10)\n .map((d) => ` - [${d.agentLabel}] ${d.summary}`)\n .join(\"\\n\") +\n `\\nAlign with these decisions for consistency — don't contradict them unless the task requires it.\\n`\n );\n}\n\n/** Build a project context section from the swarm planning phase. */\nfunction buildSwarmContextSection(swarmContext?: string): string {\n if (!swarmContext) return \"\";\n return `\\nProject context (from planning phase):\\n${swarmContext}\\n`;\n}\n\n/** Parsed LLM response for a coordination decision. */\nexport interface CoordinationLLMResponse {\n action: \"respond\" | \"escalate\" | \"ignore\" | \"complete\";\n /** Text to send (for action=respond with plain text input). */\n response?: string;\n /** Whether to use sendKeysToSession instead of sendToSession. */\n useKeys?: boolean;\n /** Key sequence to send (for TUI interactions). e.g. [\"enter\"] or [\"down\",\"enter\"]. */\n keys?: string[];\n /** LLM's reasoning for the decision. */\n reasoning: string;\n /** Brief summary of a significant creative/architectural decision the agent made, if any. */\n keyDecision?: string;\n}\n\n/**\n * Build the LLM prompt for making a coordination decision about a blocked agent.\n */\nexport function buildCoordinationPrompt(\n taskCtx: TaskContextSummary,\n promptText: string,\n recentOutput: string,\n decisionHistory: DecisionHistoryEntry[],\n siblingTasks?: SiblingTaskSummary[],\n sharedDecisions?: SharedDecision[],\n swarmContext?: string,\n): string {\n const historySection =\n decisionHistory.length > 0\n ? `\\nPrevious decisions for this session:\\n${decisionHistory\n .slice(-5)\n .map(\n (d, i) =>\n ` ${i + 1}. [${d.event}] prompt=\"${d.promptText}\" → ${d.action}${d.response ? ` (\"${d.response}\")` : \"\"} — ${d.reasoning}`,\n )\n .join(\"\\n\")}\\n`\n : \"\";\n\n return (\n `You are Milady, an AI orchestrator managing a swarm of task agents. ` +\n `A ${taskCtx.agentType} task agent (\"${taskCtx.label}\", session: ${taskCtx.sessionId}) ` +\n `is blocked and waiting for input.\\n\\n` +\n `Original task: \"${taskCtx.originalTask}\"\\n` +\n `Working directory: ${taskCtx.workdir}\\n` +\n `Repository: ${taskCtx.repo ?? \"none (scratch directory)\"}\\n` +\n buildSwarmContextSection(swarmContext) +\n buildSiblingSection(siblingTasks) +\n buildSharedDecisionsSection(sharedDecisions) +\n historySection +\n `\\nRecent terminal output (last 50 lines):\\n` +\n `---\\n${recentOutput.slice(-3000)}\\n---\\n\\n` +\n `The agent is showing this blocking prompt:\\n` +\n `\"${promptText}\"\\n\\n` +\n `Decide how to respond. Your options:\\n\\n` +\n `1. \"respond\" — Send a response to unblock the agent. For text prompts (Y/n, questions), ` +\n `set \"response\" to the text to send. For TUI menus or interactive prompts that need ` +\n `special keys, set \"useKeys\": true and \"keys\" to the key sequence ` +\n `(e.g. [\"enter\"], [\"down\",\"enter\"], [\"y\",\"enter\"]).\\n\\n` +\n `2. \"complete\" — The original task has been fulfilled. The agent has finished its work ` +\n `(e.g. code written, PR created, tests passed) and is back at the idle prompt. ` +\n `Use this when the terminal output shows the task objectives have been met.\\n\\n` +\n `3. \"escalate\" — The prompt requires human judgment (e.g. design decisions, ` +\n `ambiguous requirements, security-sensitive actions). Do NOT respond yourself.\\n\\n` +\n `4. \"ignore\" — The prompt is not actually blocking or is already being handled.\\n\\n` +\n `Guidelines:\\n` +\n `- IMPORTANT: If the prompt asks to approve access to files or directories OUTSIDE the working ` +\n `directory (${taskCtx.workdir}), DECLINE the request and REDIRECT the agent. Do NOT approve ` +\n `access to paths like /etc, ~/.ssh, ~/, /tmp, or any path that doesn't start with the working ` +\n `directory. Instead, respond with \"n\" (or the decline option) and tell the agent: ` +\n `\"That path is outside your workspace. Use ${taskCtx.workdir} instead — ` +\n `create any files or directories you need there.\" This keeps the agent moving without ` +\n `granting out-of-scope access. The coordinator will also notify the human in case ` +\n `broader access was intended.\\n` +\n `- For tool approval prompts (file writes, shell commands, etc.), respond \"y\" or use keys:[\"enter\"] to approve.\\n` +\n `- For Y/n confirmations that align with the original task, respond \"y\".\\n` +\n `- For design questions or choices that could go either way, escalate.\\n` +\n `- For error recovery prompts, try to respond if the path forward is clear.\\n` +\n `- If the output shows a PR was just created (e.g. \"Created pull request #N\"), use \"complete\" — the task is done.\\n` +\n `- If the agent is asking for information that was NOT provided in the original task ` +\n `(e.g. which repository to use, project requirements, credentials), ESCALATE. ` +\n `The coordinator does not have this information — the human must provide it.\\n` +\n `- When in doubt, escalate — it's better to ask the human than to make a wrong choice.\\n` +\n `- If the agent's output reveals a significant decision that sibling agents should know about ` +\n `(e.g. chose a library, designed an API shape, picked a UI pattern, established a writing style, ` +\n `narrowed a research scope, made any choice that affects the shared project), ` +\n `include \"keyDecision\" with a brief one-line summary. Skip this for routine tool approvals.\\n` +\n `- Look for explicit \"DECISION:\" markers in the agent's output — these are the agent deliberately ` +\n `surfacing design choices. Always capture these as keyDecision.\\n\\n` +\n `Respond with ONLY a JSON object:\\n` +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\", \"keyDecision\": \"...\"}`\n );\n}\n\n/**\n * Build the LLM prompt for checking on an idle session that hasn't\n * produced any events for a while.\n */\nexport function buildIdleCheckPrompt(\n taskCtx: TaskContextSummary,\n recentOutput: string,\n idleMinutes: number,\n idleCheckNumber: number,\n maxIdleChecks: number,\n decisionHistory: DecisionHistoryEntry[],\n siblingTasks?: SiblingTaskSummary[],\n sharedDecisions?: SharedDecision[],\n swarmContext?: string,\n): string {\n const historySection =\n decisionHistory.length > 0\n ? `\\nPrevious decisions for this session:\\n${decisionHistory\n .slice(-5)\n .map(\n (d, i) =>\n ` ${i + 1}. [${d.event}] prompt=\"${d.promptText}\" → ${d.action}${d.response ? ` (\"${d.response}\")` : \"\"} — ${d.reasoning}`,\n )\n .join(\"\\n\")}\\n`\n : \"\";\n\n return (\n `You are Milady, an AI orchestrator managing a swarm of task agents. ` +\n `A ${taskCtx.agentType} task agent (\"${taskCtx.label}\", session: ${taskCtx.sessionId}) ` +\n `has been idle for ${idleMinutes} minutes with no events or output changes.\\n\\n` +\n `Original task: \"${taskCtx.originalTask}\"\\n` +\n `Working directory: ${taskCtx.workdir}\\n` +\n `Repository: ${taskCtx.repo ?? \"none (scratch directory)\"}\\n` +\n `Idle check: ${idleCheckNumber} of ${maxIdleChecks} (session will be force-escalated after ${maxIdleChecks})\\n` +\n buildSwarmContextSection(swarmContext) +\n buildSiblingSection(siblingTasks) +\n buildSharedDecisionsSection(sharedDecisions) +\n historySection +\n `\\nRecent terminal output (last 50 lines):\\n` +\n `---\\n${recentOutput.slice(-3000)}\\n---\\n\\n` +\n `The session has gone silent. Analyze the terminal output and decide:\\n\\n` +\n `1. \"complete\" — The task is FULLY done. ALL objectives in the original task were met ` +\n `AND the final deliverable is visible in the output (e.g. a PR URL was printed, or the ` +\n `task explicitly did not require a PR). The agent is back at the idle prompt.\\n\\n` +\n `2. \"respond\" — The agent appears stuck or waiting for input that wasn't detected ` +\n `as a blocking prompt. Send a message to nudge it (e.g. \"continue\", or answer a question ` +\n `visible in the output). If code was committed but no PR was created yet, respond with ` +\n `\"please create a pull request with your changes\" or similar.\\n\\n` +\n `3. \"escalate\" — Something looks wrong or unclear. The human should review.\\n\\n` +\n `4. \"ignore\" — The agent is still actively working (e.g. compiling, running tests, ` +\n `pushing to remote, creating a PR). The idle period is expected and it will produce output soon.\\n\\n` +\n `Guidelines:\\n` +\n `- IMPORTANT: Do NOT mark \"complete\" if the original task involves creating a PR and no PR URL ` +\n `(e.g. github.com/...pull/...) appears in the output. Instead use \"respond\" to nudge the agent ` +\n `to create the PR.\\n` +\n `- Do NOT mark \"complete\" just because code was committed — commits alone don't finish a task ` +\n `that requires a PR.\\n` +\n `- Network operations (git push, gh pr create, API calls) can cause several minutes of silence — ` +\n `prefer \"ignore\" for early idle checks if the agent was mid-workflow.\\n` +\n `- If the output ends with a command prompt ($ or >) and ALL task objectives are confirmed met, use \"complete\".\\n` +\n `- If the output shows an error or the agent seems stuck in a loop, escalate.\\n` +\n `- If the agent is clearly mid-operation (build output, test runner, git operations), use \"ignore\".\\n` +\n `- On check ${idleCheckNumber} of ${maxIdleChecks} — if unsure, lean toward \"respond\" with a nudge rather than \"complete\".\\n` +\n `- If the agent's output reveals a significant creative or architectural decision, ` +\n `include \"keyDecision\" with a brief one-line summary.\\n` +\n `- Look for explicit \"DECISION:\" markers in the agent's output — always capture these as keyDecision.\\n\\n` +\n // CRITICAL constraint on the `response` field — fixes a real bug\n // where LLMs produced 3rd-person status reports that then got\n // piped verbatim into the agent's stdin as if the user typed them.\n `CRITICAL — \"response\" field format rules:\\n` +\n `- When action is \"respond\", the \"response\" string is sent VERBATIM into the agent's terminal as if the user typed it.\\n` +\n `- It MUST be a brief, second-person imperative addressed directly to the agent. Examples: \"continue\", \"please create the pull request\", \"answer the question above\", \"proceed with the next step\".\\n` +\n `- NEVER write a third-person status report about the agent. Do NOT write things like \"The agent is still setting up\" or \"The agent needs to continue its work\" — that text would be piped into the agent's stdin and confuse it into thinking a new user message arrived describing itself.\\n` +\n `- NEVER describe the situation in the response field. If you need to explain your reasoning, put it in the \"reasoning\" field instead.\\n` +\n `- Keep the response under 20 words when possible. Short nudges work best.\\n\\n` +\n `Respond with ONLY a JSON object:\\n` +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\", \"keyDecision\": \"...\"}`\n );\n}\n\n/**\n * Build the LLM prompt for assessing whether a completed turn means the\n * overall task is done, or if the agent needs more turns.\n *\n * Called when the adapter detects \"task_complete\" (agent finished a turn and\n * returned to the idle prompt). The LLM decides whether to stop the session\n * or send a follow-up instruction.\n */\nexport function buildTurnCompletePrompt(\n taskCtx: TaskContextSummary,\n turnOutput: string,\n decisionHistory: DecisionHistoryEntry[],\n siblingTasks?: SiblingTaskSummary[],\n sharedDecisions?: SharedDecision[],\n swarmContext?: string,\n): string {\n const historySection =\n decisionHistory.length > 0\n ? `\\nPrevious decisions for this session:\\n${decisionHistory\n .slice(-5)\n .map(\n (d, i) =>\n ` ${i + 1}. [${d.event}] prompt=\"${d.promptText}\" → ${d.action}${d.response ? ` (\"${d.response}\")` : \"\"} — ${d.reasoning}`,\n )\n .join(\"\\n\")}\\n`\n : \"\";\n\n return (\n `You are Milady, an AI orchestrator managing a swarm of task agents. ` +\n `A ${taskCtx.agentType} task agent (\"${taskCtx.label}\", session: ${taskCtx.sessionId}) ` +\n `just finished a turn and is back at the idle prompt waiting for input.\\n\\n` +\n `Original task: \"${taskCtx.originalTask}\"\\n` +\n `Working directory: ${taskCtx.workdir}\\n` +\n `Repository: ${taskCtx.repo ?? \"none (scratch directory)\"}\\n` +\n buildSwarmContextSection(swarmContext) +\n buildSiblingSection(siblingTasks) +\n buildSharedDecisionsSection(sharedDecisions) +\n historySection +\n `\\nOutput from this turn:\\n` +\n `---\\n${turnOutput.slice(-3000)}\\n---\\n\\n` +\n `The agent completed a turn. Decide if the task is done or needs more work.\\n\\n` +\n `Options:\\n` +\n `1. \"complete\" — The task objectives have been met.\\n` +\n ` - For repo tasks: ONLY when a PR creation signal appears (\"Created pull request #N\"). ` +\n `A generic \"done\" or \"finished\" statement is NOT sufficient for repo tasks — a PR must exist.\\n` +\n ` - For scratch/research tasks (no repo): when the agent has produced its deliverable.\\n` +\n `2. \"respond\" — The agent needs to do more work.\\n` +\n `3. \"escalate\" — Something is wrong. Let the human decide.\\n` +\n `4. \"ignore\" — The agent is still working (e.g., spinner text like \"Germinating...\", \"Frosting...\"). ` +\n `Wait for the next turn.\\n\\n` +\n `CRITICAL RULES:\\n` +\n `- For repo tasks: use \"complete\" ONLY when \"Created pull request #N\" appears in output.\\n` +\n `- For scratch/research tasks: use \"complete\" when the agent delivers its output.\\n` +\n `- Do NOT ask the agent to review, verify, or re-check work it already completed.\\n` +\n `- If output is only spinner text, use \"ignore\" and wait for the next turn.\\n` +\n `- Use \"respond\" when the agent hasn't started, or when code was written but not yet committed/pushed/PR'd.\\n\\n` +\n `If the agent's output reveals a significant decision, include \"keyDecision\" with a brief summary.\\n\\n` +\n `Respond with ONLY a JSON object:\\n` +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\", \"keyDecision\": \"...\"}`\n );\n}\n\n// ─── Event Messages for Milaidy Pipeline ───\n\n/**\n * Build a natural language event message describing a blocked agent, intended\n * to be processed by Milaidy's full ElizaOS pipeline (with conversation memory,\n * personality, and actions). Unlike buildCoordinationPrompt(), this omits the\n * \"You are Milady\" preamble (she already IS Milady in the pipeline) and asks\n * for a fenced JSON action block at the end of her response.\n */\nexport function buildBlockedEventMessage(\n taskCtx: TaskContextSummary,\n promptText: string,\n recentOutput: string,\n decisionHistory: DecisionHistoryEntry[],\n siblingTasks?: SiblingTaskSummary[],\n sharedDecisions?: SharedDecision[],\n swarmContext?: string,\n): string {\n const historySection =\n decisionHistory.length > 0\n ? `\\nPrevious decisions:\\n${decisionHistory\n .slice(-5)\n .map(\n (d, i) =>\n ` ${i + 1}. [${d.event}] \"${d.promptText}\" → ${d.action}${d.response ? ` (\"${d.response}\")` : \"\"} — ${d.reasoning}`,\n )\n .join(\"\\n\")}\\n`\n : \"\";\n\n return (\n `[Task Agent Event] A ${taskCtx.agentType} agent (\"${taskCtx.label}\") is blocked and waiting for input.\\n\\n` +\n `Task: \"${taskCtx.originalTask}\"\\n` +\n `Workdir: ${taskCtx.workdir}\\n` +\n `Repo: ${taskCtx.repo ?? \"none (scratch directory)\"}\\n` +\n buildSwarmContextSection(swarmContext) +\n buildSiblingSection(siblingTasks) +\n buildSharedDecisionsSection(sharedDecisions) +\n historySection +\n `\\nRecent terminal output:\\n---\\n${recentOutput.slice(-3000)}\\n---\\n\\n` +\n `Blocking prompt: \"${promptText}\"\\n\\n` +\n `Decide how to handle this. Options:\\n` +\n `- \"respond\" — send text or keys to unblock the agent\\n` +\n `- \"complete\" — the task is fully done\\n` +\n `- \"escalate\" — you need the user's input\\n` +\n `- \"ignore\" — not actually blocking\\n\\n` +\n `Guidelines:\\n` +\n `- For tool approvals / Y/n that align with the task, respond \"y\" or keys:[\"enter\"].\\n` +\n `- If the prompt asks for info NOT in the original task, escalate.\\n` +\n `- Decline access to paths outside ${taskCtx.workdir}.\\n` +\n `- If a PR was just created, the task is done — use \"complete\".\\n` +\n `- When in doubt, escalate.\\n\\n` +\n `If the agent's output reveals a significant decision that sibling agents should know about, include \"keyDecision\" with a brief summary.\\n` +\n `Look for explicit \"DECISION:\" markers in the agent's output — always capture these as keyDecision.\\n\\n` +\n `Include a JSON action block at the end of your response:\\n` +\n \"```json\\n\" +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\", \"keyDecision\": \"...\"}\\n` +\n \"```\"\n );\n}\n\n/**\n * Build a natural language event message describing a turn completion, intended\n * to be processed by Milaidy's full ElizaOS pipeline.\n */\nexport function buildTurnCompleteEventMessage(\n taskCtx: TaskContextSummary,\n turnOutput: string,\n decisionHistory: DecisionHistoryEntry[],\n siblingTasks?: SiblingTaskSummary[],\n sharedDecisions?: SharedDecision[],\n swarmContext?: string,\n): string {\n const historySection =\n decisionHistory.length > 0\n ? `\\nPrevious decisions:\\n${decisionHistory\n .slice(-5)\n .map(\n (d, i) =>\n ` ${i + 1}. [${d.event}] \"${d.promptText}\" → ${d.action}${d.response ? ` (\"${d.response}\")` : \"\"} — ${d.reasoning}`,\n )\n .join(\"\\n\")}\\n`\n : \"\";\n\n return (\n `[Task Agent Event] A ${taskCtx.agentType} agent (\"${taskCtx.label}\") just finished a turn and is idle.\\n\\n` +\n `Task: \"${taskCtx.originalTask}\"\\n` +\n `Workdir: ${taskCtx.workdir}\\n` +\n `Repo: ${taskCtx.repo ?? \"none (scratch directory)\"}\\n` +\n buildSwarmContextSection(swarmContext) +\n buildSiblingSection(siblingTasks) +\n buildSharedDecisionsSection(sharedDecisions) +\n historySection +\n `\\nTurn output:\\n---\\n${turnOutput.slice(-3000)}\\n---\\n\\n` +\n `Decide if the overall task is done or if the agent needs more work.\\n\\n` +\n `Options:\\n` +\n `- \"respond\" — send a follow-up instruction (DEFAULT for intermediate steps)\\n` +\n `- \"complete\" — For repo tasks: ONLY when \"Created pull request #N\" appears. ` +\n `For scratch/research tasks: when the agent delivers its output.\\n` +\n `- \"escalate\" — something looks wrong, ask the user\\n` +\n `- \"ignore\" — spinner/loading output, agent still working\\n\\n` +\n `Guidelines:\\n` +\n `- For repo tasks, a generic \"done\" is NOT enough — require a PR creation signal.\\n` +\n `- If code was written but not committed/pushed/PR'd, respond with next step.\\n` +\n `- Do NOT ask the agent to re-verify work it already completed.\\n` +\n `- If the agent's output reveals a significant creative or architectural decision, include \"keyDecision\" with a brief summary.\\n` +\n `- Look for explicit \"DECISION:\" markers in the agent's output — always capture these as keyDecision.\\n\\n` +\n `Include a JSON action block at the end of your response:\\n` +\n \"```json\\n\" +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\", \"keyDecision\": \"...\"}\\n` +\n \"```\"\n );\n}\n\n/**\n * Parse the LLM's coordination response from raw text output.\n * Returns null if the response is invalid or unparseable.\n */\nexport function parseCoordinationResponse(\n llmOutput: string,\n): CoordinationLLMResponse | null {\n const jsonMatch = llmOutput.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) return null;\n\n try {\n const parsed = JSON.parse(jsonMatch[0]);\n\n const validActions = [\"respond\", \"escalate\", \"ignore\", \"complete\"];\n if (!validActions.includes(parsed.action)) return null;\n\n const result: CoordinationLLMResponse = {\n action: parsed.action,\n reasoning: parsed.reasoning || \"No reasoning provided\",\n };\n\n if (parsed.action === \"respond\") {\n if (parsed.useKeys && Array.isArray(parsed.keys)) {\n result.useKeys = true;\n result.keys = parsed.keys.map(String);\n } else if (typeof parsed.response === \"string\") {\n result.response = parsed.response;\n } else {\n // respond action but no response or keys — invalid\n return null;\n }\n }\n\n if (typeof parsed.keyDecision === \"string\" && parsed.keyDecision.trim()) {\n result.keyDecision = parsed.keyDecision.trim().slice(0, 240);\n }\n\n return result;\n } catch {\n return null;\n }\n}\n",
|
|
8
8
|
"/**\n * Event Triage — classifies coordinator events as \"routine\" or \"creative\"\n * to route them to the fast small-LLM path or the full Milaidy pipeline.\n *\n * Tier 1 (auto-response rules at PTY worker) already handled before we get here.\n * This module splits the remaining events into:\n * - \"routine\": simple approvals, permissions, config prompts → small LLM (~1-2s)\n * - \"creative\": error recovery, design questions, task evaluation → Milaidy (~5-10s)\n *\n * Pure functions — no side effects, same pattern as stall-classifier.ts.\n *\n * @module services/swarm-event-triage\n */\n\nimport { type IAgentRuntime, ModelType } from \"@elizaos/core\";\nimport { withTrajectoryContext } from \"./trajectory-context.js\";\n\n// ─── Types ───\n\nexport type TriageTier = \"routine\" | \"creative\";\n\nexport interface TriageContext {\n /** \"blocked\" or \"turn_complete\" */\n eventType: \"blocked\" | \"turn_complete\";\n /** The blocking prompt text (empty for turn completions). */\n promptText: string;\n /** Adapter's promptInfo.type if available. */\n promptType?: string;\n /** Recent terminal output (for turn completions). */\n recentOutput?: string;\n /** The original task description. */\n originalTask: string;\n}\n\n// ─── Heuristic Sets ───\n\n/** Prompt types from coding-agent-adapters that are always routine. */\nconst ROUTINE_PROMPT_TYPES = new Set([\n \"permission\",\n \"config\",\n \"tos\",\n \"tool_wait\",\n]);\n\n/** Prompt types that always need creative/contextual handling. */\nconst CREATIVE_PROMPT_TYPES = new Set([\"project_select\", \"model_select\"]);\n\n/** Regex patterns that indicate routine approval prompts. */\nconst ROUTINE_PATTERNS: RegExp[] = [\n /\\bAllow\\s+tool\\b/i,\n /\\(Y\\/n\\)/,\n /\\(y\\/N\\)/,\n /\\bTrust\\s+(this\\s+)?directory\\b/i,\n /\\bProceed\\?/i,\n /\\boverwrite\\?/i,\n /\\bDo you trust\\b/i,\n /\\bAllow access\\b/i,\n /\\bGrant permission\\b/i,\n /\\bAccept\\?/i,\n /\\bContinue\\?/i,\n /\\bPermit\\b.*\\?/i,\n /\\bApprove\\b.*\\?/i,\n];\n\n/** Regex patterns that indicate creative / contextual decision needed. */\nconst CREATIVE_PATTERNS: RegExp[] = [\n /\\bWhich approach\\b/i,\n /\\bHow should\\b/i,\n /\\btests? failing\\b/i,\n /\\bchoose between\\b/i,\n /\\bpick (one|a|an)\\b/i,\n /\\bWhat do you (want|think)\\b/i,\n /\\berror recover/i,\n /\\bfailed with\\b/i,\n /\\bcompilation error/i,\n /\\bbuild failed\\b/i,\n /\\btype error/i,\n /\\bmerge conflict/i,\n];\n\n/** Turn-complete output patterns that are obviously terminal (routine). */\nconst TERMINAL_OUTPUT_PATTERNS: RegExp[] = [\n /All \\d+ tests? pass/i,\n /Tests?:\\s+\\d+ passed/i,\n /✓ All checks passed/i,\n /https:\\/\\/github\\.com\\/[^\\s]+\\/pull\\/\\d+/,\n /Successfully created PR/i,\n /Commit [a-f0-9]{7,40}/i,\n];\n\n/** Turn-complete output patterns that are obviously intermediate (routine → continue). */\nconst INTERMEDIATE_OUTPUT_PATTERNS: RegExp[] = [\n /^Running tests?\\.\\.\\./im,\n /^Building\\.\\.\\./im,\n /^Installing dependencies/im,\n];\n\n// ─── Heuristic Classifier ───\n\n/**\n * Classify an event tier using only heuristics (prompt type + regex).\n * Returns null if inconclusive.\n */\nexport function classifyByHeuristic(ctx: TriageContext): TriageTier | null {\n // 1. Check adapter-provided prompt type\n if (ctx.promptType) {\n if (ROUTINE_PROMPT_TYPES.has(ctx.promptType)) return \"routine\";\n if (CREATIVE_PROMPT_TYPES.has(ctx.promptType)) return \"creative\";\n }\n\n // 2. For blocked events, check prompt text patterns\n if (ctx.eventType === \"blocked\" && ctx.promptText) {\n const hasRoutine = ROUTINE_PATTERNS.some((r) => r.test(ctx.promptText));\n const hasCreative = CREATIVE_PATTERNS.some((r) => r.test(ctx.promptText));\n\n if (hasRoutine && !hasCreative) return \"routine\";\n if (hasCreative && !hasRoutine) return \"creative\";\n // Both or neither → inconclusive\n if (hasCreative) return \"creative\"; // creative wins ties\n }\n\n // 3. For turn completions, check output patterns\n if (ctx.eventType === \"turn_complete\" && ctx.recentOutput) {\n const isTerminal = TERMINAL_OUTPUT_PATTERNS.some((r) =>\n r.test(ctx.recentOutput!),\n );\n const isIntermediate = INTERMEDIATE_OUTPUT_PATTERNS.some((r) =>\n r.test(ctx.recentOutput!),\n );\n\n if (isTerminal || isIntermediate) return \"routine\";\n // For turn completions, bias toward creative — most benefit from task context\n }\n\n return null; // Inconclusive — needs LLM classifier\n}\n\n// ─── LLM Classifier ───\n\n/**\n * Build a short classifier prompt for ambiguous events.\n */\nexport function buildTriagePrompt(ctx: TriageContext): string {\n const eventDesc =\n ctx.eventType === \"blocked\"\n ? `BLOCKED prompt: \"${ctx.promptText.slice(0, 300)}\"`\n : `TURN COMPLETE. Recent output:\\n${(ctx.recentOutput ?? \"\").slice(-500)}`;\n\n return (\n `Classify this task-agent event as \"routine\" or \"creative\".\\n\\n` +\n `Task: ${ctx.originalTask.slice(0, 200)}\\n` +\n `Event: ${eventDesc}\\n\\n` +\n `\"routine\" = simple approval, permission, config, yes/no, tool consent, obvious pass/fail.\\n` +\n `\"creative\" = needs task context, error recovery, design choice, ambiguous situation, approach selection.\\n\\n` +\n `Respond with ONLY a JSON object: {\"tier\": \"routine\"} or {\"tier\": \"creative\"}`\n );\n}\n\n/**\n * Parse the LLM's triage response. Returns null on failure.\n */\nexport function parseTriageResponse(llmOutput: string): TriageTier | null {\n const matches = llmOutput.matchAll(/\\{[\\s\\S]*?\\}/g);\n for (const match of matches) {\n try {\n const parsed = JSON.parse(match[0]);\n if (parsed.tier === \"routine\" || parsed.tier === \"creative\") {\n return parsed.tier;\n }\n } catch {\n // Try next match\n }\n }\n return null;\n}\n\n/**\n * Main entry point: classify an event as routine or creative.\n *\n * 1. Heuristics (0ms)\n * 2. Small LLM classifier (~500ms-1s) if heuristics are inconclusive\n * 3. Default to \"creative\" if classifier fails (safe default)\n */\nexport async function classifyEventTier(\n runtime: IAgentRuntime,\n ctx: TriageContext,\n log: (msg: string) => void,\n): Promise<TriageTier> {\n // Step 1: Heuristic classification\n const heuristicResult = classifyByHeuristic(ctx);\n if (heuristicResult) {\n log(`Triage: heuristic → ${heuristicResult}`);\n return heuristicResult;\n }\n\n // Step 2: Small LLM classifier\n try {\n const prompt = buildTriagePrompt(ctx);\n const result = await withTrajectoryContext(\n runtime,\n { source: \"orchestrator\", decisionType: \"event-triage\" },\n () => runtime.useModel(ModelType.TEXT_SMALL, { prompt }),\n );\n const tier = parseTriageResponse(result);\n if (tier) {\n log(`Triage: LLM → ${tier}`);\n return tier;\n }\n log(`Triage: LLM returned unparseable response — defaulting to creative`);\n } catch (err) {\n log(`Triage: LLM classifier failed: ${err} — defaulting to creative`);\n }\n\n // Step 3: Safe default\n return \"creative\";\n}\n",
|
|
9
|
-
"import { mkdir, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport {\n type IAgentRuntime,\n ModelType,\n} from \"@elizaos/core\";\nimport type {\n TaskThreadDetail,\n} from \"./task-registry.js\";\nimport type {\n SwarmCoordinatorContext,\n TaskContext,\n} from \"./swarm-coordinator.js\";\nimport { withTrajectoryContext } from \"./trajectory-context.js\";\n\ntype ValidationVerdict = \"pass\" | \"revise\" | \"escalate\";\n\ninterface TrajectoryListItem {\n id: string;\n status: string;\n llmCallCount: number;\n createdAt: string;\n metadata?: Record<string, unknown>;\n}\n\ninterface ValidationResponse {\n verdict: ValidationVerdict;\n summary: string;\n followUpPrompt?: string;\n checklist?: string[];\n}\n\nexport interface TaskValidationResult {\n verdict: ValidationVerdict;\n summary: string;\n followUpPrompt?: string;\n reportPath: string;\n artifacts: Array<{\n artifactType: string;\n title: string;\n path?: string | null;\n uri?: string | null;\n mimeType?: string | null;\n metadata?: Record<string, unknown>;\n }>;\n}\n\nexport interface ValidateTaskCompletionInput {\n sessionId: string;\n taskCtx: TaskContext;\n completionReasoning: string;\n completionSummary: string;\n turnOutput: string;\n}\n\ntype TrajectoryLoggerLike = {\n listTrajectories?: (options?: {\n limit?: number;\n offset?: number;\n search?: string;\n startDate?: string;\n }) => Promise<{ trajectories?: TrajectoryListItem[] } | null | undefined>;\n};\n\ntype ScreenshotSemanticResult = {\n contentVerified: boolean;\n contentSummary?: string;\n contentVerificationError?: string;\n};\n\nfunction extractJsonBlock(raw: string): string {\n const trimmed = raw.trim();\n const fenceMatch = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n return (fenceMatch?.[1] ?? trimmed).trim();\n}\n\nfunction parseValidationResponse(raw: string): ValidationResponse | null {\n try {\n const parsed = JSON.parse(extractJsonBlock(raw)) as Partial<ValidationResponse>;\n const verdict = parsed.verdict;\n const summary = parsed.summary?.trim();\n if (\n (verdict !== \"pass\" && verdict !== \"revise\" && verdict !== \"escalate\") ||\n !summary\n ) {\n return null;\n }\n const followUpPrompt = parsed.followUpPrompt?.trim();\n const checklist = Array.isArray(parsed.checklist)\n ? parsed.checklist.filter(\n (item): item is string => typeof item === \"string\" && item.trim().length > 0,\n )\n : undefined;\n return {\n verdict,\n summary,\n ...(followUpPrompt ? { followUpPrompt } : {}),\n ...(checklist && checklist.length > 0 ? { checklist } : {}),\n };\n } catch {\n return null;\n }\n}\n\nfunction getValidationRootDir(): string {\n const stateDir =\n process.env.MILADY_STATE_DIR?.trim() ||\n process.env.ELIZA_STATE_DIR?.trim() ||\n path.join(homedir(), \".milady\");\n return path.join(stateDir, \"task-validation\");\n}\n\nfunction truncate(text: string, limit = 1200): string {\n const compact = text.replace(/\\s+/g, \" \").trim();\n if (compact.length <= limit) return compact;\n return `${compact.slice(0, limit)}...`;\n}\n\nfunction pngHeaderValid(buffer: Uint8Array): boolean {\n if (buffer.length < 8) return false;\n const signature = [137, 80, 78, 71, 13, 10, 26, 10];\n return signature.every((value, index) => buffer[index] === value);\n}\n\ntype ValidationScreenshotCapture =\n | {\n status: \"captured\";\n path: string;\n sizeBytes: number;\n fileIntegrityVerified: boolean;\n sha256: string;\n captureScope: \"desktop-fullscreen\";\n contentVerified: boolean;\n contentSummary?: string;\n contentVerificationError?: string;\n }\n | {\n status: \"unavailable\";\n reason: string;\n };\n\nfunction resolveLoopbackApiBase(): string {\n const port =\n process.env.MILADY_API_PORT?.trim() ||\n process.env.ELIZA_PORT?.trim() ||\n \"31337\";\n return `http://127.0.0.1:${port}`;\n}\n\nasync function captureValidationScreenshot(\n runtime: IAgentRuntime,\n task: TaskContext,\n thread: TaskThreadDetail | null,\n sessionId: string,\n): Promise<ValidationScreenshotCapture> {\n try {\n const token =\n process.env.ELIZA_API_TOKEN?.trim() ||\n process.env.MILADY_API_TOKEN?.trim() ||\n process.env.MILADY_API_AUTH_TOKEN?.trim();\n const response = await fetch(\n `${resolveLoopbackApiBase()}/api/dev/cursor-screenshot`,\n {\n headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n },\n );\n if (!response.ok) {\n return {\n status: \"unavailable\",\n reason: `HTTP ${response.status} from /api/dev/cursor-screenshot`,\n };\n }\n\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (bytes.length === 0) {\n return {\n status: \"unavailable\",\n reason: \"Screenshot endpoint returned an empty PNG payload\",\n };\n }\n\n const dir = path.join(getValidationRootDir(), task.threadId);\n await mkdir(dir, { recursive: true });\n const screenshotPath = path.join(\n dir,\n `screenshot-${sessionId}-${Date.now()}.png`,\n );\n await writeFile(screenshotPath, bytes);\n\n const screenshotDescription = await describeScreenshotContent(\n runtime,\n task,\n thread,\n bytes,\n );\n\n return {\n status: \"captured\",\n path: screenshotPath,\n sizeBytes: bytes.length,\n fileIntegrityVerified: pngHeaderValid(bytes) && bytes.length > 1024,\n sha256: createHash(\"sha256\").update(bytes).digest(\"hex\"),\n captureScope: \"desktop-fullscreen\",\n contentVerified: screenshotDescription.contentVerified,\n ...(screenshotDescription.contentSummary\n ? { contentSummary: screenshotDescription.contentSummary }\n : {}),\n ...(screenshotDescription.contentVerificationError\n ? {\n contentVerificationError:\n screenshotDescription.contentVerificationError,\n }\n : {}),\n };\n } catch (error) {\n return {\n status: \"unavailable\",\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nasync function listRelevantTrajectories(\n runtime: IAgentRuntime,\n task: TaskContext,\n thread: TaskThreadDetail | null,\n): Promise<TrajectoryListItem[]> {\n const logger = runtime.getService(\"trajectory_logger\") as\n | TrajectoryLoggerLike\n | null\n | undefined;\n if (!logger?.listTrajectories) {\n return [];\n }\n\n const searchTerms = [\n task.sessionId,\n task.threadId,\n task.label,\n task.originalTask,\n ]\n .map((value) => value?.trim())\n .filter((value): value is string => Boolean(value));\n\n const seen = new Set<string>();\n const trajectories: TrajectoryListItem[] = [];\n for (const search of searchTerms) {\n const result = await logger.listTrajectories({\n limit: 10,\n search,\n ...(thread?.createdAt ? { startDate: thread.createdAt } : {}),\n });\n for (const item of result?.trajectories ?? []) {\n if (seen.has(item.id)) continue;\n seen.add(item.id);\n const metadata = (item.metadata ?? {}) as Record<string, unknown>;\n const orchestrator = metadata.orchestrator as Record<string, unknown> | undefined;\n const sessionMatches =\n orchestrator?.sessionId === task.sessionId ||\n metadata.sessionId === task.sessionId;\n const labelMatches =\n orchestrator?.taskLabel === task.label || metadata.taskLabel === task.label;\n if (!sessionMatches && !labelMatches && search !== task.sessionId) {\n continue;\n }\n trajectories.push(item);\n if (trajectories.length >= 3) {\n return trajectories;\n }\n }\n }\n\n return trajectories;\n}\n\nfunction extractImageDescriptionText(raw: unknown): string | null {\n if (typeof raw === \"string\") {\n const trimmed = raw.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (raw && typeof raw === \"object\") {\n const description = (raw as { description?: unknown }).description;\n if (typeof description === \"string\" && description.trim().length > 0) {\n return description.trim();\n }\n }\n return null;\n}\n\nasync function describeScreenshotContent(\n runtime: IAgentRuntime,\n task: TaskContext,\n thread: TaskThreadDetail | null,\n bytes: Uint8Array,\n): Promise<ScreenshotSemanticResult> {\n try {\n const dataUri = `data:image/png;base64,${Buffer.from(bytes).toString(\"base64\")}`;\n const acceptanceCriteria =\n thread?.acceptanceCriteria?.length\n ? thread.acceptanceCriteria.map((item) => `- ${item}`).join(\"\\n\")\n : \"- none\";\n const raw = await runtime.useModel(ModelType.IMAGE_DESCRIPTION, {\n imageUrl: dataUri,\n prompt: [\n \"Describe this validation screenshot for an orchestrated task.\",\n \"Focus on visible terminal output, UI state, status banners, tests, errors, and other completion evidence.\",\n `Task: ${task.originalTask}`,\n \"Acceptance criteria:\",\n acceptanceCriteria,\n \"Return a concise factual description.\",\n ].join(\"\\n\"),\n });\n const contentSummary = extractImageDescriptionText(raw);\n if (!contentSummary) {\n return {\n contentVerified: false,\n contentVerificationError:\n \"Vision model returned no usable screenshot description.\",\n };\n }\n return {\n contentVerified: true,\n contentSummary: truncate(contentSummary, 800),\n };\n } catch (error) {\n return {\n contentVerified: false,\n contentVerificationError:\n error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction describeScreenshotEvidence(\n screenshot: ValidationScreenshotCapture,\n): string {\n if (screenshot.status !== \"captured\") {\n return `- status=unavailable reason=${screenshot.reason}`;\n }\n return `- status=captured scope=${screenshot.captureScope} fileIntegrityVerified=${screenshot.fileIntegrityVerified} contentVerified=${screenshot.contentVerified} sha256=${screenshot.sha256} path=${screenshot.path} sizeBytes=${screenshot.sizeBytes}${screenshot.contentSummary ? ` summary=${truncate(screenshot.contentSummary, 500)}` : \"\"}${screenshot.contentVerificationError ? ` contentVerificationError=${screenshot.contentVerificationError}` : \"\"}`;\n}\n\nfunction buildValidationPrompt(\n task: TaskContext,\n thread: TaskThreadDetail | null,\n completionReasoning: string,\n completionSummary: string,\n turnOutput: string,\n trajectories: TrajectoryListItem[],\n screenshot: ValidationScreenshotCapture,\n): string {\n const acceptanceCriteria =\n thread?.acceptanceCriteria?.length\n ? thread.acceptanceCriteria.map((item) => `- ${item}`).join(\"\\n\")\n : \"- Complete the user's request\\n- Verify the result with available evidence\\n- Do not claim success if important work is still missing\";\n const completionExcerpt =\n turnOutput || completionSummary || completionReasoning || \"none\";\n const trajectoryBlock =\n trajectories.length > 0\n ? trajectories\n .map(\n (item) =>\n `- ${item.id} | status=${item.status} | llmCalls=${item.llmCallCount} | createdAt=${item.createdAt}`,\n )\n .join(\"\\n\")\n : \"- none\";\n const transcriptPreview =\n thread?.transcripts?.slice(-8).map((entry) => {\n const content = truncate(entry.content, 220);\n return `- [${entry.direction}] ${content}`;\n }).join(\"\\n\") ?? \"- none\";\n const artifactBlock =\n thread?.artifacts?.slice(-8).map((artifact) => {\n const locator = artifact.path ?? artifact.uri ?? \"inline\";\n return `- ${artifact.artifactType}: ${artifact.title} (${locator})`;\n }).join(\"\\n\") ?? \"- none\";\n\n return [\n \"You are validating whether an orchestrated task is actually finished.\",\n \"Return strict JSON only with this shape:\",\n '{\"verdict\":\"pass|revise|escalate\",\"summary\":\"short summary\",\"followUpPrompt\":\"only if verdict=revise\",\"checklist\":[\"optional evidence notes\"]}',\n \"\",\n `Task title: ${task.label}`,\n `Original request: ${task.originalTask}`,\n `Completion reasoning: ${completionReasoning || \"none\"}`,\n `Completion summary: ${completionSummary || \"none\"}`,\n \"\",\n \"Acceptance criteria:\",\n acceptanceCriteria,\n \"\",\n \"Latest turn output excerpt:\",\n truncate(completionExcerpt, 2400),\n \"\",\n \"Recent transcript excerpt:\",\n transcriptPreview,\n \"\",\n \"Existing task artifacts:\",\n artifactBlock,\n \"\",\n \"Related trajectories:\",\n trajectoryBlock,\n \"\",\n \"Screenshot evidence:\",\n describeScreenshotEvidence(screenshot),\n \"\",\n \"Rules:\",\n \"- Pass only if the task appears complete and the available evidence supports that claim.\",\n \"- Revise if the agent should keep working. In that case, provide a direct follow-up prompt.\",\n \"- Escalate if the task cannot be validated from available evidence and needs human review.\",\n \"- Be skeptical. Missing tests or missing verification should usually mean revise or escalate, not pass.\",\n \"- Treat screenshot capture as artifact evidence only. A desktop screenshot may prove the UI rendered, but it does not semantically prove the task without supporting transcript, test, or trajectory evidence.\",\n ].join(\"\\n\");\n}\n\nasync function persistValidationReport(\n threadId: string,\n sessionId: string,\n report: Record<string, unknown>,\n): Promise<string> {\n const dir = path.join(getValidationRootDir(), threadId);\n await mkdir(dir, { recursive: true });\n const reportPath = path.join(\n dir,\n `validation-${sessionId}-${Date.now()}.json`,\n );\n await writeFile(reportPath, JSON.stringify(report, null, 2), \"utf8\");\n return reportPath;\n}\n\nexport async function validateTaskCompletion(\n ctx: SwarmCoordinatorContext,\n input: ValidateTaskCompletionInput,\n): Promise<TaskValidationResult> {\n const { sessionId, taskCtx, completionReasoning, completionSummary, turnOutput } =\n input;\n const thread = await ctx.taskRegistry.getThread(taskCtx.threadId);\n const trajectories = await listRelevantTrajectories(ctx.runtime, taskCtx, thread);\n const screenshot = await captureValidationScreenshot(\n ctx.runtime,\n taskCtx,\n thread,\n sessionId,\n );\n\n const prompt = buildValidationPrompt(\n taskCtx,\n thread,\n completionReasoning,\n completionSummary,\n turnOutput,\n trajectories,\n screenshot,\n );\n const rawValidation = await withTrajectoryContext(\n ctx.runtime,\n {\n source: \"orchestrator\",\n decisionType: \"task-validation\",\n sessionId,\n taskLabel: taskCtx.label,\n repo: taskCtx.repo,\n workdir: taskCtx.workdir,\n originalTask: taskCtx.originalTask,\n },\n () => ctx.runtime.useModel(ModelType.TEXT_SMALL, { prompt }),\n );\n\n const parsed = parseValidationResponse(rawValidation);\n const verdict: ValidationResponse =\n parsed ?? {\n verdict: \"escalate\",\n summary:\n \"Validation model returned an invalid response, so this task needs human review.\",\n };\n\n const report = {\n version: 1,\n createdAt: new Date().toISOString(),\n threadId: taskCtx.threadId,\n sessionId,\n label: taskCtx.label,\n originalTask: taskCtx.originalTask,\n completionReasoning,\n completionSummary,\n verdict: verdict.verdict,\n summary: verdict.summary,\n followUpPrompt: verdict.followUpPrompt ?? null,\n acceptanceCriteria: thread?.acceptanceCriteria ?? [],\n evidence: {\n transcriptCount: thread?.transcripts.length ?? 0,\n decisionCount: thread?.decisions.length ?? 0,\n eventCount: thread?.events.length ?? 0,\n artifactCount: thread?.artifacts.length ?? 0,\n screenshot,\n trajectories: trajectories.map((item) => ({\n id: item.id,\n status: item.status,\n llmCallCount: item.llmCallCount,\n createdAt: item.createdAt,\n })),\n checklist: verdict.checklist ?? [],\n turnOutputExcerpt: truncate(turnOutput || completionSummary || completionReasoning || \"\"),\n },\n };\n const reportPath = await persistValidationReport(taskCtx.threadId, sessionId, report);\n\n const artifacts: TaskValidationResult[\"artifacts\"] = [\n {\n artifactType: \"validation_report\",\n title: `Validation report for ${taskCtx.label}`,\n path: reportPath,\n mimeType: \"application/json\",\n metadata: {\n verdict: verdict.verdict,\n summary: verdict.summary,\n },\n },\n ...trajectories.map((item) => ({\n artifactType: \"trajectory_link\",\n title: `Trajectory ${item.id}`,\n uri: `/api/trajectories/${encodeURIComponent(item.id)}`,\n metadata: {\n trajectoryId: item.id,\n status: item.status,\n llmCallCount: item.llmCallCount,\n },\n })),\n ];\n\n if (screenshot.status === \"captured\") {\n artifacts.push({\n artifactType: \"screenshot\",\n title: `Validation screenshot for ${taskCtx.label}`,\n path: screenshot.path,\n mimeType: \"image/png\",\n metadata: {\n fileIntegrityVerified: screenshot.fileIntegrityVerified,\n sizeBytes: screenshot.sizeBytes,\n sha256: screenshot.sha256,\n captureScope: screenshot.captureScope,\n contentVerified: screenshot.contentVerified,\n ...(screenshot.contentSummary\n ? { contentSummary: screenshot.contentSummary }\n : {}),\n ...(screenshot.contentVerificationError\n ? {\n contentVerificationError:\n screenshot.contentVerificationError,\n }\n : {}),\n },\n });\n }\n\n return {\n verdict: verdict.verdict,\n summary: verdict.summary,\n ...(verdict.followUpPrompt ? { followUpPrompt: verdict.followUpPrompt } : {}),\n reportPath,\n artifacts,\n };\n}\n",
|
|
10
|
-
"/**\n * Swarm Coordinator — Decision Loop & Blocked/Turn-Complete Handlers\n *\n * Extracted from swarm-coordinator.ts for modularity.\n * All functions are pure async helpers that receive a SwarmCoordinatorContext\n * to access shared state and services.\n *\n * @module services/swarm-decision-loop\n */\n\nimport * as path from \"node:path\";\nimport { ModelType } from \"@elizaos/core\";\nimport { cleanForChat, extractCompletionSummary } from \"./ansi-utils.js\";\nimport type {\n PendingDecision,\n SwarmCoordinatorContext,\n TaskContext,\n} from \"./swarm-coordinator.js\";\nimport {\n buildBlockedEventMessage,\n buildCoordinationPrompt,\n buildTurnCompleteEventMessage,\n buildTurnCompletePrompt,\n type CoordinationLLMResponse,\n type DecisionHistoryEntry,\n parseCoordinationResponse,\n type SharedDecision,\n type SiblingTaskSummary,\n type TaskContextSummary,\n} from \"./swarm-coordinator-prompts.js\";\nimport {\n classifyEventTier,\n type TriageContext,\n} from \"./swarm-event-triage.js\";\nimport { validateTaskCompletion } from \"./task-validation.js\";\nimport { withTrajectoryContext } from \"./trajectory-context.js\";\n\n// ─── Constants ───\n\n/** Timeout for agent decision pipeline callback (ms). */\nconst DECISION_CB_TIMEOUT_MS = 30_000;\n\n/** Wrap a promise with a timeout. Rejects with an error if not resolved in time. */\nfunction withTimeout<T>(promise: Promise<T>, ms: number, label: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);\n promise.then(\n (val) => { clearTimeout(timer); resolve(val); },\n (err) => { clearTimeout(timer); reject(err); },\n );\n });\n}\n\n/** Maximum consecutive auto-responses before escalating to a human. */\nconst MAX_AUTO_RESPONSES = 10;\n\n/**\n * Grace period after the coordinator sends input to an agent (ms).\n * During this window, stall and turn-complete events are suppressed\n * to give the agent time to process the input before re-assessment.\n */\nexport const POST_SEND_COOLDOWN_MS = 15_000;\nconst deferredTurnCompleteTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n/** Clear all deferred turn-complete timers (used during coordinator shutdown). */\nexport function clearDeferredTurnCompleteTimers(): void {\n for (const timer of deferredTurnCompleteTimers.values()) {\n clearTimeout(timer);\n }\n deferredTurnCompleteTimers.clear();\n}\n\n// ─── Helpers ───\n\n/** Build a TaskContextSummary from a TaskContext. */\nfunction toContextSummary(taskCtx: TaskContext): TaskContextSummary {\n return {\n sessionId: taskCtx.sessionId,\n agentType: taskCtx.agentType,\n label: taskCtx.label,\n originalTask: taskCtx.originalTask,\n workdir: taskCtx.workdir,\n repo: taskCtx.repo,\n };\n}\n\n/** Extract recent non-auto-resolved decisions as history entries. */\nfunction toDecisionHistory(taskCtx: TaskContext): DecisionHistoryEntry[] {\n return taskCtx.decisions\n .filter((d) => d.decision !== \"auto_resolved\")\n .slice(-5)\n .map((d) => ({\n event: d.event,\n promptText: d.promptText,\n action: d.decision,\n response: d.response,\n reasoning: d.reasoning,\n }));\n}\n\n/** Collect sibling task summaries for cross-task context (excludes the current session). */\nfunction collectSiblings(\n ctx: SwarmCoordinatorContext,\n currentSessionId: string,\n): SiblingTaskSummary[] {\n const siblings: SiblingTaskSummary[] = [];\n for (const [sid, task] of ctx.tasks) {\n if (sid === currentSessionId) continue;\n\n // Find the most recent keyDecision from this sibling's decisions\n let lastKeyDecision: string | undefined;\n for (let i = task.decisions.length - 1; i >= 0; i--) {\n const d = task.decisions[i];\n if (d.reasoning && d.decision !== \"auto_resolved\") {\n lastKeyDecision = d.reasoning;\n break;\n }\n }\n\n // Also check shared decisions for this sibling's key decisions\n for (let i = ctx.sharedDecisions.length - 1; i >= 0; i--) {\n const sd = ctx.sharedDecisions[i];\n if (sd.agentLabel === task.label) {\n lastKeyDecision = sd.summary;\n break;\n }\n }\n\n siblings.push({\n label: task.label,\n agentType: task.agentType,\n originalTask: task.originalTask,\n status: task.status,\n lastKeyDecision,\n completionSummary: task.completionSummary,\n });\n }\n return siblings;\n}\n\n/**\n * Enrich a text response with any shared decisions the agent hasn't seen yet.\n * Returns the enriched response and the snapshot index to commit after send.\n * Short responses (like \"y\", \"n\", single-word approvals) are left untouched\n * to avoid confusing TUI prompts.\n */\nfunction enrichWithSharedDecisions(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n response: string,\n): { response: string; snapshotIndex?: number } {\n const taskCtx = ctx.tasks.get(sessionId);\n if (!taskCtx) return { response };\n\n const allDecisions = ctx.sharedDecisions;\n const lastSeen = taskCtx.lastSeenDecisionIndex;\n // Snapshot the current length so we don't skip decisions appended during send.\n const snapshotEnd = allDecisions.length;\n if (lastSeen >= snapshotEnd) return { response };\n\n // Don't inject context into short responses (approvals, single words)\n if (response.length < 20) {\n return { response };\n }\n\n const unseen = allDecisions.slice(lastSeen, snapshotEnd);\n\n const contextBlock = unseen\n .map((d) => `[${d.agentLabel}] ${d.summary}`)\n .join(\"; \");\n\n return {\n response: `${response}\\n\\n(Context from other agents: ${contextBlock})`,\n snapshotIndex: snapshotEnd,\n };\n}\n\n/** Advance the shared-decisions high-water mark for a session after a successful send. */\nfunction commitSharedDecisionIndex(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n snapshotIndex: number,\n): void {\n const taskCtx = ctx.tasks.get(sessionId);\n if (taskCtx) {\n taskCtx.lastSeenDecisionIndex = snapshotIndex;\n }\n}\n\n/** Record a key decision from an LLM response into the shared decisions list. */\nfunction recordKeyDecision(\n ctx: SwarmCoordinatorContext,\n agentLabel: string,\n decision: CoordinationLLMResponse,\n): void {\n if (!decision.keyDecision) return;\n ctx.sharedDecisions.push({\n agentLabel,\n summary: decision.keyDecision,\n timestamp: Date.now(),\n });\n ctx.log(`Shared decision from \"${agentLabel}\": ${decision.keyDecision}`);\n}\n\n/**\n * Drain a buffered task_complete event for a session after an in-flight\n * decision finishes. Prevents task_complete from being silently dropped\n * when it arrives during a slow handleBlocked/handleAutonomous LLM call.\n */\nasync function drainPendingTurnComplete(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n): Promise<void> {\n if (!ctx.pendingTurnComplete.has(sessionId)) return;\n const pendingData = ctx.pendingTurnComplete.get(sessionId);\n ctx.pendingTurnComplete.delete(sessionId);\n\n const taskCtx = ctx.tasks.get(sessionId);\n if (!taskCtx || taskCtx.status !== \"active\") return;\n\n ctx.log(`Draining buffered turn-complete for \"${taskCtx.label}\"`);\n await handleTurnComplete(ctx, sessionId, taskCtx, pendingData);\n}\n\n/**\n * Drain a buffered blocked event for a session after an in-flight\n * decision finishes. Prevents a distinct blocked prompt from being\n * silently dropped when it arrives during a slow LLM call.\n */\nasync function drainPendingBlocked(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n): Promise<void> {\n if (!ctx.pendingBlocked.has(sessionId)) return;\n const pendingData = ctx.pendingBlocked.get(sessionId);\n ctx.pendingBlocked.delete(sessionId);\n\n const taskCtx = ctx.tasks.get(sessionId);\n if (!taskCtx || taskCtx.status !== \"active\") return;\n\n ctx.log(`Draining buffered blocked event for \"${taskCtx.label}\"`);\n await handleBlocked(ctx, sessionId, taskCtx, pendingData);\n}\n\n/** Format a decision's response for recording. */\nfunction formatDecisionResponse(\n decision: CoordinationLLMResponse,\n): string | undefined {\n if (decision.action !== \"respond\") return undefined;\n return decision.useKeys\n ? `keys:${decision.keys?.join(\",\")}`\n : decision.response;\n}\n\nfunction decisionFromSuggestedResponse(\n suggestedResponse: string,\n reasoning = \"Used adapter-provided auto-response for a routine blocking prompt.\",\n): CoordinationLLMResponse {\n if (suggestedResponse.startsWith(\"keys:\")) {\n return {\n action: \"respond\",\n useKeys: true,\n keys: suggestedResponse\n .slice(\"keys:\".length)\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean),\n reasoning,\n };\n }\n return {\n action: \"respond\",\n response: suggestedResponse,\n reasoning,\n };\n}\n\nfunction inferRoutinePromptResponse(\n promptText: string,\n promptType?: string,\n): { suggestedResponse: string; reasoning: string } | null {\n if (promptType && promptType !== \"unknown\") {\n return null;\n }\n\n if (\n /should i open (?:the )?(?:page|link|url).*(?:new tab|browser tab).*instead\\??/i.test(\n promptText,\n )\n ) {\n return {\n suggestedResponse: \"yes\",\n reasoning:\n \"Accepted routine browser follow-up so the agent can keep using its web tool without human intervention.\",\n };\n }\n\n if (\n /cheaper,\\s*faster,\\s*but less capable/i.test(promptText) &&\n /keep current model/i.test(promptText)\n ) {\n return {\n suggestedResponse: \"2\",\n reasoning:\n \"Kept the current Codex model so a routine model-selection prompt does not stall the task.\",\n };\n }\n\n return null;\n}\n\n/** Check if a permission prompt references paths outside the workspace. */\nexport function isOutOfScopeAccess(\n promptText: string,\n workdir: string,\n): boolean {\n // Strip URLs so we don't false-positive on https://example.com/foo/bar\n const stripped = promptText.replace(/https?:\\/\\/\\S+/g, \"\");\n\n // Match absolute paths: multi-segment (/dir/file) or well-known single-segment\n // roots that agents should never touch (/etc, /tmp, /var, /usr, /opt, /sys, /proc).\n const multiSegment = /\\/[\\w.-]+(?:\\/[\\w.-]+)+/g;\n const sensitiveRoots = /\\b\\/(etc|tmp|var|usr|opt|sys|proc|root)\\b/g;\n const homeTilde = /~\\/[\\w.-]+/g;\n\n const matches = [\n ...(stripped.match(multiSegment) ?? []),\n ...(stripped.match(sensitiveRoots) ?? []).map((m) => m.trimStart()),\n ...(stripped.match(homeTilde) ?? []).map((m) =>\n m.replace(\"~\", process.env.HOME ?? \"/home/user\"),\n ),\n ];\n if (matches.length === 0) return false;\n\n const resolvedWorkdir = path.resolve(workdir);\n return matches.some((p) => {\n const resolved = path.resolve(p);\n return (\n !resolved.startsWith(resolvedWorkdir + path.sep) &&\n resolved !== resolvedWorkdir\n );\n });\n}\n\n/**\n * Check if all registered tasks have reached a terminal state.\n * If so, send a swarm-wide summary message to the chat.\n */\nexport function checkAllTasksComplete(ctx: SwarmCoordinatorContext): void {\n const tasks = Array.from(ctx.tasks.values());\n if (tasks.length === 0) return;\n\n const terminalStates = new Set([\"completed\", \"stopped\", \"error\"]);\n const allDone = tasks.every((t) => terminalStates.has(t.status));\n\n if (!allDone) {\n const statuses = tasks.map((t) => `${t.label}=${t.status}`).join(\", \");\n ctx.log(`checkAllTasksComplete: not all done yet — ${statuses}`);\n return;\n }\n\n // Guard: only fire once per swarm (reset by coordinator on stop/new swarm)\n if (ctx.swarmCompleteNotified) {\n ctx.log(\"checkAllTasksComplete: already notified — skipping\");\n return;\n }\n ctx.swarmCompleteNotified = true;\n\n const completed = tasks.filter((t) => t.status === \"completed\");\n const stopped = tasks.filter((t) => t.status === \"stopped\");\n const errored = tasks.filter((t) => t.status === \"error\");\n\n const parts: string[] = [];\n if (completed.length > 0) {\n parts.push(`${completed.length} completed`);\n }\n if (stopped.length > 0) {\n parts.push(`${stopped.length} stopped`);\n }\n if (errored.length > 0) {\n parts.push(`${errored.length} errored`);\n }\n\n ctx.log(`checkAllTasksComplete: all ${tasks.length} tasks terminal (${parts.join(\", \")}) — firing swarm_complete`);\n\n ctx.broadcast({\n type: \"swarm_complete\",\n sessionId: \"\",\n timestamp: Date.now(),\n data: {\n total: tasks.length,\n completed: completed.length,\n stopped: stopped.length,\n errored: errored.length,\n },\n });\n\n // Fire swarm complete callback for synthesis — if wired, the host\n // (milaidy) will use this to generate a synthesized overview.\n const swarmCompleteCb = ctx.getSwarmCompleteCallback();\n const sendFallbackSummary = () => {\n ctx.sendChatMessage(\n `All ${tasks.length} task agents finished (${parts.join(\", \")}). Review their work when you're ready.`,\n \"task-agent\",\n );\n };\n\n if (swarmCompleteCb) {\n ctx.log(\"checkAllTasksComplete: swarm complete callback is wired — calling synthesis\");\n const taskSummaries = tasks.map((t) => {\n // Fold in shared decisions relevant to this task so the synthesis\n // prompt includes the agent's actual findings, not just PR URLs.\n const decisions = ctx.sharedDecisions\n .filter((sd) => sd.agentLabel === t.label)\n .map((sd) => sd.summary);\n const summaryParts: string[] = [];\n if (decisions.length > 0) summaryParts.push(decisions.join(\"; \"));\n if (t.completionSummary) summaryParts.push(t.completionSummary);\n return {\n sessionId: t.sessionId,\n label: t.label,\n agentType: t.agentType,\n originalTask: t.originalTask,\n status: t.status,\n completionSummary: summaryParts.join(\"\\n\") || \"\",\n };\n });\n // Wrap in Promise.resolve().then() to catch sync throws, and race against\n // a timeout to guard against callbacks that never settle.\n void withTimeout(\n Promise.resolve().then(() =>\n swarmCompleteCb({\n tasks: taskSummaries,\n total: tasks.length,\n completed: completed.length,\n stopped: stopped.length,\n errored: errored.length,\n }),\n ),\n DECISION_CB_TIMEOUT_MS,\n \"swarmCompleteCb\",\n ).catch((err) => {\n ctx.log(`Swarm complete callback failed: ${err} — falling back to generic summary`);\n sendFallbackSummary();\n });\n } else {\n ctx.log(\"checkAllTasksComplete: no synthesis callback — sending generic message\");\n sendFallbackSummary();\n }\n}\n\n/** Fetch recent PTY output, returning empty string on failure. */\nasync function fetchRecentOutput(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n lines = 50,\n): Promise<string> {\n if (!ctx.ptyService) return \"\";\n try {\n return await ctx.ptyService.getSessionOutput(sessionId, lines);\n } catch {\n return \"\";\n }\n}\n\n// ─── LLM Decision ───\n\n/**\n * Ask the LLM to make a coordination decision about a blocked agent.\n */\nexport async function makeCoordinationDecision(\n ctx: SwarmCoordinatorContext,\n taskCtx: TaskContext,\n promptText: string,\n recentOutput: string,\n): Promise<CoordinationLLMResponse | null> {\n const prompt = buildCoordinationPrompt(\n toContextSummary(taskCtx),\n promptText,\n recentOutput,\n toDecisionHistory(taskCtx),\n collectSiblings(ctx, taskCtx.sessionId),\n ctx.sharedDecisions,\n ctx.getSwarmContext(),\n );\n\n try {\n const result = await withTrajectoryContext(\n ctx.runtime,\n {\n source: \"orchestrator\",\n decisionType: \"coordination\",\n sessionId: taskCtx.sessionId,\n taskLabel: taskCtx.label,\n repo: taskCtx.repo,\n workdir: taskCtx.workdir,\n originalTask: taskCtx.originalTask,\n },\n () => ctx.runtime.useModel(ModelType.TEXT_SMALL, { prompt }),\n );\n return parseCoordinationResponse(result);\n } catch (err) {\n ctx.log(`LLM coordination call failed: ${err}`);\n return null;\n }\n}\n\n/**\n * Execute a coordination decision — send response, complete session, escalate, or ignore.\n */\nexport async function executeDecision(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n decision: CoordinationLLMResponse,\n): Promise<void> {\n if (!ctx.ptyService) return;\n\n switch (decision.action) {\n case \"respond\": {\n const taskCtx = ctx.tasks.get(sessionId);\n if (taskCtx) {\n taskCtx.status = \"active\";\n }\n if (decision.useKeys && decision.keys) {\n await ctx.ptyService.sendKeysToSession(sessionId, decision.keys);\n } else if (decision.response !== undefined) {\n // Proactive injection: append unseen shared decisions to text responses\n const { response: enriched, snapshotIndex } = enrichWithSharedDecisions(\n ctx, sessionId, decision.response,\n );\n await ctx.ptyService.sendToSession(sessionId, enriched);\n // Only advance the high-water mark after send succeeds — if the send\n // fails, the decisions will be retried on the next enrichment.\n if (snapshotIndex !== undefined) {\n commitSharedDecisionIndex(ctx, sessionId, snapshotIndex);\n }\n }\n // Mark the send time so stall/turn-complete events are suppressed\n // during the grace period while the agent processes this input.\n if (taskCtx) {\n taskCtx.lastInputSentAt = Date.now();\n await ctx.syncTaskContext(taskCtx);\n }\n break;\n }\n\n case \"complete\": {\n const taskCtx = ctx.tasks.get(sessionId);\n\n // Extract meaningful artifacts (PR URLs, commits) instead of\n // dumping raw terminal output which is full of TUI noise.\n let summary = \"\";\n try {\n const rawOutput = await ctx.ptyService.getSessionOutput(sessionId, 50);\n summary = extractCompletionSummary(rawOutput);\n } catch {\n /* ignore */\n }\n\n if (!taskCtx) {\n ctx.broadcast({\n type: \"task_complete\",\n sessionId,\n timestamp: Date.now(),\n data: { reasoning: decision.reasoning },\n });\n ctx.ptyService.stopSession(sessionId, /* force */ true).catch((err) => {\n ctx.log(`Failed to stop session after LLM-detected completion: ${err}`);\n });\n break;\n }\n\n taskCtx.completionSummary = summary || decision.reasoning || \"\";\n taskCtx.status = \"tool_running\";\n await Promise.all([\n ctx.syncTaskContext(taskCtx),\n ctx.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"validation_started\",\n summary: `Validation started for \"${taskCtx.label}\"`,\n data: {\n completionReasoning: decision.reasoning,\n completionSummary: taskCtx.completionSummary,\n },\n }),\n ]);\n ctx.broadcast({\n type: \"tool_running\",\n sessionId,\n timestamp: Date.now(),\n data: {\n description: \"validation\",\n },\n });\n\n const validation = await validateTaskCompletion(ctx, {\n sessionId,\n taskCtx,\n completionReasoning: decision.reasoning,\n completionSummary: taskCtx.completionSummary,\n turnOutput: taskCtx.completionSummary,\n }).catch(\n (err) =>\n ({\n verdict: \"escalate\" as const,\n summary:\n err instanceof Error\n ? `Validation failed: ${err.message}`\n : `Validation failed: ${String(err)}`,\n followUpPrompt: undefined,\n reportPath: \"\",\n artifacts: [],\n }) satisfies Awaited<ReturnType<typeof validateTaskCompletion>>,\n );\n\n for (const artifact of validation.artifacts) {\n await ctx.taskRegistry.recordArtifact({\n threadId: taskCtx.threadId,\n sessionId,\n artifactType: artifact.artifactType,\n title: artifact.title,\n path: artifact.path ?? null,\n uri: artifact.uri ?? null,\n mimeType: artifact.mimeType ?? null,\n metadata: artifact.metadata ?? {},\n });\n }\n\n if (validation.verdict !== \"pass\") {\n const followUpPrompt =\n validation.followUpPrompt?.trim() ||\n `Validation found the task incomplete. Continue working until this is resolved:\\n\\n${validation.summary}`;\n const nextStatus = validation.verdict === \"escalate\" ? \"blocked\" : \"active\";\n taskCtx.status = nextStatus;\n await Promise.all([\n ctx.syncTaskContext(taskCtx),\n ctx.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"validation_failed\",\n summary: `Validation did not approve \"${taskCtx.label}\"`,\n data: {\n verdict: validation.verdict,\n summary: validation.summary,\n followUpPrompt:\n validation.verdict === \"revise\" ? followUpPrompt : null,\n reportPath: validation.reportPath || null,\n },\n }),\n ]);\n\n if (validation.verdict === \"revise\") {\n await ctx.ptyService.sendToSession(sessionId, followUpPrompt);\n taskCtx.lastInputSentAt = Date.now();\n await ctx.syncTaskContext(taskCtx);\n ctx.sendChatMessage(\n `[${taskCtx.label}] Validation asked the agent to continue: ${validation.summary}`,\n \"coding-agent\",\n );\n } else {\n ctx.broadcast({\n type: \"escalation\",\n sessionId,\n timestamp: Date.now(),\n data: {\n reason: \"validation_escalation\",\n summary: validation.summary,\n },\n });\n ctx.sendChatMessage(\n `[${taskCtx.label}] Validation needs human review: ${validation.summary}`,\n \"coding-agent\",\n );\n }\n break;\n }\n\n taskCtx.status = \"completed\";\n await Promise.all([\n ctx.syncTaskContext(taskCtx),\n ctx.taskRegistry.updateThreadSummary(\n taskCtx.threadId,\n taskCtx.completionSummary,\n ),\n ctx.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"validation_passed\",\n summary: `Validation passed for \"${taskCtx.label}\"`,\n data: {\n summary: validation.summary,\n reportPath: validation.reportPath || null,\n },\n }),\n ctx.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"task_status_changed\",\n summary: `Task \"${taskCtx.label}\" completed`,\n data: {\n status: \"completed\",\n completionSummary: taskCtx.completionSummary,\n validationSummary: validation.summary,\n },\n }),\n ]);\n\n // Log to persistent history (non-blocking but observed)\n (ctx as { history?: { append: (e: unknown) => Promise<void> } }).history?.append({\n timestamp: Date.now(),\n type: \"task_completed\",\n sessionId,\n label: taskCtx.label,\n agentType: taskCtx.agentType,\n repo: taskCtx.repo,\n workdir: taskCtx.workdir,\n completionSummary: taskCtx.completionSummary,\n validationSummary: validation.summary,\n }).catch((err) => {\n ctx.log(`Failed to persist task completion for \"${taskCtx.label}\" (${sessionId}): ${err}`);\n });\n\n ctx.broadcast({\n type: \"task_complete\",\n sessionId,\n timestamp: Date.now(),\n data: {\n reasoning: decision.reasoning,\n validationSummary: validation.summary,\n },\n });\n\n ctx.sendChatMessage(\n taskCtx.completionSummary\n ? `Finished \"${taskCtx.label}\".\\n\\n${taskCtx.completionSummary}`\n : `Finished \"${taskCtx.label}\".`,\n \"coding-agent\",\n );\n\n // Force-kill the session — task is done, nothing to save.\n // SIGKILL ensures the PTY and all child processes exit immediately,\n // preventing orphaned workspace processes.\n ctx.ptyService.stopSession(sessionId, /* force */ true).catch((err) => {\n ctx.log(`Failed to stop session after LLM-detected completion: ${err}`);\n });\n\n // Check if all tasks are now done — send a swarm-wide summary if so\n checkAllTasksComplete(ctx);\n break;\n }\n\n case \"escalate\":\n ctx.broadcast({\n type: \"escalation\",\n sessionId,\n timestamp: Date.now(),\n data: {\n reasoning: decision.reasoning,\n },\n });\n break;\n\n case \"ignore\":\n // No action needed\n break;\n }\n}\n\n// ─── Event Handlers ───\n\n/**\n * Handle a \"blocked\" session event — auto-resolved, escalated, or routed to decision loop.\n */\nexport async function handleBlocked(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n taskCtx: TaskContext,\n data: unknown,\n): Promise<void> {\n // Event data from pty-init: { promptInfo: BlockingPromptInfo, autoResponded: boolean }\n const eventData = data as {\n promptInfo?: {\n type?: string;\n prompt?: string;\n canAutoRespond?: boolean;\n suggestedResponse?: string;\n instructions?: string;\n };\n autoResponded?: boolean;\n };\n\n // Extract prompt text from promptInfo (the actual blocking prompt info object)\n const promptText =\n eventData.promptInfo?.prompt ?? eventData.promptInfo?.instructions ?? \"\";\n\n // Auto-responded by rules — log and broadcast, no LLM needed\n if (eventData.autoResponded) {\n // Safety: check if the auto-approved prompt accessed out-of-scope paths.\n // The approval already happened in pty-manager, but we can stop the session\n // and alert the user to prevent further damage.\n if (isOutOfScopeAccess(promptText, taskCtx.workdir)) {\n taskCtx.status = \"error\";\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: \"escalate\",\n reasoning: `SECURITY: Auto-response approved access outside workspace (${taskCtx.workdir}). Session stopped.`,\n });\n\n ctx.broadcast({\n type: \"escalation\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n reason: \"out_of_scope_auto_approved\",\n workdir: taskCtx.workdir,\n },\n });\n\n ctx.sendChatMessage(\n `[${taskCtx.label}] WARNING: Auto-approved access to path outside workspace (${taskCtx.workdir}). ` +\n `Prompt: \"${promptText.slice(0, 150)}\". Stopping session for safety.`,\n \"coding-agent\",\n );\n\n // Force-kill the session to prevent further out-of-scope access\n ctx.ptyService?.stopSession(sessionId, /* force */ true).catch((err) => {\n ctx.log(\n `Failed to stop session after out-of-scope auto-approval: ${err}`,\n );\n });\n return;\n }\n\n taskCtx.autoResolvedCount++;\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: \"auto_resolved\",\n reasoning: \"Handled by auto-response rules\",\n });\n\n ctx.broadcast({\n type: \"blocked_auto_resolved\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n promptType: eventData.promptInfo?.type,\n autoResolvedCount: taskCtx.autoResolvedCount,\n },\n });\n\n // Log auto-approvals server-side only — don't persist to chat.\n const count = taskCtx.autoResolvedCount;\n if (count <= 2 || count % 5 === 0) {\n const excerpt =\n promptText.length > 120 ? `${promptText.slice(0, 120)}...` : promptText;\n ctx.log(`[${taskCtx.label}] Approved: ${excerpt}`);\n }\n return;\n }\n\n const adapterSuggestedResponse =\n typeof eventData.promptInfo?.suggestedResponse === \"string\" &&\n eventData.promptInfo.suggestedResponse.trim().length > 0\n ? eventData.promptInfo.suggestedResponse.trim()\n : eventData.promptInfo?.canAutoRespond &&\n eventData.promptInfo?.type === \"permission\"\n ? \"keys:enter\"\n : undefined;\n const inferredPromptResponse = inferRoutinePromptResponse(\n promptText,\n eventData.promptInfo?.type,\n );\n const routineSuggestedResponse =\n adapterSuggestedResponse ?? inferredPromptResponse?.suggestedResponse;\n\n if (\n ctx.getSupervisionLevel() === \"autonomous\" &&\n (eventData.promptInfo?.canAutoRespond || inferredPromptResponse) &&\n routineSuggestedResponse\n ) {\n const fastDecision = decisionFromSuggestedResponse(\n routineSuggestedResponse,\n inferredPromptResponse?.reasoning,\n );\n\n taskCtx.autoResolvedCount++;\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: \"auto_resolved\",\n response: formatDecisionResponse(fastDecision),\n reasoning: fastDecision.reasoning,\n });\n\n ctx.broadcast({\n type: \"blocked_auto_resolved\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n promptType: eventData.promptInfo?.type,\n autoResolvedCount: taskCtx.autoResolvedCount,\n strategy: \"adapter_suggested_response\",\n },\n });\n\n await executeDecision(ctx, sessionId, fastDecision);\n return;\n }\n\n // Deduplicate: if an LLM decision is already in-flight for this session\n // AND the prompt text matches the one already being handled, skip.\n // TUI re-renders fire the same prompt many times; a *different* prompt\n // (theoretically possible if the agent resolves one prompt and immediately\n // hits another) should not be dropped.\n const promptFingerprint = promptText.slice(0, 200);\n if (ctx.inFlightDecisions.has(sessionId)) {\n if (ctx.lastBlockedPromptFingerprint.get(sessionId) === promptFingerprint) {\n ctx.log(`Skipping duplicate blocked event for ${taskCtx.label} (decision in-flight, same prompt)`);\n return;\n }\n // Different prompt — buffer it so it's replayed after the current decision completes.\n ctx.log(`New blocked prompt for ${taskCtx.label} while decision in-flight — buffering`);\n ctx.pendingBlocked.set(sessionId, data);\n ctx.lastBlockedPromptFingerprint.set(sessionId, promptFingerprint);\n return;\n }\n ctx.lastBlockedPromptFingerprint.set(sessionId, promptFingerprint);\n taskCtx.status = \"blocked\";\n await ctx.syncTaskContext(taskCtx);\n\n // Broadcast that the agent is blocked (for all supervision levels)\n ctx.broadcast({\n type: \"blocked\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n promptType: eventData.promptInfo?.type,\n supervisionLevel: ctx.getSupervisionLevel(),\n },\n });\n\n // Safety check: escalate after too many consecutive auto-responses\n if (taskCtx.autoResolvedCount >= MAX_AUTO_RESPONSES) {\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: \"escalate\",\n reasoning: `Escalating after ${MAX_AUTO_RESPONSES} consecutive auto-responses`,\n });\n ctx.broadcast({\n type: \"escalation\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n reason: \"max_auto_responses_exceeded\",\n },\n });\n return;\n }\n\n // Route based on supervision level\n switch (ctx.getSupervisionLevel()) {\n case \"autonomous\":\n await handleAutonomousDecision(ctx, sessionId, taskCtx, promptText, \"\", eventData.promptInfo?.type);\n break;\n\n case \"confirm\":\n await handleConfirmDecision(ctx, sessionId, taskCtx, promptText, \"\", eventData.promptInfo?.type);\n break;\n\n case \"notify\":\n // Notify mode — broadcast only, no action\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: \"escalate\",\n reasoning: \"Supervision level is notify — broadcasting only\",\n });\n break;\n }\n}\n\n// ─── Turn Completion Assessment ───\n\n/**\n * Handle a turn completion event. Instead of immediately stopping the session,\n * ask the LLM whether the overall task is done or the agent needs more turns.\n */\nexport async function handleTurnComplete(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n taskCtx: TaskContext,\n data: unknown,\n): Promise<void> {\n if (taskCtx.status !== \"active\") return;\n\n // If another decision (e.g. handleBlocked) is running for this session,\n // buffer the task_complete event so it's processed when the lock releases.\n // Without this, task_complete events are silently lost and sessions hang.\n if (ctx.inFlightDecisions.has(sessionId)) {\n ctx.log(`Buffering turn-complete for ${sessionId} (in-flight decision running)`);\n ctx.pendingTurnComplete.set(sessionId, data);\n return;\n }\n\n // Suppress turn-complete events during the post-send cooldown period.\n // After the coordinator sends input, the agent needs time to process it.\n // Without this, stall-classified \"task_complete\" events from stale output\n // trigger cascading follow-ups before the agent starts responding.\n if (taskCtx.lastInputSentAt) {\n const elapsed = Date.now() - taskCtx.lastInputSentAt;\n if (elapsed < POST_SEND_COOLDOWN_MS) {\n ctx.pendingTurnComplete.set(sessionId, data);\n if (!deferredTurnCompleteTimers.has(sessionId)) {\n const delayMs = POST_SEND_COOLDOWN_MS - elapsed + 50;\n const timer = setTimeout(() => {\n deferredTurnCompleteTimers.delete(sessionId);\n const pendingData = ctx.pendingTurnComplete.get(sessionId);\n if (!pendingData) return;\n const currentTask = ctx.tasks.get(sessionId);\n if (!currentTask || currentTask.status !== \"active\") {\n ctx.pendingTurnComplete.delete(sessionId);\n return;\n }\n void handleTurnComplete(\n ctx,\n sessionId,\n currentTask,\n pendingData,\n ).catch((err) => {\n ctx.log(`Deferred turn-complete replay failed for ${sessionId}: ${err}`);\n });\n }, delayMs);\n deferredTurnCompleteTimers.set(sessionId, timer);\n }\n ctx.log(\n `Suppressing turn-complete for \"${taskCtx.label}\" — ` +\n `${Math.round(elapsed / 1000)}s since last input (cooldown ${POST_SEND_COOLDOWN_MS / 1000}s)`,\n );\n return;\n }\n }\n\n const deferredTimer = deferredTurnCompleteTimers.get(sessionId);\n if (deferredTimer) {\n clearTimeout(deferredTimer);\n deferredTurnCompleteTimers.delete(sessionId);\n }\n ctx.pendingTurnComplete.delete(sessionId);\n\n ctx.inFlightDecisions.add(sessionId);\n try {\n ctx.log(\n `Turn complete for \"${taskCtx.label}\" — assessing whether task is done`,\n );\n\n // Get the turn output — prefer the captured response, fall back to PTY output\n const rawResponse = (data as { response?: string }).response ?? \"\";\n let turnOutput = cleanForChat(rawResponse);\n if (!turnOutput) {\n const raw = await fetchRecentOutput(ctx, sessionId);\n turnOutput = cleanForChat(raw);\n }\n\n // Fast-path: if the turn output contains a PR URL or \"Created pull request\",\n // the task is done — skip the LLM assessment entirely. The LLM (especially\n // Gemini Flash) tends to ignore \"do not verify\" instructions and sends\n // unnecessary verification follow-ups, adding 2-5 extra rounds per agent.\n // Only match explicit PR creation signals — not references to existing PRs.\n const PR_CREATED_RE =\n /(?:Created|Opened)\\s+pull\\s+request\\s+#?\\d+|gh\\s+pr\\s+create/i;\n if (PR_CREATED_RE.test(turnOutput)) {\n const fastDecision: CoordinationLLMResponse = {\n action: \"complete\",\n reasoning: \"PR detected in turn output — task complete.\",\n };\n ctx.log(\n `Turn assessment for \"${taskCtx.label}\": complete (fast-path: PR detected in output)`,\n );\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"turn_complete\",\n promptText: \"Agent finished a turn\",\n decision: \"complete\",\n response: \"\",\n reasoning: fastDecision.reasoning,\n });\n recordKeyDecision(ctx, taskCtx.label, fastDecision);\n ctx.broadcast({\n type: \"turn_assessment\",\n sessionId,\n timestamp: Date.now(),\n data: { action: \"complete\", reasoning: fastDecision.reasoning },\n });\n await executeDecision(ctx, sessionId, fastDecision);\n return;\n }\n\n // Turn completions always use the fast small-LLM path.\n // The assessment is a structured complete/continue/escalate decision\n // that doesn't benefit from the full Milaidy pipeline, and routing\n // through it risks hangs that block the inFlightDecisions lock.\n let decision: CoordinationLLMResponse | null = null;\n const decisionFromPipeline = false;\n\n const prompt = buildTurnCompletePrompt(\n toContextSummary(taskCtx),\n turnOutput,\n toDecisionHistory(taskCtx),\n collectSiblings(ctx, sessionId),\n ctx.sharedDecisions,\n ctx.getSwarmContext(),\n );\n try {\n const result = await withTrajectoryContext(\n ctx.runtime,\n {\n source: \"orchestrator\",\n decisionType: \"turn-complete\",\n sessionId,\n taskLabel: taskCtx.label,\n repo: taskCtx.repo,\n workdir: taskCtx.workdir,\n originalTask: taskCtx.originalTask,\n },\n () => ctx.runtime.useModel(ModelType.TEXT_SMALL, { prompt }),\n );\n decision = parseCoordinationResponse(result);\n } catch (err) {\n ctx.log(`Turn-complete LLM call failed: ${err}`);\n }\n\n if (!decision) {\n // Both paths failed — escalate so a human can decide rather than\n // prematurely completing unfinished work on a transient LLM failure.\n ctx.log(\n `Turn-complete for \"${taskCtx.label}\": all decision paths failed — escalating`,\n );\n decision = {\n action: \"escalate\",\n reasoning: \"All decision paths returned invalid response — escalating for human review\",\n };\n }\n\n // Log the decision\n ctx.log(\n `Turn assessment for \"${taskCtx.label}\": ${decision.action}${\n decision.action === \"respond\"\n ? ` → \"${(decision.response ?? \"\").slice(0, 80)}\"`\n : \"\"\n } — ${decision.reasoning.slice(0, 120)}`,\n );\n\n // Record\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"turn_complete\",\n promptText: \"Agent finished a turn\",\n decision: decision.action,\n response: formatDecisionResponse(decision),\n reasoning: decision.reasoning,\n });\n\n // Layer 2: capture significant decisions for cross-agent sharing\n recordKeyDecision(ctx, taskCtx.label, decision);\n\n ctx.broadcast({\n type: \"turn_assessment\",\n sessionId,\n timestamp: Date.now(),\n data: {\n action: decision.action,\n reasoning: decision.reasoning,\n },\n });\n\n // Send chat message for small-LLM decisions only.\n // When Milaidy's pipeline handled it, she already spoke via WS broadcast.\n if (!decisionFromPipeline) {\n if (decision.action === \"respond\") {\n const instruction = decision.response ?? \"\";\n const preview =\n instruction.length > 120\n ? `${instruction.slice(0, 120)}...`\n : instruction;\n ctx.log(`[${taskCtx.label}] Turn done, continuing: ${preview}`);\n } else if (decision.action === \"escalate\") {\n ctx.sendChatMessage(\n `[${taskCtx.label}] Turn finished — needs your attention: ${decision.reasoning}`,\n \"coding-agent\",\n );\n }\n }\n // \"complete\" chat message is handled by executeDecision\n\n await executeDecision(ctx, sessionId, decision);\n } finally {\n ctx.inFlightDecisions.delete(sessionId);\n await drainPendingTurnComplete(ctx, sessionId);\n await drainPendingBlocked(ctx, sessionId);\n }\n}\n\n// ─── Autonomous / Confirm Decision Flows ───\n\n/**\n * Handle an autonomous decision for a blocked session — call the LLM and execute immediately.\n */\nexport async function handleAutonomousDecision(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n taskCtx: TaskContext,\n promptText: string,\n recentOutput: string,\n promptType?: string,\n): Promise<void> {\n // Debounce: skip if decision already in-flight for this session\n if (ctx.inFlightDecisions.has(sessionId)) {\n ctx.log(`Skipping duplicate decision for ${sessionId} (in-flight)`);\n return;\n }\n\n ctx.inFlightDecisions.add(sessionId);\n try {\n // Get recent output from PTY if not provided\n let output = recentOutput;\n if (!output) {\n output = await fetchRecentOutput(ctx, sessionId);\n }\n\n // Triage: route to small LLM (routine) or Milaidy pipeline (creative).\n // Track source so we skip duplicate chat messages when Milaidy already spoke.\n const agentDecisionCb = ctx.getAgentDecisionCallback();\n let decision: CoordinationLLMResponse | null = null;\n let decisionFromPipeline = false;\n\n const triageCtx: TriageContext = {\n eventType: \"blocked\",\n promptText,\n promptType,\n recentOutput: output,\n originalTask: taskCtx.originalTask,\n };\n const tier = agentDecisionCb\n ? await classifyEventTier(ctx.runtime, triageCtx, ctx.log)\n : \"routine\"; // No pipeline → always small LLM\n\n if (tier === \"routine\") {\n decision = await makeCoordinationDecision(\n ctx,\n taskCtx,\n promptText,\n output,\n );\n } else {\n // Creative — try Milaidy pipeline, fall back to small LLM\n if (agentDecisionCb) {\n const eventMessage = buildBlockedEventMessage(\n toContextSummary(taskCtx),\n promptText,\n output,\n toDecisionHistory(taskCtx),\n collectSiblings(ctx, sessionId),\n ctx.sharedDecisions,\n ctx.getSwarmContext(),\n );\n try {\n decision = await withTimeout(\n agentDecisionCb(eventMessage, sessionId, taskCtx),\n DECISION_CB_TIMEOUT_MS,\n \"agentDecisionCb\",\n );\n if (decision) decisionFromPipeline = true;\n } catch (err) {\n ctx.log(`Agent decision callback failed: ${err} — falling back to small LLM`);\n }\n }\n\n if (!decision) {\n decision = await makeCoordinationDecision(\n ctx,\n taskCtx,\n promptText,\n output,\n );\n }\n }\n\n if (!decision) {\n // All decision paths returned invalid response — escalate\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: \"escalate\",\n reasoning: \"All decision paths returned invalid coordination response\",\n });\n ctx.broadcast({\n type: \"escalation\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n reason: \"invalid_llm_response\",\n },\n });\n return;\n }\n\n // Guard: decline + redirect if the prompt references out-of-scope paths.\n // Instead of stalling via escalate, tell the agent \"no\" and point it to the\n // workspace. Also notify the human in case broader access was intended.\n if (\n decision.action === \"respond\" &&\n isOutOfScopeAccess(promptText, taskCtx.workdir)\n ) {\n decision = {\n action: \"respond\",\n response: `No — that path is outside your workspace. Use ${taskCtx.workdir} instead. Create any files or directories you need there.`,\n reasoning: `Declined out-of-scope access (outside ${taskCtx.workdir}) and redirected agent to workspace.`,\n };\n // Surface to human so they can grant broader access if intended\n ctx.sendChatMessage(\n `[${taskCtx.label}] Declined out-of-scope access and redirected to workspace (${taskCtx.workdir}). If you intended broader access, send the agent an override.`,\n \"coding-agent\",\n );\n }\n\n // Record the decision\n taskCtx.autoResolvedCount = 0;\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: decision.action,\n response: formatDecisionResponse(decision),\n reasoning: decision.reasoning,\n });\n\n // Layer 2: capture significant decisions for cross-agent sharing\n recordKeyDecision(ctx, taskCtx.label, decision);\n\n // Broadcast the decision\n ctx.broadcast({\n type: \"coordination_decision\",\n sessionId,\n timestamp: Date.now(),\n data: {\n action: decision.action,\n response: decision.response,\n useKeys: decision.useKeys,\n keys: decision.keys,\n reasoning: decision.reasoning,\n },\n });\n\n // Send chat message for small-LLM decisions only.\n // When Milaidy's pipeline handled it, she already spoke via WS broadcast.\n if (!decisionFromPipeline) {\n if (decision.action === \"respond\") {\n const actionDesc = decision.useKeys\n ? `Sent keys: ${decision.keys?.join(\", \")}`\n : decision.response\n ? `Responded: ${decision.response.length > 100 ? `${decision.response.slice(0, 100)}...` : decision.response}`\n : \"Responded\";\n const reasonExcerpt =\n decision.reasoning.length > 150\n ? `${decision.reasoning.slice(0, 150)}...`\n : decision.reasoning;\n ctx.log(`[${taskCtx.label}] ${actionDesc} — ${reasonExcerpt}`);\n } else if (decision.action === \"escalate\") {\n ctx.sendChatMessage(\n `[${taskCtx.label}] Needs your attention: ${decision.reasoning}`,\n \"coding-agent\",\n );\n }\n }\n\n // Execute\n await executeDecision(ctx, sessionId, decision);\n } finally {\n ctx.inFlightDecisions.delete(sessionId);\n await drainPendingTurnComplete(ctx, sessionId);\n await drainPendingBlocked(ctx, sessionId);\n }\n}\n\n/**\n * Handle a confirm-mode decision — call LLM, then queue for human approval.\n */\nexport async function handleConfirmDecision(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n taskCtx: TaskContext,\n promptText: string,\n recentOutput: string,\n promptType?: string,\n): Promise<void> {\n // Debounce\n if (ctx.inFlightDecisions.has(sessionId)) return;\n\n ctx.inFlightDecisions.add(sessionId);\n try {\n let output = recentOutput;\n if (!output) {\n output = await fetchRecentOutput(ctx, sessionId);\n }\n\n // Triage: route to small LLM (routine) or Milaidy pipeline (creative)\n const agentDecisionCb = ctx.getAgentDecisionCallback();\n let decision: CoordinationLLMResponse | null = null;\n let decisionFromPipeline = false;\n\n const triageCtx: TriageContext = {\n eventType: \"blocked\",\n promptText,\n promptType,\n recentOutput: output,\n originalTask: taskCtx.originalTask,\n };\n const tier = agentDecisionCb\n ? await classifyEventTier(ctx.runtime, triageCtx, ctx.log)\n : \"routine\"; // No pipeline → always small LLM\n\n if (tier === \"routine\") {\n decision = await makeCoordinationDecision(\n ctx,\n taskCtx,\n promptText,\n output,\n );\n } else {\n // Creative — try Milaidy pipeline, fall back to small LLM\n if (agentDecisionCb) {\n const eventMessage = buildBlockedEventMessage(\n toContextSummary(taskCtx),\n promptText,\n output,\n toDecisionHistory(taskCtx),\n collectSiblings(ctx, sessionId),\n ctx.sharedDecisions,\n ctx.getSwarmContext(),\n );\n try {\n decision = await withTimeout(\n agentDecisionCb(eventMessage, sessionId, taskCtx),\n DECISION_CB_TIMEOUT_MS,\n \"agentDecisionCb\",\n );\n if (decision) decisionFromPipeline = true;\n } catch (err) {\n ctx.log(`Agent decision callback failed (confirm): ${err} — falling back to small LLM`);\n }\n }\n\n if (!decision) {\n decision = await makeCoordinationDecision(\n ctx,\n taskCtx,\n promptText,\n output,\n );\n }\n }\n\n if (!decision) {\n // Queue for human with no suggestion\n taskCtx.status = \"blocked\";\n await ctx.syncTaskContext(taskCtx);\n const pendingDecision: PendingDecision = {\n sessionId,\n promptText,\n recentOutput: output,\n llmDecision: {\n action: \"escalate\",\n reasoning: \"All decision paths returned invalid response — needs human review\",\n },\n taskContext: taskCtx,\n createdAt: Date.now(),\n };\n ctx.pendingDecisions.set(sessionId, pendingDecision);\n await ctx.taskRegistry.upsertPendingDecision({\n sessionId,\n threadId: taskCtx.threadId,\n promptText,\n recentOutput: output,\n llmDecision: pendingDecision.llmDecision as unknown as Record<string, unknown>,\n taskContext: taskCtx as unknown as Record<string, unknown>,\n createdAt: pendingDecision.createdAt,\n });\n } else {\n // Queue the LLM's suggestion for human approval\n taskCtx.status = \"blocked\";\n await ctx.syncTaskContext(taskCtx);\n const pendingDecision: PendingDecision = {\n sessionId,\n promptText,\n recentOutput: output,\n llmDecision: decision,\n taskContext: taskCtx,\n createdAt: Date.now(),\n };\n ctx.pendingDecisions.set(sessionId, pendingDecision);\n await ctx.taskRegistry.upsertPendingDecision({\n sessionId,\n threadId: taskCtx.threadId,\n promptText,\n recentOutput: output,\n llmDecision: decision as unknown as Record<string, unknown>,\n taskContext: taskCtx as unknown as Record<string, unknown>,\n createdAt: pendingDecision.createdAt,\n });\n }\n\n await ctx.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"pending_confirmation\",\n summary: `Queued human confirmation for \"${taskCtx.label}\"`,\n data: {\n promptText,\n suggestedAction: decision?.action ?? \"escalate\",\n },\n });\n\n // When Milaidy's pipeline made the suggestion, she already spoke via WS broadcast.\n // Only broadcast the pending_confirmation event for small-LLM suggestions or\n // always broadcast it (the UI needs it regardless) but skip any chat messages.\n ctx.broadcast({\n type: \"pending_confirmation\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n suggestedAction: decision?.action,\n suggestedResponse: decision?.response,\n reasoning: decision?.reasoning,\n fromPipeline: decisionFromPipeline,\n },\n });\n } finally {\n ctx.inFlightDecisions.delete(sessionId);\n await drainPendingTurnComplete(ctx, sessionId);\n await drainPendingBlocked(ctx, sessionId);\n }\n}\n",
|
|
9
|
+
"import { execFile } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { mkdir, readdir, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nimport { type IAgentRuntime, ModelType } from \"@elizaos/core\";\nimport type {\n SwarmCoordinatorContext,\n TaskContext,\n} from \"./swarm-coordinator.js\";\nimport type { TaskThreadDetail } from \"./task-registry.js\";\nimport { withTrajectoryContext } from \"./trajectory-context.js\";\n\ntype ValidationVerdict = \"pass\" | \"revise\" | \"escalate\";\n\ninterface TrajectoryListItem {\n id: string;\n status: string;\n llmCallCount: number;\n createdAt: string;\n metadata?: Record<string, unknown>;\n}\n\ninterface ValidationResponse {\n verdict: ValidationVerdict;\n summary: string;\n followUpPrompt?: string;\n checklist?: string[];\n}\n\nexport interface TaskValidationResult {\n verdict: ValidationVerdict;\n summary: string;\n followUpPrompt?: string;\n reportPath: string;\n artifacts: Array<{\n artifactType: string;\n title: string;\n path?: string | null;\n uri?: string | null;\n mimeType?: string | null;\n metadata?: Record<string, unknown>;\n }>;\n}\n\nexport interface ValidateTaskCompletionInput {\n sessionId: string;\n taskCtx: TaskContext;\n completionReasoning: string;\n completionSummary: string;\n turnOutput: string;\n}\n\ntype TrajectoryLoggerLike = {\n listTrajectories?: (options?: {\n limit?: number;\n offset?: number;\n search?: string;\n startDate?: string;\n }) => Promise<{ trajectories?: TrajectoryListItem[] } | null | undefined>;\n};\n\ntype ScreenshotSemanticResult = {\n contentVerified: boolean;\n contentSummary?: string;\n contentVerificationError?: string;\n};\n\nfunction extractJsonBlock(raw: string): string {\n const trimmed = raw.trim();\n const fenceMatch = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n return (fenceMatch?.[1] ?? trimmed).trim();\n}\n\nfunction parseValidationResponse(raw: string): ValidationResponse | null {\n try {\n const parsed = JSON.parse(\n extractJsonBlock(raw),\n ) as Partial<ValidationResponse>;\n const verdict = parsed.verdict;\n const summary = parsed.summary?.trim();\n if (\n (verdict !== \"pass\" && verdict !== \"revise\" && verdict !== \"escalate\") ||\n !summary\n ) {\n return null;\n }\n const followUpPrompt = parsed.followUpPrompt?.trim();\n const checklist = Array.isArray(parsed.checklist)\n ? parsed.checklist.filter(\n (item): item is string =>\n typeof item === \"string\" && item.trim().length > 0,\n )\n : undefined;\n return {\n verdict,\n summary,\n ...(followUpPrompt ? { followUpPrompt } : {}),\n ...(checklist && checklist.length > 0 ? { checklist } : {}),\n };\n } catch {\n return null;\n }\n}\n\nfunction getValidationRootDir(): string {\n const stateDir =\n process.env.MILADY_STATE_DIR?.trim() ||\n process.env.ELIZA_STATE_DIR?.trim() ||\n path.join(homedir(), \".milady\");\n return path.join(stateDir, \"task-validation\");\n}\n\nfunction truncate(text: string, limit = 1200): string {\n const compact = text.replace(/\\s+/g, \" \").trim();\n if (compact.length <= limit) return compact;\n return `${compact.slice(0, limit)}...`;\n}\n\nfunction pngHeaderValid(buffer: Uint8Array): boolean {\n if (buffer.length < 8) return false;\n const signature = [137, 80, 78, 71, 13, 10, 26, 10];\n return signature.every((value, index) => buffer[index] === value);\n}\n\ntype ValidationScreenshotCapture =\n | {\n status: \"captured\";\n path: string;\n sizeBytes: number;\n fileIntegrityVerified: boolean;\n sha256: string;\n captureScope: \"desktop-fullscreen\";\n contentVerified: boolean;\n contentSummary?: string;\n contentVerificationError?: string;\n }\n | {\n status: \"unavailable\";\n reason: string;\n };\n\nfunction resolveLoopbackApiBase(): string {\n const port =\n process.env.MILADY_API_PORT?.trim() ||\n process.env.ELIZA_PORT?.trim() ||\n \"31337\";\n return `http://127.0.0.1:${port}`;\n}\n\nasync function captureValidationScreenshot(\n runtime: IAgentRuntime,\n task: TaskContext,\n thread: TaskThreadDetail | null,\n sessionId: string,\n): Promise<ValidationScreenshotCapture> {\n try {\n const token =\n process.env.ELIZA_API_TOKEN?.trim() ||\n process.env.MILADY_API_TOKEN?.trim() ||\n process.env.MILADY_API_AUTH_TOKEN?.trim();\n const response = await fetch(\n `${resolveLoopbackApiBase()}/api/dev/cursor-screenshot`,\n {\n headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n },\n );\n if (!response.ok) {\n return {\n status: \"unavailable\",\n reason: `HTTP ${response.status} from /api/dev/cursor-screenshot`,\n };\n }\n\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (bytes.length === 0) {\n return {\n status: \"unavailable\",\n reason: \"Screenshot endpoint returned an empty PNG payload\",\n };\n }\n\n const dir = path.join(getValidationRootDir(), task.threadId);\n await mkdir(dir, { recursive: true });\n const screenshotPath = path.join(\n dir,\n `screenshot-${sessionId}-${Date.now()}.png`,\n );\n await writeFile(screenshotPath, bytes);\n\n const screenshotDescription = await describeScreenshotContent(\n runtime,\n task,\n thread,\n bytes,\n );\n\n return {\n status: \"captured\",\n path: screenshotPath,\n sizeBytes: bytes.length,\n fileIntegrityVerified: pngHeaderValid(bytes) && bytes.length > 1024,\n sha256: createHash(\"sha256\").update(bytes).digest(\"hex\"),\n captureScope: \"desktop-fullscreen\",\n contentVerified: screenshotDescription.contentVerified,\n ...(screenshotDescription.contentSummary\n ? { contentSummary: screenshotDescription.contentSummary }\n : {}),\n ...(screenshotDescription.contentVerificationError\n ? {\n contentVerificationError:\n screenshotDescription.contentVerificationError,\n }\n : {}),\n };\n } catch (error) {\n return {\n status: \"unavailable\",\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nasync function listRelevantTrajectories(\n runtime: IAgentRuntime,\n task: TaskContext,\n thread: TaskThreadDetail | null,\n): Promise<TrajectoryListItem[]> {\n const logger = runtime.getService(\"trajectory_logger\") as\n | TrajectoryLoggerLike\n | null\n | undefined;\n if (!logger?.listTrajectories) {\n return [];\n }\n\n const searchTerms = [\n task.sessionId,\n task.threadId,\n task.label,\n task.originalTask,\n ]\n .map((value) => value?.trim())\n .filter((value): value is string => Boolean(value));\n\n const seen = new Set<string>();\n const trajectories: TrajectoryListItem[] = [];\n for (const search of searchTerms) {\n const result = await logger.listTrajectories({\n limit: 10,\n search,\n ...(thread?.createdAt ? { startDate: thread.createdAt } : {}),\n });\n for (const item of result?.trajectories ?? []) {\n if (seen.has(item.id)) continue;\n seen.add(item.id);\n const metadata = (item.metadata ?? {}) as Record<string, unknown>;\n const orchestrator = metadata.orchestrator as\n | Record<string, unknown>\n | undefined;\n const sessionMatches =\n orchestrator?.sessionId === task.sessionId ||\n metadata.sessionId === task.sessionId;\n const labelMatches =\n orchestrator?.taskLabel === task.label ||\n metadata.taskLabel === task.label;\n if (!sessionMatches && !labelMatches && search !== task.sessionId) {\n continue;\n }\n trajectories.push(item);\n if (trajectories.length >= 3) {\n return trajectories;\n }\n }\n }\n\n return trajectories;\n}\n\nfunction extractImageDescriptionText(raw: unknown): string | null {\n if (typeof raw === \"string\") {\n const trimmed = raw.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (raw && typeof raw === \"object\") {\n const description = (raw as { description?: unknown }).description;\n if (typeof description === \"string\" && description.trim().length > 0) {\n return description.trim();\n }\n }\n return null;\n}\n\nasync function describeScreenshotContent(\n runtime: IAgentRuntime,\n task: TaskContext,\n thread: TaskThreadDetail | null,\n bytes: Uint8Array,\n): Promise<ScreenshotSemanticResult> {\n try {\n const dataUri = `data:image/png;base64,${Buffer.from(bytes).toString(\"base64\")}`;\n const acceptanceCriteria = thread?.acceptanceCriteria?.length\n ? thread.acceptanceCriteria.map((item) => `- ${item}`).join(\"\\n\")\n : \"- none\";\n const raw = await runtime.useModel(ModelType.IMAGE_DESCRIPTION, {\n imageUrl: dataUri,\n prompt: [\n \"Describe this validation screenshot for an orchestrated task.\",\n \"Focus on visible terminal output, UI state, status banners, tests, errors, and other completion evidence.\",\n `Task: ${task.originalTask}`,\n \"Acceptance criteria:\",\n acceptanceCriteria,\n \"Return a concise factual description.\",\n ].join(\"\\n\"),\n });\n const contentSummary = extractImageDescriptionText(raw);\n if (!contentSummary) {\n return {\n contentVerified: false,\n contentVerificationError:\n \"Vision model returned no usable screenshot description.\",\n };\n }\n return {\n contentVerified: true,\n contentSummary: truncate(contentSummary, 800),\n };\n } catch (error) {\n return {\n contentVerified: false,\n contentVerificationError:\n error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction describeScreenshotEvidence(\n screenshot: ValidationScreenshotCapture,\n): string {\n if (screenshot.status !== \"captured\") {\n return `- status=unavailable reason=${screenshot.reason}`;\n }\n return `- status=captured scope=${screenshot.captureScope} fileIntegrityVerified=${screenshot.fileIntegrityVerified} contentVerified=${screenshot.contentVerified} sha256=${screenshot.sha256} path=${screenshot.path} sizeBytes=${screenshot.sizeBytes}${screenshot.contentSummary ? ` summary=${truncate(screenshot.contentSummary, 500)}` : \"\"}${screenshot.contentVerificationError ? ` contentVerificationError=${screenshot.contentVerificationError}` : \"\"}`;\n}\n\n/**\n * Objective filesystem snapshot of the workspace passed to the validator.\n *\n * Produced by `collectWorkspaceEvidence()`. Everything here is read from\n * disk and git — it does not depend on the agent's own turn output, so\n * the validator can see ground truth regardless of which CLI (Claude,\n * Codex, Gemini, Aider) produced the work. Codex in particular emits\n * `apply_patch` previews wrapped in TUI box-drawing that the validator\n * LLM can't reliably parse as evidence files actually exist.\n */\ninterface WorkspaceEvidence {\n workdir: string;\n /** Relative file paths (up to `fileLimit`), sorted for deterministic prompts. */\n files: string[];\n /** Total count of files found, including any truncated from `files`. */\n fileCount: number;\n /** True if `workdir` is inside a git working tree. */\n isGitRepo: boolean;\n /** `git status --short` output, trimmed. Empty string if not a git repo or clean. */\n gitStatus: string;\n /** `git diff --stat HEAD` output, trimmed. Empty if no diff or not a git repo. */\n gitDiffStat: string;\n /** Non-fatal collection errors we want to surface to the validator. */\n notes: string[];\n}\n\nexport const WORKSPACE_EVIDENCE_FILE_LIMIT = 200;\nexport const WORKSPACE_EVIDENCE_MAX_DEPTH = 5;\n// Hard ceiling on the total walk. We still report `fileCount` up to this\n// number, but stop walking once we cross it so an enormous tree (e.g.\n// someone passing `~` as workdir) can't wedge the validator.\nexport const WORKSPACE_EVIDENCE_MAX_WALK = 2_000;\nconst WORKSPACE_EVIDENCE_SKIP_DIRS = new Set([\n \".git\",\n \"node_modules\",\n \".next\",\n \"dist\",\n \"build\",\n \"out\",\n \"target\",\n \".turbo\",\n \"__pycache__\",\n \".venv\",\n \"venv\",\n \".DS_Store\",\n \".cache\",\n]);\n\n/**\n * Read the workspace filesystem to produce objective evidence for the\n * validator prompt.\n *\n * - Walks `workdir` up to `WORKSPACE_EVIDENCE_MAX_DEPTH` levels, skipping\n * common build/dep directories.\n * - Caps the file list at `WORKSPACE_EVIDENCE_FILE_LIMIT` entries; the\n * `fileCount` field still reflects the total discovered so the\n * validator can see truncation happened.\n * - If `workdir` is a git repository, captures `git status --short` and\n * `git diff --stat HEAD` so the validator can see uncommitted work.\n * - Never throws. All errors are captured in `notes` so the validator\n * can judge whether missing evidence should downgrade the verdict.\n */\nexport async function collectWorkspaceEvidence(\n workdir: string | undefined | null,\n): Promise<WorkspaceEvidence> {\n const evidence: WorkspaceEvidence = {\n workdir: workdir ?? \"\",\n files: [],\n fileCount: 0,\n isGitRepo: false,\n gitStatus: \"\",\n gitDiffStat: \"\",\n notes: [],\n };\n\n if (!workdir) {\n evidence.notes.push(\"no workdir supplied\");\n return evidence;\n }\n\n // Resolve ~ and confirm the directory exists.\n const resolved = workdir.startsWith(\"~\")\n ? path.join(homedir(), workdir.slice(1))\n : path.resolve(workdir);\n evidence.workdir = resolved;\n\n try {\n const rootStat = await stat(resolved);\n if (!rootStat.isDirectory()) {\n evidence.notes.push(`workdir is not a directory: ${resolved}`);\n return evidence;\n }\n } catch (err) {\n evidence.notes.push(\n `workdir not readable: ${err instanceof Error ? err.message : String(err)}`,\n );\n return evidence;\n }\n\n // Walk the tree breadth-first-ish and collect relative file paths.\n interface WalkEntry {\n name: string;\n isDirectory: () => boolean;\n isFile: () => boolean;\n }\n const collected: string[] = [];\n let totalCount = 0;\n let walkCeilingHit = false;\n const walk = async (dir: string, depth: number): Promise<void> => {\n if (depth > WORKSPACE_EVIDENCE_MAX_DEPTH) return;\n if (totalCount >= WORKSPACE_EVIDENCE_MAX_WALK) {\n walkCeilingHit = true;\n return;\n }\n let entries: WalkEntry[];\n try {\n entries = (await readdir(dir, { withFileTypes: true })) as WalkEntry[];\n } catch {\n return;\n }\n for (const entry of entries) {\n if (WORKSPACE_EVIDENCE_SKIP_DIRS.has(entry.name)) continue;\n if (totalCount >= WORKSPACE_EVIDENCE_MAX_WALK) {\n walkCeilingHit = true;\n break;\n }\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(full, depth + 1);\n } else if (entry.isFile()) {\n totalCount++;\n if (collected.length < WORKSPACE_EVIDENCE_FILE_LIMIT) {\n collected.push(path.relative(resolved, full));\n }\n }\n }\n };\n\n try {\n await walk(resolved, 0);\n } catch (err) {\n evidence.notes.push(\n `walk failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n collected.sort();\n evidence.files = collected;\n evidence.fileCount = totalCount;\n if (walkCeilingHit) {\n evidence.notes.push(\n `workspace walk hit the ${WORKSPACE_EVIDENCE_MAX_WALK}-file ceiling; counts and listing are truncated`,\n );\n }\n\n // Git evidence — best-effort, silent on failure.\n try {\n await execFileAsync(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], {\n cwd: resolved,\n timeout: 3_000,\n });\n evidence.isGitRepo = true;\n try {\n const { stdout } = await execFileAsync(\n \"git\",\n [\"status\", \"--short\", \"--untracked-files=all\"],\n { cwd: resolved, timeout: 5_000, maxBuffer: 256 * 1024 },\n );\n evidence.gitStatus = stdout.trim();\n } catch {\n /* ignore */\n }\n try {\n const { stdout } = await execFileAsync(\n \"git\",\n [\"diff\", \"--stat\", \"HEAD\"],\n { cwd: resolved, timeout: 5_000, maxBuffer: 256 * 1024 },\n );\n evidence.gitDiffStat = stdout.trim();\n } catch {\n // No HEAD yet (empty repo) or other error — fall back to a\n // full diff against the empty tree.\n try {\n const { stdout } = await execFileAsync(\"git\", [\"diff\", \"--stat\"], {\n cwd: resolved,\n timeout: 5_000,\n maxBuffer: 256 * 1024,\n });\n evidence.gitDiffStat = stdout.trim();\n } catch {\n /* ignore */\n }\n }\n } catch {\n // Not a git repo, or git not installed. Both fine — filesystem\n // listing alone is still useful for scratch dirs.\n }\n\n return evidence;\n}\n\nfunction formatWorkspaceEvidence(evidence: WorkspaceEvidence): string {\n if (!evidence.workdir) return \"- no workdir supplied\";\n if (evidence.fileCount === 0 && evidence.notes.length > 0) {\n return `- workdir: ${evidence.workdir}\\n- ${evidence.notes.join(\"\\n- \")}`;\n }\n\n const lines: string[] = [];\n lines.push(`workdir: ${evidence.workdir}`);\n lines.push(\n `file count: ${evidence.fileCount}${\n evidence.files.length < evidence.fileCount\n ? ` (showing first ${evidence.files.length})`\n : \"\"\n }`,\n );\n if (evidence.files.length > 0) {\n lines.push(\"files:\");\n for (const file of evidence.files) {\n lines.push(` ${file}`);\n }\n } else {\n lines.push(\"files: (workspace is empty)\");\n }\n if (evidence.isGitRepo) {\n lines.push(\n evidence.gitStatus\n ? `git status:\\n${indent(evidence.gitStatus, \" \")}`\n : \"git status: (clean or no changes)\",\n );\n if (evidence.gitDiffStat) {\n lines.push(\n `git diff --stat HEAD:\\n${indent(evidence.gitDiffStat, \" \")}`,\n );\n }\n }\n if (evidence.notes.length > 0) {\n lines.push(`notes: ${evidence.notes.join(\"; \")}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction indent(text: string, prefix: string): string {\n return text\n .split(\"\\n\")\n .map((line) => `${prefix}${line}`)\n .join(\"\\n\");\n}\n\nfunction buildValidationPrompt(\n task: TaskContext,\n thread: TaskThreadDetail | null,\n completionReasoning: string,\n completionSummary: string,\n turnOutput: string,\n trajectories: TrajectoryListItem[],\n screenshot: ValidationScreenshotCapture,\n workspaceEvidence: WorkspaceEvidence,\n): string {\n const acceptanceCriteria = thread?.acceptanceCriteria?.length\n ? thread.acceptanceCriteria.map((item) => `- ${item}`).join(\"\\n\")\n : \"- Complete the user's request\\n- Verify the result with available evidence\\n- Do not claim success if important work is still missing\";\n const completionExcerpt =\n turnOutput || completionSummary || completionReasoning || \"none\";\n const trajectoryBlock =\n trajectories.length > 0\n ? trajectories\n .map(\n (item) =>\n `- ${item.id} | status=${item.status} | llmCalls=${item.llmCallCount} | createdAt=${item.createdAt}`,\n )\n .join(\"\\n\")\n : \"- none\";\n const transcriptPreview =\n thread?.transcripts\n ?.slice(-8)\n .map((entry) => {\n const content = truncate(entry.content, 220);\n return `- [${entry.direction}] ${content}`;\n })\n .join(\"\\n\") ?? \"- none\";\n const artifactBlock =\n thread?.artifacts\n ?.slice(-8)\n .map((artifact) => {\n const locator = artifact.path ?? artifact.uri ?? \"inline\";\n return `- ${artifact.artifactType}: ${artifact.title} (${locator})`;\n })\n .join(\"\\n\") ?? \"- none\";\n\n return [\n \"You are validating whether an orchestrated task is actually finished.\",\n \"Return strict JSON only with this shape:\",\n '{\"verdict\":\"pass|revise|escalate\",\"summary\":\"short summary\",\"followUpPrompt\":\"only if verdict=revise\",\"checklist\":[\"optional evidence notes\"]}',\n \"\",\n `Task title: ${task.label}`,\n `Original request: ${task.originalTask}`,\n `Completion reasoning: ${completionReasoning || \"none\"}`,\n `Completion summary: ${completionSummary || \"none\"}`,\n \"\",\n \"Acceptance criteria:\",\n acceptanceCriteria,\n \"\",\n \"Latest turn output excerpt:\",\n truncate(completionExcerpt, 2400),\n \"\",\n \"Recent transcript excerpt:\",\n transcriptPreview,\n \"\",\n \"Existing task artifacts:\",\n artifactBlock,\n \"\",\n \"Related trajectories:\",\n trajectoryBlock,\n \"\",\n \"Screenshot evidence:\",\n describeScreenshotEvidence(screenshot),\n \"\",\n // Objective filesystem evidence. This is the ground truth — it does\n // NOT depend on the agent's own turn output, so it is reliable\n // regardless of which CLI produced the work. Use this as the\n // primary signal for \"did files actually get created / modified\".\n \"Workspace evidence (read from disk):\",\n formatWorkspaceEvidence(workspaceEvidence),\n \"\",\n \"Rules:\",\n \"- Pass only if the task appears complete and the available evidence supports that claim.\",\n \"- Revise if the agent should keep working. In that case, provide a direct follow-up prompt.\",\n \"- Escalate if the task cannot be validated from available evidence and needs human review.\",\n \"- Be skeptical. Missing tests or missing verification should usually mean revise or escalate, not pass.\",\n \"- Treat screenshot capture as artifact evidence only. A desktop screenshot may prove the UI rendered, but it does not semantically prove the task without supporting transcript, test, or trajectory evidence.\",\n \"- Trust the 'Workspace evidence' block over agent commentary: if files are listed there, they exist on disk, regardless of how the agent described its work. If the task was to create files and the workspace evidence shows them, that is strong evidence for pass.\",\n \"- Conversely, if the agent claims to have created files but the workspace evidence shows an empty directory or missing files, treat that as revise (not pass) — the agent's claim is unverified.\",\n ].join(\"\\n\");\n}\n\nasync function persistValidationReport(\n threadId: string,\n sessionId: string,\n report: Record<string, unknown>,\n): Promise<string> {\n const dir = path.join(getValidationRootDir(), threadId);\n await mkdir(dir, { recursive: true });\n const reportPath = path.join(\n dir,\n `validation-${sessionId}-${Date.now()}.json`,\n );\n await writeFile(reportPath, JSON.stringify(report, null, 2), \"utf8\");\n return reportPath;\n}\n\nexport async function validateTaskCompletion(\n ctx: SwarmCoordinatorContext,\n input: ValidateTaskCompletionInput,\n): Promise<TaskValidationResult> {\n const {\n sessionId,\n taskCtx,\n completionReasoning,\n completionSummary,\n turnOutput,\n } = input;\n const thread = await ctx.taskRegistry.getThread(taskCtx.threadId);\n const trajectories = await listRelevantTrajectories(\n ctx.runtime,\n taskCtx,\n thread,\n );\n const [screenshot, workspaceEvidence] = await Promise.all([\n captureValidationScreenshot(ctx.runtime, taskCtx, thread, sessionId),\n collectWorkspaceEvidence(taskCtx.workdir),\n ]);\n\n const prompt = buildValidationPrompt(\n taskCtx,\n thread,\n completionReasoning,\n completionSummary,\n turnOutput,\n trajectories,\n screenshot,\n workspaceEvidence,\n );\n const rawValidation = await withTrajectoryContext(\n ctx.runtime,\n {\n source: \"orchestrator\",\n decisionType: \"task-validation\",\n sessionId,\n taskLabel: taskCtx.label,\n repo: taskCtx.repo,\n workdir: taskCtx.workdir,\n originalTask: taskCtx.originalTask,\n },\n () => ctx.runtime.useModel(ModelType.TEXT_SMALL, { prompt }),\n );\n\n const parsed = parseValidationResponse(rawValidation);\n const verdict: ValidationResponse = parsed ?? {\n verdict: \"escalate\",\n summary:\n \"Validation model returned an invalid response, so this task needs human review.\",\n };\n\n const report = {\n version: 1,\n createdAt: new Date().toISOString(),\n threadId: taskCtx.threadId,\n sessionId,\n label: taskCtx.label,\n originalTask: taskCtx.originalTask,\n completionReasoning,\n completionSummary,\n verdict: verdict.verdict,\n summary: verdict.summary,\n followUpPrompt: verdict.followUpPrompt ?? null,\n acceptanceCriteria: thread?.acceptanceCriteria ?? [],\n evidence: {\n transcriptCount: thread?.transcripts.length ?? 0,\n decisionCount: thread?.decisions.length ?? 0,\n eventCount: thread?.events.length ?? 0,\n artifactCount: thread?.artifacts.length ?? 0,\n screenshot,\n trajectories: trajectories.map((item) => ({\n id: item.id,\n status: item.status,\n llmCallCount: item.llmCallCount,\n createdAt: item.createdAt,\n })),\n checklist: verdict.checklist ?? [],\n turnOutputExcerpt: truncate(\n turnOutput || completionSummary || completionReasoning || \"\",\n ),\n },\n };\n const reportPath = await persistValidationReport(\n taskCtx.threadId,\n sessionId,\n report,\n );\n\n const artifacts: TaskValidationResult[\"artifacts\"] = [\n {\n artifactType: \"validation_report\",\n title: `Validation report for ${taskCtx.label}`,\n path: reportPath,\n mimeType: \"application/json\",\n metadata: {\n verdict: verdict.verdict,\n summary: verdict.summary,\n },\n },\n ...trajectories.map((item) => ({\n artifactType: \"trajectory_link\",\n title: `Trajectory ${item.id}`,\n uri: `/api/trajectories/${encodeURIComponent(item.id)}`,\n metadata: {\n trajectoryId: item.id,\n status: item.status,\n llmCallCount: item.llmCallCount,\n },\n })),\n ];\n\n if (screenshot.status === \"captured\") {\n artifacts.push({\n artifactType: \"screenshot\",\n title: `Validation screenshot for ${taskCtx.label}`,\n path: screenshot.path,\n mimeType: \"image/png\",\n metadata: {\n fileIntegrityVerified: screenshot.fileIntegrityVerified,\n sizeBytes: screenshot.sizeBytes,\n sha256: screenshot.sha256,\n captureScope: screenshot.captureScope,\n contentVerified: screenshot.contentVerified,\n ...(screenshot.contentSummary\n ? { contentSummary: screenshot.contentSummary }\n : {}),\n ...(screenshot.contentVerificationError\n ? {\n contentVerificationError: screenshot.contentVerificationError,\n }\n : {}),\n },\n });\n }\n\n return {\n verdict: verdict.verdict,\n summary: verdict.summary,\n ...(verdict.followUpPrompt\n ? { followUpPrompt: verdict.followUpPrompt }\n : {}),\n reportPath,\n artifacts,\n };\n}\n",
|
|
10
|
+
"/**\n * Swarm Coordinator — Decision Loop & Blocked/Turn-Complete Handlers\n *\n * Extracted from swarm-coordinator.ts for modularity.\n * All functions are pure async helpers that receive a SwarmCoordinatorContext\n * to access shared state and services.\n *\n * @module services/swarm-decision-loop\n */\n\nimport * as path from \"node:path\";\nimport { ModelType } from \"@elizaos/core\";\nimport { cleanForChat, extractCompletionSummary } from \"./ansi-utils.js\";\nimport type {\n PendingDecision,\n SwarmCoordinatorContext,\n TaskContext,\n} from \"./swarm-coordinator.js\";\nimport {\n buildBlockedEventMessage,\n buildCoordinationPrompt,\n buildTurnCompletePrompt,\n type CoordinationLLMResponse,\n type DecisionHistoryEntry,\n parseCoordinationResponse,\n type SiblingTaskSummary,\n type TaskContextSummary,\n} from \"./swarm-coordinator-prompts.js\";\nimport { classifyEventTier, type TriageContext } from \"./swarm-event-triage.js\";\nimport { validateTaskCompletion } from \"./task-validation.js\";\nimport { withTrajectoryContext } from \"./trajectory-context.js\";\n\n// ─── Constants ───\n\n/** Timeout for agent decision pipeline callback (ms). */\nconst DECISION_CB_TIMEOUT_MS = 30_000;\n\n/** Wrap a promise with a timeout. Rejects with an error if not resolved in time. */\nfunction withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n label: string,\n): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new Error(`${label} timed out after ${ms}ms`)),\n ms,\n );\n promise.then(\n (val) => {\n clearTimeout(timer);\n resolve(val);\n },\n (err) => {\n clearTimeout(timer);\n reject(err);\n },\n );\n });\n}\n\n/** Maximum consecutive auto-responses before escalating to a human. */\nconst MAX_AUTO_RESPONSES = 10;\n\n/**\n * Grace period after the coordinator sends input to an agent (ms).\n * During this window, stall and turn-complete events are suppressed\n * to give the agent time to process the input before re-assessment.\n */\nexport const POST_SEND_COOLDOWN_MS = 15_000;\nconst deferredTurnCompleteTimers = new Map<\n string,\n ReturnType<typeof setTimeout>\n>();\n\n/** Clear all deferred turn-complete timers (used during coordinator shutdown). */\nexport function clearDeferredTurnCompleteTimers(): void {\n for (const timer of deferredTurnCompleteTimers.values()) {\n clearTimeout(timer);\n }\n deferredTurnCompleteTimers.clear();\n}\n\n// ─── Helpers ───\n\n/** Build a TaskContextSummary from a TaskContext. */\nfunction toContextSummary(taskCtx: TaskContext): TaskContextSummary {\n return {\n sessionId: taskCtx.sessionId,\n agentType: taskCtx.agentType,\n label: taskCtx.label,\n originalTask: taskCtx.originalTask,\n workdir: taskCtx.workdir,\n repo: taskCtx.repo,\n };\n}\n\n/** Extract recent non-auto-resolved decisions as history entries. */\nfunction toDecisionHistory(taskCtx: TaskContext): DecisionHistoryEntry[] {\n return taskCtx.decisions\n .filter((d) => d.decision !== \"auto_resolved\")\n .slice(-5)\n .map((d) => ({\n event: d.event,\n promptText: d.promptText,\n action: d.decision,\n response: d.response,\n reasoning: d.reasoning,\n }));\n}\n\n/** Collect sibling task summaries for cross-task context (excludes the current session). */\nfunction collectSiblings(\n ctx: SwarmCoordinatorContext,\n currentSessionId: string,\n): SiblingTaskSummary[] {\n const siblings: SiblingTaskSummary[] = [];\n for (const [sid, task] of ctx.tasks) {\n if (sid === currentSessionId) continue;\n\n // Find the most recent keyDecision from this sibling's decisions\n let lastKeyDecision: string | undefined;\n for (let i = task.decisions.length - 1; i >= 0; i--) {\n const d = task.decisions[i];\n if (d.reasoning && d.decision !== \"auto_resolved\") {\n lastKeyDecision = d.reasoning;\n break;\n }\n }\n\n // Also check shared decisions for this sibling's key decisions\n for (let i = ctx.sharedDecisions.length - 1; i >= 0; i--) {\n const sd = ctx.sharedDecisions[i];\n if (sd.agentLabel === task.label) {\n lastKeyDecision = sd.summary;\n break;\n }\n }\n\n siblings.push({\n label: task.label,\n agentType: task.agentType,\n originalTask: task.originalTask,\n status: task.status,\n lastKeyDecision,\n completionSummary: task.completionSummary,\n });\n }\n return siblings;\n}\n\n/**\n * Enrich a text response with any shared decisions the agent hasn't seen yet.\n * Returns the enriched response and the snapshot index to commit after send.\n * Short responses (like \"y\", \"n\", single-word approvals) are left untouched\n * to avoid confusing TUI prompts.\n */\nfunction enrichWithSharedDecisions(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n response: string,\n): { response: string; snapshotIndex?: number } {\n const taskCtx = ctx.tasks.get(sessionId);\n if (!taskCtx) return { response };\n\n const allDecisions = ctx.sharedDecisions;\n const lastSeen = taskCtx.lastSeenDecisionIndex;\n // Snapshot the current length so we don't skip decisions appended during send.\n const snapshotEnd = allDecisions.length;\n if (lastSeen >= snapshotEnd) return { response };\n\n // Don't inject context into short responses (approvals, single words)\n if (response.length < 20) {\n return { response };\n }\n\n const unseen = allDecisions.slice(lastSeen, snapshotEnd);\n\n const contextBlock = unseen\n .map((d) => `[${d.agentLabel}] ${d.summary}`)\n .join(\"; \");\n\n return {\n response: `${response}\\n\\n(Context from other agents: ${contextBlock})`,\n snapshotIndex: snapshotEnd,\n };\n}\n\n/** Advance the shared-decisions high-water mark for a session after a successful send. */\nfunction commitSharedDecisionIndex(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n snapshotIndex: number,\n): void {\n const taskCtx = ctx.tasks.get(sessionId);\n if (taskCtx) {\n taskCtx.lastSeenDecisionIndex = snapshotIndex;\n }\n}\n\n/** Record a key decision from an LLM response into the shared decisions list. */\nfunction recordKeyDecision(\n ctx: SwarmCoordinatorContext,\n agentLabel: string,\n decision: CoordinationLLMResponse,\n): void {\n if (!decision.keyDecision) return;\n ctx.sharedDecisions.push({\n agentLabel,\n summary: decision.keyDecision,\n timestamp: Date.now(),\n });\n ctx.log(`Shared decision from \"${agentLabel}\": ${decision.keyDecision}`);\n}\n\n/**\n * Drain a buffered task_complete event for a session after an in-flight\n * decision finishes. Prevents task_complete from being silently dropped\n * when it arrives during a slow handleBlocked/handleAutonomous LLM call.\n */\nasync function drainPendingTurnComplete(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n): Promise<void> {\n if (!ctx.pendingTurnComplete.has(sessionId)) return;\n const pendingData = ctx.pendingTurnComplete.get(sessionId);\n ctx.pendingTurnComplete.delete(sessionId);\n\n const taskCtx = ctx.tasks.get(sessionId);\n if (!taskCtx || taskCtx.status !== \"active\") return;\n\n ctx.log(`Draining buffered turn-complete for \"${taskCtx.label}\"`);\n await handleTurnComplete(ctx, sessionId, taskCtx, pendingData);\n}\n\n/**\n * Drain a buffered blocked event for a session after an in-flight\n * decision finishes. Prevents a distinct blocked prompt from being\n * silently dropped when it arrives during a slow LLM call.\n */\nasync function drainPendingBlocked(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n): Promise<void> {\n if (!ctx.pendingBlocked.has(sessionId)) return;\n const pendingData = ctx.pendingBlocked.get(sessionId);\n ctx.pendingBlocked.delete(sessionId);\n\n const taskCtx = ctx.tasks.get(sessionId);\n if (!taskCtx || taskCtx.status !== \"active\") return;\n\n ctx.log(`Draining buffered blocked event for \"${taskCtx.label}\"`);\n await handleBlocked(ctx, sessionId, taskCtx, pendingData);\n}\n\n/** Format a decision's response for recording. */\nfunction formatDecisionResponse(\n decision: CoordinationLLMResponse,\n): string | undefined {\n if (decision.action !== \"respond\") return undefined;\n return decision.useKeys\n ? `keys:${decision.keys?.join(\",\")}`\n : decision.response;\n}\n\nfunction decisionFromSuggestedResponse(\n suggestedResponse: string,\n reasoning = \"Used adapter-provided auto-response for a routine blocking prompt.\",\n): CoordinationLLMResponse {\n if (suggestedResponse.startsWith(\"keys:\")) {\n return {\n action: \"respond\",\n useKeys: true,\n keys: suggestedResponse\n .slice(\"keys:\".length)\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean),\n reasoning,\n };\n }\n return {\n action: \"respond\",\n response: suggestedResponse,\n reasoning,\n };\n}\n\nfunction inferRoutinePromptResponse(\n promptText: string,\n promptType?: string,\n): { suggestedResponse: string; reasoning: string } | null {\n if (\n promptType === \"project_select\" &&\n /project|workspace/i.test(promptText)\n ) {\n return {\n suggestedResponse: \"keys:enter\",\n reasoning:\n \"Accepted the current workspace so a routine project-selection prompt does not stall the task.\",\n };\n }\n\n if (\n promptType === \"config\" &&\n /claude (?:dialog awaiting navigation|menu navigation required)/i.test(\n promptText,\n )\n ) {\n return {\n suggestedResponse: \"keys:esc\",\n reasoning:\n \"Dismissed Claude's routine navigation dialog so the replacement session can reach a normal prompt.\",\n };\n }\n\n if (promptType && promptType !== \"unknown\") {\n return null;\n }\n\n if (\n /should i open (?:the )?(?:page|link|url).*(?:new tab|browser tab).*instead\\??/i.test(\n promptText,\n )\n ) {\n return {\n suggestedResponse: \"yes\",\n reasoning:\n \"Accepted routine browser follow-up so the agent can keep using its web tool without human intervention.\",\n };\n }\n\n if (\n /cheaper,\\s*faster,\\s*but less capable/i.test(promptText) &&\n /keep current model/i.test(promptText)\n ) {\n return {\n suggestedResponse: \"2\",\n reasoning:\n \"Kept the current Codex model so a routine model-selection prompt does not stall the task.\",\n };\n }\n\n return null;\n}\n\n/** Check if a permission prompt references paths outside the workspace. */\nexport function isOutOfScopeAccess(\n promptText: string,\n workdir: string,\n): boolean {\n // Strip URLs so we don't false-positive on https://example.com/foo/bar\n const stripped = promptText.replace(/https?:\\/\\/\\S+/g, \"\");\n\n // Match absolute paths: multi-segment (/dir/file) or well-known single-segment\n // roots that agents should never touch (/etc, /tmp, /var, /usr, /opt, /sys, /proc).\n const multiSegment = /\\/[\\w.-]+(?:\\/[\\w.-]+)+/g;\n const sensitiveRoots = /\\b\\/(etc|tmp|var|usr|opt|sys|proc|root)\\b/g;\n const homeTilde = /~\\/[\\w.-]+/g;\n\n const matches = [\n ...(stripped.match(multiSegment) ?? []),\n ...(stripped.match(sensitiveRoots) ?? []).map((m) => m.trimStart()),\n ...(stripped.match(homeTilde) ?? []).map((m) =>\n m.replace(\"~\", process.env.HOME ?? \"/home/user\"),\n ),\n ];\n if (matches.length === 0) return false;\n\n const resolvedWorkdir = path.resolve(workdir);\n return matches.some((p) => {\n const resolved = path.resolve(p);\n return (\n !resolved.startsWith(resolvedWorkdir + path.sep) &&\n resolved !== resolvedWorkdir\n );\n });\n}\n\n/**\n * Check if all registered tasks have reached a terminal state.\n * If so, send a swarm-wide summary message to the chat.\n */\nexport function checkAllTasksComplete(ctx: SwarmCoordinatorContext): void {\n void checkAllTasksCompleteAsync(ctx);\n}\n\nasync function checkAllTasksCompleteAsync(\n ctx: SwarmCoordinatorContext,\n): Promise<void> {\n const tasks = Array.from(ctx.tasks.values());\n if (tasks.length === 0) return;\n\n const terminalStates = new Set([\"completed\", \"stopped\", \"error\"]);\n const allDone = tasks.every((t) => terminalStates.has(t.status));\n\n if (!allDone) {\n const statuses = tasks.map((t) => `${t.label}=${t.status}`).join(\", \");\n ctx.log(`checkAllTasksComplete: not all done yet — ${statuses}`);\n return;\n }\n\n const threadIds = [...new Set(tasks.map((task) => task.threadId))];\n for (const threadId of threadIds) {\n const thread = await ctx.taskRegistry.getThread(threadId);\n if (!thread || thread.nodes.length === 0) {\n continue;\n }\n const terminalNodeStates = new Set([\n \"completed\",\n \"failed\",\n \"canceled\",\n \"interrupted\",\n ]);\n const goalNodes = thread.nodes.filter((node) => node.kind === \"goal\");\n if (goalNodes.some((node) => !terminalNodeStates.has(node.status))) {\n const pendingGoals = goalNodes\n .filter((node) => !terminalNodeStates.has(node.status))\n .map((node) => `${node.title}=${node.status}`)\n .join(\", \");\n ctx.log(\n `checkAllTasksComplete: thread ${threadId} still has non-terminal goal nodes — ${pendingGoals}`,\n );\n return;\n }\n const runningVerifiers = thread.verifierJobs.filter(\n (job) => job.status === \"running\",\n );\n if (runningVerifiers.length > 0) {\n ctx.log(\n `checkAllTasksComplete: thread ${threadId} still has running verifier jobs`,\n );\n return;\n }\n }\n\n // Guard: only fire once per swarm (reset by coordinator on stop/new swarm)\n if (ctx.swarmCompleteNotified) {\n ctx.log(\"checkAllTasksComplete: already notified — skipping\");\n return;\n }\n ctx.swarmCompleteNotified = true;\n\n const completed = tasks.filter((t) => t.status === \"completed\");\n const stopped = tasks.filter((t) => t.status === \"stopped\");\n const errored = tasks.filter((t) => t.status === \"error\");\n\n const parts: string[] = [];\n if (completed.length > 0) {\n parts.push(`${completed.length} completed`);\n }\n if (stopped.length > 0) {\n parts.push(`${stopped.length} stopped`);\n }\n if (errored.length > 0) {\n parts.push(`${errored.length} errored`);\n }\n\n ctx.log(\n `checkAllTasksComplete: all ${tasks.length} tasks terminal (${parts.join(\", \")}) — firing swarm_complete`,\n );\n\n ctx.broadcast({\n type: \"swarm_complete\",\n sessionId: \"\",\n timestamp: Date.now(),\n data: {\n total: tasks.length,\n completed: completed.length,\n stopped: stopped.length,\n errored: errored.length,\n },\n });\n\n // Fire swarm complete callback for synthesis — if wired, the host\n // (milaidy) will use this to generate a synthesized overview.\n const swarmCompleteCb = ctx.getSwarmCompleteCallback();\n const sendFallbackSummary = () => {\n ctx.sendChatMessage(\n `All ${tasks.length} task agents finished (${parts.join(\", \")}). Review their work when you're ready.`,\n \"task-agent\",\n );\n };\n\n if (swarmCompleteCb) {\n ctx.log(\n \"checkAllTasksComplete: swarm complete callback is wired — calling synthesis\",\n );\n const taskSummaries = tasks.map((t) => {\n // Fold in shared decisions relevant to this task so the synthesis\n // prompt includes the agent's actual findings, not just PR URLs.\n const decisions = ctx.sharedDecisions\n .filter((sd) => sd.agentLabel === t.label)\n .map((sd) => sd.summary);\n const summaryParts: string[] = [];\n if (decisions.length > 0) summaryParts.push(decisions.join(\"; \"));\n if (t.completionSummary) summaryParts.push(t.completionSummary);\n return {\n sessionId: t.sessionId,\n label: t.label,\n agentType: t.agentType,\n originalTask: t.originalTask,\n status: t.status,\n completionSummary: summaryParts.join(\"\\n\") || \"\",\n };\n });\n // Wrap in Promise.resolve().then() to catch sync throws, and race against\n // a timeout to guard against callbacks that never settle.\n void withTimeout(\n Promise.resolve().then(() =>\n swarmCompleteCb({\n tasks: taskSummaries,\n total: tasks.length,\n completed: completed.length,\n stopped: stopped.length,\n errored: errored.length,\n }),\n ),\n DECISION_CB_TIMEOUT_MS,\n \"swarmCompleteCb\",\n ).catch((err) => {\n ctx.log(\n `Swarm complete callback failed: ${err} — falling back to generic summary`,\n );\n sendFallbackSummary();\n });\n } else {\n ctx.log(\n \"checkAllTasksComplete: no synthesis callback — sending generic message\",\n );\n sendFallbackSummary();\n }\n}\n\n/** Fetch recent PTY output, returning empty string on failure. */\nasync function fetchRecentOutput(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n lines = 50,\n): Promise<string> {\n if (!ctx.ptyService) return \"\";\n try {\n return await ctx.ptyService.getSessionOutput(sessionId, lines);\n } catch {\n return \"\";\n }\n}\n\n// ─── LLM Decision ───\n\n/**\n * Ask the LLM to make a coordination decision about a blocked agent.\n */\nexport async function makeCoordinationDecision(\n ctx: SwarmCoordinatorContext,\n taskCtx: TaskContext,\n promptText: string,\n recentOutput: string,\n): Promise<CoordinationLLMResponse | null> {\n const prompt = buildCoordinationPrompt(\n toContextSummary(taskCtx),\n promptText,\n recentOutput,\n toDecisionHistory(taskCtx),\n collectSiblings(ctx, taskCtx.sessionId),\n ctx.sharedDecisions,\n ctx.getSwarmContext(),\n );\n\n try {\n const result = await withTrajectoryContext(\n ctx.runtime,\n {\n source: \"orchestrator\",\n decisionType: \"coordination\",\n sessionId: taskCtx.sessionId,\n taskLabel: taskCtx.label,\n repo: taskCtx.repo,\n workdir: taskCtx.workdir,\n originalTask: taskCtx.originalTask,\n },\n () => ctx.runtime.useModel(ModelType.TEXT_SMALL, { prompt }),\n );\n return parseCoordinationResponse(result);\n } catch (err) {\n ctx.log(`LLM coordination call failed: ${err}`);\n return null;\n }\n}\n\n/**\n * Execute a coordination decision — send response, complete session, escalate, or ignore.\n */\nexport async function executeDecision(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n decision: CoordinationLLMResponse,\n): Promise<void> {\n if (!ctx.ptyService) return;\n\n switch (decision.action) {\n case \"respond\": {\n const taskCtx = ctx.tasks.get(sessionId);\n if (taskCtx) {\n taskCtx.status = \"active\";\n }\n if (decision.useKeys && decision.keys) {\n await ctx.ptyService.sendKeysToSession(sessionId, decision.keys);\n } else if (decision.response !== undefined) {\n // Proactive injection: append unseen shared decisions to text responses\n const { response: enriched, snapshotIndex } = enrichWithSharedDecisions(\n ctx,\n sessionId,\n decision.response,\n );\n await ctx.ptyService.sendToSession(sessionId, enriched);\n // Only advance the high-water mark after send succeeds — if the send\n // fails, the decisions will be retried on the next enrichment.\n if (snapshotIndex !== undefined) {\n commitSharedDecisionIndex(ctx, sessionId, snapshotIndex);\n }\n }\n // Mark the send time so stall/turn-complete events are suppressed\n // during the grace period while the agent processes this input.\n if (taskCtx) {\n taskCtx.lastInputSentAt = Date.now();\n await ctx.syncTaskContext(taskCtx);\n }\n break;\n }\n\n case \"complete\": {\n const taskCtx = ctx.tasks.get(sessionId);\n\n // Extract meaningful artifacts (PR URLs, commits) instead of\n // dumping raw terminal output which is full of TUI noise.\n let summary = \"\";\n try {\n const rawOutput = await ctx.ptyService.getSessionOutput(sessionId, 50);\n summary = extractCompletionSummary(rawOutput);\n } catch {\n /* ignore */\n }\n\n if (!taskCtx) {\n ctx.broadcast({\n type: \"task_complete\",\n sessionId,\n timestamp: Date.now(),\n data: { reasoning: decision.reasoning },\n });\n ctx.ptyService.stopSession(sessionId, /* force */ true).catch((err) => {\n ctx.log(\n `Failed to stop session after LLM-detected completion: ${err}`,\n );\n });\n break;\n }\n\n taskCtx.completionSummary = summary || decision.reasoning || \"\";\n taskCtx.status = \"tool_running\";\n await Promise.all([\n ctx.syncTaskContext(taskCtx),\n ctx.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"validation_started\",\n summary: `Validation started for \"${taskCtx.label}\"`,\n data: {\n completionReasoning: decision.reasoning,\n completionSummary: taskCtx.completionSummary,\n },\n }),\n ]);\n ctx.broadcast({\n type: \"tool_running\",\n sessionId,\n timestamp: Date.now(),\n data: {\n description: \"validation\",\n },\n });\n\n const verifierJob = taskCtx.taskNodeId\n ? await ctx.taskRegistry.createTaskVerifierJob({\n threadId: taskCtx.threadId,\n nodeId: taskCtx.taskNodeId,\n status: \"running\",\n verifierType: \"task_completion\",\n title: `Validate ${taskCtx.label}`,\n instructions: [\n `Task: ${taskCtx.originalTask}`,\n taskCtx.completionSummary\n ? `Completion summary: ${taskCtx.completionSummary}`\n : \"\",\n decision.reasoning ? `Reasoning: ${decision.reasoning}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n config: {\n sessionId,\n agentType: taskCtx.agentType,\n },\n metadata: {\n source: \"swarm-decision-loop\",\n },\n startedAt: new Date().toISOString(),\n })\n : null;\n\n const validation = await validateTaskCompletion(ctx, {\n sessionId,\n taskCtx,\n completionReasoning: decision.reasoning,\n completionSummary: taskCtx.completionSummary,\n turnOutput: taskCtx.completionSummary,\n }).catch(\n (err) =>\n ({\n verdict: \"escalate\" as const,\n summary:\n err instanceof Error\n ? `Validation failed: ${err.message}`\n : `Validation failed: ${String(err)}`,\n followUpPrompt: undefined,\n reportPath: \"\",\n artifacts: [],\n }) satisfies Awaited<ReturnType<typeof validateTaskCompletion>>,\n );\n\n for (const artifact of validation.artifacts) {\n await ctx.taskRegistry.recordArtifact({\n threadId: taskCtx.threadId,\n sessionId,\n artifactType: artifact.artifactType,\n title: artifact.title,\n path: artifact.path ?? null,\n uri: artifact.uri ?? null,\n mimeType: artifact.mimeType ?? null,\n metadata: artifact.metadata ?? {},\n });\n if (taskCtx.taskNodeId && verifierJob) {\n await ctx.taskRegistry.recordTaskEvidence({\n threadId: taskCtx.threadId,\n nodeId: taskCtx.taskNodeId,\n sessionId,\n verifierJobId: verifierJob.id,\n evidenceType: artifact.artifactType,\n title: artifact.title,\n summary: validation.summary,\n path: artifact.path ?? null,\n uri: artifact.uri ?? null,\n content:\n artifact.metadata &&\n typeof artifact.metadata === \"object\" &&\n !Array.isArray(artifact.metadata)\n ? (artifact.metadata as Record<string, unknown>)\n : {},\n metadata: {\n mimeType: artifact.mimeType ?? null,\n },\n });\n }\n }\n\n if (validation.verdict !== \"pass\") {\n const followUpPrompt =\n validation.followUpPrompt?.trim() ||\n `Validation found the task incomplete. Continue working until this is resolved:\\n\\n${validation.summary}`;\n const nextStatus =\n validation.verdict === \"escalate\" ? \"blocked\" : \"active\";\n taskCtx.status = nextStatus;\n await Promise.all([\n ctx.syncTaskContext(taskCtx),\n verifierJob\n ? ctx.taskRegistry.updateTaskVerifierJob(verifierJob.id, {\n status: \"failed\",\n completedAt: new Date().toISOString(),\n metadata: {\n verdict: validation.verdict,\n summary: validation.summary,\n },\n })\n : Promise.resolve(),\n taskCtx.taskNodeId && verifierJob\n ? ctx.taskRegistry.recordTaskEvidence({\n threadId: taskCtx.threadId,\n nodeId: taskCtx.taskNodeId,\n sessionId,\n verifierJobId: verifierJob.id,\n evidenceType: \"validation_summary\",\n title: `Validation ${validation.verdict} for ${taskCtx.label}`,\n summary: validation.summary,\n content: {\n followUpPrompt:\n validation.verdict === \"revise\" ? followUpPrompt : null,\n reportPath: validation.reportPath || null,\n verdict: validation.verdict,\n },\n metadata: {\n source: \"task-validation\",\n },\n })\n : Promise.resolve(),\n ctx.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"validation_failed\",\n summary: `Validation did not approve \"${taskCtx.label}\"`,\n data: {\n verdict: validation.verdict,\n summary: validation.summary,\n followUpPrompt:\n validation.verdict === \"revise\" ? followUpPrompt : null,\n reportPath: validation.reportPath || null,\n },\n }),\n ]);\n\n if (validation.verdict === \"revise\") {\n await ctx.ptyService.sendToSession(sessionId, followUpPrompt);\n taskCtx.lastInputSentAt = Date.now();\n await ctx.syncTaskContext(taskCtx);\n ctx.sendChatMessage(\n `[${taskCtx.label}] Validation asked the agent to continue: ${validation.summary}`,\n \"coding-agent\",\n );\n } else {\n ctx.broadcast({\n type: \"escalation\",\n sessionId,\n timestamp: Date.now(),\n data: {\n reason: \"validation_escalation\",\n summary: validation.summary,\n },\n });\n ctx.sendChatMessage(\n `[${taskCtx.label}] Validation needs human review: ${validation.summary}`,\n \"coding-agent\",\n );\n }\n break;\n }\n\n taskCtx.status = \"completed\";\n await Promise.all([\n ctx.syncTaskContext(taskCtx),\n verifierJob\n ? ctx.taskRegistry.updateTaskVerifierJob(verifierJob.id, {\n status: \"passed\",\n completedAt: new Date().toISOString(),\n metadata: {\n summary: validation.summary,\n reportPath: validation.reportPath || null,\n },\n })\n : Promise.resolve(),\n taskCtx.taskNodeId && verifierJob\n ? ctx.taskRegistry.recordTaskEvidence({\n threadId: taskCtx.threadId,\n nodeId: taskCtx.taskNodeId,\n sessionId,\n verifierJobId: verifierJob.id,\n evidenceType: \"validation_summary\",\n title: `Validation passed for ${taskCtx.label}`,\n summary: validation.summary,\n content: {\n completionSummary: taskCtx.completionSummary,\n reportPath: validation.reportPath || null,\n },\n metadata: {\n source: \"task-validation\",\n },\n })\n : Promise.resolve(),\n ctx.taskRegistry.updateThreadSummary(\n taskCtx.threadId,\n taskCtx.completionSummary,\n ),\n ctx.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"validation_passed\",\n summary: `Validation passed for \"${taskCtx.label}\"`,\n data: {\n summary: validation.summary,\n reportPath: validation.reportPath || null,\n },\n }),\n ctx.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"task_status_changed\",\n summary: `Task \"${taskCtx.label}\" completed`,\n data: {\n status: \"completed\",\n completionSummary: taskCtx.completionSummary,\n validationSummary: validation.summary,\n },\n }),\n ]);\n\n // Log to persistent history (non-blocking but observed)\n (ctx as { history?: { append: (e: unknown) => Promise<void> } }).history\n ?.append({\n timestamp: Date.now(),\n type: \"task_completed\",\n sessionId,\n label: taskCtx.label,\n agentType: taskCtx.agentType,\n repo: taskCtx.repo,\n workdir: taskCtx.workdir,\n completionSummary: taskCtx.completionSummary,\n validationSummary: validation.summary,\n })\n .catch((err) => {\n ctx.log(\n `Failed to persist task completion for \"${taskCtx.label}\" (${sessionId}): ${err}`,\n );\n });\n\n ctx.broadcast({\n type: \"task_complete\",\n sessionId,\n timestamp: Date.now(),\n data: {\n reasoning: decision.reasoning,\n validationSummary: validation.summary,\n },\n });\n\n ctx.sendChatMessage(\n taskCtx.completionSummary\n ? `Finished \"${taskCtx.label}\".\\n\\n${taskCtx.completionSummary}`\n : `Finished \"${taskCtx.label}\".`,\n \"coding-agent\",\n );\n\n // Force-kill the session — task is done, nothing to save.\n // SIGKILL ensures the PTY and all child processes exit immediately,\n // preventing orphaned workspace processes.\n ctx.ptyService.stopSession(sessionId, /* force */ true).catch((err) => {\n ctx.log(`Failed to stop session after LLM-detected completion: ${err}`);\n });\n\n // Check if all tasks are now done — send a swarm-wide summary if so\n checkAllTasksComplete(ctx);\n break;\n }\n\n case \"escalate\":\n ctx.broadcast({\n type: \"escalation\",\n sessionId,\n timestamp: Date.now(),\n data: {\n reasoning: decision.reasoning,\n },\n });\n break;\n\n case \"ignore\":\n // No action needed\n break;\n }\n}\n\n// ─── Event Handlers ───\n\n/**\n * Handle a \"blocked\" session event — auto-resolved, escalated, or routed to decision loop.\n */\nexport async function handleBlocked(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n taskCtx: TaskContext,\n data: unknown,\n): Promise<void> {\n // Event data from pty-init: { promptInfo: BlockingPromptInfo, autoResponded: boolean }\n const eventData = data as {\n promptInfo?: {\n type?: string;\n prompt?: string;\n canAutoRespond?: boolean;\n suggestedResponse?: string;\n instructions?: string;\n };\n autoResponded?: boolean;\n };\n\n // Extract prompt text from promptInfo (the actual blocking prompt info object)\n const promptText =\n eventData.promptInfo?.prompt ?? eventData.promptInfo?.instructions ?? \"\";\n\n // Auto-responded by rules — log and broadcast, no LLM needed\n if (eventData.autoResponded) {\n // Safety: check if the auto-approved prompt accessed out-of-scope paths.\n // The approval already happened in pty-manager, but we can stop the session\n // and alert the user to prevent further damage.\n if (isOutOfScopeAccess(promptText, taskCtx.workdir)) {\n taskCtx.status = \"error\";\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: \"escalate\",\n reasoning: `SECURITY: Auto-response approved access outside workspace (${taskCtx.workdir}). Session stopped.`,\n });\n\n ctx.broadcast({\n type: \"escalation\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n reason: \"out_of_scope_auto_approved\",\n workdir: taskCtx.workdir,\n },\n });\n\n ctx.sendChatMessage(\n `[${taskCtx.label}] WARNING: Auto-approved access to path outside workspace (${taskCtx.workdir}). ` +\n `Prompt: \"${promptText.slice(0, 150)}\". Stopping session for safety.`,\n \"coding-agent\",\n );\n\n // Force-kill the session to prevent further out-of-scope access\n ctx.ptyService?.stopSession(sessionId, /* force */ true).catch((err) => {\n ctx.log(\n `Failed to stop session after out-of-scope auto-approval: ${err}`,\n );\n });\n return;\n }\n\n taskCtx.autoResolvedCount++;\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: \"auto_resolved\",\n reasoning: \"Handled by auto-response rules\",\n });\n\n ctx.broadcast({\n type: \"blocked_auto_resolved\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n promptType: eventData.promptInfo?.type,\n autoResolvedCount: taskCtx.autoResolvedCount,\n },\n });\n\n // Log auto-approvals server-side only — don't persist to chat.\n const count = taskCtx.autoResolvedCount;\n if (count <= 2 || count % 5 === 0) {\n const excerpt =\n promptText.length > 120 ? `${promptText.slice(0, 120)}...` : promptText;\n ctx.log(`[${taskCtx.label}] Approved: ${excerpt}`);\n }\n return;\n }\n\n const adapterSuggestedResponse =\n typeof eventData.promptInfo?.suggestedResponse === \"string\" &&\n eventData.promptInfo.suggestedResponse.trim().length > 0\n ? eventData.promptInfo.suggestedResponse.trim()\n : eventData.promptInfo?.canAutoRespond &&\n eventData.promptInfo?.type === \"permission\"\n ? \"keys:enter\"\n : undefined;\n const inferredPromptResponse = inferRoutinePromptResponse(\n promptText,\n eventData.promptInfo?.type,\n );\n const routineSuggestedResponse =\n adapterSuggestedResponse ?? inferredPromptResponse?.suggestedResponse;\n\n if (\n ctx.getSupervisionLevel() === \"autonomous\" &&\n (eventData.promptInfo?.canAutoRespond || inferredPromptResponse) &&\n routineSuggestedResponse\n ) {\n const fastDecision = decisionFromSuggestedResponse(\n routineSuggestedResponse,\n inferredPromptResponse?.reasoning,\n );\n\n taskCtx.autoResolvedCount++;\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: \"auto_resolved\",\n response: formatDecisionResponse(fastDecision),\n reasoning: fastDecision.reasoning,\n });\n\n ctx.broadcast({\n type: \"blocked_auto_resolved\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n promptType: eventData.promptInfo?.type,\n autoResolvedCount: taskCtx.autoResolvedCount,\n strategy: \"adapter_suggested_response\",\n },\n });\n\n await executeDecision(ctx, sessionId, fastDecision);\n return;\n }\n\n // Deduplicate: if an LLM decision is already in-flight for this session\n // AND the prompt text matches the one already being handled, skip.\n // TUI re-renders fire the same prompt many times; a *different* prompt\n // (theoretically possible if the agent resolves one prompt and immediately\n // hits another) should not be dropped.\n const promptFingerprint = promptText.slice(0, 200);\n if (ctx.inFlightDecisions.has(sessionId)) {\n if (ctx.lastBlockedPromptFingerprint.get(sessionId) === promptFingerprint) {\n ctx.log(\n `Skipping duplicate blocked event for ${taskCtx.label} (decision in-flight, same prompt)`,\n );\n return;\n }\n // Different prompt — buffer it so it's replayed after the current decision completes.\n ctx.log(\n `New blocked prompt for ${taskCtx.label} while decision in-flight — buffering`,\n );\n ctx.pendingBlocked.set(sessionId, data);\n ctx.lastBlockedPromptFingerprint.set(sessionId, promptFingerprint);\n return;\n }\n ctx.lastBlockedPromptFingerprint.set(sessionId, promptFingerprint);\n taskCtx.status = \"blocked\";\n await ctx.syncTaskContext(taskCtx);\n\n // Broadcast that the agent is blocked (for all supervision levels)\n ctx.broadcast({\n type: \"blocked\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n promptType: eventData.promptInfo?.type,\n supervisionLevel: ctx.getSupervisionLevel(),\n },\n });\n\n // Safety check: escalate after too many consecutive auto-responses\n if (taskCtx.autoResolvedCount >= MAX_AUTO_RESPONSES) {\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: \"escalate\",\n reasoning: `Escalating after ${MAX_AUTO_RESPONSES} consecutive auto-responses`,\n });\n ctx.broadcast({\n type: \"escalation\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n reason: \"max_auto_responses_exceeded\",\n },\n });\n return;\n }\n\n // Route based on supervision level\n switch (ctx.getSupervisionLevel()) {\n case \"autonomous\":\n await handleAutonomousDecision(\n ctx,\n sessionId,\n taskCtx,\n promptText,\n \"\",\n eventData.promptInfo?.type,\n );\n break;\n\n case \"confirm\":\n await handleConfirmDecision(\n ctx,\n sessionId,\n taskCtx,\n promptText,\n \"\",\n eventData.promptInfo?.type,\n );\n break;\n\n case \"notify\":\n // Notify mode — broadcast only, no action\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: \"escalate\",\n reasoning: \"Supervision level is notify — broadcasting only\",\n });\n break;\n }\n}\n\n// ─── Turn Completion Assessment ───\n\n/**\n * Handle a turn completion event. Instead of immediately stopping the session,\n * ask the LLM whether the overall task is done or the agent needs more turns.\n */\nexport async function handleTurnComplete(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n taskCtx: TaskContext,\n data: unknown,\n): Promise<void> {\n if (taskCtx.status !== \"active\") return;\n\n // If another decision (e.g. handleBlocked) is running for this session,\n // buffer the task_complete event so it's processed when the lock releases.\n // Without this, task_complete events are silently lost and sessions hang.\n if (ctx.inFlightDecisions.has(sessionId)) {\n ctx.log(\n `Buffering turn-complete for ${sessionId} (in-flight decision running)`,\n );\n ctx.pendingTurnComplete.set(sessionId, data);\n return;\n }\n\n // Suppress turn-complete events during the post-send cooldown period.\n // After the coordinator sends input, the agent needs time to process it.\n // Without this, stall-classified \"task_complete\" events from stale output\n // trigger cascading follow-ups before the agent starts responding.\n if (taskCtx.lastInputSentAt) {\n const elapsed = Date.now() - taskCtx.lastInputSentAt;\n if (elapsed < POST_SEND_COOLDOWN_MS) {\n ctx.pendingTurnComplete.set(sessionId, data);\n if (!deferredTurnCompleteTimers.has(sessionId)) {\n const delayMs = POST_SEND_COOLDOWN_MS - elapsed + 50;\n const timer = setTimeout(() => {\n deferredTurnCompleteTimers.delete(sessionId);\n const pendingData = ctx.pendingTurnComplete.get(sessionId);\n if (!pendingData) return;\n const currentTask = ctx.tasks.get(sessionId);\n if (!currentTask || currentTask.status !== \"active\") {\n ctx.pendingTurnComplete.delete(sessionId);\n return;\n }\n void handleTurnComplete(\n ctx,\n sessionId,\n currentTask,\n pendingData,\n ).catch((err) => {\n ctx.log(\n `Deferred turn-complete replay failed for ${sessionId}: ${err}`,\n );\n });\n }, delayMs);\n deferredTurnCompleteTimers.set(sessionId, timer);\n }\n ctx.log(\n `Suppressing turn-complete for \"${taskCtx.label}\" — ` +\n `${Math.round(elapsed / 1000)}s since last input (cooldown ${POST_SEND_COOLDOWN_MS / 1000}s)`,\n );\n return;\n }\n }\n\n const deferredTimer = deferredTurnCompleteTimers.get(sessionId);\n if (deferredTimer) {\n clearTimeout(deferredTimer);\n deferredTurnCompleteTimers.delete(sessionId);\n }\n ctx.pendingTurnComplete.delete(sessionId);\n\n ctx.inFlightDecisions.add(sessionId);\n try {\n ctx.log(\n `Turn complete for \"${taskCtx.label}\" — assessing whether task is done`,\n );\n\n // Get the turn output — prefer the captured response, fall back to PTY output\n const rawResponse = (data as { response?: string }).response ?? \"\";\n let turnOutput = cleanForChat(rawResponse);\n if (!turnOutput) {\n const raw = await fetchRecentOutput(ctx, sessionId);\n turnOutput = cleanForChat(raw);\n }\n\n // Fast-path: if the turn output contains a PR URL or \"Created pull request\",\n // the task is done — skip the LLM assessment entirely. The LLM (especially\n // Gemini Flash) tends to ignore \"do not verify\" instructions and sends\n // unnecessary verification follow-ups, adding 2-5 extra rounds per agent.\n // Only match explicit PR creation signals — not references to existing PRs.\n const PR_CREATED_RE =\n /(?:Created|Opened)\\s+pull\\s+request\\s+#?\\d+|gh\\s+pr\\s+create/i;\n if (PR_CREATED_RE.test(turnOutput)) {\n const fastDecision: CoordinationLLMResponse = {\n action: \"complete\",\n reasoning: \"PR detected in turn output — task complete.\",\n };\n ctx.log(\n `Turn assessment for \"${taskCtx.label}\": complete (fast-path: PR detected in output)`,\n );\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"turn_complete\",\n promptText: \"Agent finished a turn\",\n decision: \"complete\",\n response: \"\",\n reasoning: fastDecision.reasoning,\n });\n recordKeyDecision(ctx, taskCtx.label, fastDecision);\n ctx.broadcast({\n type: \"turn_assessment\",\n sessionId,\n timestamp: Date.now(),\n data: { action: \"complete\", reasoning: fastDecision.reasoning },\n });\n await executeDecision(ctx, sessionId, fastDecision);\n return;\n }\n\n // Turn completions always use the fast small-LLM path.\n // The assessment is a structured complete/continue/escalate decision\n // that doesn't benefit from the full Milaidy pipeline, and routing\n // through it risks hangs that block the inFlightDecisions lock.\n let decision: CoordinationLLMResponse | null = null;\n const decisionFromPipeline = false;\n\n const prompt = buildTurnCompletePrompt(\n toContextSummary(taskCtx),\n turnOutput,\n toDecisionHistory(taskCtx),\n collectSiblings(ctx, sessionId),\n ctx.sharedDecisions,\n ctx.getSwarmContext(),\n );\n try {\n const result = await withTrajectoryContext(\n ctx.runtime,\n {\n source: \"orchestrator\",\n decisionType: \"turn-complete\",\n sessionId,\n taskLabel: taskCtx.label,\n repo: taskCtx.repo,\n workdir: taskCtx.workdir,\n originalTask: taskCtx.originalTask,\n },\n () => ctx.runtime.useModel(ModelType.TEXT_SMALL, { prompt }),\n );\n decision = parseCoordinationResponse(result);\n } catch (err) {\n ctx.log(`Turn-complete LLM call failed: ${err}`);\n }\n\n if (!decision) {\n // Both paths failed — escalate so a human can decide rather than\n // prematurely completing unfinished work on a transient LLM failure.\n ctx.log(\n `Turn-complete for \"${taskCtx.label}\": all decision paths failed — escalating`,\n );\n decision = {\n action: \"escalate\",\n reasoning:\n \"All decision paths returned invalid response — escalating for human review\",\n };\n }\n\n // Log the decision\n ctx.log(\n `Turn assessment for \"${taskCtx.label}\": ${decision.action}${\n decision.action === \"respond\"\n ? ` → \"${(decision.response ?? \"\").slice(0, 80)}\"`\n : \"\"\n } — ${decision.reasoning.slice(0, 120)}`,\n );\n\n // Record\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"turn_complete\",\n promptText: \"Agent finished a turn\",\n decision: decision.action,\n response: formatDecisionResponse(decision),\n reasoning: decision.reasoning,\n });\n\n // Layer 2: capture significant decisions for cross-agent sharing\n recordKeyDecision(ctx, taskCtx.label, decision);\n\n ctx.broadcast({\n type: \"turn_assessment\",\n sessionId,\n timestamp: Date.now(),\n data: {\n action: decision.action,\n reasoning: decision.reasoning,\n },\n });\n\n if (ctx.pendingBlocked.has(sessionId)) {\n ctx.log(\n `Deferring turn assessment execution for \"${taskCtx.label}\" because a newer blocked prompt arrived during assessment`,\n );\n ctx.pendingTurnComplete.set(sessionId, data);\n return;\n }\n\n // Send chat message for small-LLM decisions only.\n // When Milaidy's pipeline handled it, she already spoke via WS broadcast.\n if (!decisionFromPipeline) {\n if (decision.action === \"respond\") {\n const instruction = decision.response ?? \"\";\n const preview =\n instruction.length > 120\n ? `${instruction.slice(0, 120)}...`\n : instruction;\n ctx.log(`[${taskCtx.label}] Turn done, continuing: ${preview}`);\n } else if (decision.action === \"escalate\") {\n ctx.sendChatMessage(\n `[${taskCtx.label}] Turn finished — needs your attention: ${decision.reasoning}`,\n \"coding-agent\",\n );\n }\n }\n // \"complete\" chat message is handled by executeDecision\n\n await executeDecision(ctx, sessionId, decision);\n } finally {\n ctx.inFlightDecisions.delete(sessionId);\n await drainPendingBlocked(ctx, sessionId);\n await drainPendingTurnComplete(ctx, sessionId);\n }\n}\n\n// ─── Autonomous / Confirm Decision Flows ───\n\n/**\n * Handle an autonomous decision for a blocked session — call the LLM and execute immediately.\n */\nexport async function handleAutonomousDecision(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n taskCtx: TaskContext,\n promptText: string,\n recentOutput: string,\n promptType?: string,\n): Promise<void> {\n // Debounce: skip if decision already in-flight for this session\n if (ctx.inFlightDecisions.has(sessionId)) {\n ctx.log(`Skipping duplicate decision for ${sessionId} (in-flight)`);\n return;\n }\n\n ctx.inFlightDecisions.add(sessionId);\n try {\n // Get recent output from PTY if not provided\n let output = recentOutput;\n if (!output) {\n output = await fetchRecentOutput(ctx, sessionId);\n }\n\n // Triage: route to small LLM (routine) or Milaidy pipeline (creative).\n // Track source so we skip duplicate chat messages when Milaidy already spoke.\n const agentDecisionCb = ctx.getAgentDecisionCallback();\n let decision: CoordinationLLMResponse | null = null;\n let decisionFromPipeline = false;\n\n const triageCtx: TriageContext = {\n eventType: \"blocked\",\n promptText,\n promptType,\n recentOutput: output,\n originalTask: taskCtx.originalTask,\n };\n const tier = agentDecisionCb\n ? await classifyEventTier(ctx.runtime, triageCtx, ctx.log)\n : \"routine\"; // No pipeline → always small LLM\n\n if (tier === \"routine\") {\n decision = await makeCoordinationDecision(\n ctx,\n taskCtx,\n promptText,\n output,\n );\n } else {\n // Creative — try Milaidy pipeline, fall back to small LLM\n if (agentDecisionCb) {\n const eventMessage = buildBlockedEventMessage(\n toContextSummary(taskCtx),\n promptText,\n output,\n toDecisionHistory(taskCtx),\n collectSiblings(ctx, sessionId),\n ctx.sharedDecisions,\n ctx.getSwarmContext(),\n );\n try {\n decision = await withTimeout(\n agentDecisionCb(eventMessage, sessionId, taskCtx),\n DECISION_CB_TIMEOUT_MS,\n \"agentDecisionCb\",\n );\n if (decision) decisionFromPipeline = true;\n } catch (err) {\n ctx.log(\n `Agent decision callback failed: ${err} — falling back to small LLM`,\n );\n }\n }\n\n if (!decision) {\n decision = await makeCoordinationDecision(\n ctx,\n taskCtx,\n promptText,\n output,\n );\n }\n }\n\n if (!decision) {\n // All decision paths returned invalid response — escalate\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: \"escalate\",\n reasoning: \"All decision paths returned invalid coordination response\",\n });\n ctx.broadcast({\n type: \"escalation\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n reason: \"invalid_llm_response\",\n },\n });\n return;\n }\n\n // Guard: decline + redirect if the prompt references out-of-scope paths.\n // Instead of stalling via escalate, tell the agent \"no\" and point it to the\n // workspace. Also notify the human in case broader access was intended.\n if (\n decision.action === \"respond\" &&\n isOutOfScopeAccess(promptText, taskCtx.workdir)\n ) {\n decision = {\n action: \"respond\",\n response: `No — that path is outside your workspace. Use ${taskCtx.workdir} instead. Create any files or directories you need there.`,\n reasoning: `Declined out-of-scope access (outside ${taskCtx.workdir}) and redirected agent to workspace.`,\n };\n // Surface to human so they can grant broader access if intended\n ctx.sendChatMessage(\n `[${taskCtx.label}] Declined out-of-scope access and redirected to workspace (${taskCtx.workdir}). If you intended broader access, send the agent an override.`,\n \"coding-agent\",\n );\n }\n\n // Record the decision\n taskCtx.autoResolvedCount = 0;\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: decision.action,\n response: formatDecisionResponse(decision),\n reasoning: decision.reasoning,\n });\n\n // Layer 2: capture significant decisions for cross-agent sharing\n recordKeyDecision(ctx, taskCtx.label, decision);\n\n // Broadcast the decision\n ctx.broadcast({\n type: \"coordination_decision\",\n sessionId,\n timestamp: Date.now(),\n data: {\n action: decision.action,\n response: decision.response,\n useKeys: decision.useKeys,\n keys: decision.keys,\n reasoning: decision.reasoning,\n },\n });\n\n // Send chat message for small-LLM decisions only.\n // When Milaidy's pipeline handled it, she already spoke via WS broadcast.\n if (!decisionFromPipeline) {\n if (decision.action === \"respond\") {\n const actionDesc = decision.useKeys\n ? `Sent keys: ${decision.keys?.join(\", \")}`\n : decision.response\n ? `Responded: ${decision.response.length > 100 ? `${decision.response.slice(0, 100)}...` : decision.response}`\n : \"Responded\";\n const reasonExcerpt =\n decision.reasoning.length > 150\n ? `${decision.reasoning.slice(0, 150)}...`\n : decision.reasoning;\n ctx.log(`[${taskCtx.label}] ${actionDesc} — ${reasonExcerpt}`);\n } else if (decision.action === \"escalate\") {\n ctx.sendChatMessage(\n `[${taskCtx.label}] Needs your attention: ${decision.reasoning}`,\n \"coding-agent\",\n );\n }\n }\n\n // Execute\n await executeDecision(ctx, sessionId, decision);\n } finally {\n ctx.inFlightDecisions.delete(sessionId);\n await drainPendingBlocked(ctx, sessionId);\n await drainPendingTurnComplete(ctx, sessionId);\n }\n}\n\n/**\n * Handle a confirm-mode decision — call LLM, then queue for human approval.\n */\nexport async function handleConfirmDecision(\n ctx: SwarmCoordinatorContext,\n sessionId: string,\n taskCtx: TaskContext,\n promptText: string,\n recentOutput: string,\n promptType?: string,\n): Promise<void> {\n // Debounce\n if (ctx.inFlightDecisions.has(sessionId)) return;\n\n ctx.inFlightDecisions.add(sessionId);\n try {\n let output = recentOutput;\n if (!output) {\n output = await fetchRecentOutput(ctx, sessionId);\n }\n\n // Triage: route to small LLM (routine) or Milaidy pipeline (creative)\n const agentDecisionCb = ctx.getAgentDecisionCallback();\n let decision: CoordinationLLMResponse | null = null;\n let decisionFromPipeline = false;\n\n const triageCtx: TriageContext = {\n eventType: \"blocked\",\n promptText,\n promptType,\n recentOutput: output,\n originalTask: taskCtx.originalTask,\n };\n const tier = agentDecisionCb\n ? await classifyEventTier(ctx.runtime, triageCtx, ctx.log)\n : \"routine\"; // No pipeline → always small LLM\n\n if (tier === \"routine\") {\n decision = await makeCoordinationDecision(\n ctx,\n taskCtx,\n promptText,\n output,\n );\n } else {\n // Creative — try Milaidy pipeline, fall back to small LLM\n if (agentDecisionCb) {\n const eventMessage = buildBlockedEventMessage(\n toContextSummary(taskCtx),\n promptText,\n output,\n toDecisionHistory(taskCtx),\n collectSiblings(ctx, sessionId),\n ctx.sharedDecisions,\n ctx.getSwarmContext(),\n );\n try {\n decision = await withTimeout(\n agentDecisionCb(eventMessage, sessionId, taskCtx),\n DECISION_CB_TIMEOUT_MS,\n \"agentDecisionCb\",\n );\n if (decision) decisionFromPipeline = true;\n } catch (err) {\n ctx.log(\n `Agent decision callback failed (confirm): ${err} — falling back to small LLM`,\n );\n }\n }\n\n if (!decision) {\n decision = await makeCoordinationDecision(\n ctx,\n taskCtx,\n promptText,\n output,\n );\n }\n }\n\n if (!decision) {\n // Queue for human with no suggestion\n taskCtx.status = \"blocked\";\n await ctx.syncTaskContext(taskCtx);\n const pendingDecision: PendingDecision = {\n sessionId,\n promptText,\n recentOutput: output,\n llmDecision: {\n action: \"escalate\",\n reasoning:\n \"All decision paths returned invalid response — needs human review\",\n },\n taskContext: taskCtx,\n createdAt: Date.now(),\n };\n ctx.pendingDecisions.set(sessionId, pendingDecision);\n await ctx.taskRegistry.upsertPendingDecision({\n sessionId,\n threadId: taskCtx.threadId,\n promptText,\n recentOutput: output,\n llmDecision: pendingDecision.llmDecision as unknown as Record<\n string,\n unknown\n >,\n taskContext: taskCtx as unknown as Record<string, unknown>,\n createdAt: pendingDecision.createdAt,\n });\n } else {\n // Queue the LLM's suggestion for human approval\n taskCtx.status = \"blocked\";\n await ctx.syncTaskContext(taskCtx);\n const pendingDecision: PendingDecision = {\n sessionId,\n promptText,\n recentOutput: output,\n llmDecision: decision,\n taskContext: taskCtx,\n createdAt: Date.now(),\n };\n ctx.pendingDecisions.set(sessionId, pendingDecision);\n await ctx.taskRegistry.upsertPendingDecision({\n sessionId,\n threadId: taskCtx.threadId,\n promptText,\n recentOutput: output,\n llmDecision: decision as unknown as Record<string, unknown>,\n taskContext: taskCtx as unknown as Record<string, unknown>,\n createdAt: pendingDecision.createdAt,\n });\n }\n\n await ctx.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"pending_confirmation\",\n summary: `Queued human confirmation for \"${taskCtx.label}\"`,\n data: {\n promptText,\n suggestedAction: decision?.action ?? \"escalate\",\n },\n });\n\n // When Milaidy's pipeline made the suggestion, she already spoke via WS broadcast.\n // Only broadcast the pending_confirmation event for small-LLM suggestions or\n // always broadcast it (the UI needs it regardless) but skip any chat messages.\n ctx.broadcast({\n type: \"pending_confirmation\",\n sessionId,\n timestamp: Date.now(),\n data: {\n prompt: promptText,\n suggestedAction: decision?.action,\n suggestedResponse: decision?.response,\n reasoning: decision?.reasoning,\n fromPipeline: decisionFromPipeline,\n },\n });\n } finally {\n ctx.inFlightDecisions.delete(sessionId);\n await drainPendingTurnComplete(ctx, sessionId);\n await drainPendingBlocked(ctx, sessionId);\n }\n}\n",
|
|
11
11
|
"const entityKind = Symbol.for(\"drizzle:entityKind\");\nconst hasOwnEntityKind = Symbol.for(\"drizzle:hasOwnEntityKind\");\nfunction is(value, type) {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n if (value instanceof type) {\n return true;\n }\n if (!Object.prototype.hasOwnProperty.call(type, entityKind)) {\n throw new Error(\n `Class \"${type.name ?? \"<unknown>\"}\" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`\n );\n }\n let cls = Object.getPrototypeOf(value).constructor;\n if (cls) {\n while (cls) {\n if (entityKind in cls && cls[entityKind] === type[entityKind]) {\n return true;\n }\n cls = Object.getPrototypeOf(cls);\n }\n }\n return false;\n}\nexport {\n entityKind,\n hasOwnEntityKind,\n is\n};\n//# sourceMappingURL=entity.js.map",
|
|
12
12
|
"import { entityKind } from \"./entity.js\";\nclass Column {\n constructor(table, config) {\n this.table = table;\n this.config = config;\n this.name = config.name;\n this.keyAsName = config.keyAsName;\n this.notNull = config.notNull;\n this.default = config.default;\n this.defaultFn = config.defaultFn;\n this.onUpdateFn = config.onUpdateFn;\n this.hasDefault = config.hasDefault;\n this.primary = config.primaryKey;\n this.isUnique = config.isUnique;\n this.uniqueName = config.uniqueName;\n this.uniqueType = config.uniqueType;\n this.dataType = config.dataType;\n this.columnType = config.columnType;\n this.generated = config.generated;\n this.generatedIdentity = config.generatedIdentity;\n }\n static [entityKind] = \"Column\";\n name;\n keyAsName;\n primary;\n notNull;\n default;\n defaultFn;\n onUpdateFn;\n hasDefault;\n isUnique;\n uniqueName;\n uniqueType;\n dataType;\n columnType;\n enumValues = void 0;\n generated = void 0;\n generatedIdentity = void 0;\n config;\n mapFromDriverValue(value) {\n return value;\n }\n mapToDriverValue(value) {\n return value;\n }\n // ** @internal */\n shouldDisableInsert() {\n return this.config.generated !== void 0 && this.config.generated.type !== \"byDefault\";\n }\n}\nexport {\n Column\n};\n//# sourceMappingURL=column.js.map",
|
|
13
13
|
"import { entityKind } from \"./entity.js\";\nclass ColumnBuilder {\n static [entityKind] = \"ColumnBuilder\";\n config;\n constructor(name, dataType, columnType) {\n this.config = {\n name,\n keyAsName: name === \"\",\n notNull: false,\n default: void 0,\n hasDefault: false,\n primaryKey: false,\n isUnique: false,\n uniqueName: void 0,\n uniqueType: void 0,\n dataType,\n columnType,\n generated: void 0\n };\n }\n /**\n * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.\n *\n * @example\n * ```ts\n * const users = pgTable('users', {\n * \tid: integer('id').$type<UserId>().primaryKey(),\n * \tdetails: json('details').$type<UserDetails>().notNull(),\n * });\n * ```\n */\n $type() {\n return this;\n }\n /**\n * Adds a `not null` clause to the column definition.\n *\n * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.\n */\n notNull() {\n this.config.notNull = true;\n return this;\n }\n /**\n * Adds a `default <value>` clause to the column definition.\n *\n * Affects the `insert` model of the table - columns *with* `default` are optional on insert.\n *\n * If you need to set a dynamic default value, use {@link $defaultFn} instead.\n */\n default(value) {\n this.config.default = value;\n this.config.hasDefault = true;\n return this;\n }\n /**\n * Adds a dynamic default value to the column.\n * The function will be called when the row is inserted, and the returned value will be used as the column value.\n *\n * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n */\n $defaultFn(fn) {\n this.config.defaultFn = fn;\n this.config.hasDefault = true;\n return this;\n }\n /**\n * Alias for {@link $defaultFn}.\n */\n $default = this.$defaultFn;\n /**\n * Adds a dynamic update value to the column.\n * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.\n * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.\n *\n * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n */\n $onUpdateFn(fn) {\n this.config.onUpdateFn = fn;\n this.config.hasDefault = true;\n return this;\n }\n /**\n * Alias for {@link $onUpdateFn}.\n */\n $onUpdate = this.$onUpdateFn;\n /**\n * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.\n *\n * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.\n */\n primaryKey() {\n this.config.primaryKey = true;\n this.config.notNull = true;\n return this;\n }\n /** @internal Sets the name of the column to the key within the table definition if a name was not given. */\n setName(name) {\n if (this.config.name !== \"\") return;\n this.config.name = name;\n }\n}\nexport {\n ColumnBuilder\n};\n//# sourceMappingURL=column-builder.js.map",
|
|
@@ -39,48 +39,56 @@
|
|
|
39
39
|
"export * from \"./expressions/index.js\";\nexport * from \"./functions/index.js\";\nexport * from \"./sql.js\";\n//# sourceMappingURL=index.js.map",
|
|
40
40
|
"export * from \"./alias.js\";\nexport * from \"./column-builder.js\";\nexport * from \"./column.js\";\nexport * from \"./entity.js\";\nexport * from \"./errors.js\";\nexport * from \"./logger.js\";\nexport * from \"./operations.js\";\nexport * from \"./query-promise.js\";\nexport * from \"./relations.js\";\nexport * from \"./sql/index.js\";\nexport * from \"./subquery.js\";\nexport * from \"./table.js\";\nexport * from \"./utils.js\";\nexport * from \"./view-common.js\";\n//# sourceMappingURL=index.js.map",
|
|
41
41
|
"/**\n * FINALIZE_WORKSPACE action - Commit, push, and create PR for workspace changes\n *\n * Completes a coding task by committing changes, pushing to remote,\n * and optionally creating a pull request.\n *\n * @module actions/finalize-workspace\n */\n\nimport type {\n Action,\n ActionResult,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\n\nexport const finalizeWorkspaceAction: Action = {\n name: \"FINALIZE_WORKSPACE\",\n\n similes: [\"COMMIT_AND_PR\", \"CREATE_PR\", \"SUBMIT_CHANGES\", \"FINISH_WORKSPACE\"],\n\n description:\n \"Finalize workspace changes by committing, pushing, and optionally creating a pull request. \" +\n \"Use after a task agent completes its task.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Create a PR for the changes\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll commit and create a pull request.\",\n action: \"FINALIZE_WORKSPACE\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Submit the task agent's work as a PR\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Finalizing the workspace and creating PR.\",\n action: \"FINALIZE_WORKSPACE\",\n },\n },\n ],\n ],\n\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n ): Promise<boolean> => {\n const workspaceService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n return workspaceService != null;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const workspaceService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n if (!workspaceService) {\n if (callback) {\n await callback({\n text: \"Workspace Service is not available.\",\n });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n const content = message.content as {\n workspaceId?: string;\n commitMessage?: string;\n prTitle?: string;\n prBody?: string;\n baseBranch?: string;\n draft?: boolean;\n skipPR?: boolean;\n };\n\n // Get workspace ID from content or state\n let workspaceId = content.workspaceId;\n if (!workspaceId && state?.codingWorkspace) {\n workspaceId = (state.codingWorkspace as { id: string }).id;\n }\n\n if (!workspaceId) {\n const workspaces = workspaceService.listWorkspaces();\n if (workspaces.length === 0) {\n if (callback) {\n await callback({\n text: \"No workspaces available. Provision a workspace first.\",\n });\n }\n return { success: false, error: \"NO_WORKSPACE\" };\n }\n workspaceId = workspaces[workspaces.length - 1].id;\n }\n\n const workspace = workspaceService.getWorkspace(workspaceId);\n if (!workspace) {\n if (callback) {\n await callback({\n text: `Workspace ${workspaceId} not found.`,\n });\n }\n return { success: false, error: \"WORKSPACE_NOT_FOUND\" };\n }\n\n try {\n // Check workspace status\n const status = await workspaceService.getStatus(workspaceId);\n\n if (status.clean && status.staged.length === 0) {\n if (callback) {\n await callback({\n text: \"No changes to commit in this workspace.\",\n });\n }\n return {\n success: true,\n text: \"No changes to commit\",\n data: { workspaceId, status },\n };\n }\n\n // Commit changes\n const commitMessage =\n content.commitMessage ??\n `feat: automated changes from task agent\\n\\nGenerated by Milady task-agent plugin.`;\n\n const commitHash = await workspaceService.commit(workspaceId, {\n message: commitMessage,\n all: true,\n });\n\n // Push to remote\n await workspaceService.push(workspaceId, { setUpstream: true });\n\n // Create PR if not skipped\n let prInfo = null;\n if (!content.skipPR) {\n const prTitle = content.prTitle ?? `[Milady] ${workspace.branch}`;\n const prBody =\n content.prBody ??\n `## Summary\\n\\nAutomated changes generated by Milady task agent.\\n\\n` +\n `**Branch:** ${workspace.branch}\\n` +\n `**Commit:** ${commitHash}\\n\\n` +\n `---\\n*Generated by @elizaos/plugin-agent-orchestrator*`;\n\n prInfo = await workspaceService.createPR(workspaceId, {\n title: prTitle,\n body: prBody,\n base: content.baseBranch,\n draft: content.draft,\n });\n }\n\n if (callback) {\n if (prInfo) {\n await callback({\n text:\n `Workspace finalized!\\n` +\n `Commit: ${commitHash.slice(0, 8)}\\n` +\n `PR #${prInfo.number}: ${prInfo.url}`,\n });\n } else {\n await callback({\n text:\n `Workspace changes committed and pushed.\\n` +\n `Commit: ${commitHash.slice(0, 8)}`,\n });\n }\n }\n\n return {\n success: true,\n text: prInfo\n ? `Created PR #${prInfo.number}`\n : \"Changes committed and pushed\",\n data: {\n workspaceId,\n commitHash,\n pr: prInfo ? { number: prInfo.number, url: prInfo.url } : undefined,\n },\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (callback) {\n await callback({\n text: `Failed to finalize workspace: ${errorMessage}`,\n });\n }\n return { success: false, error: \"FINALIZE_FAILED\" };\n }\n },\n\n parameters: [\n {\n name: \"workspaceId\",\n description:\n \"ID of the workspace to finalize. Uses current workspace if not specified.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"commitMessage\",\n description: \"Commit message for the changes.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"prTitle\",\n description: \"Title for the pull request.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"prBody\",\n description: \"Body/description for the pull request.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"baseBranch\",\n description: \"Base branch for the PR (e.g., main, develop).\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"draft\",\n description: \"Create as draft PR.\",\n required: false,\n schema: { type: \"boolean\" as const },\n },\n {\n name: \"skipPR\",\n description: \"Skip PR creation, only commit and push.\",\n required: false,\n schema: { type: \"boolean\" as const },\n },\n ],\n};\n",
|
|
42
|
-
"/** @module services/pty-service */\n\nimport { appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type IAgentRuntime, type Service, logger } from \"@elizaos/core\";\nimport {\n type AdapterType,\n type AgentFileDescriptor,\n type ApprovalConfig,\n type ApprovalPreset,\n type BaseCodingAdapter,\n checkAdapters,\n createAdapter,\n generateApprovalConfig,\n type PreflightResult,\n type WriteMemoryOptions,\n} from \"coding-agent-adapters\";\nimport { PTYConsoleBridge } from \"pty-console\";\nimport type {\n BunCompatiblePTYManager,\n PTYManager,\n SessionFilter,\n SessionHandle,\n SessionMessage,\n SpawnConfig,\n StallClassification,\n WorkerSessionHandle,\n} from \"pty-manager\";\nimport { AgentMetricsTracker } from \"./agent-metrics.js\";\nimport { type AgentSelectionStrategy } from \"./agent-selection.js\";\nimport { readConfigEnvKey } from \"./config-env.js\";\nimport {\n handleGeminiAuth as handleGeminiAuthFlow,\n pushDefaultRules as pushDefaultAutoResponseRules,\n} from \"./pty-auto-response.js\";\nimport { initializePTYManager } from \"./pty-init.js\";\nimport {\n getSessionOutput as getSessionOutputIO,\n type SessionIOContext,\n sendKeysToSession as sendKeysToSessionIO,\n sendToSession as sendToSessionIO,\n stopSession as stopSessionIO,\n subscribeToOutput as subscribeToOutputIO,\n} from \"./pty-session-io.js\";\nimport {\n buildSpawnConfig,\n setupDeferredTaskDelivery,\n setupOutputBuffer,\n} from \"./pty-spawn.js\";\nimport type {\n CodingAgentType,\n PTYServiceConfig,\n SessionEventCallback,\n SessionInfo,\n SpawnSessionOptions,\n} from \"./pty-types.js\";\nimport { isPiAgentType, toPiCommand } from \"./pty-types.js\";\nimport {\n classifyAndDecideForCoordinator,\n classifyStallOutput,\n} from \"./stall-classifier.js\";\nimport { POST_SEND_COOLDOWN_MS } from \"./swarm-decision-loop.js\";\nimport { SwarmCoordinator } from \"./swarm-coordinator.js\";\nimport {\n captureFeed,\n captureLifecycle,\n captureSessionOpen,\n isDebugCaptureEnabled,\n} from \"./debug-capture.js\";\nimport {\n getTaskAgentFrameworkState,\n type TaskAgentFrameworkState,\n} from \"./task-agent-frameworks.js\";\n\nexport type {\n CodingAgentType,\n PTYServiceConfig,\n SessionEventName,\n SessionInfo,\n SpawnSessionOptions,\n} from \"./pty-types.js\";\n// Re-export for backward compatibility\nexport { normalizeAgentType } from \"./pty-types.js\";\n\n/**\n * Retrieve the SwarmCoordinator from the PTYService registered on the runtime.\n * Returns undefined if PTYService or coordinator is not available.\n */\nexport function getCoordinator(\n runtime: IAgentRuntime,\n): SwarmCoordinator | undefined {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n return ptyService?.coordinator ?? undefined;\n}\n\nexport class PTYService {\n static serviceType = \"PTY_SERVICE\";\n capabilityDescription =\n \"Manages asynchronous PTY task-agent sessions for open-ended background work\";\n\n private runtime: IAgentRuntime;\n private manager: PTYManager | BunCompatiblePTYManager | null = null;\n private usingBunWorker: boolean = false;\n private serviceConfig: PTYServiceConfig;\n private sessionNames: Map<string, string> = new Map();\n private sessionMetadata: Map<string, Record<string, unknown>> = new Map();\n private sessionWorkdirs: Map<string, string> = new Map();\n private eventCallbacks: SessionEventCallback[] = [];\n private outputUnsubscribers: Map<string, () => void> = new Map();\n private transcriptUnsubscribers: Map<string, () => void> = new Map();\n private sessionOutputBuffers: Map<string, string[]> = new Map();\n private terminalSessionStates: Map<\n string,\n {\n status: SessionInfo[\"status\"];\n createdAt: Date;\n lastActivityAt: Date;\n reason?: string;\n }\n > = new Map();\n private adapterCache: Map<string, BaseCodingAdapter> = new Map();\n /** Tracks the buffer index when a task was sent, so we can capture the response on completion */\n private taskResponseMarkers: Map<string, number> = new Map();\n /** Captures \"Task completion trace\" log entries from worker stderr (rolling, capped at 200) */\n private traceEntries: Array<string | Record<string, unknown>> = [];\n private static readonly MAX_TRACE_ENTRIES = 200;\n /** Lightweight per-agent-type metrics for observability */\n private metricsTracker = new AgentMetricsTracker();\n /** Console bridge for terminal output streaming and buffered hydration */\n consoleBridge: PTYConsoleBridge | null = null;\n /** Swarm coordinator instance (if active). Accessed via getCoordinator(runtime). */\n coordinator: SwarmCoordinator | null = null;\n\n constructor(runtime: IAgentRuntime, config: PTYServiceConfig = {}) {\n this.runtime = runtime;\n this.serviceConfig = {\n maxLogLines: config.maxLogLines ?? 1000,\n debug: config.debug ?? false,\n registerCodingAdapters: config.registerCodingAdapters ?? true,\n maxConcurrentSessions: config.maxConcurrentSessions ?? 8,\n defaultApprovalPreset: config.defaultApprovalPreset ?? \"autonomous\",\n };\n }\n\n static async start(runtime: IAgentRuntime): Promise<PTYService> {\n const config = runtime.getSetting(\"PTY_SERVICE_CONFIG\") as\n | PTYServiceConfig\n | null\n | undefined;\n const service = new PTYService(runtime, config ?? {});\n await service.initialize();\n\n // Wire the SwarmCoordinator — done here instead of plugin init()\n // because ElizaOS calls Service.start() reliably but may not call\n // plugin.init() depending on the registration path.\n // Guard: the framework may call start() more than once — skip if\n // a coordinator is already registered on this runtime.\n const servicesMap = runtime.services as Map<string, Service[]> | undefined;\n const existing = servicesMap?.get?.(\"SWARM_COORDINATOR\");\n if (existing && existing.length > 0) {\n service.coordinator = existing[0] as unknown as SwarmCoordinator;\n logger.info(\"[PTYService] SwarmCoordinator already registered, skipping duplicate start\");\n } else {\n try {\n const coordinator = new SwarmCoordinator(runtime);\n await coordinator.start(service);\n service.coordinator = coordinator;\n\n // Register the coordinator as a discoverable runtime service so\n // server.ts can find it via runtime.getService(\"SWARM_COORDINATOR\")\n // without a hard import from this plugin package.\n // We bypass registerService() (which would call start() again) and\n // write directly to the services map that getService() reads from.\n servicesMap?.set?.(\"SWARM_COORDINATOR\", [coordinator as unknown as Service]);\n\n logger.info(\"[PTYService] SwarmCoordinator wired and started\");\n } catch (err) {\n logger.error(`[PTYService] Failed to wire SwarmCoordinator: ${err}`);\n }\n }\n\n return service;\n }\n\n static async stopRuntime(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (service) {\n await service.stop();\n }\n }\n\n private async initialize(): Promise<void> {\n const result = await initializePTYManager({\n serviceConfig: this.serviceConfig,\n classifyStall: (id, out) => this.classifyStall(id, out),\n emitEvent: (id, event, data) => this.emitEvent(id, event, data),\n handleGeminiAuth: (id) => this.handleGeminiAuth(id),\n sessionOutputBuffers: this.sessionOutputBuffers,\n taskResponseMarkers: this.taskResponseMarkers,\n metricsTracker: this.metricsTracker,\n traceEntries: this.traceEntries,\n maxTraceEntries: PTYService.MAX_TRACE_ENTRIES,\n log: (msg) => this.log(msg),\n handleWorkerExit: (info) => this.handleWorkerExit(info),\n hasActiveTask: (sessionId) => {\n const coordinator = this.coordinator;\n if (!coordinator) return false;\n const taskCtx = coordinator.getTaskContext(sessionId);\n return taskCtx?.status === \"active\";\n },\n hasTaskActivity: (sessionId) => {\n const coordinator = this.coordinator;\n if (!coordinator) return false;\n const taskCtx = coordinator.getTaskContext(sessionId);\n if (!taskCtx) return false;\n // Task has activity if the initial task was delivered (agent started\n // working) OR coordinator made decisions. The taskDelivered flag\n // covers agents that finish without hitting any blocking prompts.\n return taskCtx.taskDelivered || taskCtx.decisions.length > 0;\n },\n markTaskDelivered: (sessionId) => {\n const coordinator = this.coordinator;\n if (!coordinator) return;\n void coordinator.setTaskDelivered(sessionId);\n },\n });\n this.manager = result.manager;\n this.usingBunWorker = result.usingBunWorker;\n\n // Wire console bridge for terminal output streaming / hydration\n try {\n this.consoleBridge = new PTYConsoleBridge(this.manager, {\n maxBufferedCharsPerSession: 100_000,\n });\n this.log(\"PTYConsoleBridge wired\");\n } catch (err) {\n this.log(`Failed to wire PTYConsoleBridge: ${err}`);\n }\n\n this.log(\"PTYService initialized\");\n }\n\n async stop(): Promise<void> {\n // Stop the coordinator if one was wired to this service\n if (this.coordinator) {\n await this.coordinator.stop();\n // Remove from runtime services map\n (this.runtime.services as Map<string, Service[]>).delete(\"SWARM_COORDINATOR\");\n this.coordinator = null;\n }\n\n if (this.consoleBridge) {\n this.consoleBridge.close();\n this.consoleBridge = null;\n }\n\n for (const unsubscribe of this.outputUnsubscribers.values()) {\n unsubscribe();\n }\n this.outputUnsubscribers.clear();\n for (const unsubscribe of this.transcriptUnsubscribers.values()) {\n unsubscribe();\n }\n this.transcriptUnsubscribers.clear();\n\n if (this.manager) {\n await this.manager.shutdown();\n this.manager = null;\n }\n this.sessionMetadata.clear();\n this.sessionNames.clear();\n this.sessionWorkdirs.clear();\n this.sessionOutputBuffers.clear();\n this.log(\"PTYService shutdown complete\");\n }\n\n private generateSessionId(): string {\n return `pty-${Date.now()}-${crypto.randomUUID().slice(0, 8)}`;\n }\n\n /** Build a SessionIOContext from current instance state. */\n private ioContext(): SessionIOContext {\n return {\n manager: this.manager as PTYManager | BunCompatiblePTYManager,\n usingBunWorker: this.usingBunWorker,\n sessionOutputBuffers: this.sessionOutputBuffers,\n taskResponseMarkers: this.taskResponseMarkers,\n outputUnsubscribers: this.outputUnsubscribers,\n };\n }\n\n /**\n * Spawn a new PTY session for a coding agent\n */\n async spawnSession(options: SpawnSessionOptions): Promise<SessionInfo> {\n if (!this.manager) {\n throw new Error(\"PTYService not initialized\");\n }\n\n const piRequested = isPiAgentType(options.agentType);\n const resolvedAgentType: CodingAgentType = piRequested\n ? \"shell\"\n : options.agentType;\n const resolvedInitialTask = piRequested\n ? toPiCommand(options.initialTask)\n : options.initialTask;\n const effectiveApprovalPreset =\n options.approvalPreset ??\n (resolvedAgentType !== \"shell\" ? this.defaultApprovalPreset : undefined);\n\n const maxSessions = this.serviceConfig.maxConcurrentSessions ?? 8;\n const activeSessions = (await this.listSessions()).length;\n if (activeSessions >= maxSessions) {\n throw new Error(`Concurrent session limit reached (${maxSessions})`);\n }\n\n const sessionId = this.generateSessionId();\n const workdir = options.workdir ?? process.cwd();\n\n // Store workdir for later retrieval\n this.sessionWorkdirs.set(sessionId, workdir);\n\n // Write memory content before spawning so the agent reads it on startup\n if (options.memoryContent && resolvedAgentType !== \"shell\") {\n try {\n const writtenPath = await this.writeMemoryFile(\n resolvedAgentType as AdapterType,\n workdir,\n options.memoryContent,\n );\n this.log(`Wrote memory file for ${resolvedAgentType}: ${writtenPath}`);\n } catch (err) {\n this.log(\n `Failed to write memory file for ${resolvedAgentType}: ${err}`,\n );\n }\n }\n\n // Write approval config files to workspace before spawn\n if (effectiveApprovalPreset && resolvedAgentType !== \"shell\") {\n try {\n const written = await this.getAdapter(\n resolvedAgentType as AdapterType,\n ).writeApprovalConfig(workdir, {\n name: options.name,\n type: resolvedAgentType,\n workdir,\n adapterConfig: { approvalPreset: effectiveApprovalPreset },\n } as SpawnConfig);\n this.log(\n `Wrote approval config (${effectiveApprovalPreset}) for ${resolvedAgentType}: ${written.join(\", \")}`,\n );\n } catch (err) {\n this.log(`Failed to write approval config: ${err}`);\n }\n }\n\n // Inject agent-specific settings and HTTP hooks\n const hookUrl = `http://localhost:${(this.runtime.getSetting(\"SERVER_PORT\") as string | undefined) ?? \"2138\"}/api/coding-agents/hooks`;\n\n if (resolvedAgentType === \"claude\") {\n try {\n const settingsPath = join(workdir, \".claude\", \"settings.json\");\n let settings: Record<string, unknown> = {};\n try {\n settings = JSON.parse(await readFile(settingsPath, \"utf-8\"));\n } catch {\n // File may not exist yet\n }\n const permissions =\n (settings.permissions as Record<string, unknown>) ?? {};\n permissions.allowedDirectories = [workdir];\n settings.permissions = permissions;\n\n // Inject HTTP hooks for deterministic state detection.\n // Merge with existing hooks to preserve workspace-owned hook entries.\n const adapter = this.getAdapter(\"claude\");\n const hookProtocol = adapter.getHookTelemetryProtocol({\n httpUrl: hookUrl,\n sessionId,\n });\n if (hookProtocol) {\n const existingHooks = (settings.hooks ?? {}) as Record<string, unknown>;\n settings.hooks = { ...existingHooks, ...hookProtocol.settingsHooks };\n this.log(`Injecting HTTP hooks for session ${sessionId}`);\n }\n\n await mkdir(dirname(settingsPath), { recursive: true });\n await writeFile(\n settingsPath,\n JSON.stringify(settings, null, 2),\n \"utf-8\",\n );\n this.log(`Wrote allowedDirectories [${workdir}] to ${settingsPath}`);\n } catch (err) {\n this.log(`Failed to write Claude settings: ${err}`);\n }\n }\n\n if (resolvedAgentType === \"gemini\") {\n try {\n const settingsPath = join(workdir, \".gemini\", \"settings.json\");\n let settings: Record<string, unknown> = {};\n try {\n settings = JSON.parse(await readFile(settingsPath, \"utf-8\"));\n } catch {\n // File may not exist yet\n }\n\n // Inject command hooks that curl the orchestrator endpoint.\n // Merge with existing hooks to preserve workspace-owned hook entries.\n const adapter = this.getAdapter(\"gemini\");\n const hookProtocol = adapter.getHookTelemetryProtocol({\n httpUrl: hookUrl,\n sessionId,\n });\n if (hookProtocol) {\n const existingHooks = (settings.hooks ?? {}) as Record<string, unknown>;\n settings.hooks = { ...existingHooks, ...hookProtocol.settingsHooks };\n this.log(`Injecting Gemini CLI hooks for session ${sessionId}`);\n }\n\n await mkdir(dirname(settingsPath), { recursive: true });\n await writeFile(\n settingsPath,\n JSON.stringify(settings, null, 2),\n \"utf-8\",\n );\n } catch (err) {\n this.log(`Failed to write Gemini settings: ${err}`);\n }\n }\n\n // Ensure injected config/memory files are gitignored so agents don't\n // commit them. Appends to existing .gitignore if present.\n if (resolvedAgentType !== \"shell\" && workdir !== process.cwd()) {\n await this.ensureOrchestratorGitignore(workdir);\n }\n\n const spawnConfig = buildSpawnConfig(\n sessionId,\n {\n ...options,\n agentType: resolvedAgentType,\n initialTask: resolvedInitialTask,\n approvalPreset: effectiveApprovalPreset,\n },\n workdir,\n );\n const session = await this.manager.spawn(spawnConfig);\n this.terminalSessionStates.delete(session.id);\n this.sessionNames.set(session.id, options.name);\n\n // Store metadata separately (always include agentType for stall classification)\n this.sessionMetadata.set(session.id, {\n ...options.metadata,\n requestedType: options.metadata?.requestedType ?? options.agentType,\n agentType: resolvedAgentType,\n coordinatorManaged: !!options.skipAdapterAutoResponse,\n });\n\n // Build spawn context for delegating to extracted spawn modules\n const ctx = {\n manager: this.manager as PTYManager | BunCompatiblePTYManager,\n usingBunWorker: this.usingBunWorker,\n serviceConfig: this.serviceConfig,\n sessionMetadata: this.sessionMetadata,\n sessionWorkdirs: this.sessionWorkdirs,\n sessionOutputBuffers: this.sessionOutputBuffers,\n outputUnsubscribers: this.outputUnsubscribers,\n taskResponseMarkers: this.taskResponseMarkers,\n getAdapter: (t: AdapterType) => this.getAdapter(t),\n sendToSession: (id: string, input: string) =>\n this.sendToSession(id, input),\n sendKeysToSession: (id: string, keys: string | string[]) =>\n this.sendKeysToSession(id, keys),\n writeRawToSession: async (id: string, data: string) => {\n if (!this.manager) return;\n if (this.usingBunWorker) {\n await (this.manager as BunCompatiblePTYManager).writeRaw(id, data);\n return;\n }\n const ptySession = (this.manager as PTYManager).getSession(id);\n ptySession?.writeRaw(data);\n },\n pushDefaultRules: (id: string, type: string) =>\n this.pushDefaultRules(id, type),\n toSessionInfo: (s: SessionHandle | WorkerSessionHandle, w?: string) =>\n this.toSessionInfo(s, w),\n log: (msg: string) => this.log(msg),\n markTaskDelivered: (sessionId: string) => {\n const coordinator = this.coordinator;\n if (!coordinator) return;\n void coordinator.setTaskDelivered(sessionId);\n },\n };\n\n // Buffer output for Bun worker path (no logs() method available)\n if (this.usingBunWorker) {\n setupOutputBuffer(ctx, session.id);\n }\n\n // Debug capture: open a capture session and wire stdout feed.\n // Capture files persist after the agent is killed for offline analysis.\n if (isDebugCaptureEnabled()) {\n captureSessionOpen(session.id, resolvedAgentType).catch(() => {});\n if (this.usingBunWorker) {\n (this.manager as BunCompatiblePTYManager).onSessionData(\n session.id,\n (data: string) => { captureFeed(session.id, data, \"stdout\"); },\n );\n } else {\n const ptySession = (this.manager as PTYManager).getSession(session.id);\n if (ptySession) {\n ptySession.on(\"output\", (data: string) => {\n captureFeed(session.id, data, \"stdout\");\n });\n }\n }\n }\n\n this.wireTranscriptCapture(session.id);\n\n // Defer initial task until session is ready.\n // IMPORTANT: Set up the listener BEFORE pushDefaultRules (which has a 1500ms sleep),\n // otherwise session_ready fires during pushDefaultRules and the listener misses it.\n if (resolvedInitialTask) {\n setupDeferredTaskDelivery(\n ctx,\n session,\n resolvedInitialTask,\n resolvedAgentType,\n );\n }\n\n await this.pushDefaultRules(session.id, resolvedAgentType);\n this.metricsTracker.get(resolvedAgentType).spawned++;\n this.log(`Spawned session ${session.id} (${resolvedAgentType})`);\n return this.toSessionInfo(session, workdir);\n }\n\n private autoResponseContext() {\n return {\n manager: this.manager as PTYManager | BunCompatiblePTYManager,\n usingBunWorker: this.usingBunWorker,\n runtime: this.runtime,\n log: (msg: string) => this.log(msg),\n };\n }\n\n private async pushDefaultRules(\n sessionId: string,\n agentType: string,\n ): Promise<void> {\n if (!this.manager) return;\n await pushDefaultAutoResponseRules(\n this.autoResponseContext(),\n sessionId,\n agentType,\n );\n }\n\n private async handleGeminiAuth(sessionId: string): Promise<void> {\n await handleGeminiAuthFlow(\n this.autoResponseContext(),\n sessionId,\n (id, keys) => this.sendKeysToSession(id, keys),\n );\n }\n\n async sendToSession(\n sessionId: string,\n input: string,\n ): Promise<SessionMessage | undefined> {\n if (!this.manager) throw new Error(\"PTYService not initialized\");\n captureFeed(sessionId, input, \"stdin\");\n void this.persistTranscript(sessionId, \"stdin\", input);\n return sendToSessionIO(this.ioContext(), sessionId, input);\n }\n\n async sendKeysToSession(\n sessionId: string,\n keys: string | string[],\n ): Promise<void> {\n if (!this.manager) throw new Error(\"PTYService not initialized\");\n const content = Array.isArray(keys) ? keys.join(\",\") : keys;\n void this.persistTranscript(sessionId, \"keys\", content);\n return sendKeysToSessionIO(this.ioContext(), sessionId, keys);\n }\n\n async stopSession(sessionId: string, force = false): Promise<void> {\n if (!this.manager) throw new Error(\"PTYService not initialized\");\n captureLifecycle(sessionId, \"session_stopped\", force ? \"force\" : undefined);\n try {\n return await stopSessionIO(\n this.ioContext(),\n sessionId,\n this.sessionMetadata,\n this.sessionWorkdirs,\n (msg) => this.log(msg),\n force,\n );\n } finally {\n this.clearTranscriptCapture(sessionId);\n }\n }\n\n /** Default approval preset — runtime env var takes precedence over config. */\n get defaultApprovalPreset(): ApprovalPreset {\n const fromEnv = this.runtime.getSetting(\n \"PARALLAX_DEFAULT_APPROVAL_PRESET\",\n ) as string | undefined;\n if (\n fromEnv &&\n [\"readonly\", \"standard\", \"permissive\", \"autonomous\"].includes(fromEnv)\n ) {\n return fromEnv as ApprovalPreset;\n }\n return this.serviceConfig.defaultApprovalPreset ?? \"autonomous\";\n }\n\n /** Agent selection strategy — env var takes precedence. */\n get agentSelectionStrategy(): AgentSelectionStrategy {\n const fromEnv = this.runtime.getSetting(\n \"PARALLAX_AGENT_SELECTION_STRATEGY\",\n ) as string | undefined;\n if (fromEnv && (fromEnv === \"fixed\" || fromEnv === \"ranked\")) {\n return fromEnv;\n }\n return \"fixed\";\n }\n\n /**\n * Default agent type when strategy is \"fixed\".\n * Precedence: config file (`milady.json` env section, written by the UI)\n * > runtime/env setting > \"claude\" fallback.\n */\n get defaultAgentType(): AdapterType {\n const fromConfig = readConfigEnvKey(\"PARALLAX_DEFAULT_AGENT_TYPE\");\n const fromRuntimeOrEnv =\n fromConfig ||\n (this.runtime.getSetting(\"PARALLAX_DEFAULT_AGENT_TYPE\") as\n | string\n | undefined);\n if (\n fromRuntimeOrEnv &&\n [\"claude\", \"gemini\", \"codex\", \"aider\"].includes(\n fromRuntimeOrEnv.toLowerCase(),\n )\n ) {\n return fromRuntimeOrEnv.toLowerCase() as AdapterType;\n }\n return \"claude\";\n }\n\n /**\n * Resolve which agent type to use when the caller didn't specify one.\n *\n * - **fixed**: returns `defaultAgentType` immediately\n * - **ranked**: fetches preflight data, scores installed agents via\n * metrics, and returns the highest scorer\n */\n async resolveAgentType(): Promise<string> {\n const frameworkState = await this.getFrameworkState();\n return frameworkState.preferred.id;\n }\n\n async getFrameworkState(): Promise<TaskAgentFrameworkState> {\n return getTaskAgentFrameworkState(this.runtime, this);\n }\n\n getSession(sessionId: string): SessionInfo | undefined {\n if (!this.manager) return undefined;\n const session = this.manager.get(sessionId);\n if (!session) return this.toTerminalSessionInfo(sessionId);\n return this.toSessionInfo(session, this.sessionWorkdirs.get(sessionId));\n }\n\n async listSessions(filter?: SessionFilter): Promise<SessionInfo[]> {\n if (!this.manager) return [];\n const sessions = this.usingBunWorker\n ? await (this.manager as BunCompatiblePTYManager).list()\n : (this.manager as PTYManager).list(filter);\n const liveSessions = sessions.map((s) =>\n this.toSessionInfo(s, this.sessionWorkdirs.get(s.id)),\n );\n const terminalSessions = Array.from(this.terminalSessionStates.keys())\n .filter((sessionId) => !sessions.some((session) => session.id === sessionId))\n .map((sessionId) => this.toTerminalSessionInfo(sessionId))\n .filter((session): session is SessionInfo => session !== undefined);\n return [...liveSessions, ...terminalSessions];\n }\n\n subscribeToOutput(\n sessionId: string,\n callback: (data: string) => void,\n ): () => void {\n if (!this.manager) throw new Error(\"PTYService not initialized\");\n return subscribeToOutputIO(this.ioContext(), sessionId, callback);\n }\n\n async getSessionOutput(sessionId: string, lines?: number): Promise<string> {\n if (!this.manager) throw new Error(\"PTYService not initialized\");\n return getSessionOutputIO(this.ioContext(), sessionId, lines);\n }\n\n private clearTranscriptCapture(sessionId: string): void {\n const unsubscribe = this.transcriptUnsubscribers.get(sessionId);\n if (unsubscribe) {\n try {\n unsubscribe();\n } catch {\n // Ignore cleanup failures on dead sessions.\n }\n }\n this.transcriptUnsubscribers.delete(sessionId);\n }\n\n private async resolveTaskThreadId(sessionId: string): Promise<string | null> {\n const liveThreadId = this.coordinator?.getTaskContext(sessionId)?.threadId;\n if (liveThreadId) return liveThreadId;\n const metadataThreadId = this.sessionMetadata.get(sessionId)?.threadId;\n if (typeof metadataThreadId === \"string\" && metadataThreadId.trim()) {\n return metadataThreadId;\n }\n return (\n (await this.coordinator?.taskRegistry.findThreadIdBySessionId(sessionId)) ??\n null\n );\n }\n\n private async persistTranscript(\n sessionId: string,\n direction: \"stdout\" | \"stderr\" | \"stdin\" | \"keys\" | \"system\",\n content: string,\n ): Promise<void> {\n if (!content || !this.coordinator) return;\n const threadId = await this.resolveTaskThreadId(sessionId);\n if (!threadId) return;\n await this.coordinator.taskRegistry.recordTranscript({\n threadId,\n sessionId,\n direction,\n content,\n });\n }\n\n private wireTranscriptCapture(sessionId: string): void {\n if (!this.manager) return;\n this.clearTranscriptCapture(sessionId);\n\n if (this.usingBunWorker) {\n const unsubscribe = (this.manager as BunCompatiblePTYManager).onSessionData(\n sessionId,\n (data: string) => {\n void this.persistTranscript(sessionId, \"stdout\", data);\n },\n );\n this.transcriptUnsubscribers.set(sessionId, unsubscribe);\n return;\n }\n\n const ptySession = (this.manager as PTYManager).getSession(sessionId);\n if (\n !ptySession ||\n typeof (ptySession as { on?: unknown }).on !== \"function\" ||\n typeof (ptySession as { off?: unknown }).off !== \"function\"\n ) {\n return;\n }\n const onOutput = (data: string) => {\n void this.persistTranscript(sessionId, \"stdout\", data);\n };\n ptySession.on(\"output\", onOutput);\n this.transcriptUnsubscribers.set(sessionId, () => {\n ptySession.off(\"output\", onOutput);\n });\n }\n\n isSessionBlocked(sessionId: string): boolean {\n const session = this.getSession(sessionId);\n return session?.status === \"authenticating\";\n }\n\n /**\n * Find a PTY session ID by its working directory.\n * Used by the HTTP hooks endpoint to correlate Claude's cwd with our session.\n */\n findSessionIdByCwd(cwd: string): string | undefined {\n for (const [sessionId, workdir] of this.sessionWorkdirs) {\n if (workdir === cwd) return sessionId;\n }\n return undefined;\n }\n\n /**\n * Handle an incoming hook event from Claude Code's HTTP hooks.\n * Translates hook events into PTY service events.\n */\n handleHookEvent(\n sessionId: string,\n event: string,\n data: Record<string, unknown>,\n ): void {\n // Log high-frequency events (tool_running, permission) at debug level;\n // completion events at info level.\n const summary = event === \"tool_running\"\n ? `tool=${(data as { toolName?: string }).toolName ?? \"?\"}`\n : event === \"permission_approved\"\n ? `tool=${(data as { tool?: string }).tool ?? \"?\"}`\n : JSON.stringify(data);\n if (event === \"tool_running\" || event === \"permission_approved\") {\n logger.debug(`[PTYService] Hook event for ${sessionId}: ${event} ${summary}`);\n } else {\n this.log(`Hook event for ${sessionId}: ${event} ${summary}`);\n }\n\n // Forward hook event to the underlying PTY session so it can reset its\n // stall timer and update internal status. Without this, the stall detector\n // runs independently of hooks and can falsely escalate hook-managed sessions.\n if (this.manager && this.usingBunWorker) {\n (this.manager as BunCompatiblePTYManager)\n .notifyHookEvent(sessionId, event)\n .catch((err) =>\n logger.debug(`[PTYService] Failed to forward hook event to session: ${err}`),\n );\n }\n\n switch (event) {\n case \"tool_running\":\n this.emitEvent(sessionId, \"tool_running\", data);\n break;\n case \"task_complete\":\n this.emitEvent(sessionId, \"task_complete\", data);\n break;\n case \"permission_approved\":\n // Permission was auto-approved via PermissionRequest hook.\n // No PTY event needed — the hook response already allowed it.\n break;\n case \"notification\":\n this.emitEvent(sessionId, \"message\", data);\n break;\n case \"session_end\":\n // CLI session is ending — treat as a stopped event so the coordinator\n // and frontend see the session transition to terminal state.\n this.emitEvent(sessionId, \"stopped\", { ...data, reason: \"session_end\" });\n break;\n default:\n break;\n }\n }\n\n async checkAvailableAgents(\n types?: AdapterType[],\n ): Promise<PreflightResult[]> {\n const agentTypes =\n types ?? ([\"claude\", \"gemini\", \"codex\", \"aider\"] as AdapterType[]);\n return checkAdapters(agentTypes);\n }\n\n getSupportedAgentTypes(): CodingAgentType[] {\n return [\"shell\", \"claude\", \"gemini\", \"codex\", \"aider\", \"pi\"];\n }\n\n private async classifyStall(\n sessionId: string,\n recentOutput: string,\n ): Promise<StallClassification | null> {\n const meta = this.sessionMetadata.get(sessionId);\n const agentType = (meta?.agentType as string) ?? \"unknown\";\n\n // For coordinator-managed sessions in autonomous mode: use combined\n // classify+decide in a single LLM call. The suggestedResponse is kept\n // intact so pty-manager auto-responds, and the coordinator receives\n // autoResponded: true — skipping the second LLM call in handleBlocked().\n if (\n meta?.coordinatorManaged &&\n this.coordinator?.getSupervisionLevel() === \"autonomous\"\n ) {\n const taskCtx = this.coordinator.getTaskContext(sessionId);\n if (taskCtx) {\n // Suppress stall classification during the post-send cooldown.\n // The agent is processing coordinator input — the output buffer\n // still contains the previous response, so classifying now would\n // produce a stale \"task_complete\" that triggers cascading follow-ups.\n if (taskCtx.lastInputSentAt) {\n const elapsed = Date.now() - taskCtx.lastInputSentAt;\n if (elapsed < POST_SEND_COOLDOWN_MS) {\n this.log(\n `Suppressing stall classification for ${sessionId} — ` +\n `${Math.round(elapsed / 1000)}s since coordinator sent input`,\n );\n return null;\n }\n }\n return classifyAndDecideForCoordinator({\n sessionId,\n recentOutput,\n agentType,\n buffers: this.sessionOutputBuffers,\n traceEntries: this.traceEntries,\n runtime: this.runtime,\n manager: this.manager,\n metricsTracker: this.metricsTracker,\n debugSnapshots: this.serviceConfig.debug === true,\n log: (msg: string) => this.log(msg),\n taskContext: {\n sessionId: taskCtx.sessionId,\n agentType: taskCtx.agentType,\n label: taskCtx.label,\n originalTask: taskCtx.originalTask,\n workdir: taskCtx.workdir,\n repo: taskCtx.repo,\n },\n decisionHistory: taskCtx.decisions\n .filter((d) => d.decision !== \"auto_resolved\")\n .slice(-5)\n .map((d) => ({\n event: d.event,\n promptText: d.promptText,\n action: d.decision,\n response: d.response,\n reasoning: d.reasoning,\n })),\n });\n }\n }\n\n const classification = await classifyStallOutput({\n sessionId,\n recentOutput,\n agentType,\n buffers: this.sessionOutputBuffers,\n traceEntries: this.traceEntries,\n runtime: this.runtime,\n manager: this.manager,\n metricsTracker: this.metricsTracker,\n debugSnapshots: this.serviceConfig.debug === true,\n log: (msg: string) => this.log(msg),\n });\n\n // When the SwarmCoordinator manages this session (non-autonomous mode),\n // strip suggestedResponse so the PTY worker doesn't auto-respond.\n // The coordinator's LLM decision loop will handle blocked prompts instead.\n if (classification && meta?.coordinatorManaged && classification.suggestedResponse) {\n this.log(\n `Suppressing stall auto-response for coordinator-managed session ${sessionId} ` +\n `(would have sent: \"${classification.suggestedResponse}\")`,\n );\n classification.suggestedResponse = undefined;\n }\n\n return classification;\n }\n\n // ─── Workspace Files ───\n\n private getAdapter(agentType: AdapterType): BaseCodingAdapter {\n let adapter = this.adapterCache.get(agentType);\n if (!adapter) {\n adapter = createAdapter(agentType);\n this.adapterCache.set(agentType, adapter);\n }\n return adapter;\n }\n\n getWorkspaceFiles(agentType: AdapterType): AgentFileDescriptor[] {\n return this.getAdapter(agentType).getWorkspaceFiles();\n }\n\n getMemoryFilePath(agentType: AdapterType): string {\n return this.getAdapter(agentType).memoryFilePath;\n }\n\n getApprovalConfig(\n agentType: AdapterType,\n preset: ApprovalPreset,\n ): ApprovalConfig {\n return generateApprovalConfig(agentType, preset);\n }\n\n async writeMemoryFile(\n agentType: AdapterType,\n workspacePath: string,\n content: string,\n options?: WriteMemoryOptions,\n ): Promise<string> {\n return this.getAdapter(agentType).writeMemoryFile(\n workspacePath,\n content,\n options,\n );\n }\n\n // ─── Gitignore for Orchestrator Files ───\n\n /** Marker comment used to detect orchestrator-managed gitignore entries. */\n private static readonly GITIGNORE_MARKER =\n \"# orchestrator-injected (do not commit agent config/memory files)\";\n\n /** Per-path lock to serialize concurrent gitignore updates for the same workdir. */\n private static gitignoreLocks = new Map<string, Promise<void>>();\n\n /**\n * Ensure that orchestrator-injected files (CLAUDE.md, .claude/, GEMINI.md, etc.)\n * are listed in the workspace .gitignore so agents don't commit them.\n * Appends to an existing .gitignore or creates one. Idempotent — skips if\n * the marker comment is already present. Serialized per-path to prevent\n * duplicate entries from concurrent spawns.\n */\n private async ensureOrchestratorGitignore(\n workdir: string,\n ): Promise<void> {\n const gitignorePath = join(workdir, \".gitignore\");\n\n // Serialize per-path: wait for any in-flight update to the same file.\n const existing_lock = PTYService.gitignoreLocks.get(gitignorePath);\n if (existing_lock) await existing_lock;\n\n const task = this.doEnsureGitignore(gitignorePath, workdir);\n PTYService.gitignoreLocks.set(gitignorePath, task);\n try {\n await task;\n } finally {\n // Only delete if we're still the current holder\n if (PTYService.gitignoreLocks.get(gitignorePath) === task) {\n PTYService.gitignoreLocks.delete(gitignorePath);\n }\n }\n }\n\n private async doEnsureGitignore(\n gitignorePath: string,\n workdir: string,\n ): Promise<void> {\n let existing = \"\";\n try {\n existing = await readFile(gitignorePath, \"utf-8\");\n } catch {\n // No .gitignore yet — we'll create one\n }\n\n // Idempotent: skip if we already added our entries\n if (existing.includes(PTYService.GITIGNORE_MARKER)) return;\n\n // Include all common patterns so multi-agent swarms with mixed types are covered.\n const entries = [\n \"\",\n PTYService.GITIGNORE_MARKER,\n \"CLAUDE.md\",\n \".claude/\",\n \"GEMINI.md\",\n \".gemini/\",\n \".aider*\",\n ];\n\n try {\n if (existing.length === 0) {\n // No .gitignore yet — create with just our entries\n await writeFile(gitignorePath, entries.join(\"\\n\") + \"\\n\", \"utf-8\");\n } else {\n // Append-only to avoid clobbering concurrent edits\n const separator = existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n await appendFile(gitignorePath, separator + entries.join(\"\\n\") + \"\\n\", \"utf-8\");\n }\n } catch (err) {\n this.log(`Failed to update .gitignore in ${workdir}: ${err}`);\n }\n }\n\n // ─── Event & Adapter Registration ───\n\n onSessionEvent(callback: SessionEventCallback): () => void {\n this.eventCallbacks.push(callback);\n return () => {\n const idx = this.eventCallbacks.indexOf(callback);\n if (idx !== -1) this.eventCallbacks.splice(idx, 1);\n };\n }\n\n registerAdapter(adapter: unknown): void {\n if (!this.manager) {\n throw new Error(\"PTYService not initialized\");\n }\n\n if (this.usingBunWorker) {\n this.log(\n \"registerAdapter not available with Bun worker - adapters must be in the worker\",\n );\n return;\n }\n\n (this.manager as PTYManager).registerAdapter(\n adapter as Parameters<PTYManager[\"registerAdapter\"]>[0],\n );\n this.log(`Registered adapter`);\n }\n\n private toSessionInfo(\n session: SessionHandle | WorkerSessionHandle,\n workdir?: string,\n ): SessionInfo {\n const metadata = this.sessionMetadata.get(session.id);\n const requestedType =\n typeof metadata?.requestedType === \"string\"\n ? metadata.requestedType\n : undefined;\n const displayAgentType =\n session.type === \"shell\" && isPiAgentType(requestedType)\n ? \"pi\"\n : session.type;\n return {\n id: session.id,\n name: session.name,\n agentType: displayAgentType,\n workdir: workdir ?? process.cwd(),\n status: session.status,\n createdAt: session.startedAt ? new Date(session.startedAt) : new Date(),\n lastActivityAt: session.lastActivityAt\n ? new Date(session.lastActivityAt)\n : new Date(),\n metadata,\n };\n }\n\n private toTerminalSessionInfo(sessionId: string): SessionInfo | undefined {\n const terminal = this.terminalSessionStates.get(sessionId);\n if (!terminal) return undefined;\n const metadata = this.sessionMetadata.get(sessionId);\n const requestedType =\n typeof metadata?.requestedType === \"string\"\n ? metadata.requestedType\n : undefined;\n const storedAgentType =\n typeof metadata?.agentType === \"string\" ? metadata.agentType : \"unknown\";\n const displayAgentType =\n storedAgentType === \"shell\" && isPiAgentType(requestedType)\n ? \"pi\"\n : storedAgentType;\n return {\n id: sessionId,\n name:\n this.sessionNames.get(sessionId) ?? sessionId,\n agentType: displayAgentType,\n workdir: this.sessionWorkdirs.get(sessionId) ?? process.cwd(),\n status: terminal.status,\n createdAt: terminal.createdAt,\n lastActivityAt: terminal.lastActivityAt,\n metadata,\n };\n }\n\n private emitEvent(sessionId: string, event: string, data: unknown): void {\n if (event === \"stopped\" || event === \"error\") {\n const liveSession = this.manager?.get(sessionId);\n const createdAt =\n liveSession?.startedAt instanceof Date\n ? liveSession.startedAt\n : liveSession?.startedAt\n ? new Date(liveSession.startedAt)\n : new Date();\n const lastActivityAt =\n liveSession?.lastActivityAt instanceof Date\n ? liveSession.lastActivityAt\n : liveSession?.lastActivityAt\n ? new Date(liveSession.lastActivityAt)\n : new Date();\n const reason =\n event === \"stopped\"\n ? (data as { reason?: string } | undefined)?.reason\n : (data as { message?: string } | undefined)?.message;\n this.terminalSessionStates.set(sessionId, {\n status: event,\n createdAt,\n lastActivityAt,\n reason,\n });\n }\n\n for (const callback of this.eventCallbacks) {\n try {\n callback(sessionId, event, data);\n } catch (err) {\n this.log(`Event callback error: ${err}`);\n }\n }\n }\n\n // ─── Metrics ───\n\n getAgentMetrics() {\n return this.metricsTracker.getAll();\n }\n\n private log(message: string): void {\n logger.debug(`[PTYService] ${message}`);\n }\n\n private handleWorkerExit(info: {\n code: number | null;\n signal: string | null;\n }): void {\n const trackedSessionIds = new Set([\n ...this.sessionMetadata.keys(),\n ...this.sessionWorkdirs.keys(),\n ]);\n if (trackedSessionIds.size === 0) {\n return;\n }\n\n const reason = info.signal\n ? `PTY worker exited unexpectedly (signal ${info.signal})`\n : `PTY worker exited unexpectedly (code ${info.code ?? \"unknown\"})`;\n\n for (const sessionId of trackedSessionIds) {\n const terminalState = this.terminalSessionStates.get(sessionId);\n if (\n terminalState?.status === \"stopped\" ||\n terminalState?.status === \"error\"\n ) {\n continue;\n }\n this.emitEvent(sessionId, \"error\", {\n message: reason,\n workerExit: info,\n });\n }\n }\n}\n",
|
|
42
|
+
"/** @module services/pty-service */\n\nimport { appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type IAgentRuntime, logger, type Service } from \"@elizaos/core\";\nimport {\n type AdapterType,\n type AgentFileDescriptor,\n type ApprovalConfig,\n type ApprovalPreset,\n type BaseCodingAdapter,\n checkAdapters,\n createAdapter,\n generateApprovalConfig,\n type PreflightResult,\n type WriteMemoryOptions,\n} from \"coding-agent-adapters\";\nimport { PTYConsoleBridge } from \"pty-console\";\nimport type {\n BunCompatiblePTYManager,\n PTYManager,\n SessionFilter,\n SessionHandle,\n SessionMessage,\n SpawnConfig,\n StallClassification,\n WorkerSessionHandle,\n} from \"pty-manager\";\nimport { AgentMetricsTracker } from \"./agent-metrics.js\";\nimport type { AgentSelectionStrategy } from \"./agent-selection.js\";\nimport { readConfigEnvKey } from \"./config-env.js\";\nimport {\n captureFeed,\n captureLifecycle,\n captureSessionOpen,\n isDebugCaptureEnabled,\n} from \"./debug-capture.js\";\nimport {\n handleGeminiAuth as handleGeminiAuthFlow,\n pushDefaultRules as pushDefaultAutoResponseRules,\n} from \"./pty-auto-response.js\";\nimport { initializePTYManager } from \"./pty-init.js\";\nimport {\n getSessionOutput as getSessionOutputIO,\n type SessionIOContext,\n sendKeysToSession as sendKeysToSessionIO,\n sendToSession as sendToSessionIO,\n stopSession as stopSessionIO,\n subscribeToOutput as subscribeToOutputIO,\n} from \"./pty-session-io.js\";\nimport {\n buildSpawnConfig,\n setupDeferredTaskDelivery,\n setupOutputBuffer,\n} from \"./pty-spawn.js\";\nimport type {\n CodingAgentType,\n PTYServiceConfig,\n SessionEventCallback,\n SessionInfo,\n SpawnSessionOptions,\n} from \"./pty-types.js\";\nimport { isPiAgentType, toPiCommand } from \"./pty-types.js\";\nimport {\n classifyAndDecideForCoordinator,\n classifyStallOutput,\n} from \"./stall-classifier.js\";\nimport { SwarmCoordinator } from \"./swarm-coordinator.js\";\nimport { POST_SEND_COOLDOWN_MS } from \"./swarm-decision-loop.js\";\nimport {\n getTaskAgentFrameworkState,\n type TaskAgentFrameworkState,\n} from \"./task-agent-frameworks.js\";\n\nexport type {\n CodingAgentType,\n PTYServiceConfig,\n SessionEventName,\n SessionInfo,\n SpawnSessionOptions,\n} from \"./pty-types.js\";\n// Re-export for backward compatibility\nexport { normalizeAgentType } from \"./pty-types.js\";\n\n/**\n * Retrieve the SwarmCoordinator from the PTYService registered on the runtime.\n * Returns undefined if PTYService or coordinator is not available.\n */\nexport function getCoordinator(\n runtime: IAgentRuntime,\n): SwarmCoordinator | undefined {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n return ptyService?.coordinator ?? undefined;\n}\n\nexport class PTYService {\n static serviceType = \"PTY_SERVICE\";\n capabilityDescription =\n \"Manages asynchronous PTY task-agent sessions for open-ended background work\";\n\n private runtime: IAgentRuntime;\n private manager: PTYManager | BunCompatiblePTYManager | null = null;\n private usingBunWorker: boolean = false;\n private serviceConfig: PTYServiceConfig;\n private sessionNames: Map<string, string> = new Map();\n private sessionMetadata: Map<string, Record<string, unknown>> = new Map();\n private sessionWorkdirs: Map<string, string> = new Map();\n private eventCallbacks: SessionEventCallback[] = [];\n private outputUnsubscribers: Map<string, () => void> = new Map();\n private transcriptUnsubscribers: Map<string, () => void> = new Map();\n private sessionOutputBuffers: Map<string, string[]> = new Map();\n private terminalSessionStates: Map<\n string,\n {\n status: SessionInfo[\"status\"];\n createdAt: Date;\n lastActivityAt: Date;\n reason?: string;\n }\n > = new Map();\n private adapterCache: Map<string, BaseCodingAdapter> = new Map();\n /** Tracks the buffer index when a task was sent, so we can capture the response on completion */\n private taskResponseMarkers: Map<string, number> = new Map();\n /** Captures \"Task completion trace\" log entries from worker stderr (rolling, capped at 200) */\n private traceEntries: Array<string | Record<string, unknown>> = [];\n private static readonly MAX_TRACE_ENTRIES = 200;\n /** Lightweight per-agent-type metrics for observability */\n private metricsTracker = new AgentMetricsTracker();\n /** Console bridge for terminal output streaming and buffered hydration */\n consoleBridge: PTYConsoleBridge | null = null;\n /** Swarm coordinator instance (if active). Accessed via getCoordinator(runtime). */\n coordinator: SwarmCoordinator | null = null;\n\n constructor(runtime: IAgentRuntime, config: PTYServiceConfig = {}) {\n this.runtime = runtime;\n this.serviceConfig = {\n maxLogLines: config.maxLogLines ?? 1000,\n debug: config.debug ?? false,\n registerCodingAdapters: config.registerCodingAdapters ?? true,\n maxConcurrentSessions: config.maxConcurrentSessions ?? 8,\n defaultApprovalPreset: config.defaultApprovalPreset ?? \"autonomous\",\n };\n }\n\n static async start(runtime: IAgentRuntime): Promise<PTYService> {\n const config = runtime.getSetting(\"PTY_SERVICE_CONFIG\") as\n | PTYServiceConfig\n | null\n | undefined;\n const service = new PTYService(runtime, config ?? {});\n await service.initialize();\n\n // Wire the SwarmCoordinator — done here instead of plugin init()\n // because ElizaOS calls Service.start() reliably but may not call\n // plugin.init() depending on the registration path.\n // Guard: the framework may call start() more than once — skip if\n // a coordinator is already registered on this runtime.\n const servicesMap = runtime.services as Map<string, Service[]> | undefined;\n const existing = servicesMap?.get?.(\"SWARM_COORDINATOR\");\n if (existing && existing.length > 0) {\n service.coordinator = existing[0] as unknown as SwarmCoordinator;\n logger.info(\n \"[PTYService] SwarmCoordinator already registered, skipping duplicate start\",\n );\n } else {\n try {\n const coordinator = new SwarmCoordinator(runtime);\n await coordinator.start(service);\n service.coordinator = coordinator;\n\n // Register the coordinator as a discoverable runtime service so\n // server.ts can find it via runtime.getService(\"SWARM_COORDINATOR\")\n // without a hard import from this plugin package.\n // We bypass registerService() (which would call start() again) and\n // write directly to the services map that getService() reads from.\n servicesMap?.set?.(\"SWARM_COORDINATOR\", [\n coordinator as unknown as Service,\n ]);\n\n logger.info(\"[PTYService] SwarmCoordinator wired and started\");\n } catch (err) {\n logger.error(`[PTYService] Failed to wire SwarmCoordinator: ${err}`);\n }\n }\n\n return service;\n }\n\n static async stopRuntime(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (service) {\n await service.stop();\n }\n }\n\n private async initialize(): Promise<void> {\n const result = await initializePTYManager({\n serviceConfig: this.serviceConfig,\n classifyStall: (id, out) => this.classifyStall(id, out),\n emitEvent: (id, event, data) => this.emitEvent(id, event, data),\n handleGeminiAuth: (id) => this.handleGeminiAuth(id),\n sessionOutputBuffers: this.sessionOutputBuffers,\n taskResponseMarkers: this.taskResponseMarkers,\n metricsTracker: this.metricsTracker,\n traceEntries: this.traceEntries,\n maxTraceEntries: PTYService.MAX_TRACE_ENTRIES,\n log: (msg) => this.log(msg),\n handleWorkerExit: (info) => this.handleWorkerExit(info),\n hasActiveTask: (sessionId) => {\n const coordinator = this.coordinator;\n if (!coordinator) return false;\n const taskCtx = coordinator.getTaskContext(sessionId);\n return taskCtx?.status === \"active\";\n },\n hasTaskActivity: (sessionId) => {\n const coordinator = this.coordinator;\n if (!coordinator) return false;\n const taskCtx = coordinator.getTaskContext(sessionId);\n if (!taskCtx) return false;\n // Task has activity if the initial task was delivered (agent started\n // working) OR coordinator made decisions. The taskDelivered flag\n // covers agents that finish without hitting any blocking prompts.\n return taskCtx.taskDelivered || taskCtx.decisions.length > 0;\n },\n markTaskDelivered: (sessionId) => {\n const coordinator = this.coordinator;\n if (!coordinator) return;\n void coordinator.setTaskDelivered(sessionId);\n },\n });\n this.manager = result.manager;\n this.usingBunWorker = result.usingBunWorker;\n\n // Wire console bridge for terminal output streaming / hydration\n try {\n this.consoleBridge = new PTYConsoleBridge(this.manager, {\n maxBufferedCharsPerSession: 100_000,\n });\n this.log(\"PTYConsoleBridge wired\");\n } catch (err) {\n this.log(`Failed to wire PTYConsoleBridge: ${err}`);\n }\n\n this.log(\"PTYService initialized\");\n }\n\n async stop(): Promise<void> {\n // Stop the coordinator if one was wired to this service\n if (this.coordinator) {\n await this.coordinator.stop();\n // Remove from runtime services map\n (this.runtime.services as Map<string, Service[]>).delete(\n \"SWARM_COORDINATOR\",\n );\n this.coordinator = null;\n }\n\n if (this.consoleBridge) {\n this.consoleBridge.close();\n this.consoleBridge = null;\n }\n\n for (const unsubscribe of this.outputUnsubscribers.values()) {\n unsubscribe();\n }\n this.outputUnsubscribers.clear();\n for (const unsubscribe of this.transcriptUnsubscribers.values()) {\n unsubscribe();\n }\n this.transcriptUnsubscribers.clear();\n\n if (this.manager) {\n await this.manager.shutdown();\n this.manager = null;\n }\n this.sessionMetadata.clear();\n this.sessionNames.clear();\n this.sessionWorkdirs.clear();\n this.sessionOutputBuffers.clear();\n this.log(\"PTYService shutdown complete\");\n }\n\n private generateSessionId(): string {\n return `pty-${Date.now()}-${crypto.randomUUID().slice(0, 8)}`;\n }\n\n /** Build a SessionIOContext from current instance state. */\n private ioContext(): SessionIOContext {\n return {\n manager: this.manager as PTYManager | BunCompatiblePTYManager,\n usingBunWorker: this.usingBunWorker,\n sessionOutputBuffers: this.sessionOutputBuffers,\n taskResponseMarkers: this.taskResponseMarkers,\n outputUnsubscribers: this.outputUnsubscribers,\n };\n }\n\n /**\n * Spawn a new PTY session for a coding agent\n */\n async spawnSession(options: SpawnSessionOptions): Promise<SessionInfo> {\n if (!this.manager) {\n throw new Error(\"PTYService not initialized\");\n }\n\n const piRequested = isPiAgentType(options.agentType);\n const resolvedAgentType: CodingAgentType = piRequested\n ? \"shell\"\n : options.agentType;\n const resolvedInitialTask = piRequested\n ? toPiCommand(options.initialTask)\n : options.initialTask;\n const effectiveApprovalPreset =\n options.approvalPreset ??\n (resolvedAgentType !== \"shell\" ? this.defaultApprovalPreset : undefined);\n\n const maxSessions = this.serviceConfig.maxConcurrentSessions ?? 8;\n const activeSessions = (await this.listSessions()).length;\n if (activeSessions >= maxSessions) {\n throw new Error(`Concurrent session limit reached (${maxSessions})`);\n }\n\n const sessionId = this.generateSessionId();\n const workdir = options.workdir ?? process.cwd();\n\n // Store workdir for later retrieval\n this.sessionWorkdirs.set(sessionId, workdir);\n\n // Write memory content before spawning so the agent reads it on startup\n if (options.memoryContent && resolvedAgentType !== \"shell\") {\n try {\n const writtenPath = await this.writeMemoryFile(\n resolvedAgentType as AdapterType,\n workdir,\n options.memoryContent,\n );\n this.log(`Wrote memory file for ${resolvedAgentType}: ${writtenPath}`);\n } catch (err) {\n this.log(\n `Failed to write memory file for ${resolvedAgentType}: ${err}`,\n );\n }\n }\n\n // Write approval config files to workspace before spawn\n if (effectiveApprovalPreset && resolvedAgentType !== \"shell\") {\n try {\n const written = await this.getAdapter(\n resolvedAgentType as AdapterType,\n ).writeApprovalConfig(workdir, {\n name: options.name,\n type: resolvedAgentType,\n workdir,\n adapterConfig: { approvalPreset: effectiveApprovalPreset },\n } as SpawnConfig);\n this.log(\n `Wrote approval config (${effectiveApprovalPreset}) for ${resolvedAgentType}: ${written.join(\", \")}`,\n );\n } catch (err) {\n this.log(`Failed to write approval config: ${err}`);\n }\n }\n\n // Inject agent-specific settings and HTTP hooks\n const hookUrl = `http://localhost:${(this.runtime.getSetting(\"SERVER_PORT\") as string | undefined) ?? \"2138\"}/api/coding-agents/hooks`;\n\n if (resolvedAgentType === \"claude\") {\n try {\n const settingsPath = join(workdir, \".claude\", \"settings.json\");\n let settings: Record<string, unknown> = {};\n try {\n settings = JSON.parse(await readFile(settingsPath, \"utf-8\"));\n } catch {\n // File may not exist yet\n }\n const permissions =\n (settings.permissions as Record<string, unknown>) ?? {};\n permissions.allowedDirectories = [workdir];\n settings.permissions = permissions;\n\n // Inject HTTP hooks for deterministic state detection.\n // Merge with existing hooks to preserve workspace-owned hook entries.\n const adapter = this.getAdapter(\"claude\");\n const hookProtocol = adapter.getHookTelemetryProtocol({\n httpUrl: hookUrl,\n sessionId,\n });\n if (hookProtocol) {\n const existingHooks = (settings.hooks ?? {}) as Record<\n string,\n unknown\n >;\n settings.hooks = { ...existingHooks, ...hookProtocol.settingsHooks };\n this.log(`Injecting HTTP hooks for session ${sessionId}`);\n }\n\n await mkdir(dirname(settingsPath), { recursive: true });\n await writeFile(\n settingsPath,\n JSON.stringify(settings, null, 2),\n \"utf-8\",\n );\n this.log(`Wrote allowedDirectories [${workdir}] to ${settingsPath}`);\n } catch (err) {\n this.log(`Failed to write Claude settings: ${err}`);\n }\n }\n\n if (resolvedAgentType === \"gemini\") {\n try {\n const settingsPath = join(workdir, \".gemini\", \"settings.json\");\n let settings: Record<string, unknown> = {};\n try {\n settings = JSON.parse(await readFile(settingsPath, \"utf-8\"));\n } catch {\n // File may not exist yet\n }\n\n // Inject command hooks that curl the orchestrator endpoint.\n // Merge with existing hooks to preserve workspace-owned hook entries.\n const adapter = this.getAdapter(\"gemini\");\n const hookProtocol = adapter.getHookTelemetryProtocol({\n httpUrl: hookUrl,\n sessionId,\n });\n if (hookProtocol) {\n const existingHooks = (settings.hooks ?? {}) as Record<\n string,\n unknown\n >;\n settings.hooks = { ...existingHooks, ...hookProtocol.settingsHooks };\n this.log(`Injecting Gemini CLI hooks for session ${sessionId}`);\n }\n\n await mkdir(dirname(settingsPath), { recursive: true });\n await writeFile(\n settingsPath,\n JSON.stringify(settings, null, 2),\n \"utf-8\",\n );\n } catch (err) {\n this.log(`Failed to write Gemini settings: ${err}`);\n }\n }\n\n // Ensure injected config/memory files are gitignored so agents don't\n // commit them. Appends to existing .gitignore if present.\n if (resolvedAgentType !== \"shell\" && workdir !== process.cwd()) {\n await this.ensureOrchestratorGitignore(workdir);\n }\n\n const spawnConfig = buildSpawnConfig(\n sessionId,\n {\n ...options,\n agentType: resolvedAgentType,\n initialTask: resolvedInitialTask,\n approvalPreset: effectiveApprovalPreset,\n },\n workdir,\n );\n // DEBUG: log credentials reaching the spawn (remove after fixing cloud)\n {\n const ac = spawnConfig.adapterConfig as\n | Record<string, unknown>\n | undefined;\n const mask = (v: unknown) =>\n typeof v === \"string\" && v.length > 12\n ? `${v.slice(0, 8)}...${v.slice(-4)}`\n : String(v);\n const parts: string[] = [];\n if (ac?.anthropicKey) parts.push(`anthropicKey=${mask(ac.anthropicKey)}`);\n if (ac?.anthropicBaseUrl)\n parts.push(`anthropicBaseUrl=${ac.anthropicBaseUrl}`);\n if (ac?.openaiKey) parts.push(`openaiKey=${mask(ac.openaiKey)}`);\n if (ac?.openaiBaseUrl) parts.push(`openaiBaseUrl=${ac.openaiBaseUrl}`);\n this.log(\n `[DEBUG] PTY spawn ${resolvedAgentType} adapterConfig credentials: ${parts.join(\", \") || \"(none)\"}`,\n );\n }\n const session = await this.manager.spawn(spawnConfig);\n this.terminalSessionStates.delete(session.id);\n this.sessionNames.set(session.id, options.name);\n\n // Store metadata separately (always include agentType for stall classification)\n this.sessionMetadata.set(session.id, {\n ...options.metadata,\n requestedType: options.metadata?.requestedType ?? options.agentType,\n agentType: resolvedAgentType,\n coordinatorManaged: !!options.skipAdapterAutoResponse,\n });\n\n // Build spawn context for delegating to extracted spawn modules\n const ctx = {\n manager: this.manager as PTYManager | BunCompatiblePTYManager,\n usingBunWorker: this.usingBunWorker,\n serviceConfig: this.serviceConfig,\n sessionMetadata: this.sessionMetadata,\n sessionWorkdirs: this.sessionWorkdirs,\n sessionOutputBuffers: this.sessionOutputBuffers,\n outputUnsubscribers: this.outputUnsubscribers,\n taskResponseMarkers: this.taskResponseMarkers,\n getAdapter: (t: AdapterType) => this.getAdapter(t),\n sendToSession: (id: string, input: string) =>\n this.sendToSession(id, input),\n sendKeysToSession: (id: string, keys: string | string[]) =>\n this.sendKeysToSession(id, keys),\n writeRawToSession: async (id: string, data: string) => {\n if (!this.manager) return;\n if (this.usingBunWorker) {\n await (this.manager as BunCompatiblePTYManager).writeRaw(id, data);\n return;\n }\n const ptySession = (this.manager as PTYManager).getSession(id);\n ptySession?.writeRaw(data);\n },\n pushDefaultRules: (id: string, type: string) =>\n this.pushDefaultRules(id, type),\n toSessionInfo: (s: SessionHandle | WorkerSessionHandle, w?: string) =>\n this.toSessionInfo(s, w),\n log: (msg: string) => this.log(msg),\n markTaskDelivered: (sessionId: string) => {\n const coordinator = this.coordinator;\n if (!coordinator) return;\n void coordinator.setTaskDelivered(sessionId);\n },\n };\n\n // Buffer output for Bun worker path (no logs() method available)\n if (this.usingBunWorker) {\n setupOutputBuffer(ctx, session.id);\n }\n\n // Debug capture: open a capture session and wire stdout feed.\n // Capture files persist after the agent is killed for offline analysis.\n if (isDebugCaptureEnabled()) {\n captureSessionOpen(session.id, resolvedAgentType).catch(() => {});\n if (this.usingBunWorker) {\n (this.manager as BunCompatiblePTYManager).onSessionData(\n session.id,\n (data: string) => {\n captureFeed(session.id, data, \"stdout\");\n },\n );\n } else {\n const ptySession = (this.manager as PTYManager).getSession(session.id);\n if (ptySession) {\n ptySession.on(\"output\", (data: string) => {\n captureFeed(session.id, data, \"stdout\");\n });\n }\n }\n }\n\n this.wireTranscriptCapture(session.id);\n\n // Defer initial task until session is ready.\n // IMPORTANT: Set up the listener BEFORE pushDefaultRules (which has a 1500ms sleep),\n // otherwise session_ready fires during pushDefaultRules and the listener misses it.\n if (resolvedInitialTask) {\n setupDeferredTaskDelivery(\n ctx,\n session,\n resolvedInitialTask,\n resolvedAgentType,\n );\n }\n\n await this.pushDefaultRules(session.id, resolvedAgentType);\n this.metricsTracker.get(resolvedAgentType).spawned++;\n this.log(`Spawned session ${session.id} (${resolvedAgentType})`);\n return this.toSessionInfo(session, workdir);\n }\n\n private autoResponseContext() {\n return {\n manager: this.manager as PTYManager | BunCompatiblePTYManager,\n usingBunWorker: this.usingBunWorker,\n runtime: this.runtime,\n log: (msg: string) => this.log(msg),\n };\n }\n\n private async pushDefaultRules(\n sessionId: string,\n agentType: string,\n ): Promise<void> {\n if (!this.manager) return;\n await pushDefaultAutoResponseRules(\n this.autoResponseContext(),\n sessionId,\n agentType,\n );\n }\n\n private async handleGeminiAuth(sessionId: string): Promise<void> {\n await handleGeminiAuthFlow(\n this.autoResponseContext(),\n sessionId,\n (id, keys) => this.sendKeysToSession(id, keys),\n );\n }\n\n async sendToSession(\n sessionId: string,\n input: string,\n ): Promise<SessionMessage | undefined> {\n if (!this.manager) throw new Error(\"PTYService not initialized\");\n captureFeed(sessionId, input, \"stdin\");\n void this.persistTranscript(sessionId, \"stdin\", input);\n return sendToSessionIO(this.ioContext(), sessionId, input);\n }\n\n async sendKeysToSession(\n sessionId: string,\n keys: string | string[],\n ): Promise<void> {\n if (!this.manager) throw new Error(\"PTYService not initialized\");\n const content = Array.isArray(keys) ? keys.join(\",\") : keys;\n void this.persistTranscript(sessionId, \"keys\", content);\n return sendKeysToSessionIO(this.ioContext(), sessionId, keys);\n }\n\n async stopSession(sessionId: string, force = false): Promise<void> {\n if (!this.manager) throw new Error(\"PTYService not initialized\");\n captureLifecycle(sessionId, \"session_stopped\", force ? \"force\" : undefined);\n try {\n return await stopSessionIO(\n this.ioContext(),\n sessionId,\n this.sessionMetadata,\n this.sessionWorkdirs,\n (msg) => this.log(msg),\n force,\n );\n } finally {\n this.clearTranscriptCapture(sessionId);\n }\n }\n\n /** Default approval preset — runtime env var takes precedence over config. */\n get defaultApprovalPreset(): ApprovalPreset {\n const fromEnv = this.runtime.getSetting(\n \"PARALLAX_DEFAULT_APPROVAL_PRESET\",\n ) as string | undefined;\n if (\n fromEnv &&\n [\"readonly\", \"standard\", \"permissive\", \"autonomous\"].includes(fromEnv)\n ) {\n return fromEnv as ApprovalPreset;\n }\n return this.serviceConfig.defaultApprovalPreset ?? \"autonomous\";\n }\n\n /** Agent selection strategy — env var takes precedence. */\n get agentSelectionStrategy(): AgentSelectionStrategy {\n const fromEnv = this.runtime.getSetting(\n \"PARALLAX_AGENT_SELECTION_STRATEGY\",\n ) as string | undefined;\n if (fromEnv && (fromEnv === \"fixed\" || fromEnv === \"ranked\")) {\n return fromEnv;\n }\n return \"fixed\";\n }\n\n /**\n * Default agent type when strategy is \"fixed\".\n * Precedence: config file (`milady.json` env section, written by the UI)\n * > runtime/env setting > \"claude\" fallback.\n */\n get defaultAgentType(): AdapterType {\n const fromConfig = readConfigEnvKey(\"PARALLAX_DEFAULT_AGENT_TYPE\");\n const fromRuntimeOrEnv =\n fromConfig ||\n (this.runtime.getSetting(\"PARALLAX_DEFAULT_AGENT_TYPE\") as\n | string\n | undefined);\n if (\n fromRuntimeOrEnv &&\n [\"claude\", \"gemini\", \"codex\", \"aider\"].includes(\n fromRuntimeOrEnv.toLowerCase(),\n )\n ) {\n return fromRuntimeOrEnv.toLowerCase() as AdapterType;\n }\n return \"claude\";\n }\n\n /**\n * Resolve which agent type to use when the caller didn't specify one.\n *\n * - **fixed**: returns `defaultAgentType` immediately\n * - **ranked**: fetches preflight data, scores installed agents via\n * metrics, and returns the highest scorer\n */\n async resolveAgentType(): Promise<string> {\n const frameworkState = await this.getFrameworkState();\n return frameworkState.preferred.id;\n }\n\n async getFrameworkState(): Promise<TaskAgentFrameworkState> {\n return getTaskAgentFrameworkState(this.runtime, this);\n }\n\n getSession(sessionId: string): SessionInfo | undefined {\n if (!this.manager) return undefined;\n const session = this.manager.get(sessionId);\n if (!session) return this.toTerminalSessionInfo(sessionId);\n return this.toSessionInfo(session, this.sessionWorkdirs.get(sessionId));\n }\n\n async listSessions(filter?: SessionFilter): Promise<SessionInfo[]> {\n if (!this.manager) return [];\n const sessions = this.usingBunWorker\n ? await (this.manager as BunCompatiblePTYManager).list()\n : (this.manager as PTYManager).list(filter);\n const liveSessions = sessions.map((s) =>\n this.toSessionInfo(s, this.sessionWorkdirs.get(s.id)),\n );\n const terminalSessions = Array.from(this.terminalSessionStates.keys())\n .filter(\n (sessionId) => !sessions.some((session) => session.id === sessionId),\n )\n .map((sessionId) => this.toTerminalSessionInfo(sessionId))\n .filter((session): session is SessionInfo => session !== undefined);\n return [...liveSessions, ...terminalSessions];\n }\n\n subscribeToOutput(\n sessionId: string,\n callback: (data: string) => void,\n ): () => void {\n if (!this.manager) throw new Error(\"PTYService not initialized\");\n return subscribeToOutputIO(this.ioContext(), sessionId, callback);\n }\n\n async getSessionOutput(sessionId: string, lines?: number): Promise<string> {\n if (!this.manager) throw new Error(\"PTYService not initialized\");\n return getSessionOutputIO(this.ioContext(), sessionId, lines);\n }\n\n /**\n * Whether the adapter currently classifies the session as actively\n * processing work (e.g. Codex's \"esc to interrupt\" status row).\n *\n * The swarm idle watchdog consults this before assuming a session is\n * idle based on output byte diffs, which are fooled by TUIs that\n * redraw the same status row in place via cursor positioning.\n *\n * Returns `false` for unknown sessions or adapters that don't\n * implement `detectLoading`. For Bun-compat mode this round-trips to\n * the worker; for in-process mode it reads the session directly.\n */\n async isSessionLoading(sessionId: string): Promise<boolean> {\n if (!this.manager) return false;\n if (this.usingBunWorker) {\n return (this.manager as BunCompatiblePTYManager).isSessionLoading(\n sessionId,\n );\n }\n return (this.manager as PTYManager).isSessionLoading(sessionId);\n }\n\n private clearTranscriptCapture(sessionId: string): void {\n const unsubscribe = this.transcriptUnsubscribers.get(sessionId);\n if (unsubscribe) {\n try {\n unsubscribe();\n } catch {\n // Ignore cleanup failures on dead sessions.\n }\n }\n this.transcriptUnsubscribers.delete(sessionId);\n }\n\n private async resolveTaskThreadId(sessionId: string): Promise<string | null> {\n const liveThreadId = this.coordinator?.getTaskContext(sessionId)?.threadId;\n if (liveThreadId) return liveThreadId;\n const metadataThreadId = this.sessionMetadata.get(sessionId)?.threadId;\n if (typeof metadataThreadId === \"string\" && metadataThreadId.trim()) {\n return metadataThreadId;\n }\n return (\n (await this.coordinator?.taskRegistry.findThreadIdBySessionId(\n sessionId,\n )) ?? null\n );\n }\n\n private async persistTranscript(\n sessionId: string,\n direction: \"stdout\" | \"stderr\" | \"stdin\" | \"keys\" | \"system\",\n content: string,\n ): Promise<void> {\n if (!content || !this.coordinator) return;\n const threadId = await this.resolveTaskThreadId(sessionId);\n if (!threadId) return;\n await this.coordinator.taskRegistry.recordTranscript({\n threadId,\n sessionId,\n direction,\n content,\n });\n }\n\n private wireTranscriptCapture(sessionId: string): void {\n if (!this.manager) return;\n this.clearTranscriptCapture(sessionId);\n\n if (this.usingBunWorker) {\n const unsubscribe = (\n this.manager as BunCompatiblePTYManager\n ).onSessionData(sessionId, (data: string) => {\n void this.persistTranscript(sessionId, \"stdout\", data);\n });\n this.transcriptUnsubscribers.set(sessionId, unsubscribe);\n return;\n }\n\n const ptySession = (this.manager as PTYManager).getSession(sessionId);\n if (\n !ptySession ||\n typeof (ptySession as { on?: unknown }).on !== \"function\" ||\n typeof (ptySession as { off?: unknown }).off !== \"function\"\n ) {\n return;\n }\n const onOutput = (data: string) => {\n void this.persistTranscript(sessionId, \"stdout\", data);\n };\n ptySession.on(\"output\", onOutput);\n this.transcriptUnsubscribers.set(sessionId, () => {\n ptySession.off(\"output\", onOutput);\n });\n }\n\n isSessionBlocked(sessionId: string): boolean {\n const session = this.getSession(sessionId);\n return session?.status === \"authenticating\";\n }\n\n /**\n * Find a PTY session ID by its working directory.\n * Used by the HTTP hooks endpoint to correlate Claude's cwd with our session.\n */\n findSessionIdByCwd(cwd: string): string | undefined {\n for (const [sessionId, workdir] of this.sessionWorkdirs) {\n if (workdir === cwd) return sessionId;\n }\n return undefined;\n }\n\n /**\n * Handle an incoming hook event from Claude Code's HTTP hooks.\n * Translates hook events into PTY service events.\n */\n handleHookEvent(\n sessionId: string,\n event: string,\n data: Record<string, unknown>,\n ): void {\n // Log high-frequency events (tool_running, permission) at debug level;\n // completion events at info level.\n const summary =\n event === \"tool_running\"\n ? `tool=${(data as { toolName?: string }).toolName ?? \"?\"}`\n : event === \"permission_approved\"\n ? `tool=${(data as { tool?: string }).tool ?? \"?\"}`\n : JSON.stringify(data);\n if (event === \"tool_running\" || event === \"permission_approved\") {\n logger.debug(\n `[PTYService] Hook event for ${sessionId}: ${event} ${summary}`,\n );\n } else {\n this.log(`Hook event for ${sessionId}: ${event} ${summary}`);\n }\n\n // Forward hook event to the underlying PTY session so it can reset its\n // stall timer and update internal status. Without this, the stall detector\n // runs independently of hooks and can falsely escalate hook-managed sessions.\n if (this.manager && this.usingBunWorker) {\n (this.manager as BunCompatiblePTYManager)\n .notifyHookEvent(sessionId, event)\n .catch((err) =>\n logger.debug(\n `[PTYService] Failed to forward hook event to session: ${err}`,\n ),\n );\n }\n\n switch (event) {\n case \"tool_running\":\n this.emitEvent(sessionId, \"tool_running\", data);\n break;\n case \"task_complete\":\n this.emitEvent(sessionId, \"task_complete\", data);\n break;\n case \"permission_approved\":\n // Permission was auto-approved via PermissionRequest hook.\n // No PTY event needed — the hook response already allowed it.\n break;\n case \"notification\":\n this.emitEvent(sessionId, \"message\", data);\n break;\n case \"session_end\":\n // CLI session is ending — treat as a stopped event so the coordinator\n // and frontend see the session transition to terminal state.\n this.emitEvent(sessionId, \"stopped\", {\n ...data,\n reason: \"session_end\",\n });\n break;\n default:\n break;\n }\n }\n\n async checkAvailableAgents(\n types?: AdapterType[],\n ): Promise<PreflightResult[]> {\n const agentTypes =\n types ?? ([\"claude\", \"gemini\", \"codex\", \"aider\"] as AdapterType[]);\n return checkAdapters(agentTypes);\n }\n\n getSupportedAgentTypes(): CodingAgentType[] {\n return [\"shell\", \"claude\", \"gemini\", \"codex\", \"aider\", \"pi\"];\n }\n\n private async classifyStall(\n sessionId: string,\n recentOutput: string,\n ): Promise<StallClassification | null> {\n const meta = this.sessionMetadata.get(sessionId);\n const agentType = (meta?.agentType as string) ?? \"unknown\";\n\n // For coordinator-managed sessions in autonomous mode: use combined\n // classify+decide in a single LLM call. The suggestedResponse is kept\n // intact so pty-manager auto-responds, and the coordinator receives\n // autoResponded: true — skipping the second LLM call in handleBlocked().\n if (\n meta?.coordinatorManaged &&\n this.coordinator?.getSupervisionLevel() === \"autonomous\"\n ) {\n const taskCtx = this.coordinator.getTaskContext(sessionId);\n if (taskCtx) {\n // Suppress stall classification during the post-send cooldown.\n // The agent is processing coordinator input — the output buffer\n // still contains the previous response, so classifying now would\n // produce a stale \"task_complete\" that triggers cascading follow-ups.\n if (taskCtx.lastInputSentAt) {\n const elapsed = Date.now() - taskCtx.lastInputSentAt;\n if (elapsed < POST_SEND_COOLDOWN_MS) {\n this.log(\n `Suppressing stall classification for ${sessionId} — ` +\n `${Math.round(elapsed / 1000)}s since coordinator sent input`,\n );\n return null;\n }\n }\n return classifyAndDecideForCoordinator({\n sessionId,\n recentOutput,\n agentType,\n buffers: this.sessionOutputBuffers,\n traceEntries: this.traceEntries,\n runtime: this.runtime,\n manager: this.manager,\n metricsTracker: this.metricsTracker,\n debugSnapshots: this.serviceConfig.debug === true,\n log: (msg: string) => this.log(msg),\n taskContext: {\n sessionId: taskCtx.sessionId,\n agentType: taskCtx.agentType,\n label: taskCtx.label,\n originalTask: taskCtx.originalTask,\n workdir: taskCtx.workdir,\n repo: taskCtx.repo,\n },\n decisionHistory: taskCtx.decisions\n .filter((d) => d.decision !== \"auto_resolved\")\n .slice(-5)\n .map((d) => ({\n event: d.event,\n promptText: d.promptText,\n action: d.decision,\n response: d.response,\n reasoning: d.reasoning,\n })),\n });\n }\n }\n\n const classification = await classifyStallOutput({\n sessionId,\n recentOutput,\n agentType,\n buffers: this.sessionOutputBuffers,\n traceEntries: this.traceEntries,\n runtime: this.runtime,\n manager: this.manager,\n metricsTracker: this.metricsTracker,\n debugSnapshots: this.serviceConfig.debug === true,\n log: (msg: string) => this.log(msg),\n });\n\n // When the SwarmCoordinator manages this session (non-autonomous mode),\n // strip suggestedResponse so the PTY worker doesn't auto-respond.\n // The coordinator's LLM decision loop will handle blocked prompts instead.\n if (\n classification &&\n meta?.coordinatorManaged &&\n classification.suggestedResponse\n ) {\n this.log(\n `Suppressing stall auto-response for coordinator-managed session ${sessionId} ` +\n `(would have sent: \"${classification.suggestedResponse}\")`,\n );\n classification.suggestedResponse = undefined;\n }\n\n return classification;\n }\n\n // ─── Workspace Files ───\n\n private getAdapter(agentType: AdapterType): BaseCodingAdapter {\n let adapter = this.adapterCache.get(agentType);\n if (!adapter) {\n adapter = createAdapter(agentType);\n this.adapterCache.set(agentType, adapter);\n }\n return adapter;\n }\n\n getWorkspaceFiles(agentType: AdapterType): AgentFileDescriptor[] {\n return this.getAdapter(agentType).getWorkspaceFiles();\n }\n\n getMemoryFilePath(agentType: AdapterType): string {\n return this.getAdapter(agentType).memoryFilePath;\n }\n\n getApprovalConfig(\n agentType: AdapterType,\n preset: ApprovalPreset,\n ): ApprovalConfig {\n return generateApprovalConfig(agentType, preset);\n }\n\n async writeMemoryFile(\n agentType: AdapterType,\n workspacePath: string,\n content: string,\n options?: WriteMemoryOptions,\n ): Promise<string> {\n return this.getAdapter(agentType).writeMemoryFile(\n workspacePath,\n content,\n options,\n );\n }\n\n // ─── Gitignore for Orchestrator Files ───\n\n /** Marker comment used to detect orchestrator-managed gitignore entries. */\n private static readonly GITIGNORE_MARKER =\n \"# orchestrator-injected (do not commit agent config/memory files)\";\n\n /** Per-path lock to serialize concurrent gitignore updates for the same workdir. */\n private static gitignoreLocks = new Map<string, Promise<void>>();\n\n /**\n * Ensure that orchestrator-injected files (CLAUDE.md, .claude/, GEMINI.md, etc.)\n * are listed in the workspace .gitignore so agents don't commit them.\n * Appends to an existing .gitignore or creates one. Idempotent — skips if\n * the marker comment is already present. Serialized per-path to prevent\n * duplicate entries from concurrent spawns.\n */\n private async ensureOrchestratorGitignore(workdir: string): Promise<void> {\n const gitignorePath = join(workdir, \".gitignore\");\n\n // Serialize per-path: wait for any in-flight update to the same file.\n const existing_lock = PTYService.gitignoreLocks.get(gitignorePath);\n if (existing_lock) await existing_lock;\n\n const task = this.doEnsureGitignore(gitignorePath, workdir);\n PTYService.gitignoreLocks.set(gitignorePath, task);\n try {\n await task;\n } finally {\n // Only delete if we're still the current holder\n if (PTYService.gitignoreLocks.get(gitignorePath) === task) {\n PTYService.gitignoreLocks.delete(gitignorePath);\n }\n }\n }\n\n private async doEnsureGitignore(\n gitignorePath: string,\n workdir: string,\n ): Promise<void> {\n let existing = \"\";\n try {\n existing = await readFile(gitignorePath, \"utf-8\");\n } catch {\n // No .gitignore yet — we'll create one\n }\n\n // Idempotent: skip if we already added our entries\n if (existing.includes(PTYService.GITIGNORE_MARKER)) return;\n\n // Include all common patterns so multi-agent swarms with mixed types are covered.\n const entries = [\n \"\",\n PTYService.GITIGNORE_MARKER,\n \"CLAUDE.md\",\n \".claude/\",\n \"GEMINI.md\",\n \".gemini/\",\n \".aider*\",\n ];\n\n try {\n if (existing.length === 0) {\n // No .gitignore yet — create with just our entries\n await writeFile(gitignorePath, `${entries.join(\"\\n\")}\\n`, \"utf-8\");\n } else {\n // Append-only to avoid clobbering concurrent edits\n const separator = existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n await appendFile(\n gitignorePath,\n `${separator + entries.join(\"\\n\")}\\n`,\n \"utf-8\",\n );\n }\n } catch (err) {\n this.log(`Failed to update .gitignore in ${workdir}: ${err}`);\n }\n }\n\n // ─── Event & Adapter Registration ───\n\n onSessionEvent(callback: SessionEventCallback): () => void {\n this.eventCallbacks.push(callback);\n return () => {\n const idx = this.eventCallbacks.indexOf(callback);\n if (idx !== -1) this.eventCallbacks.splice(idx, 1);\n };\n }\n\n registerAdapter(adapter: unknown): void {\n if (!this.manager) {\n throw new Error(\"PTYService not initialized\");\n }\n\n if (this.usingBunWorker) {\n this.log(\n \"registerAdapter not available with Bun worker - adapters must be in the worker\",\n );\n return;\n }\n\n (this.manager as PTYManager).registerAdapter(\n adapter as Parameters<PTYManager[\"registerAdapter\"]>[0],\n );\n this.log(`Registered adapter`);\n }\n\n private toSessionInfo(\n session: SessionHandle | WorkerSessionHandle,\n workdir?: string,\n ): SessionInfo {\n const metadata = this.sessionMetadata.get(session.id);\n const requestedType =\n typeof metadata?.requestedType === \"string\"\n ? metadata.requestedType\n : undefined;\n const displayAgentType =\n session.type === \"shell\" && isPiAgentType(requestedType)\n ? \"pi\"\n : session.type;\n return {\n id: session.id,\n name: session.name,\n agentType: displayAgentType,\n workdir: workdir ?? process.cwd(),\n status: session.status,\n createdAt: session.startedAt ? new Date(session.startedAt) : new Date(),\n lastActivityAt: session.lastActivityAt\n ? new Date(session.lastActivityAt)\n : new Date(),\n metadata,\n };\n }\n\n private toTerminalSessionInfo(sessionId: string): SessionInfo | undefined {\n const terminal = this.terminalSessionStates.get(sessionId);\n if (!terminal) return undefined;\n const metadata = this.sessionMetadata.get(sessionId);\n const requestedType =\n typeof metadata?.requestedType === \"string\"\n ? metadata.requestedType\n : undefined;\n const storedAgentType =\n typeof metadata?.agentType === \"string\" ? metadata.agentType : \"unknown\";\n const displayAgentType =\n storedAgentType === \"shell\" && isPiAgentType(requestedType)\n ? \"pi\"\n : storedAgentType;\n return {\n id: sessionId,\n name: this.sessionNames.get(sessionId) ?? sessionId,\n agentType: displayAgentType,\n workdir: this.sessionWorkdirs.get(sessionId) ?? process.cwd(),\n status: terminal.status,\n createdAt: terminal.createdAt,\n lastActivityAt: terminal.lastActivityAt,\n metadata,\n };\n }\n\n private emitEvent(sessionId: string, event: string, data: unknown): void {\n if (event === \"stopped\" || event === \"error\") {\n const liveSession = this.manager?.get(sessionId);\n const createdAt =\n liveSession?.startedAt instanceof Date\n ? liveSession.startedAt\n : liveSession?.startedAt\n ? new Date(liveSession.startedAt)\n : new Date();\n const lastActivityAt =\n liveSession?.lastActivityAt instanceof Date\n ? liveSession.lastActivityAt\n : liveSession?.lastActivityAt\n ? new Date(liveSession.lastActivityAt)\n : new Date();\n const reason =\n event === \"stopped\"\n ? (data as { reason?: string } | undefined)?.reason\n : (data as { message?: string } | undefined)?.message;\n this.terminalSessionStates.set(sessionId, {\n status: event,\n createdAt,\n lastActivityAt,\n reason,\n });\n }\n\n for (const callback of this.eventCallbacks) {\n try {\n callback(sessionId, event, data);\n } catch (err) {\n this.log(`Event callback error: ${err}`);\n }\n }\n }\n\n // ─── Metrics ───\n\n getAgentMetrics() {\n return this.metricsTracker.getAll();\n }\n\n private log(message: string): void {\n logger.debug(`[PTYService] ${message}`);\n }\n\n private handleWorkerExit(info: {\n code: number | null;\n signal: string | null;\n }): void {\n const trackedSessionIds = new Set([\n ...this.sessionMetadata.keys(),\n ...this.sessionWorkdirs.keys(),\n ]);\n if (trackedSessionIds.size === 0) {\n return;\n }\n\n const reason = info.signal\n ? `PTY worker exited unexpectedly (signal ${info.signal})`\n : `PTY worker exited unexpectedly (code ${info.code ?? \"unknown\"})`;\n\n for (const sessionId of trackedSessionIds) {\n const terminalState = this.terminalSessionStates.get(sessionId);\n if (\n terminalState?.status === \"stopped\" ||\n terminalState?.status === \"error\"\n ) {\n continue;\n }\n this.emitEvent(sessionId, \"error\", {\n message: reason,\n workerExit: info,\n });\n }\n }\n}\n",
|
|
43
43
|
"/**\n * Lightweight per-agent-type metrics for observability.\n *\n * Self-contained tracker — no dependencies on PTYService state.\n *\n * @module services/agent-metrics\n */\n\nexport interface AgentMetrics {\n spawned: number;\n completed: number;\n completedViaFastPath: number;\n completedViaClassifier: number;\n stallCount: number;\n avgCompletionMs: number;\n totalCompletionMs: number;\n}\n\nexport class AgentMetricsTracker {\n private metrics: Map<string, AgentMetrics> = new Map();\n\n /** Get (or lazily initialize) metrics for a given agent type. */\n get(agentType: string): AgentMetrics {\n let m = this.metrics.get(agentType);\n if (!m) {\n m = {\n spawned: 0,\n completed: 0,\n completedViaFastPath: 0,\n completedViaClassifier: 0,\n stallCount: 0,\n avgCompletionMs: 0,\n totalCompletionMs: 0,\n };\n this.metrics.set(agentType, m);\n }\n return m;\n }\n\n /** Record a task completion and update rolling average duration. */\n recordCompletion(\n agentType: string,\n method: \"fast-path\" | \"classifier\",\n durationMs: number,\n ): void {\n const m = this.get(agentType);\n m.completed++;\n if (method === \"fast-path\") m.completedViaFastPath++;\n else m.completedViaClassifier++;\n m.totalCompletionMs += durationMs;\n m.avgCompletionMs = Math.round(m.totalCompletionMs / m.completed);\n }\n\n /** Increment the stall counter for an agent type. */\n incrementStalls(agentType: string): void {\n this.get(agentType).stallCount++;\n }\n\n /** Return a serializable copy of all metrics (for API endpoints). */\n getAll(): Record<string, Omit<AgentMetrics, \"totalCompletionMs\">> {\n const result: Record<string, Omit<AgentMetrics, \"totalCompletionMs\">> = {};\n for (const [type, m] of this.metrics) {\n const { totalCompletionMs: _, ...rest } = m;\n result[type] = { ...rest };\n }\n return result;\n }\n}\n",
|
|
44
44
|
"/**\n * Read settings from the eliza/milady config file's env section.\n *\n * runtime.getSetting() checks character.settings but NOT the config's env\n * section which is where the UI writes settings. This reads the config\n * file directly so settings take effect without restart.\n *\n * @module services/config-env\n */\n\nimport { readFileSync } from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nfunction readConfig(): Record<string, unknown> | undefined {\n try {\n const configPath = path.join(\n process.env.MILADY_STATE_DIR ??\n process.env.ELIZA_STATE_DIR ??\n path.join(os.homedir(), \".milady\"),\n process.env.ELIZA_NAMESPACE === \"milady\" || !process.env.ELIZA_NAMESPACE\n ? \"milady.json\"\n : `${process.env.ELIZA_NAMESPACE}.json`,\n );\n const raw = readFileSync(configPath, \"utf-8\");\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n\nexport function readConfigEnvKey(key: string): string | undefined {\n const config = readConfig();\n const val = (config?.env as Record<string, unknown> | undefined)?.[key];\n return typeof val === \"string\" ? val : undefined;\n}\n\n/** Read a key from the cloud section of the config (e.g. \"apiKey\"). */\nexport function readConfigCloudKey(key: string): string | undefined {\n const config = readConfig();\n const val = (config?.cloud as Record<string, unknown> | undefined)?.[key];\n return typeof val === \"string\" ? val : undefined;\n}\n",
|
|
45
|
-
"/**\n *
|
|
45
|
+
"/**\n * Debug PTY Capture — optional session recording for offline analysis.\n *\n * Activated by setting `PARALLAX_DEBUG_CAPTURE=1`. When enabled, all PTY\n * output and stdin are recorded per-session using `pty-state-capture`.\n * Capture files persist in `.parallax/pty-captures/<sessionId>/` after\n * the agent session is killed, enabling post-mortem analysis of state\n * transitions, stall classifications, and coordinator timing.\n *\n * The `pty-state-capture` package is dynamically imported — if not\n * installed, capture is silently disabled. This means it can stay out\n * of production dependencies entirely.\n *\n * @module services/debug-capture\n */\n\nimport { logger } from \"@elizaos/core\";\n\n/** Re-export the types we use so callers don't need to import pty-state-capture directly. */\ninterface CaptureManagerLike {\n openSession(\n sessionId: string,\n overrides?: { source?: string },\n ): Promise<unknown>;\n feed(\n sessionId: string,\n chunk: string,\n direction?: \"stdout\" | \"stderr\" | \"stdin\",\n ): Promise<unknown>;\n lifecycle(\n sessionId: string,\n event: string,\n detail?: string,\n ): Promise<void>;\n snapshot(sessionId: string): unknown | null;\n}\n\nlet captureManager: CaptureManagerLike | null = null;\nlet initAttempted = false;\n\n/**\n * Returns true if debug capture is enabled via environment variable.\n */\nexport function isDebugCaptureEnabled(): boolean {\n return process.env.PARALLAX_DEBUG_CAPTURE === \"1\";\n}\n\n/**\n * Lazily initialize the capture manager. Returns null if:\n * - PARALLAX_DEBUG_CAPTURE is not set to \"1\"\n * - pty-state-capture is not installed\n * - Initialization fails for any reason\n */\nasync function ensureCaptureManager(): Promise<CaptureManagerLike | null> {\n if (captureManager) return captureManager;\n if (initAttempted) return null;\n initAttempted = true;\n\n if (!isDebugCaptureEnabled()) return null;\n\n try {\n const mod = await import(\"pty-state-capture\");\n const { PTYStateCaptureManager } = mod;\n captureManager = new PTYStateCaptureManager({\n outputRootDir: \".parallax/pty-captures\",\n defaultRows: 80,\n defaultCols: 220,\n });\n logger.info(\"[debug-capture] PTY state capture enabled — writing to .parallax/pty-captures/\");\n return captureManager;\n } catch {\n logger.debug(\"[debug-capture] pty-state-capture not available — capture disabled\");\n return null;\n }\n}\n\n/**\n * Open a capture session for a PTY session. Call this when spawning.\n */\nexport async function captureSessionOpen(\n sessionId: string,\n agentType: string,\n): Promise<void> {\n const mgr = await ensureCaptureManager();\n if (!mgr) return;\n try {\n await mgr.openSession(sessionId, { source: agentType });\n } catch (err) {\n logger.debug(`[debug-capture] Failed to open session ${sessionId}: ${err}`);\n }\n}\n\n/**\n * Feed PTY output data to the capture. Call this on every data chunk.\n */\nexport async function captureFeed(\n sessionId: string,\n chunk: string,\n direction: \"stdout\" | \"stderr\" | \"stdin\" = \"stdout\",\n): Promise<void> {\n if (!captureManager) return;\n try {\n await captureManager.feed(sessionId, chunk, direction);\n } catch (err) {\n logger.debug(`[debug-capture] Feed error for ${sessionId}: ${err}`);\n }\n}\n\n/**\n * Record a lifecycle event (session_ready, session_stopped, etc.).\n */\nexport async function captureLifecycle(\n sessionId: string,\n event: \"session_started\" | \"session_ready\" | \"session_stopped\" | \"session_error\",\n detail?: string,\n): Promise<void> {\n if (!captureManager) return;\n try {\n await captureManager.lifecycle(sessionId, event, detail);\n } catch (err) {\n logger.debug(`[debug-capture] Lifecycle error for ${sessionId}: ${err}`);\n }\n}\n\n/**\n * Get a snapshot of a capture session's current state.\n */\nexport function captureSnapshot(sessionId: string): unknown | null {\n if (!captureManager) return null;\n try {\n return captureManager.snapshot(sessionId);\n } catch (err) {\n logger.debug(`[debug-capture] Snapshot error for ${sessionId}: ${err}`);\n return null;\n }\n}\n\n/** @internal Reset module state for testing only. */\nexport function _resetForTesting(): void {\n captureManager = null;\n initAttempted = false;\n}\n",
|
|
46
|
+
"/**\n * Auto-response rule management for PTY sessions.\n *\n * Contains logic for pushing default auto-response rules per agent type\n * and handling Gemini authentication flow.\n *\n * @module services/pty-auto-response\n */\n\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport type {\n AutoResponseRule,\n BunCompatiblePTYManager,\n PTYManager,\n} from \"pty-manager\";\nimport { readConfigEnvKey } from \"./config-env.js\";\n\nexport interface AutoResponseContext {\n manager: PTYManager | BunCompatiblePTYManager;\n usingBunWorker: boolean;\n runtime: IAgentRuntime;\n log: (msg: string) => void;\n}\n\n/**\n * Push session-specific auto-response rules that depend on runtime config.\n * Trust prompts, update notices, and other static rules are handled by\n * adapter built-in rules (coding-agent-adapters). This only pushes rules\n * that need runtime values (e.g. API keys).\n */\nexport async function pushDefaultRules(\n ctx: AutoResponseContext,\n sessionId: string,\n agentType: string,\n): Promise<void> {\n const rules: AutoResponseRule[] = [];\n\n // Codex sometimes renders the workspace trust screen incrementally.\n // The upstream adapter rule is one-shot; if it fires before the menu is fully\n // interactive, Codex can keep showing the same prompt and block the session.\n // Keep this session rule active until the prompt actually clears.\n if (agentType === \"codex\") {\n rules.push({\n pattern:\n /higher.?risk.?of.?prompt.?injection|yes,?.?continue.*no,?.?quit|do.?you.?trust.?the.?contents|trust.?this.?directory|allow.?codex.?to.?work.?in.?this.?folder|without.?asking.?for.?approval/i,\n type: \"permission\",\n response: \"\",\n responseType: \"keys\" as const,\n keys: [\"enter\"],\n description:\n \"Retry Codex workspace trust approval until the prompt clears\",\n safe: true,\n });\n }\n\n // Aider gitignore prompt\n if (agentType === \"aider\") {\n rules.push({\n pattern: /\\.aider\\*.*\\.gitignore.*\\(Y\\)es\\/\\(N\\)o/i,\n type: \"config\",\n response: \"y\",\n description: \"Auto-accept adding .aider* to .gitignore\",\n safe: true,\n });\n }\n\n // Claude — API key confirmation prompt (appears when ANTHROPIC_API_KEY is set\n // alongside a subscription login, or in CLAUDE_CODE_SIMPLE mode)\n if (agentType === \"claude\") {\n const llmProvider =\n readConfigEnvKey(\"PARALLAX_LLM_PROVIDER\") || \"subscription\";\n if (llmProvider === \"api_keys\" || llmProvider === \"cloud\") {\n rules.push({\n pattern:\n /Do you want to use this API key|(?:custom|detected).*API key.*environment/i,\n type: \"config\",\n response: \"\",\n responseType: \"keys\" as const,\n keys: [\"up\", \"enter\"],\n description: \"Accept detected ANTHROPIC_API_KEY from environment\",\n safe: true,\n once: true,\n });\n }\n }\n\n // Gemini — auth flow (update notices are informational, don't need a response)\n if (agentType === \"gemini\") {\n // Auth menu detection — select API key or Google login based on available credentials\n const geminiApiKey = ctx.runtime.getSetting(\"GENERATIVE_AI_API_KEY\") as\n | string\n | undefined;\n\n if (geminiApiKey) {\n // Have API key → select option 2 \"Use an API key\"\n rules.push({\n pattern:\n /Log in with Google|Use an API key|Use Vertex AI|gemini api key/i,\n type: \"config\",\n response: \"2\",\n description: \"Select 'Use an API key' from Gemini auth menu\",\n safe: true,\n });\n\n // Step 2: API key input prompt — send the actual key value.\n // Tight regex: only matches the Gemini CLI's exact prompt format\n // to prevent exfiltration via crafted terminal output.\n // once: fire at most once per session to prevent repeated credential injection.\n rules.push({\n pattern:\n /^(?:\\s|[>$#])*(?:Enter|Paste) (?:your )?(?:Google AI|Gemini) API key:/i,\n type: \"config\",\n response: geminiApiKey,\n description: \"Input Gemini API key from Gemini CLI auth prompt\",\n safe: true,\n once: true,\n });\n } else {\n // No API key → select option 1 \"Log in with Google\" (opens browser OAuth)\n rules.push({\n pattern:\n /Log in with Google|Use an API key|Use Vertex AI|gemini api key/i,\n type: \"config\",\n response: \"1\",\n description:\n \"Select 'Log in with Google' from Gemini auth menu (browser OAuth)\",\n safe: true,\n });\n }\n }\n\n if (rules.length === 0) return;\n\n // Push rules to the session via the runtime API\n try {\n if (ctx.usingBunWorker) {\n for (const rule of rules) {\n await (ctx.manager as BunCompatiblePTYManager).addAutoResponseRule(\n sessionId,\n rule,\n );\n }\n } else {\n const nodeManager = ctx.manager as PTYManager;\n for (const rule of rules) {\n nodeManager.addAutoResponseRule(sessionId, rule);\n }\n }\n ctx.log(\n `Pushed ${rules.length} auto-response rules to session ${sessionId}`,\n );\n\n // Note: No retroactive check needed here. The worker's tryAutoResponse()\n // runs on every data chunk and checks the full output buffer against all\n // active rules. Once rules are pushed, the next data chunk will trigger\n // matching. The old retroactive check caused ghost responses because it\n // bypassed the worker's TUI-aware response logic (sendKeys vs writeRaw).\n } catch (err) {\n ctx.log(`Failed to push rules to session ${sessionId}: ${err}`);\n }\n}\n\n/**\n * Handle Gemini authentication when login_required fires.\n * Sends /auth to start the auth flow — auto-response rules\n * then handle menu selection and API key input.\n */\nexport async function handleGeminiAuth(\n ctx: AutoResponseContext,\n sessionId: string,\n sendKeysToSession: (\n sessionId: string,\n keys: string | string[],\n ) => Promise<void>,\n): Promise<void> {\n const apiKey = ctx.runtime.getSetting(\"GENERATIVE_AI_API_KEY\") as\n | string\n | undefined;\n\n if (apiKey) {\n ctx.log(\n `Gemini auth: API key available, sending /auth to start API key flow`,\n );\n } else {\n ctx.log(\n `Gemini auth: no API key configured, sending /auth for Google OAuth flow`,\n );\n }\n\n // Send /auth via sendKeys to avoid send() which sets status to \"busy\".\n // We need to stay in \"authenticating\" so detectReady fires after auth completes.\n try {\n await sendKeysToSession(sessionId, \"/auth\");\n await new Promise((r) => setTimeout(r, 50));\n await sendKeysToSession(sessionId, \"enter\");\n } catch (err) {\n ctx.log(`Gemini auth: failed to send /auth: ${err}`);\n }\n}\n",
|
|
46
47
|
"/**\n * PTY manager initialization — extracted from PTYService.initialize().\n *\n * Creates either a BunCompatiblePTYManager (for Bun runtime) or PTYManager\n * (for Node), wires up event handlers, and returns the configured manager.\n *\n * @module services/pty-init\n */\n\nimport { createRequire } from \"node:module\";\nimport { createAllAdapters } from \"coding-agent-adapters\";\nimport {\n BunCompatiblePTYManager,\n isBun,\n PTYManager,\n type PTYManagerConfig,\n type SessionHandle,\n type SessionMessage,\n ShellAdapter,\n type StallClassification,\n type ToolRunningInfo,\n type WorkerSessionHandle,\n} from \"pty-manager\";\nimport { captureTaskResponse } from \"./ansi-utils.js\";\nimport type { PTYServiceConfig } from \"./pty-types.js\";\n\n// Resolve absolute path to coding-agent-adapters so the Node worker process\n// can load it regardless of its cwd. The worker uses require() which does\n// cwd-relative resolution — passing the bare module name \"coding-agent-adapters\"\n// fails when the worker's cwd doesn't contain node_modules.\nconst _require = createRequire(import.meta.url);\nlet resolvedAdapterModule = \"coding-agent-adapters\";\ntry {\n resolvedAdapterModule = _require.resolve(\"coding-agent-adapters\");\n} catch {\n // Fallback to bare specifier if resolve fails (shouldn't happen)\n}\n\n/**\n * All callbacks and state that the initialization logic needs\n * from the surrounding PTYService instance.\n */\nexport interface InitContext {\n serviceConfig: PTYServiceConfig;\n classifyStall: (\n sessionId: string,\n recentOutput: string,\n ) => Promise<StallClassification | null>;\n emitEvent: (sessionId: string, event: string, data: unknown) => void;\n handleGeminiAuth: (sessionId: string) => void;\n sessionOutputBuffers: Map<string, string[]>;\n taskResponseMarkers: Map<string, number>;\n metricsTracker: {\n recordCompletion(type: string, method: string, durationMs: number): void;\n };\n traceEntries: Array<string | Record<string, unknown>>;\n maxTraceEntries: number;\n log: (msg: string) => void;\n handleWorkerExit?: (info: {\n code: number | null;\n signal: string | null;\n }) => void;\n /** Check if a session has an active task in the coordinator. */\n hasActiveTask?: (sessionId: string) => boolean;\n /** Check if a session's task has started work (task delivered or decisions made). */\n hasTaskActivity?: (sessionId: string) => boolean;\n /** Mark a session's task as delivered (initial ready event processed). */\n markTaskDelivered?: (sessionId: string) => void;\n}\n\n/**\n * If a session has an active task that has started work, forward the\n * session_ready event as task_complete so the coordinator evaluates completion.\n *\n * Shared by both the Bun worker and native Node event paths to avoid\n * duplicating the same guard / capture / emit logic.\n */\nfunction forwardReadyAsTaskComplete(\n ctx: InitContext,\n session: { id: string },\n): void {\n if (!ctx.hasActiveTask?.(session.id) || !ctx.hasTaskActivity?.(session.id)) {\n return;\n }\n const response = ctx.taskResponseMarkers.has(session.id)\n ? captureTaskResponse(\n session.id,\n ctx.sessionOutputBuffers,\n ctx.taskResponseMarkers,\n )\n : \"\";\n ctx.log(\n `session_ready for active task ${session.id} — forwarding as task_complete (stall classifier path, response: ${response.length} chars)`,\n );\n ctx.emitEvent(session.id, \"task_complete\", { session, response });\n}\n\n/** Value returned by {@link initializePTYManager}. */\nexport interface InitResult {\n manager: PTYManager | BunCompatiblePTYManager;\n usingBunWorker: boolean;\n}\n\n/**\n * Create and configure a PTY manager for the current runtime.\n *\n * - **Bun**: instantiates a {@link BunCompatiblePTYManager} that spawns a\n * Node worker process and communicates via JSON-RPC over stdio.\n * - **Node**: instantiates a {@link PTYManager} directly and registers\n * all built-in adapters in-process.\n */\nexport async function initializePTYManager(\n ctx: InitContext,\n): Promise<InitResult> {\n const usingBunWorker = isBun();\n\n if (usingBunWorker) {\n // Use Bun-compatible manager that spawns a Node worker\n ctx.log(\"Detected Bun runtime, using BunCompatiblePTYManager\");\n ctx.log(`Resolved adapter module: ${resolvedAdapterModule}`);\n const bunManager = new BunCompatiblePTYManager({\n adapterModules: [resolvedAdapterModule],\n stallDetectionEnabled: true,\n stallTimeoutMs: 4000,\n onStallClassify: async (\n sessionId: string,\n recentOutput: string,\n _stallDurationMs: number,\n ) => {\n return ctx.classifyStall(sessionId, recentOutput);\n },\n });\n\n // Set up event forwarding for worker-based manager.\n // IMPORTANT: The stall classifier's \"task_complete\" classification emits\n // \"ready\" (not \"task_complete\") in pty-manager. When session_ready fires\n // for a session that already has an active task registered in the coordinator,\n // it means the agent returned to idle after working — treat as task_complete.\n bunManager.on(\"session_ready\", (session: WorkerSessionHandle) => {\n ctx.log(\n `session_ready event received for ${session.id} (type: ${session.type}, status: ${session.status})`,\n );\n ctx.emitEvent(session.id, \"ready\", { session });\n forwardReadyAsTaskComplete(ctx, session);\n // Mark task as delivered AFTER the forward check so the first ready\n // event (startup) is not treated as completion. Subsequent ready events\n // will see taskDelivered=true and forward as task_complete.\n ctx.markTaskDelivered?.(session.id);\n });\n\n bunManager.on(\"session_exit\", (id: string, code: number) => {\n ctx.emitEvent(id, \"stopped\", { reason: `exit code ${code}` });\n });\n\n bunManager.on(\"session_error\", (id: string, error: string) => {\n ctx.emitEvent(id, \"error\", { message: error });\n });\n\n bunManager.on(\n \"blocking_prompt\",\n (\n session: WorkerSessionHandle,\n promptInfo: unknown,\n autoResponded: boolean,\n ) => {\n const info = promptInfo as\n | { type?: string; prompt?: string }\n | undefined;\n ctx.log(\n `blocking_prompt for ${session.id}: type=${info?.type}, autoResponded=${autoResponded}, prompt=\"${(info?.prompt ?? \"\").slice(0, 80)}\"`,\n );\n ctx.emitEvent(session.id, \"blocked\", { promptInfo, autoResponded });\n },\n );\n\n bunManager.on(\n \"login_required\",\n (session: WorkerSessionHandle, instructions?: string, url?: string) => {\n // Auto-handle Gemini auth flow\n if (session.type === \"gemini\") {\n ctx.handleGeminiAuth(session.id);\n }\n ctx.emitEvent(session.id, \"login_required\", { instructions, url });\n },\n );\n\n bunManager.on(\"task_complete\", (session: WorkerSessionHandle) => {\n const response = captureTaskResponse(\n session.id,\n ctx.sessionOutputBuffers,\n ctx.taskResponseMarkers,\n );\n const durationMs = session.startedAt\n ? Date.now() - new Date(session.startedAt).getTime()\n : 0;\n ctx.metricsTracker.recordCompletion(\n session.type,\n \"fast-path\",\n durationMs,\n );\n ctx.log(\n `Task complete for ${session.id} (adapter fast-path), response: ${response.length} chars`,\n );\n ctx.emitEvent(session.id, \"task_complete\", { session, response });\n });\n\n bunManager.on(\n \"tool_running\",\n (session: WorkerSessionHandle, info: ToolRunningInfo) => {\n ctx.log(\n `tool_running for ${session.id}: ${info.toolName}${info.description ? ` — ${info.description}` : \"\"}`,\n );\n ctx.emitEvent(session.id, \"tool_running\", { session, ...info });\n },\n );\n\n bunManager.on(\"message\", (message: SessionMessage) => {\n ctx.emitEvent(message.sessionId, \"message\", message);\n });\n\n // Log worker-level stderr (pino logs from pty-manager worker process).\n // Strip the \"Invalid JSON from worker:\" prefix that BunCompatiblePTYManager\n // adds when stderr lines aren't valid JSON-RPC responses.\n bunManager.on(\"worker_error\", (err: unknown) => {\n const raw = typeof err === \"string\" ? err : String(err);\n const msg = raw.replace(/^Invalid JSON from worker:\\s*/i, \"\").trim();\n if (!msg) return;\n // Capture task completion trace entries for timeline analysis\n if (msg.includes(\"Task completion trace\")) {\n ctx.traceEntries.push(msg);\n if (ctx.traceEntries.length > ctx.maxTraceEntries) {\n ctx.traceEntries.splice(\n 0,\n ctx.traceEntries.length - ctx.maxTraceEntries,\n );\n }\n }\n // Show operational logs at info level (suppress noisy loading-suppression messages)\n if (msg.includes(\"suppressing stall emission\")) {\n // Loading pattern suppression fires every few seconds — too noisy for console\n return;\n }\n if (\n msg.includes(\"ready\") ||\n msg.includes(\"blocking\") ||\n msg.includes(\"auto-response\") ||\n msg.includes(\"Auto-responding\") ||\n msg.includes(\"detectReady\") ||\n msg.includes(\"stall\") ||\n msg.includes(\"Stall\") ||\n msg.includes(\"Task completion\") ||\n msg.includes(\"Spawning\") ||\n msg.includes(\"PTY session\")\n ) {\n console.log(\"[PTYService/Worker]\", msg);\n } else {\n console.error(\"[PTYService/Worker]\", msg.slice(0, 200));\n }\n });\n\n bunManager.on(\"worker_exit\", (info: {\n code: number | null;\n signal: string | null;\n }) => {\n ctx.handleWorkerExit?.(info);\n console.error(\"[PTYService] Worker exited:\", info);\n });\n\n await bunManager.waitForReady();\n return { manager: bunManager, usingBunWorker: true };\n }\n\n // Use native PTYManager directly in Node\n ctx.log(\"Using native PTYManager\");\n const managerConfig: PTYManagerConfig = {\n maxLogLines: ctx.serviceConfig.maxLogLines,\n stallDetectionEnabled: true,\n stallTimeoutMs: 4000,\n onStallClassify: async (\n sessionId: string,\n recentOutput: string,\n _stallDurationMs: number,\n ) => {\n return ctx.classifyStall(sessionId, recentOutput);\n },\n };\n\n const nodeManager = new PTYManager(managerConfig);\n\n // Register built-in adapters\n nodeManager.registerAdapter(new ShellAdapter());\n\n // Register coding agent adapters (claude, gemini, codex, aider).\n // Pi currently routes through the generic shell adapter.\n if (ctx.serviceConfig.registerCodingAdapters) {\n const codingAdapters = createAllAdapters();\n for (const adapter of codingAdapters) {\n nodeManager.registerAdapter(adapter);\n ctx.log(`Registered ${adapter.adapterType} adapter`);\n }\n }\n\n // Set up event forwarding (same stall-classifier workaround as Bun path)\n nodeManager.on(\"session_ready\", (session: SessionHandle) => {\n ctx.emitEvent(session.id, \"ready\", { session });\n forwardReadyAsTaskComplete(ctx, session);\n ctx.markTaskDelivered?.(session.id);\n });\n\n nodeManager.on(\n \"blocking_prompt\",\n (session: SessionHandle, promptInfo: unknown, autoResponded: boolean) => {\n ctx.emitEvent(session.id, \"blocked\", { promptInfo, autoResponded });\n },\n );\n\n nodeManager.on(\n \"login_required\",\n (session: SessionHandle, instructions?: string, url?: string) => {\n if (session.type === \"gemini\") {\n ctx.handleGeminiAuth(session.id);\n }\n ctx.emitEvent(session.id, \"login_required\", { instructions, url });\n },\n );\n\n nodeManager.on(\"task_complete\", (session: SessionHandle) => {\n const response = captureTaskResponse(\n session.id,\n ctx.sessionOutputBuffers,\n ctx.taskResponseMarkers,\n );\n const durationMs = session.startedAt\n ? Date.now() - new Date(session.startedAt).getTime()\n : 0;\n ctx.metricsTracker.recordCompletion(session.type, \"fast-path\", durationMs);\n ctx.log(\n `Task complete for ${session.id} (adapter fast-path), response: ${response.length} chars`,\n );\n ctx.emitEvent(session.id, \"task_complete\", { session, response });\n });\n\n nodeManager.on(\n \"tool_running\",\n (session: SessionHandle, info: ToolRunningInfo) => {\n ctx.log(\n `tool_running for ${session.id}: ${info.toolName}${info.description ? ` — ${info.description}` : \"\"}`,\n );\n ctx.emitEvent(session.id, \"tool_running\", { session, ...info });\n },\n );\n\n nodeManager.on(\n \"session_stopped\",\n (session: SessionHandle, reason: string) => {\n ctx.emitEvent(session.id, \"stopped\", { reason });\n },\n );\n\n nodeManager.on(\"session_error\", (session: SessionHandle, error: string) => {\n ctx.emitEvent(session.id, \"error\", { message: error });\n });\n\n nodeManager.on(\"message\", (message: SessionMessage) => {\n ctx.emitEvent(message.sessionId, \"message\", message);\n });\n\n return { manager: nodeManager, usingBunWorker: false };\n}\n",
|
|
47
48
|
"/**\n * Session I/O helpers — extracted from PTYService for maintainability.\n *\n * Standalone functions for sending input/keys to sessions and stopping\n * sessions. Each function takes a {@link SessionIOContext} that provides\n * the manager instance and shared state maps.\n *\n * @module services/pty-session-io\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n BunCompatiblePTYManager,\n PTYManager,\n SessionMessage,\n} from \"pty-manager\";\n\n/**\n * Shared context required by all session I/O functions.\n * Built inline from PTYService instance fields.\n */\nexport interface SessionIOContext {\n manager: PTYManager | BunCompatiblePTYManager;\n usingBunWorker: boolean;\n sessionOutputBuffers: Map<string, string[]>;\n taskResponseMarkers: Map<string, number>;\n outputUnsubscribers: Map<string, () => void>;\n}\n\n/**\n * Send text input to a session.\n *\n * Marks the buffer position for task response capture, then writes the\n * input via the appropriate manager API.\n */\nexport async function sendToSession(\n ctx: SessionIOContext,\n sessionId: string,\n input: string,\n): Promise<SessionMessage | undefined> {\n const session = ctx.manager.get(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n // Mark buffer position for task response capture\n const buffer = ctx.sessionOutputBuffers.get(sessionId);\n if (buffer) {\n ctx.taskResponseMarkers.set(sessionId, buffer.length);\n }\n\n if (ctx.usingBunWorker) {\n // BunCompatiblePTYManager.send returns void\n await (ctx.manager as BunCompatiblePTYManager).send(sessionId, input);\n return;\n } else {\n // PTYManager.send returns SessionMessage\n return (ctx.manager as PTYManager).send(sessionId, input);\n }\n}\n\n/**\n * Send key sequences to a session (for special keys like arrows, enter, etc.).\n */\nexport async function sendKeysToSession(\n ctx: SessionIOContext,\n sessionId: string,\n keys: string | string[],\n): Promise<void> {\n if (ctx.usingBunWorker) {\n await (ctx.manager as BunCompatiblePTYManager).sendKeys(sessionId, keys);\n } else {\n const ptySession = (ctx.manager as PTYManager).getSession(sessionId);\n if (!ptySession) {\n throw new Error(`Session ${sessionId} not found`);\n }\n ptySession.sendKeys(keys);\n }\n}\n\n/**\n * Stop a PTY session and clean up all associated state.\n *\n * @param force - When true, sends SIGKILL immediately instead of SIGTERM.\n * Use for sessions whose task is already complete — there's nothing to save.\n */\nexport async function stopSession(\n ctx: SessionIOContext,\n sessionId: string,\n sessionMetadata: Map<string, Record<string, unknown>>,\n sessionWorkdirs: Map<string, string>,\n log: (msg: string) => void,\n force = false,\n): Promise<void> {\n try {\n const session = ctx.manager.get(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n if (ctx.usingBunWorker) {\n if (force) {\n await (ctx.manager as BunCompatiblePTYManager).kill(\n sessionId,\n \"SIGKILL\",\n );\n } else {\n await (ctx.manager as BunCompatiblePTYManager).kill(sessionId);\n }\n } else {\n if (force) {\n await (ctx.manager as PTYManager).stop(sessionId, { force: true });\n } else {\n await (ctx.manager as PTYManager).stop(sessionId);\n }\n }\n } finally {\n // Clean up state even if the kill/stop call throws or the session was\n // already gone — prevents leaked subscribers and stale metadata.\n try {\n const unsubscribe = ctx.outputUnsubscribers.get(sessionId);\n if (unsubscribe) {\n unsubscribe();\n }\n } catch {\n // Ignore — unsubscribe may fail on a destroyed session\n }\n ctx.outputUnsubscribers.delete(sessionId);\n\n // Remove injected hooks from agent settings so they don't\n // leak to other CLI instances using the same workdir.\n const workdir = sessionWorkdirs.get(sessionId);\n if (workdir) {\n try {\n await cleanupAgentHooks(workdir, log);\n } catch {\n // Best-effort — don't block shutdown\n }\n }\n\n sessionMetadata.delete(sessionId);\n sessionWorkdirs.delete(sessionId);\n ctx.sessionOutputBuffers.delete(sessionId);\n ctx.taskResponseMarkers.delete(sessionId);\n log(`Stopped session ${sessionId}`);\n }\n}\n\n/**\n * Remove injected hooks from a workspace's agent settings files.\n * Cleans both .claude/settings.json and .gemini/settings.json.\n * Best-effort — errors are logged but not thrown.\n */\nasync function cleanupAgentHooks(\n workdir: string,\n log: (msg: string) => void,\n): Promise<void> {\n const settingsPaths = [\n join(workdir, \".claude\", \"settings.json\"),\n join(workdir, \".gemini\", \"settings.json\"),\n ];\n for (const settingsPath of settingsPaths) {\n try {\n const raw = await readFile(settingsPath, \"utf-8\");\n const settings = JSON.parse(raw) as Record<string, unknown>;\n if (!settings.hooks) continue;\n delete settings.hooks;\n await writeFile(\n settingsPath,\n JSON.stringify(settings, null, 2),\n \"utf-8\",\n );\n log(`Cleaned up hooks from ${settingsPath}`);\n } catch (err: unknown) {\n // ENOENT (file doesn't exist) is expected — silently ignore.\n // Other errors (parse failure, permission denied) are logged.\n const code = (err as { code?: string }).code;\n if (code !== \"ENOENT\") {\n log(`Failed to clean up hooks from ${settingsPath}: ${err}`);\n }\n }\n }\n}\n\n/**\n * Subscribe to live output from a session.\n * Returns an unsubscribe function.\n */\nexport function subscribeToOutput(\n ctx: SessionIOContext,\n sessionId: string,\n callback: (data: string) => void,\n): () => void {\n if (ctx.usingBunWorker) {\n const unsubscribe = (ctx.manager as BunCompatiblePTYManager).onSessionData(\n sessionId,\n callback,\n );\n ctx.outputUnsubscribers.set(sessionId, unsubscribe);\n return unsubscribe;\n }\n const ptySession = (ctx.manager as PTYManager).getSession(sessionId);\n if (!ptySession) {\n throw new Error(`Session ${sessionId} not found`);\n }\n ptySession.on(\"output\", callback);\n const unsubscribe = () => ptySession.off(\"output\", callback);\n ctx.outputUnsubscribers.set(sessionId, unsubscribe);\n return unsubscribe;\n}\n\n/**\n * Get buffered or logged output from a session.\n */\nexport async function getSessionOutput(\n ctx: SessionIOContext,\n sessionId: string,\n lines?: number,\n): Promise<string> {\n if (ctx.usingBunWorker) {\n const buffer = ctx.sessionOutputBuffers.get(sessionId);\n if (!buffer) return \"\";\n const tail = lines ?? buffer.length;\n return buffer.slice(-tail).join(\"\\n\");\n }\n\n const output: string[] = [];\n for await (const line of (ctx.manager as PTYManager).logs(sessionId, {\n tail: lines,\n })) {\n output.push(line);\n }\n return output.join(\"\\n\");\n}\n",
|
|
48
|
-
"/**\n * PTY session spawning logic — extracted from PTYService for maintainability.\n *\n * Contains the deferred task delivery, retry logic, per-agent settle delays,\n * and session buffer setup that runs during spawnSession().\n *\n * @module services/pty-spawn\n */\n\nimport type { AdapterType, BaseCodingAdapter } from \"coding-agent-adapters\";\nimport type {\n BunCompatiblePTYManager,\n PTYManager,\n SessionHandle,\n SpawnConfig,\n WorkerSessionHandle,\n} from \"pty-manager\";\nimport type {\n PTYServiceConfig,\n SessionInfo,\n SpawnSessionOptions,\n} from \"./pty-types.js\";\n\n/**\n * System environment variables safe to pass to spawned agents.\n * Everything else (API keys, tokens, cloud credentials) is stripped.\n */\nconst ENV_ALLOWLIST = [\n \"PATH\",\n \"HOME\",\n \"USER\",\n \"SHELL\",\n \"LANG\",\n \"LC_ALL\",\n \"LC_CTYPE\",\n \"TERM\",\n \"COLORTERM\",\n \"TZ\",\n \"TMPDIR\",\n \"XDG_RUNTIME_DIR\",\n \"NODE_OPTIONS\",\n \"BUN_INSTALL\",\n];\n\n/**\n * Build a sanitized base environment from process.env, keeping only\n * safe system variables. Agent-specific credentials are injected\n * separately by the adapter's getEnv().\n */\nexport function buildSanitizedBaseEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const key of ENV_ALLOWLIST) {\n const val = process.env[key];\n if (val) env[key] = val;\n }\n if (!env.TERM || env.TERM.toLowerCase() === \"dumb\") {\n env.TERM = \"xterm-256color\";\n }\n if (!env.COLORTERM) {\n env.COLORTERM = \"truecolor\";\n }\n return env;\n}\n\nexport interface SpawnContext {\n manager: PTYManager | BunCompatiblePTYManager;\n usingBunWorker: boolean;\n serviceConfig: PTYServiceConfig;\n sessionMetadata: Map<string, Record<string, unknown>>;\n sessionWorkdirs: Map<string, string>;\n sessionOutputBuffers: Map<string, string[]>;\n outputUnsubscribers: Map<string, () => void>;\n taskResponseMarkers: Map<string, number>;\n getAdapter: (agentType: AdapterType) => BaseCodingAdapter;\n sendToSession: (sessionId: string, input: string) => Promise<unknown>;\n sendKeysToSession: (\n sessionId: string,\n keys: string | string[],\n ) => Promise<void>;\n writeRawToSession: (sessionId: string, data: string) => Promise<void>;\n pushDefaultRules: (sessionId: string, agentType: string) => Promise<void>;\n toSessionInfo: (\n session: SessionHandle | WorkerSessionHandle,\n workdir?: string,\n ) => SessionInfo;\n log: (msg: string) => void;\n /** Mark a session's task as delivered in the coordinator. */\n markTaskDelivered: (sessionId: string) => void;\n}\n\nconst CURSOR_POSITION_QUERY = \"\\x1b[6n\";\nconst CURSOR_POSITION_RESPONSE = \"\\x1b[1;1R\";\n\nasync function maybeRespondToTerminalQueries(\n ctx: SpawnContext,\n sessionId: string,\n data: string,\n): Promise<void> {\n if (!data.includes(CURSOR_POSITION_QUERY)) {\n return;\n }\n try {\n await ctx.writeRawToSession(sessionId, CURSOR_POSITION_RESPONSE);\n ctx.log(`Session ${sessionId} — answered terminal cursor-position query`);\n } catch (error) {\n ctx.log(\n `Session ${sessionId} — failed to answer terminal cursor-position query: ${error}`,\n );\n }\n}\n\n/**\n * Set up session output buffering for Bun worker path.\n */\nexport function setupOutputBuffer(ctx: SpawnContext, sessionId: string): void {\n const buffer: string[] = [];\n ctx.sessionOutputBuffers.set(sessionId, buffer);\n const unsubscribe = (ctx.manager as BunCompatiblePTYManager).onSessionData(\n sessionId,\n (data: string) => {\n void maybeRespondToTerminalQueries(ctx, sessionId, data);\n const lines = data.split(\"\\n\");\n buffer.push(...lines);\n while (buffer.length > (ctx.serviceConfig.maxLogLines ?? 1000)) {\n buffer.shift();\n }\n },\n );\n ctx.outputUnsubscribers.set(sessionId, unsubscribe);\n}\n\n/**\n * Set up deferred task delivery with retry logic.\n * IMPORTANT: Must be called BEFORE pushDefaultRules (which has a 1500ms sleep),\n * otherwise session_ready fires during pushDefaultRules and the listener misses it.\n */\nexport function setupDeferredTaskDelivery(\n ctx: SpawnContext,\n session: SessionHandle | WorkerSessionHandle,\n task: string,\n agentType: string,\n): void {\n const sid = session.id;\n // Per-agent post-ready delay. Claude Code has a heavy TUI that\n // renders update notices, shortcuts, and /ide hints in bursts after\n // the initial ready pattern — 300ms isn't enough to clear them all.\n const POST_READY_DELAY: Record<string, number> = {\n claude: 800,\n gemini: 300,\n codex: 300,\n aider: 200,\n };\n const settleMs = POST_READY_DELAY[agentType] ?? 300;\n\n const VERIFY_DELAY_MS = 5000; // how long to wait before checking acceptance\n const MAX_RETRIES = 2;\n const
|
|
49
|
+
"/**\n * PTY session spawning logic — extracted from PTYService for maintainability.\n *\n * Contains the deferred task delivery, retry logic, per-agent settle delays,\n * and session buffer setup that runs during spawnSession().\n *\n * @module services/pty-spawn\n */\n\nimport type { AdapterType, BaseCodingAdapter } from \"coding-agent-adapters\";\nimport type {\n BunCompatiblePTYManager,\n PTYManager,\n SessionHandle,\n SpawnConfig,\n WorkerSessionHandle,\n} from \"pty-manager\";\nimport type {\n PTYServiceConfig,\n SessionInfo,\n SpawnSessionOptions,\n} from \"./pty-types.js\";\n\n/**\n * System environment variables safe to pass to spawned agents.\n * Everything else (API keys, tokens, cloud credentials) is stripped.\n */\nconst ENV_ALLOWLIST = [\n \"PATH\",\n \"HOME\",\n \"USER\",\n \"SHELL\",\n \"LANG\",\n \"LC_ALL\",\n \"LC_CTYPE\",\n \"TERM\",\n \"COLORTERM\",\n \"TZ\",\n \"TMPDIR\",\n \"XDG_RUNTIME_DIR\",\n \"NODE_OPTIONS\",\n \"BUN_INSTALL\",\n];\n\n/**\n * Build a sanitized base environment from process.env, keeping only\n * safe system variables. Agent-specific credentials are injected\n * separately by the adapter's getEnv().\n */\nexport function buildSanitizedBaseEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const key of ENV_ALLOWLIST) {\n const val = process.env[key];\n if (val) env[key] = val;\n }\n if (!env.TERM || env.TERM.toLowerCase() === \"dumb\") {\n env.TERM = \"xterm-256color\";\n }\n if (!env.COLORTERM) {\n env.COLORTERM = \"truecolor\";\n }\n return env;\n}\n\nexport interface SpawnContext {\n manager: PTYManager | BunCompatiblePTYManager;\n usingBunWorker: boolean;\n serviceConfig: PTYServiceConfig;\n sessionMetadata: Map<string, Record<string, unknown>>;\n sessionWorkdirs: Map<string, string>;\n sessionOutputBuffers: Map<string, string[]>;\n outputUnsubscribers: Map<string, () => void>;\n taskResponseMarkers: Map<string, number>;\n getAdapter: (agentType: AdapterType) => BaseCodingAdapter;\n sendToSession: (sessionId: string, input: string) => Promise<unknown>;\n sendKeysToSession: (\n sessionId: string,\n keys: string | string[],\n ) => Promise<void>;\n writeRawToSession: (sessionId: string, data: string) => Promise<void>;\n pushDefaultRules: (sessionId: string, agentType: string) => Promise<void>;\n toSessionInfo: (\n session: SessionHandle | WorkerSessionHandle,\n workdir?: string,\n ) => SessionInfo;\n log: (msg: string) => void;\n /** Mark a session's task as delivered in the coordinator. */\n markTaskDelivered: (sessionId: string) => void;\n}\n\nconst CURSOR_POSITION_QUERY = \"\\x1b[6n\";\nconst CURSOR_POSITION_RESPONSE = \"\\x1b[1;1R\";\n\nasync function maybeRespondToTerminalQueries(\n ctx: SpawnContext,\n sessionId: string,\n data: string,\n): Promise<void> {\n if (!data.includes(CURSOR_POSITION_QUERY)) {\n return;\n }\n try {\n await ctx.writeRawToSession(sessionId, CURSOR_POSITION_RESPONSE);\n ctx.log(`Session ${sessionId} — answered terminal cursor-position query`);\n } catch (error) {\n ctx.log(\n `Session ${sessionId} — failed to answer terminal cursor-position query: ${error}`,\n );\n }\n}\n\n/**\n * Set up session output buffering for Bun worker path.\n */\nexport function setupOutputBuffer(ctx: SpawnContext, sessionId: string): void {\n const buffer: string[] = [];\n ctx.sessionOutputBuffers.set(sessionId, buffer);\n const unsubscribe = (ctx.manager as BunCompatiblePTYManager).onSessionData(\n sessionId,\n (data: string) => {\n void maybeRespondToTerminalQueries(ctx, sessionId, data);\n const lines = data.split(\"\\n\");\n buffer.push(...lines);\n while (buffer.length > (ctx.serviceConfig.maxLogLines ?? 1000)) {\n buffer.shift();\n }\n },\n );\n ctx.outputUnsubscribers.set(sessionId, unsubscribe);\n}\n\n/**\n * Set up deferred task delivery with retry logic.\n * IMPORTANT: Must be called BEFORE pushDefaultRules (which has a 1500ms sleep),\n * otherwise session_ready fires during pushDefaultRules and the listener misses it.\n */\nexport function setupDeferredTaskDelivery(\n ctx: SpawnContext,\n session: SessionHandle | WorkerSessionHandle,\n task: string,\n agentType: string,\n): void {\n const sid = session.id;\n // Per-agent post-ready delay. Claude Code has a heavy TUI that\n // renders update notices, shortcuts, and /ide hints in bursts after\n // the initial ready pattern — 300ms isn't enough to clear them all.\n const POST_READY_DELAY: Record<string, number> = {\n claude: 800,\n gemini: 300,\n codex: 300,\n aider: 200,\n };\n const settleMs = POST_READY_DELAY[agentType] ?? 300;\n const MIN_NEW_LINES_BY_AGENT: Record<string, number> = {\n claude: 1,\n gemini: 10,\n codex: 15,\n aider: 8,\n };\n\n const VERIFY_DELAY_MS = 5000; // how long to wait before checking acceptance\n const MAX_RETRIES = 2;\n const minNewLines = MIN_NEW_LINES_BY_AGENT[agentType] ?? 15;\n\n const sendTaskWithRetry = (attempt: number) => {\n const buffer = ctx.sessionOutputBuffers.get(sid);\n const baselineLength = buffer?.length ?? 0;\n\n ctx.log(\n `Session ${sid} — sending task (attempt ${attempt + 1}, ${settleMs}ms settle, baseline ${baselineLength} lines)`,\n );\n\n ctx\n .sendToSession(sid, task)\n .catch((err) =>\n ctx.log(`Failed to send deferred task to ${sid}: ${err}`),\n );\n\n // After a delay, verify the agent actually started working.\n // If the buffer barely grew, the TUI likely swallowed the input.\n if (attempt < MAX_RETRIES) {\n setTimeout(() => {\n const currentLength = buffer?.length ?? 0;\n const newLines = currentLength - baselineLength;\n if (newLines < minNewLines) {\n ctx.log(\n `Session ${sid} — task may not have been accepted (only ${newLines} new lines after ${VERIFY_DELAY_MS}ms). Retrying (attempt ${attempt + 2}/${MAX_RETRIES + 1})`,\n );\n sendTaskWithRetry(attempt + 1);\n } else {\n ctx.log(\n `Session ${sid} — task accepted (${newLines} new lines after ${VERIFY_DELAY_MS}ms)`,\n );\n }\n }, VERIFY_DELAY_MS);\n }\n };\n\n const READY_TIMEOUT_MS = 30_000;\n let taskSent = false;\n let readyTimeout: ReturnType<typeof setTimeout> | undefined;\n const sendTask = () => {\n if (taskSent) return;\n taskSent = true;\n if (readyTimeout) clearTimeout(readyTimeout);\n // Mark task as delivered so forwardReadyAsTaskComplete allows\n // subsequent session_ready events to trigger completion.\n // The session_ready handler in pty-init also calls markTaskDelivered\n // as a secondary safeguard for the normal (non-timeout) path.\n ctx.markTaskDelivered(sid);\n // Delay to let TUI finish rendering after ready detection.\n // Without this, Claude Code's TUI can swallow the Enter key\n // if it arrives during a render cycle.\n setTimeout(() => sendTaskWithRetry(0), settleMs);\n if (ctx.usingBunWorker) {\n (ctx.manager as BunCompatiblePTYManager).removeListener(\n \"session_ready\",\n onReady,\n );\n } else {\n (ctx.manager as PTYManager).removeListener(\"session_ready\", onReady);\n }\n };\n const onReady = (readySession: WorkerSessionHandle | SessionHandle) => {\n if (readySession.id !== sid) return;\n sendTask();\n };\n\n if (session.status === \"ready\") {\n sendTask();\n } else {\n if (ctx.usingBunWorker) {\n (ctx.manager as BunCompatiblePTYManager).on(\"session_ready\", onReady);\n } else {\n (ctx.manager as PTYManager).on(\"session_ready\", onReady);\n }\n readyTimeout = setTimeout(() => {\n if (!taskSent) {\n ctx.log(\n `Session ${sid} — ready event not received within ${READY_TIMEOUT_MS}ms, forcing task delivery`,\n );\n sendTask();\n }\n }, READY_TIMEOUT_MS);\n }\n}\n\n/**\n * Build the SpawnConfig and env vars from SpawnSessionOptions.\n */\nexport function buildSpawnConfig(\n sessionId: string,\n options: SpawnSessionOptions,\n workdir: string,\n): SpawnConfig & { id: string } {\n // Map model preferences to adapter-specific env vars\n const modelPrefs = options.metadata?.modelPrefs as\n | { powerful?: string; fast?: string }\n | undefined;\n let modelEnv: Record<string, string> | undefined;\n if (modelPrefs?.powerful) {\n const envKeyMap: Record<string, string> = {\n claude: \"ANTHROPIC_MODEL\",\n gemini: \"GEMINI_MODEL\",\n codex: \"OPENAI_MODEL\",\n aider: \"AIDER_MODEL\",\n };\n const key = envKeyMap[options.agentType];\n if (key) modelEnv = { [key]: modelPrefs.powerful };\n }\n\n return {\n id: sessionId,\n name: options.name,\n type: options.agentType,\n workdir,\n inheritProcessEnv: false,\n env: {\n ...buildSanitizedBaseEnv(),\n ...options.env,\n ...modelEnv,\n PARALLAX_SESSION_ID: sessionId,\n },\n ...(options.skipAdapterAutoResponse\n ? { skipAdapterAutoResponse: true }\n : {}),\n adapterConfig: {\n ...(options.credentials as Record<string, unknown> | undefined),\n ...(options.customCredentials\n ? { custom: options.customCredentials }\n : {}),\n interactive: true,\n approvalPreset: options.approvalPreset,\n // Forward adapter-relevant metadata (e.g. provider preference for Aider)\n ...(options.metadata?.provider\n ? { provider: options.metadata.provider }\n : {}),\n ...(options.metadata?.modelTier\n ? { modelTier: options.metadata.modelTier }\n : {}),\n },\n };\n}\n",
|
|
49
50
|
"/**\n * Shared types and helpers for the PTY service layer.\n *\n * Extracted from pty-service.ts to keep that module lean and allow\n * other modules (pty-spawn, pty-init, actions) to import lightweight\n * type-only dependencies without pulling in the full PTYService class.\n *\n * @module services/pty-types\n */\n\nimport type {\n AdapterType,\n AgentCredentials,\n ApprovalPreset,\n} from \"coding-agent-adapters\";\nimport type { SessionHandle } from \"pty-manager\";\n\nexport interface PTYServiceConfig {\n /** Maximum output lines to keep per session (default: 1000) */\n maxLogLines?: number;\n /** Enable debug logging */\n debug?: boolean;\n /** Auto-register task-agent adapters (default: true) */\n registerCodingAdapters?: boolean;\n /** Maximum concurrent PTY sessions (default: 8) */\n maxConcurrentSessions?: number;\n /**\n * Default approval preset for task agents when not specified per-spawn.\n * Controls what tools the agent can use without asking for permission.\n * - \"readonly\" — Read-only tools only\n * - \"standard\" — Read + write, asks for shell/network\n * - \"permissive\" — Most tools auto-approved, asks for destructive ops\n * - \"autonomous\" — All tools auto-approved (yolo mode)\n * Default: \"autonomous\"\n */\n defaultApprovalPreset?: ApprovalPreset;\n}\n\n/** Available task-agent types */\nexport type CodingAgentType = \"shell\" | \"pi\" | AdapterType;\n\nconst PI_AGENT_ALIASES = new Set([\n \"pi\",\n \"pi-ai\",\n \"piai\",\n \"pi-coding-agent\",\n \"picodingagent\",\n]);\n\n/** True when the user requested the Pi coding agent. */\nexport const isPiAgentType = (input: string | undefined | null): boolean => {\n if (!input) return false;\n return PI_AGENT_ALIASES.has(input.toLowerCase().trim());\n};\n\n/** Normalize user-provided agent type string to a valid CodingAgentType */\nexport const normalizeAgentType = (input: string): CodingAgentType => {\n const normalized = input.toLowerCase().trim();\n if (isPiAgentType(normalized)) {\n // PI currently runs through the generic shell adapter.\n return \"shell\";\n }\n const mapping: Record<string, CodingAgentType> = {\n claude: \"claude\",\n \"claude-code\": \"claude\",\n claudecode: \"claude\",\n codex: \"codex\",\n openai: \"codex\",\n \"openai-codex\": \"codex\",\n gemini: \"gemini\",\n google: \"gemini\",\n aider: \"aider\",\n shell: \"shell\",\n bash: \"shell\",\n };\n return mapping[normalized] ?? \"claude\";\n};\n\n/** Build the initial shell command for Pi agent sessions. */\nexport const toPiCommand = (task: string | undefined): string => {\n const trimmed = task?.trim();\n if (!trimmed) return \"pi\";\n const shellSafe = `'${trimmed.replace(/'/g, `'\"'\"'`)}'`;\n return `pi ${shellSafe}`;\n};\n\nexport interface SpawnSessionOptions {\n /** Human-readable session name */\n name: string;\n /** Adapter type: \"shell\" | \"pi\" | \"claude\" | \"gemini\" | \"codex\" | \"aider\" */\n agentType: CodingAgentType;\n /** Working directory for the session */\n workdir?: string;\n /** Initial command/task to send */\n initialTask?: string;\n /** Environment variables */\n env?: Record<string, string>;\n /** Session metadata for tracking */\n metadata?: Record<string, unknown>;\n /** Credentials for coding agents (API keys, tokens) */\n credentials?: AgentCredentials;\n /** Memory/instructions content to write to the agent's memory file before spawning */\n memoryContent?: string;\n /** Approval preset controlling tool permissions (readonly, standard, permissive, autonomous) */\n approvalPreset?: ApprovalPreset;\n /** Custom credentials for MCP servers or other integrations */\n customCredentials?: Record<string, string>;\n /** When true, adapter-level blocking prompts (tool permissions, file access)\n * are emitted with autoResponded=false instead of being auto-handled.\n * Used by the swarm coordinator to route decisions through its LLM loop. */\n skipAdapterAutoResponse?: boolean;\n}\n\nexport interface SessionInfo {\n id: string;\n name: string;\n agentType: string;\n workdir: string;\n status: SessionHandle[\"status\"];\n createdAt: Date;\n lastActivityAt: Date;\n metadata?: Record<string, unknown>;\n}\n\n/** Known event names emitted by the PTY layer. */\nexport type SessionEventName =\n | \"ready\"\n | \"blocked\"\n | \"login_required\"\n | \"task_complete\"\n | \"tool_running\"\n | \"stopped\"\n | \"error\"\n | \"message\";\n\ntype SessionEventCallback = (\n sessionId: string,\n event: string,\n data: unknown,\n) => void;\n\nexport type { SessionEventCallback };\n",
|
|
50
51
|
"/**\n * Stall classification subsystem — determines what a \"stalled\" task agent\n * session is doing (finished, waiting for input, still working, or errored).\n *\n * Extracted as standalone functions that receive dependencies as parameters,\n * making them easy to test without coupling to PTYService.\n *\n * @module services/stall-classifier\n */\n\nimport { type IAgentRuntime, ModelType } from \"@elizaos/core\";\nimport {\n buildTaskCompletionTimeline,\n extractTaskCompletionTraceRecords,\n type StallClassification,\n} from \"pty-manager\";\nimport type { AgentMetricsTracker } from \"./agent-metrics.js\";\nimport { stripAnsi } from \"./ansi-utils.js\";\nimport type {\n TaskContextSummary,\n DecisionHistoryEntry,\n} from \"./swarm-coordinator-prompts.js\";\nimport { withTrajectoryContext } from \"./trajectory-context.js\";\n\n/** Everything the classifier needs, passed in from PTYService. */\nexport interface StallClassifierContext {\n sessionId: string;\n recentOutput: string;\n agentType: string;\n buffers: Map<string, string[]>;\n traceEntries: Array<string | Record<string, unknown>>;\n runtime: IAgentRuntime;\n manager: {\n get(id: string): { startedAt?: string | Date } | null | undefined;\n } | null;\n metricsTracker: AgentMetricsTracker;\n /** Write debug snapshots to ~/.milady/debug/ on stall (default: false) */\n debugSnapshots?: boolean;\n log: (msg: string) => void;\n}\n\n/**\n * Build the LLM system prompt used to classify stalled output.\n */\nexport function buildStallClassificationPrompt(\n agentType: string,\n sessionId: string,\n output: string,\n): string {\n return (\n `You are Milady, an AI orchestrator managing task-agent sessions. ` +\n `A ${agentType} task agent (session: ${sessionId}) appears to have stalled — ` +\n `it has stopped producing output while in a busy state.\\n\\n` +\n `Here is the recent terminal output:\\n` +\n `---\\n${output.slice(-1500)}\\n---\\n\\n` +\n `Classify what's happening. Read the output carefully and choose the MOST specific match:\\n\\n` +\n `1. \"task_complete\" — The agent FINISHED its task and returned to its idle prompt. ` +\n `Strong indicators: a summary of completed work (\"Done\", \"All done\", \"Here's what was completed\"), ` +\n `timing info (\"Baked for\", \"Churned for\", \"Crunched for\", \"Cooked for\", \"Worked for\"), ` +\n `or the agent's main prompt symbol (❯) appearing AFTER completion output. ` +\n `If the output contains evidence of completed work followed by an idle prompt, this is ALWAYS task_complete, ` +\n `even though the agent is technically \"waiting\" — it is waiting for a NEW task, not asking a question.\\n\\n` +\n `2. \"waiting_for_input\" — The agent is MID-TASK and blocked on a specific question or permission prompt. ` +\n `The agent has NOT finished its work — it needs a response to continue. ` +\n `Examples: Y/n confirmation, file permission dialogs, \"Do you want to proceed?\", ` +\n `tool approval prompts, or interactive menus. ` +\n `This is NOT the same as the agent sitting at its idle prompt after finishing work.\\n\\n` +\n `3. \"still_working\" — The agent is actively processing (API call, compilation, thinking, etc.) ` +\n `and has not produced final output yet. No prompt or completion summary visible.\\n\\n` +\n `4. \"error\" — The agent hit an error state (crash, unrecoverable error, stack trace).\\n\\n` +\n `5. \"tool_running\" — The agent is using an external tool (browser automation, ` +\n `MCP tool, etc.). Indicators: \"Claude in Chrome\", \"javascript_tool\", ` +\n `\"computer_tool\", \"screenshot\", \"navigate\", tool execution output. ` +\n `The agent is actively working but the terminal may be quiet.\\n\\n` +\n `IMPORTANT: If you see BOTH completed work output AND an idle prompt (❯), choose \"task_complete\". ` +\n `Only choose \"waiting_for_input\" if the agent is clearly asking a question mid-task.\\n\\n` +\n `If \"waiting_for_input\", also provide:\\n` +\n `- \"prompt\": the text of what it's asking\\n` +\n `- \"suggestedResponse\": what to type/send. Use \"keys:enter\" for TUI menu confirmation, ` +\n `\"keys:down,enter\" to select a non-default option, or plain text like \"y\" for text prompts.\\n\\n` +\n `Respond with ONLY a JSON object:\\n` +\n `{\"state\": \"...\", \"prompt\": \"...\", \"suggestedResponse\": \"...\"}`\n );\n}\n\n/**\n * Write a debug snapshot to ~/.milady/debug/ for offline stall analysis.\n */\nexport async function writeStallSnapshot(\n sessionId: string,\n agentType: string,\n recentOutput: string,\n effectiveOutput: string,\n buffers: Map<string, string[]>,\n traceEntries: Array<string | Record<string, unknown>>,\n log: (msg: string) => void,\n): Promise<void> {\n try {\n const fs = await import(\"node:fs\");\n const os = await import(\"node:os\");\n const path = await import(\"node:path\");\n const snapshotDir = path.join(os.homedir(), \".milady\", \"debug\");\n fs.mkdirSync(snapshotDir, { recursive: true });\n const ourBuffer = buffers.get(sessionId);\n const ourTail = ourBuffer\n ? ourBuffer.slice(-100).join(\"\\n\")\n : \"(no buffer)\";\n void ourTail; // used in snapshot context but not directly printed\n let traceTimeline = \"(no trace entries)\";\n try {\n const records = extractTaskCompletionTraceRecords(traceEntries);\n const timeline = buildTaskCompletionTimeline(records, {\n adapterType: agentType,\n });\n traceTimeline = JSON.stringify(timeline, null, 2);\n } catch (e) {\n traceTimeline = `(trace error: ${e})`;\n }\n const snapshot = [\n `=== STALL SNAPSHOT @ ${new Date().toISOString()} ===`,\n `Session: ${sessionId} | Agent: ${agentType}`,\n `recentOutput length: ${recentOutput.length} | effectiveOutput length: ${effectiveOutput.length}`,\n ``,\n `--- effectiveOutput (what LLM sees) ---`,\n effectiveOutput.slice(-1500),\n ``,\n `--- trace timeline ---`,\n traceTimeline,\n ``,\n `--- raw trace entries (last 20 of ${traceEntries.length}) ---`,\n traceEntries.slice(-20).join(\"\\n\"),\n ``,\n ].join(\"\\n\");\n const snapshotPath = path.join(\n snapshotDir,\n `stall-snapshot-${sessionId}.txt`,\n );\n fs.writeFileSync(snapshotPath, snapshot);\n log(`Stall snapshot → ${snapshotPath}`);\n } catch (_) {\n /* best-effort */\n }\n}\n\n/**\n * Main stall classification logic. Determines what a stalled session is doing\n * by checking the buffer, building a prompt, and asking the LLM.\n */\nexport async function classifyStallOutput(\n ctx: StallClassifierContext,\n): Promise<StallClassification | null> {\n const {\n sessionId,\n recentOutput,\n agentType,\n buffers,\n traceEntries,\n runtime,\n manager,\n metricsTracker,\n log,\n } = ctx;\n\n metricsTracker.incrementStalls(agentType);\n\n // Use our own buffer if pty-manager's recentOutput is empty or too short.\n let effectiveOutput = recentOutput;\n if (!recentOutput || recentOutput.trim().length < 200) {\n const ourBuffer = buffers.get(sessionId);\n if (ourBuffer && ourBuffer.length > 0) {\n const rawTail = ourBuffer.slice(-100).join(\"\\n\");\n const stripped = stripAnsi(rawTail);\n if (stripped.length > effectiveOutput.length) {\n effectiveOutput = stripped;\n log(\n `Using own buffer for stall classification (${effectiveOutput.length} chars after stripping, pty-manager had ${recentOutput.length})`,\n );\n }\n }\n }\n\n const systemPrompt = buildStallClassificationPrompt(\n agentType,\n sessionId,\n effectiveOutput,\n );\n\n // Dump debug snapshot for offline analysis (opt-in via PTYServiceConfig.debug)\n if (ctx.debugSnapshots) {\n await writeStallSnapshot(\n sessionId,\n agentType,\n recentOutput,\n effectiveOutput,\n buffers,\n traceEntries,\n log,\n );\n }\n\n try {\n log(`Stall detected for ${sessionId}, asking LLM to classify...`);\n const result = await withTrajectoryContext(\n runtime,\n {\n source: \"orchestrator\",\n decisionType: \"stall-classification\",\n sessionId,\n },\n () => runtime.useModel(ModelType.TEXT_SMALL, { prompt: systemPrompt }),\n );\n\n const jsonMatch = result.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n log(`Stall classification: no JSON in LLM response`);\n return null;\n }\n\n const parsed = JSON.parse(jsonMatch[0]);\n const validStates: string[] = [\n \"waiting_for_input\",\n \"still_working\",\n \"task_complete\",\n \"error\",\n \"tool_running\",\n ];\n if (!validStates.includes(parsed.state)) {\n log(`Stall classification: invalid state \"${parsed.state}\"`);\n return null;\n }\n // Map tool_running → still_working (StallClassification doesn't have tool_running)\n const mappedState: StallClassification[\"state\"] =\n parsed.state === \"tool_running\" ? \"still_working\" : parsed.state;\n const classification: StallClassification = {\n state: mappedState,\n prompt: parsed.prompt,\n suggestedResponse: parsed.suggestedResponse,\n };\n log(\n `Stall classification for ${sessionId}: ${classification.state}${classification.suggestedResponse ? ` → \"${classification.suggestedResponse}\"` : \"\"}`,\n );\n if (classification.state === \"task_complete\") {\n const session = manager?.get(sessionId);\n const durationMs = session?.startedAt\n ? Date.now() - new Date(session.startedAt).getTime()\n : 0;\n metricsTracker.recordCompletion(agentType, \"classifier\", durationMs);\n }\n return classification;\n } catch (err) {\n log(`Stall classification failed: ${err}`);\n return null;\n }\n}\n\n// ─── Combined Classify + Decide (for coordinator-managed autonomous sessions) ───\n\n/** Context for the combined classify-and-decide call. */\nexport interface CoordinatorClassifyContext extends StallClassifierContext {\n taskContext: TaskContextSummary;\n decisionHistory?: DecisionHistoryEntry[];\n}\n\n/**\n * Build a combined prompt that classifies the stall AND decides how to respond,\n * merging stall classification with coordinator decision guidelines.\n *\n * Used for coordinator-managed sessions in autonomous mode to eliminate the\n * redundant second LLM call in the coordinator's handleBlocked path.\n */\nexport function buildCombinedClassifyDecidePrompt(\n agentType: string,\n sessionId: string,\n output: string,\n taskContext: TaskContextSummary,\n decisionHistory: DecisionHistoryEntry[],\n): string {\n const historySection =\n decisionHistory.length > 0\n ? `\\nPrevious decisions for this session:\\n${decisionHistory\n .slice(-5)\n .map(\n (d, i) =>\n ` ${i + 1}. [${d.event}] prompt=\"${d.promptText}\" → ${d.action}${d.response ? ` (\"${d.response}\")` : \"\"} — ${d.reasoning}`,\n )\n .join(\"\\n\")}\\n`\n : \"\";\n\n return (\n `You are Milady, an AI orchestrator managing task-agent sessions. ` +\n `A ${agentType} task agent (session: ${sessionId}) appears to have stalled — ` +\n `it has stopped producing output while in a busy state.\\n\\n` +\n `Original task: \"${taskContext.originalTask}\"\\n` +\n `Working directory: ${taskContext.workdir}\\n` +\n `Repository: ${taskContext.repo ?? \"none (scratch directory)\"}\\n` +\n historySection +\n `\\nHere is the recent terminal output:\\n` +\n `---\\n${output.slice(-1500)}\\n---\\n\\n` +\n `Classify what's happening AND decide how to respond. Read the output carefully.\\n\\n` +\n `Classification states:\\n\\n` +\n `1. \"task_complete\" — The agent FINISHED its task and returned to its idle prompt. ` +\n `Strong indicators: a summary of completed work, timing info, ` +\n `or the agent's main prompt symbol (❯) appearing AFTER completion output.\\n\\n` +\n `2. \"waiting_for_input\" — The agent is MID-TASK and blocked on a specific question or permission prompt. ` +\n `Examples: Y/n confirmation, file permission dialogs, tool approval prompts, interactive menus.\\n\\n` +\n `3. \"still_working\" — The agent is actively processing (API call, compilation, thinking). ` +\n `No prompt or completion summary visible.\\n\\n` +\n `4. \"error\" — The agent hit an error state (crash, unrecoverable error, stack trace).\\n\\n` +\n `5. \"tool_running\" — The agent is using an external tool (browser automation, MCP tool, etc.).\\n\\n` +\n `If \"waiting_for_input\", you must also decide how to respond. Guidelines:\\n` +\n `- IMPORTANT: If the prompt asks to approve access to files or directories OUTSIDE the working ` +\n `directory (${taskContext.workdir}), DECLINE the request. Respond with \"n\" and tell the agent: ` +\n `\"That path is outside your workspace. Use ${taskContext.workdir} instead.\"\\n` +\n `- For tool approval prompts (file writes, shell commands), respond \"y\" or use \"keys:enter\".\\n` +\n `- For Y/n confirmations that align with the original task, respond \"y\".\\n` +\n `- For TUI menus, use \"keys:enter\" for default or \"keys:down,enter\" for non-default.\\n` +\n `- If the prompt asks for information NOT in the original task, set suggestedResponse to null ` +\n `(this will escalate to the human).\\n` +\n `- If a PR was just created, the task is likely done — classify as \"task_complete\".\\n\\n` +\n `Respond with ONLY a JSON object:\\n` +\n `{\"state\": \"...\", \"prompt\": \"...\", \"suggestedResponse\": \"...\"}`\n );\n}\n\n/**\n * Combined classify-and-decide for coordinator-managed autonomous sessions.\n *\n * Performs classification AND coordinator-quality response decision in a single\n * LLM call. The suggestedResponse is kept intact (not stripped), so pty-manager\n * auto-responds and the coordinator receives autoResponded: true — skipping\n * the second LLM call in handleBlocked().\n */\nexport async function classifyAndDecideForCoordinator(\n ctx: CoordinatorClassifyContext,\n): Promise<StallClassification | null> {\n const {\n sessionId,\n recentOutput,\n agentType,\n buffers,\n traceEntries,\n runtime,\n manager,\n metricsTracker,\n taskContext,\n decisionHistory = [],\n log,\n } = ctx;\n\n metricsTracker.incrementStalls(agentType);\n\n // Buffer fallback — same logic as classifyStallOutput\n let effectiveOutput = recentOutput;\n if (!recentOutput || recentOutput.trim().length < 200) {\n const ourBuffer = buffers.get(sessionId);\n if (ourBuffer && ourBuffer.length > 0) {\n const rawTail = ourBuffer.slice(-100).join(\"\\n\");\n const stripped = stripAnsi(rawTail);\n if (stripped.length > effectiveOutput.length) {\n effectiveOutput = stripped;\n log(\n `Using own buffer for combined classify+decide (${effectiveOutput.length} chars after stripping, pty-manager had ${recentOutput.length})`,\n );\n }\n }\n }\n\n const systemPrompt = buildCombinedClassifyDecidePrompt(\n agentType,\n sessionId,\n effectiveOutput,\n taskContext,\n decisionHistory,\n );\n\n if (ctx.debugSnapshots) {\n await writeStallSnapshot(\n sessionId,\n agentType,\n recentOutput,\n effectiveOutput,\n buffers,\n traceEntries,\n log,\n );\n }\n\n try {\n log(\n `Stall detected for coordinator-managed ${sessionId}, combined classify+decide...`,\n );\n const result = await withTrajectoryContext(\n runtime,\n {\n source: \"orchestrator\",\n decisionType: \"stall-classify-decide\",\n sessionId,\n taskLabel: taskContext.label,\n repo: taskContext.repo,\n workdir: taskContext.workdir,\n originalTask: taskContext.originalTask,\n },\n () => runtime.useModel(ModelType.TEXT_SMALL, { prompt: systemPrompt }),\n );\n\n const jsonMatch = result.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n log(`Combined classify+decide: no JSON in LLM response`);\n return null;\n }\n\n const parsed = JSON.parse(jsonMatch[0]);\n const validStates: string[] = [\n \"waiting_for_input\",\n \"still_working\",\n \"task_complete\",\n \"error\",\n \"tool_running\",\n ];\n if (!validStates.includes(parsed.state)) {\n log(`Combined classify+decide: invalid state \"${parsed.state}\"`);\n return null;\n }\n\n const mappedState: StallClassification[\"state\"] =\n parsed.state === \"tool_running\" ? \"still_working\" : parsed.state;\n\n // Deterministic safety guard: if the LLM approved access to a path\n // outside the workspace, override with a decline. This runs before\n // pty-manager auto-responds, so the unsafe approval never reaches the agent.\n if (mappedState === \"waiting_for_input\" && parsed.suggestedResponse) {\n const promptText = typeof parsed.prompt === \"string\" ? parsed.prompt : \"\";\n const responseText = parsed.suggestedResponse.trim().toLowerCase();\n const approving = [\"y\", \"yes\", \"keys:enter\", \"keys:down,enter\"].includes(responseText);\n const hasAbsPath = /(?:^|[\\s\"'`])\\/[^\\s\"'`]+/.test(promptText);\n if (approving && hasAbsPath && !promptText.includes(taskContext.workdir)) {\n log(`Combined classify+decide: overriding out-of-scope approval for ${sessionId}`);\n parsed.suggestedResponse = `n — That path is outside your workspace. Use ${taskContext.workdir} instead.`;\n }\n }\n\n const classification: StallClassification = {\n state: mappedState,\n prompt: parsed.prompt,\n suggestedResponse: parsed.suggestedResponse,\n };\n log(\n `Combined classify+decide for ${sessionId}: ${classification.state}${classification.suggestedResponse ? ` → \"${classification.suggestedResponse}\"` : \"\"}`,\n );\n if (classification.state === \"task_complete\") {\n const session = manager?.get(sessionId);\n const durationMs = session?.startedAt\n ? Date.now() - new Date(session.startedAt).getTime()\n : 0;\n metricsTracker.recordCompletion(agentType, \"classifier\", durationMs);\n }\n return classification;\n } catch (err) {\n log(`Combined classify+decide failed: ${err}`);\n return null;\n }\n}\n",
|
|
51
|
-
"/**\n * Swarm Coordinator — Event Bridge & Autonomous Coordination Loop\n *\n * Bridges PTY session events to:\n * 1. SSE clients (frontend dashboard) for real-time status\n * 2. LLM coordination decisions for unhandled blocking prompts\n *\n * The coordinator subscribes to PTYService session events and:\n * - Skips events already handled by auto-response rules (autoResponded=true)\n * - Routes unhandled blocking prompts through supervision levels:\n * - autonomous: LLM decides immediately\n * - confirm: queued for human approval\n * - notify: broadcast only (no action)\n *\n * Heavy logic is extracted into:\n * - swarm-decision-loop.ts (blocked, turn-complete, LLM decisions)\n * - swarm-idle-watchdog.ts (idle session scanning)\n *\n * @module services/swarm-coordinator\n */\n\nimport type { ServerResponse } from \"node:http\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { extractDevServerUrl } from \"./ansi-utils.js\";\nimport { SwarmHistory } from \"./swarm-history.js\";\nimport {\n\tisUsageExhaustedTaskAgentError,\n\tmarkTaskAgentFrameworkHealthy,\n\tmarkTaskAgentFrameworkUnavailable,\n} from \"./task-agent-frameworks.js\";\nimport { deriveTaskAcceptanceCriteria } from \"./task-acceptance.js\";\nimport {\n type CreateTaskThreadInput,\n type TaskDecisionRecord,\n type TaskPendingDecisionRecord,\n type TaskSessionRecord,\n type TaskThreadDetail,\n type TaskThreadStatus,\n type TaskThreadSummary,\n TaskRegistry,\n} from \"./task-registry.js\";\nimport type { PTYService } from \"./pty-service.js\";\nimport type { CodingAgentType } from \"./pty-types.js\";\nimport type {\n\tCoordinationLLMResponse,\n\tSharedDecision,\n} from \"./swarm-coordinator-prompts.js\";\nimport {\n\tcheckAllTasksComplete,\n\tclearDeferredTurnCompleteTimers,\n\texecuteDecision as execDecision,\n\thandleBlocked,\n\thandleTurnComplete,\n} from \"./swarm-decision-loop.js\";\nimport { scanIdleSessions } from \"./swarm-idle-watchdog.js\";\n\n// ─── Types ───\n\n/** Callback injected by server.ts to route chat messages to the user's conversation. */\nexport type ChatMessageCallback = (\n\ttext: string,\n\tsource?: string,\n) => Promise<void>;\n\n/** Callback injected by server.ts to relay coordinator events to WebSocket clients. */\nexport type WsBroadcastCallback = (event: SwarmEvent) => void;\n\n/**\n * Callback injected by server.ts to route coordinator events through\n * Milaidy's full ElizaOS pipeline (conversation memory, personality, actions).\n * Returns a CoordinationLLMResponse parsed from Milaidy's natural language\n * response, or null if no actionable JSON block was found.\n */\nexport type AgentDecisionCallback = (\n\teventDescription: string,\n\tsessionId: string,\n\ttaskContext: TaskContext,\n) => Promise<CoordinationLLMResponse | null>;\n\n/** Per-task summary included in the swarm complete payload. */\nexport interface TaskCompletionSummary {\n\tsessionId: string;\n\tlabel: string;\n\tagentType: string;\n\toriginalTask: string;\n\tstatus: string;\n\tcompletionSummary: string;\n}\n\n/** Callback fired when all tasks in a swarm reach terminal state. */\nexport type SwarmCompleteCallback = (payload: {\n\ttasks: TaskCompletionSummary[];\n\ttotal: number;\n\tcompleted: number;\n\tstopped: number;\n\terrored: number;\n}) => Promise<void>;\n\nexport type SupervisionLevel = \"autonomous\" | \"confirm\" | \"notify\";\n\nexport interface TaskContext {\n\tthreadId: string;\n\tsessionId: string;\n\tagentType: CodingAgentType;\n\tlabel: string;\n\toriginalTask: string;\n\tworkdir: string;\n\t/** Repository URL if provided, undefined for scratch directory tasks. */\n\trepo?: string;\n\tstatus:\n\t\t| \"active\"\n\t\t| \"blocked\"\n\t\t| \"tool_running\"\n\t\t| \"completed\"\n\t\t| \"error\"\n\t\t| \"stopped\";\n\tdecisions: CoordinationDecision[];\n\tautoResolvedCount: number;\n\tregisteredAt: number;\n\t/** Timestamp of the last session event (any type). Used by idle watchdog. */\n\tlastActivityAt: number;\n\t/** How many idle checks have been performed on this session. */\n\tidleCheckCount: number;\n\t/** True once the initial task has been delivered to the agent. */\n\ttaskDelivered: boolean;\n\t/** Summary of what the agent accomplished, populated on completion. */\n\tcompletionSummary?: string;\n\t/** Index into sharedDecisions[] — tracks which decisions this agent has already seen. */\n\tlastSeenDecisionIndex: number;\n\t/** Timestamp of last coordinator-sent input. Used to suppress stall/turn-complete\n\t * events for a grace period so the agent has time to process the input. */\n\tlastInputSentAt?: number;\n\t/** Timestamp when the task was last transitioned to `stopped`. */\n\tstoppedAt?: number;\n}\n\nexport interface CoordinationDecision {\n\ttimestamp: number;\n\tevent: string;\n\tpromptText: string;\n\tdecision:\n\t\t| \"respond\"\n\t\t| \"escalate\"\n\t\t| \"ignore\"\n\t\t| \"complete\"\n\t\t| \"auto_resolved\"\n\t\t| \"stopped\";\n\tresponse?: string;\n\treasoning: string;\n}\n\nexport interface SwarmEvent {\n\ttype: string;\n\tsessionId: string;\n\ttimestamp: number;\n\tdata: unknown;\n}\n\nexport interface PendingDecision {\n\tsessionId: string;\n\tpromptText: string;\n\trecentOutput: string;\n\tllmDecision: CoordinationLLMResponse;\n\ttaskContext: TaskContext;\n\tcreatedAt: number;\n}\n\n/**\n * Context interface exposing internal state and helpers to extracted modules.\n * Implemented by SwarmCoordinator — passed as `this` to module-level functions.\n */\nexport interface SwarmCoordinatorContext {\n\treadonly runtime: IAgentRuntime;\n\treadonly ptyService: PTYService | null;\n\treadonly taskRegistry: TaskRegistry;\n\treadonly tasks: Map<string, TaskContext>;\n\treadonly inFlightDecisions: Set<string>;\n\treadonly pendingDecisions: Map<string, PendingDecision>;\n\t/** Buffered task_complete events that arrived while an in-flight decision was running. */\n\treadonly pendingTurnComplete: Map<string, unknown>;\n\t/** Fingerprint of the last blocked prompt per session — for re-render dedup. */\n\treadonly lastBlockedPromptFingerprint: Map<string, string>;\n\t/** Buffered blocked events that arrived while an in-flight decision was running. */\n\treadonly pendingBlocked: Map<string, unknown>;\n\t/** Last-seen output snapshot per session — used by idle watchdog. */\n\treadonly lastSeenOutput: Map<string, string>;\n\t/** Timestamp of last tool_running chat notification per session — for throttling. */\n\treadonly lastToolNotification: Map<string, number>;\n\n\t/** Whether LLM decisions are paused (user sent a chat message). */\n\treadonly isPaused: boolean;\n\n\t/** Significant decisions shared across the swarm. */\n\treadonly sharedDecisions: SharedDecision[];\n\n\t/** Get the shared context brief from the planning phase. */\n\tgetSwarmContext(): string;\n\n\t/**\n\t * Guard flag: whether the swarm_complete event has already been fired\n\t * for the current swarm lifecycle. Set to `true` by `checkAllTasksComplete()`\n\t * when all tasks reach terminal state. Reset to `false` by:\n\t * - `stop()` — full coordinator teardown\n\t * - `registerTask()` — when detecting a new swarm (all previous tasks terminal)\n\t */\n\tswarmCompleteNotified: boolean;\n\n\tbroadcast(event: SwarmEvent): void;\n\tsendChatMessage(text: string, source?: string): void;\n\tlog(message: string): void;\n\tgetSupervisionLevel(): SupervisionLevel;\n\tgetAgentDecisionCallback(): AgentDecisionCallback | null;\n\tgetSwarmCompleteCallback(): SwarmCompleteCallback | null;\n\trecordDecision(\n\t\ttaskCtx: TaskContext,\n\t\tdecision: CoordinationDecision,\n\t): Promise<void>;\n\tsyncTaskContext(taskCtx: TaskContext): Promise<void>;\n}\n\n// ─── Constants ───\n\n/** Time to buffer events for unregistered sessions (ms). */\n/** Exponential backoff delays for unregistered session buffer retries. */\nconst UNREGISTERED_RETRY_DELAYS = [2000, 4000, 8000, 16000];\n/** Absolute maximum wait time before discarding unregistered events. */\nconst UNREGISTERED_MAX_TOTAL_MS = 30_000;\n\n/** Coalesce rapid turn-complete events within this window (ms). */\nconst TURN_COMPLETE_COALESCE_MS = 500;\n\n/** How often the idle watchdog scans for idle sessions (ms). */\nconst IDLE_SCAN_INTERVAL_MS = 60 * 1000; // 1 minute\n\n/** How long to wait before auto-resuming a paused coordinator (ms). */\nconst PAUSE_TIMEOUT_MS = 30_000;\n/** Max events to buffer before WS bridge is wired. */\nconst MAX_PRE_BRIDGE_BUFFER = 100;\n/** Grace window where a late task_complete can recover a recently-stopped task. */\nconst STOPPED_RECOVERY_WINDOW_MS = 90_000;\n\n// ─── Service ───\n\nexport class SwarmCoordinator implements SwarmCoordinatorContext {\n\tstatic serviceType = \"SWARM_COORDINATOR\";\n\n\treadonly runtime: IAgentRuntime;\n\treadonly taskRegistry: TaskRegistry;\n\tptyService: PTYService | null = null;\n\tprivate unsubscribeEvents: (() => void) | null = null;\n\n\t/** Per-session task context. */\n\treadonly tasks: Map<string, TaskContext> = new Map();\n\n\t/** SSE clients receiving live events. */\n\tprivate sseClients: Set<ServerResponse> = new Set();\n\n\t/** Supervision level (default: autonomous). */\n\tprivate supervisionLevel: SupervisionLevel = \"autonomous\";\n\n\t/** Pending confirmations for \"confirm\" mode. */\n\treadonly pendingDecisions: Map<string, PendingDecision> = new Map();\n\n\t/** In-flight decision lock — prevents parallel LLM calls for same session. */\n\treadonly inFlightDecisions: Set<string> = new Set();\n\n\t/** Buffered task_complete events that arrived while an in-flight decision was running. */\n\treadonly pendingTurnComplete: Map<string, unknown> = new Map();\n\n\t/** Fingerprint of the last blocked prompt per session — for re-render dedup. */\n\treadonly lastBlockedPromptFingerprint: Map<string, string> = new Map();\n\n\t/** Buffered blocked events that arrived while an in-flight decision was running. */\n\treadonly pendingBlocked: Map<string, unknown> = new Map();\n\n\t/** Callback to send chat messages to the user's conversation UI. */\n\tprivate chatCallback: ChatMessageCallback | null = null;\n\n\t/** Callback to relay coordinator events to WebSocket clients. */\n\tprivate wsBroadcast: WsBroadcastCallback | null = null;\n\n\t/** Callback to route coordinator events through Milaidy's full pipeline. */\n\tprivate agentDecisionCb: AgentDecisionCallback | null = null;\n\n\t/** Callback fired when all swarm tasks complete — for synthesis. */\n\tprivate swarmCompleteCb: SwarmCompleteCallback | null = null;\n\n\t/** Buffer for events arriving before task registration. */\n\tprivate unregisteredBuffer: Map<\n\t\tstring,\n\t\tArray<{ event: string; data: unknown; receivedAt: number }>\n\t> = new Map();\n\n\t/** Idle watchdog timer handle. */\n\tprivate idleWatchdogTimer: ReturnType<typeof setInterval> | null = null;\n\n\t/** Last-seen output snapshot per session — used by idle watchdog to detect data flow. */\n\treadonly lastSeenOutput: Map<string, string> = new Map();\n\n\t/** Timestamp of last tool_running chat notification per session — for throttling. */\n\treadonly lastToolNotification: Map<string, number> = new Map();\n\n\t/** Whether LLM decisions are paused (user sent a chat message). */\n\tprivate _paused = false;\n\n\t/** Significant decisions shared across the swarm (Layer 2). */\n\treadonly sharedDecisions: SharedDecision[] = [];\n\n\t/** Shared context brief generated during swarm planning phase. */\n\tprivate _swarmContext = \"\";\n\n\t/** @see SwarmCoordinatorContext.swarmCompleteNotified */\n\tswarmCompleteNotified = false;\n\n\t/** Buffered events during pause — replayed on resume. */\n\tprivate pauseBuffer: Array<{\n\t\tsessionId: string;\n\t\tevent: string;\n\t\tdata: unknown;\n\t}> = [];\n\n\t/** Buffered broadcasts waiting for wsBroadcast to be wired. */\n\tprivate preBridgeBroadcastBuffer: SwarmEvent[] = [];\n\n\t/** Auto-resume timeout handle. */\n\tprivate pauseTimeout: ReturnType<typeof setTimeout> | null = null;\n\n\t/** Coordinator startup timestamp — ignore events from sessions created before this. */\n\tprivate readonly startedAt = Date.now();\n\n\t/** Active retry timers for unregistered session buffers. */\n\tprivate unregisteredRetryTimers: Map<\n\t\tstring,\n\t\tReturnType<typeof setTimeout>\n\t> = new Map();\n\n\t/** Turn-complete coalescing timers — debounces rapid events per session. */\n\tprivate turnCompleteCoalesceTimers: Map<\n\t\tstring,\n\t\tReturnType<typeof setTimeout>\n\t> = new Map();\n\n\t/** Persistent swarm history — JSONL log that survives restarts. */\n\treadonly history = new SwarmHistory();\n\n\tconstructor(runtime: IAgentRuntime) {\n\t\tthis.runtime = runtime;\n\t\tthis.taskRegistry = new TaskRegistry(runtime);\n\t}\n\n\t// ─── Chat Callback ───\n\n\t/** Inject a callback (from server.ts) to route messages to the user's chat UI. */\n\t/** Track whether we've already wired the scratch decision callback. */\n\tprivate scratchDecisionWired = false;\n\n\tsetChatCallback(cb: ChatMessageCallback): void {\n\t\tthis.chatCallback = cb;\n\t\tthis.log(\"Chat callback wired\");\n\t\t// Try wiring scratch decision callback now, retry lazily if service not ready\n\t\tthis.wireScratchDecisionCallback();\n\t}\n\n\t/**\n\t * Wire the scratch workspace save prompt callback.\n\t * Called eagerly from setChatCallback and lazily from handleSessionEvent\n\t * in case the workspace service wasn't ready at chat-callback time.\n\t */\n\tprivate wireScratchDecisionCallback(): void {\n\t\tif (this.scratchDecisionWired || !this.chatCallback) return;\n\t\tconst wsService = this.runtime.getService(\"CODING_WORKSPACE_SERVICE\") as\n\t\t\tunknown as { setScratchDecisionCallback?: (cb: (record: { label: string; path: string; expiresAt?: number }) => Promise<void>) => void } | undefined;\n\t\tif (wsService?.setScratchDecisionCallback) {\n\t\t\tconst chatCb = this.chatCallback;\n\t\t\twsService.setScratchDecisionCallback(async (record) => {\n\t\t\t\tconst ttlNote = record.expiresAt\n\t\t\t\t\t? (() => {\n\t\t\t\t\t\tconst remainMs = record.expiresAt - Date.now();\n\t\t\t\t\t\tconst hours = Math.round(remainMs / (60 * 60 * 1000));\n\t\t\t\t\t\treturn hours >= 1\n\t\t\t\t\t\t\t? `It will be automatically cleaned up in ~${hours} hour${hours === 1 ? \"\" : \"s\"}.`\n\t\t\t\t\t\t\t: `It will be automatically cleaned up shortly.`;\n\t\t\t\t\t})()\n\t\t\t\t\t: \"It will be automatically cleaned up after the configured retention period.\";\n\t\t\t\tawait chatCb(\n\t\t\t\t\t`Task \"${record.label}\" finished. Code is at \\`${record.path}\\`.\\n` +\n\t\t\t\t\t`${ttlNote} To keep it, say \"keep the workspace\" or manage it in Settings -> Task Agents.`,\n\t\t\t\t\t\"task-agent\",\n\t\t\t\t);\n\t\t\t});\n\t\t\tthis.scratchDecisionWired = true;\n\t\t\tthis.log(\"Scratch decision callback wired\");\n\t\t}\n\t}\n\n\t/** Inject a callback (from server.ts) to relay events to WebSocket clients. */\n\tsetWsBroadcast(cb: WsBroadcastCallback): void {\n\t\tthis.wsBroadcast = cb;\n\t\t// Replay any events that were broadcast before the bridge was wired\n\t\tif (this.preBridgeBroadcastBuffer.length > 0) {\n\t\t\tthis.log(\n\t\t\t\t`WS broadcast callback wired — replaying ${this.preBridgeBroadcastBuffer.length} buffered event(s)`,\n\t\t\t);\n\t\t\tfor (const event of this.preBridgeBroadcastBuffer) {\n\t\t\t\tcb(event);\n\t\t\t}\n\t\t\tthis.preBridgeBroadcastBuffer.length = 0;\n\t\t} else {\n\t\t\tthis.log(\"WS broadcast callback wired\");\n\t\t}\n\t}\n\n\t/** Inject a callback fired when all swarm tasks reach terminal state. */\n\tsetSwarmCompleteCallback(cb: SwarmCompleteCallback): void {\n\t\tthis.swarmCompleteCb = cb;\n\t\tthis.log(\"Swarm complete callback wired\");\n\t}\n\n\t/** Return the swarm complete callback (if wired). */\n\tgetSwarmCompleteCallback(): SwarmCompleteCallback | null {\n\t\treturn this.swarmCompleteCb;\n\t}\n\n\t/** Set the shared context brief for this swarm. */\n\tsetSwarmContext(context: string): void {\n\t\tthis._swarmContext = context;\n\t\tthis.log(`Swarm context set (${context.length} chars)`);\n\t}\n\n\t/** Return the swarm planning context (if set). */\n\tgetSwarmContext(): string {\n\t\treturn this._swarmContext;\n\t}\n\n\t/** Inject a callback (from server.ts) to route events through Milaidy's pipeline. */\n\tsetAgentDecisionCallback(cb: AgentDecisionCallback): void {\n\t\tthis.agentDecisionCb = cb;\n\t\tthis.log(\n\t\t\t\"Agent decision callback wired — events will route through Milaidy\",\n\t\t);\n\t}\n\n\t/** Return the agent decision callback (if wired). */\n\tgetAgentDecisionCallback(): AgentDecisionCallback | null {\n\t\treturn this.agentDecisionCb;\n\t}\n\n\t/** Null-safe wrapper — sends a message to the user's conversation if callback is set. */\n\tsendChatMessage(text: string, source?: string): void {\n\t\tif (!this.chatCallback) return;\n\t\tthis.chatCallback(text, source).catch((err) => {\n\t\t\tthis.log(`Failed to send chat message: ${err}`);\n\t\t});\n\t}\n\n\t// ─── Lifecycle ───\n\n\t/**\n\t * Initialize the coordinator by subscribing to PTY session events.\n\t * Called from plugin init after services are ready.\n\t */\n\tasync start(ptyService: PTYService): Promise<void> {\n\t\tawait this.taskRegistry.ensureSchema();\n\t\tawait this.taskRegistry.recoverInterruptedTasks();\n\t\tawait this.rehydratePendingDecisions();\n\t\tthis.ptyService = ptyService;\n\t\tthis.unsubscribeEvents = ptyService.onSessionEvent(\n\t\t\t(sessionId, event, data) => {\n\t\t\t\tthis.handleSessionEvent(sessionId, event, data).catch((err) => {\n\t\t\t\t\tthis.log(`Error handling event: ${err}`);\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\n\t\t// Start idle watchdog\n\t\tthis.idleWatchdogTimer = setInterval(() => {\n\t\t\tscanIdleSessions(this).catch((err) => {\n\t\t\t\tthis.log(`Idle watchdog error: ${err}`);\n\t\t\t});\n\t\t}, IDLE_SCAN_INTERVAL_MS);\n\n\t\tthis.log(\"SwarmCoordinator started\");\n\t}\n\n\tprivate restorePendingTaskContext(\n\t\trecord: TaskPendingDecisionRecord,\n\t): TaskContext {\n\t\tconst raw = record.taskContext;\n\t\tconst status = (() => {\n\t\t\tswitch (typeof raw.status === \"string\" ? raw.status : \"\") {\n\t\t\t\tcase \"active\":\n\t\t\t\tcase \"blocked\":\n\t\t\t\tcase \"tool_running\":\n\t\t\t\tcase \"completed\":\n\t\t\t\tcase \"error\":\n\t\t\t\tcase \"stopped\":\n\t\t\t\t\treturn raw.status as TaskContext[\"status\"];\n\t\t\t\tdefault:\n\t\t\t\t\treturn \"blocked\";\n\t\t\t}\n\t\t})();\n\t\treturn {\n\t\t\tthreadId:\n\t\t\t\ttypeof raw.threadId === \"string\" && raw.threadId.trim().length > 0\n\t\t\t\t\t? raw.threadId\n\t\t\t\t\t: record.threadId,\n\t\t\tsessionId: record.sessionId,\n\t\t\tagentType:\n\t\t\t\ttypeof raw.agentType === \"string\" && raw.agentType.trim().length > 0\n\t\t\t\t\t? (raw.agentType as CodingAgentType)\n\t\t\t\t\t: \"claude\",\n\t\t\tlabel:\n\t\t\t\ttypeof raw.label === \"string\" && raw.label.trim().length > 0\n\t\t\t\t\t? raw.label\n\t\t\t\t\t: `agent-${record.sessionId.slice(-8)}`,\n\t\t\toriginalTask:\n\t\t\t\ttypeof raw.originalTask === \"string\" ? raw.originalTask : record.promptText,\n\t\t\tworkdir: typeof raw.workdir === \"string\" ? raw.workdir : \"\",\n\t\t\t...(typeof raw.repo === \"string\" && raw.repo.trim().length > 0\n\t\t\t\t? { repo: raw.repo }\n\t\t\t\t: {}),\n\t\t\tstatus,\n\t\t\tdecisions: Array.isArray(raw.decisions)\n\t\t\t\t? (raw.decisions.filter((entry) => Boolean(entry && typeof entry === \"object\")) as CoordinationDecision[])\n\t\t\t\t: [],\n\t\t\tautoResolvedCount:\n\t\t\t\ttypeof raw.autoResolvedCount === \"number\" ? raw.autoResolvedCount : 0,\n\t\t\tregisteredAt:\n\t\t\t\ttypeof raw.registeredAt === \"number\"\n\t\t\t\t\t? raw.registeredAt\n\t\t\t\t\t: record.createdAt,\n\t\t\tlastActivityAt:\n\t\t\t\ttypeof raw.lastActivityAt === \"number\"\n\t\t\t\t\t? raw.lastActivityAt\n\t\t\t\t\t: record.createdAt,\n\t\t\tidleCheckCount:\n\t\t\t\ttypeof raw.idleCheckCount === \"number\" ? raw.idleCheckCount : 0,\n\t\t\ttaskDelivered: raw.taskDelivered === true,\n\t\t\t...(typeof raw.completionSummary === \"string\"\n\t\t\t\t? { completionSummary: raw.completionSummary }\n\t\t\t\t: {}),\n\t\t\tlastSeenDecisionIndex:\n\t\t\t\ttypeof raw.lastSeenDecisionIndex === \"number\"\n\t\t\t\t\t? raw.lastSeenDecisionIndex\n\t\t\t\t\t: 0,\n\t\t\t...(typeof raw.lastInputSentAt === \"number\"\n\t\t\t\t? { lastInputSentAt: raw.lastInputSentAt }\n\t\t\t\t: {}),\n\t\t\t...(typeof raw.stoppedAt === \"number\" ? { stoppedAt: raw.stoppedAt } : {}),\n\t\t};\n\t}\n\n\tprivate restorePendingLlmDecision(\n\t\trecord: TaskPendingDecisionRecord,\n\t): CoordinationLLMResponse {\n\t\tconst raw = record.llmDecision;\n\t\tconst action =\n\t\t\ttypeof raw.action === \"string\" &&\n\t\t\t[\"respond\", \"escalate\", \"ignore\", \"complete\"].includes(raw.action)\n\t\t\t\t? (raw.action as CoordinationLLMResponse[\"action\"])\n\t\t\t\t: \"escalate\";\n\t\treturn {\n\t\t\taction,\n\t\t\t...(typeof raw.response === \"string\" ? { response: raw.response } : {}),\n\t\t\t...(raw.useKeys === true ? { useKeys: true } : {}),\n\t\t\t...(Array.isArray(raw.keys)\n\t\t\t\t? {\n\t\t\t\t\t\tkeys: raw.keys.filter(\n\t\t\t\t\t\t\t(entry): entry is string => typeof entry === \"string\",\n\t\t\t\t\t\t),\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\treasoning:\n\t\t\t\ttypeof raw.reasoning === \"string\" && raw.reasoning.trim().length > 0\n\t\t\t\t\t? raw.reasoning\n\t\t\t\t\t: \"Recovered pending confirmation from persisted coordinator state.\",\n\t\t};\n\t}\n\n\tprivate async rehydratePendingDecisions(): Promise<void> {\n\t\tconst records = await this.taskRegistry.listPendingDecisions();\n\t\tfor (const record of records) {\n\t\t\tconst taskContext = this.restorePendingTaskContext(record);\n\t\t\tthis.tasks.set(record.sessionId, taskContext);\n\t\t\tthis.pendingDecisions.set(record.sessionId, {\n\t\t\t\tsessionId: record.sessionId,\n\t\t\t\tpromptText: record.promptText,\n\t\t\t\trecentOutput: record.recentOutput,\n\t\t\t\tllmDecision: this.restorePendingLlmDecision(record),\n\t\t\t\ttaskContext,\n\t\t\t\tcreatedAt: record.createdAt,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tconst persistOnShutdown = Array.from(this.tasks.values())\n\t\t\t.filter(\n\t\t\t\t(task) =>\n\t\t\t\t\ttask.status === \"active\" ||\n\t\t\t\t\ttask.status === \"blocked\" ||\n\t\t\t\t\ttask.status === \"tool_running\",\n\t\t\t)\n\t\t\t.map(async (task) => {\n\t\t\t\ttask.status = \"stopped\";\n\t\t\t\ttask.stoppedAt = Date.now();\n\t\t\t\tawait this.taskRegistry.updateSession(task.sessionId, {\n\t\t\t\t\tstatus: \"interrupted\",\n\t\t\t\t\tlastActivityAt: task.lastActivityAt,\n\t\t\t\t\tidleCheckCount: task.idleCheckCount,\n\t\t\t\t\ttaskDelivered: task.taskDelivered,\n\t\t\t\t\tautoResolvedCount: task.autoResolvedCount,\n\t\t\t\t\tdecisionCount: task.decisions.length,\n\t\t\t\t\tcompletionSummary: task.completionSummary ?? null,\n\t\t\t\t\tlastSeenDecisionIndex: task.lastSeenDecisionIndex,\n\t\t\t\t\tlastInputSentAt: task.lastInputSentAt,\n\t\t\t\t\tstoppedAt: task.stoppedAt,\n\t\t\t\t});\n\t\t\t\tawait this.taskRegistry.appendEvent({\n\t\t\t\t\tthreadId: task.threadId,\n\t\t\t\t\tsessionId: task.sessionId,\n\t\t\t\t\teventType: \"session_interrupted\",\n\t\t\t\t\tsummary: \"Session interrupted during coordinator shutdown\",\n\t\t\t\t\tdata: { reason: \"coordinator_shutdown\" },\n\t\t\t\t});\n\t\t\t});\n\t\tawait Promise.allSettled(persistOnShutdown);\n\t\tif (this.idleWatchdogTimer) {\n\t\t\tclearInterval(this.idleWatchdogTimer);\n\t\t\tthis.idleWatchdogTimer = null;\n\t\t}\n\t\tif (this.unsubscribeEvents) {\n\t\t\tthis.unsubscribeEvents();\n\t\t\tthis.unsubscribeEvents = null;\n\t\t}\n\t\t// Close all SSE connections\n\t\tfor (const client of this.sseClients) {\n\t\t\tif (!client.writableEnded) {\n\t\t\t\tclient.end();\n\t\t\t}\n\t\t}\n\t\tthis.sseClients.clear();\n\t\tthis.tasks.clear();\n\t\tthis.pendingDecisions.clear();\n\t\tthis.inFlightDecisions.clear();\n\t\tthis.pendingTurnComplete.clear();\n\t\tclearDeferredTurnCompleteTimers();\n\t\tthis.lastBlockedPromptFingerprint.clear();\n\t\tthis.pendingBlocked.clear();\n\t\tthis.unregisteredBuffer.clear();\n\t\tfor (const timer of this.unregisteredRetryTimers.values()) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\tthis.unregisteredRetryTimers.clear();\n\t\tfor (const timer of this.turnCompleteCoalesceTimers.values()) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\tthis.turnCompleteCoalesceTimers.clear();\n\t\tthis.lastSeenOutput.clear();\n\t\tthis.lastToolNotification.clear();\n\t\tthis.agentDecisionCb = null;\n\t\tthis.sharedDecisions.length = 0;\n\t\tthis._swarmContext = \"\";\n\t\tthis.swarmCompleteNotified = false;\n\t\t// Clear pause state\n\t\tthis._paused = false;\n\t\tif (this.pauseTimeout) {\n\t\t\tclearTimeout(this.pauseTimeout);\n\t\t\tthis.pauseTimeout = null;\n\t\t}\n\t\tthis.pauseBuffer = [];\n\t\tthis.preBridgeBroadcastBuffer.length = 0;\n\t\tthis.log(\"SwarmCoordinator stopped\");\n\t}\n\n\t// ─── Pause / Resume ───\n\n\t/** Whether the coordinator is currently paused. */\n\tget isPaused(): boolean {\n\t\treturn this._paused;\n\t}\n\n\t/** Pause LLM-based decisions. Auto-responses and broadcasts continue. */\n\tpause(): void {\n\t\tif (this._paused) return;\n\t\tthis._paused = true;\n\t\tthis.log(\n\t\t\t\"Coordinator paused — buffering LLM decisions until user message is processed\",\n\t\t);\n\t\tthis.broadcast({\n\t\t\ttype: \"coordinator_paused\",\n\t\t\tsessionId: \"\",\n\t\t\ttimestamp: Date.now(),\n\t\t\tdata: {},\n\t\t});\n\n\t\t// Safety: auto-resume after timeout\n\t\tthis.pauseTimeout = setTimeout(() => {\n\t\t\tif (this._paused) {\n\t\t\t\tthis.log(\"Coordinator auto-resuming after timeout\");\n\t\t\t\tthis.resume();\n\t\t\t}\n\t\t}, PAUSE_TIMEOUT_MS);\n\t}\n\n\t/** Resume LLM-based decisions and replay buffered events. */\n\tresume(): void {\n\t\tif (!this._paused) return;\n\t\tthis._paused = false;\n\t\tif (this.pauseTimeout) {\n\t\t\tclearTimeout(this.pauseTimeout);\n\t\t\tthis.pauseTimeout = null;\n\t\t}\n\n\t\tthis.log(\n\t\t\t`Coordinator resumed — replaying ${this.pauseBuffer.length} buffered events`,\n\t\t);\n\t\tthis.broadcast({\n\t\t\ttype: \"coordinator_resumed\",\n\t\t\tsessionId: \"\",\n\t\t\ttimestamp: Date.now(),\n\t\t\tdata: {},\n\t\t});\n\n\t\t// Replay buffered events\n\t\tconst buffered = [...this.pauseBuffer];\n\t\tthis.pauseBuffer = [];\n\t\tfor (const entry of buffered) {\n\t\t\tthis.handleSessionEvent(entry.sessionId, entry.event, entry.data).catch(\n\t\t\t\t(err) => {\n\t\t\t\t\tthis.log(`Error replaying buffered event: ${err}`);\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t}\n\n\t// ─── Task Registration ───\n\n\tasync registerTask(\n\t\tsessionId: string,\n\t\tcontext: {\n\t\t\tthreadId: string;\n\t\t\tagentType: CodingAgentType;\n\t\t\tlabel: string;\n\t\t\toriginalTask: string;\n\t\t\tworkdir: string;\n\t\t\trepo?: string;\n\t\t},\n\t): Promise<void> {\n\t\tconst threadId = context.threadId?.trim() || sessionId;\n\t\t// Reset swarm state when the first task of a new swarm is registered.\n\t\t// Check for terminal-only tasks (all previous tasks in completed/stopped/error)\n\t\t// rather than empty map, so reuse without stop() works.\n\t\tconst allPreviousTerminal =\n\t\t\tthis.tasks.size === 0 ||\n\t\t\tArray.from(this.tasks.values()).every(\n\t\t\t\t(t) =>\n\t\t\t\t\tt.status === \"completed\" ||\n\t\t\t\t\tt.status === \"stopped\" ||\n\t\t\t\t\tt.status === \"error\",\n\t\t\t);\n\t\tif (allPreviousTerminal) {\n\t\t\tthis.swarmCompleteNotified = false;\n\t\t\t// Clear stale tasks and shared context from previous swarm\n\t\t\tif (this.tasks.size > 0) {\n\t\t\t\tthis.tasks.clear();\n\t\t\t\tthis.sharedDecisions.length = 0;\n\t\t\t\tthis._swarmContext = \"\";\n\t\t\t\tthis.log(\"Cleared stale swarm state for new swarm\");\n\t\t\t}\n\t\t}\n\n\t\tthis.tasks.set(sessionId, {\n\t\t\tthreadId,\n\t\t\tsessionId,\n\t\t\tagentType: context.agentType,\n\t\t\tlabel: context.label,\n\t\t\toriginalTask: context.originalTask,\n\t\t\tworkdir: context.workdir,\n\t\t\trepo: context.repo,\n\t\t\tstatus: \"active\",\n\t\t\tdecisions: [],\n\t\t\tautoResolvedCount: 0,\n\t\t\tregisteredAt: Date.now(),\n\t\t\tlastActivityAt: Date.now(),\n\t\t\tidleCheckCount: 0,\n\t\t\ttaskDelivered: false,\n\t\t\tlastSeenDecisionIndex: 0,\n\t\t});\n\n\t\t// Persist last used repo so it survives task cleanup\n\t\tif (context.repo) {\n\t\t\tthis._lastUsedRepo = context.repo;\n\t\t}\n\n\t\t// Log to persistent history (fire-and-forget)\n\t\tthis.history.append({\n\t\t\ttimestamp: Date.now(),\n\t\t\ttype: \"task_registered\",\n\t\t\tsessionId,\n\t\t\tlabel: context.label,\n\t\t\tagentType: context.agentType,\n\t\t\trepo: context.repo,\n\t\t\tworkdir: context.workdir,\n\t\t\toriginalTask: context.originalTask,\n\t\t}).catch(() => {});\n\n\t\tconst taskCtx = this.tasks.get(sessionId);\n\t\tconst persistPromise = taskCtx\n\t\t\t? (async () => {\n\t\t\t\t\tconst existingThread = await this.taskRegistry.getThreadRecord(threadId);\n\t\t\t\t\tif (!existingThread) {\n\t\t\t\t\t\tawait this.taskRegistry.createThread({\n\t\t\t\t\t\t\tid: threadId,\n\t\t\t\t\t\t\ttitle: context.label,\n\t\t\t\t\t\t\toriginalRequest: context.originalTask,\n\t\t\t\t\t\t\tkind: \"coding\",\n\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\trepo: context.repo ?? null,\n\t\t\t\t\t\t\t\tsource: \"register-task-fallback\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait Promise.all([\n\t\t\t\t\t\tthis.taskRegistry.registerSession({\n\t\t\t\t\t\tthreadId: taskCtx.threadId,\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\tframework: context.agentType,\n\t\t\t\t\t\tlabel: context.label,\n\t\t\t\t\t\toriginalTask: context.originalTask,\n\t\t\t\t\t\tworkdir: context.workdir,\n\t\t\t\t\t\trepo: context.repo,\n\t\t\t\t\t\tstatus: \"active\",\n\t\t\t\t\t\tdecisionCount: 0,\n\t\t\t\t\t\tautoResolvedCount: 0,\n\t\t\t\t\t\tregisteredAt: taskCtx.registeredAt,\n\t\t\t\t\t\tlastActivityAt: taskCtx.lastActivityAt,\n\t\t\t\t\t\tidleCheckCount: taskCtx.idleCheckCount,\n\t\t\t\t\t\ttaskDelivered: false,\n\t\t\t\t\t\tlastSeenDecisionIndex: 0,\n\t\t\t\t\t\tmetadata: {},\n\t\t\t\t\t}),\n\t\t\t\t\t\tthis.taskRegistry.appendEvent({\n\t\t\t\t\t\tthreadId,\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\teventType: \"task_registered\",\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t\tsummary: `Registered task \"${context.label}\"`,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tlabel: context.label,\n\t\t\t\t\t\t\toriginalTask: context.originalTask,\n\t\t\t\t\t\t\trepo: context.repo ?? null,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\t]);\n\t\t\t })()\n\t\t\t: Promise.resolve();\n\t\tvoid persistPromise.catch((err) => {\n\t\t\tthis.log(`Failed to persist task registration for ${sessionId}: ${err}`);\n\t\t});\n\n\t\tthis.broadcast({\n\t\t\ttype: \"task_registered\",\n\t\t\tsessionId,\n\t\t\ttimestamp: Date.now(),\n\t\t\tdata: {\n\t\t\t\tagentType: context.agentType,\n\t\t\t\tlabel: context.label,\n\t\t\t\toriginalTask: context.originalTask,\n\t\t\t},\n\t\t});\n\n\t\t// Cancel any pending retry timer and flush buffered events\n\t\tconst retryTimer = this.unregisteredRetryTimers.get(sessionId);\n\t\tif (retryTimer) {\n\t\t\tclearTimeout(retryTimer);\n\t\t\tthis.unregisteredRetryTimers.delete(sessionId);\n\t\t}\n\t\tconst buffered = this.unregisteredBuffer.get(sessionId);\n\t\tif (buffered) {\n\t\t\tthis.unregisteredBuffer.delete(sessionId);\n\t\t\tfor (const entry of buffered) {\n\t\t\t\tthis.handleSessionEvent(sessionId, entry.event, entry.data).catch(\n\t\t\t\t\t(err) => {\n\t\t\t\t\t\tthis.log(`Error replaying buffered event: ${err}`);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tawait persistPromise;\n\t}\n\n\t/**\n\t * Return the repo URL from the most recently registered task that had one.\n\t * Useful as a fallback when the user says \"in the same repo\" without a URL.\n\t */\n\t/**\n\t * Persisted separately from tasks so it survives task cleanup.\n\t * Updated whenever a task with a repo is registered.\n\t */\n\tprivate _lastUsedRepo: string | undefined;\n\n\tgetLastUsedRepo(): string | undefined {\n\t\t// Check active tasks first (freshest), fall back to in-memory persisted value\n\t\tlet latest: TaskContext | undefined;\n\t\tfor (const task of this.tasks.values()) {\n\t\t\tif (task.repo && (!latest || task.registeredAt > latest.registeredAt)) {\n\t\t\t\tlatest = task;\n\t\t\t}\n\t\t}\n\t\treturn latest?.repo ?? this._lastUsedRepo;\n\t}\n\n\t/**\n\t * Async version that also checks disk history — survives process restarts.\n\t * Callers that can await should prefer this over the sync version.\n\t */\n\tasync getLastUsedRepoAsync(): Promise<string | undefined> {\n\t\tconst memoryRepo = this.getLastUsedRepo();\n\t\tif (memoryRepo) return memoryRepo;\n\t\ttry {\n\t\t\treturn (await this.taskRegistry.getLastUsedRepo()) ?? (await this.history.getLastUsedRepo());\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tgetTaskContext(sessionId: string): TaskContext | undefined {\n\t\treturn this.tasks.get(sessionId);\n\t}\n\n\tprivate mapDecisionRecord(\n\t\trecord: TaskDecisionRecord,\n\t): CoordinationDecision {\n\t\treturn {\n\t\t\ttimestamp: record.timestamp,\n\t\t\tevent: record.event,\n\t\t\tpromptText: record.promptText,\n\t\t\tdecision: record.decision as CoordinationDecision[\"decision\"],\n\t\t\t...(record.response ? { response: record.response } : {}),\n\t\t\treasoning: record.reasoning,\n\t\t};\n\t}\n\n\tprivate mapSessionStatus(\n\t\tstatus: TaskSessionRecord[\"status\"],\n\t): TaskContext[\"status\"] {\n\t\tswitch (status) {\n\t\t\tcase \"blocked\":\n\t\t\tcase \"waiting_on_user\":\n\t\t\t\treturn \"blocked\";\n\t\t\tcase \"tool_running\":\n\t\t\t\treturn \"tool_running\";\n\t\t\tcase \"completed\":\n\t\t\t\treturn \"completed\";\n\t\t\tcase \"error\":\n\t\t\t\treturn \"error\";\n\t\t\tcase \"stopped\":\n\t\t\tcase \"interrupted\":\n\t\t\t\treturn \"stopped\";\n\t\t\tdefault:\n\t\t\t\treturn \"active\";\n\t\t}\n\t}\n\n\tprivate buildTaskContextFromSession(\n\t\tsession: TaskSessionRecord,\n\t\tdecisions: TaskDecisionRecord[],\n\t): TaskContext {\n\t\treturn {\n\t\t\tthreadId: session.threadId,\n\t\t\tsessionId: session.sessionId,\n\t\t\tagentType: session.framework,\n\t\t\tlabel: session.label,\n\t\t\toriginalTask: session.originalTask,\n\t\t\tworkdir: session.workdir,\n\t\t\t...(session.repo ? { repo: session.repo } : {}),\n\t\t\tstatus: this.mapSessionStatus(session.status),\n\t\t\tdecisions: decisions.map((decision) => this.mapDecisionRecord(decision)),\n\t\t\tautoResolvedCount: session.autoResolvedCount,\n\t\t\tregisteredAt: session.registeredAt,\n\t\t\tlastActivityAt: session.lastActivityAt,\n\t\t\tidleCheckCount: session.idleCheckCount,\n\t\t\ttaskDelivered: session.taskDelivered,\n\t\t\t...(session.completionSummary\n\t\t\t\t? { completionSummary: session.completionSummary }\n\t\t\t\t: {}),\n\t\t\tlastSeenDecisionIndex: session.lastSeenDecisionIndex,\n\t\t\t...(session.lastInputSentAt !== null\n\t\t\t\t? { lastInputSentAt: session.lastInputSentAt }\n\t\t\t\t: {}),\n\t\t\t...(session.stoppedAt !== null ? { stoppedAt: session.stoppedAt } : {}),\n\t\t};\n\t}\n\n\tasync getTaskContextSnapshot(sessionId: string): Promise<TaskContext | null> {\n\t\tconst live = this.tasks.get(sessionId);\n\t\tif (live) return live;\n\t\tconst session = await this.taskRegistry.getSession(sessionId);\n\t\tif (!session) return null;\n\t\tconst decisions = await this.taskRegistry.listDecisionsForSession(sessionId);\n\t\treturn this.buildTaskContextFromSession(session, decisions);\n\t}\n\n\tgetAllTaskContexts(): TaskContext[] {\n\t\treturn Array.from(this.tasks.values());\n\t}\n\n\tasync createTaskThread(\n\t\tinput: CreateTaskThreadInput,\n\t): Promise<TaskThreadSummary> {\n\t\tconst acceptance = await deriveTaskAcceptanceCriteria(this.runtime, input);\n\t\tconst thread = await this.taskRegistry.createThread({\n\t\t\t...input,\n\t\t\tacceptanceCriteria: acceptance.criteria,\n\t\t\tmetadata: {\n\t\t\t\t...(input.metadata ?? {}),\n\t\t\t\tacceptanceCriteriaSource: acceptance.source,\n\t\t\t},\n\t\t});\n\t\tconst summary = await this.taskRegistry.getThreadSummary(thread.id);\n\t\tif (!summary) {\n\t\t\tthrow new Error(`Failed to load task thread ${thread.id}`);\n\t\t}\n\t\treturn summary;\n\t}\n\n\tasync listTaskThreads(options?: {\n\t\tincludeArchived?: boolean;\n\t\tstatus?: TaskThreadStatus;\n\t\tsearch?: string;\n\t\tlimit?: number;\n\t}): Promise<TaskThreadSummary[]> {\n\t\treturn this.taskRegistry.listThreads(options);\n\t}\n\n\tasync getTaskThread(threadId: string): Promise<TaskThreadDetail | null> {\n\t\treturn this.taskRegistry.getThread(threadId);\n\t}\n\n\tasync archiveTaskThread(threadId: string): Promise<void> {\n\t\tawait this.taskRegistry.archiveThread(threadId);\n\t}\n\n\tasync reopenTaskThread(threadId: string): Promise<void> {\n\t\tawait this.taskRegistry.reopenThread(threadId);\n\t}\n\n\tasync syncTaskContext(taskCtx: TaskContext): Promise<void> {\n\t\tawait this.taskRegistry.updateSession(taskCtx.sessionId, {\n\t\t\tstatus:\n\t\t\t\ttaskCtx.status === \"completed\"\n\t\t\t\t\t? \"completed\"\n\t\t\t\t\t: taskCtx.status === \"error\"\n\t\t\t\t\t\t? \"error\"\n\t\t\t\t\t\t: taskCtx.status === \"stopped\"\n\t\t\t\t\t\t\t? \"stopped\"\n\t\t\t\t\t\t\t: taskCtx.status === \"blocked\"\n\t\t\t\t\t\t\t\t? \"blocked\"\n\t\t\t\t\t\t\t\t: taskCtx.status === \"tool_running\"\n\t\t\t\t\t\t\t\t\t? \"tool_running\"\n\t\t\t\t\t\t\t: \"active\",\n\t\t\tdecisionCount: taskCtx.decisions.length,\n\t\t\tautoResolvedCount: taskCtx.autoResolvedCount,\n\t\t\tlastActivityAt: taskCtx.lastActivityAt,\n\t\t\tidleCheckCount: taskCtx.idleCheckCount,\n\t\t\ttaskDelivered: taskCtx.taskDelivered,\n\t\t\tcompletionSummary: taskCtx.completionSummary ?? null,\n\t\t\tlastSeenDecisionIndex: taskCtx.lastSeenDecisionIndex,\n\t\t\tlastInputSentAt: taskCtx.lastInputSentAt,\n\t\t\tstoppedAt: taskCtx.stoppedAt,\n\t\t});\n\t}\n\n\tasync recordDecision(\n\t\ttaskCtx: TaskContext,\n\t\tdecision: CoordinationDecision,\n\t): Promise<void> {\n\t\ttaskCtx.decisions.push(decision);\n\t\tawait this.taskRegistry.recordDecision({\n\t\t\tthreadId: taskCtx.threadId,\n\t\t\tsessionId: taskCtx.sessionId,\n\t\t\ttimestamp: decision.timestamp,\n\t\t\tevent: decision.event,\n\t\t\tpromptText: decision.promptText,\n\t\t\tdecision: decision.decision,\n\t\t\tresponse: decision.response,\n\t\t\treasoning: decision.reasoning,\n\t\t});\n\t\tawait this.syncTaskContext(taskCtx);\n\t}\n\n\tasync setTaskDelivered(sessionId: string): Promise<void> {\n\t\tconst taskCtx = this.tasks.get(sessionId);\n\t\tif (!taskCtx) return;\n\t\ttaskCtx.taskDelivered = true;\n\t\tawait this.syncTaskContext(taskCtx);\n\t}\n\n\t// ─── Unregistered Buffer Retry ───\n\n\t/**\n\t * Schedule a retry check for buffered events from an unregistered session.\n\t * Uses exponential backoff: 2s → 4s → 8s → 16s, max 30s total.\n\t */\n\tprivate scheduleUnregisteredRetry(\n\t\tsessionId: string,\n\t\tattempt: number,\n\t): void {\n\t\tconst delay =\n\t\t\tUNREGISTERED_RETRY_DELAYS[\n\t\t\t\tMath.min(attempt, UNREGISTERED_RETRY_DELAYS.length - 1)\n\t\t\t];\n\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.unregisteredRetryTimers.delete(sessionId);\n\t\t\tconst stillBuffered = this.unregisteredBuffer.get(sessionId);\n\t\t\tif (!stillBuffered || stillBuffered.length === 0) return;\n\n\t\t\tconst ctx = this.tasks.get(sessionId);\n\t\t\tif (ctx) {\n\t\t\t\t// Task was registered — flush\n\t\t\t\tthis.unregisteredBuffer.delete(sessionId);\n\t\t\t\tfor (const entry of stillBuffered) {\n\t\t\t\t\tthis.handleSessionEvent(\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\tentry.event,\n\t\t\t\t\t\tentry.data,\n\t\t\t\t\t).catch(() => {});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if we've exceeded the absolute max wait\n\t\t\tconst oldest = stillBuffered[0].receivedAt;\n\t\t\tconst totalElapsed = Date.now() - oldest;\n\t\t\tif (totalElapsed >= UNREGISTERED_MAX_TOTAL_MS) {\n\t\t\t\tthis.unregisteredBuffer.delete(sessionId);\n\t\t\t\tthis.log(\n\t\t\t\t\t`Discarding ${stillBuffered.length} buffered events for unregistered session ${sessionId} after ${Math.round(totalElapsed / 1000)}s`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Schedule next retry\n\t\t\tthis.log(\n\t\t\t\t`Retry ${attempt + 1} for unregistered session ${sessionId} (next in ${delay}ms)`,\n\t\t\t);\n\t\t\tthis.scheduleUnregisteredRetry(sessionId, attempt + 1);\n\t\t}, delay);\n\n\t\tthis.unregisteredRetryTimers.set(sessionId, timer);\n\t}\n\n\t// ─── SSE Client Management ───\n\n\t/**\n\t * Register an SSE client. Returns an unsubscribe function.\n\t * Sends a snapshot of current state on connect.\n\t */\n\taddSseClient(res: ServerResponse): () => void {\n\t\tthis.sseClients.add(res);\n\n\t\t// Send snapshot on connect\n\t\tconst snapshot: SwarmEvent = {\n\t\t\ttype: \"snapshot\",\n\t\t\tsessionId: \"*\",\n\t\t\ttimestamp: Date.now(),\n\t\t\tdata: {\n\t\t\t\ttasks: this.getAllTaskContexts(),\n\t\t\t\tsupervisionLevel: this.supervisionLevel,\n\t\t\t\tpendingCount: this.pendingDecisions.size,\n\t\t\t},\n\t\t};\n\t\tthis.writeSseEvent(res, snapshot);\n\n\t\t// Remove on close\n\t\tconst cleanup = () => {\n\t\t\tthis.sseClients.delete(res);\n\t\t};\n\t\tres.on(\"close\", cleanup);\n\n\t\treturn cleanup;\n\t}\n\n\tbroadcast(event: SwarmEvent): void {\n\t\tconst dead: ServerResponse[] = [];\n\t\tfor (const client of this.sseClients) {\n\t\t\tif (client.writableEnded) {\n\t\t\t\tdead.push(client);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.writeSseEvent(client, event);\n\t\t}\n\t\t// Cleanup dead connections\n\t\tfor (const d of dead) {\n\t\t\tthis.sseClients.delete(d);\n\t\t}\n\t\t// Relay to WebSocket clients — buffer if bridge isn't wired yet\n\t\tif (this.wsBroadcast) {\n\t\t\tthis.wsBroadcast(event);\n\t\t} else if (this.preBridgeBroadcastBuffer.length < MAX_PRE_BRIDGE_BUFFER) {\n\t\t\tthis.preBridgeBroadcastBuffer.push(event);\n\t\t}\n\t}\n\n\tprivate writeSseEvent(res: ServerResponse, event: SwarmEvent): void {\n\t\ttry {\n\t\t\tres.write(`data: ${JSON.stringify(event)}\\n\\n`);\n\t\t} catch {\n\t\t\t// Connection may have closed\n\t\t}\n\t}\n\n\t// ─── Event Handling ───\n\n\tasync handleSessionEvent(\n\t\tsessionId: string,\n\t\tevent: string,\n\t\tdata: unknown,\n\t): Promise<void> {\n\t\t// Lazy-wire scratch decision callback if not yet connected\n\t\tif (!this.scratchDecisionWired) {\n\t\t\tthis.wireScratchDecisionCallback();\n\t\t}\n\n\t\t// Ignore events from sessions created before this coordinator started.\n\t\t// Session IDs are formatted as \"pty-{timestamp}-{hex}\" — extract the timestamp.\n\t\tconst tsMatch = sessionId.match(/^pty-(\\d+)-/);\n\t\tif (tsMatch) {\n\t\t\tconst sessionCreatedAt = Number(tsMatch[1]);\n\t\t\tif (sessionCreatedAt < this.startedAt - 60_000) {\n\t\t\t\t// Session is from before this coordinator's lifetime (with 1min grace)\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst taskCtx = this.tasks.get(sessionId);\n\n\t\t// Buffer events for unregistered sessions with exponential backoff retry.\n\t\t// Events arriving before registerTask() are buffered and retried at\n\t\t// 2s → 4s → 8s → 16s intervals (max 30s total) before being discarded.\n\t\tif (!taskCtx) {\n\t\t\tif (\n\t\t\t\tevent === \"blocked\" ||\n\t\t\t\tevent === \"task_complete\" ||\n\t\t\t\tevent === \"error\"\n\t\t\t) {\n\t\t\t\tlet buffer = this.unregisteredBuffer.get(sessionId);\n\t\t\t\tif (!buffer) {\n\t\t\t\t\tbuffer = [];\n\t\t\t\t\tthis.unregisteredBuffer.set(sessionId, buffer);\n\t\t\t\t}\n\t\t\t\tbuffer.push({ event, data, receivedAt: Date.now() });\n\n\t\t\t\t// Only schedule retry if not already retrying for this session\n\t\t\t\tif (!this.unregisteredRetryTimers.has(sessionId)) {\n\t\t\t\t\tthis.scheduleUnregisteredRetry(sessionId, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Skip decision-making events for terminal states, but always allow\n\t\t// \"stopped\" and \"error\" through — they're definitive lifecycle signals\n\t\t// that the frontend needs to close consoles and clean up.\n\t\t// Exception: allow a late \"task_complete\" to recover a recently-stopped task.\n\t\tlet recoveredFromStopped = false;\n\t\tif (\n\t\t\ttaskCtx.status === \"stopped\" ||\n\t\t\ttaskCtx.status === \"error\" ||\n\t\t\ttaskCtx.status === \"completed\"\n\t\t) {\n\t\t\tif (taskCtx.status === \"stopped\" && event === \"task_complete\") {\n\t\t\t\tconst stoppedAt = taskCtx.stoppedAt ?? 0;\n\t\t\t\tconst ageMs = Date.now() - stoppedAt;\n\t\t\t\tif (stoppedAt > 0 && ageMs <= STOPPED_RECOVERY_WINDOW_MS) {\n\t\t\t\t\tthis.log(\n\t\t\t\t\t\t`Recovering \"${taskCtx.label}\" from stopped on late task_complete (${Math.round(ageMs / 1000)}s old)`,\n\t\t\t\t\t);\n\t\t\t\t\ttaskCtx.status = \"active\";\n\t\t\t\t\ttaskCtx.stoppedAt = undefined;\n\t\t\t\t\trecoveredFromStopped = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis.log(\n\t\t\t\t\t\t`Ignoring \"${event}\" for ${taskCtx.label} (status: stopped, age=${Math.round(ageMs / 1000)}s)`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!recoveredFromStopped && event !== \"stopped\" && event !== \"error\") {\n\t\t\t\tthis.log(\n\t\t\t\t\t`Ignoring \"${event}\" for ${taskCtx.label} (status: ${taskCtx.status})`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Update activity timestamp — resets idle watchdog for this session.\n\t\t// This runs before buffering so buffered events still reset the idle timer.\n\t\ttaskCtx.lastActivityAt = Date.now();\n\t\ttaskCtx.idleCheckCount = 0;\n\n\t\t// Buffer decision-making events when paused (user sent a chat message).\n\t\t// Auto-responses still flow through handleBlocked — only LLM decisions are deferred.\n\t\tif (this._paused && (event === \"blocked\" || event === \"task_complete\")) {\n\t\t\t// Auto-responded blocked events don't need LLM — let them through\n\t\t\tconst eventData = data as { autoResponded?: boolean };\n\t\t\tif (!(event === \"blocked\" && eventData.autoResponded)) {\n\t\t\t\t// Broadcast buffered state for dashboard visibility\n\t\t\t\tthis.broadcast({\n\t\t\t\t\ttype:\n\t\t\t\t\t\tevent === \"blocked\" ? \"blocked_buffered\" : \"turn_complete_buffered\",\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t\tthis.pauseBuffer.push({ sessionId, event, data });\n\t\t\t\tthis.log(\n\t\t\t\t\t`Buffered \"${event}\" for ${taskCtx.label} (coordinator paused)`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Auto-responded: fall through to normal handling below\n\t\t}\n\n\t\t// Route by event type\n\t\tswitch (event) {\n\t\t\tcase \"blocked\":\n\t\t\t\tawait handleBlocked(this, sessionId, taskCtx, data);\n\t\t\t\tbreak;\n\n\t\t\tcase \"task_complete\": {\n\t\t\t\t// Broadcast immediately for UI visibility, but coalesce the\n\t\t\t\t// expensive LLM assessment — rapid turn-complete events within\n\t\t\t\t// 500ms are debounced so only the last one triggers an LLM call.\n\t\t\t\tthis.broadcast({\n\t\t\t\t\ttype: \"turn_complete\",\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tdata,\n\t\t\t\t});\n\n\t\t\t\tconst existingCoalesce =\n\t\t\t\t\tthis.turnCompleteCoalesceTimers.get(sessionId);\n\t\t\t\tif (existingCoalesce) clearTimeout(existingCoalesce);\n\n\t\t\t\tconst coalescedData = data;\n\t\t\t\tconst coalesceTimer = setTimeout(() => {\n\t\t\t\t\tthis.turnCompleteCoalesceTimers.delete(sessionId);\n\t\t\t\t\tconst currentTask = this.tasks.get(sessionId);\n\t\t\t\t\tif (currentTask && currentTask.status === \"active\") {\n\t\t\t\t\t\thandleTurnComplete(\n\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\t\tcurrentTask,\n\t\t\t\t\t\t\tcoalescedData,\n\t\t\t\t\t\t).catch((err) => {\n\t\t\t\t\t\t\tthis.log(`Coalesced turn-complete failed: ${err}`);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, TURN_COMPLETE_COALESCE_MS);\n\t\t\t\tthis.turnCompleteCoalesceTimers.set(sessionId, coalesceTimer);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"error\": {\n\t\t\t\ttaskCtx.status = \"error\";\n\t\t\t\tthis.broadcast({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tdata,\n\t\t\t\t});\n\n\t\t\t\t// Send error message to chat UI\n\t\t\t\tconst errorMsg =\n\t\t\t\t\t(data as { message?: string }).message ?? \"unknown error\";\n\t\t\t\tif (\n\t\t\t\t\t(taskCtx.agentType === \"claude\" ||\n\t\t\t\t\t\ttaskCtx.agentType === \"codex\" ||\n\t\t\t\t\t\ttaskCtx.agentType === \"gemini\" ||\n\t\t\t\t\t\ttaskCtx.agentType === \"aider\") &&\n\t\t\t\t\tisUsageExhaustedTaskAgentError(errorMsg)\n\t\t\t\t) {\n\t\t\t\t\tmarkTaskAgentFrameworkUnavailable(taskCtx.agentType, errorMsg);\n\t\t\t\t\tawait this.taskRegistry.appendEvent({\n\t\t\t\t\t\tthreadId: taskCtx.threadId,\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\teventType: \"framework_unavailable\",\n\t\t\t\t\t\tsummary: `${taskCtx.agentType} temporarily disabled after provider depletion`,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tframework: taskCtx.agentType,\n\t\t\t\t\t\t\treason: errorMsg,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tthis.sendChatMessage(\n\t\t\t\t\t\t`\"${taskCtx.label}\" ran into a ${taskCtx.agentType} quota/credit failure. Milady will prefer another task-agent framework until ${taskCtx.agentType} is healthy again.`,\n\t\t\t\t\t\t\"coding-agent\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.sendChatMessage(\n\t\t\t\t\t`\"${taskCtx.label}\" hit an error: ${errorMsg}`,\n\t\t\t\t\t\"coding-agent\",\n\t\t\t\t);\n\t\t\t\tawait this.taskRegistry.appendEvent({\n\t\t\t\t\tthreadId: taskCtx.threadId,\n\t\t\t\t\tsessionId,\n\t\t\t\t\teventType: \"task_status_changed\",\n\t\t\t\t\tsummary: `Task \"${taskCtx.label}\" errored`,\n\t\t\t\t\tdata: { status: \"error\", message: errorMsg },\n\t\t\t\t});\n\t\t\t\tcheckAllTasksComplete(this);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"stopped\":\n\t\t\t\t// Don't downgrade \"completed\" or \"error\" to \"stopped\" — the async\n\t\t\t\t// stopSession fires after executeDecision already marked the task.\n\t\t\t\tif (taskCtx.status !== \"completed\" && taskCtx.status !== \"error\") {\n\t\t\t\t\ttaskCtx.status = \"stopped\";\n\t\t\t\t\ttaskCtx.stoppedAt = Date.now();\n\t\t\t\t}\n\t\t\t\tthis.inFlightDecisions.delete(sessionId);\n\t\t\t\tthis.broadcast({\n\t\t\t\t\ttype: \"stopped\",\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t\tawait this.taskRegistry.appendEvent({\n\t\t\t\t\tthreadId: taskCtx.threadId,\n\t\t\t\t\tsessionId,\n\t\t\t\t\teventType: \"task_status_changed\",\n\t\t\t\t\tsummary: `Task \"${taskCtx.label}\" stopped`,\n\t\t\t\t\tdata: { status: taskCtx.status },\n\t\t\t\t});\n\t\t\t\tcheckAllTasksComplete(this);\n\t\t\t\tbreak;\n\n\t\t\tcase \"ready\":\n\t\t\t\ttaskCtx.status = \"active\";\n\t\t\t\tif (\n\t\t\t\t\ttaskCtx.agentType === \"claude\" ||\n\t\t\t\t\ttaskCtx.agentType === \"codex\" ||\n\t\t\t\t\ttaskCtx.agentType === \"gemini\" ||\n\t\t\t\t\ttaskCtx.agentType === \"aider\"\n\t\t\t\t) {\n\t\t\t\t\tmarkTaskAgentFrameworkHealthy(taskCtx.agentType);\n\t\t\t\t}\n\t\t\t\tthis.broadcast({\n\t\t\t\t\ttype: \"ready\",\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t\tawait this.taskRegistry.appendEvent({\n\t\t\t\t\tthreadId: taskCtx.threadId,\n\t\t\t\t\tsessionId,\n\t\t\t\t\teventType: \"session_updated\",\n\t\t\t\t\tsummary: `Session \"${taskCtx.label}\" ready`,\n\t\t\t\t\tdata: { status: \"ready\" },\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase \"tool_running\": {\n\t\t\t\t// Agent is actively working via an external tool — keep watchdog happy\n\t\t\t\ttaskCtx.status = \"tool_running\";\n\t\t\t\ttaskCtx.lastActivityAt = Date.now();\n\t\t\t\ttaskCtx.idleCheckCount = 0;\n\n\t\t\t\tthis.broadcast({\n\t\t\t\t\ttype: \"tool_running\",\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tdata,\n\t\t\t\t});\n\n\t\t\t\t// Hook-sourced tool_running events fire for every tool call.\n\t\t\t\t// Only broadcast to SSE (for activity box) — skip chat messages.\n\t\t\t\tconst toolData = data as {\n\t\t\t\t\ttoolName?: string;\n\t\t\t\t\tdescription?: string;\n\t\t\t\t\tsource?: string;\n\t\t\t\t};\n\t\t\t\tif (toolData.source === \"hook\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// Throttle chat notifications: at most one per 30s per session.\n\t\t\t\t// Suppress during the first 10s after registration — startup status\n\t\t\t\t// lines (e.g. \"Claude in Chrome enabled\") can trigger tool_running\n\t\t\t\t// before the agent has actually begun working.\n\t\t\t\tconst now = Date.now();\n\t\t\t\tconst STARTUP_GRACE_MS = 10_000;\n\t\t\t\tif (now - taskCtx.registeredAt < STARTUP_GRACE_MS) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst lastNotif = this.lastToolNotification.get(sessionId) ?? 0;\n\t\t\t\tif (now - lastNotif > 30_000) {\n\t\t\t\t\tthis.lastToolNotification.set(sessionId, now);\n\t\t\t\t\tconst toolDesc =\n\t\t\t\t\t\ttoolData.description ?? toolData.toolName ?? \"an external tool\";\n\n\t\t\t\t\t// Try to extract a dev server URL from recent output\n\t\t\t\t\tlet urlSuffix = \"\";\n\t\t\t\t\tif (this.ptyService) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst recentOutput = await this.ptyService.getSessionOutput(\n\t\t\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\t\t\t50,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst devUrl = extractDevServerUrl(recentOutput);\n\t\t\t\t\t\t\tif (devUrl) {\n\t\t\t\t\t\t\t\turlSuffix = ` Dev server running at ${devUrl}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Best-effort — don't block on failure\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.log(\n\t\t\t\t\t\t`[${taskCtx.label}] Running ${toolDesc}.${urlSuffix} The agent is working outside the terminal.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\t// Broadcast unknown events for observability\n\t\t\t\tthis.broadcast({\n\t\t\t\t\ttype: event,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t}\n\t\tawait this.syncTaskContext(taskCtx);\n\t}\n\n\t// ─── LLM Decision (delegated) ───\n\n\tasync makeCoordinationDecision(\n\t\ttaskCtx: TaskContext,\n\t\tpromptText: string,\n\t\trecentOutput: string,\n\t): Promise<CoordinationLLMResponse | null> {\n\t\t// Re-export for backward compatibility — delegates to module function\n\t\tconst { makeCoordinationDecision: mkDecision } = await import(\n\t\t\t\"./swarm-decision-loop.js\"\n\t\t);\n\t\treturn mkDecision(this, taskCtx, promptText, recentOutput);\n\t}\n\n\tasync executeDecision(\n\t\tsessionId: string,\n\t\tdecision: CoordinationLLMResponse,\n\t): Promise<void> {\n\t\treturn execDecision(this, sessionId, decision);\n\t}\n\n\t/**\n\t * Public entry point for external callers (e.g. server.ts) to execute\n\t * a coordination decision on a session. Wraps the internal executeDecision.\n\t */\n\tasync executeEventDecision(\n\t\tsessionId: string,\n\t\tdecision: CoordinationLLMResponse,\n\t): Promise<void> {\n\t\treturn execDecision(this, sessionId, decision);\n\t}\n\n\t// ─── Supervision ───\n\n\tsetSupervisionLevel(level: SupervisionLevel): void {\n\t\tthis.supervisionLevel = level;\n\t\tthis.broadcast({\n\t\t\ttype: \"supervision_changed\",\n\t\t\tsessionId: \"*\",\n\t\t\ttimestamp: Date.now(),\n\t\t\tdata: { level },\n\t\t});\n\t\tthis.log(`Supervision level set to: ${level}`);\n\t}\n\n\tgetSupervisionLevel(): SupervisionLevel {\n\t\treturn this.supervisionLevel;\n\t}\n\n\t// ─── Confirmation Queue ───\n\n\tgetPendingConfirmations(): PendingDecision[] {\n\t\treturn Array.from(this.pendingDecisions.values());\n\t}\n\n\tasync confirmDecision(\n\t\tsessionId: string,\n\t\tapproved: boolean,\n\t\toverride?: { response?: string; useKeys?: boolean; keys?: string[] },\n\t): Promise<void> {\n\t\tconst pending = this.pendingDecisions.get(sessionId);\n\t\tif (!pending) {\n\t\t\tthrow new Error(`No pending decision for session ${sessionId}`);\n\t\t}\n\n\t\tconst taskCtx = this.tasks.get(sessionId);\n\n\t\tif (approved) {\n\t\t\t// Use override if provided, otherwise use LLM suggestion\n\t\t\tconst decision: CoordinationLLMResponse = override\n\t\t\t\t? {\n\t\t\t\t\t\taction: \"respond\",\n\t\t\t\t\t\tresponse: override.response,\n\t\t\t\t\t\tuseKeys: override.useKeys,\n\t\t\t\t\t\tkeys: override.keys,\n\t\t\t\t\t\treasoning: \"Human-approved (with override)\",\n\t\t\t\t\t}\n\t\t\t\t: pending.llmDecision;\n\n\t\t\tif (taskCtx) {\n\t\t\t\ttaskCtx.status = \"active\";\n\t\t\t\ttaskCtx.autoResolvedCount = 0;\n\t\t\t\tawait this.recordDecision(taskCtx, {\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tevent: \"blocked\",\n\t\t\t\t\tpromptText: pending.promptText,\n\t\t\t\t\tdecision: decision.action,\n\t\t\t\t\tresponse:\n\t\t\t\t\t\tdecision.action === \"respond\"\n\t\t\t\t\t\t\t? decision.useKeys\n\t\t\t\t\t\t\t\t? `keys:${decision.keys?.join(\",\")}`\n\t\t\t\t\t\t\t\t: decision.response\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\treasoning: `Human-approved: ${decision.reasoning}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tawait this.executeDecision(sessionId, decision);\n\t\t\tthis.pendingDecisions.delete(sessionId);\n\t\t\tawait this.taskRegistry.deletePendingDecision(sessionId);\n\t\t\tif (taskCtx) {\n\t\t\t\tawait this.taskRegistry.appendEvent({\n\t\t\t\t\tthreadId: taskCtx.threadId,\n\t\t\t\t\tsessionId,\n\t\t\t\t\teventType: \"confirmation_approved\",\n\t\t\t\t\tsummary: `Approved pending confirmation for \"${taskCtx.label}\"`,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\taction: decision.action,\n\t\t\t\t\t\tresponse: decision.response ?? null,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.broadcast({\n\t\t\t\ttype: \"confirmation_approved\",\n\t\t\t\tsessionId,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tdata: {\n\t\t\t\t\taction: decision.action,\n\t\t\t\t\tresponse: decision.response,\n\t\t\t\t\tuseKeys: decision.useKeys,\n\t\t\t\t\tkeys: decision.keys,\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\t// Rejected — record and broadcast\n\t\t\tif (taskCtx) {\n\t\t\t\ttaskCtx.status = \"blocked\";\n\t\t\t\tawait this.recordDecision(taskCtx, {\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tevent: \"blocked\",\n\t\t\t\t\tpromptText: pending.promptText,\n\t\t\t\t\tdecision: \"escalate\",\n\t\t\t\t\treasoning: \"Human rejected the suggested action\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.pendingDecisions.delete(sessionId);\n\t\t\tawait this.taskRegistry.deletePendingDecision(sessionId);\n\t\t\tif (pending.taskContext.threadId) {\n\t\t\t\tawait this.taskRegistry.appendEvent({\n\t\t\t\t\tthreadId: pending.taskContext.threadId,\n\t\t\t\t\tsessionId,\n\t\t\t\t\teventType: \"confirmation_rejected\",\n\t\t\t\t\tsummary: `Rejected pending confirmation for \"${pending.taskContext.label}\"`,\n\t\t\t\t\tdata: { prompt: pending.promptText },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.broadcast({\n\t\t\t\ttype: \"confirmation_rejected\",\n\t\t\t\tsessionId,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tdata: { prompt: pending.promptText },\n\t\t\t});\n\t\t}\n\t}\n\n\t// ─── Internal ───\n\n\tlog(message: string): void {\n\t\tlogger.info(`[SwarmCoordinator] ${message}`);\n\t}\n}\n",
|
|
52
|
+
"/**\n * Swarm Coordinator — Event Bridge & Autonomous Coordination Loop\n *\n * Bridges PTY session events to:\n * 1. SSE clients (frontend dashboard) for real-time status\n * 2. LLM coordination decisions for unhandled blocking prompts\n *\n * The coordinator subscribes to PTYService session events and:\n * - Skips events already handled by auto-response rules (autoResponded=true)\n * - Routes unhandled blocking prompts through supervision levels:\n * - autonomous: LLM decides immediately\n * - confirm: queued for human approval\n * - notify: broadcast only (no action)\n *\n * Heavy logic is extracted into:\n * - swarm-decision-loop.ts (blocked, turn-complete, LLM decisions)\n * - swarm-idle-watchdog.ts (idle session scanning)\n *\n * @module services/swarm-coordinator\n */\n\nimport type { ServerResponse } from \"node:http\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { buildAgentCredentials } from \"./agent-credentials.js\";\nimport { extractDevServerUrl } from \"./ansi-utils.js\";\nimport type { PTYService } from \"./pty-service.js\";\nimport type { CodingAgentType } from \"./pty-types.js\";\nimport { normalizeAgentType } from \"./pty-types.js\";\nimport type {\n CoordinationLLMResponse,\n SharedDecision,\n} from \"./swarm-coordinator-prompts.js\";\nimport {\n checkAllTasksComplete,\n clearDeferredTurnCompleteTimers,\n executeDecision as execDecision,\n handleBlocked,\n handleTurnComplete,\n} from \"./swarm-decision-loop.js\";\nimport { SwarmHistory } from \"./swarm-history.js\";\nimport { scanIdleSessions } from \"./swarm-idle-watchdog.js\";\nimport { deriveTaskAcceptanceCriteria } from \"./task-acceptance.js\";\nimport {\n isUsageExhaustedTaskAgentError,\n markTaskAgentFrameworkHealthy,\n markTaskAgentFrameworkUnavailable,\n type SupportedTaskAgentAdapter,\n type TaskAgentFrameworkAvailability,\n type TaskAgentFrameworkId,\n} from \"./task-agent-frameworks.js\";\nimport { inferTaskThreadKind } from \"./task-kind.js\";\nimport {\n type CreateTaskThreadInput,\n type TaskDecisionRecord,\n type TaskNodeRecord,\n type TaskNodeStatus,\n type TaskPendingDecisionRecord,\n TaskRegistry,\n type TaskSessionRecord,\n type TaskThreadDetail,\n type TaskThreadStatus,\n type TaskThreadSummary,\n} from \"./task-registry.js\";\n\n// ─── Types ───\n\n/** Callback injected by server.ts to route chat messages to the user's conversation. */\nexport type ChatMessageCallback = (\n text: string,\n source?: string,\n) => Promise<void>;\n\n/** Callback injected by server.ts to relay coordinator events to WebSocket clients. */\nexport type WsBroadcastCallback = (event: SwarmEvent) => void;\n\n/**\n * Callback injected by server.ts to route coordinator events through\n * Milaidy's full ElizaOS pipeline (conversation memory, personality, actions).\n * Returns a CoordinationLLMResponse parsed from Milaidy's natural language\n * response, or null if no actionable JSON block was found.\n */\nexport type AgentDecisionCallback = (\n eventDescription: string,\n sessionId: string,\n taskContext: TaskContext,\n) => Promise<CoordinationLLMResponse | null>;\n\n/** Per-task summary included in the swarm complete payload. */\nexport interface TaskCompletionSummary {\n sessionId: string;\n label: string;\n agentType: string;\n originalTask: string;\n status: string;\n completionSummary: string;\n}\n\n/** Callback fired when all tasks in a swarm reach terminal state. */\nexport type SwarmCompleteCallback = (payload: {\n tasks: TaskCompletionSummary[];\n total: number;\n completed: number;\n stopped: number;\n errored: number;\n}) => Promise<void>;\n\nexport type SupervisionLevel = \"autonomous\" | \"confirm\" | \"notify\";\n\nexport interface TaskContext {\n threadId: string;\n taskNodeId?: string;\n sessionId: string;\n agentType: CodingAgentType;\n label: string;\n originalTask: string;\n workdir: string;\n /** Repository URL if provided, undefined for scratch directory tasks. */\n repo?: string;\n status:\n | \"active\"\n | \"blocked\"\n | \"tool_running\"\n | \"completed\"\n | \"error\"\n | \"stopped\";\n decisions: CoordinationDecision[];\n autoResolvedCount: number;\n registeredAt: number;\n /** Timestamp of the last session event (any type). Used by idle watchdog. */\n lastActivityAt: number;\n /** How many idle checks have been performed on this session. */\n idleCheckCount: number;\n /** True once the initial task has been delivered to the agent. */\n taskDelivered: boolean;\n /** Summary of what the agent accomplished, populated on completion. */\n completionSummary?: string;\n /** Index into sharedDecisions[] — tracks which decisions this agent has already seen. */\n lastSeenDecisionIndex: number;\n /** Timestamp of last coordinator-sent input. Used to suppress stall/turn-complete\n * events for a grace period so the agent has time to process the input. */\n lastInputSentAt?: number;\n /** Timestamp when the task was last transitioned to `stopped`. */\n stoppedAt?: number;\n}\n\nexport interface CoordinationDecision {\n timestamp: number;\n event: string;\n promptText: string;\n decision:\n | \"respond\"\n | \"escalate\"\n | \"ignore\"\n | \"complete\"\n | \"auto_resolved\"\n | \"stopped\";\n response?: string;\n reasoning: string;\n}\n\nexport interface SwarmEvent {\n type: string;\n sessionId: string;\n timestamp: number;\n data: unknown;\n}\n\nexport interface PendingDecision {\n sessionId: string;\n promptText: string;\n recentOutput: string;\n llmDecision: CoordinationLLMResponse;\n taskContext: TaskContext;\n createdAt: number;\n}\n\n/**\n * Context interface exposing internal state and helpers to extracted modules.\n * Implemented by SwarmCoordinator — passed as `this` to module-level functions.\n */\nexport interface SwarmCoordinatorContext {\n readonly runtime: IAgentRuntime;\n readonly ptyService: PTYService | null;\n readonly taskRegistry: TaskRegistry;\n readonly tasks: Map<string, TaskContext>;\n readonly inFlightDecisions: Set<string>;\n readonly pendingDecisions: Map<string, PendingDecision>;\n /** Buffered task_complete events that arrived while an in-flight decision was running. */\n readonly pendingTurnComplete: Map<string, unknown>;\n /** Fingerprint of the last blocked prompt per session — for re-render dedup. */\n readonly lastBlockedPromptFingerprint: Map<string, string>;\n /** Buffered blocked events that arrived while an in-flight decision was running. */\n readonly pendingBlocked: Map<string, unknown>;\n /** Last-seen output snapshot per session — used by idle watchdog. */\n readonly lastSeenOutput: Map<string, string>;\n /** Timestamp of last tool_running chat notification per session — for throttling. */\n readonly lastToolNotification: Map<string, number>;\n\n /** Whether LLM decisions are paused (user sent a chat message). */\n readonly isPaused: boolean;\n\n /** Significant decisions shared across the swarm. */\n readonly sharedDecisions: SharedDecision[];\n\n /** Get the shared context brief from the planning phase. */\n getSwarmContext(): string;\n\n /**\n * Guard flag: whether the swarm_complete event has already been fired\n * for the current swarm lifecycle. Set to `true` by `checkAllTasksComplete()`\n * when all tasks reach terminal state. Reset to `false` by:\n * - `stop()` — full coordinator teardown\n * - `registerTask()` — when detecting a new swarm (all previous tasks terminal)\n */\n swarmCompleteNotified: boolean;\n\n broadcast(event: SwarmEvent): void;\n sendChatMessage(text: string, source?: string): void;\n log(message: string): void;\n getSupervisionLevel(): SupervisionLevel;\n getAgentDecisionCallback(): AgentDecisionCallback | null;\n getSwarmCompleteCallback(): SwarmCompleteCallback | null;\n recordDecision(\n taskCtx: TaskContext,\n decision: CoordinationDecision,\n ): Promise<void>;\n syncTaskContext(taskCtx: TaskContext): Promise<void>;\n}\n\n// ─── Constants ───\n\n/** Time to buffer events for unregistered sessions (ms). */\n/** Exponential backoff delays for unregistered session buffer retries. */\nconst UNREGISTERED_RETRY_DELAYS = [2000, 4000, 8000, 16000];\n/** Absolute maximum wait time before discarding unregistered events. */\nconst UNREGISTERED_MAX_TOTAL_MS = 30_000;\n\n/** Coalesce rapid turn-complete events within this window (ms). */\nconst TURN_COMPLETE_COALESCE_MS = 500;\n\n/** How often the idle watchdog scans for idle sessions (ms). */\nconst IDLE_SCAN_INTERVAL_MS = 60 * 1000; // 1 minute\n\n/** How long to wait before auto-resuming a paused coordinator (ms). */\nconst PAUSE_TIMEOUT_MS = 30_000;\n/** Max events to buffer before WS bridge is wired. */\nconst MAX_PRE_BRIDGE_BUFFER = 100;\n/** Grace window where a late task_complete can recover a recently-stopped task. */\nconst STOPPED_RECOVERY_WINDOW_MS = 90_000;\nconst FAILOVER_OUTPUT_MAX_CHARS = 4_000;\n\nfunction inferProviderSource(\n framework: TaskAgentFrameworkAvailability,\n): string | null {\n if (framework.subscriptionReady) {\n return \"subscription\";\n }\n if (framework.id === \"pi\") {\n return framework.installed ? \"local-cli\" : null;\n }\n return framework.authReady ? \"credentials\" : null;\n}\n\n// ─── Service ───\n\nexport class SwarmCoordinator implements SwarmCoordinatorContext {\n static serviceType = \"SWARM_COORDINATOR\";\n\n readonly runtime: IAgentRuntime;\n readonly taskRegistry: TaskRegistry;\n ptyService: PTYService | null = null;\n private unsubscribeEvents: (() => void) | null = null;\n\n /** Per-session task context. */\n readonly tasks: Map<string, TaskContext> = new Map();\n\n /** SSE clients receiving live events. */\n private sseClients: Set<ServerResponse> = new Set();\n\n /** Supervision level (default: autonomous). */\n private supervisionLevel: SupervisionLevel = \"autonomous\";\n\n /** Pending confirmations for \"confirm\" mode. */\n readonly pendingDecisions: Map<string, PendingDecision> = new Map();\n\n /** In-flight decision lock — prevents parallel LLM calls for same session. */\n readonly inFlightDecisions: Set<string> = new Set();\n\n /** Buffered task_complete events that arrived while an in-flight decision was running. */\n readonly pendingTurnComplete: Map<string, unknown> = new Map();\n\n /** Fingerprint of the last blocked prompt per session — for re-render dedup. */\n readonly lastBlockedPromptFingerprint: Map<string, string> = new Map();\n\n /** Buffered blocked events that arrived while an in-flight decision was running. */\n readonly pendingBlocked: Map<string, unknown> = new Map();\n\n /** Callback to send chat messages to the user's conversation UI. */\n private chatCallback: ChatMessageCallback | null = null;\n\n /** Callback to relay coordinator events to WebSocket clients. */\n private wsBroadcast: WsBroadcastCallback | null = null;\n\n /** Callback to route coordinator events through Milaidy's full pipeline. */\n private agentDecisionCb: AgentDecisionCallback | null = null;\n\n /** Callback fired when all swarm tasks complete — for synthesis. */\n private swarmCompleteCb: SwarmCompleteCallback | null = null;\n\n /** Buffer for events arriving before task registration. */\n private unregisteredBuffer: Map<\n string,\n Array<{ event: string; data: unknown; receivedAt: number }>\n > = new Map();\n\n /** Idle watchdog timer handle. */\n private idleWatchdogTimer: ReturnType<typeof setInterval> | null = null;\n\n /** Last-seen output snapshot per session — used by idle watchdog to detect data flow. */\n readonly lastSeenOutput: Map<string, string> = new Map();\n\n /** Timestamp of last tool_running chat notification per session — for throttling. */\n readonly lastToolNotification: Map<string, number> = new Map();\n\n /** Whether LLM decisions are paused (user sent a chat message). */\n private _paused = false;\n\n /** Significant decisions shared across the swarm (Layer 2). */\n readonly sharedDecisions: SharedDecision[] = [];\n\n /** Shared context brief generated during swarm planning phase. */\n private _swarmContext = \"\";\n\n /** @see SwarmCoordinatorContext.swarmCompleteNotified */\n swarmCompleteNotified = false;\n\n /** Buffered events during pause — replayed on resume. */\n private pauseBuffer: Array<{\n sessionId: string;\n event: string;\n data: unknown;\n }> = [];\n\n /** Buffered broadcasts waiting for wsBroadcast to be wired. */\n private preBridgeBroadcastBuffer: SwarmEvent[] = [];\n\n /** Auto-resume timeout handle. */\n private pauseTimeout: ReturnType<typeof setTimeout> | null = null;\n\n /** Coordinator startup timestamp — ignore events from sessions created before this. */\n private readonly startedAt = Date.now();\n\n /** Active retry timers for unregistered session buffers. */\n private unregisteredRetryTimers: Map<string, ReturnType<typeof setTimeout>> =\n new Map();\n\n /** Turn-complete coalescing timers — debounces rapid events per session. */\n private turnCompleteCoalesceTimers: Map<\n string,\n ReturnType<typeof setTimeout>\n > = new Map();\n\n /** Persistent swarm history — JSONL log that survives restarts. */\n readonly history = new SwarmHistory();\n\n constructor(runtime: IAgentRuntime) {\n this.runtime = runtime;\n this.taskRegistry = new TaskRegistry(runtime);\n }\n\n // ─── Chat Callback ───\n\n /** Inject a callback (from server.ts) to route messages to the user's chat UI. */\n /** Track whether we've already wired the scratch decision callback. */\n private scratchDecisionWired = false;\n\n setChatCallback(cb: ChatMessageCallback): void {\n this.chatCallback = cb;\n this.log(\"Chat callback wired\");\n // Try wiring scratch decision callback now, retry lazily if service not ready\n this.wireScratchDecisionCallback();\n }\n\n /**\n * Wire the scratch workspace save prompt callback.\n * Called eagerly from setChatCallback and lazily from handleSessionEvent\n * in case the workspace service wasn't ready at chat-callback time.\n */\n private wireScratchDecisionCallback(): void {\n if (this.scratchDecisionWired || !this.chatCallback) return;\n const wsService = this.runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as\n | {\n setScratchDecisionCallback?: (\n cb: (record: {\n label: string;\n path: string;\n expiresAt?: number;\n }) => Promise<void>,\n ) => void;\n }\n | undefined;\n if (wsService?.setScratchDecisionCallback) {\n const chatCb = this.chatCallback;\n wsService.setScratchDecisionCallback(async (record) => {\n const ttlNote = record.expiresAt\n ? (() => {\n const remainMs = record.expiresAt - Date.now();\n const hours = Math.round(remainMs / (60 * 60 * 1000));\n return hours >= 1\n ? `It will be automatically cleaned up in ~${hours} hour${hours === 1 ? \"\" : \"s\"}.`\n : `It will be automatically cleaned up shortly.`;\n })()\n : \"It will be automatically cleaned up after the configured retention period.\";\n await chatCb(\n `Task \"${record.label}\" finished. Code is at \\`${record.path}\\`.\\n` +\n `${ttlNote} To keep it, say \"keep the workspace\" or manage it in Settings -> Task Agents.`,\n \"task-agent\",\n );\n });\n this.scratchDecisionWired = true;\n this.log(\"Scratch decision callback wired\");\n }\n }\n\n /** Inject a callback (from server.ts) to relay events to WebSocket clients. */\n setWsBroadcast(cb: WsBroadcastCallback): void {\n this.wsBroadcast = cb;\n // Replay any events that were broadcast before the bridge was wired\n if (this.preBridgeBroadcastBuffer.length > 0) {\n this.log(\n `WS broadcast callback wired — replaying ${this.preBridgeBroadcastBuffer.length} buffered event(s)`,\n );\n for (const event of this.preBridgeBroadcastBuffer) {\n cb(event);\n }\n this.preBridgeBroadcastBuffer.length = 0;\n } else {\n this.log(\"WS broadcast callback wired\");\n }\n }\n\n /** Inject a callback fired when all swarm tasks reach terminal state. */\n setSwarmCompleteCallback(cb: SwarmCompleteCallback): void {\n this.swarmCompleteCb = cb;\n this.log(\"Swarm complete callback wired\");\n }\n\n /** Return the swarm complete callback (if wired). */\n getSwarmCompleteCallback(): SwarmCompleteCallback | null {\n return this.swarmCompleteCb;\n }\n\n /** Set the shared context brief for this swarm. */\n setSwarmContext(context: string): void {\n this._swarmContext = context;\n this.log(`Swarm context set (${context.length} chars)`);\n }\n\n /** Return the swarm planning context (if set). */\n getSwarmContext(): string {\n return this._swarmContext;\n }\n\n /** Inject a callback (from server.ts) to route events through Milaidy's pipeline. */\n setAgentDecisionCallback(cb: AgentDecisionCallback): void {\n this.agentDecisionCb = cb;\n this.log(\n \"Agent decision callback wired — events will route through Milaidy\",\n );\n }\n\n /** Return the agent decision callback (if wired). */\n getAgentDecisionCallback(): AgentDecisionCallback | null {\n return this.agentDecisionCb;\n }\n\n /** Null-safe wrapper — sends a message to the user's conversation if callback is set. */\n sendChatMessage(text: string, source?: string): void {\n if (!this.chatCallback) return;\n this.chatCallback(text, source).catch((err) => {\n this.log(`Failed to send chat message: ${err}`);\n });\n }\n\n // ─── Lifecycle ───\n\n /**\n * Initialize the coordinator by subscribing to PTY session events.\n * Called from plugin init after services are ready.\n */\n async start(ptyService: PTYService): Promise<void> {\n await this.taskRegistry.ensureSchema();\n await this.taskRegistry.recoverInterruptedTasks();\n await this.rehydratePendingDecisions();\n this.ptyService = ptyService;\n this.unsubscribeEvents = ptyService.onSessionEvent(\n (sessionId, event, data) => {\n this.handleSessionEvent(sessionId, event, data).catch((err) => {\n this.log(`Error handling event: ${err}`);\n });\n },\n );\n\n // Start idle watchdog\n this.idleWatchdogTimer = setInterval(() => {\n scanIdleSessions(this).catch((err) => {\n this.log(`Idle watchdog error: ${err}`);\n });\n }, IDLE_SCAN_INTERVAL_MS);\n\n this.log(\"SwarmCoordinator started\");\n }\n\n private restorePendingTaskContext(\n record: TaskPendingDecisionRecord,\n ): TaskContext {\n const raw = record.taskContext;\n const status = (() => {\n switch (typeof raw.status === \"string\" ? raw.status : \"\") {\n case \"active\":\n case \"blocked\":\n case \"tool_running\":\n case \"completed\":\n case \"error\":\n case \"stopped\":\n return raw.status as TaskContext[\"status\"];\n default:\n return \"blocked\";\n }\n })();\n return {\n threadId:\n typeof raw.threadId === \"string\" && raw.threadId.trim().length > 0\n ? raw.threadId\n : record.threadId,\n ...(typeof raw.taskNodeId === \"string\" && raw.taskNodeId.trim().length > 0\n ? { taskNodeId: raw.taskNodeId }\n : {}),\n sessionId: record.sessionId,\n agentType:\n typeof raw.agentType === \"string\" && raw.agentType.trim().length > 0\n ? (raw.agentType as CodingAgentType)\n : \"claude\",\n label:\n typeof raw.label === \"string\" && raw.label.trim().length > 0\n ? raw.label\n : `agent-${record.sessionId.slice(-8)}`,\n originalTask:\n typeof raw.originalTask === \"string\"\n ? raw.originalTask\n : record.promptText,\n workdir: typeof raw.workdir === \"string\" ? raw.workdir : \"\",\n ...(typeof raw.repo === \"string\" && raw.repo.trim().length > 0\n ? { repo: raw.repo }\n : {}),\n status,\n decisions: Array.isArray(raw.decisions)\n ? (raw.decisions.filter((entry) =>\n Boolean(entry && typeof entry === \"object\"),\n ) as CoordinationDecision[])\n : [],\n autoResolvedCount:\n typeof raw.autoResolvedCount === \"number\" ? raw.autoResolvedCount : 0,\n registeredAt:\n typeof raw.registeredAt === \"number\"\n ? raw.registeredAt\n : record.createdAt,\n lastActivityAt:\n typeof raw.lastActivityAt === \"number\"\n ? raw.lastActivityAt\n : record.createdAt,\n idleCheckCount:\n typeof raw.idleCheckCount === \"number\" ? raw.idleCheckCount : 0,\n taskDelivered: raw.taskDelivered === true,\n ...(typeof raw.completionSummary === \"string\"\n ? { completionSummary: raw.completionSummary }\n : {}),\n lastSeenDecisionIndex:\n typeof raw.lastSeenDecisionIndex === \"number\"\n ? raw.lastSeenDecisionIndex\n : 0,\n ...(typeof raw.lastInputSentAt === \"number\"\n ? { lastInputSentAt: raw.lastInputSentAt }\n : {}),\n ...(typeof raw.stoppedAt === \"number\"\n ? { stoppedAt: raw.stoppedAt }\n : {}),\n };\n }\n\n private restorePendingLlmDecision(\n record: TaskPendingDecisionRecord,\n ): CoordinationLLMResponse {\n const raw = record.llmDecision;\n const action =\n typeof raw.action === \"string\" &&\n [\"respond\", \"escalate\", \"ignore\", \"complete\"].includes(raw.action)\n ? (raw.action as CoordinationLLMResponse[\"action\"])\n : \"escalate\";\n return {\n action,\n ...(typeof raw.response === \"string\" ? { response: raw.response } : {}),\n ...(raw.useKeys === true ? { useKeys: true } : {}),\n ...(Array.isArray(raw.keys)\n ? {\n keys: raw.keys.filter(\n (entry): entry is string => typeof entry === \"string\",\n ),\n }\n : {}),\n reasoning:\n typeof raw.reasoning === \"string\" && raw.reasoning.trim().length > 0\n ? raw.reasoning\n : \"Recovered pending confirmation from persisted coordinator state.\",\n };\n }\n\n private async rehydratePendingDecisions(): Promise<void> {\n const records = await this.taskRegistry.listPendingDecisions();\n for (const record of records) {\n const taskContext = this.restorePendingTaskContext(record);\n this.tasks.set(record.sessionId, taskContext);\n this.pendingDecisions.set(record.sessionId, {\n sessionId: record.sessionId,\n promptText: record.promptText,\n recentOutput: record.recentOutput,\n llmDecision: this.restorePendingLlmDecision(record),\n taskContext,\n createdAt: record.createdAt,\n });\n }\n }\n\n async stop(): Promise<void> {\n const persistOnShutdown = Array.from(this.tasks.values())\n .filter(\n (task) =>\n task.status === \"active\" ||\n task.status === \"blocked\" ||\n task.status === \"tool_running\",\n )\n .map(async (task) => {\n task.status = \"stopped\";\n task.stoppedAt = Date.now();\n await this.taskRegistry.updateSession(task.sessionId, {\n status: \"interrupted\",\n lastActivityAt: task.lastActivityAt,\n idleCheckCount: task.idleCheckCount,\n taskDelivered: task.taskDelivered,\n autoResolvedCount: task.autoResolvedCount,\n decisionCount: task.decisions.length,\n completionSummary: task.completionSummary ?? null,\n lastSeenDecisionIndex: task.lastSeenDecisionIndex,\n lastInputSentAt: task.lastInputSentAt,\n stoppedAt: task.stoppedAt,\n });\n await this.taskRegistry.appendEvent({\n threadId: task.threadId,\n sessionId: task.sessionId,\n eventType: \"session_interrupted\",\n summary: \"Session interrupted during coordinator shutdown\",\n data: { reason: \"coordinator_shutdown\" },\n });\n });\n await Promise.allSettled(persistOnShutdown);\n if (this.idleWatchdogTimer) {\n clearInterval(this.idleWatchdogTimer);\n this.idleWatchdogTimer = null;\n }\n if (this.unsubscribeEvents) {\n this.unsubscribeEvents();\n this.unsubscribeEvents = null;\n }\n // Close all SSE connections\n for (const client of this.sseClients) {\n if (!client.writableEnded) {\n client.end();\n }\n }\n this.sseClients.clear();\n this.tasks.clear();\n this.pendingDecisions.clear();\n this.inFlightDecisions.clear();\n this.pendingTurnComplete.clear();\n clearDeferredTurnCompleteTimers();\n this.lastBlockedPromptFingerprint.clear();\n this.pendingBlocked.clear();\n this.unregisteredBuffer.clear();\n for (const timer of this.unregisteredRetryTimers.values()) {\n clearTimeout(timer);\n }\n this.unregisteredRetryTimers.clear();\n for (const timer of this.turnCompleteCoalesceTimers.values()) {\n clearTimeout(timer);\n }\n this.turnCompleteCoalesceTimers.clear();\n this.lastSeenOutput.clear();\n this.lastToolNotification.clear();\n this.agentDecisionCb = null;\n this.sharedDecisions.length = 0;\n this._swarmContext = \"\";\n this.swarmCompleteNotified = false;\n // Clear pause state\n this._paused = false;\n if (this.pauseTimeout) {\n clearTimeout(this.pauseTimeout);\n this.pauseTimeout = null;\n }\n this.pauseBuffer = [];\n this.preBridgeBroadcastBuffer.length = 0;\n this.log(\"SwarmCoordinator stopped\");\n }\n\n // ─── Pause / Resume ───\n\n /** Whether the coordinator is currently paused. */\n get isPaused(): boolean {\n return this._paused;\n }\n\n /** Pause LLM-based decisions. Auto-responses and broadcasts continue. */\n pause(): void {\n if (this._paused) return;\n this._paused = true;\n this.log(\n \"Coordinator paused — buffering LLM decisions until user message is processed\",\n );\n this.broadcast({\n type: \"coordinator_paused\",\n sessionId: \"\",\n timestamp: Date.now(),\n data: {},\n });\n\n // Safety: auto-resume after timeout\n this.pauseTimeout = setTimeout(() => {\n if (this._paused) {\n this.log(\"Coordinator auto-resuming after timeout\");\n this.resume();\n }\n }, PAUSE_TIMEOUT_MS);\n }\n\n /** Resume LLM-based decisions and replay buffered events. */\n resume(): void {\n if (!this._paused) return;\n this._paused = false;\n if (this.pauseTimeout) {\n clearTimeout(this.pauseTimeout);\n this.pauseTimeout = null;\n }\n\n this.log(\n `Coordinator resumed — replaying ${this.pauseBuffer.length} buffered events`,\n );\n this.broadcast({\n type: \"coordinator_resumed\",\n sessionId: \"\",\n timestamp: Date.now(),\n data: {},\n });\n\n // Replay buffered events\n const buffered = [...this.pauseBuffer];\n this.pauseBuffer = [];\n for (const entry of buffered) {\n this.handleSessionEvent(entry.sessionId, entry.event, entry.data).catch(\n (err) => {\n this.log(`Error replaying buffered event: ${err}`);\n },\n );\n }\n }\n\n // ─── Task Registration ───\n\n async registerTask(\n sessionId: string,\n context: {\n threadId?: string;\n taskNodeId?: string;\n agentType: CodingAgentType;\n label: string;\n originalTask: string;\n workdir: string;\n repo?: string;\n providerSource?: string | null;\n metadata?: Record<string, unknown>;\n },\n ): Promise<void> {\n const threadId = context.threadId?.trim() || sessionId;\n // Reset swarm state when the first task of a new swarm is registered.\n // Check for terminal-only tasks (all previous tasks in completed/stopped/error)\n // rather than empty map, so reuse without stop() works.\n const allPreviousTerminal =\n this.tasks.size === 0 ||\n Array.from(this.tasks.values()).every(\n (t) =>\n t.status === \"completed\" ||\n t.status === \"stopped\" ||\n t.status === \"error\",\n );\n if (allPreviousTerminal) {\n this.swarmCompleteNotified = false;\n // Clear stale tasks and shared context from previous swarm\n if (this.tasks.size > 0) {\n this.tasks.clear();\n this.sharedDecisions.length = 0;\n this._swarmContext = \"\";\n this.log(\"Cleared stale swarm state for new swarm\");\n }\n }\n\n const taskNodeId = context.taskNodeId?.trim() || `node-${sessionId}`;\n\n this.tasks.set(sessionId, {\n threadId,\n taskNodeId,\n sessionId,\n agentType: context.agentType,\n label: context.label,\n originalTask: context.originalTask,\n workdir: context.workdir,\n repo: context.repo,\n status: \"active\",\n decisions: [],\n autoResolvedCount: 0,\n registeredAt: Date.now(),\n lastActivityAt: Date.now(),\n idleCheckCount: 0,\n taskDelivered: false,\n lastSeenDecisionIndex: 0,\n });\n\n // Persist last used repo so it survives task cleanup\n if (context.repo) {\n this._lastUsedRepo = context.repo;\n }\n\n // Log to persistent history (fire-and-forget)\n this.history\n .append({\n timestamp: Date.now(),\n type: \"task_registered\",\n sessionId,\n label: context.label,\n agentType: context.agentType,\n repo: context.repo,\n workdir: context.workdir,\n originalTask: context.originalTask,\n })\n .catch(() => {});\n\n const taskCtx = this.tasks.get(sessionId);\n const persistPromise = taskCtx\n ? (async () => {\n const existingThread =\n await this.taskRegistry.getThreadRecord(threadId);\n if (!existingThread) {\n await this.createTaskThread({\n id: threadId,\n title: context.label,\n originalRequest: context.originalTask,\n metadata: {\n repo: context.repo ?? null,\n source: \"register-task-fallback\",\n },\n });\n }\n const existingNode = await this.taskRegistry.getTaskNode(taskNodeId);\n if (!existingNode) {\n await this.taskRegistry.createTaskNode({\n id: taskNodeId,\n threadId: taskCtx.threadId,\n kind: \"execution\",\n status: \"running\",\n title: context.label,\n instructions: context.originalTask,\n requiredCapabilities: [context.agentType],\n assignedSessionId: sessionId,\n assignedLabel: context.label,\n agentType: context.agentType,\n workdir: context.workdir,\n repo: context.repo,\n createdFrom: context.taskNodeId\n ? \"register-task-existing-node\"\n : \"register-task-fallback\",\n metadata: {\n providerSource: context.providerSource ?? null,\n },\n });\n } else if (existingNode.threadId !== taskCtx.threadId) {\n throw new Error(\n `Task node ${taskNodeId} belongs to ${existingNode.threadId}, expected ${taskCtx.threadId}`,\n );\n }\n await Promise.all([\n this.taskRegistry.registerSession({\n threadId: taskCtx.threadId,\n sessionId,\n framework: context.agentType,\n providerSource: context.providerSource,\n label: context.label,\n originalTask: context.originalTask,\n workdir: context.workdir,\n repo: context.repo,\n status: \"active\",\n decisionCount: 0,\n autoResolvedCount: 0,\n registeredAt: taskCtx.registeredAt,\n lastActivityAt: taskCtx.lastActivityAt,\n idleCheckCount: taskCtx.idleCheckCount,\n taskDelivered: false,\n lastSeenDecisionIndex: 0,\n metadata: {\n ...(context.metadata ?? {}),\n taskNodeId,\n },\n }),\n this.taskRegistry.updateTaskNode(taskNodeId, {\n status: \"running\",\n title: context.label,\n instructions: context.originalTask,\n assignedSessionId: sessionId,\n assignedLabel: context.label,\n agentType: context.agentType,\n workdir: context.workdir,\n repo: context.repo,\n metadata: {\n providerSource: context.providerSource ?? null,\n },\n }),\n this.taskRegistry.createTaskClaim({\n threadId,\n nodeId: taskNodeId,\n sessionId,\n claimType: \"execution\",\n status: \"active\",\n metadata: {\n label: context.label,\n },\n }),\n this.taskRegistry.appendEvent({\n threadId,\n sessionId,\n eventType: \"task_registered\",\n timestamp: Date.now(),\n summary: `Registered task \"${context.label}\"`,\n data: {\n label: context.label,\n originalTask: context.originalTask,\n repo: context.repo ?? null,\n taskNodeId,\n },\n }),\n ]);\n })()\n : Promise.resolve();\n void persistPromise.catch((err) => {\n this.log(`Failed to persist task registration for ${sessionId}: ${err}`);\n });\n\n this.broadcast({\n type: \"task_registered\",\n sessionId,\n timestamp: Date.now(),\n data: {\n agentType: context.agentType,\n label: context.label,\n originalTask: context.originalTask,\n },\n });\n\n // Cancel any pending retry timer and flush buffered events\n const retryTimer = this.unregisteredRetryTimers.get(sessionId);\n if (retryTimer) {\n clearTimeout(retryTimer);\n this.unregisteredRetryTimers.delete(sessionId);\n }\n const buffered = this.unregisteredBuffer.get(sessionId);\n if (buffered) {\n this.unregisteredBuffer.delete(sessionId);\n for (const entry of buffered) {\n this.handleSessionEvent(sessionId, entry.event, entry.data).catch(\n (err) => {\n this.log(`Error replaying buffered event: ${err}`);\n },\n );\n }\n }\n await persistPromise;\n }\n\n /**\n * Return the repo URL from the most recently registered task that had one.\n * Useful as a fallback when the user says \"in the same repo\" without a URL.\n */\n /**\n * Persisted separately from tasks so it survives task cleanup.\n * Updated whenever a task with a repo is registered.\n */\n private _lastUsedRepo: string | undefined;\n\n getLastUsedRepo(): string | undefined {\n // Check active tasks first (freshest), fall back to in-memory persisted value\n let latest: TaskContext | undefined;\n for (const task of this.tasks.values()) {\n if (task.repo && (!latest || task.registeredAt > latest.registeredAt)) {\n latest = task;\n }\n }\n return latest?.repo ?? this._lastUsedRepo;\n }\n\n /**\n * Async version that also checks disk history — survives process restarts.\n * Callers that can await should prefer this over the sync version.\n */\n async getLastUsedRepoAsync(): Promise<string | undefined> {\n const memoryRepo = this.getLastUsedRepo();\n if (memoryRepo) return memoryRepo;\n try {\n return (\n (await this.taskRegistry.getLastUsedRepo()) ??\n (await this.history.getLastUsedRepo())\n );\n } catch {\n return undefined;\n }\n }\n\n getTaskContext(sessionId: string): TaskContext | undefined {\n return this.tasks.get(sessionId);\n }\n\n private mapDecisionRecord(record: TaskDecisionRecord): CoordinationDecision {\n return {\n timestamp: record.timestamp,\n event: record.event,\n promptText: record.promptText,\n decision: record.decision as CoordinationDecision[\"decision\"],\n ...(record.response ? { response: record.response } : {}),\n reasoning: record.reasoning,\n };\n }\n\n private mapSessionStatus(\n status: TaskSessionRecord[\"status\"],\n ): TaskContext[\"status\"] {\n switch (status) {\n case \"blocked\":\n case \"waiting_on_user\":\n return \"blocked\";\n case \"tool_running\":\n return \"tool_running\";\n case \"completed\":\n return \"completed\";\n case \"error\":\n return \"error\";\n case \"stopped\":\n case \"interrupted\":\n return \"stopped\";\n default:\n return \"active\";\n }\n }\n\n private mapTaskContextStatusToNodeStatus(\n status: TaskContext[\"status\"],\n ): TaskNodeStatus {\n switch (status) {\n case \"blocked\":\n return \"blocked\";\n case \"completed\":\n return \"completed\";\n case \"error\":\n return \"failed\";\n case \"stopped\":\n return \"interrupted\";\n case \"tool_running\":\n return \"running\";\n default:\n return \"running\";\n }\n }\n\n private buildTaskContextFromSession(\n session: TaskSessionRecord,\n decisions: TaskDecisionRecord[],\n ): TaskContext {\n return {\n threadId: session.threadId,\n ...(typeof session.metadata.taskNodeId === \"string\" &&\n session.metadata.taskNodeId.trim().length > 0\n ? { taskNodeId: session.metadata.taskNodeId }\n : {}),\n sessionId: session.sessionId,\n agentType: session.framework,\n label: session.label,\n originalTask: session.originalTask,\n workdir: session.workdir,\n ...(session.repo ? { repo: session.repo } : {}),\n status: this.mapSessionStatus(session.status),\n decisions: decisions.map((decision) => this.mapDecisionRecord(decision)),\n autoResolvedCount: session.autoResolvedCount,\n registeredAt: session.registeredAt,\n lastActivityAt: session.lastActivityAt,\n idleCheckCount: session.idleCheckCount,\n taskDelivered: session.taskDelivered,\n ...(session.completionSummary\n ? { completionSummary: session.completionSummary }\n : {}),\n lastSeenDecisionIndex: session.lastSeenDecisionIndex,\n ...(session.lastInputSentAt !== null\n ? { lastInputSentAt: session.lastInputSentAt }\n : {}),\n ...(session.stoppedAt !== null ? { stoppedAt: session.stoppedAt } : {}),\n };\n }\n\n async getTaskContextSnapshot(sessionId: string): Promise<TaskContext | null> {\n const live = this.tasks.get(sessionId);\n if (live) return live;\n const session = await this.taskRegistry.getSession(sessionId);\n if (!session) return null;\n const decisions =\n await this.taskRegistry.listDecisionsForSession(sessionId);\n return this.buildTaskContextFromSession(session, decisions);\n }\n\n getAllTaskContexts(): TaskContext[] {\n return Array.from(this.tasks.values());\n }\n\n async createTaskThread(\n input: CreateTaskThreadInput,\n ): Promise<TaskThreadSummary> {\n const normalizedInput: CreateTaskThreadInput = {\n ...input,\n kind: inferTaskThreadKind(input),\n };\n const acceptance = await deriveTaskAcceptanceCriteria(\n this.runtime,\n normalizedInput,\n );\n const thread = await this.taskRegistry.createThread({\n ...normalizedInput,\n acceptanceCriteria: acceptance.criteria,\n metadata: {\n ...(normalizedInput.metadata ?? {}),\n acceptanceCriteriaSource: acceptance.source,\n },\n });\n const summary = await this.taskRegistry.getThreadSummary(thread.id);\n if (!summary) {\n throw new Error(`Failed to load task thread ${thread.id}`);\n }\n return summary;\n }\n\n async planTaskThreadGraph(input: {\n threadId: string;\n title: string;\n originalRequest: string;\n sharedContext?: string;\n subtasks: Array<{\n label: string;\n originalTask: string;\n agentType: CodingAgentType;\n repo?: string;\n }>;\n }): Promise<{\n rootNode: TaskNodeRecord;\n workerNodes: TaskNodeRecord[];\n }> {\n const thread = await this.taskRegistry.getThreadRecord(input.threadId);\n if (!thread) {\n throw new Error(`Task thread ${input.threadId} not found`);\n }\n\n const rootNode = await this.taskRegistry.createTaskNode({\n threadId: input.threadId,\n parentNodeId: null,\n kind: \"goal\",\n status: \"planned\",\n title: input.title,\n instructions: input.originalRequest,\n acceptanceCriteria: thread.acceptanceCriteria,\n priority: 100,\n depth: 0,\n sequence: 0,\n createdFrom: \"planner\",\n metadata: {\n threadKind: thread.kind,\n source: \"swarm-planner\",\n },\n });\n\n if (thread.acceptanceCriteria.length > 0) {\n await this.taskRegistry.createTaskVerifierJob({\n threadId: input.threadId,\n nodeId: rootNode.id,\n status: \"pending\",\n verifierType: \"acceptance_criteria\",\n title: `Verify acceptance criteria for ${input.title}`,\n instructions: thread.acceptanceCriteria.join(\"\\n\"),\n config: {\n acceptanceCriteria: thread.acceptanceCriteria,\n },\n metadata: {\n source: \"thread-acceptance\",\n },\n });\n }\n\n if (input.sharedContext?.trim()) {\n await this.taskRegistry.appendTaskMailboxMessage({\n threadId: input.threadId,\n nodeId: rootNode.id,\n sender: \"planner\",\n recipient: \"all-workers\",\n subject: \"shared-context\",\n body: input.sharedContext.trim(),\n deliveryState: \"delivered\",\n deliveredAt: new Date().toISOString(),\n metadata: {\n source: \"swarm-planner\",\n },\n });\n }\n\n const workerNodes: TaskNodeRecord[] = [];\n for (const [index, subtask] of input.subtasks.entries()) {\n const node = await this.taskRegistry.createTaskNode({\n threadId: input.threadId,\n parentNodeId: rootNode.id,\n kind: \"execution\",\n status: \"ready\",\n title: subtask.label,\n instructions: subtask.originalTask,\n requiredCapabilities: [subtask.agentType],\n repo: subtask.repo,\n priority: 10,\n depth: 1,\n sequence: index + 1,\n createdFrom: \"planner\",\n metadata: {\n agentType: subtask.agentType,\n source: \"swarm-planner\",\n },\n });\n await this.taskRegistry.createTaskDependency({\n threadId: input.threadId,\n fromNodeId: node.id,\n toNodeId: rootNode.id,\n dependencyKind: \"parent_child\",\n requiredStatus: \"completed\",\n metadata: {\n source: \"swarm-planner\",\n },\n });\n if (input.sharedContext?.trim()) {\n await this.taskRegistry.appendTaskMailboxMessage({\n threadId: input.threadId,\n nodeId: node.id,\n sender: \"planner\",\n recipient: subtask.label,\n subject: \"task-brief\",\n body: input.sharedContext.trim(),\n deliveryState: \"delivered\",\n deliveredAt: new Date().toISOString(),\n metadata: {\n task: subtask.originalTask,\n agentType: subtask.agentType,\n },\n });\n }\n workerNodes.push(node);\n }\n\n await this.taskRegistry.updateThread(input.threadId, {\n currentPlan: {\n ...thread.currentPlan,\n rootTaskNodeId: rootNode.id,\n taskNodeIds: workerNodes.map((node) => node.id),\n taskNodeCount: workerNodes.length + 1,\n },\n });\n\n return { rootNode, workerNodes };\n }\n\n async listTaskThreads(options?: {\n includeArchived?: boolean;\n status?: TaskThreadStatus;\n statuses?: TaskThreadStatus[];\n kind?: import(\"./task-registry.js\").TaskThreadKind;\n roomId?: string;\n worldId?: string;\n ownerUserId?: string;\n scenarioId?: string;\n batchId?: string;\n createdAfter?: string;\n createdBefore?: string;\n updatedAfter?: string;\n updatedBefore?: string;\n latestActivityAfter?: number;\n latestActivityBefore?: number;\n hasActiveSession?: boolean;\n search?: string;\n limit?: number;\n }): Promise<TaskThreadSummary[]> {\n return this.taskRegistry.listThreads(options);\n }\n\n async getTaskThread(threadId: string): Promise<TaskThreadDetail | null> {\n return this.taskRegistry.getThread(threadId);\n }\n\n async archiveTaskThread(threadId: string): Promise<void> {\n await this.taskRegistry.archiveThread(threadId);\n }\n\n async reopenTaskThread(threadId: string): Promise<void> {\n await this.taskRegistry.reopenThread(threadId);\n }\n\n async countTaskThreads(options?: {\n includeArchived?: boolean;\n status?: TaskThreadStatus;\n statuses?: TaskThreadStatus[];\n kind?: import(\"./task-registry.js\").TaskThreadKind;\n roomId?: string;\n worldId?: string;\n ownerUserId?: string;\n scenarioId?: string;\n batchId?: string;\n createdAfter?: string;\n createdBefore?: string;\n updatedAfter?: string;\n updatedBefore?: string;\n latestActivityAfter?: number;\n latestActivityBefore?: number;\n hasActiveSession?: boolean;\n search?: string;\n }): Promise<number> {\n return this.taskRegistry.countThreads(options);\n }\n\n private getLiveTaskContextsForThread(threadId: string): TaskContext[] {\n return Array.from(this.tasks.values())\n .filter((task) => task.threadId === threadId)\n .sort((left, right) => right.lastActivityAt - left.lastActivityAt);\n }\n\n private async stopLiveThreadSessions(\n threadId: string,\n force: boolean,\n ): Promise<string[]> {\n if (!this.ptyService) {\n return [];\n }\n\n const sessionIds = this.getLiveTaskContextsForThread(threadId)\n .filter(\n (task) =>\n task.status === \"active\" ||\n task.status === \"blocked\" ||\n task.status === \"tool_running\",\n )\n .map((task) => task.sessionId);\n for (const sessionId of sessionIds) {\n const taskCtx = this.tasks.get(sessionId);\n if (taskCtx) {\n taskCtx.status = \"stopped\";\n taskCtx.stoppedAt = Date.now();\n await this.syncTaskContext(taskCtx);\n }\n try {\n await this.ptyService.stopSession(sessionId, force);\n } catch (error) {\n this.log(\n `Failed to stop session ${sessionId} for thread ${threadId}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return sessionIds;\n }\n\n private clipText(value: string, limit: number): string {\n if (value.length <= limit) return value;\n return `${value.slice(0, limit)}…`;\n }\n\n private formatResumePrompt(\n thread: TaskThreadDetail,\n instruction?: string,\n ): string {\n const acceptanceCriteria = (thread.acceptanceCriteria ?? [])\n .map((item) => `- ${item}`)\n .join(\"\\n\");\n const recentDecisions = (thread.decisions ?? [])\n .slice(-6)\n .map(\n (decision, index) =>\n `${index + 1}. ${decision.event}: ${decision.reasoning}${decision.response ? ` (response: ${decision.response})` : \"\"}`,\n )\n .join(\"\\n\");\n const recentEvents = (thread.events ?? [])\n .slice(-8)\n .map(\n (event, index) =>\n `${index + 1}. ${event.eventType}: ${this.clipText(event.summary, 180)}`,\n )\n .join(\"\\n\");\n const transcriptExcerpt = (thread.transcripts ?? [])\n .slice(-20)\n .map(\n (entry) =>\n `${entry.direction.toUpperCase()}: ${this.clipText(entry.content.trim(), 220)}`,\n )\n .filter((line) => line.length > 0)\n .join(\"\\n\");\n const latestSession = (thread.sessions ?? [])\n .slice()\n .sort((left, right) => right.lastActivityAt - left.lastActivityAt)[0];\n\n return [\n \"Resume an existing Milady coordinator task thread.\",\n \"\",\n `Thread: ${thread.title}`,\n `Original request: ${thread.originalRequest}`,\n latestSession?.workdir ? `Workspace: ${latestSession.workdir}` : \"\",\n latestSession?.repo ? `Repository: ${latestSession.repo}` : \"\",\n thread.summary ? `Current summary: ${thread.summary}` : \"\",\n acceptanceCriteria ? `Acceptance criteria:\\n${acceptanceCriteria}` : \"\",\n instruction?.trim()\n ? `Latest user instruction:\\n${instruction.trim()}`\n : \"Continue from the current workspace state without starting over.\",\n recentDecisions\n ? `Recent coordinator decisions:\\n${recentDecisions}`\n : \"\",\n recentEvents ? `Recent task events:\\n${recentEvents}` : \"\",\n transcriptExcerpt\n ? `Recent transcript excerpt:\\n${transcriptExcerpt}`\n : \"\",\n \"Inspect the current workspace, continue the task, run the relevant verification, and summarize what changed.\",\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n }\n\n async pauseTaskThread(\n threadId: string,\n note?: string,\n ): Promise<{ threadId: string; stoppedSessionIds: string[] }> {\n const thread = await this.getTaskThread(threadId);\n if (!thread) {\n throw new Error(`Task thread ${threadId} not found`);\n }\n\n const stoppedSessionIds = await this.stopLiveThreadSessions(threadId, true);\n const nowIso = new Date().toISOString();\n await this.taskRegistry.updateThread(threadId, {\n status: \"waiting_on_user\",\n closedAt: null,\n lastCoordinatorTurnAt: nowIso,\n metadata: {\n controlState: \"paused\",\n pauseNote: note ?? null,\n pauseRequestedAt: nowIso,\n },\n });\n await this.taskRegistry.appendEvent({\n threadId,\n eventType: \"task_paused\",\n summary: note?.trim()\n ? `Paused task thread: ${note.trim()}`\n : \"Paused task thread for user review\",\n data: {\n note: note ?? null,\n stoppedSessionIds,\n },\n });\n return { threadId, stoppedSessionIds };\n }\n\n async stopTaskThread(\n threadId: string,\n note?: string,\n ): Promise<{ threadId: string; stoppedSessionIds: string[] }> {\n const thread = await this.getTaskThread(threadId);\n if (!thread) {\n throw new Error(`Task thread ${threadId} not found`);\n }\n\n const stoppedSessionIds = await this.stopLiveThreadSessions(threadId, true);\n const nowIso = new Date().toISOString();\n await this.taskRegistry.updateThread(threadId, {\n status: \"interrupted\",\n closedAt: nowIso,\n lastCoordinatorTurnAt: nowIso,\n metadata: {\n controlState: \"stopped\",\n stopNote: note ?? null,\n stoppedByUserAt: nowIso,\n },\n });\n await this.taskRegistry.appendEvent({\n threadId,\n eventType: \"task_stopped\",\n summary: note?.trim()\n ? `Stopped task thread: ${note.trim()}`\n : \"Stopped task thread at user request\",\n data: {\n note: note ?? null,\n stoppedSessionIds,\n },\n });\n return { threadId, stoppedSessionIds };\n }\n\n async resumeTaskThread(\n threadId: string,\n instruction?: string,\n agentType?: string,\n ): Promise<{\n threadId: string;\n sessionId: string;\n reusedSession: boolean;\n framework: CodingAgentType;\n }> {\n const thread = await this.getTaskThread(threadId);\n if (!thread) {\n throw new Error(`Task thread ${threadId} not found`);\n }\n if (!this.ptyService) {\n throw new Error(\"PTY Service is not available\");\n }\n\n const activeTask = this.getLiveTaskContextsForThread(threadId).find(\n (task) =>\n task.status !== \"stopped\" &&\n task.status !== \"completed\" &&\n task.status !== \"error\",\n );\n if (activeTask) {\n if (instruction?.trim()) {\n await this.ptyService.sendToSession(\n activeTask.sessionId,\n instruction.trim(),\n );\n activeTask.lastInputSentAt = Date.now();\n activeTask.status = \"active\";\n await this.syncTaskContext(activeTask);\n }\n const nowIso = new Date().toISOString();\n await this.taskRegistry.updateThread(threadId, {\n status: \"active\",\n closedAt: null,\n lastCoordinatorTurnAt: nowIso,\n metadata: {\n controlState: null,\n resumedAt: nowIso,\n },\n });\n await this.taskRegistry.appendEvent({\n threadId,\n sessionId: activeTask.sessionId,\n eventType: \"task_resumed\",\n summary: \"Continued the active task thread\",\n data: {\n reusedSession: true,\n instruction: instruction ?? null,\n },\n });\n return {\n threadId,\n sessionId: activeTask.sessionId,\n reusedSession: true,\n framework: activeTask.agentType,\n };\n }\n\n const latestSession = (thread.sessions ?? [])\n .slice()\n .sort((left, right) => right.lastActivityAt - left.lastActivityAt)[0];\n const workdir = latestSession?.workdir ?? thread.latestWorkdir;\n if (!workdir) {\n throw new Error(`Task thread ${threadId} has no resumable workspace`);\n }\n\n const requestedFramework = agentType\n ? normalizeAgentType(agentType)\n : latestSession?.framework\n ? normalizeAgentType(latestSession.framework)\n : normalizeAgentType(await this.ptyService.resolveAgentType());\n const frameworkState = await this.ptyService.getFrameworkState();\n const framework = frameworkState.frameworks.find(\n (entry) => entry.id === requestedFramework,\n );\n const resolvedFramework =\n framework?.installed &&\n framework.authReady &&\n !framework.temporarilyDisabled\n ? requestedFramework\n : normalizeAgentType(await this.ptyService.resolveAgentType());\n const resolvedAvailability = frameworkState.frameworks.find(\n (entry) => entry.id === resolvedFramework,\n );\n\n const session = await this.ptyService.spawnSession({\n name: `task-resume-${thread.id.slice(-8)}`,\n agentType: resolvedFramework,\n workdir,\n initialTask: this.formatResumePrompt(thread, instruction),\n credentials: buildAgentCredentials(this.runtime),\n approvalPreset: this.ptyService.defaultApprovalPreset,\n skipAdapterAutoResponse: true,\n metadata: {\n threadId,\n label: thread.title,\n requestedType: resolvedFramework,\n resumedFromThreadId: threadId,\n resumedFromSessionId: latestSession?.sessionId ?? null,\n resumeInstruction: instruction ?? null,\n resumedAt: Date.now(),\n },\n });\n\n await this.registerTask(session.id, {\n threadId,\n taskNodeId:\n typeof latestSession?.metadata.taskNodeId === \"string\"\n ? latestSession.metadata.taskNodeId\n : undefined,\n agentType: resolvedFramework,\n label: latestSession?.label ?? thread.title,\n originalTask: instruction?.trim() || thread.originalRequest,\n workdir,\n repo: latestSession?.repo ?? thread.latestRepo ?? undefined,\n providerSource: resolvedAvailability\n ? inferProviderSource(resolvedAvailability)\n : null,\n metadata:\n session.metadata &&\n typeof session.metadata === \"object\" &&\n !Array.isArray(session.metadata)\n ? (session.metadata as Record<string, unknown>)\n : undefined,\n });\n\n const nowIso = new Date().toISOString();\n await this.taskRegistry.updateThread(threadId, {\n status: \"active\",\n closedAt: null,\n lastCoordinatorTurnAt: nowIso,\n metadata: {\n controlState: null,\n resumedAt: nowIso,\n lastResumedSessionId: session.id,\n },\n });\n await this.taskRegistry.appendEvent({\n threadId,\n sessionId: session.id,\n eventType: \"task_resumed\",\n summary: \"Resumed the task thread on a new session\",\n data: {\n reusedSession: false,\n fromSessionId: latestSession?.sessionId ?? null,\n toSessionId: session.id,\n instruction: instruction ?? null,\n framework: resolvedFramework,\n },\n });\n\n return {\n threadId,\n sessionId: session.id,\n reusedSession: false,\n framework: resolvedFramework,\n };\n }\n\n async continueTaskThread(\n threadId: string,\n instruction: string,\n agentType?: string,\n ): Promise<{\n threadId: string;\n sessionId: string;\n reusedSession: boolean;\n framework: CodingAgentType;\n }> {\n const latestLiveTask = this.getLiveTaskContextsForThread(threadId).find(\n (task) =>\n task.status === \"active\" ||\n task.status === \"blocked\" ||\n task.status === \"tool_running\",\n );\n if (latestLiveTask && this.ptyService) {\n await this.ptyService.sendToSession(\n latestLiveTask.sessionId,\n instruction,\n );\n latestLiveTask.lastInputSentAt = Date.now();\n latestLiveTask.status = \"active\";\n await this.syncTaskContext(latestLiveTask);\n const nowIso = new Date().toISOString();\n await this.taskRegistry.updateThread(threadId, {\n status: \"active\",\n closedAt: null,\n lastCoordinatorTurnAt: nowIso,\n metadata: {\n controlState: null,\n continuedAt: nowIso,\n },\n });\n await this.taskRegistry.appendEvent({\n threadId,\n sessionId: latestLiveTask.sessionId,\n eventType: \"task_resumed\",\n summary: \"Sent follow-up instructions to the active task thread\",\n data: {\n reusedSession: true,\n instruction,\n },\n });\n return {\n threadId,\n sessionId: latestLiveTask.sessionId,\n reusedSession: true,\n framework: latestLiveTask.agentType,\n };\n }\n return this.resumeTaskThread(threadId, instruction, agentType);\n }\n\n async syncTaskContext(taskCtx: TaskContext): Promise<void> {\n await this.taskRegistry.updateSession(taskCtx.sessionId, {\n status:\n taskCtx.status === \"completed\"\n ? \"completed\"\n : taskCtx.status === \"error\"\n ? \"error\"\n : taskCtx.status === \"stopped\"\n ? \"stopped\"\n : taskCtx.status === \"blocked\"\n ? \"blocked\"\n : taskCtx.status === \"tool_running\"\n ? \"tool_running\"\n : \"active\",\n decisionCount: taskCtx.decisions.length,\n autoResolvedCount: taskCtx.autoResolvedCount,\n lastActivityAt: taskCtx.lastActivityAt,\n idleCheckCount: taskCtx.idleCheckCount,\n taskDelivered: taskCtx.taskDelivered,\n completionSummary: taskCtx.completionSummary ?? null,\n lastSeenDecisionIndex: taskCtx.lastSeenDecisionIndex,\n lastInputSentAt: taskCtx.lastInputSentAt,\n stoppedAt: taskCtx.stoppedAt,\n });\n if (!taskCtx.taskNodeId) {\n return;\n }\n\n const nodeStatus = this.mapTaskContextStatusToNodeStatus(taskCtx.status);\n await this.taskRegistry.updateTaskNode(taskCtx.taskNodeId, {\n status: nodeStatus,\n title: taskCtx.label,\n instructions: taskCtx.originalTask,\n assignedSessionId: taskCtx.sessionId,\n assignedLabel: taskCtx.label,\n agentType: taskCtx.agentType,\n workdir: taskCtx.workdir,\n repo: taskCtx.repo ?? null,\n metadata: {\n completionSummary: taskCtx.completionSummary ?? null,\n },\n });\n\n const activeClaim = await this.taskRegistry.findActiveTaskClaim(\n taskCtx.taskNodeId,\n taskCtx.sessionId,\n );\n if (\n taskCtx.status === \"completed\" ||\n taskCtx.status === \"error\" ||\n taskCtx.status === \"stopped\"\n ) {\n if (activeClaim) {\n await this.taskRegistry.updateTaskClaim(activeClaim.id, {\n status:\n taskCtx.status === \"completed\"\n ? \"completed\"\n : taskCtx.status === \"error\"\n ? \"failed\"\n : \"interrupted\",\n releasedAt: new Date().toISOString(),\n metadata: {\n completionSummary: taskCtx.completionSummary ?? null,\n },\n });\n }\n return;\n }\n\n if (!activeClaim) {\n await this.taskRegistry.createTaskClaim({\n threadId: taskCtx.threadId,\n nodeId: taskCtx.taskNodeId,\n sessionId: taskCtx.sessionId,\n claimType: \"execution\",\n status: \"active\",\n metadata: {\n label: taskCtx.label,\n },\n });\n }\n }\n\n private isAutomaticFailoverFramework(\n agentType: CodingAgentType,\n ): agentType is SupportedTaskAgentAdapter {\n return (\n agentType === \"claude\" ||\n agentType === \"codex\" ||\n agentType === \"gemini\" ||\n agentType === \"aider\"\n );\n }\n\n private getFailoverCandidates(\n frameworks: TaskAgentFrameworkAvailability[],\n failedFramework: SupportedTaskAgentAdapter,\n preferredFrameworkId: TaskAgentFrameworkId,\n ): TaskAgentFrameworkAvailability[] {\n const preferred = frameworks.find(\n (framework) => framework.id === preferredFrameworkId,\n );\n const remainder = frameworks.filter(\n (framework) => framework.id !== preferredFrameworkId,\n );\n return [preferred, ...remainder].filter(\n (framework): framework is TaskAgentFrameworkAvailability =>\n Boolean(\n framework &&\n framework.id !== failedFramework &&\n framework.installed &&\n framework.authReady &&\n !framework.temporarilyDisabled,\n ),\n );\n }\n\n private formatFailoverPrompt(\n taskCtx: TaskContext,\n failedFramework: SupportedTaskAgentAdapter,\n reason: string,\n recentOutput: string,\n ): string {\n const trimmedOutput = recentOutput.trim();\n const clippedOutput =\n trimmedOutput.length > FAILOVER_OUTPUT_MAX_CHARS\n ? trimmedOutput.slice(-FAILOVER_OUTPUT_MAX_CHARS)\n : trimmedOutput;\n const recentDecisions = taskCtx.decisions\n .slice(-5)\n .map(\n (decision, index) =>\n `${index + 1}. ${decision.event}: ${decision.reasoning}${decision.response ? ` (response: ${decision.response})` : \"\"}`,\n )\n .join(\"\\n\");\n return [\n `Continue an in-progress task after the previous ${failedFramework} session became unavailable because of a quota or credit failure.`,\n \"\",\n \"Original task:\",\n taskCtx.originalTask,\n \"\",\n `Failure reason: ${reason}`,\n `Workspace: ${taskCtx.workdir}`,\n \"\",\n recentDecisions\n ? `Recent coordinator decisions:\\n${recentDecisions}\\n`\n : \"\",\n clippedOutput\n ? `Recent terminal output from the failed session:\\n${clippedOutput}\\n`\n : \"\",\n \"Use the existing workspace state instead of starting from scratch. Inspect the files, continue the task, run the needed validation, and then report what changed and how you verified it.\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n }\n\n private async handleFrameworkDepletion(\n taskCtx: TaskContext,\n sessionId: string,\n reason: string,\n ): Promise<{\n replacementSessionId: string;\n replacementFramework: TaskAgentFrameworkId;\n replacementLabel: string;\n } | null> {\n if (\n !this.isAutomaticFailoverFramework(taskCtx.agentType) ||\n !isUsageExhaustedTaskAgentError(reason)\n ) {\n return null;\n }\n\n markTaskAgentFrameworkUnavailable(taskCtx.agentType, reason);\n await this.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"framework_unavailable\",\n summary: `${taskCtx.agentType} temporarily disabled after provider depletion`,\n data: {\n framework: taskCtx.agentType,\n reason,\n },\n });\n\n let failoverResult: {\n replacementSessionId: string;\n replacementFramework: TaskAgentFrameworkId;\n replacementLabel: string;\n } | null = null;\n try {\n failoverResult = await this.attemptTaskFailover(taskCtx, reason);\n } catch (failoverError) {\n this.log(\n `Automatic failover failed for \"${taskCtx.label}\": ${failoverError instanceof Error ? failoverError.message : String(failoverError)}`,\n );\n }\n\n if (failoverResult) {\n this.sendChatMessage(\n `\"${taskCtx.label}\" ran into a ${taskCtx.agentType} quota/credit failure. Milady is continuing the same task on ${failoverResult.replacementFramework}.`,\n \"coding-agent\",\n );\n } else {\n this.sendChatMessage(\n `\"${taskCtx.label}\" ran into a ${taskCtx.agentType} quota/credit failure. Milady will prefer another task-agent framework until ${taskCtx.agentType} is healthy again.`,\n \"coding-agent\",\n );\n }\n\n return failoverResult;\n }\n\n private async attemptTaskFailover(\n taskCtx: TaskContext,\n errorMsg: string,\n ): Promise<{\n replacementSessionId: string;\n replacementFramework: TaskAgentFrameworkId;\n replacementLabel: string;\n } | null> {\n if (\n !this.ptyService ||\n !this.isAutomaticFailoverFramework(taskCtx.agentType)\n ) {\n return null;\n }\n\n const frameworkState = await this.ptyService.getFrameworkState();\n const candidates = this.getFailoverCandidates(\n frameworkState.frameworks,\n taskCtx.agentType,\n frameworkState.preferred.id,\n );\n const nextFramework = candidates[0];\n if (!nextFramework) {\n return null;\n }\n\n const failedSession = this.ptyService.getSession(taskCtx.sessionId);\n const priorMetadata =\n failedSession?.metadata &&\n typeof failedSession.metadata === \"object\" &&\n !Array.isArray(failedSession.metadata)\n ? (failedSession.metadata as Record<string, unknown>)\n : {};\n const failoverOrdinal =\n typeof priorMetadata.failoverOrdinal === \"number\"\n ? priorMetadata.failoverOrdinal + 1\n : 1;\n const priorOutput = await Promise.race([\n this.ptyService.getSessionOutput(taskCtx.sessionId, 200),\n new Promise<string>((resolve) => setTimeout(() => resolve(\"\"), 5_000)),\n ]);\n const replacementLabel = `${taskCtx.label} (${nextFramework.id} failover ${failoverOrdinal})`;\n const replacementSession = await this.ptyService.spawnSession({\n name:\n failedSession?.name ??\n `task-failover-${Date.now()}-${nextFramework.id}`,\n agentType: nextFramework.id as CodingAgentType,\n workdir: taskCtx.workdir,\n initialTask: this.formatFailoverPrompt(\n taskCtx,\n taskCtx.agentType,\n errorMsg,\n priorOutput,\n ),\n approvalPreset: this.ptyService.defaultApprovalPreset,\n skipAdapterAutoResponse: true,\n metadata: {\n ...priorMetadata,\n threadId: taskCtx.threadId,\n requestedType: nextFramework.id,\n label: replacementLabel,\n failoverOrdinal,\n failoverFromFramework: taskCtx.agentType,\n failoverFromSessionId: taskCtx.sessionId,\n failoverReason: errorMsg,\n failoverAt: Date.now(),\n },\n });\n\n await this.registerTask(replacementSession.id, {\n threadId: taskCtx.threadId,\n taskNodeId: taskCtx.taskNodeId,\n agentType: nextFramework.id as CodingAgentType,\n label: replacementLabel,\n originalTask: taskCtx.originalTask,\n workdir: taskCtx.workdir,\n repo: taskCtx.repo,\n providerSource: inferProviderSource(nextFramework),\n metadata:\n replacementSession.metadata &&\n typeof replacementSession.metadata === \"object\" &&\n !Array.isArray(replacementSession.metadata)\n ? (replacementSession.metadata as Record<string, unknown>)\n : undefined,\n });\n\n await this.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId: replacementSession.id,\n eventType: \"framework_failover_started\",\n summary: `Continuing \"${taskCtx.label}\" on ${nextFramework.label}`,\n data: {\n fromFramework: taskCtx.agentType,\n fromSessionId: taskCtx.sessionId,\n toFramework: nextFramework.id,\n toSessionId: replacementSession.id,\n reason: errorMsg,\n },\n });\n\n return {\n replacementSessionId: replacementSession.id,\n replacementFramework: nextFramework.id,\n replacementLabel,\n };\n }\n\n async recordDecision(\n taskCtx: TaskContext,\n decision: CoordinationDecision,\n ): Promise<void> {\n taskCtx.decisions.push(decision);\n await this.taskRegistry.recordDecision({\n threadId: taskCtx.threadId,\n sessionId: taskCtx.sessionId,\n timestamp: decision.timestamp,\n event: decision.event,\n promptText: decision.promptText,\n decision: decision.decision,\n response: decision.response,\n reasoning: decision.reasoning,\n });\n await this.syncTaskContext(taskCtx);\n }\n\n async setTaskDelivered(sessionId: string): Promise<void> {\n const taskCtx = this.tasks.get(sessionId);\n if (!taskCtx) return;\n taskCtx.taskDelivered = true;\n await this.syncTaskContext(taskCtx);\n }\n\n // ─── Unregistered Buffer Retry ───\n\n /**\n * Schedule a retry check for buffered events from an unregistered session.\n * Uses exponential backoff: 2s → 4s → 8s → 16s, max 30s total.\n */\n private scheduleUnregisteredRetry(sessionId: string, attempt: number): void {\n const delay =\n UNREGISTERED_RETRY_DELAYS[\n Math.min(attempt, UNREGISTERED_RETRY_DELAYS.length - 1)\n ];\n\n const timer = setTimeout(() => {\n this.unregisteredRetryTimers.delete(sessionId);\n const stillBuffered = this.unregisteredBuffer.get(sessionId);\n if (!stillBuffered || stillBuffered.length === 0) return;\n\n const ctx = this.tasks.get(sessionId);\n if (ctx) {\n // Task was registered — flush\n this.unregisteredBuffer.delete(sessionId);\n for (const entry of stillBuffered) {\n this.handleSessionEvent(sessionId, entry.event, entry.data).catch(\n () => {},\n );\n }\n return;\n }\n\n // Check if we've exceeded the absolute max wait\n const oldest = stillBuffered[0].receivedAt;\n const totalElapsed = Date.now() - oldest;\n if (totalElapsed >= UNREGISTERED_MAX_TOTAL_MS) {\n this.unregisteredBuffer.delete(sessionId);\n this.log(\n `Discarding ${stillBuffered.length} buffered events for unregistered session ${sessionId} after ${Math.round(totalElapsed / 1000)}s`,\n );\n return;\n }\n\n // Schedule next retry\n this.log(\n `Retry ${attempt + 1} for unregistered session ${sessionId} (next in ${delay}ms)`,\n );\n this.scheduleUnregisteredRetry(sessionId, attempt + 1);\n }, delay);\n\n this.unregisteredRetryTimers.set(sessionId, timer);\n }\n\n // ─── SSE Client Management ───\n\n /**\n * Register an SSE client. Returns an unsubscribe function.\n * Sends a snapshot of current state on connect.\n */\n addSseClient(res: ServerResponse): () => void {\n this.sseClients.add(res);\n\n // Send snapshot on connect\n const snapshot: SwarmEvent = {\n type: \"snapshot\",\n sessionId: \"*\",\n timestamp: Date.now(),\n data: {\n tasks: this.getAllTaskContexts(),\n supervisionLevel: this.supervisionLevel,\n pendingCount: this.pendingDecisions.size,\n },\n };\n this.writeSseEvent(res, snapshot);\n\n // Remove on close\n const cleanup = () => {\n this.sseClients.delete(res);\n };\n res.on(\"close\", cleanup);\n\n return cleanup;\n }\n\n broadcast(event: SwarmEvent): void {\n const dead: ServerResponse[] = [];\n for (const client of this.sseClients) {\n if (client.writableEnded) {\n dead.push(client);\n continue;\n }\n this.writeSseEvent(client, event);\n }\n // Cleanup dead connections\n for (const d of dead) {\n this.sseClients.delete(d);\n }\n // Relay to WebSocket clients — buffer if bridge isn't wired yet\n if (this.wsBroadcast) {\n this.wsBroadcast(event);\n } else if (this.preBridgeBroadcastBuffer.length < MAX_PRE_BRIDGE_BUFFER) {\n this.preBridgeBroadcastBuffer.push(event);\n }\n }\n\n private writeSseEvent(res: ServerResponse, event: SwarmEvent): void {\n try {\n res.write(`data: ${JSON.stringify(event)}\\n\\n`);\n } catch {\n // Connection may have closed\n }\n }\n\n // ─── Event Handling ───\n\n async handleSessionEvent(\n sessionId: string,\n event: string,\n data: unknown,\n ): Promise<void> {\n // Lazy-wire scratch decision callback if not yet connected\n if (!this.scratchDecisionWired) {\n this.wireScratchDecisionCallback();\n }\n\n // Ignore events from sessions created before this coordinator started.\n // Session IDs are formatted as \"pty-{timestamp}-{hex}\" — extract the timestamp.\n const tsMatch = sessionId.match(/^pty-(\\d+)-/);\n if (tsMatch) {\n const sessionCreatedAt = Number(tsMatch[1]);\n if (sessionCreatedAt < this.startedAt - 60_000) {\n // Session is from before this coordinator's lifetime (with 1min grace)\n return;\n }\n }\n\n const taskCtx = this.tasks.get(sessionId);\n\n // Buffer events for unregistered sessions with exponential backoff retry.\n // Events arriving before registerTask() are buffered and retried at\n // 2s → 4s → 8s → 16s intervals (max 30s total) before being discarded.\n if (!taskCtx) {\n if (\n event === \"blocked\" ||\n event === \"task_complete\" ||\n event === \"error\"\n ) {\n let buffer = this.unregisteredBuffer.get(sessionId);\n if (!buffer) {\n buffer = [];\n this.unregisteredBuffer.set(sessionId, buffer);\n }\n buffer.push({ event, data, receivedAt: Date.now() });\n\n // Only schedule retry if not already retrying for this session\n if (!this.unregisteredRetryTimers.has(sessionId)) {\n this.scheduleUnregisteredRetry(sessionId, 0);\n }\n }\n return;\n }\n\n // Skip decision-making events for terminal states, but always allow\n // \"stopped\" and \"error\" through — they're definitive lifecycle signals\n // that the frontend needs to close consoles and clean up.\n // Exception: allow a late \"task_complete\" to recover a recently-stopped task.\n let recoveredFromStopped = false;\n if (\n taskCtx.status === \"stopped\" ||\n taskCtx.status === \"error\" ||\n taskCtx.status === \"completed\"\n ) {\n if (taskCtx.status === \"stopped\" && event === \"task_complete\") {\n const stoppedAt = taskCtx.stoppedAt ?? 0;\n const ageMs = Date.now() - stoppedAt;\n if (stoppedAt > 0 && ageMs <= STOPPED_RECOVERY_WINDOW_MS) {\n this.log(\n `Recovering \"${taskCtx.label}\" from stopped on late task_complete (${Math.round(ageMs / 1000)}s old)`,\n );\n taskCtx.status = \"active\";\n taskCtx.stoppedAt = undefined;\n recoveredFromStopped = true;\n } else {\n this.log(\n `Ignoring \"${event}\" for ${taskCtx.label} (status: stopped, age=${Math.round(ageMs / 1000)}s)`,\n );\n return;\n }\n }\n if (!recoveredFromStopped && event !== \"stopped\" && event !== \"error\") {\n this.log(\n `Ignoring \"${event}\" for ${taskCtx.label} (status: ${taskCtx.status})`,\n );\n return;\n }\n }\n\n // Update activity timestamp — resets idle watchdog for this session.\n // This runs before buffering so buffered events still reset the idle timer.\n taskCtx.lastActivityAt = Date.now();\n taskCtx.idleCheckCount = 0;\n\n // Buffer decision-making events when paused (user sent a chat message).\n // Auto-responses still flow through handleBlocked — only LLM decisions are deferred.\n if (this._paused && (event === \"blocked\" || event === \"task_complete\")) {\n // Auto-responded blocked events don't need LLM — let them through\n const eventData = data as { autoResponded?: boolean };\n if (!(event === \"blocked\" && eventData.autoResponded)) {\n // Broadcast buffered state for dashboard visibility\n this.broadcast({\n type:\n event === \"blocked\" ? \"blocked_buffered\" : \"turn_complete_buffered\",\n sessionId,\n timestamp: Date.now(),\n data,\n });\n this.pauseBuffer.push({ sessionId, event, data });\n this.log(\n `Buffered \"${event}\" for ${taskCtx.label} (coordinator paused)`,\n );\n return;\n }\n // Auto-responded: fall through to normal handling below\n }\n\n // Route by event type\n switch (event) {\n case \"blocked\": {\n const blockedPrompt =\n (\n data as {\n promptInfo?: {\n prompt?: string;\n instructions?: string;\n };\n }\n ).promptInfo?.prompt ??\n (\n data as {\n promptInfo?: {\n prompt?: string;\n instructions?: string;\n };\n }\n ).promptInfo?.instructions ??\n \"\";\n if (\n this.isAutomaticFailoverFramework(taskCtx.agentType) &&\n isUsageExhaustedTaskAgentError(blockedPrompt)\n ) {\n const failoverResult = await this.handleFrameworkDepletion(\n taskCtx,\n sessionId,\n blockedPrompt,\n );\n taskCtx.status = \"error\";\n taskCtx.stoppedAt = Date.now();\n this.broadcast({\n type: \"error\",\n sessionId,\n timestamp: Date.now(),\n data: {\n message: blockedPrompt,\n source: \"blocked_prompt\",\n },\n });\n await this.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"task_status_changed\",\n summary: `Task \"${taskCtx.label}\" errored`,\n data: {\n status: \"error\",\n message: blockedPrompt,\n source: \"blocked_prompt\",\n },\n });\n this.ptyService?.stopSession(sessionId, true).catch((err) => {\n this.log(\n `Failed to stop exhausted session \"${taskCtx.label}\": ${err}`,\n );\n });\n if (!failoverResult) {\n checkAllTasksComplete(this);\n }\n break;\n }\n await handleBlocked(this, sessionId, taskCtx, data);\n break;\n }\n\n case \"task_complete\": {\n // Broadcast immediately for UI visibility, but coalesce the\n // expensive LLM assessment — rapid turn-complete events within\n // 500ms are debounced so only the last one triggers an LLM call.\n this.broadcast({\n type: \"turn_complete\",\n sessionId,\n timestamp: Date.now(),\n data,\n });\n\n const existingCoalesce = this.turnCompleteCoalesceTimers.get(sessionId);\n if (existingCoalesce) clearTimeout(existingCoalesce);\n\n const coalescedData = data;\n const coalesceTimer = setTimeout(() => {\n this.turnCompleteCoalesceTimers.delete(sessionId);\n const currentTask = this.tasks.get(sessionId);\n if (currentTask && currentTask.status === \"active\") {\n handleTurnComplete(\n this,\n sessionId,\n currentTask,\n coalescedData,\n ).catch((err) => {\n this.log(`Coalesced turn-complete failed: ${err}`);\n });\n }\n }, TURN_COMPLETE_COALESCE_MS);\n this.turnCompleteCoalesceTimers.set(sessionId, coalesceTimer);\n break;\n }\n\n case \"error\": {\n this.broadcast({\n type: \"error\",\n sessionId,\n timestamp: Date.now(),\n data,\n });\n\n // Send error message to chat UI\n const errorMsg =\n (data as { message?: string }).message ?? \"unknown error\";\n const failoverResult = await this.handleFrameworkDepletion(\n taskCtx,\n sessionId,\n errorMsg,\n );\n if (!failoverResult) {\n this.sendChatMessage(\n `\"${taskCtx.label}\" hit an error: ${errorMsg}`,\n \"coding-agent\",\n );\n }\n taskCtx.status = \"error\";\n await this.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"task_status_changed\",\n summary: `Task \"${taskCtx.label}\" errored`,\n data: { status: \"error\", message: errorMsg },\n });\n checkAllTasksComplete(this);\n break;\n }\n\n case \"stopped\":\n // Don't downgrade \"completed\" or \"error\" to \"stopped\" — the async\n // stopSession fires after executeDecision already marked the task.\n if (taskCtx.status !== \"completed\" && taskCtx.status !== \"error\") {\n taskCtx.status = \"stopped\";\n taskCtx.stoppedAt = Date.now();\n }\n this.inFlightDecisions.delete(sessionId);\n this.broadcast({\n type: \"stopped\",\n sessionId,\n timestamp: Date.now(),\n data,\n });\n await this.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"task_status_changed\",\n summary: `Task \"${taskCtx.label}\" stopped`,\n data: { status: taskCtx.status },\n });\n checkAllTasksComplete(this);\n break;\n\n case \"ready\":\n taskCtx.status = \"active\";\n if (\n taskCtx.agentType === \"claude\" ||\n taskCtx.agentType === \"codex\" ||\n taskCtx.agentType === \"gemini\" ||\n taskCtx.agentType === \"aider\"\n ) {\n markTaskAgentFrameworkHealthy(taskCtx.agentType);\n }\n this.broadcast({\n type: \"ready\",\n sessionId,\n timestamp: Date.now(),\n data,\n });\n await this.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"session_updated\",\n summary: `Session \"${taskCtx.label}\" ready`,\n data: { status: \"ready\" },\n });\n break;\n\n case \"tool_running\": {\n // Agent is actively working via an external tool — keep watchdog happy\n taskCtx.status = \"tool_running\";\n taskCtx.lastActivityAt = Date.now();\n taskCtx.idleCheckCount = 0;\n\n this.broadcast({\n type: \"tool_running\",\n sessionId,\n timestamp: Date.now(),\n data,\n });\n\n // Hook-sourced tool_running events fire for every tool call.\n // Only broadcast to SSE (for activity box) — skip chat messages.\n const toolData = data as {\n toolName?: string;\n description?: string;\n source?: string;\n };\n if (toolData.source === \"hook\") {\n break;\n }\n\n // Throttle chat notifications: at most one per 30s per session.\n // Suppress during the first 10s after registration — startup status\n // lines (e.g. \"Claude in Chrome enabled\") can trigger tool_running\n // before the agent has actually begun working.\n const now = Date.now();\n const STARTUP_GRACE_MS = 10_000;\n if (now - taskCtx.registeredAt < STARTUP_GRACE_MS) {\n break;\n }\n const lastNotif = this.lastToolNotification.get(sessionId) ?? 0;\n if (now - lastNotif > 30_000) {\n this.lastToolNotification.set(sessionId, now);\n const toolDesc =\n toolData.description ?? toolData.toolName ?? \"an external tool\";\n\n // Try to extract a dev server URL from recent output\n let urlSuffix = \"\";\n if (this.ptyService) {\n try {\n const recentOutput = await this.ptyService.getSessionOutput(\n sessionId,\n 50,\n );\n const devUrl = extractDevServerUrl(recentOutput);\n if (devUrl) {\n urlSuffix = ` Dev server running at ${devUrl}`;\n }\n } catch {\n // Best-effort — don't block on failure\n }\n }\n\n this.log(\n `[${taskCtx.label}] Running ${toolDesc}.${urlSuffix} The agent is working outside the terminal.`,\n );\n }\n break;\n }\n\n default:\n // Broadcast unknown events for observability\n this.broadcast({\n type: event,\n sessionId,\n timestamp: Date.now(),\n data,\n });\n }\n await this.syncTaskContext(taskCtx);\n }\n\n // ─── LLM Decision (delegated) ───\n\n async makeCoordinationDecision(\n taskCtx: TaskContext,\n promptText: string,\n recentOutput: string,\n ): Promise<CoordinationLLMResponse | null> {\n // Re-export for backward compatibility — delegates to module function\n const { makeCoordinationDecision: mkDecision } = await import(\n \"./swarm-decision-loop.js\"\n );\n return mkDecision(this, taskCtx, promptText, recentOutput);\n }\n\n async executeDecision(\n sessionId: string,\n decision: CoordinationLLMResponse,\n ): Promise<void> {\n return execDecision(this, sessionId, decision);\n }\n\n /**\n * Public entry point for external callers (e.g. server.ts) to execute\n * a coordination decision on a session. Wraps the internal executeDecision.\n */\n async executeEventDecision(\n sessionId: string,\n decision: CoordinationLLMResponse,\n ): Promise<void> {\n return execDecision(this, sessionId, decision);\n }\n\n // ─── Supervision ───\n\n setSupervisionLevel(level: SupervisionLevel): void {\n this.supervisionLevel = level;\n this.broadcast({\n type: \"supervision_changed\",\n sessionId: \"*\",\n timestamp: Date.now(),\n data: { level },\n });\n this.log(`Supervision level set to: ${level}`);\n }\n\n getSupervisionLevel(): SupervisionLevel {\n return this.supervisionLevel;\n }\n\n // ─── Confirmation Queue ───\n\n getPendingConfirmations(): PendingDecision[] {\n return Array.from(this.pendingDecisions.values());\n }\n\n async confirmDecision(\n sessionId: string,\n approved: boolean,\n override?: { response?: string; useKeys?: boolean; keys?: string[] },\n ): Promise<void> {\n const pending = this.pendingDecisions.get(sessionId);\n if (!pending) {\n throw new Error(`No pending decision for session ${sessionId}`);\n }\n\n const taskCtx = this.tasks.get(sessionId);\n\n if (approved) {\n // Use override if provided, otherwise use LLM suggestion\n const decision: CoordinationLLMResponse = override\n ? {\n action: \"respond\",\n response: override.response,\n useKeys: override.useKeys,\n keys: override.keys,\n reasoning: \"Human-approved (with override)\",\n }\n : pending.llmDecision;\n\n if (taskCtx) {\n taskCtx.status = \"active\";\n taskCtx.autoResolvedCount = 0;\n await this.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText: pending.promptText,\n decision: decision.action,\n response:\n decision.action === \"respond\"\n ? decision.useKeys\n ? `keys:${decision.keys?.join(\",\")}`\n : decision.response\n : undefined,\n reasoning: `Human-approved: ${decision.reasoning}`,\n });\n }\n\n await this.executeDecision(sessionId, decision);\n this.pendingDecisions.delete(sessionId);\n await this.taskRegistry.deletePendingDecision(sessionId);\n if (taskCtx) {\n await this.taskRegistry.appendEvent({\n threadId: taskCtx.threadId,\n sessionId,\n eventType: \"confirmation_approved\",\n summary: `Approved pending confirmation for \"${taskCtx.label}\"`,\n data: {\n action: decision.action,\n response: decision.response ?? null,\n },\n });\n }\n\n this.broadcast({\n type: \"confirmation_approved\",\n sessionId,\n timestamp: Date.now(),\n data: {\n action: decision.action,\n response: decision.response,\n useKeys: decision.useKeys,\n keys: decision.keys,\n },\n });\n } else {\n // Rejected — record and broadcast\n if (taskCtx) {\n taskCtx.status = \"blocked\";\n await this.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"blocked\",\n promptText: pending.promptText,\n decision: \"escalate\",\n reasoning: \"Human rejected the suggested action\",\n });\n }\n this.pendingDecisions.delete(sessionId);\n await this.taskRegistry.deletePendingDecision(sessionId);\n if (pending.taskContext.threadId) {\n await this.taskRegistry.appendEvent({\n threadId: pending.taskContext.threadId,\n sessionId,\n eventType: \"confirmation_rejected\",\n summary: `Rejected pending confirmation for \"${pending.taskContext.label}\"`,\n data: { prompt: pending.promptText },\n });\n }\n\n this.broadcast({\n type: \"confirmation_rejected\",\n sessionId,\n timestamp: Date.now(),\n data: { prompt: pending.promptText },\n });\n }\n }\n\n // ─── Internal ───\n\n log(message: string): void {\n logger.info(`[SwarmCoordinator] ${message}`);\n }\n}\n",
|
|
53
|
+
"import type { IAgentRuntime } from \"@elizaos/core\";\nimport type { AgentCredentials } from \"coding-agent-adapters\";\nimport { readConfigCloudKey, readConfigEnvKey } from \"./config-env.js\";\n\nconst ELIZA_CLOUD_ANTHROPIC_BASE = \"https://www.elizacloud.ai/api\";\nconst ELIZA_CLOUD_OPENAI_BASE = \"https://www.elizacloud.ai/api/v1\";\n\n/**\n * Codex per-spawn config.toml snippet that forces a custom OpenAI provider\n * with `supports_websockets = false`.\n *\n * Why this is needed: Codex 0.118+ tries to upgrade `/v1/responses` to a\n * WebSocket before falling back to POST streaming. Eliza Cloud's Next.js\n * route and Vercel AI Gateway both 405 the upgrade, causing ~7 seconds of\n * \"Reconnecting…\" + a URL-error banner before the fallback kicks in.\n *\n * Why a custom provider (not [features]): The TOML `[features]` flags\n * `responses_websockets` / `responses_websockets_v2` were removed from\n * Codex's `responses_websocket_enabled()` gate in newer builds. The only\n * remaining knobs are `provider.supports_websockets` and a runtime\n * AtomicBool latched after the first WS failure. We can't override the\n * built-in `openai` provider directly because Codex's config loader uses\n * `or_insert` (built-ins win), so we define a NEW provider key and\n * select it via top-level `model_provider`.\n *\n * The custom provider keeps `name = \"OpenAI\"` so Codex's `is_openai()`\n * checks still trigger any openai-specific code paths, and copies\n * `wire_api = \"responses\"` / `requires_openai_auth = true` from the\n * built-in. `base_url` is set to the cloud proxy URL so requests still\n * hit the proxy.\n */\nfunction buildCodexCloudProviderToml(baseUrl: string): string {\n return (\n `model_provider = \"elizacloud\"\\n` +\n `\\n` +\n `[model_providers.elizacloud]\\n` +\n `name = \"OpenAI\"\\n` +\n `base_url = \"${baseUrl}\"\\n` +\n `wire_api = \"responses\"\\n` +\n `requires_openai_auth = true\\n` +\n `supports_websockets = false\\n`\n );\n}\n\nexport function buildAgentCredentials(\n runtime: IAgentRuntime,\n): AgentCredentials {\n const llmProvider =\n readConfigEnvKey(\"PARALLAX_LLM_PROVIDER\") || \"subscription\";\n\n if (llmProvider === \"cloud\") {\n const cloudKey = readConfigCloudKey(\"apiKey\");\n if (!cloudKey) {\n throw new Error(\n \"Eliza Cloud is selected as the LLM provider but no cloud.apiKey is paired. Pair your account in the Cloud settings section first.\",\n );\n }\n const cloudCredentials = {\n anthropicKey: cloudKey,\n openaiKey: cloudKey,\n googleKey: undefined,\n anthropicBaseUrl: ELIZA_CLOUD_ANTHROPIC_BASE,\n openaiBaseUrl: ELIZA_CLOUD_OPENAI_BASE,\n githubToken: runtime.getSetting(\"GITHUB_TOKEN\") as string | undefined,\n // Disable Codex's Responses-API WebSocket transport when proxying\n // through cloud — see buildCodexCloudProviderToml doc for why this\n // requires a custom provider definition rather than [features].\n extraConfigToml: buildCodexCloudProviderToml(ELIZA_CLOUD_OPENAI_BASE),\n } as AgentCredentials & {\n anthropicBaseUrl?: string;\n openaiBaseUrl?: string;\n };\n return cloudCredentials;\n }\n\n const directCredentials = {\n anthropicKey: runtime.getSetting(\"ANTHROPIC_API_KEY\") as\n | string\n | undefined,\n openaiKey: runtime.getSetting(\"OPENAI_API_KEY\") as string | undefined,\n googleKey: runtime.getSetting(\"GOOGLE_GENERATIVE_AI_API_KEY\") as\n | string\n | undefined,\n githubToken: runtime.getSetting(\"GITHUB_TOKEN\") as string | undefined,\n anthropicBaseUrl: runtime.getSetting(\"ANTHROPIC_BASE_URL\") as\n | string\n | undefined,\n openaiBaseUrl: runtime.getSetting(\"OPENAI_BASE_URL\") as\n | string\n | undefined,\n } as AgentCredentials & {\n anthropicBaseUrl?: string;\n openaiBaseUrl?: string;\n };\n return directCredentials;\n}\n",
|
|
52
54
|
"import * as fs from \"fs/promises\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nexport type HistoryEntryType =\n\t| \"task_registered\"\n\t| \"task_completed\"\n\t| \"task_stopped\"\n\t| \"task_error\"\n\t| \"key_decision\";\n\nexport interface HistoryEntry {\n\ttimestamp: number;\n\ttype: HistoryEntryType;\n\tsessionId: string;\n\tlabel: string;\n\tagentType: string;\n\trepo?: string;\n\tworkdir: string;\n\toriginalTask?: string;\n\tcompletionSummary?: string;\n\treasoning?: string;\n}\n\nconst MAX_ENTRIES = 150;\nconst TRUNCATE_TO = 100;\n/** Maximum file size in bytes before forced truncation (1 MB). */\nconst MAX_FILE_SIZE_BYTES = 1_048_576;\n\n/**\n * Simple async mutex — serializes all file mutations so concurrent\n * append() and truncate() calls don't interleave reads and writes.\n */\nclass WriteMutex {\n\tprivate queue: Array<() => void> = [];\n\tprivate locked = false;\n\n\tasync acquire(): Promise<void> {\n\t\tif (!this.locked) {\n\t\t\tthis.locked = true;\n\t\t\treturn;\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.locked = false;\n\t\t}\n\t}\n}\n\nexport class SwarmHistory {\n\tprivate filePath: string;\n\t/** In-memory counter to avoid reading the file on every append. */\n\tprivate appendCount = 0;\n\t/** Serializes all file mutations. */\n\tprivate mutex = new WriteMutex();\n\n\tconstructor(stateDir?: string) {\n\t\tconst dir =\n\t\t\tstateDir ||\n\t\t\tprocess.env.MILADY_STATE_DIR ||\n\t\t\tprocess.env.ELIZA_STATE_DIR ||\n\t\t\tpath.join(os.homedir(), \".milady\");\n\t\tthis.filePath = path.join(dir, \"swarm-history.jsonl\");\n\t}\n\n\tasync append(entry: HistoryEntry): Promise<void> {\n\t\tawait this.mutex.acquire();\n\t\ttry {\n\t\t\tconst dir = path.dirname(this.filePath);\n\t\t\tawait fs.mkdir(dir, { recursive: true });\n\t\t\tawait fs.appendFile(this.filePath, `${JSON.stringify(entry)}\\n`, \"utf-8\");\n\t\t\tthis.appendCount++;\n\n\t\t\t// Size-based rotation: truncate if file exceeds 1 MB regardless of line count\n\t\t\ttry {\n\t\t\t\tconst stat = await fs.stat(this.filePath);\n\t\t\t\tif (stat.size > MAX_FILE_SIZE_BYTES) {\n\t\t\t\t\tawait this.truncateInner(TRUNCATE_TO);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// stat failed — skip size check, fall through to line-count check\n\t\t\t}\n\n\t\t\t// Line-count check after enough appends to potentially exceed MAX_ENTRIES\n\t\t\tif (this.appendCount >= MAX_ENTRIES - TRUNCATE_TO) {\n\t\t\t\tconst content = await fs.readFile(this.filePath, \"utf-8\");\n\t\t\t\tconst lineCount = content.split(\"\\n\").filter((l) => l.trim() !== \"\").length;\n\t\t\t\tif (lineCount > MAX_ENTRIES) {\n\t\t\t\t\tawait this.truncateInner(TRUNCATE_TO);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error(\"[swarm-history] append failed:\", err);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tthis.mutex.release();\n\t\t}\n\t}\n\n\tasync readAll(): Promise<HistoryEntry[]> {\n\t\ttry {\n\t\t\tconst content = await fs.readFile(this.filePath, \"utf-8\");\n\t\t\tconst entries: HistoryEntry[] = [];\n\t\t\tconst lines = content.split(\"\\n\");\n\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\tif (lines[i].trim() === \"\") continue;\n\t\t\t\ttry {\n\t\t\t\t\tentries.push(JSON.parse(lines[i]) as HistoryEntry);\n\t\t\t\t} catch {\n\t\t\t\t\tconsole.warn(`[swarm-history] skipping corrupted line at index ${i} (length=${lines[i].length})`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn entries;\n\t\t} catch (err: unknown) {\n\t\t\tif (\n\t\t\t\terr instanceof Error &&\n\t\t\t\t\"code\" in err &&\n\t\t\t\t(err as NodeJS.ErrnoException).code === \"ENOENT\"\n\t\t\t) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconsole.error(\"[swarm-history] readAll failed:\", err);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync getLastUsedRepo(): Promise<string | undefined> {\n\t\tconst entries = await this.readAll();\n\t\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\t\tif (entries[i].repo) {\n\t\t\t\treturn entries[i].repo;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/** Called while holding the mutex — no external callers. */\n\tprivate async truncateInner(maxEntries: number): Promise<void> {\n\t\tconst entries = await this.readAll();\n\t\t// If readAll returned empty but the file exists, a read error occurred —\n\t\t// don't overwrite the file or we'd erase valid history.\n\t\tif (entries.length === 0) {\n\t\t\ttry {\n\t\t\t\tawait fs.stat(this.filePath);\n\t\t\t\tconsole.error(\"[swarm-history] truncate aborted: file exists but readAll returned empty\");\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// First enforce entry count, then enforce byte budget.\n\t\t// This ensures the file is both under MAX_ENTRIES and MAX_FILE_SIZE_BYTES.\n\t\tlet kept = entries.slice(-maxEntries);\n\t\tlet content = kept.map((e) => JSON.stringify(e)).join(\"\\n\") + \"\\n\";\n\n\t\t// If still over size budget, drop oldest entries until it fits\n\t\twhile (\n\t\t\tBuffer.byteLength(content, \"utf-8\") > MAX_FILE_SIZE_BYTES &&\n\t\t\tkept.length > 1\n\t\t) {\n\t\t\tkept = kept.slice(Math.max(1, Math.floor(kept.length * 0.2)));\n\t\t\tcontent = kept.map((e) => JSON.stringify(e)).join(\"\\n\") + \"\\n\";\n\t\t}\n\n\t\tawait fs.writeFile(this.filePath, content, \"utf-8\");\n\t\tthis.appendCount = 0;\n\t}\n}\n",
|
|
53
|
-
"/**\n * Task-agent framework discovery and preference resolution.\n *\n * Detects installed CLIs, available auth, and Milady subscription preferences so\n * the orchestrator can choose the best framework when the caller does not\n * specify one explicitly.\n *\n * @module services/task-agent-frameworks\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport type { PreflightResult } from \"coding-agent-adapters\";\n\nexport type SupportedTaskAgentAdapter =\n | \"claude\"\n | \"codex\"\n | \"gemini\"\n | \"aider\";\nexport type TaskAgentFrameworkId = SupportedTaskAgentAdapter | \"pi\";\n\nexport interface TaskAgentFrameworkAvailability {\n id: TaskAgentFrameworkId;\n label: string;\n installed: boolean;\n authReady: boolean;\n subscriptionReady: boolean;\n temporarilyDisabled: boolean;\n temporarilyDisabledUntil?: number;\n temporarilyDisabledReason?: string;\n recommended: boolean;\n reason: string;\n installCommand?: string;\n docsUrl?: string;\n}\n\nexport interface PreferredTaskAgent {\n id: TaskAgentFrameworkId;\n reason: string;\n}\n\nexport interface TaskAgentFrameworkState {\n configuredSubscriptionProvider?: string;\n frameworks: TaskAgentFrameworkAvailability[];\n preferred: PreferredTaskAgent;\n}\n\nexport interface TaskAgentFrameworkProbe {\n checkAvailableAgents?: (\n types?: SupportedTaskAgentAdapter[],\n ) => Promise<PreflightResult[]>;\n}\n\nconst FRAMEWORK_LABELS: Record<TaskAgentFrameworkId, string> = {\n claude: \"Claude Code\",\n codex: \"Codex\",\n gemini: \"Gemini CLI\",\n aider: \"Aider\",\n pi: \"Pi\",\n};\n\nconst STANDARD_FRAMEWORKS: SupportedTaskAgentAdapter[] = [\n \"claude\",\n \"codex\",\n \"gemini\",\n \"aider\",\n];\n\nconst TASK_AGENT_COMPLEXITY_RE =\n /\\b(repo|repository|code|coding|debug|fix|implement|investigate|research|analyze|analysis|summarize|summary|write|draft|document|plan|workflow|automation|parallel|delegate|subtask|agent|orchestrate|coordinate|compare|test|tests|pull request|pr\\b|branch|commit)\\b/i;\n\nlet frameworkStateCache:\n | {\n expiresAt: number;\n value: TaskAgentFrameworkState;\n }\n | undefined;\nconst frameworkCooldowns = new Map<\n SupportedTaskAgentAdapter,\n { until: number; reason: string }\n>();\nconst TASK_AGENT_USAGE_EXHAUSTED_RE =\n /\\b(insufficient(?:[_\\s]+(?:credits?|quota))|insufficient_quota|out of credits|credit balance|usage (?:has )?(?:reached|exceeded)|quota exceeded|payment required|status(?:code)?[:\\s]*402)\\b/i;\n\nfunction safeGetSetting(\n runtime: IAgentRuntime | undefined,\n key: string,\n): string | undefined {\n if (!runtime) return undefined;\n try {\n const value = runtime.getSetting(key);\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getUserHomeDir(): string {\n return (\n process.env.HOME?.trim() ||\n process.env.USERPROFILE?.trim() ||\n os.homedir()\n );\n}\n\nfunction readJsonFile(filePath: string): unknown {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf8\"));\n } catch {\n return null;\n }\n}\n\nfunction extractOauthAccessToken(value: unknown): string | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return;\n const record = value as Record<string, unknown>;\n const direct = record.accessToken ?? record.access_token;\n if (typeof direct === \"string\" && direct.trim()) {\n return direct.trim();\n }\n for (const nested of Object.values(record)) {\n const token = extractOauthAccessToken(nested);\n if (token) return token;\n }\n return;\n}\n\nfunction resolveMiladyConfigPath(): string {\n const explicit =\n process.env.MILADY_CONFIG_PATH?.trim() ||\n process.env.ELIZA_CONFIG_PATH?.trim();\n if (explicit) return explicit;\n\n const stateDir =\n process.env.MILADY_STATE_DIR?.trim() ||\n process.env.ELIZA_STATE_DIR?.trim() ||\n path.join(getUserHomeDir(), \".milady\");\n const namespace = process.env.ELIZA_NAMESPACE?.trim();\n const filename =\n !namespace || namespace === \"milady\" ? \"milady.json\" : `${namespace}.json`;\n return path.join(stateDir, filename);\n}\n\nfunction readConfiguredSubscriptionProvider(): string | undefined {\n const config = readJsonFile(resolveMiladyConfigPath());\n if (!config || typeof config !== \"object\" || Array.isArray(config)) return;\n const agents = (config as Record<string, unknown>).agents;\n if (!agents || typeof agents !== \"object\" || Array.isArray(agents)) return;\n const defaults = (agents as Record<string, unknown>).defaults;\n if (!defaults || typeof defaults !== \"object\" || Array.isArray(defaults))\n return;\n const provider = (defaults as Record<string, unknown>).subscriptionProvider;\n return typeof provider === \"string\" && provider.trim()\n ? provider.trim()\n : undefined;\n}\n\nfunction hasClaudeSubscriptionAuth(): boolean {\n const credentialsPath = path.join(\n getUserHomeDir(),\n \".claude\",\n \".credentials.json\",\n );\n const fileToken = extractOauthAccessToken(readJsonFile(credentialsPath));\n if (fileToken) return true;\n\n if (process.platform !== \"darwin\") return false;\n try {\n const raw = execFileSync(\n \"security\",\n [\"find-generic-password\", \"-s\", \"Claude Code-credentials\", \"-w\"],\n { encoding: \"utf8\", timeout: 3000, stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n ).trim();\n if (!raw) return false;\n return Boolean(extractOauthAccessToken(JSON.parse(raw)));\n } catch {\n return false;\n }\n}\n\nfunction hasClaudeApiKey(runtime?: IAgentRuntime): boolean {\n return Boolean(\n process.env.ANTHROPIC_API_KEY?.trim() ||\n safeGetSetting(runtime, \"ANTHROPIC_API_KEY\"),\n );\n}\n\nfunction hasCodexSubscriptionAuth(): boolean {\n const authPath = path.join(getUserHomeDir(), \".codex\", \"auth.json\");\n const auth = readJsonFile(authPath);\n if (!auth || typeof auth !== \"object\" || Array.isArray(auth)) return false;\n const key = (auth as Record<string, unknown>).OPENAI_API_KEY;\n return typeof key === \"string\" && key.trim().length > 0;\n}\n\nfunction hasCodexApiKey(runtime?: IAgentRuntime): boolean {\n return Boolean(\n process.env.OPENAI_API_KEY?.trim() ||\n safeGetSetting(runtime, \"OPENAI_API_KEY\"),\n );\n}\n\nfunction hasGeminiCredential(runtime?: IAgentRuntime): boolean {\n return Boolean(\n process.env.GOOGLE_GENERATIVE_AI_API_KEY?.trim() ||\n process.env.GOOGLE_API_KEY?.trim() ||\n safeGetSetting(runtime, \"GOOGLE_GENERATIVE_AI_API_KEY\") ||\n safeGetSetting(runtime, \"GOOGLE_API_KEY\"),\n );\n}\n\nfunction hasPiBinary(): boolean {\n const command = process.platform === \"win32\" ? \"where\" : \"which\";\n const args = process.platform === \"win32\" ? [\"pi.exe\"] : [\"pi\"];\n try {\n execFileSync(command, args, {\n encoding: \"utf8\",\n timeout: 1500,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getFrameworkCooldown(\n id: SupportedTaskAgentAdapter,\n): { until: number; reason: string } | undefined {\n const cooldown = frameworkCooldowns.get(id);\n if (!cooldown) return undefined;\n if (cooldown.until <= Date.now()) {\n frameworkCooldowns.delete(id);\n return undefined;\n }\n return cooldown;\n}\n\nasync function computeTaskAgentFrameworkState(\n runtime: IAgentRuntime,\n probe?: TaskAgentFrameworkProbe,\n): Promise<TaskAgentFrameworkState> {\n const configuredSubscriptionProvider = readConfiguredSubscriptionProvider();\n const preflightByAdapter = new Map<SupportedTaskAgentAdapter, PreflightResult>();\n\n if (probe?.checkAvailableAgents) {\n try {\n const results = await probe.checkAvailableAgents(STANDARD_FRAMEWORKS);\n for (const result of results) {\n if (\n result.adapter === \"claude\" ||\n result.adapter === \"codex\" ||\n result.adapter === \"gemini\" ||\n result.adapter === \"aider\"\n ) {\n preflightByAdapter.set(result.adapter, result);\n }\n }\n } catch {\n // Keep status surfaces alive even if preflight fails transiently.\n }\n }\n\n const claudeSubscriptionReady = hasClaudeSubscriptionAuth();\n const claudeAuthReady = claudeSubscriptionReady || hasClaudeApiKey(runtime);\n const codexSubscriptionReady = hasCodexSubscriptionAuth();\n const codexAuthReady = codexSubscriptionReady || hasCodexApiKey(runtime);\n const geminiAuthReady = hasGeminiCredential(runtime);\n const piReady = hasPiBinary();\n\n const providerPrefersClaude =\n configuredSubscriptionProvider === \"anthropic-subscription\";\n const providerPrefersCodex =\n configuredSubscriptionProvider === \"openai-codex\" ||\n configuredSubscriptionProvider === \"openai-subscription\";\n\n const frameworks: TaskAgentFrameworkAvailability[] = STANDARD_FRAMEWORKS.map(\n (id) => {\n const preflight = preflightByAdapter.get(id);\n const cooldown = getFrameworkCooldown(id);\n const installed = preflight?.installed === true;\n const subscriptionReady =\n id === \"claude\"\n ? claudeSubscriptionReady\n : id === \"codex\"\n ? codexSubscriptionReady\n : false;\n const authReady =\n id === \"claude\"\n ? claudeAuthReady\n : id === \"codex\"\n ? codexAuthReady\n : id === \"gemini\"\n ? geminiAuthReady\n : claudeAuthReady || codexAuthReady || geminiAuthReady;\n const reason =\n id === \"claude\" && subscriptionReady\n ? \"ready to use the user's Claude subscription\"\n : id === \"codex\" && subscriptionReady\n ? \"ready to use the user's OpenAI subscription\"\n : installed\n ? authReady\n ? \"installed with credentials available\"\n : \"installed but credentials were not detected\"\n : \"CLI not detected\";\n return {\n id,\n label: FRAMEWORK_LABELS[id],\n installed,\n authReady,\n subscriptionReady,\n temporarilyDisabled: Boolean(cooldown),\n temporarilyDisabledUntil: cooldown?.until,\n temporarilyDisabledReason: cooldown?.reason,\n recommended: false,\n reason: cooldown\n ? `${reason}; temporarily disabled after a provider failure: ${cooldown.reason}`\n : reason,\n installCommand: preflight?.installCommand,\n docsUrl: preflight?.docsUrl,\n };\n },\n );\n\n frameworks.push({\n id: \"pi\",\n label: FRAMEWORK_LABELS.pi,\n installed: piReady,\n authReady: piReady,\n subscriptionReady: false,\n temporarilyDisabled: false,\n recommended: false,\n reason: piReady ? \"CLI detected\" : \"CLI not detected\",\n });\n\n const byId = new Map(frameworks.map((framework) => [framework.id, framework]));\n const isSelectable = (id: TaskAgentFrameworkId): boolean =>\n !byId.get(id)?.temporarilyDisabled;\n const explicitDefault = safeGetSetting(runtime, \"PARALLAX_DEFAULT_AGENT_TYPE\")\n ?.toLowerCase()\n .trim();\n let preferred: PreferredTaskAgent;\n\n if (\n explicitDefault &&\n (explicitDefault === \"claude\" ||\n explicitDefault === \"codex\" ||\n explicitDefault === \"gemini\" ||\n explicitDefault === \"aider\" ||\n explicitDefault === \"pi\") &&\n byId.get(explicitDefault)?.installed &&\n isSelectable(explicitDefault)\n ) {\n preferred = {\n id: explicitDefault,\n reason: \"explicit PARALLAX_DEFAULT_AGENT_TYPE override\",\n };\n } else if (\n providerPrefersClaude &&\n byId.get(\"claude\")?.installed &&\n claudeSubscriptionReady &&\n isSelectable(\"claude\")\n ) {\n preferred = {\n id: \"claude\",\n reason: \"configured Claude subscription should drive Claude Code first\",\n };\n } else if (\n providerPrefersCodex &&\n byId.get(\"codex\")?.installed &&\n codexSubscriptionReady &&\n isSelectable(\"codex\")\n ) {\n preferred = {\n id: \"codex\",\n reason: \"configured OpenAI subscription should drive Codex first\",\n };\n } else if (\n byId.get(\"claude\")?.installed &&\n claudeSubscriptionReady &&\n isSelectable(\"claude\")\n ) {\n preferred = {\n id: \"claude\",\n reason: \"Claude Code is installed and the user is logged in\",\n };\n } else if (\n byId.get(\"codex\")?.installed &&\n codexSubscriptionReady &&\n isSelectable(\"codex\")\n ) {\n preferred = {\n id: \"codex\",\n reason: \"Codex is installed and the user is logged in\",\n };\n } else if (\n byId.get(\"claude\")?.installed &&\n claudeAuthReady &&\n isSelectable(\"claude\")\n ) {\n preferred = {\n id: \"claude\",\n reason: \"Claude Code is installed and credentials are available\",\n };\n } else if (\n byId.get(\"codex\")?.installed &&\n codexAuthReady &&\n isSelectable(\"codex\")\n ) {\n preferred = {\n id: \"codex\",\n reason: \"Codex is installed and credentials are available\",\n };\n } else if (\n byId.get(\"gemini\")?.installed &&\n geminiAuthReady &&\n isSelectable(\"gemini\")\n ) {\n preferred = {\n id: \"gemini\",\n reason: \"Gemini CLI is installed and credentials are available\",\n };\n } else {\n const fallback =\n frameworks.find(\n (framework) => framework.installed && !framework.temporarilyDisabled,\n ) ??\n frameworks.find((framework) => framework.installed) ??\n frameworks[0];\n preferred = {\n id: fallback.id,\n reason: fallback.installed\n ? \"best available installed task-agent framework\"\n : \"default fallback while no task-agent CLI is installed\",\n };\n }\n\n for (const framework of frameworks) {\n framework.recommended = framework.id === preferred.id;\n }\n\n return {\n configuredSubscriptionProvider,\n frameworks,\n preferred,\n };\n}\n\nexport async function getTaskAgentFrameworkState(\n runtime: IAgentRuntime,\n probe?: TaskAgentFrameworkProbe,\n): Promise<TaskAgentFrameworkState> {\n if (frameworkStateCache && frameworkStateCache.expiresAt > Date.now()) {\n return frameworkStateCache.value;\n }\n const value = await computeTaskAgentFrameworkState(runtime, probe);\n frameworkStateCache = {\n expiresAt: Date.now() + 15_000,\n value,\n };\n return value;\n}\n\nexport function clearTaskAgentFrameworkStateCache(): void {\n frameworkStateCache = undefined;\n}\n\nexport function isUsageExhaustedTaskAgentError(text: string): boolean {\n return TASK_AGENT_USAGE_EXHAUSTED_RE.test(text);\n}\n\nexport function markTaskAgentFrameworkUnavailable(\n id: SupportedTaskAgentAdapter,\n reason: string,\n cooldownMs = 30 * 60 * 1000,\n): void {\n frameworkCooldowns.set(id, {\n until: Date.now() + cooldownMs,\n reason,\n });\n clearTaskAgentFrameworkStateCache();\n}\n\nexport function markTaskAgentFrameworkHealthy(\n id: SupportedTaskAgentAdapter,\n): void {\n if (frameworkCooldowns.delete(id)) {\n clearTaskAgentFrameworkStateCache();\n }\n}\n\nexport function formatTaskAgentFrameworkLine(\n framework: TaskAgentFrameworkAvailability,\n): string {\n const parts = [\n framework.installed ? \"installed\" : \"not installed\",\n framework.authReady ? \"credentials ready\" : \"credentials missing\",\n ];\n if (framework.subscriptionReady) {\n parts.push(\"uses the user's subscription\");\n }\n if (framework.temporarilyDisabled) {\n parts.push(\"temporarily disabled\");\n }\n if (framework.recommended) {\n parts.push(\"recommended\");\n }\n return `- ${framework.label}: ${parts.join(\", \")}. ${framework.reason}.`;\n}\n\nexport function looksLikeTaskAgentRequest(text: string): boolean {\n return TASK_AGENT_COMPLEXITY_RE.test(text);\n}\n\nexport function formatTaskAgentStatus(status: string): string {\n switch (status) {\n case \"ready\":\n return \"idle\";\n case \"busy\":\n return \"working\";\n case \"starting\":\n return \"starting\";\n case \"authenticating\":\n return \"authenticating\";\n default:\n return status;\n }\n}\n\nexport function truncateTaskAgentText(text: string, max = 120): string {\n const trimmed = text.trim().replace(/\\s+/g, \" \");\n return trimmed.length > max ? `${trimmed.slice(0, max - 1)}...` : trimmed;\n}\n\nexport function rewriteTaskAgentText(text: string): string {\n return text\n .replace(/\\bcoding agents\\b/gi, \"task agents\")\n .replace(/\\bcoding agent\\b/gi, \"task agent\")\n .replace(/\\bcoding sessions\\b/gi, \"task-agent sessions\")\n .replace(/\\bcoding session\\b/gi, \"task-agent session\");\n}\n\nexport { FRAMEWORK_LABELS as TASK_AGENT_FRAMEWORK_LABELS };\n",
|
|
55
|
+
"/**\n * Swarm Coordinator — Idle Watchdog\n *\n * Extracted from swarm-coordinator.ts for modularity.\n * Scans active sessions for idle ones and asks the LLM to assess their state.\n *\n * @module services/swarm-idle-watchdog\n */\n\nimport { ModelType } from \"@elizaos/core\";\nimport { cleanForChat, stripAnsi } from \"./ansi-utils.js\";\nimport type {\n SwarmCoordinatorContext,\n TaskContext,\n} from \"./swarm-coordinator.js\";\nimport {\n buildIdleCheckPrompt,\n type CoordinationLLMResponse,\n type DecisionHistoryEntry,\n parseCoordinationResponse,\n type SiblingTaskSummary,\n type TaskContextSummary,\n} from \"./swarm-coordinator-prompts.js\";\nimport {\n checkAllTasksComplete,\n executeDecision,\n} from \"./swarm-decision-loop.js\";\nimport { withTrajectoryContext } from \"./trajectory-context.js\";\n\n// ─── Constants ───\n\n/** How long a session can be idle before the watchdog checks on it (ms). */\nexport const IDLE_THRESHOLD_MS = 5 * 60 * 1000; // 5 minutes\n\n/** Max idle checks before force-escalating a session. */\nexport const MAX_IDLE_CHECKS = 4;\n\n// ─── Idle Watchdog ───\n\n/**\n * Scan all active sessions for idle ones. Called periodically by the watchdog timer.\n */\nexport async function scanIdleSessions(\n ctx: SwarmCoordinatorContext,\n): Promise<void> {\n const now = Date.now();\n for (const taskCtx of ctx.tasks.values()) {\n if (taskCtx.status !== \"active\" && taskCtx.status !== \"tool_running\") {\n continue;\n }\n\n // Liveness check: if the PTY session no longer exists in the worker\n // (e.g. parent process was SIGKILL'd and restarted), mark it dead.\n if (ctx.ptyService) {\n const session = ctx.ptyService.getSession(taskCtx.sessionId);\n if (!session) {\n ctx.log(\n `Idle watchdog: \"${taskCtx.label}\" — PTY session no longer exists, marking as stopped`,\n );\n taskCtx.status = \"stopped\";\n taskCtx.stoppedAt = now;\n await ctx.recordDecision(taskCtx, {\n timestamp: now,\n event: \"idle_watchdog\",\n promptText: \"PTY session no longer exists\",\n decision: \"stopped\",\n reasoning:\n \"Underlying PTY process is gone (likely killed during restart)\",\n });\n ctx.broadcast({\n type: \"stopped\",\n sessionId: taskCtx.sessionId,\n timestamp: now,\n data: { reason: \"pty_session_gone\" },\n });\n ctx.sendChatMessage(\n `[${taskCtx.label}] Session lost — the agent process is no longer running (likely killed during a restart).`,\n \"coding-agent\",\n );\n checkAllTasksComplete(ctx);\n continue;\n }\n }\n\n const idleMs = now - taskCtx.lastActivityAt;\n if (idleMs < IDLE_THRESHOLD_MS) continue;\n\n // Skip if already checking this session\n if (ctx.inFlightDecisions.has(taskCtx.sessionId)) continue;\n\n // Check if PTY output has changed since last scan — if data is flowing,\n // the session is active even without named events (e.g. loading spinners).\n // Compare stripped output to ignore TUI cursor movements and redraws\n // that would otherwise fool the watchdog into thinking the session is active.\n if (ctx.ptyService) {\n try {\n const rawOutput = await ctx.ptyService.getSessionOutput(\n taskCtx.sessionId,\n 20,\n );\n const currentOutput = stripAnsi(rawOutput).trim();\n const lastSeen = ctx.lastSeenOutput.get(taskCtx.sessionId) ?? \"\";\n ctx.lastSeenOutput.set(taskCtx.sessionId, currentOutput);\n if (currentOutput !== lastSeen) {\n // Output changed — session is producing data, reset idle state\n taskCtx.lastActivityAt = now;\n taskCtx.idleCheckCount = 0;\n ctx.log(\n `Idle watchdog: \"${taskCtx.label}\" has fresh PTY output — not idle`,\n );\n continue;\n }\n } catch {\n // Can't read output — proceed with idle check\n }\n\n // Even if the visible 20-line tail didn't change, trust the adapter's\n // own \"I am busy\" signal. TUIs like Codex redraw their status row\n // (\"Working (Xs • esc to interrupt)\") in place via cursor positioning,\n // so consecutive ANSI-stripped tails can collapse to identical text\n // even while the model is actively reasoning for minutes. The adapter's\n // detectLoading() runs against the full buffer and is the source of\n // truth for \"is the agent processing right now\".\n try {\n const isLoading = await ctx.ptyService.isSessionLoading(\n taskCtx.sessionId,\n );\n if (isLoading) {\n taskCtx.lastActivityAt = now;\n taskCtx.idleCheckCount = 0;\n ctx.log(\n `Idle watchdog: \"${taskCtx.label}\" adapter reports loading — not idle`,\n );\n continue;\n }\n } catch {\n // Fall through to the LLM idle check if we can't query the adapter.\n }\n }\n\n taskCtx.idleCheckCount++;\n const idleMinutes = Math.round(idleMs / 60_000);\n ctx.log(\n `Idle watchdog: \"${taskCtx.label}\" idle for ${idleMinutes}m (check ${taskCtx.idleCheckCount}/${MAX_IDLE_CHECKS})`,\n );\n\n if (taskCtx.idleCheckCount >= MAX_IDLE_CHECKS) {\n // Force-stop — too many idle checks with no resolution\n ctx.log(\n `Idle watchdog: force-stopping \"${taskCtx.label}\" after ${MAX_IDLE_CHECKS} checks`,\n );\n taskCtx.status = \"stopped\";\n taskCtx.stoppedAt = now;\n await ctx.recordDecision(taskCtx, {\n timestamp: now,\n event: \"idle_watchdog\",\n promptText: `Session idle for ${idleMinutes} minutes`,\n decision: \"stopped\",\n reasoning: `Force-stopped after ${MAX_IDLE_CHECKS} idle checks with no activity`,\n });\n ctx.broadcast({\n type: \"stopped\",\n sessionId: taskCtx.sessionId,\n timestamp: now,\n data: {\n reason: \"idle_watchdog_max_checks\",\n idleMinutes,\n idleCheckCount: taskCtx.idleCheckCount,\n },\n });\n ctx.sendChatMessage(\n `[${taskCtx.label}] Session stopped — idle for ${idleMinutes} minutes with no progress.`,\n \"coding-agent\",\n );\n // Force-kill the PTY session — idle timeout means nothing to save.\n if (ctx.ptyService) {\n try {\n await ctx.ptyService.stopSession(taskCtx.sessionId, /* force */ true);\n } catch (err) {\n ctx.log(\n `Idle watchdog: failed to stop session ${taskCtx.sessionId}: ${err}`,\n );\n taskCtx.status = \"error\";\n await ctx.syncTaskContext(taskCtx);\n ctx.broadcast({\n type: \"error\",\n sessionId: taskCtx.sessionId,\n timestamp: now,\n data: { message: `Failed to stop idle session: ${err}` },\n });\n }\n }\n // Check if all tasks are now done\n checkAllTasksComplete(ctx);\n continue;\n }\n\n // Ask the LLM what's going on\n await handleIdleCheck(ctx, taskCtx, idleMinutes);\n }\n}\n\n/**\n * Handle an idle session by asking the LLM to assess its state.\n */\nexport async function handleIdleCheck(\n ctx: SwarmCoordinatorContext,\n taskCtx: TaskContext,\n idleMinutes: number,\n): Promise<void> {\n const sessionId = taskCtx.sessionId;\n ctx.inFlightDecisions.add(sessionId);\n try {\n let recentOutput = \"\";\n if (ctx.ptyService) {\n try {\n const raw = await ctx.ptyService.getSessionOutput(sessionId, 50);\n recentOutput = cleanForChat(raw);\n } catch {\n recentOutput = \"\";\n }\n }\n\n const contextSummary: TaskContextSummary = {\n sessionId,\n agentType: taskCtx.agentType,\n label: taskCtx.label,\n originalTask: taskCtx.originalTask,\n workdir: taskCtx.workdir,\n };\n\n const decisionHistory: DecisionHistoryEntry[] = taskCtx.decisions\n .filter((d) => d.decision !== \"auto_resolved\")\n .slice(-5)\n .map((d) => ({\n event: d.event,\n promptText: d.promptText,\n action: d.decision,\n response: d.response,\n reasoning: d.reasoning,\n }));\n\n const siblings: SiblingTaskSummary[] = [];\n for (const [sid, task] of ctx.tasks) {\n if (sid === sessionId) continue;\n siblings.push({\n label: task.label,\n agentType: task.agentType,\n originalTask: task.originalTask,\n status: task.status,\n });\n }\n\n const prompt = buildIdleCheckPrompt(\n contextSummary,\n recentOutput,\n idleMinutes,\n taskCtx.idleCheckCount,\n MAX_IDLE_CHECKS,\n decisionHistory,\n siblings,\n ctx.sharedDecisions,\n ctx.getSwarmContext(),\n );\n\n let decision: CoordinationLLMResponse | null = null;\n try {\n const result = await withTrajectoryContext(\n ctx.runtime,\n {\n source: \"orchestrator\",\n decisionType: \"idle-check\",\n sessionId,\n taskLabel: taskCtx.label,\n repo: taskCtx.repo,\n workdir: taskCtx.workdir,\n originalTask: taskCtx.originalTask,\n },\n () => ctx.runtime.useModel(ModelType.TEXT_SMALL, { prompt }),\n );\n decision = parseCoordinationResponse(result);\n } catch (err) {\n ctx.log(`Idle check LLM call failed: ${err}`);\n }\n\n if (!decision) {\n ctx.log(\n `Idle check for \"${taskCtx.label}\": LLM returned invalid response — escalating`,\n );\n ctx.sendChatMessage(\n `[${taskCtx.label}] Session idle for ${idleMinutes}m — couldn't determine status. Needs your attention.`,\n \"coding-agent\",\n );\n return;\n }\n\n // Record the decision\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"idle_watchdog\",\n promptText: `Session idle for ${idleMinutes} minutes`,\n decision: decision.action,\n response:\n decision.action === \"respond\"\n ? decision.useKeys\n ? `keys:${decision.keys?.join(\",\")}`\n : decision.response\n : undefined,\n reasoning: decision.reasoning,\n });\n\n ctx.broadcast({\n type: \"idle_check_decision\",\n sessionId,\n timestamp: Date.now(),\n data: {\n action: decision.action,\n idleMinutes,\n idleCheckNumber: taskCtx.idleCheckCount,\n reasoning: decision.reasoning,\n },\n });\n\n // Send chat message\n if (decision.action === \"complete\") {\n // executeDecision handles chat + stop for \"complete\"\n } else if (decision.action === \"respond\") {\n const actionDesc = decision.useKeys\n ? `Sent keys: ${decision.keys?.join(\", \")}`\n : `Nudged: ${decision.response ?? \"\"}`;\n ctx.log(`[${taskCtx.label}] Idle for ${idleMinutes}m — ${actionDesc}`);\n } else if (decision.action === \"escalate\") {\n ctx.sendChatMessage(\n `[${taskCtx.label}] Idle for ${idleMinutes}m — needs your attention: ${decision.reasoning}`,\n \"coding-agent\",\n );\n } else if (decision.action === \"ignore\") {\n ctx.log(\n `Idle check for \"${taskCtx.label}\": LLM says still working — ${decision.reasoning}`,\n );\n }\n\n await executeDecision(ctx, sessionId, decision);\n } finally {\n ctx.inFlightDecisions.delete(sessionId);\n }\n}\n",
|
|
54
56
|
"import { type IAgentRuntime, ModelType } from \"@elizaos/core\";\nimport type { CreateTaskThreadInput } from \"./task-registry.js\";\n\nexport interface TaskAcceptanceCriteriaResult {\n criteria: string[];\n source: \"provided\" | \"model\" | \"baseline\";\n}\n\nconst MAX_CRITERIA = 7;\n\nfunction trimCriterion(value: string): string {\n return value\n .replace(/^[\\s*-]+/, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction uniqueCriteria(values: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const value of values.map(trimCriterion)) {\n if (!value) continue;\n const key = value.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(value);\n if (result.length >= MAX_CRITERIA) break;\n }\n return result;\n}\n\nfunction parseJsonCriteria(raw: string): string[] {\n const trimmed = raw.trim();\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n const candidate = (fenced?.[1] ?? trimmed).trim();\n const parsed = JSON.parse(candidate) as unknown;\n if (!Array.isArray(parsed)) return [];\n return uniqueCriteria(\n parsed.filter((entry): entry is string => typeof entry === \"string\"),\n );\n}\n\nfunction plannedSubtasks(input: CreateTaskThreadInput): string[] {\n const subtasks = (input.currentPlan as { subtasks?: unknown } | undefined)\n ?.subtasks;\n if (!Array.isArray(subtasks)) return [];\n return uniqueCriteria(\n subtasks.filter((entry): entry is string => typeof entry === \"string\"),\n );\n}\n\nfunction getRepo(input: CreateTaskThreadInput): string | null {\n const repo = input.metadata?.repo;\n if (typeof repo !== \"string\") return null;\n const trimmed = repo.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction buildBaselineAcceptanceCriteria(\n input: CreateTaskThreadInput,\n): string[] {\n const criteria: string[] = [];\n const subtasks = plannedSubtasks(input);\n\n criteria.push(`Address the full request: ${input.originalRequest}`);\n for (const subtask of subtasks.slice(0, 3)) {\n criteria.push(`Complete this planned subtask: ${subtask}`);\n }\n if (input.kind === \"coding\" || getRepo(input)) {\n criteria.push(\"Run the relevant checks for the changed code, or record the exact blocker.\");\n }\n criteria.push(\"Capture concrete completion evidence in the task record.\");\n criteria.push(\"Do not claim completion while any blocker or missing verification remains.\");\n return uniqueCriteria(criteria).slice(0, MAX_CRITERIA);\n}\n\nfunction buildAcceptancePrompt(input: CreateTaskThreadInput): string {\n const subtasks = plannedSubtasks(input);\n const planBlock =\n subtasks.length > 0\n ? subtasks.map((task) => `- ${task}`).join(\"\\n\")\n : \"- none\";\n return [\n \"Generate task completion criteria for an orchestrated agent task.\",\n \"Return strict JSON only: an array of 3 to 7 measurable strings.\",\n \"Each criterion must be observable and suitable for completion validation.\",\n \"Avoid generic wording like 'do a good job'.\",\n \"\",\n `Title: ${input.title}`,\n `Kind: ${input.kind ?? \"coding\"}`,\n `Original request: ${input.originalRequest}`,\n `Repository: ${getRepo(input) ?? \"none\"}`,\n \"Planned subtasks:\",\n planBlock,\n \"\",\n \"Prefer criteria about completed work, verification, evidence, and unresolved blockers.\",\n ].join(\"\\n\");\n}\n\nexport async function deriveTaskAcceptanceCriteria(\n runtime: IAgentRuntime,\n input: CreateTaskThreadInput,\n): Promise<TaskAcceptanceCriteriaResult> {\n const provided = uniqueCriteria(input.acceptanceCriteria ?? []);\n if (provided.length > 0) {\n return {\n criteria: provided,\n source: \"provided\",\n };\n }\n\n try {\n const raw = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: buildAcceptancePrompt(input),\n temperature: 0.1,\n stream: false,\n });\n if (typeof raw === \"string\") {\n const parsed = parseJsonCriteria(raw);\n if (parsed.length >= 3) {\n return {\n criteria: parsed,\n source: \"model\",\n };\n }\n }\n } catch {\n // Fall back to baseline criteria when the model is unavailable or invalid.\n }\n\n return {\n criteria: buildBaselineAcceptanceCriteria(input),\n source: \"baseline\",\n };\n}\n",
|
|
55
|
-
"import crypto from \"node:crypto\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport type { CodingAgentType } from \"./pty-types.js\";\n\ntype RawSqlQuery = {\n queryChunks: Array<{ value?: unknown }>;\n};\n\ntype RuntimeDb = {\n execute: (query: RawSqlQuery) => Promise<unknown>;\n};\n\ntype Row = Record<string, unknown>;\n\nlet cachedSqlRaw: ((query: string) => RawSqlQuery) | null = null;\nconst schemaReady = new WeakSet<object>();\n\nexport type TaskThreadKind =\n | \"coding\"\n | \"research\"\n | \"planning\"\n | \"ops\"\n | \"mixed\";\n\nexport type TaskThreadStatus =\n | \"open\"\n | \"active\"\n | \"waiting_on_user\"\n | \"blocked\"\n | \"validating\"\n | \"done\"\n | \"failed\"\n | \"archived\"\n | \"interrupted\";\n\nexport type TaskSessionStatus =\n | \"active\"\n | \"blocked\"\n | \"waiting_on_user\"\n | \"completed\"\n | \"stopped\"\n | \"error\"\n | \"tool_running\"\n | \"interrupted\";\n\nexport type TaskThreadEventType =\n | \"task_created\"\n | \"task_registered\"\n | \"task_status_changed\"\n | \"task_archived\"\n | \"task_reopened\"\n | \"session_registered\"\n | \"session_updated\"\n | \"session_interrupted\"\n | \"decision_recorded\"\n | \"artifact_recorded\"\n | \"summary_updated\";\n\nexport interface TaskThreadRecord {\n id: string;\n agentId: string;\n roomId: string | null;\n worldId: string | null;\n ownerUserId: string | null;\n title: string;\n kind: TaskThreadKind;\n status: TaskThreadStatus;\n originalRequest: string;\n summary: string;\n acceptanceCriteria: string[];\n currentPlan: Record<string, unknown>;\n searchText: string;\n createdAt: string;\n updatedAt: string;\n closedAt: string | null;\n archivedAt: string | null;\n lastUserTurnAt: string | null;\n lastCoordinatorTurnAt: string | null;\n metadata: Record<string, unknown>;\n}\n\nexport interface TaskSessionRecord {\n id: string;\n threadId: string;\n agentId: string;\n sessionId: string;\n framework: CodingAgentType;\n providerSource: string | null;\n label: string;\n originalTask: string;\n workdir: string;\n repo: string | null;\n status: TaskSessionStatus;\n decisionCount: number;\n autoResolvedCount: number;\n registeredAt: number;\n lastActivityAt: number;\n idleCheckCount: number;\n taskDelivered: boolean;\n completionSummary: string | null;\n lastSeenDecisionIndex: number;\n lastInputSentAt: number | null;\n stoppedAt: number | null;\n createdAt: string;\n updatedAt: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface TaskDecisionRecord {\n id: string;\n threadId: string;\n sessionId: string;\n timestamp: number;\n event: string;\n promptText: string;\n decision: string;\n response: string | null;\n reasoning: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface TaskEventRecord {\n id: string;\n threadId: string;\n sessionId: string | null;\n eventType: TaskThreadEventType | string;\n timestamp: number;\n summary: string;\n data: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface TaskArtifactRecord {\n id: string;\n threadId: string;\n sessionId: string | null;\n artifactType: string;\n title: string;\n path: string | null;\n uri: string | null;\n mimeType: string | null;\n metadata: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface TaskTranscriptRecord {\n id: string;\n threadId: string;\n sessionId: string;\n timestamp: number;\n direction: \"stdout\" | \"stderr\" | \"stdin\" | \"keys\" | \"system\";\n content: string;\n metadata: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface TaskPendingDecisionRecord {\n sessionId: string;\n threadId: string;\n promptText: string;\n recentOutput: string;\n llmDecision: Record<string, unknown>;\n taskContext: Record<string, unknown>;\n createdAt: number;\n updatedAt: string;\n}\n\nexport interface TaskThreadSummary extends TaskThreadRecord {\n sessionCount: number;\n activeSessionCount: number;\n latestSessionId: string | null;\n latestSessionLabel: string | null;\n latestWorkdir: string | null;\n latestRepo: string | null;\n latestActivityAt: number | null;\n decisionCount: number;\n}\n\nexport interface TaskThreadDetail extends TaskThreadSummary {\n sessions: TaskSessionRecord[];\n decisions: TaskDecisionRecord[];\n events: TaskEventRecord[];\n artifacts: TaskArtifactRecord[];\n transcripts: TaskTranscriptRecord[];\n}\n\nexport interface CreateTaskThreadInput {\n id?: string;\n title: string;\n originalRequest: string;\n kind?: TaskThreadKind;\n roomId?: string | null;\n worldId?: string | null;\n ownerUserId?: string | null;\n summary?: string;\n acceptanceCriteria?: string[];\n currentPlan?: Record<string, unknown>;\n lastUserTurnAt?: string | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RegisterTaskSessionInput {\n threadId: string;\n sessionId: string;\n framework: CodingAgentType;\n label: string;\n originalTask: string;\n workdir: string;\n repo?: string;\n providerSource?: string | null;\n status?: TaskSessionStatus;\n decisionCount?: number;\n autoResolvedCount?: number;\n registeredAt?: number;\n lastActivityAt?: number;\n idleCheckCount?: number;\n taskDelivered?: boolean;\n completionSummary?: string | null;\n lastSeenDecisionIndex?: number;\n lastInputSentAt?: number | null;\n stoppedAt?: number | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateTaskSessionInput {\n status?: TaskSessionStatus;\n decisionCount?: number;\n autoResolvedCount?: number;\n lastActivityAt?: number;\n idleCheckCount?: number;\n taskDelivered?: boolean;\n completionSummary?: string | null;\n lastSeenDecisionIndex?: number;\n lastInputSentAt?: number | null;\n stoppedAt?: number | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RecordTaskDecisionInput {\n threadId: string;\n sessionId: string;\n timestamp: number;\n event: string;\n promptText: string;\n decision: string;\n response?: string;\n reasoning: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RecordTaskEventInput {\n threadId: string;\n sessionId?: string | null;\n eventType: TaskThreadEventType | string;\n timestamp?: number;\n summary?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface RecordTaskArtifactInput {\n threadId: string;\n sessionId?: string | null;\n artifactType: string;\n title: string;\n path?: string | null;\n uri?: string | null;\n mimeType?: string | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RecordTaskTranscriptInput {\n threadId: string;\n sessionId: string;\n timestamp?: number;\n direction: TaskTranscriptRecord[\"direction\"];\n content: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpsertPendingDecisionInput {\n sessionId: string;\n threadId: string;\n promptText: string;\n recentOutput: string;\n llmDecision: Record<string, unknown>;\n taskContext: Record<string, unknown>;\n createdAt?: number;\n}\n\nexport interface ListTaskThreadsOptions {\n includeArchived?: boolean;\n status?: TaskThreadStatus;\n search?: string;\n limit?: number;\n}\n\nfunction asObject(value: unknown): Row | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Row;\n}\n\nfunction toText(value: unknown, fallback = \"\"): string {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return fallback;\n return String(value);\n}\n\nfunction toNumber(value: unknown, fallback = 0): number {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\") {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return fallback;\n}\n\nfunction toNullableText(value: unknown): string | null {\n if (value === null || value === undefined || value === \"\") return null;\n return toText(value);\n}\n\nfunction toNullableNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === \"\") return null;\n const parsed = toNumber(value, Number.NaN);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction toBoolean(value: unknown, fallback = false): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) return true;\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) return false;\n }\n return fallback;\n}\n\nfunction parseJsonRecord(value: unknown): Record<string, unknown> {\n if (value === null || value === undefined || value === \"\") return {};\n if (typeof value !== \"string\") return asObject(value) ?? {};\n try {\n return asObject(JSON.parse(value)) ?? {};\n } catch {\n return {};\n }\n}\n\nfunction parseJsonArray(value: unknown): string[] {\n if (value === null || value === undefined || value === \"\") return [];\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === \"string\");\n }\n if (typeof value !== \"string\") return [];\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed)\n ? parsed.filter((entry): entry is string => typeof entry === \"string\")\n : [];\n } catch {\n return [];\n }\n}\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\nfunction sqlQuote(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction sqlText(value: string | null | undefined): string {\n if (value === null || value === undefined) return \"NULL\";\n return sqlQuote(value);\n}\n\nfunction sqlInteger(value: number | null | undefined): string {\n if (value === null || value === undefined) return \"NULL\";\n if (!Number.isFinite(value)) {\n throw new Error(\"invalid numeric SQL literal\");\n }\n return String(Math.trunc(value));\n}\n\nfunction sqlBoolean(value: boolean): string {\n return value ? \"TRUE\" : \"FALSE\";\n}\n\nfunction sqlJson(value: unknown): string {\n return sqlQuote(JSON.stringify(value ?? null));\n}\n\nfunction normalizeThreadStatus(value: unknown): TaskThreadStatus {\n switch (toText(value).toLowerCase()) {\n case \"active\":\n case \"waiting_on_user\":\n case \"blocked\":\n case \"validating\":\n case \"done\":\n case \"failed\":\n case \"archived\":\n case \"interrupted\":\n return toText(value).toLowerCase() as TaskThreadStatus;\n default:\n return \"open\";\n }\n}\n\nfunction normalizeSessionStatus(value: unknown): TaskSessionStatus {\n switch (toText(value).toLowerCase()) {\n case \"blocked\":\n case \"waiting_on_user\":\n case \"completed\":\n case \"stopped\":\n case \"error\":\n case \"tool_running\":\n case \"interrupted\":\n return toText(value).toLowerCase() as TaskSessionStatus;\n default:\n return \"active\";\n }\n}\n\nfunction extractRows(result: unknown): Row[] {\n if (Array.isArray(result)) {\n return result.map((row) => asObject(row)).filter((row): row is Row => row !== null);\n }\n const obj = asObject(result);\n if (!obj || !Array.isArray(obj.rows)) return [];\n return obj.rows\n .map((row) => asObject(row))\n .filter((row): row is Row => row !== null);\n}\n\nasync function getSqlRaw(): Promise<(query: string) => RawSqlQuery> {\n if (cachedSqlRaw) return cachedSqlRaw;\n const drizzle = (await import(\"drizzle-orm\")) as {\n sql: { raw: (query: string) => RawSqlQuery };\n };\n cachedSqlRaw = drizzle.sql.raw;\n return cachedSqlRaw;\n}\n\nfunction getRuntimeDb(runtime: IAgentRuntime): RuntimeDb {\n const runtimeLike = runtime as IAgentRuntime & {\n adapter?: { db?: RuntimeDb };\n databaseAdapter?: { db?: RuntimeDb };\n };\n const db = runtimeLike.adapter?.db ?? runtimeLike.databaseAdapter?.db;\n if (!db || typeof db.execute !== \"function\") {\n throw new Error(\"runtime database adapter unavailable\");\n }\n return db;\n}\n\nasync function executeRawSql(\n runtime: IAgentRuntime,\n sqlTextValue: string,\n): Promise<Row[]> {\n const raw = await getSqlRaw();\n const result = await getRuntimeDb(runtime).execute(raw(sqlTextValue));\n return extractRows(result);\n}\n\nfunction parseThreadRow(row: Row): TaskThreadRecord {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n roomId: toNullableText(row.room_id),\n worldId: toNullableText(row.world_id),\n ownerUserId: toNullableText(row.owner_user_id),\n title: toText(row.title),\n kind: (toText(row.kind, \"coding\") as TaskThreadKind),\n status: normalizeThreadStatus(row.status),\n originalRequest: toText(row.original_request),\n summary: toText(row.summary),\n acceptanceCriteria: parseJsonArray(row.acceptance_criteria_json),\n currentPlan: parseJsonRecord(row.current_plan_json),\n searchText: toText(row.search_text),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n closedAt: toNullableText(row.closed_at),\n archivedAt: toNullableText(row.archived_at),\n lastUserTurnAt: toNullableText(row.last_user_turn_at),\n lastCoordinatorTurnAt: toNullableText(row.last_coordinator_turn_at),\n metadata: parseJsonRecord(row.metadata_json),\n };\n}\n\nfunction parseThreadSummaryRow(row: Row): TaskThreadSummary {\n return {\n ...parseThreadRow(row),\n sessionCount: toNumber(row.session_count, 0),\n activeSessionCount: toNumber(row.active_session_count, 0),\n latestSessionId: toNullableText(row.latest_session_id),\n latestSessionLabel: toNullableText(row.latest_session_label),\n latestWorkdir: toNullableText(row.latest_workdir),\n latestRepo: toNullableText(row.latest_repo),\n latestActivityAt: toNullableNumber(row.latest_activity_at),\n decisionCount: toNumber(row.decision_count, 0),\n };\n}\n\nfunction parseSessionRow(row: Row): TaskSessionRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n agentId: toText(row.agent_id),\n sessionId: toText(row.session_id),\n framework: toText(row.framework, \"claude\") as CodingAgentType,\n providerSource: toNullableText(row.provider_source),\n label: toText(row.label),\n originalTask: toText(row.original_task),\n workdir: toText(row.workdir),\n repo: toNullableText(row.repo),\n status: normalizeSessionStatus(row.status),\n decisionCount: toNumber(row.decision_count, 0),\n autoResolvedCount: toNumber(row.auto_resolved_count, 0),\n registeredAt: toNumber(row.registered_at, 0),\n lastActivityAt: toNumber(row.last_activity_at, 0),\n idleCheckCount: toNumber(row.idle_check_count, 0),\n taskDelivered: toBoolean(row.task_delivered),\n completionSummary: toNullableText(row.completion_summary),\n lastSeenDecisionIndex: toNumber(row.last_seen_decision_index, 0),\n lastInputSentAt: toNullableNumber(row.last_input_sent_at),\n stoppedAt: toNullableNumber(row.stopped_at),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n metadata: parseJsonRecord(row.metadata_json),\n };\n}\n\nfunction parseDecisionRow(row: Row): TaskDecisionRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n sessionId: toText(row.session_id),\n timestamp: toNumber(row.timestamp, 0),\n event: toText(row.event_type),\n promptText: toText(row.prompt_text),\n decision: toText(row.decision),\n response: toNullableText(row.response),\n reasoning: toText(row.reasoning),\n metadata: parseJsonRecord(row.metadata_json),\n };\n}\n\nfunction parseEventRow(row: Row): TaskEventRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n sessionId: toNullableText(row.session_id),\n eventType: toText(row.event_type),\n timestamp: toNumber(row.timestamp, 0),\n summary: toText(row.summary),\n data: parseJsonRecord(row.data_json),\n createdAt: toText(row.created_at),\n };\n}\n\nfunction parseArtifactRow(row: Row): TaskArtifactRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n sessionId: toNullableText(row.session_id),\n artifactType: toText(row.artifact_type),\n title: toText(row.title),\n path: toNullableText(row.path),\n uri: toNullableText(row.uri),\n mimeType: toNullableText(row.mime_type),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n };\n}\n\nfunction parseTranscriptRow(row: Row): TaskTranscriptRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n sessionId: toText(row.session_id),\n timestamp: toNumber(row.timestamp, 0),\n direction: toText(row.direction) as TaskTranscriptRecord[\"direction\"],\n content: toText(row.content),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n };\n}\n\nfunction parsePendingDecisionRow(row: Row): TaskPendingDecisionRecord {\n return {\n sessionId: toText(row.session_id),\n threadId: toText(row.thread_id),\n promptText: toText(row.prompt_text),\n recentOutput: toText(row.recent_output),\n llmDecision: parseJsonRecord(row.llm_decision_json),\n taskContext: parseJsonRecord(row.task_context_json),\n createdAt: toNumber(row.created_at, 0),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction buildSearchText(parts: Array<string | null | undefined>): string {\n return parts\n .map((part) => (part ?? \"\").trim().toLowerCase())\n .filter(Boolean)\n .join(\" \");\n}\n\nexport class TaskRegistry {\n constructor(private readonly runtime: IAgentRuntime) {}\n\n private schemaKey(): object {\n const runtimeLike = this.runtime as IAgentRuntime & {\n adapter?: object;\n databaseAdapter?: object;\n };\n return (\n runtimeLike.adapter ??\n runtimeLike.databaseAdapter ??\n (this.runtime as unknown as object)\n );\n }\n\n async ensureSchema(): Promise<void> {\n const key = this.schemaKey();\n if (schemaReady.has(key)) return;\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_threads (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n room_id TEXT,\n world_id TEXT,\n owner_user_id TEXT,\n title TEXT NOT NULL,\n kind TEXT NOT NULL DEFAULT 'coding',\n status TEXT NOT NULL DEFAULT 'open',\n original_request TEXT NOT NULL,\n summary TEXT NOT NULL DEFAULT '',\n acceptance_criteria_json TEXT NOT NULL DEFAULT '[]',\n current_plan_json TEXT NOT NULL DEFAULT '{}',\n search_text TEXT NOT NULL DEFAULT '',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n closed_at TEXT,\n archived_at TEXT,\n last_user_turn_at TEXT,\n last_coordinator_turn_at TEXT,\n metadata_json TEXT NOT NULL DEFAULT '{}'\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_sessions (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n session_id TEXT NOT NULL UNIQUE,\n framework TEXT NOT NULL,\n provider_source TEXT,\n label TEXT NOT NULL,\n original_task TEXT NOT NULL,\n workdir TEXT NOT NULL,\n repo TEXT,\n status TEXT NOT NULL DEFAULT 'active',\n decision_count INTEGER NOT NULL DEFAULT 0,\n auto_resolved_count INTEGER NOT NULL DEFAULT 0,\n registered_at BIGINT NOT NULL,\n last_activity_at BIGINT NOT NULL,\n idle_check_count INTEGER NOT NULL DEFAULT 0,\n task_delivered BOOLEAN NOT NULL DEFAULT FALSE,\n completion_summary TEXT,\n last_seen_decision_index INTEGER NOT NULL DEFAULT 0,\n last_input_sent_at BIGINT,\n stopped_at BIGINT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n metadata_json TEXT NOT NULL DEFAULT '{}'\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_decisions (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n timestamp BIGINT NOT NULL,\n event_type TEXT NOT NULL,\n prompt_text TEXT NOT NULL DEFAULT '',\n decision TEXT NOT NULL,\n response TEXT,\n reasoning TEXT NOT NULL,\n metadata_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_events (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n session_id TEXT,\n event_type TEXT NOT NULL,\n timestamp BIGINT NOT NULL,\n summary TEXT NOT NULL DEFAULT '',\n data_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_artifacts (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n session_id TEXT,\n artifact_type TEXT NOT NULL,\n title TEXT NOT NULL,\n path TEXT,\n uri TEXT,\n mime_type TEXT,\n metadata_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_transcripts (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n timestamp BIGINT NOT NULL,\n direction TEXT NOT NULL,\n content TEXT NOT NULL,\n metadata_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_pending_decisions (\n session_id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n prompt_text TEXT NOT NULL,\n recent_output TEXT NOT NULL DEFAULT '',\n llm_decision_json TEXT NOT NULL DEFAULT '{}',\n task_context_json TEXT NOT NULL DEFAULT '{}',\n created_at BIGINT NOT NULL,\n updated_at TEXT NOT NULL\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_status\n ON orchestrator_task_threads(status)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_updated_at\n ON orchestrator_task_threads(updated_at)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_archived_at\n ON orchestrator_task_threads(archived_at)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_sessions_thread_id\n ON orchestrator_task_sessions(thread_id)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_sessions_status\n ON orchestrator_task_sessions(status)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_decisions_thread_id\n ON orchestrator_task_decisions(thread_id, timestamp DESC)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_events_thread_id\n ON orchestrator_task_events(thread_id, timestamp DESC)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_transcripts_thread_id\n ON orchestrator_task_transcripts(thread_id, timestamp DESC)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_pending_decisions_thread_id\n ON orchestrator_task_pending_decisions(thread_id)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_pending_decisions_created_at\n ON orchestrator_task_pending_decisions(created_at DESC)`,\n );\n\n schemaReady.add(key);\n }\n\n async recoverInterruptedTasks(): Promise<void> {\n await this.ensureSchema();\n const impactedSessions = await executeRawSql(\n this.runtime,\n `SELECT session_id, thread_id\n FROM orchestrator_task_sessions\n WHERE status IN ('active', 'blocked', 'tool_running')`,\n );\n if (impactedSessions.length === 0) return;\n\n const nowIso = isoNow();\n const now = Date.now();\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_sessions\n SET status = 'interrupted',\n updated_at = ${sqlQuote(nowIso)},\n stopped_at = COALESCE(stopped_at, ${sqlInteger(now)})\n WHERE status IN ('active', 'blocked', 'tool_running')`,\n );\n\n const affectedThreadIds = new Set<string>();\n for (const row of impactedSessions) {\n const sessionId = toText(row.session_id);\n const threadId = toText(row.thread_id);\n if (!threadId) continue;\n affectedThreadIds.add(threadId);\n await this.appendEvent({\n threadId,\n sessionId,\n eventType: \"session_interrupted\",\n timestamp: now,\n summary: \"Session interrupted by runtime restart or shutdown\",\n data: { reason: \"runtime_restart\" },\n });\n }\n\n for (const threadId of affectedThreadIds) {\n await this.recomputeThreadStatus(threadId);\n }\n }\n\n async createThread(input: CreateTaskThreadInput): Promise<TaskThreadRecord> {\n await this.ensureSchema();\n const id = input.id?.trim() || `task-${crypto.randomUUID()}`;\n const createdAt = isoNow();\n const acceptanceCriteria = input.acceptanceCriteria ?? [];\n const currentPlan = input.currentPlan ?? {};\n const summary = input.summary?.trim() ?? \"\";\n const searchText = buildSearchText([\n input.title,\n input.originalRequest,\n summary,\n input.metadata ? JSON.stringify(input.metadata) : \"\",\n ]);\n\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_threads (\n id, agent_id, room_id, world_id, owner_user_id, title, kind, status,\n original_request, summary, acceptance_criteria_json, current_plan_json,\n search_text, created_at, updated_at, closed_at, archived_at,\n last_user_turn_at, last_coordinator_turn_at, metadata_json\n ) VALUES (\n ${sqlQuote(id)},\n ${sqlQuote(this.runtime.agentId)},\n ${sqlText(input.roomId ?? null)},\n ${sqlText(input.worldId ?? null)},\n ${sqlText(input.ownerUserId ?? null)},\n ${sqlQuote(input.title.trim())},\n ${sqlQuote(input.kind ?? \"coding\")},\n 'open',\n ${sqlQuote(input.originalRequest)},\n ${sqlQuote(summary)},\n ${sqlJson(acceptanceCriteria)},\n ${sqlJson(currentPlan)},\n ${sqlQuote(searchText)},\n ${sqlQuote(createdAt)},\n ${sqlQuote(createdAt)},\n NULL,\n NULL,\n ${sqlText(input.lastUserTurnAt ?? createdAt)},\n NULL,\n ${sqlJson(input.metadata ?? {})}\n )`,\n );\n\n await this.appendEvent({\n threadId: id,\n eventType: \"task_created\",\n timestamp: Date.now(),\n summary: `Created task thread \"${input.title.trim()}\"`,\n data: {\n kind: input.kind ?? \"coding\",\n roomId: input.roomId ?? null,\n worldId: input.worldId ?? null,\n },\n });\n\n const created = await this.getThreadRecord(id);\n if (!created) {\n throw new Error(`Failed to create task thread ${id}`);\n }\n return created;\n }\n\n async getThreadRecord(threadId: string): Promise<TaskThreadRecord | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_threads\n WHERE id = ${sqlQuote(threadId)}\n LIMIT 1`,\n );\n return rows[0] ? parseThreadRow(rows[0]) : null;\n }\n\n async getThread(threadId: string): Promise<TaskThreadDetail | null> {\n await this.ensureSchema();\n const summary = await this.getThreadSummary(threadId);\n if (!summary) return null;\n\n const [sessions, decisions, events, artifacts, transcripts] = await Promise.all([\n this.listSessionsForThread(threadId),\n this.listDecisionsForThread(threadId),\n this.listEventsForThread(threadId),\n this.listArtifactsForThread(threadId),\n this.listTranscriptsForThread(threadId),\n ]);\n\n return {\n ...summary,\n sessions,\n decisions,\n events,\n artifacts,\n transcripts,\n };\n }\n\n async listThreads(\n options: ListTaskThreadsOptions = {},\n ): Promise<TaskThreadSummary[]> {\n await this.ensureSchema();\n const clauses: string[] = [];\n if (!options.includeArchived) {\n clauses.push(\"thread.archived_at IS NULL\");\n }\n if (options.status) {\n clauses.push(`thread.status = ${sqlQuote(options.status)}`);\n }\n if (options.search?.trim()) {\n const q = options.search.trim().toLowerCase();\n clauses.push(`thread.search_text LIKE ${sqlQuote(`%${q}%`)}`);\n }\n\n const whereClause =\n clauses.length > 0 ? `WHERE ${clauses.join(\" AND \")}` : \"\";\n const limitClause =\n typeof options.limit === \"number\" && options.limit > 0\n ? `LIMIT ${Math.trunc(options.limit)}`\n : \"\";\n\n const rows = await executeRawSql(\n this.runtime,\n `SELECT\n thread.*,\n COALESCE(session_counts.session_count, 0) AS session_count,\n COALESCE(session_counts.active_session_count, 0) AS active_session_count,\n latest.session_id AS latest_session_id,\n latest.label AS latest_session_label,\n latest.workdir AS latest_workdir,\n latest.repo AS latest_repo,\n latest.last_activity_at AS latest_activity_at,\n COALESCE(decision_counts.decision_count, 0) AS decision_count\n FROM orchestrator_task_threads AS thread\n LEFT JOIN (\n SELECT\n thread_id,\n COUNT(*) AS session_count,\n SUM(CASE WHEN status IN ('active', 'blocked', 'tool_running') THEN 1 ELSE 0 END) AS active_session_count\n FROM orchestrator_task_sessions\n GROUP BY thread_id\n ) AS session_counts\n ON session_counts.thread_id = thread.id\n LEFT JOIN (\n SELECT latest_session.thread_id,\n latest_session.session_id,\n latest_session.label,\n latest_session.workdir,\n latest_session.repo,\n latest_session.last_activity_at\n FROM orchestrator_task_sessions AS latest_session\n INNER JOIN (\n SELECT thread_id, MAX(last_activity_at) AS max_last_activity_at\n FROM orchestrator_task_sessions\n GROUP BY thread_id\n ) AS grouped\n ON grouped.thread_id = latest_session.thread_id\n AND grouped.max_last_activity_at = latest_session.last_activity_at\n ) AS latest\n ON latest.thread_id = thread.id\n LEFT JOIN (\n SELECT thread_id, COUNT(*) AS decision_count\n FROM orchestrator_task_decisions\n GROUP BY thread_id\n ) AS decision_counts\n ON decision_counts.thread_id = thread.id\n ${whereClause}\n ORDER BY thread.updated_at DESC\n ${limitClause}`,\n );\n\n return rows.map(parseThreadSummaryRow);\n }\n\n async getThreadSummary(threadId: string): Promise<TaskThreadSummary | null> {\n const rows = await this.listThreads({\n includeArchived: true,\n });\n return rows.find((row) => row.id === threadId) ?? null;\n }\n\n async findThreadIdBySessionId(sessionId: string): Promise<string | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT thread_id\n FROM orchestrator_task_sessions\n WHERE session_id = ${sqlQuote(sessionId)}\n LIMIT 1`,\n );\n return rows[0] ? toText(rows[0].thread_id) : null;\n }\n\n async getSession(sessionId: string): Promise<TaskSessionRecord | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_sessions\n WHERE session_id = ${sqlQuote(sessionId)}\n LIMIT 1`,\n );\n return rows[0] ? parseSessionRow(rows[0]) : null;\n }\n\n async registerSession(input: RegisterTaskSessionInput): Promise<void> {\n await this.ensureSchema();\n const nowIso = isoNow();\n const registeredAt = input.registeredAt ?? Date.now();\n const lastActivityAt = input.lastActivityAt ?? registeredAt;\n const existingThread = await this.getThreadRecord(input.threadId);\n if (!existingThread) {\n throw new Error(`Task thread ${input.threadId} not found`);\n }\n\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_sessions (\n id, thread_id, agent_id, session_id, framework, provider_source, label,\n original_task, workdir, repo, status, decision_count, auto_resolved_count,\n registered_at, last_activity_at, idle_check_count, task_delivered,\n completion_summary, last_seen_decision_index, last_input_sent_at, stopped_at,\n created_at, updated_at, metadata_json\n ) VALUES (\n ${sqlQuote(input.sessionId)},\n ${sqlQuote(input.threadId)},\n ${sqlQuote(this.runtime.agentId)},\n ${sqlQuote(input.sessionId)},\n ${sqlQuote(input.framework)},\n ${sqlText(input.providerSource ?? null)},\n ${sqlQuote(input.label)},\n ${sqlQuote(input.originalTask)},\n ${sqlQuote(input.workdir)},\n ${sqlText(input.repo ?? null)},\n ${sqlQuote(input.status ?? \"active\")},\n ${sqlInteger(input.decisionCount ?? 0)},\n ${sqlInteger(input.autoResolvedCount ?? 0)},\n ${sqlInteger(registeredAt)},\n ${sqlInteger(lastActivityAt)},\n ${sqlInteger(input.idleCheckCount ?? 0)},\n ${sqlBoolean(input.taskDelivered ?? false)},\n ${sqlText(input.completionSummary ?? null)},\n ${sqlInteger(input.lastSeenDecisionIndex ?? 0)},\n ${sqlInteger(input.lastInputSentAt ?? null)},\n ${sqlInteger(input.stoppedAt ?? null)},\n ${sqlQuote(nowIso)},\n ${sqlQuote(nowIso)},\n ${sqlJson(input.metadata ?? {})}\n )\n ON CONFLICT(id) DO UPDATE SET\n thread_id = EXCLUDED.thread_id,\n framework = EXCLUDED.framework,\n provider_source = EXCLUDED.provider_source,\n label = EXCLUDED.label,\n original_task = EXCLUDED.original_task,\n workdir = EXCLUDED.workdir,\n repo = EXCLUDED.repo,\n status = EXCLUDED.status,\n decision_count = EXCLUDED.decision_count,\n auto_resolved_count = EXCLUDED.auto_resolved_count,\n registered_at = EXCLUDED.registered_at,\n last_activity_at = EXCLUDED.last_activity_at,\n idle_check_count = EXCLUDED.idle_check_count,\n task_delivered = EXCLUDED.task_delivered,\n completion_summary = EXCLUDED.completion_summary,\n last_seen_decision_index = EXCLUDED.last_seen_decision_index,\n last_input_sent_at = EXCLUDED.last_input_sent_at,\n stopped_at = EXCLUDED.stopped_at,\n updated_at = EXCLUDED.updated_at,\n metadata_json = EXCLUDED.metadata_json`,\n );\n\n await this.appendEvent({\n threadId: input.threadId,\n sessionId: input.sessionId,\n eventType: \"session_registered\",\n timestamp: registeredAt,\n summary: `Registered session \"${input.label}\"`,\n data: {\n framework: input.framework,\n repo: input.repo ?? null,\n workdir: input.workdir,\n },\n });\n\n await this.recomputeThreadStatus(input.threadId);\n }\n\n async updateSession(\n sessionId: string,\n patch: UpdateTaskSessionInput,\n ): Promise<void> {\n await this.ensureSchema();\n const threadId = await this.findThreadIdBySessionId(sessionId);\n if (!threadId) return;\n const existingRows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_sessions\n WHERE session_id = ${sqlQuote(sessionId)}\n LIMIT 1`,\n );\n if (!existingRows[0]) return;\n const existing = parseSessionRow(existingRows[0]);\n const nextMeta = patch.metadata\n ? { ...existing.metadata, ...patch.metadata }\n : existing.metadata;\n const nowIso = isoNow();\n\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_sessions\n SET status = ${sqlQuote(patch.status ?? existing.status)},\n decision_count = ${sqlInteger(\n patch.decisionCount ?? existing.decisionCount,\n )},\n auto_resolved_count = ${sqlInteger(\n patch.autoResolvedCount ?? existing.autoResolvedCount,\n )},\n last_activity_at = ${sqlInteger(\n patch.lastActivityAt ?? existing.lastActivityAt,\n )},\n idle_check_count = ${sqlInteger(\n patch.idleCheckCount ?? existing.idleCheckCount,\n )},\n task_delivered = ${sqlBoolean(\n patch.taskDelivered ?? existing.taskDelivered,\n )},\n completion_summary = ${sqlText(\n patch.completionSummary ?? existing.completionSummary,\n )},\n last_seen_decision_index = ${sqlInteger(\n patch.lastSeenDecisionIndex ?? existing.lastSeenDecisionIndex,\n )},\n last_input_sent_at = ${sqlInteger(\n patch.lastInputSentAt ?? existing.lastInputSentAt,\n )},\n stopped_at = ${sqlInteger(patch.stoppedAt ?? existing.stoppedAt)},\n updated_at = ${sqlQuote(nowIso)},\n metadata_json = ${sqlJson(nextMeta)}\n WHERE session_id = ${sqlQuote(sessionId)}`,\n );\n\n await this.appendEvent({\n threadId,\n sessionId,\n eventType: \"session_updated\",\n timestamp: patch.lastActivityAt ?? Date.now(),\n summary: `Updated session \"${existing.label}\"`,\n data: {\n status: patch.status ?? existing.status,\n decisionCount: patch.decisionCount ?? existing.decisionCount,\n autoResolvedCount:\n patch.autoResolvedCount ?? existing.autoResolvedCount,\n },\n });\n\n await this.recomputeThreadStatus(threadId);\n }\n\n async recordDecision(input: RecordTaskDecisionInput): Promise<void> {\n await this.ensureSchema();\n const createdAt = isoNow();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_decisions (\n id, thread_id, session_id, timestamp, event_type, prompt_text, decision,\n response, reasoning, metadata_json, created_at\n ) VALUES (\n ${sqlQuote(`decision-${crypto.randomUUID()}`)},\n ${sqlQuote(input.threadId)},\n ${sqlQuote(input.sessionId)},\n ${sqlInteger(input.timestamp)},\n ${sqlQuote(input.event)},\n ${sqlQuote(input.promptText)},\n ${sqlQuote(input.decision)},\n ${sqlText(input.response ?? null)},\n ${sqlQuote(input.reasoning)},\n ${sqlJson(input.metadata ?? {})},\n ${sqlQuote(createdAt)}\n )`,\n );\n\n await this.appendEvent({\n threadId: input.threadId,\n sessionId: input.sessionId,\n eventType: \"decision_recorded\",\n timestamp: input.timestamp,\n summary: `${input.decision} decision recorded`,\n data: {\n event: input.event,\n promptText: input.promptText,\n response: input.response ?? null,\n },\n });\n }\n\n async appendEvent(input: RecordTaskEventInput): Promise<void> {\n await this.ensureSchema();\n const createdAt = isoNow();\n const timestamp = input.timestamp ?? Date.now();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_events (\n id, thread_id, session_id, event_type, timestamp, summary, data_json, created_at\n ) VALUES (\n ${sqlQuote(`event-${crypto.randomUUID()}`)},\n ${sqlQuote(input.threadId)},\n ${sqlText(input.sessionId ?? null)},\n ${sqlQuote(input.eventType)},\n ${sqlInteger(timestamp)},\n ${sqlQuote(input.summary ?? \"\")},\n ${sqlJson(input.data ?? {})},\n ${sqlQuote(createdAt)}\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET updated_at = ${sqlQuote(createdAt)}\n WHERE id = ${sqlQuote(input.threadId)}`,\n );\n }\n\n async recordArtifact(input: RecordTaskArtifactInput): Promise<void> {\n await this.ensureSchema();\n const createdAt = isoNow();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_artifacts (\n id, thread_id, session_id, artifact_type, title, path, uri, mime_type, metadata_json, created_at\n ) VALUES (\n ${sqlQuote(`artifact-${crypto.randomUUID()}`)},\n ${sqlQuote(input.threadId)},\n ${sqlText(input.sessionId ?? null)},\n ${sqlQuote(input.artifactType)},\n ${sqlQuote(input.title)},\n ${sqlText(input.path ?? null)},\n ${sqlText(input.uri ?? null)},\n ${sqlText(input.mimeType ?? null)},\n ${sqlJson(input.metadata ?? {})},\n ${sqlQuote(createdAt)}\n )`,\n );\n\n await this.appendEvent({\n threadId: input.threadId,\n sessionId: input.sessionId ?? null,\n eventType: \"artifact_recorded\",\n summary: `Recorded ${input.artifactType} artifact`,\n data: {\n artifactType: input.artifactType,\n title: input.title,\n path: input.path ?? null,\n uri: input.uri ?? null,\n },\n });\n }\n\n async recordTranscript(input: RecordTaskTranscriptInput): Promise<void> {\n await this.ensureSchema();\n const createdAt = isoNow();\n const timestamp = input.timestamp ?? Date.now();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_transcripts (\n id, thread_id, session_id, timestamp, direction, content, metadata_json, created_at\n ) VALUES (\n ${sqlQuote(`transcript-${crypto.randomUUID()}`)},\n ${sqlQuote(input.threadId)},\n ${sqlQuote(input.sessionId)},\n ${sqlInteger(timestamp)},\n ${sqlQuote(input.direction)},\n ${sqlQuote(input.content)},\n ${sqlJson(input.metadata ?? {})},\n ${sqlQuote(createdAt)}\n )`,\n );\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET updated_at = ${sqlQuote(createdAt)}\n WHERE id = ${sqlQuote(input.threadId)}`,\n );\n }\n\n async updateThreadSummary(\n threadId: string,\n summary: string,\n ): Promise<void> {\n await this.ensureSchema();\n const thread = await this.getThreadRecord(threadId);\n if (!thread) return;\n const nextSearchText = buildSearchText([\n thread.title,\n thread.originalRequest,\n summary,\n thread.searchText,\n ]);\n const nowIso = isoNow();\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET summary = ${sqlQuote(summary)},\n search_text = ${sqlQuote(nextSearchText)},\n updated_at = ${sqlQuote(nowIso)}\n WHERE id = ${sqlQuote(threadId)}`,\n );\n await this.appendEvent({\n threadId,\n eventType: \"summary_updated\",\n summary: \"Updated task summary\",\n data: { summary },\n });\n }\n\n async archiveThread(threadId: string): Promise<void> {\n await this.ensureSchema();\n const nowIso = isoNow();\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET status = 'archived',\n archived_at = ${sqlQuote(nowIso)},\n closed_at = COALESCE(closed_at, ${sqlQuote(nowIso)}),\n updated_at = ${sqlQuote(nowIso)}\n WHERE id = ${sqlQuote(threadId)}`,\n );\n await this.appendEvent({\n threadId,\n eventType: \"task_archived\",\n summary: \"Archived task thread\",\n data: {},\n });\n }\n\n async reopenThread(threadId: string): Promise<void> {\n await this.ensureSchema();\n const nowIso = isoNow();\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET status = 'open',\n archived_at = NULL,\n closed_at = NULL,\n updated_at = ${sqlQuote(nowIso)}\n WHERE id = ${sqlQuote(threadId)}`,\n );\n await this.appendEvent({\n threadId,\n eventType: \"task_reopened\",\n summary: \"Reopened task thread\",\n data: {},\n });\n await this.recomputeThreadStatus(threadId);\n }\n\n async upsertPendingDecision(\n input: UpsertPendingDecisionInput,\n ): Promise<void> {\n await this.ensureSchema();\n const createdAt = input.createdAt ?? Date.now();\n const nowIso = isoNow();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_pending_decisions (\n session_id,\n thread_id,\n prompt_text,\n recent_output,\n llm_decision_json,\n task_context_json,\n created_at,\n updated_at\n ) VALUES (\n ${sqlQuote(input.sessionId)},\n ${sqlQuote(input.threadId)},\n ${sqlQuote(input.promptText)},\n ${sqlQuote(input.recentOutput)},\n ${sqlJson(input.llmDecision)},\n ${sqlJson(input.taskContext)},\n ${sqlInteger(createdAt)},\n ${sqlQuote(nowIso)}\n )\n ON CONFLICT(session_id) DO UPDATE SET\n thread_id = EXCLUDED.thread_id,\n prompt_text = EXCLUDED.prompt_text,\n recent_output = EXCLUDED.recent_output,\n llm_decision_json = EXCLUDED.llm_decision_json,\n task_context_json = EXCLUDED.task_context_json,\n created_at = EXCLUDED.created_at,\n updated_at = EXCLUDED.updated_at`,\n );\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET updated_at = ${sqlQuote(nowIso)}\n WHERE id = ${sqlQuote(input.threadId)}`,\n );\n }\n\n async deletePendingDecision(sessionId: string): Promise<void> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT thread_id\n FROM orchestrator_task_pending_decisions\n WHERE session_id = ${sqlQuote(sessionId)}\n LIMIT 1`,\n );\n if (rows.length === 0) return;\n const threadId = toText(rows[0]?.thread_id);\n await executeRawSql(\n this.runtime,\n `DELETE FROM orchestrator_task_pending_decisions\n WHERE session_id = ${sqlQuote(sessionId)}`,\n );\n if (threadId) {\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET updated_at = ${sqlQuote(isoNow())}\n WHERE id = ${sqlQuote(threadId)}`,\n );\n }\n }\n\n async listPendingDecisions(): Promise<TaskPendingDecisionRecord[]> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_pending_decisions\n ORDER BY created_at ASC`,\n );\n return rows.map(parsePendingDecisionRow);\n }\n\n async getLastUsedRepo(): Promise<string | undefined> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT repo\n FROM orchestrator_task_sessions\n WHERE repo IS NOT NULL AND repo <> ''\n ORDER BY last_activity_at DESC\n LIMIT 1`,\n );\n return rows[0] ? toText(rows[0].repo) : undefined;\n }\n\n async listSessionsForThread(threadId: string): Promise<TaskSessionRecord[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_sessions\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY registered_at ASC`,\n );\n return rows.map(parseSessionRow);\n }\n\n async listDecisionsForThread(threadId: string): Promise<TaskDecisionRecord[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_decisions\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY timestamp ASC`,\n );\n return rows.map(parseDecisionRow);\n }\n\n async listDecisionsForSession(\n sessionId: string,\n ): Promise<TaskDecisionRecord[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_decisions\n WHERE session_id = ${sqlQuote(sessionId)}\n ORDER BY timestamp ASC`,\n );\n return rows.map(parseDecisionRow);\n }\n\n async listEventsForThread(threadId: string): Promise<TaskEventRecord[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_events\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY timestamp ASC`,\n );\n return rows.map(parseEventRow);\n }\n\n async listArtifactsForThread(\n threadId: string,\n ): Promise<TaskArtifactRecord[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_artifacts\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseArtifactRow);\n }\n\n async listTranscriptsForThread(\n threadId: string,\n ): Promise<TaskTranscriptRecord[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_transcripts\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY timestamp ASC`,\n );\n return rows.map(parseTranscriptRow);\n }\n\n private async recomputeThreadStatus(threadId: string): Promise<void> {\n await this.ensureSchema();\n const thread = await this.getThreadRecord(threadId);\n if (!thread) return;\n if (thread.archivedAt) return;\n\n const sessions = await this.listSessionsForThread(threadId);\n const nowIso = isoNow();\n let nextStatus: TaskThreadStatus = \"open\";\n let closedAt: string | null = null;\n\n const activeCount = sessions.filter((session) =>\n [\"active\", \"tool_running\"].includes(session.status),\n ).length;\n const waitingOnUserCount = sessions.filter(\n (session) => session.status === \"waiting_on_user\",\n ).length;\n const blockedCount = sessions.filter((session) => session.status === \"blocked\").length;\n const interruptedCount = sessions.filter((session) =>\n [\"interrupted\", \"stopped\"].includes(session.status),\n ).length;\n const errorCount = sessions.filter((session) => session.status === \"error\").length;\n const completedCount = sessions.filter(\n (session) => session.status === \"completed\",\n ).length;\n\n if (sessions.length === 0) {\n nextStatus = \"open\";\n } else if (activeCount > 0) {\n nextStatus = \"active\";\n } else if (waitingOnUserCount > 0) {\n nextStatus = \"waiting_on_user\";\n } else if (blockedCount > 0) {\n nextStatus = \"blocked\";\n } else if (interruptedCount > 0) {\n nextStatus = \"interrupted\";\n closedAt = nowIso;\n } else if (completedCount === sessions.length) {\n nextStatus = \"done\";\n closedAt = nowIso;\n } else if (errorCount > 0) {\n nextStatus = \"failed\";\n closedAt = nowIso;\n }\n\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET status = ${sqlQuote(nextStatus)},\n closed_at = ${sqlText(closedAt)},\n updated_at = ${sqlQuote(nowIso)}\n WHERE id = ${sqlQuote(threadId)}`,\n );\n }\n}\n",
|
|
56
|
-
"/**\n * Swarm Coordinator — Idle Watchdog\n *\n * Extracted from swarm-coordinator.ts for modularity.\n * Scans active sessions for idle ones and asks the LLM to assess their state.\n *\n * @module services/swarm-idle-watchdog\n */\n\nimport { ModelType } from \"@elizaos/core\";\nimport { cleanForChat, stripAnsi } from \"./ansi-utils.js\";\nimport type {\n SwarmCoordinatorContext,\n TaskContext,\n} from \"./swarm-coordinator.js\";\nimport {\n buildIdleCheckPrompt,\n type CoordinationLLMResponse,\n type DecisionHistoryEntry,\n parseCoordinationResponse,\n type SharedDecision,\n type SiblingTaskSummary,\n type TaskContextSummary,\n} from \"./swarm-coordinator-prompts.js\";\nimport { checkAllTasksComplete, executeDecision } from \"./swarm-decision-loop.js\";\nimport { withTrajectoryContext } from \"./trajectory-context.js\";\n\n// ─── Constants ───\n\n/** How long a session can be idle before the watchdog checks on it (ms). */\nexport const IDLE_THRESHOLD_MS = 5 * 60 * 1000; // 5 minutes\n\n/** Max idle checks before force-escalating a session. */\nexport const MAX_IDLE_CHECKS = 4;\n\n// ─── Idle Watchdog ───\n\n/**\n * Scan all active sessions for idle ones. Called periodically by the watchdog timer.\n */\nexport async function scanIdleSessions(\n ctx: SwarmCoordinatorContext,\n): Promise<void> {\n const now = Date.now();\n for (const taskCtx of ctx.tasks.values()) {\n if (taskCtx.status !== \"active\" && taskCtx.status !== \"tool_running\") {\n continue;\n }\n\n // Liveness check: if the PTY session no longer exists in the worker\n // (e.g. parent process was SIGKILL'd and restarted), mark it dead.\n if (ctx.ptyService) {\n const session = ctx.ptyService.getSession(taskCtx.sessionId);\n if (!session) {\n ctx.log(\n `Idle watchdog: \"${taskCtx.label}\" — PTY session no longer exists, marking as stopped`,\n );\n taskCtx.status = \"stopped\";\n taskCtx.stoppedAt = now;\n await ctx.recordDecision(taskCtx, {\n timestamp: now,\n event: \"idle_watchdog\",\n promptText: \"PTY session no longer exists\",\n decision: \"stopped\",\n reasoning: \"Underlying PTY process is gone (likely killed during restart)\",\n });\n ctx.broadcast({\n type: \"stopped\",\n sessionId: taskCtx.sessionId,\n timestamp: now,\n data: { reason: \"pty_session_gone\" },\n });\n ctx.sendChatMessage(\n `[${taskCtx.label}] Session lost — the agent process is no longer running (likely killed during a restart).`,\n \"coding-agent\",\n );\n checkAllTasksComplete(ctx);\n continue;\n }\n }\n\n const idleMs = now - taskCtx.lastActivityAt;\n if (idleMs < IDLE_THRESHOLD_MS) continue;\n\n // Skip if already checking this session\n if (ctx.inFlightDecisions.has(taskCtx.sessionId)) continue;\n\n // Check if PTY output has changed since last scan — if data is flowing,\n // the session is active even without named events (e.g. loading spinners).\n // Compare stripped output to ignore TUI cursor movements and redraws\n // that would otherwise fool the watchdog into thinking the session is active.\n if (ctx.ptyService) {\n try {\n const rawOutput = await ctx.ptyService.getSessionOutput(\n taskCtx.sessionId,\n 20,\n );\n const currentOutput = stripAnsi(rawOutput).trim();\n const lastSeen = ctx.lastSeenOutput.get(taskCtx.sessionId) ?? \"\";\n ctx.lastSeenOutput.set(taskCtx.sessionId, currentOutput);\n if (currentOutput !== lastSeen) {\n // Output changed — session is producing data, reset idle state\n taskCtx.lastActivityAt = now;\n taskCtx.idleCheckCount = 0;\n ctx.log(\n `Idle watchdog: \"${taskCtx.label}\" has fresh PTY output — not idle`,\n );\n continue;\n }\n } catch {\n // Can't read output — proceed with idle check\n }\n }\n\n taskCtx.idleCheckCount++;\n const idleMinutes = Math.round(idleMs / 60_000);\n ctx.log(\n `Idle watchdog: \"${taskCtx.label}\" idle for ${idleMinutes}m (check ${taskCtx.idleCheckCount}/${MAX_IDLE_CHECKS})`,\n );\n\n if (taskCtx.idleCheckCount >= MAX_IDLE_CHECKS) {\n // Force-stop — too many idle checks with no resolution\n ctx.log(\n `Idle watchdog: force-stopping \"${taskCtx.label}\" after ${MAX_IDLE_CHECKS} checks`,\n );\n taskCtx.status = \"stopped\";\n taskCtx.stoppedAt = now;\n await ctx.recordDecision(taskCtx, {\n timestamp: now,\n event: \"idle_watchdog\",\n promptText: `Session idle for ${idleMinutes} minutes`,\n decision: \"stopped\",\n reasoning: `Force-stopped after ${MAX_IDLE_CHECKS} idle checks with no activity`,\n });\n ctx.broadcast({\n type: \"stopped\",\n sessionId: taskCtx.sessionId,\n timestamp: now,\n data: {\n reason: \"idle_watchdog_max_checks\",\n idleMinutes,\n idleCheckCount: taskCtx.idleCheckCount,\n },\n });\n ctx.sendChatMessage(\n `[${taskCtx.label}] Session stopped — idle for ${idleMinutes} minutes with no progress.`,\n \"coding-agent\",\n );\n // Force-kill the PTY session — idle timeout means nothing to save.\n if (ctx.ptyService) {\n try {\n await ctx.ptyService.stopSession(taskCtx.sessionId, /* force */ true);\n } catch (err) {\n ctx.log(`Idle watchdog: failed to stop session ${taskCtx.sessionId}: ${err}`);\n taskCtx.status = \"error\";\n await ctx.syncTaskContext(taskCtx);\n ctx.broadcast({\n type: \"error\",\n sessionId: taskCtx.sessionId,\n timestamp: now,\n data: { message: `Failed to stop idle session: ${err}` },\n });\n }\n }\n // Check if all tasks are now done\n checkAllTasksComplete(ctx);\n continue;\n }\n\n // Ask the LLM what's going on\n await handleIdleCheck(ctx, taskCtx, idleMinutes);\n }\n}\n\n/**\n * Handle an idle session by asking the LLM to assess its state.\n */\nexport async function handleIdleCheck(\n ctx: SwarmCoordinatorContext,\n taskCtx: TaskContext,\n idleMinutes: number,\n): Promise<void> {\n const sessionId = taskCtx.sessionId;\n ctx.inFlightDecisions.add(sessionId);\n try {\n let recentOutput = \"\";\n if (ctx.ptyService) {\n try {\n const raw = await ctx.ptyService.getSessionOutput(sessionId, 50);\n recentOutput = cleanForChat(raw);\n } catch {\n recentOutput = \"\";\n }\n }\n\n const contextSummary: TaskContextSummary = {\n sessionId,\n agentType: taskCtx.agentType,\n label: taskCtx.label,\n originalTask: taskCtx.originalTask,\n workdir: taskCtx.workdir,\n };\n\n const decisionHistory: DecisionHistoryEntry[] = taskCtx.decisions\n .filter((d) => d.decision !== \"auto_resolved\")\n .slice(-5)\n .map((d) => ({\n event: d.event,\n promptText: d.promptText,\n action: d.decision,\n response: d.response,\n reasoning: d.reasoning,\n }));\n\n const siblings: SiblingTaskSummary[] = [];\n for (const [sid, task] of ctx.tasks) {\n if (sid === sessionId) continue;\n siblings.push({\n label: task.label,\n agentType: task.agentType,\n originalTask: task.originalTask,\n status: task.status,\n });\n }\n\n const prompt = buildIdleCheckPrompt(\n contextSummary,\n recentOutput,\n idleMinutes,\n taskCtx.idleCheckCount,\n MAX_IDLE_CHECKS,\n decisionHistory,\n siblings,\n ctx.sharedDecisions,\n ctx.getSwarmContext(),\n );\n\n let decision: CoordinationLLMResponse | null = null;\n try {\n const result = await withTrajectoryContext(\n ctx.runtime,\n {\n source: \"orchestrator\",\n decisionType: \"idle-check\",\n sessionId,\n taskLabel: taskCtx.label,\n repo: taskCtx.repo,\n workdir: taskCtx.workdir,\n originalTask: taskCtx.originalTask,\n },\n () => ctx.runtime.useModel(ModelType.TEXT_SMALL, { prompt }),\n );\n decision = parseCoordinationResponse(result);\n } catch (err) {\n ctx.log(`Idle check LLM call failed: ${err}`);\n }\n\n if (!decision) {\n ctx.log(\n `Idle check for \"${taskCtx.label}\": LLM returned invalid response — escalating`,\n );\n ctx.sendChatMessage(\n `[${taskCtx.label}] Session idle for ${idleMinutes}m — couldn't determine status. Needs your attention.`,\n \"coding-agent\",\n );\n return;\n }\n\n // Record the decision\n await ctx.recordDecision(taskCtx, {\n timestamp: Date.now(),\n event: \"idle_watchdog\",\n promptText: `Session idle for ${idleMinutes} minutes`,\n decision: decision.action,\n response:\n decision.action === \"respond\"\n ? decision.useKeys\n ? `keys:${decision.keys?.join(\",\")}`\n : decision.response\n : undefined,\n reasoning: decision.reasoning,\n });\n\n ctx.broadcast({\n type: \"idle_check_decision\",\n sessionId,\n timestamp: Date.now(),\n data: {\n action: decision.action,\n idleMinutes,\n idleCheckNumber: taskCtx.idleCheckCount,\n reasoning: decision.reasoning,\n },\n });\n\n // Send chat message\n if (decision.action === \"complete\") {\n // executeDecision handles chat + stop for \"complete\"\n } else if (decision.action === \"respond\") {\n const actionDesc = decision.useKeys\n ? `Sent keys: ${decision.keys?.join(\", \")}`\n : `Nudged: ${decision.response ?? \"\"}`;\n ctx.log(`[${taskCtx.label}] Idle for ${idleMinutes}m — ${actionDesc}`);\n } else if (decision.action === \"escalate\") {\n ctx.sendChatMessage(\n `[${taskCtx.label}] Idle for ${idleMinutes}m — needs your attention: ${decision.reasoning}`,\n \"coding-agent\",\n );\n } else if (decision.action === \"ignore\") {\n ctx.log(\n `Idle check for \"${taskCtx.label}\": LLM says still working — ${decision.reasoning}`,\n );\n }\n\n await executeDecision(ctx, sessionId, decision);\n } finally {\n ctx.inFlightDecisions.delete(sessionId);\n }\n}\n",
|
|
57
|
-
"/**\n * Debug PTY Capture — optional session recording for offline analysis.\n *\n * Activated by setting `PARALLAX_DEBUG_CAPTURE=1`. When enabled, all PTY\n * output and stdin are recorded per-session using `pty-state-capture`.\n * Capture files persist in `.parallax/pty-captures/<sessionId>/` after\n * the agent session is killed, enabling post-mortem analysis of state\n * transitions, stall classifications, and coordinator timing.\n *\n * The `pty-state-capture` package is dynamically imported — if not\n * installed, capture is silently disabled. This means it can stay out\n * of production dependencies entirely.\n *\n * @module services/debug-capture\n */\n\nimport { logger } from \"@elizaos/core\";\n\n/** Re-export the types we use so callers don't need to import pty-state-capture directly. */\ninterface CaptureManagerLike {\n openSession(\n sessionId: string,\n overrides?: { source?: string },\n ): Promise<unknown>;\n feed(\n sessionId: string,\n chunk: string,\n direction?: \"stdout\" | \"stderr\" | \"stdin\",\n ): Promise<unknown>;\n lifecycle(\n sessionId: string,\n event: string,\n detail?: string,\n ): Promise<void>;\n snapshot(sessionId: string): unknown | null;\n}\n\nlet captureManager: CaptureManagerLike | null = null;\nlet initAttempted = false;\n\n/**\n * Returns true if debug capture is enabled via environment variable.\n */\nexport function isDebugCaptureEnabled(): boolean {\n return process.env.PARALLAX_DEBUG_CAPTURE === \"1\";\n}\n\n/**\n * Lazily initialize the capture manager. Returns null if:\n * - PARALLAX_DEBUG_CAPTURE is not set to \"1\"\n * - pty-state-capture is not installed\n * - Initialization fails for any reason\n */\nasync function ensureCaptureManager(): Promise<CaptureManagerLike | null> {\n if (captureManager) return captureManager;\n if (initAttempted) return null;\n initAttempted = true;\n\n if (!isDebugCaptureEnabled()) return null;\n\n try {\n const mod = await import(\"pty-state-capture\");\n const { PTYStateCaptureManager } = mod;\n captureManager = new PTYStateCaptureManager({\n outputRootDir: \".parallax/pty-captures\",\n defaultRows: 80,\n defaultCols: 220,\n });\n logger.info(\"[debug-capture] PTY state capture enabled — writing to .parallax/pty-captures/\");\n return captureManager;\n } catch {\n logger.debug(\"[debug-capture] pty-state-capture not available — capture disabled\");\n return null;\n }\n}\n\n/**\n * Open a capture session for a PTY session. Call this when spawning.\n */\nexport async function captureSessionOpen(\n sessionId: string,\n agentType: string,\n): Promise<void> {\n const mgr = await ensureCaptureManager();\n if (!mgr) return;\n try {\n await mgr.openSession(sessionId, { source: agentType });\n } catch (err) {\n logger.debug(`[debug-capture] Failed to open session ${sessionId}: ${err}`);\n }\n}\n\n/**\n * Feed PTY output data to the capture. Call this on every data chunk.\n */\nexport async function captureFeed(\n sessionId: string,\n chunk: string,\n direction: \"stdout\" | \"stderr\" | \"stdin\" = \"stdout\",\n): Promise<void> {\n if (!captureManager) return;\n try {\n await captureManager.feed(sessionId, chunk, direction);\n } catch (err) {\n logger.debug(`[debug-capture] Feed error for ${sessionId}: ${err}`);\n }\n}\n\n/**\n * Record a lifecycle event (session_ready, session_stopped, etc.).\n */\nexport async function captureLifecycle(\n sessionId: string,\n event: \"session_started\" | \"session_ready\" | \"session_stopped\" | \"session_error\",\n detail?: string,\n): Promise<void> {\n if (!captureManager) return;\n try {\n await captureManager.lifecycle(sessionId, event, detail);\n } catch (err) {\n logger.debug(`[debug-capture] Lifecycle error for ${sessionId}: ${err}`);\n }\n}\n\n/**\n * Get a snapshot of a capture session's current state.\n */\nexport function captureSnapshot(sessionId: string): unknown | null {\n if (!captureManager) return null;\n try {\n return captureManager.snapshot(sessionId);\n } catch (err) {\n logger.debug(`[debug-capture] Snapshot error for ${sessionId}: ${err}`);\n return null;\n }\n}\n\n/** @internal Reset module state for testing only. */\nexport function _resetForTesting(): void {\n captureManager = null;\n initAttempted = false;\n}\n",
|
|
57
|
+
"/**\n * Task-agent framework discovery and preference resolution.\n *\n * Detects installed CLIs, available auth, and Milady subscription preferences so\n * the orchestrator can choose the best framework when the caller does not\n * specify one explicitly.\n *\n * @module services/task-agent-frameworks\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport type { PreflightResult } from \"coding-agent-adapters\";\nimport { readConfigCloudKey, readConfigEnvKey } from \"./config-env.js\";\n\nexport type SupportedTaskAgentAdapter = \"claude\" | \"codex\" | \"gemini\" | \"aider\";\nexport type TaskAgentFrameworkId = SupportedTaskAgentAdapter | \"pi\";\n\nexport interface TaskAgentFrameworkAvailability {\n id: TaskAgentFrameworkId;\n label: string;\n installed: boolean;\n authReady: boolean;\n subscriptionReady: boolean;\n temporarilyDisabled: boolean;\n temporarilyDisabledUntil?: number;\n temporarilyDisabledReason?: string;\n recommended: boolean;\n reason: string;\n installCommand?: string;\n docsUrl?: string;\n}\n\nexport interface PreferredTaskAgent {\n id: TaskAgentFrameworkId;\n reason: string;\n}\n\nexport interface TaskAgentFrameworkState {\n configuredSubscriptionProvider?: string;\n frameworks: TaskAgentFrameworkAvailability[];\n preferred: PreferredTaskAgent;\n}\n\nexport interface TaskAgentFrameworkProbe {\n checkAvailableAgents?: (\n types?: SupportedTaskAgentAdapter[],\n ) => Promise<PreflightResult[]>;\n}\n\nconst FRAMEWORK_LABELS: Record<TaskAgentFrameworkId, string> = {\n claude: \"Claude Code\",\n codex: \"Codex\",\n gemini: \"Gemini CLI\",\n aider: \"Aider\",\n pi: \"Pi\",\n};\n\nconst STANDARD_FRAMEWORKS: SupportedTaskAgentAdapter[] = [\n \"claude\",\n \"codex\",\n \"gemini\",\n \"aider\",\n];\n\nconst TASK_AGENT_COMPLEXITY_RE =\n /\\b(repo|repository|code|coding|debug|fix|implement|investigate|research|analyze|analysis|summarize|summary|write|draft|document|plan|workflow|automation|parallel|delegate|subtask|agent|orchestrate|coordinate|compare|test|tests|pull request|pr\\b|branch|commit)\\b/i;\n\nlet frameworkStateCache:\n | {\n expiresAt: number;\n value: TaskAgentFrameworkState;\n }\n | undefined;\nconst frameworkCooldowns = new Map<\n SupportedTaskAgentAdapter,\n { until: number; reason: string }\n>();\nconst TASK_AGENT_USAGE_EXHAUSTED_RE =\n /\\b(insufficient(?:[_\\s]+(?:credits?|quota))|insufficient_quota|out of credits|credit balance|usage (?:has )?(?:reached|exceeded)|(?:you(?:'ve| have)? hit your usage limits?)|usage[-\\s]?limits?|quota exceeded|payment required|status(?:code)?[:\\s]*402)\\b/i;\n\nfunction normalizePreflightAdapterId(\n value: string | undefined,\n): SupportedTaskAgentAdapter | null {\n const normalized = value?.trim().toLowerCase();\n switch (normalized) {\n case \"claude\":\n case \"claude code\":\n return \"claude\";\n case \"codex\":\n case \"openai codex\":\n return \"codex\";\n case \"gemini\":\n case \"gemini cli\":\n return \"gemini\";\n case \"aider\":\n return \"aider\";\n default:\n return null;\n }\n}\n\nfunction safeGetSetting(\n runtime: IAgentRuntime | undefined,\n key: string,\n): string | undefined {\n // Check the config file first (UI writes here, takes effect without restart),\n // then fall back to runtime/character settings.\n try {\n const fromConfig = readConfigEnvKey(key);\n if (fromConfig?.trim()) return fromConfig.trim();\n } catch {\n // ignore — fall through to runtime\n }\n if (!runtime) return undefined;\n try {\n const value = runtime.getSetting(key);\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getUserHomeDir(): string {\n return (\n process.env.HOME?.trim() || process.env.USERPROFILE?.trim() || os.homedir()\n );\n}\n\nfunction readJsonFile(filePath: string): unknown {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf8\"));\n } catch {\n return null;\n }\n}\n\nfunction extractOauthAccessToken(value: unknown): string | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return;\n const record = value as Record<string, unknown>;\n const direct = record.accessToken ?? record.access_token;\n if (typeof direct === \"string\" && direct.trim()) {\n return direct.trim();\n }\n for (const nested of Object.values(record)) {\n const token = extractOauthAccessToken(nested);\n if (token) return token;\n }\n return;\n}\n\nfunction resolveMiladyConfigPath(): string {\n const explicit =\n process.env.MILADY_CONFIG_PATH?.trim() ||\n process.env.ELIZA_CONFIG_PATH?.trim();\n if (explicit) return explicit;\n\n const stateDir =\n process.env.MILADY_STATE_DIR?.trim() ||\n process.env.ELIZA_STATE_DIR?.trim() ||\n path.join(getUserHomeDir(), \".milady\");\n const namespace = process.env.ELIZA_NAMESPACE?.trim();\n const filename =\n !namespace || namespace === \"milady\" ? \"milady.json\" : `${namespace}.json`;\n return path.join(stateDir, filename);\n}\n\nfunction readConfiguredSubscriptionProvider(): string | undefined {\n const config = readJsonFile(resolveMiladyConfigPath());\n if (!config || typeof config !== \"object\" || Array.isArray(config)) return;\n const agents = (config as Record<string, unknown>).agents;\n if (!agents || typeof agents !== \"object\" || Array.isArray(agents)) return;\n const defaults = (agents as Record<string, unknown>).defaults;\n if (!defaults || typeof defaults !== \"object\" || Array.isArray(defaults))\n return;\n const provider = (defaults as Record<string, unknown>).subscriptionProvider;\n return typeof provider === \"string\" && provider.trim()\n ? provider.trim()\n : undefined;\n}\n\nfunction hasClaudeSubscriptionAuth(): boolean {\n const credentialsPath = path.join(\n getUserHomeDir(),\n \".claude\",\n \".credentials.json\",\n );\n const fileToken = extractOauthAccessToken(readJsonFile(credentialsPath));\n if (fileToken) return true;\n\n if (process.platform !== \"darwin\") return false;\n try {\n const raw = execFileSync(\n \"security\",\n [\"find-generic-password\", \"-s\", \"Claude Code-credentials\", \"-w\"],\n { encoding: \"utf8\", timeout: 3000, stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n ).trim();\n if (!raw) return false;\n return Boolean(extractOauthAccessToken(JSON.parse(raw)));\n } catch {\n return false;\n }\n}\n\nfunction hasClaudeApiKey(runtime?: IAgentRuntime): boolean {\n return Boolean(\n process.env.ANTHROPIC_API_KEY?.trim() ||\n safeGetSetting(runtime, \"ANTHROPIC_API_KEY\"),\n );\n}\n\nfunction hasCodexSubscriptionAuth(): boolean {\n const authPath = path.join(getUserHomeDir(), \".codex\", \"auth.json\");\n const auth = readJsonFile(authPath);\n if (!auth || typeof auth !== \"object\" || Array.isArray(auth)) return false;\n const key = (auth as Record<string, unknown>).OPENAI_API_KEY;\n return typeof key === \"string\" && key.trim().length > 0;\n}\n\nfunction hasCodexApiKey(runtime?: IAgentRuntime): boolean {\n return Boolean(\n process.env.OPENAI_API_KEY?.trim() ||\n safeGetSetting(runtime, \"OPENAI_API_KEY\"),\n );\n}\n\nfunction hasGeminiCredential(runtime?: IAgentRuntime): boolean {\n return Boolean(\n process.env.GOOGLE_GENERATIVE_AI_API_KEY?.trim() ||\n process.env.GOOGLE_API_KEY?.trim() ||\n safeGetSetting(runtime, \"GOOGLE_GENERATIVE_AI_API_KEY\") ||\n safeGetSetting(runtime, \"GOOGLE_API_KEY\"),\n );\n}\n\n/**\n * Check whether milady has a paired Eliza Cloud API key. Used to mark\n * Anthropic/OpenAI-backed task agents as auth-ready when LLM provider is\n * \"cloud\" — they'll route through the cloud proxy at spawn time.\n */\nfunction hasElizaCloudApiKey(): boolean {\n return Boolean(readConfigCloudKey(\"apiKey\"));\n}\n\nfunction hasPiBinary(): boolean {\n const command = process.platform === \"win32\" ? \"where\" : \"which\";\n const args = process.platform === \"win32\" ? [\"pi.exe\"] : [\"pi\"];\n try {\n execFileSync(command, args, {\n encoding: \"utf8\",\n timeout: 1500,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getFrameworkCooldown(\n id: SupportedTaskAgentAdapter,\n): { until: number; reason: string } | undefined {\n const cooldown = frameworkCooldowns.get(id);\n if (!cooldown) return undefined;\n if (cooldown.until <= Date.now()) {\n frameworkCooldowns.delete(id);\n return undefined;\n }\n return cooldown;\n}\n\nasync function computeTaskAgentFrameworkState(\n runtime: IAgentRuntime,\n probe?: TaskAgentFrameworkProbe,\n): Promise<TaskAgentFrameworkState> {\n const configuredSubscriptionProvider = readConfiguredSubscriptionProvider();\n const preflightByAdapter = new Map<\n SupportedTaskAgentAdapter,\n PreflightResult\n >();\n\n if (probe?.checkAvailableAgents) {\n try {\n const results = await probe.checkAvailableAgents(STANDARD_FRAMEWORKS);\n // checkAdapters returns `adapter` as the human-readable display name\n // (e.g. \"Claude Code\", \"OpenAI Codex\"), not the lowercase ID. Map back\n // to the canonical framework ID via case-insensitive substring match.\n for (const result of results) {\n const adapterId = normalizePreflightAdapterId(result.adapter);\n if (adapterId) {\n preflightByAdapter.set(adapterId, result);\n }\n }\n } catch {\n // Keep status surfaces alive even if preflight fails transiently.\n }\n }\n\n // When the user has selected Eliza Cloud as the LLM provider and has a\n // paired cloud.apiKey, treat Claude/Codex/Aider as fully auth-ready —\n // they'll route through the cloud proxy at spawn time.\n const llmProvider =\n readConfigEnvKey(\"PARALLAX_LLM_PROVIDER\") || \"subscription\";\n const cloudReady = llmProvider === \"cloud\" && hasElizaCloudApiKey();\n\n const claudeSubscriptionReady = hasClaudeSubscriptionAuth();\n const claudeAuthReady =\n cloudReady || claudeSubscriptionReady || hasClaudeApiKey(runtime);\n const codexSubscriptionReady = hasCodexSubscriptionAuth();\n const codexAuthReady =\n cloudReady || codexSubscriptionReady || hasCodexApiKey(runtime);\n // Eliza Cloud doesn't proxy Gemini, so cloud mode does NOT make Gemini auth-ready\n const geminiAuthReady = hasGeminiCredential(runtime);\n const piReady = hasPiBinary();\n\n const providerPrefersClaude =\n configuredSubscriptionProvider === \"anthropic-subscription\";\n const providerPrefersCodex =\n configuredSubscriptionProvider === \"openai-codex\" ||\n configuredSubscriptionProvider === \"openai-subscription\";\n\n const frameworks: TaskAgentFrameworkAvailability[] = STANDARD_FRAMEWORKS.map(\n (id) => {\n const preflight = preflightByAdapter.get(id);\n const cooldown = getFrameworkCooldown(id);\n const installed = preflight?.installed === true;\n const subscriptionReady =\n id === \"claude\"\n ? claudeSubscriptionReady\n : id === \"codex\"\n ? codexSubscriptionReady\n : false;\n const authReady =\n id === \"claude\"\n ? claudeAuthReady\n : id === \"codex\"\n ? codexAuthReady\n : id === \"gemini\"\n ? geminiAuthReady\n : claudeAuthReady || codexAuthReady || geminiAuthReady;\n const reason =\n id === \"claude\" && subscriptionReady\n ? \"ready to use the user's Claude subscription\"\n : id === \"codex\" && subscriptionReady\n ? \"ready to use the user's OpenAI subscription\"\n : installed\n ? authReady\n ? \"installed with credentials available\"\n : \"installed but credentials were not detected\"\n : \"CLI not detected\";\n return {\n id,\n label: FRAMEWORK_LABELS[id],\n installed,\n authReady,\n subscriptionReady,\n temporarilyDisabled: Boolean(cooldown),\n temporarilyDisabledUntil: cooldown?.until,\n temporarilyDisabledReason: cooldown?.reason,\n recommended: false,\n reason: cooldown\n ? `${reason}; temporarily disabled after a provider failure: ${cooldown.reason}`\n : reason,\n installCommand: preflight?.installCommand,\n docsUrl: preflight?.docsUrl,\n };\n },\n );\n\n frameworks.push({\n id: \"pi\",\n label: FRAMEWORK_LABELS.pi,\n installed: piReady,\n authReady: piReady,\n subscriptionReady: false,\n temporarilyDisabled: false,\n recommended: false,\n reason: piReady ? \"CLI detected\" : \"CLI not detected\",\n });\n\n const byId = new Map(\n frameworks.map((framework) => [framework.id, framework]),\n );\n const isSelectable = (id: TaskAgentFrameworkId): boolean =>\n !byId.get(id)?.temporarilyDisabled;\n const explicitDefault = safeGetSetting(runtime, \"PARALLAX_DEFAULT_AGENT_TYPE\")\n ?.toLowerCase()\n .trim();\n let preferred: PreferredTaskAgent;\n\n if (\n explicitDefault &&\n (explicitDefault === \"claude\" ||\n explicitDefault === \"codex\" ||\n explicitDefault === \"gemini\" ||\n explicitDefault === \"aider\" ||\n explicitDefault === \"pi\") &&\n byId.get(explicitDefault)?.installed &&\n isSelectable(explicitDefault)\n ) {\n preferred = {\n id: explicitDefault,\n reason: \"explicit PARALLAX_DEFAULT_AGENT_TYPE override\",\n };\n } else if (\n providerPrefersClaude &&\n byId.get(\"claude\")?.installed &&\n claudeSubscriptionReady &&\n isSelectable(\"claude\")\n ) {\n preferred = {\n id: \"claude\",\n reason: \"configured Claude subscription should drive Claude Code first\",\n };\n } else if (\n providerPrefersCodex &&\n byId.get(\"codex\")?.installed &&\n codexSubscriptionReady &&\n isSelectable(\"codex\")\n ) {\n preferred = {\n id: \"codex\",\n reason: \"configured OpenAI subscription should drive Codex first\",\n };\n } else if (\n byId.get(\"claude\")?.installed &&\n claudeSubscriptionReady &&\n isSelectable(\"claude\")\n ) {\n preferred = {\n id: \"claude\",\n reason: \"Claude Code is installed and the user is logged in\",\n };\n } else if (\n byId.get(\"codex\")?.installed &&\n codexSubscriptionReady &&\n isSelectable(\"codex\")\n ) {\n preferred = {\n id: \"codex\",\n reason: \"Codex is installed and the user is logged in\",\n };\n } else if (\n byId.get(\"claude\")?.installed &&\n claudeAuthReady &&\n isSelectable(\"claude\")\n ) {\n preferred = {\n id: \"claude\",\n reason: \"Claude Code is installed and credentials are available\",\n };\n } else if (\n byId.get(\"codex\")?.installed &&\n codexAuthReady &&\n isSelectable(\"codex\")\n ) {\n preferred = {\n id: \"codex\",\n reason: \"Codex is installed and credentials are available\",\n };\n } else if (\n byId.get(\"gemini\")?.installed &&\n geminiAuthReady &&\n isSelectable(\"gemini\")\n ) {\n preferred = {\n id: \"gemini\",\n reason: \"Gemini CLI is installed and credentials are available\",\n };\n } else {\n const fallback =\n frameworks.find(\n (framework) => framework.installed && !framework.temporarilyDisabled,\n ) ??\n frameworks.find((framework) => framework.installed) ??\n frameworks[0];\n preferred = {\n id: fallback.id,\n reason: fallback.installed\n ? \"best available installed task-agent framework\"\n : \"default fallback while no task-agent CLI is installed\",\n };\n }\n\n for (const framework of frameworks) {\n framework.recommended = framework.id === preferred.id;\n }\n\n return {\n configuredSubscriptionProvider,\n frameworks,\n preferred,\n };\n}\n\nexport async function getTaskAgentFrameworkState(\n runtime: IAgentRuntime,\n probe?: TaskAgentFrameworkProbe,\n): Promise<TaskAgentFrameworkState> {\n if (frameworkStateCache && frameworkStateCache.expiresAt > Date.now()) {\n return frameworkStateCache.value;\n }\n const value = await computeTaskAgentFrameworkState(runtime, probe);\n frameworkStateCache = {\n expiresAt: Date.now() + 15_000,\n value,\n };\n return value;\n}\n\nexport function clearTaskAgentFrameworkStateCache(): void {\n frameworkStateCache = undefined;\n}\n\nexport function isUsageExhaustedTaskAgentError(text: string): boolean {\n return TASK_AGENT_USAGE_EXHAUSTED_RE.test(text);\n}\n\nexport function markTaskAgentFrameworkUnavailable(\n id: SupportedTaskAgentAdapter,\n reason: string,\n cooldownMs = 30 * 60 * 1000,\n): void {\n frameworkCooldowns.set(id, {\n until: Date.now() + cooldownMs,\n reason,\n });\n clearTaskAgentFrameworkStateCache();\n}\n\nexport function markTaskAgentFrameworkHealthy(\n id: SupportedTaskAgentAdapter,\n): void {\n if (frameworkCooldowns.delete(id)) {\n clearTaskAgentFrameworkStateCache();\n }\n}\n\nexport function formatTaskAgentFrameworkLine(\n framework: TaskAgentFrameworkAvailability,\n): string {\n const parts = [\n framework.installed ? \"installed\" : \"not installed\",\n framework.authReady ? \"credentials ready\" : \"credentials missing\",\n ];\n if (framework.subscriptionReady) {\n parts.push(\"uses the user's subscription\");\n }\n if (framework.temporarilyDisabled) {\n parts.push(\"temporarily disabled\");\n }\n if (framework.recommended) {\n parts.push(\"recommended\");\n }\n return `- ${framework.label}: ${parts.join(\", \")}. ${framework.reason}.`;\n}\n\nexport function looksLikeTaskAgentRequest(text: string): boolean {\n return TASK_AGENT_COMPLEXITY_RE.test(text);\n}\n\nexport function formatTaskAgentStatus(status: string): string {\n switch (status) {\n case \"ready\":\n return \"idle\";\n case \"busy\":\n return \"working\";\n case \"starting\":\n return \"starting\";\n case \"authenticating\":\n return \"authenticating\";\n default:\n return status;\n }\n}\n\nexport function truncateTaskAgentText(text: string, max = 120): string {\n const trimmed = text.trim().replace(/\\s+/g, \" \");\n return trimmed.length > max ? `${trimmed.slice(0, max - 1)}...` : trimmed;\n}\n\nexport function rewriteTaskAgentText(text: string): string {\n return text\n .replace(/\\bcoding agents\\b/gi, \"task agents\")\n .replace(/\\bcoding agent\\b/gi, \"task agent\")\n .replace(/\\bcoding sessions\\b/gi, \"task-agent sessions\")\n .replace(/\\bcoding session\\b/gi, \"task-agent session\");\n}\n\nexport { FRAMEWORK_LABELS as TASK_AGENT_FRAMEWORK_LABELS };\n",
|
|
58
|
+
"import type { CreateTaskThreadInput, TaskThreadKind } from \"./task-registry.js\";\n\nconst CODING_RE =\n /\\b(code|coding|implement|fix|debug|refactor|write|build|patch|repo|repository|branch|commit|pull request|pr|test|tests|typescript|javascript|react|server|api)\\b/i;\nconst RESEARCH_RE =\n /\\b(research|investigate|analyze|analysis|compare|evaluate|review|study|summarize|summary|deep research|report|find out|look into|explore)\\b/i;\nconst PLANNING_RE =\n /\\b(plan|planning|roadmap|strategy|spec|prd|design|architecture|scope|milestone|breakdown|sequence|timeline)\\b/i;\nconst OPS_RE =\n /\\b(deploy|release|ship|rollback|monitor|incident|ops|operations|runbook|infra|infrastructure|configure|setup|provision|container|docker|kubernetes|ci|cd)\\b/i;\n\nfunction collectTaskText(input: CreateTaskThreadInput): string {\n const subtasks = Array.isArray(\n (input.currentPlan as { subtasks?: unknown } | undefined)?.subtasks,\n )\n ? (((input.currentPlan as { subtasks?: unknown }).subtasks as unknown[]) ?? [])\n .filter((entry): entry is string => typeof entry === \"string\")\n .join(\"\\n\")\n : \"\";\n const repo =\n typeof input.metadata?.repo === \"string\" ? input.metadata.repo : \"\";\n return [input.title, input.originalRequest, subtasks, repo]\n .filter((value) => typeof value === \"string\" && value.trim().length > 0)\n .join(\"\\n\");\n}\n\nexport function inferTaskThreadKind(\n input: CreateTaskThreadInput,\n): TaskThreadKind {\n if (input.kind) return input.kind;\n\n const text = collectTaskText(input);\n const matches: TaskThreadKind[] = [];\n\n if (CODING_RE.test(text) || typeof input.metadata?.repo === \"string\") {\n matches.push(\"coding\");\n }\n if (RESEARCH_RE.test(text)) {\n matches.push(\"research\");\n }\n if (PLANNING_RE.test(text)) {\n matches.push(\"planning\");\n }\n if (OPS_RE.test(text)) {\n matches.push(\"ops\");\n }\n\n const unique = Array.from(new Set(matches));\n if (unique.length === 0) return \"coding\";\n if (unique.length === 1) return unique[0] ?? \"coding\";\n return \"mixed\";\n}\n",
|
|
59
|
+
"import crypto from \"node:crypto\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport type { CodingAgentType } from \"./pty-types.js\";\n\ntype RawSqlQuery = {\n queryChunks: Array<{ value?: unknown }>;\n};\n\ntype RuntimeDb = {\n execute: (query: RawSqlQuery) => Promise<unknown>;\n};\n\ntype Row = Record<string, unknown>;\n\nlet cachedSqlRaw: ((query: string) => RawSqlQuery) | null = null;\nconst schemaReady = new WeakSet<object>();\n\nexport type TaskThreadKind =\n | \"coding\"\n | \"research\"\n | \"planning\"\n | \"ops\"\n | \"mixed\";\n\nexport type TaskThreadStatus =\n | \"open\"\n | \"active\"\n | \"waiting_on_user\"\n | \"blocked\"\n | \"validating\"\n | \"done\"\n | \"failed\"\n | \"archived\"\n | \"interrupted\";\n\nexport type TaskSessionStatus =\n | \"active\"\n | \"blocked\"\n | \"waiting_on_user\"\n | \"completed\"\n | \"stopped\"\n | \"error\"\n | \"tool_running\"\n | \"interrupted\";\n\nexport type TaskThreadEventType =\n | \"task_created\"\n | \"task_registered\"\n | \"task_status_changed\"\n | \"task_paused\"\n | \"task_resumed\"\n | \"task_stopped\"\n | \"task_archived\"\n | \"task_reopened\"\n | \"session_registered\"\n | \"session_updated\"\n | \"session_interrupted\"\n | \"decision_recorded\"\n | \"artifact_recorded\"\n | \"summary_updated\"\n | \"share_discovered\";\n\nexport interface TaskThreadRecord {\n id: string;\n agentId: string;\n roomId: string | null;\n worldId: string | null;\n ownerUserId: string | null;\n scenarioId: string | null;\n batchId: string | null;\n title: string;\n kind: TaskThreadKind;\n status: TaskThreadStatus;\n originalRequest: string;\n summary: string;\n acceptanceCriteria: string[];\n currentPlan: Record<string, unknown>;\n searchText: string;\n createdAt: string;\n updatedAt: string;\n closedAt: string | null;\n archivedAt: string | null;\n lastUserTurnAt: string | null;\n lastCoordinatorTurnAt: string | null;\n metadata: Record<string, unknown>;\n}\n\nexport interface TaskSessionRecord {\n id: string;\n threadId: string;\n agentId: string;\n sessionId: string;\n framework: CodingAgentType;\n providerSource: string | null;\n label: string;\n originalTask: string;\n workdir: string;\n repo: string | null;\n status: TaskSessionStatus;\n decisionCount: number;\n autoResolvedCount: number;\n registeredAt: number;\n lastActivityAt: number;\n idleCheckCount: number;\n taskDelivered: boolean;\n completionSummary: string | null;\n lastSeenDecisionIndex: number;\n lastInputSentAt: number | null;\n stoppedAt: number | null;\n createdAt: string;\n updatedAt: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface TaskDecisionRecord {\n id: string;\n threadId: string;\n sessionId: string;\n timestamp: number;\n event: string;\n promptText: string;\n decision: string;\n response: string | null;\n reasoning: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface TaskEventRecord {\n id: string;\n threadId: string;\n sessionId: string | null;\n eventType: TaskThreadEventType | string;\n timestamp: number;\n summary: string;\n data: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface TaskArtifactRecord {\n id: string;\n threadId: string;\n sessionId: string | null;\n artifactType: string;\n title: string;\n path: string | null;\n uri: string | null;\n mimeType: string | null;\n metadata: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface TaskTranscriptRecord {\n id: string;\n threadId: string;\n sessionId: string;\n timestamp: number;\n direction: \"stdout\" | \"stderr\" | \"stdin\" | \"keys\" | \"system\";\n content: string;\n metadata: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface TaskPendingDecisionRecord {\n sessionId: string;\n threadId: string;\n promptText: string;\n recentOutput: string;\n llmDecision: Record<string, unknown>;\n taskContext: Record<string, unknown>;\n createdAt: number;\n updatedAt: string;\n}\n\nexport type TaskNodeKind =\n | \"goal\"\n | \"execution\"\n | \"research\"\n | \"planning\"\n | \"verification\"\n | \"handoff\";\n\nexport type TaskNodeStatus =\n | \"planned\"\n | \"ready\"\n | \"claimed\"\n | \"running\"\n | \"blocked\"\n | \"waiting_on_user\"\n | \"verifying\"\n | \"completed\"\n | \"failed\"\n | \"canceled\"\n | \"interrupted\";\n\nexport interface TaskNodeRecord {\n id: string;\n threadId: string;\n parentNodeId: string | null;\n kind: TaskNodeKind;\n status: TaskNodeStatus;\n title: string;\n instructions: string;\n acceptanceCriteria: string[];\n requiredCapabilities: string[];\n expectedArtifacts: string[];\n assignedSessionId: string | null;\n assignedLabel: string | null;\n agentType: CodingAgentType | null;\n workdir: string | null;\n repo: string | null;\n priority: number;\n depth: number;\n sequence: number;\n createdFrom: string | null;\n metadata: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n startedAt: string | null;\n completedAt: string | null;\n}\n\nexport type TaskDependencyKind =\n | \"blocks\"\n | \"parent_child\"\n | \"artifact\"\n | \"handoff\";\n\nexport interface TaskDependencyRecord {\n id: string;\n threadId: string;\n fromNodeId: string;\n toNodeId: string;\n dependencyKind: TaskDependencyKind;\n requiredStatus: TaskNodeStatus;\n metadata: Record<string, unknown>;\n createdAt: string;\n}\n\nexport type TaskClaimType = \"execution\" | \"verification\" | \"ownership\";\nexport type TaskClaimStatus =\n | \"active\"\n | \"released\"\n | \"completed\"\n | \"failed\"\n | \"interrupted\";\n\nexport interface TaskClaimRecord {\n id: string;\n threadId: string;\n nodeId: string;\n sessionId: string;\n claimType: TaskClaimType;\n status: TaskClaimStatus;\n claimedAt: string;\n releasedAt: string | null;\n metadata: Record<string, unknown>;\n}\n\nexport type TaskMailboxDeliveryState = \"pending\" | \"delivered\" | \"consumed\";\n\nexport interface TaskMailboxMessageRecord {\n id: string;\n threadId: string;\n nodeId: string | null;\n sessionId: string | null;\n sender: string;\n recipient: string;\n subject: string;\n body: string;\n deliveryState: TaskMailboxDeliveryState;\n metadata: Record<string, unknown>;\n createdAt: string;\n deliveredAt: string | null;\n}\n\nexport type TaskVerifierJobStatus =\n | \"pending\"\n | \"running\"\n | \"passed\"\n | \"failed\"\n | \"canceled\";\n\nexport interface TaskVerifierJobRecord {\n id: string;\n threadId: string;\n nodeId: string;\n status: TaskVerifierJobStatus;\n verifierType: string;\n title: string;\n instructions: string;\n config: Record<string, unknown>;\n metadata: Record<string, unknown>;\n createdAt: string;\n startedAt: string | null;\n completedAt: string | null;\n}\n\nexport interface TaskEvidenceRecord {\n id: string;\n threadId: string;\n nodeId: string | null;\n sessionId: string | null;\n verifierJobId: string | null;\n evidenceType: string;\n title: string;\n summary: string;\n path: string | null;\n uri: string | null;\n content: Record<string, unknown>;\n metadata: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface TaskThreadSummary extends TaskThreadRecord {\n sessionCount: number;\n activeSessionCount: number;\n latestSessionId: string | null;\n latestSessionLabel: string | null;\n latestWorkdir: string | null;\n latestRepo: string | null;\n latestActivityAt: number | null;\n decisionCount: number;\n nodeCount: number;\n readyNodeCount: number;\n completedNodeCount: number;\n verifierJobCount: number;\n evidenceCount: number;\n}\n\nexport interface TaskThreadDetail extends TaskThreadSummary {\n sessions: TaskSessionRecord[];\n decisions: TaskDecisionRecord[];\n events: TaskEventRecord[];\n artifacts: TaskArtifactRecord[];\n transcripts: TaskTranscriptRecord[];\n pendingDecisions: TaskPendingDecisionRecord[];\n nodes: TaskNodeRecord[];\n dependencies: TaskDependencyRecord[];\n claims: TaskClaimRecord[];\n mailbox: TaskMailboxMessageRecord[];\n verifierJobs: TaskVerifierJobRecord[];\n evidence: TaskEvidenceRecord[];\n}\n\nexport interface CreateTaskThreadInput {\n id?: string;\n title: string;\n originalRequest: string;\n kind?: TaskThreadKind;\n roomId?: string | null;\n worldId?: string | null;\n ownerUserId?: string | null;\n scenarioId?: string | null;\n batchId?: string | null;\n summary?: string;\n acceptanceCriteria?: string[];\n currentPlan?: Record<string, unknown>;\n lastUserTurnAt?: string | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RegisterTaskSessionInput {\n threadId: string;\n sessionId: string;\n framework: CodingAgentType;\n label: string;\n originalTask: string;\n workdir: string;\n repo?: string;\n providerSource?: string | null;\n status?: TaskSessionStatus;\n decisionCount?: number;\n autoResolvedCount?: number;\n registeredAt?: number;\n lastActivityAt?: number;\n idleCheckCount?: number;\n taskDelivered?: boolean;\n completionSummary?: string | null;\n lastSeenDecisionIndex?: number;\n lastInputSentAt?: number | null;\n stoppedAt?: number | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateTaskSessionInput {\n status?: TaskSessionStatus;\n decisionCount?: number;\n autoResolvedCount?: number;\n lastActivityAt?: number;\n idleCheckCount?: number;\n taskDelivered?: boolean;\n completionSummary?: string | null;\n lastSeenDecisionIndex?: number;\n lastInputSentAt?: number | null;\n stoppedAt?: number | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateTaskThreadInput {\n status?: TaskThreadStatus;\n summary?: string;\n currentPlan?: Record<string, unknown>;\n lastUserTurnAt?: string | null;\n lastCoordinatorTurnAt?: string | null;\n closedAt?: string | null;\n archivedAt?: string | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RecordTaskDecisionInput {\n threadId: string;\n sessionId: string;\n timestamp: number;\n event: string;\n promptText: string;\n decision: string;\n response?: string;\n reasoning: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RecordTaskEventInput {\n threadId: string;\n sessionId?: string | null;\n eventType: TaskThreadEventType | string;\n timestamp?: number;\n summary?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface RecordTaskArtifactInput {\n threadId: string;\n sessionId?: string | null;\n artifactType: string;\n title: string;\n path?: string | null;\n uri?: string | null;\n mimeType?: string | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RecordTaskTranscriptInput {\n threadId: string;\n sessionId: string;\n timestamp?: number;\n direction: TaskTranscriptRecord[\"direction\"];\n content: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpsertPendingDecisionInput {\n sessionId: string;\n threadId: string;\n promptText: string;\n recentOutput: string;\n llmDecision: Record<string, unknown>;\n taskContext: Record<string, unknown>;\n createdAt?: number;\n}\n\nexport interface CreateTaskNodeInput {\n id?: string;\n threadId: string;\n parentNodeId?: string | null;\n kind?: TaskNodeKind;\n status?: TaskNodeStatus;\n title: string;\n instructions?: string;\n acceptanceCriteria?: string[];\n requiredCapabilities?: string[];\n expectedArtifacts?: string[];\n assignedSessionId?: string | null;\n assignedLabel?: string | null;\n agentType?: CodingAgentType | null;\n workdir?: string | null;\n repo?: string | null;\n priority?: number;\n depth?: number;\n sequence?: number;\n createdFrom?: string | null;\n metadata?: Record<string, unknown>;\n startedAt?: string | null;\n completedAt?: string | null;\n}\n\nexport interface UpdateTaskNodeInput {\n parentNodeId?: string | null;\n kind?: TaskNodeKind;\n status?: TaskNodeStatus;\n title?: string;\n instructions?: string;\n acceptanceCriteria?: string[];\n requiredCapabilities?: string[];\n expectedArtifacts?: string[];\n assignedSessionId?: string | null;\n assignedLabel?: string | null;\n agentType?: CodingAgentType | null;\n workdir?: string | null;\n repo?: string | null;\n priority?: number;\n depth?: number;\n sequence?: number;\n createdFrom?: string | null;\n metadata?: Record<string, unknown>;\n startedAt?: string | null;\n completedAt?: string | null;\n}\n\nexport interface CreateTaskDependencyInput {\n id?: string;\n threadId: string;\n fromNodeId: string;\n toNodeId: string;\n dependencyKind?: TaskDependencyKind;\n requiredStatus?: TaskNodeStatus;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateTaskClaimInput {\n id?: string;\n threadId: string;\n nodeId: string;\n sessionId: string;\n claimType?: TaskClaimType;\n status?: TaskClaimStatus;\n metadata?: Record<string, unknown>;\n claimedAt?: string;\n releasedAt?: string | null;\n}\n\nexport interface UpdateTaskClaimInput {\n status?: TaskClaimStatus;\n metadata?: Record<string, unknown>;\n releasedAt?: string | null;\n}\n\nexport interface AppendTaskMailboxMessageInput {\n id?: string;\n threadId: string;\n nodeId?: string | null;\n sessionId?: string | null;\n sender: string;\n recipient: string;\n subject?: string;\n body: string;\n deliveryState?: TaskMailboxDeliveryState;\n metadata?: Record<string, unknown>;\n createdAt?: string;\n deliveredAt?: string | null;\n}\n\nexport interface CreateTaskVerifierJobInput {\n id?: string;\n threadId: string;\n nodeId: string;\n status?: TaskVerifierJobStatus;\n verifierType: string;\n title: string;\n instructions?: string;\n config?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n createdAt?: string;\n startedAt?: string | null;\n completedAt?: string | null;\n}\n\nexport interface UpdateTaskVerifierJobInput {\n status?: TaskVerifierJobStatus;\n title?: string;\n instructions?: string;\n config?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n startedAt?: string | null;\n completedAt?: string | null;\n}\n\nexport interface RecordTaskEvidenceInput {\n id?: string;\n threadId: string;\n nodeId?: string | null;\n sessionId?: string | null;\n verifierJobId?: string | null;\n evidenceType: string;\n title: string;\n summary?: string;\n path?: string | null;\n uri?: string | null;\n content?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ListTaskThreadsOptions {\n includeArchived?: boolean;\n status?: TaskThreadStatus;\n statuses?: TaskThreadStatus[];\n kind?: TaskThreadKind;\n roomId?: string;\n worldId?: string;\n ownerUserId?: string;\n scenarioId?: string;\n batchId?: string;\n createdAfter?: string;\n createdBefore?: string;\n updatedAfter?: string;\n updatedBefore?: string;\n latestActivityAfter?: number;\n latestActivityBefore?: number;\n hasActiveSession?: boolean;\n search?: string;\n limit?: number;\n}\n\nfunction asObject(value: unknown): Row | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Row;\n}\n\nfunction toText(value: unknown, fallback = \"\"): string {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return fallback;\n return String(value);\n}\n\nfunction toNumber(value: unknown, fallback = 0): number {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\") {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return fallback;\n}\n\nfunction toNullableText(value: unknown): string | null {\n if (value === null || value === undefined || value === \"\") return null;\n return toText(value);\n}\n\nfunction toNullableNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === \"\") return null;\n const parsed = toNumber(value, Number.NaN);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction toBoolean(value: unknown, fallback = false): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) return true;\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) return false;\n }\n return fallback;\n}\n\nfunction parseJsonRecord(value: unknown): Record<string, unknown> {\n if (value === null || value === undefined || value === \"\") return {};\n if (typeof value !== \"string\") return asObject(value) ?? {};\n try {\n return asObject(JSON.parse(value)) ?? {};\n } catch {\n return {};\n }\n}\n\nfunction parseJsonArray(value: unknown): string[] {\n if (value === null || value === undefined || value === \"\") return [];\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === \"string\");\n }\n if (typeof value !== \"string\") return [];\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed)\n ? parsed.filter((entry): entry is string => typeof entry === \"string\")\n : [];\n } catch {\n return [];\n }\n}\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\nfunction sqlQuote(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction sqlText(value: string | null | undefined): string {\n if (value === null || value === undefined) return \"NULL\";\n return sqlQuote(value);\n}\n\nfunction sqlInteger(value: number | null | undefined): string {\n if (value === null || value === undefined) return \"NULL\";\n if (!Number.isFinite(value)) {\n throw new Error(\"invalid numeric SQL literal\");\n }\n return String(Math.trunc(value));\n}\n\nfunction sqlBoolean(value: boolean): string {\n return value ? \"TRUE\" : \"FALSE\";\n}\n\nfunction sqlJson(value: unknown): string {\n return sqlQuote(JSON.stringify(value ?? null));\n}\n\nfunction sqlStringList(values: string[]): string {\n return values.map((value) => sqlQuote(value)).join(\", \");\n}\n\nfunction normalizeThreadStatus(value: unknown): TaskThreadStatus {\n switch (toText(value).toLowerCase()) {\n case \"active\":\n case \"waiting_on_user\":\n case \"blocked\":\n case \"validating\":\n case \"done\":\n case \"failed\":\n case \"archived\":\n case \"interrupted\":\n return toText(value).toLowerCase() as TaskThreadStatus;\n default:\n return \"open\";\n }\n}\n\nfunction normalizeSessionStatus(value: unknown): TaskSessionStatus {\n switch (toText(value).toLowerCase()) {\n case \"blocked\":\n case \"waiting_on_user\":\n case \"completed\":\n case \"stopped\":\n case \"error\":\n case \"tool_running\":\n case \"interrupted\":\n return toText(value).toLowerCase() as TaskSessionStatus;\n default:\n return \"active\";\n }\n}\n\nfunction normalizeTaskNodeKind(value: unknown): TaskNodeKind {\n switch (toText(value).toLowerCase()) {\n case \"goal\":\n case \"execution\":\n case \"research\":\n case \"planning\":\n case \"verification\":\n case \"handoff\":\n return toText(value).toLowerCase() as TaskNodeKind;\n default:\n return \"execution\";\n }\n}\n\nfunction normalizeTaskNodeStatus(value: unknown): TaskNodeStatus {\n switch (toText(value).toLowerCase()) {\n case \"ready\":\n case \"claimed\":\n case \"running\":\n case \"blocked\":\n case \"waiting_on_user\":\n case \"verifying\":\n case \"completed\":\n case \"failed\":\n case \"canceled\":\n case \"interrupted\":\n return toText(value).toLowerCase() as TaskNodeStatus;\n default:\n return \"planned\";\n }\n}\n\nfunction normalizeTaskDependencyKind(value: unknown): TaskDependencyKind {\n switch (toText(value).toLowerCase()) {\n case \"parent_child\":\n case \"artifact\":\n case \"handoff\":\n return toText(value).toLowerCase() as TaskDependencyKind;\n default:\n return \"blocks\";\n }\n}\n\nfunction normalizeTaskClaimType(value: unknown): TaskClaimType {\n switch (toText(value).toLowerCase()) {\n case \"verification\":\n case \"ownership\":\n return toText(value).toLowerCase() as TaskClaimType;\n default:\n return \"execution\";\n }\n}\n\nfunction normalizeTaskClaimStatus(value: unknown): TaskClaimStatus {\n switch (toText(value).toLowerCase()) {\n case \"released\":\n case \"completed\":\n case \"failed\":\n case \"interrupted\":\n return toText(value).toLowerCase() as TaskClaimStatus;\n default:\n return \"active\";\n }\n}\n\nfunction normalizeMailboxDeliveryState(\n value: unknown,\n): TaskMailboxDeliveryState {\n switch (toText(value).toLowerCase()) {\n case \"delivered\":\n case \"consumed\":\n return toText(value).toLowerCase() as TaskMailboxDeliveryState;\n default:\n return \"pending\";\n }\n}\n\nfunction normalizeVerifierJobStatus(value: unknown): TaskVerifierJobStatus {\n switch (toText(value).toLowerCase()) {\n case \"running\":\n case \"passed\":\n case \"failed\":\n case \"canceled\":\n return toText(value).toLowerCase() as TaskVerifierJobStatus;\n default:\n return \"pending\";\n }\n}\n\nfunction extractRows(result: unknown): Row[] {\n if (Array.isArray(result)) {\n return result\n .map((row) => asObject(row))\n .filter((row): row is Row => row !== null);\n }\n const obj = asObject(result);\n if (!obj || !Array.isArray(obj.rows)) return [];\n return obj.rows\n .map((row) => asObject(row))\n .filter((row): row is Row => row !== null);\n}\n\nasync function getSqlRaw(): Promise<(query: string) => RawSqlQuery> {\n if (cachedSqlRaw) return cachedSqlRaw;\n const drizzle = (await import(\"drizzle-orm\")) as {\n sql: { raw: (query: string) => RawSqlQuery };\n };\n cachedSqlRaw = drizzle.sql.raw;\n return cachedSqlRaw;\n}\n\nfunction getRuntimeDb(runtime: IAgentRuntime): RuntimeDb {\n const runtimeLike = runtime as IAgentRuntime & {\n adapter?: { db?: RuntimeDb };\n databaseAdapter?: { db?: RuntimeDb };\n };\n const db = runtimeLike.adapter?.db ?? runtimeLike.databaseAdapter?.db;\n if (!db || typeof db.execute !== \"function\") {\n throw new Error(\"runtime database adapter unavailable\");\n }\n return db;\n}\n\nasync function executeRawSql(\n runtime: IAgentRuntime,\n sqlTextValue: string,\n): Promise<Row[]> {\n const raw = await getSqlRaw();\n const result = await getRuntimeDb(runtime).execute(raw(sqlTextValue));\n return extractRows(result);\n}\n\nfunction parseThreadRow(row: Row): TaskThreadRecord {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n roomId: toNullableText(row.room_id),\n worldId: toNullableText(row.world_id),\n ownerUserId: toNullableText(row.owner_user_id),\n scenarioId: toNullableText(row.scenario_id),\n batchId: toNullableText(row.batch_id),\n title: toText(row.title),\n kind: toText(row.kind, \"coding\") as TaskThreadKind,\n status: normalizeThreadStatus(row.status),\n originalRequest: toText(row.original_request),\n summary: toText(row.summary),\n acceptanceCriteria: parseJsonArray(row.acceptance_criteria_json),\n currentPlan: parseJsonRecord(row.current_plan_json),\n searchText: toText(row.search_text),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n closedAt: toNullableText(row.closed_at),\n archivedAt: toNullableText(row.archived_at),\n lastUserTurnAt: toNullableText(row.last_user_turn_at),\n lastCoordinatorTurnAt: toNullableText(row.last_coordinator_turn_at),\n metadata: parseJsonRecord(row.metadata_json),\n };\n}\n\nfunction parseThreadSummaryRow(row: Row): TaskThreadSummary {\n return {\n ...parseThreadRow(row),\n sessionCount: toNumber(row.session_count, 0),\n activeSessionCount: toNumber(row.active_session_count, 0),\n latestSessionId: toNullableText(row.latest_session_id),\n latestSessionLabel: toNullableText(row.latest_session_label),\n latestWorkdir: toNullableText(row.latest_workdir),\n latestRepo: toNullableText(row.latest_repo),\n latestActivityAt: toNullableNumber(row.latest_activity_at),\n decisionCount: toNumber(row.decision_count, 0),\n nodeCount: toNumber(row.node_count, 0),\n readyNodeCount: toNumber(row.ready_node_count, 0),\n completedNodeCount: toNumber(row.completed_node_count, 0),\n verifierJobCount: toNumber(row.verifier_job_count, 0),\n evidenceCount: toNumber(row.evidence_count, 0),\n };\n}\n\nfunction parseSessionRow(row: Row): TaskSessionRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n agentId: toText(row.agent_id),\n sessionId: toText(row.session_id),\n framework: toText(row.framework, \"claude\") as CodingAgentType,\n providerSource: toNullableText(row.provider_source),\n label: toText(row.label),\n originalTask: toText(row.original_task),\n workdir: toText(row.workdir),\n repo: toNullableText(row.repo),\n status: normalizeSessionStatus(row.status),\n decisionCount: toNumber(row.decision_count, 0),\n autoResolvedCount: toNumber(row.auto_resolved_count, 0),\n registeredAt: toNumber(row.registered_at, 0),\n lastActivityAt: toNumber(row.last_activity_at, 0),\n idleCheckCount: toNumber(row.idle_check_count, 0),\n taskDelivered: toBoolean(row.task_delivered),\n completionSummary: toNullableText(row.completion_summary),\n lastSeenDecisionIndex: toNumber(row.last_seen_decision_index, 0),\n lastInputSentAt: toNullableNumber(row.last_input_sent_at),\n stoppedAt: toNullableNumber(row.stopped_at),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n metadata: parseJsonRecord(row.metadata_json),\n };\n}\n\nfunction parseDecisionRow(row: Row): TaskDecisionRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n sessionId: toText(row.session_id),\n timestamp: toNumber(row.timestamp, 0),\n event: toText(row.event_type),\n promptText: toText(row.prompt_text),\n decision: toText(row.decision),\n response: toNullableText(row.response),\n reasoning: toText(row.reasoning),\n metadata: parseJsonRecord(row.metadata_json),\n };\n}\n\nfunction parseEventRow(row: Row): TaskEventRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n sessionId: toNullableText(row.session_id),\n eventType: toText(row.event_type),\n timestamp: toNumber(row.timestamp, 0),\n summary: toText(row.summary),\n data: parseJsonRecord(row.data_json),\n createdAt: toText(row.created_at),\n };\n}\n\nfunction parseArtifactRow(row: Row): TaskArtifactRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n sessionId: toNullableText(row.session_id),\n artifactType: toText(row.artifact_type),\n title: toText(row.title),\n path: toNullableText(row.path),\n uri: toNullableText(row.uri),\n mimeType: toNullableText(row.mime_type),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n };\n}\n\nfunction parseTranscriptRow(row: Row): TaskTranscriptRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n sessionId: toText(row.session_id),\n timestamp: toNumber(row.timestamp, 0),\n direction: toText(row.direction) as TaskTranscriptRecord[\"direction\"],\n content: toText(row.content),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n };\n}\n\nfunction parsePendingDecisionRow(row: Row): TaskPendingDecisionRecord {\n return {\n sessionId: toText(row.session_id),\n threadId: toText(row.thread_id),\n promptText: toText(row.prompt_text),\n recentOutput: toText(row.recent_output),\n llmDecision: parseJsonRecord(row.llm_decision_json),\n taskContext: parseJsonRecord(row.task_context_json),\n createdAt: toNumber(row.created_at, 0),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseTaskNodeRow(row: Row): TaskNodeRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n parentNodeId: toNullableText(row.parent_node_id),\n kind: normalizeTaskNodeKind(row.kind),\n status: normalizeTaskNodeStatus(row.status),\n title: toText(row.title),\n instructions: toText(row.instructions),\n acceptanceCriteria: parseJsonArray(row.acceptance_criteria_json),\n requiredCapabilities: parseJsonArray(row.required_capabilities_json),\n expectedArtifacts: parseJsonArray(row.expected_artifacts_json),\n assignedSessionId: toNullableText(row.assigned_session_id),\n assignedLabel: toNullableText(row.assigned_label),\n agentType: toNullableText(row.agent_type) as CodingAgentType | null,\n workdir: toNullableText(row.workdir),\n repo: toNullableText(row.repo),\n priority: toNumber(row.priority, 0),\n depth: toNumber(row.depth, 0),\n sequence: toNumber(row.sequence, 0),\n createdFrom: toNullableText(row.created_from),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n startedAt: toNullableText(row.started_at),\n completedAt: toNullableText(row.completed_at),\n };\n}\n\nfunction parseTaskDependencyRow(row: Row): TaskDependencyRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n fromNodeId: toText(row.from_node_id),\n toNodeId: toText(row.to_node_id),\n dependencyKind: normalizeTaskDependencyKind(row.dependency_kind),\n requiredStatus: normalizeTaskNodeStatus(row.required_status),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n };\n}\n\nfunction parseTaskClaimRow(row: Row): TaskClaimRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n nodeId: toText(row.node_id),\n sessionId: toText(row.session_id),\n claimType: normalizeTaskClaimType(row.claim_type),\n status: normalizeTaskClaimStatus(row.status),\n claimedAt: toText(row.claimed_at),\n releasedAt: toNullableText(row.released_at),\n metadata: parseJsonRecord(row.metadata_json),\n };\n}\n\nfunction parseTaskMailboxMessageRow(row: Row): TaskMailboxMessageRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n nodeId: toNullableText(row.node_id),\n sessionId: toNullableText(row.session_id),\n sender: toText(row.sender),\n recipient: toText(row.recipient),\n subject: toText(row.subject),\n body: toText(row.body),\n deliveryState: normalizeMailboxDeliveryState(row.delivery_state),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n deliveredAt: toNullableText(row.delivered_at),\n };\n}\n\nfunction parseTaskVerifierJobRow(row: Row): TaskVerifierJobRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n nodeId: toText(row.node_id),\n status: normalizeVerifierJobStatus(row.status),\n verifierType: toText(row.verifier_type),\n title: toText(row.title),\n instructions: toText(row.instructions),\n config: parseJsonRecord(row.config_json),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n startedAt: toNullableText(row.started_at),\n completedAt: toNullableText(row.completed_at),\n };\n}\n\nfunction parseTaskEvidenceRow(row: Row): TaskEvidenceRecord {\n return {\n id: toText(row.id),\n threadId: toText(row.thread_id),\n nodeId: toNullableText(row.node_id),\n sessionId: toNullableText(row.session_id),\n verifierJobId: toNullableText(row.verifier_job_id),\n evidenceType: toText(row.evidence_type),\n title: toText(row.title),\n summary: toText(row.summary),\n path: toNullableText(row.path),\n uri: toNullableText(row.uri),\n content: parseJsonRecord(row.content_json),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n };\n}\n\nfunction buildSearchText(parts: Array<string | null | undefined>): string {\n return parts\n .map((part) => (part ?? \"\").trim().toLowerCase())\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction isTerminalTaskNodeStatus(status: TaskNodeStatus): boolean {\n return (\n status === \"completed\" ||\n status === \"failed\" ||\n status === \"canceled\" ||\n status === \"interrupted\"\n );\n}\n\nfunction dependencyStatusSatisfied(\n actual: TaskNodeStatus,\n required: TaskNodeStatus,\n): boolean {\n if (actual === required) return true;\n return false;\n}\n\nfunction buildThreadListWhereClauses(\n options: ListTaskThreadsOptions,\n): string[] {\n const clauses: string[] = [];\n if (!options.includeArchived) {\n clauses.push(\"thread.archived_at IS NULL\");\n }\n if (options.status) {\n clauses.push(`thread.status = ${sqlQuote(options.status)}`);\n }\n if (Array.isArray(options.statuses) && options.statuses.length > 0) {\n const normalizedStatuses = options.statuses\n .map((status) => normalizeThreadStatus(status))\n .filter(Boolean);\n if (normalizedStatuses.length > 0) {\n clauses.push(`thread.status IN (${sqlStringList(normalizedStatuses)})`);\n }\n }\n if (options.kind) {\n clauses.push(`thread.kind = ${sqlQuote(options.kind)}`);\n }\n if (options.roomId) {\n clauses.push(`thread.room_id = ${sqlQuote(options.roomId)}`);\n }\n if (options.worldId) {\n clauses.push(`thread.world_id = ${sqlQuote(options.worldId)}`);\n }\n if (options.ownerUserId) {\n clauses.push(`thread.owner_user_id = ${sqlQuote(options.ownerUserId)}`);\n }\n if (options.scenarioId) {\n clauses.push(`thread.scenario_id = ${sqlQuote(options.scenarioId)}`);\n }\n if (options.batchId) {\n clauses.push(`thread.batch_id = ${sqlQuote(options.batchId)}`);\n }\n if (options.createdAfter) {\n clauses.push(`thread.created_at >= ${sqlQuote(options.createdAfter)}`);\n }\n if (options.createdBefore) {\n clauses.push(`thread.created_at <= ${sqlQuote(options.createdBefore)}`);\n }\n if (options.updatedAfter) {\n clauses.push(`thread.updated_at >= ${sqlQuote(options.updatedAfter)}`);\n }\n if (options.updatedBefore) {\n clauses.push(`thread.updated_at <= ${sqlQuote(options.updatedBefore)}`);\n }\n if (typeof options.latestActivityAfter === \"number\") {\n clauses.push(\n `COALESCE(latest.last_activity_at, 0) >= ${sqlInteger(options.latestActivityAfter)}`,\n );\n }\n if (typeof options.latestActivityBefore === \"number\") {\n clauses.push(\n `COALESCE(latest.last_activity_at, 0) <= ${sqlInteger(options.latestActivityBefore)}`,\n );\n }\n if (typeof options.hasActiveSession === \"boolean\") {\n clauses.push(\n options.hasActiveSession\n ? \"COALESCE(session_counts.active_session_count, 0) > 0\"\n : \"COALESCE(session_counts.active_session_count, 0) = 0\",\n );\n }\n if (options.search?.trim()) {\n const q = options.search.trim().toLowerCase().replace(/[%_]/g, \"\\\\$&\");\n clauses.push(`thread.search_text LIKE ${sqlQuote(`%${q}%`)}`);\n }\n\n return clauses;\n}\n\nexport class TaskRegistry {\n constructor(private readonly runtime: IAgentRuntime) {}\n\n private schemaKey(): object {\n const runtimeLike = this.runtime as IAgentRuntime & {\n adapter?: object;\n databaseAdapter?: object;\n };\n return (\n runtimeLike.adapter ??\n runtimeLike.databaseAdapter ??\n (this.runtime as unknown as object)\n );\n }\n\n async ensureSchema(): Promise<void> {\n const key = this.schemaKey();\n if (schemaReady.has(key)) return;\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_threads (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n room_id TEXT,\n world_id TEXT,\n owner_user_id TEXT,\n scenario_id TEXT,\n batch_id TEXT,\n title TEXT NOT NULL,\n kind TEXT NOT NULL DEFAULT 'coding',\n status TEXT NOT NULL DEFAULT 'open',\n original_request TEXT NOT NULL,\n summary TEXT NOT NULL DEFAULT '',\n acceptance_criteria_json TEXT NOT NULL DEFAULT '[]',\n current_plan_json TEXT NOT NULL DEFAULT '{}',\n search_text TEXT NOT NULL DEFAULT '',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n closed_at TEXT,\n archived_at TEXT,\n last_user_turn_at TEXT,\n last_coordinator_turn_at TEXT,\n metadata_json TEXT NOT NULL DEFAULT '{}'\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_sessions (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n session_id TEXT NOT NULL UNIQUE,\n framework TEXT NOT NULL,\n provider_source TEXT,\n label TEXT NOT NULL,\n original_task TEXT NOT NULL,\n workdir TEXT NOT NULL,\n repo TEXT,\n status TEXT NOT NULL DEFAULT 'active',\n decision_count INTEGER NOT NULL DEFAULT 0,\n auto_resolved_count INTEGER NOT NULL DEFAULT 0,\n registered_at BIGINT NOT NULL,\n last_activity_at BIGINT NOT NULL,\n idle_check_count INTEGER NOT NULL DEFAULT 0,\n task_delivered BOOLEAN NOT NULL DEFAULT FALSE,\n completion_summary TEXT,\n last_seen_decision_index INTEGER NOT NULL DEFAULT 0,\n last_input_sent_at BIGINT,\n stopped_at BIGINT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n metadata_json TEXT NOT NULL DEFAULT '{}'\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_decisions (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n timestamp BIGINT NOT NULL,\n event_type TEXT NOT NULL,\n prompt_text TEXT NOT NULL DEFAULT '',\n decision TEXT NOT NULL,\n response TEXT,\n reasoning TEXT NOT NULL,\n metadata_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_events (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n session_id TEXT,\n event_type TEXT NOT NULL,\n timestamp BIGINT NOT NULL,\n summary TEXT NOT NULL DEFAULT '',\n data_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_artifacts (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n session_id TEXT,\n artifact_type TEXT NOT NULL,\n title TEXT NOT NULL,\n path TEXT,\n uri TEXT,\n mime_type TEXT,\n metadata_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_transcripts (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n timestamp BIGINT NOT NULL,\n direction TEXT NOT NULL,\n content TEXT NOT NULL,\n metadata_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_pending_decisions (\n session_id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n prompt_text TEXT NOT NULL,\n recent_output TEXT NOT NULL DEFAULT '',\n llm_decision_json TEXT NOT NULL DEFAULT '{}',\n task_context_json TEXT NOT NULL DEFAULT '{}',\n created_at BIGINT NOT NULL,\n updated_at TEXT NOT NULL\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_nodes (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n parent_node_id TEXT,\n kind TEXT NOT NULL DEFAULT 'execution',\n status TEXT NOT NULL DEFAULT 'planned',\n title TEXT NOT NULL,\n instructions TEXT NOT NULL DEFAULT '',\n acceptance_criteria_json TEXT NOT NULL DEFAULT '[]',\n required_capabilities_json TEXT NOT NULL DEFAULT '[]',\n expected_artifacts_json TEXT NOT NULL DEFAULT '[]',\n assigned_session_id TEXT,\n assigned_label TEXT,\n agent_type TEXT,\n workdir TEXT,\n repo TEXT,\n priority INTEGER NOT NULL DEFAULT 0,\n depth INTEGER NOT NULL DEFAULT 0,\n sequence INTEGER NOT NULL DEFAULT 0,\n created_from TEXT,\n metadata_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n started_at TEXT,\n completed_at TEXT\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_dependencies (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n from_node_id TEXT NOT NULL,\n to_node_id TEXT NOT NULL,\n dependency_kind TEXT NOT NULL DEFAULT 'blocks',\n required_status TEXT NOT NULL DEFAULT 'completed',\n metadata_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_claims (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n node_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n claim_type TEXT NOT NULL DEFAULT 'execution',\n status TEXT NOT NULL DEFAULT 'active',\n claimed_at TEXT NOT NULL,\n released_at TEXT,\n metadata_json TEXT NOT NULL DEFAULT '{}'\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_mailbox (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n node_id TEXT,\n session_id TEXT,\n sender TEXT NOT NULL,\n recipient TEXT NOT NULL,\n subject TEXT NOT NULL DEFAULT '',\n body TEXT NOT NULL,\n delivery_state TEXT NOT NULL DEFAULT 'pending',\n metadata_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL,\n delivered_at TEXT\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_verifier_jobs (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n node_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n verifier_type TEXT NOT NULL,\n title TEXT NOT NULL,\n instructions TEXT NOT NULL DEFAULT '',\n config_json TEXT NOT NULL DEFAULT '{}',\n metadata_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL,\n started_at TEXT,\n completed_at TEXT\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `CREATE TABLE IF NOT EXISTS orchestrator_task_evidence (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n node_id TEXT,\n session_id TEXT,\n verifier_job_id TEXT,\n evidence_type TEXT NOT NULL,\n title TEXT NOT NULL,\n summary TEXT NOT NULL DEFAULT '',\n path TEXT,\n uri TEXT,\n content_json TEXT NOT NULL DEFAULT '{}',\n metadata_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `ALTER TABLE orchestrator_task_threads ADD COLUMN scenario_id TEXT`,\n ).catch(() => undefined);\n await executeRawSql(\n this.runtime,\n `ALTER TABLE orchestrator_task_threads ADD COLUMN batch_id TEXT`,\n ).catch(() => undefined);\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_status\n ON orchestrator_task_threads(status)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_scenario_id\n ON orchestrator_task_threads(scenario_id)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_batch_id\n ON orchestrator_task_threads(batch_id)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_updated_at\n ON orchestrator_task_threads(updated_at)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_threads_archived_at\n ON orchestrator_task_threads(archived_at)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_sessions_thread_id\n ON orchestrator_task_sessions(thread_id)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_sessions_status\n ON orchestrator_task_sessions(status)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_decisions_thread_id\n ON orchestrator_task_decisions(thread_id, timestamp DESC)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_events_thread_id\n ON orchestrator_task_events(thread_id, timestamp DESC)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_transcripts_thread_id\n ON orchestrator_task_transcripts(thread_id, timestamp DESC)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_pending_decisions_thread_id\n ON orchestrator_task_pending_decisions(thread_id)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_pending_decisions_created_at\n ON orchestrator_task_pending_decisions(created_at DESC)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_nodes_thread_id\n ON orchestrator_task_nodes(thread_id, sequence ASC, created_at ASC)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_nodes_status\n ON orchestrator_task_nodes(thread_id, status)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_dependencies_thread_id\n ON orchestrator_task_dependencies(thread_id)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_dependencies_to_node_id\n ON orchestrator_task_dependencies(to_node_id)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_claims_thread_id\n ON orchestrator_task_claims(thread_id, status, claimed_at DESC)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_claims_node_id\n ON orchestrator_task_claims(node_id, status)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_mailbox_thread_id\n ON orchestrator_task_mailbox(thread_id, created_at ASC)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_verifier_jobs_thread_id\n ON orchestrator_task_verifier_jobs(thread_id, status, created_at ASC)`,\n );\n await executeRawSql(\n this.runtime,\n `CREATE INDEX IF NOT EXISTS idx_orchestrator_task_evidence_thread_id\n ON orchestrator_task_evidence(thread_id, created_at ASC)`,\n );\n\n schemaReady.add(key);\n }\n\n async recoverInterruptedTasks(): Promise<void> {\n await this.ensureSchema();\n const impactedSessions = await executeRawSql(\n this.runtime,\n `SELECT session_id, thread_id\n FROM orchestrator_task_sessions\n WHERE status IN ('active', 'blocked', 'tool_running')`,\n );\n if (impactedSessions.length === 0) return;\n\n const nowIso = isoNow();\n const now = Date.now();\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_sessions\n SET status = 'interrupted',\n updated_at = ${sqlQuote(nowIso)},\n stopped_at = COALESCE(stopped_at, ${sqlInteger(now)})\n WHERE status IN ('active', 'blocked', 'tool_running')`,\n );\n\n const affectedThreadIds = new Set<string>();\n for (const row of impactedSessions) {\n const sessionId = toText(row.session_id);\n const threadId = toText(row.thread_id);\n if (!threadId) continue;\n affectedThreadIds.add(threadId);\n await this.appendEvent({\n threadId,\n sessionId,\n eventType: \"session_interrupted\",\n timestamp: now,\n summary: \"Session interrupted by runtime restart or shutdown\",\n data: { reason: \"runtime_restart\" },\n });\n }\n\n for (const threadId of affectedThreadIds) {\n await this.recomputeThreadStatus(threadId);\n }\n }\n\n async createThread(input: CreateTaskThreadInput): Promise<TaskThreadRecord> {\n await this.ensureSchema();\n const id = input.id?.trim() || `task-${crypto.randomUUID()}`;\n const createdAt = isoNow();\n const acceptanceCriteria = input.acceptanceCriteria ?? [];\n const currentPlan = input.currentPlan ?? {};\n const summary = input.summary?.trim() ?? \"\";\n const scenarioId =\n input.scenarioId ??\n (typeof input.metadata?.scenarioId === \"string\"\n ? input.metadata.scenarioId\n : typeof input.metadata?.scenario_id === \"string\"\n ? input.metadata.scenario_id\n : null);\n const batchId =\n input.batchId ??\n (typeof input.metadata?.batchId === \"string\"\n ? input.metadata.batchId\n : typeof input.metadata?.batch_id === \"string\"\n ? input.metadata.batch_id\n : null);\n const searchText = buildSearchText([\n input.title,\n input.originalRequest,\n summary,\n scenarioId,\n batchId,\n input.metadata ? JSON.stringify(input.metadata) : \"\",\n ]);\n\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_threads (\n id, agent_id, room_id, world_id, owner_user_id, scenario_id, batch_id, title, kind, status,\n original_request, summary, acceptance_criteria_json, current_plan_json,\n search_text, created_at, updated_at, closed_at, archived_at,\n last_user_turn_at, last_coordinator_turn_at, metadata_json\n ) VALUES (\n ${sqlQuote(id)},\n ${sqlQuote(this.runtime.agentId)},\n ${sqlText(input.roomId ?? null)},\n ${sqlText(input.worldId ?? null)},\n ${sqlText(input.ownerUserId ?? null)},\n ${sqlText(scenarioId ?? null)},\n ${sqlText(batchId ?? null)},\n ${sqlQuote(input.title.trim())},\n ${sqlQuote(input.kind ?? \"coding\")},\n 'open',\n ${sqlQuote(input.originalRequest)},\n ${sqlQuote(summary)},\n ${sqlJson(acceptanceCriteria)},\n ${sqlJson(currentPlan)},\n ${sqlQuote(searchText)},\n ${sqlQuote(createdAt)},\n ${sqlQuote(createdAt)},\n NULL,\n NULL,\n ${sqlText(input.lastUserTurnAt ?? createdAt)},\n NULL,\n ${sqlJson(input.metadata ?? {})}\n )`,\n );\n\n await this.appendEvent({\n threadId: id,\n eventType: \"task_created\",\n timestamp: Date.now(),\n summary: `Created task thread \"${input.title.trim()}\"`,\n data: {\n kind: input.kind ?? \"coding\",\n roomId: input.roomId ?? null,\n worldId: input.worldId ?? null,\n },\n });\n\n const created = await this.getThreadRecord(id);\n if (!created) {\n throw new Error(`Failed to create task thread ${id}`);\n }\n return created;\n }\n\n async getThreadRecord(threadId: string): Promise<TaskThreadRecord | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_threads\n WHERE id = ${sqlQuote(threadId)}\n LIMIT 1`,\n );\n return rows[0] ? parseThreadRow(rows[0]) : null;\n }\n\n async getThread(threadId: string): Promise<TaskThreadDetail | null> {\n await this.ensureSchema();\n const summary = await this.getThreadSummary(threadId);\n if (!summary) return null;\n\n const [\n sessions,\n decisions,\n events,\n artifacts,\n transcripts,\n pendingDecisions,\n nodes,\n dependencies,\n claims,\n mailbox,\n verifierJobs,\n evidence,\n ] = await Promise.all([\n this.listSessionsForThread(threadId),\n this.listDecisionsForThread(threadId),\n this.listEventsForThread(threadId),\n this.listArtifactsForThread(threadId),\n this.listTranscriptsForThread(threadId),\n this.listPendingDecisionsForThread(threadId),\n this.listTaskNodesForThread(threadId),\n this.listTaskDependenciesForThread(threadId),\n this.listTaskClaimsForThread(threadId),\n this.listTaskMailboxMessagesForThread(threadId),\n this.listTaskVerifierJobsForThread(threadId),\n this.listTaskEvidenceForThread(threadId),\n ]);\n\n return {\n ...summary,\n sessions,\n decisions,\n events,\n artifacts,\n transcripts,\n pendingDecisions,\n nodes,\n dependencies,\n claims,\n mailbox,\n verifierJobs,\n evidence,\n };\n }\n\n async listThreads(\n options: ListTaskThreadsOptions = {},\n ): Promise<TaskThreadSummary[]> {\n await this.ensureSchema();\n const clauses = buildThreadListWhereClauses(options);\n const whereClause =\n clauses.length > 0 ? `WHERE ${clauses.join(\" AND \")}` : \"\";\n const limitClause =\n typeof options.limit === \"number\" && options.limit > 0\n ? `LIMIT ${Math.trunc(options.limit)}`\n : \"\";\n\n const rows = await executeRawSql(\n this.runtime,\n `SELECT\n thread.*,\n COALESCE(session_counts.session_count, 0) AS session_count,\n COALESCE(session_counts.active_session_count, 0) AS active_session_count,\n latest.session_id AS latest_session_id,\n latest.label AS latest_session_label,\n latest.workdir AS latest_workdir,\n latest.repo AS latest_repo,\n latest.last_activity_at AS latest_activity_at,\n COALESCE(decision_counts.decision_count, 0) AS decision_count,\n COALESCE(node_counts.node_count, 0) AS node_count,\n COALESCE(node_counts.ready_node_count, 0) AS ready_node_count,\n COALESCE(node_counts.completed_node_count, 0) AS completed_node_count,\n COALESCE(verifier_counts.verifier_job_count, 0) AS verifier_job_count,\n COALESCE(evidence_counts.evidence_count, 0) AS evidence_count\n FROM orchestrator_task_threads AS thread\n LEFT JOIN (\n SELECT\n thread_id,\n COUNT(*) AS session_count,\n SUM(CASE WHEN status IN ('active', 'blocked', 'tool_running') THEN 1 ELSE 0 END) AS active_session_count\n FROM orchestrator_task_sessions\n GROUP BY thread_id\n ) AS session_counts\n ON session_counts.thread_id = thread.id\n LEFT JOIN (\n SELECT latest_session.thread_id,\n latest_session.session_id,\n latest_session.label,\n latest_session.workdir,\n latest_session.repo,\n latest_session.last_activity_at\n FROM orchestrator_task_sessions AS latest_session\n INNER JOIN (\n SELECT thread_id, MAX(last_activity_at) AS max_last_activity_at\n FROM orchestrator_task_sessions\n GROUP BY thread_id\n ) AS grouped\n ON grouped.thread_id = latest_session.thread_id\n AND grouped.max_last_activity_at = latest_session.last_activity_at\n ) AS latest\n ON latest.thread_id = thread.id\n LEFT JOIN (\n SELECT thread_id, COUNT(*) AS decision_count\n FROM orchestrator_task_decisions\n GROUP BY thread_id\n ) AS decision_counts\n ON decision_counts.thread_id = thread.id\n LEFT JOIN (\n SELECT\n thread_id,\n COUNT(*) AS node_count,\n SUM(CASE WHEN status = 'ready' THEN 1 ELSE 0 END) AS ready_node_count,\n SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed_node_count\n FROM orchestrator_task_nodes\n GROUP BY thread_id\n ) AS node_counts\n ON node_counts.thread_id = thread.id\n LEFT JOIN (\n SELECT thread_id, COUNT(*) AS verifier_job_count\n FROM orchestrator_task_verifier_jobs\n GROUP BY thread_id\n ) AS verifier_counts\n ON verifier_counts.thread_id = thread.id\n LEFT JOIN (\n SELECT thread_id, COUNT(*) AS evidence_count\n FROM orchestrator_task_evidence\n GROUP BY thread_id\n ) AS evidence_counts\n ON evidence_counts.thread_id = thread.id\n ${whereClause}\n ORDER BY thread.updated_at DESC\n ${limitClause}`,\n );\n\n return rows.map(parseThreadSummaryRow);\n }\n\n async countThreads(options: ListTaskThreadsOptions = {}): Promise<number> {\n await this.ensureSchema();\n const clauses = buildThreadListWhereClauses(options);\n const whereClause =\n clauses.length > 0 ? `WHERE ${clauses.join(\" AND \")}` : \"\";\n\n const rows = await executeRawSql(\n this.runtime,\n `SELECT COUNT(*) AS total\n FROM orchestrator_task_threads AS thread\n LEFT JOIN (\n SELECT\n thread_id,\n COUNT(*) AS session_count,\n SUM(CASE WHEN status IN ('active', 'blocked', 'tool_running') THEN 1 ELSE 0 END) AS active_session_count\n FROM orchestrator_task_sessions\n GROUP BY thread_id\n ) AS session_counts\n ON session_counts.thread_id = thread.id\n LEFT JOIN (\n SELECT latest_session.thread_id,\n latest_session.session_id,\n latest_session.label,\n latest_session.workdir,\n latest_session.repo,\n latest_session.last_activity_at\n FROM orchestrator_task_sessions AS latest_session\n INNER JOIN (\n SELECT thread_id, MAX(last_activity_at) AS max_last_activity_at\n FROM orchestrator_task_sessions\n GROUP BY thread_id\n ) AS grouped\n ON grouped.thread_id = latest_session.thread_id\n AND grouped.max_last_activity_at = latest_session.last_activity_at\n ) AS latest\n ON latest.thread_id = thread.id\n LEFT JOIN (\n SELECT\n thread_id,\n COUNT(*) AS node_count,\n SUM(CASE WHEN status = 'ready' THEN 1 ELSE 0 END) AS ready_node_count,\n SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed_node_count\n FROM orchestrator_task_nodes\n GROUP BY thread_id\n ) AS node_counts\n ON node_counts.thread_id = thread.id\n LEFT JOIN (\n SELECT thread_id, COUNT(*) AS verifier_job_count\n FROM orchestrator_task_verifier_jobs\n GROUP BY thread_id\n ) AS verifier_counts\n ON verifier_counts.thread_id = thread.id\n LEFT JOIN (\n SELECT thread_id, COUNT(*) AS evidence_count\n FROM orchestrator_task_evidence\n GROUP BY thread_id\n ) AS evidence_counts\n ON evidence_counts.thread_id = thread.id\n ${whereClause}`,\n );\n\n return toNumber(rows[0]?.total, 0);\n }\n\n async getThreadSummary(threadId: string): Promise<TaskThreadSummary | null> {\n const rows = await this.listThreads({\n includeArchived: true,\n });\n return rows.find((row) => row.id === threadId) ?? null;\n }\n\n async findThreadIdBySessionId(sessionId: string): Promise<string | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT thread_id\n FROM orchestrator_task_sessions\n WHERE session_id = ${sqlQuote(sessionId)}\n LIMIT 1`,\n );\n return rows[0] ? toText(rows[0].thread_id) : null;\n }\n\n async getSession(sessionId: string): Promise<TaskSessionRecord | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_sessions\n WHERE session_id = ${sqlQuote(sessionId)}\n LIMIT 1`,\n );\n return rows[0] ? parseSessionRow(rows[0]) : null;\n }\n\n async registerSession(input: RegisterTaskSessionInput): Promise<void> {\n await this.ensureSchema();\n const nowIso = isoNow();\n const registeredAt = input.registeredAt ?? Date.now();\n const lastActivityAt = input.lastActivityAt ?? registeredAt;\n const existingThread = await this.getThreadRecord(input.threadId);\n if (!existingThread) {\n throw new Error(`Task thread ${input.threadId} not found`);\n }\n\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_sessions (\n id, thread_id, agent_id, session_id, framework, provider_source, label,\n original_task, workdir, repo, status, decision_count, auto_resolved_count,\n registered_at, last_activity_at, idle_check_count, task_delivered,\n completion_summary, last_seen_decision_index, last_input_sent_at, stopped_at,\n created_at, updated_at, metadata_json\n ) VALUES (\n ${sqlQuote(input.sessionId)},\n ${sqlQuote(input.threadId)},\n ${sqlQuote(this.runtime.agentId)},\n ${sqlQuote(input.sessionId)},\n ${sqlQuote(input.framework)},\n ${sqlText(input.providerSource ?? null)},\n ${sqlQuote(input.label)},\n ${sqlQuote(input.originalTask)},\n ${sqlQuote(input.workdir)},\n ${sqlText(input.repo ?? null)},\n ${sqlQuote(input.status ?? \"active\")},\n ${sqlInteger(input.decisionCount ?? 0)},\n ${sqlInteger(input.autoResolvedCount ?? 0)},\n ${sqlInteger(registeredAt)},\n ${sqlInteger(lastActivityAt)},\n ${sqlInteger(input.idleCheckCount ?? 0)},\n ${sqlBoolean(input.taskDelivered ?? false)},\n ${sqlText(input.completionSummary ?? null)},\n ${sqlInteger(input.lastSeenDecisionIndex ?? 0)},\n ${sqlInteger(input.lastInputSentAt ?? null)},\n ${sqlInteger(input.stoppedAt ?? null)},\n ${sqlQuote(nowIso)},\n ${sqlQuote(nowIso)},\n ${sqlJson(input.metadata ?? {})}\n )\n ON CONFLICT(id) DO UPDATE SET\n thread_id = EXCLUDED.thread_id,\n framework = EXCLUDED.framework,\n provider_source = EXCLUDED.provider_source,\n label = EXCLUDED.label,\n original_task = EXCLUDED.original_task,\n workdir = EXCLUDED.workdir,\n repo = EXCLUDED.repo,\n status = EXCLUDED.status,\n decision_count = EXCLUDED.decision_count,\n auto_resolved_count = EXCLUDED.auto_resolved_count,\n registered_at = EXCLUDED.registered_at,\n last_activity_at = EXCLUDED.last_activity_at,\n idle_check_count = EXCLUDED.idle_check_count,\n task_delivered = EXCLUDED.task_delivered,\n completion_summary = EXCLUDED.completion_summary,\n last_seen_decision_index = EXCLUDED.last_seen_decision_index,\n last_input_sent_at = EXCLUDED.last_input_sent_at,\n stopped_at = EXCLUDED.stopped_at,\n updated_at = EXCLUDED.updated_at,\n metadata_json = EXCLUDED.metadata_json`,\n );\n\n await this.appendEvent({\n threadId: input.threadId,\n sessionId: input.sessionId,\n eventType: \"session_registered\",\n timestamp: registeredAt,\n summary: `Registered session \"${input.label}\"`,\n data: {\n framework: input.framework,\n repo: input.repo ?? null,\n workdir: input.workdir,\n },\n });\n\n await this.recomputeThreadStatus(input.threadId);\n }\n\n async updateSession(\n sessionId: string,\n patch: UpdateTaskSessionInput,\n ): Promise<void> {\n await this.ensureSchema();\n const threadId = await this.findThreadIdBySessionId(sessionId);\n if (!threadId) return;\n const existingRows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_sessions\n WHERE session_id = ${sqlQuote(sessionId)}\n LIMIT 1`,\n );\n if (!existingRows[0]) return;\n const existing = parseSessionRow(existingRows[0]);\n const nextMeta = patch.metadata\n ? { ...existing.metadata, ...patch.metadata }\n : existing.metadata;\n const nowIso = isoNow();\n\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_sessions\n SET status = ${sqlQuote(patch.status ?? existing.status)},\n decision_count = ${sqlInteger(\n patch.decisionCount ?? existing.decisionCount,\n )},\n auto_resolved_count = ${sqlInteger(\n patch.autoResolvedCount ?? existing.autoResolvedCount,\n )},\n last_activity_at = ${sqlInteger(\n patch.lastActivityAt ?? existing.lastActivityAt,\n )},\n idle_check_count = ${sqlInteger(\n patch.idleCheckCount ?? existing.idleCheckCount,\n )},\n task_delivered = ${sqlBoolean(\n patch.taskDelivered ?? existing.taskDelivered,\n )},\n completion_summary = ${sqlText(\n patch.completionSummary ?? existing.completionSummary,\n )},\n last_seen_decision_index = ${sqlInteger(\n patch.lastSeenDecisionIndex ?? existing.lastSeenDecisionIndex,\n )},\n last_input_sent_at = ${sqlInteger(\n patch.lastInputSentAt ?? existing.lastInputSentAt,\n )},\n stopped_at = ${sqlInteger(patch.stoppedAt ?? existing.stoppedAt)},\n updated_at = ${sqlQuote(nowIso)},\n metadata_json = ${sqlJson(nextMeta)}\n WHERE session_id = ${sqlQuote(sessionId)}`,\n );\n\n await this.appendEvent({\n threadId,\n sessionId,\n eventType: \"session_updated\",\n timestamp: patch.lastActivityAt ?? Date.now(),\n summary: `Updated session \"${existing.label}\"`,\n data: {\n status: patch.status ?? existing.status,\n decisionCount: patch.decisionCount ?? existing.decisionCount,\n autoResolvedCount:\n patch.autoResolvedCount ?? existing.autoResolvedCount,\n },\n });\n\n await this.recomputeThreadStatus(threadId);\n }\n\n async recordDecision(input: RecordTaskDecisionInput): Promise<void> {\n await this.ensureSchema();\n const createdAt = isoNow();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_decisions (\n id, thread_id, session_id, timestamp, event_type, prompt_text, decision,\n response, reasoning, metadata_json, created_at\n ) VALUES (\n ${sqlQuote(`decision-${crypto.randomUUID()}`)},\n ${sqlQuote(input.threadId)},\n ${sqlQuote(input.sessionId)},\n ${sqlInteger(input.timestamp)},\n ${sqlQuote(input.event)},\n ${sqlQuote(input.promptText)},\n ${sqlQuote(input.decision)},\n ${sqlText(input.response ?? null)},\n ${sqlQuote(input.reasoning)},\n ${sqlJson(input.metadata ?? {})},\n ${sqlQuote(createdAt)}\n )`,\n );\n\n await this.appendEvent({\n threadId: input.threadId,\n sessionId: input.sessionId,\n eventType: \"decision_recorded\",\n timestamp: input.timestamp,\n summary: `${input.decision} decision recorded`,\n data: {\n event: input.event,\n promptText: input.promptText,\n response: input.response ?? null,\n },\n });\n }\n\n async appendEvent(input: RecordTaskEventInput): Promise<void> {\n await this.ensureSchema();\n const createdAt = isoNow();\n const timestamp = input.timestamp ?? Date.now();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_events (\n id, thread_id, session_id, event_type, timestamp, summary, data_json, created_at\n ) VALUES (\n ${sqlQuote(`event-${crypto.randomUUID()}`)},\n ${sqlQuote(input.threadId)},\n ${sqlText(input.sessionId ?? null)},\n ${sqlQuote(input.eventType)},\n ${sqlInteger(timestamp)},\n ${sqlQuote(input.summary ?? \"\")},\n ${sqlJson(input.data ?? {})},\n ${sqlQuote(createdAt)}\n )`,\n );\n\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET updated_at = ${sqlQuote(createdAt)}\n WHERE id = ${sqlQuote(input.threadId)}`,\n );\n }\n\n async recordArtifact(input: RecordTaskArtifactInput): Promise<void> {\n await this.ensureSchema();\n const createdAt = isoNow();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_artifacts (\n id, thread_id, session_id, artifact_type, title, path, uri, mime_type, metadata_json, created_at\n ) VALUES (\n ${sqlQuote(`artifact-${crypto.randomUUID()}`)},\n ${sqlQuote(input.threadId)},\n ${sqlText(input.sessionId ?? null)},\n ${sqlQuote(input.artifactType)},\n ${sqlQuote(input.title)},\n ${sqlText(input.path ?? null)},\n ${sqlText(input.uri ?? null)},\n ${sqlText(input.mimeType ?? null)},\n ${sqlJson(input.metadata ?? {})},\n ${sqlQuote(createdAt)}\n )`,\n );\n\n await this.appendEvent({\n threadId: input.threadId,\n sessionId: input.sessionId ?? null,\n eventType: \"artifact_recorded\",\n summary: `Recorded ${input.artifactType} artifact`,\n data: {\n artifactType: input.artifactType,\n title: input.title,\n path: input.path ?? null,\n uri: input.uri ?? null,\n },\n });\n }\n\n async recordTranscript(input: RecordTaskTranscriptInput): Promise<void> {\n await this.ensureSchema();\n const createdAt = isoNow();\n const timestamp = input.timestamp ?? Date.now();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_transcripts (\n id, thread_id, session_id, timestamp, direction, content, metadata_json, created_at\n ) VALUES (\n ${sqlQuote(`transcript-${crypto.randomUUID()}`)},\n ${sqlQuote(input.threadId)},\n ${sqlQuote(input.sessionId)},\n ${sqlInteger(timestamp)},\n ${sqlQuote(input.direction)},\n ${sqlQuote(input.content)},\n ${sqlJson(input.metadata ?? {})},\n ${sqlQuote(createdAt)}\n )`,\n );\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET updated_at = ${sqlQuote(createdAt)}\n WHERE id = ${sqlQuote(input.threadId)}`,\n );\n }\n\n async updateThreadSummary(threadId: string, summary: string): Promise<void> {\n await this.ensureSchema();\n const thread = await this.getThreadRecord(threadId);\n if (!thread) return;\n const nextSearchText = buildSearchText([\n thread.title,\n thread.originalRequest,\n summary,\n thread.searchText,\n ]);\n const nowIso = isoNow();\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET summary = ${sqlQuote(summary)},\n search_text = ${sqlQuote(nextSearchText)},\n updated_at = ${sqlQuote(nowIso)}\n WHERE id = ${sqlQuote(threadId)}`,\n );\n await this.appendEvent({\n threadId,\n eventType: \"summary_updated\",\n summary: \"Updated task summary\",\n data: { summary },\n });\n }\n\n async updateThread(\n threadId: string,\n patch: UpdateTaskThreadInput,\n ): Promise<void> {\n await this.ensureSchema();\n const existing = await this.getThreadRecord(threadId);\n if (!existing) return;\n\n const nextMetadata = patch.metadata\n ? { ...existing.metadata, ...patch.metadata }\n : existing.metadata;\n const nextSummary = patch.summary ?? existing.summary;\n const nextSearchText = buildSearchText([\n existing.title,\n existing.originalRequest,\n nextSummary,\n patch.status ?? existing.status,\n existing.scenarioId,\n existing.batchId,\n JSON.stringify(nextMetadata),\n ]);\n const nowIso = isoNow();\n\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET status = ${sqlQuote(patch.status ?? existing.status)},\n summary = ${sqlQuote(nextSummary)},\n current_plan_json = ${sqlJson(\n patch.currentPlan ?? existing.currentPlan,\n )},\n search_text = ${sqlQuote(nextSearchText)},\n closed_at = ${sqlText(\n patch.closedAt !== undefined\n ? patch.closedAt\n : existing.closedAt,\n )},\n archived_at = ${sqlText(\n patch.archivedAt !== undefined\n ? patch.archivedAt\n : existing.archivedAt,\n )},\n last_user_turn_at = ${sqlText(\n patch.lastUserTurnAt !== undefined\n ? patch.lastUserTurnAt\n : existing.lastUserTurnAt,\n )},\n last_coordinator_turn_at = ${sqlText(\n patch.lastCoordinatorTurnAt !== undefined\n ? patch.lastCoordinatorTurnAt\n : existing.lastCoordinatorTurnAt,\n )},\n updated_at = ${sqlQuote(nowIso)},\n metadata_json = ${sqlJson(nextMetadata)}\n WHERE id = ${sqlQuote(threadId)}`,\n );\n }\n\n async archiveThread(threadId: string): Promise<void> {\n await this.ensureSchema();\n const nowIso = isoNow();\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET status = 'archived',\n archived_at = ${sqlQuote(nowIso)},\n closed_at = COALESCE(closed_at, ${sqlQuote(nowIso)}),\n updated_at = ${sqlQuote(nowIso)}\n WHERE id = ${sqlQuote(threadId)}`,\n );\n await this.appendEvent({\n threadId,\n eventType: \"task_archived\",\n summary: \"Archived task thread\",\n data: {},\n });\n }\n\n async reopenThread(threadId: string): Promise<void> {\n await this.ensureSchema();\n const nowIso = isoNow();\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET status = 'open',\n archived_at = NULL,\n closed_at = NULL,\n updated_at = ${sqlQuote(nowIso)}\n WHERE id = ${sqlQuote(threadId)}`,\n );\n await this.appendEvent({\n threadId,\n eventType: \"task_reopened\",\n summary: \"Reopened task thread\",\n data: {},\n });\n await this.recomputeThreadStatus(threadId);\n }\n\n async upsertPendingDecision(\n input: UpsertPendingDecisionInput,\n ): Promise<void> {\n await this.ensureSchema();\n const createdAt = input.createdAt ?? Date.now();\n const nowIso = isoNow();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_pending_decisions (\n session_id,\n thread_id,\n prompt_text,\n recent_output,\n llm_decision_json,\n task_context_json,\n created_at,\n updated_at\n ) VALUES (\n ${sqlQuote(input.sessionId)},\n ${sqlQuote(input.threadId)},\n ${sqlQuote(input.promptText)},\n ${sqlQuote(input.recentOutput)},\n ${sqlJson(input.llmDecision)},\n ${sqlJson(input.taskContext)},\n ${sqlInteger(createdAt)},\n ${sqlQuote(nowIso)}\n )\n ON CONFLICT(session_id) DO UPDATE SET\n thread_id = EXCLUDED.thread_id,\n prompt_text = EXCLUDED.prompt_text,\n recent_output = EXCLUDED.recent_output,\n llm_decision_json = EXCLUDED.llm_decision_json,\n task_context_json = EXCLUDED.task_context_json,\n created_at = EXCLUDED.created_at,\n updated_at = EXCLUDED.updated_at`,\n );\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET updated_at = ${sqlQuote(nowIso)}\n WHERE id = ${sqlQuote(input.threadId)}`,\n );\n }\n\n async deletePendingDecision(sessionId: string): Promise<void> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT thread_id\n FROM orchestrator_task_pending_decisions\n WHERE session_id = ${sqlQuote(sessionId)}\n LIMIT 1`,\n );\n if (rows.length === 0) return;\n const threadId = toText(rows[0]?.thread_id);\n await executeRawSql(\n this.runtime,\n `DELETE FROM orchestrator_task_pending_decisions\n WHERE session_id = ${sqlQuote(sessionId)}`,\n );\n if (threadId) {\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET updated_at = ${sqlQuote(isoNow())}\n WHERE id = ${sqlQuote(threadId)}`,\n );\n }\n }\n\n async listPendingDecisions(): Promise<TaskPendingDecisionRecord[]> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_pending_decisions\n ORDER BY created_at ASC`,\n );\n return rows.map(parsePendingDecisionRow);\n }\n\n async listPendingDecisionsForThread(\n threadId: string,\n ): Promise<TaskPendingDecisionRecord[]> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_pending_decisions\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parsePendingDecisionRow);\n }\n\n async createTaskNode(input: CreateTaskNodeInput): Promise<TaskNodeRecord> {\n await this.ensureSchema();\n const nowIso = isoNow();\n const id = input.id?.trim() || `node-${crypto.randomUUID()}`;\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_nodes (\n id, thread_id, parent_node_id, kind, status, title, instructions,\n acceptance_criteria_json, required_capabilities_json, expected_artifacts_json,\n assigned_session_id, assigned_label, agent_type, workdir, repo, priority,\n depth, sequence, created_from, metadata_json, created_at, updated_at,\n started_at, completed_at\n ) VALUES (\n ${sqlQuote(id)},\n ${sqlQuote(input.threadId)},\n ${sqlText(input.parentNodeId ?? null)},\n ${sqlQuote(input.kind ?? \"execution\")},\n ${sqlQuote(input.status ?? \"planned\")},\n ${sqlQuote(input.title)},\n ${sqlQuote(input.instructions ?? \"\")},\n ${sqlJson(input.acceptanceCriteria ?? [])},\n ${sqlJson(input.requiredCapabilities ?? [])},\n ${sqlJson(input.expectedArtifacts ?? [])},\n ${sqlText(input.assignedSessionId ?? null)},\n ${sqlText(input.assignedLabel ?? null)},\n ${sqlText(input.agentType ?? null)},\n ${sqlText(input.workdir ?? null)},\n ${sqlText(input.repo ?? null)},\n ${sqlInteger(input.priority ?? 0)},\n ${sqlInteger(input.depth ?? 0)},\n ${sqlInteger(input.sequence ?? 0)},\n ${sqlText(input.createdFrom ?? null)},\n ${sqlJson(input.metadata ?? {})},\n ${sqlQuote(nowIso)},\n ${sqlQuote(nowIso)},\n ${sqlText(input.startedAt ?? null)},\n ${sqlText(input.completedAt ?? null)}\n )`,\n );\n await this.appendEvent({\n threadId: input.threadId,\n sessionId: input.assignedSessionId ?? null,\n eventType: \"task_node_created\",\n summary: `Created task node \"${input.title}\"`,\n data: {\n nodeId: id,\n kind: input.kind ?? \"execution\",\n status: input.status ?? \"planned\",\n parentNodeId: input.parentNodeId ?? null,\n },\n });\n const node = await this.getTaskNode(id);\n if (!node) {\n throw new Error(`Failed to create task node ${id}`);\n }\n await this.recomputeTaskGraphState(input.threadId);\n return node;\n }\n\n async getTaskNode(nodeId: string): Promise<TaskNodeRecord | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_nodes\n WHERE id = ${sqlQuote(nodeId)}\n LIMIT 1`,\n );\n return rows[0] ? parseTaskNodeRow(rows[0]) : null;\n }\n\n async updateTaskNode(\n nodeId: string,\n patch: UpdateTaskNodeInput,\n ): Promise<void> {\n await this.ensureSchema();\n const existing = await this.getTaskNode(nodeId);\n if (!existing) return;\n const nextMetadata = patch.metadata\n ? { ...existing.metadata, ...patch.metadata }\n : existing.metadata;\n const nextStatus = patch.status ?? existing.status;\n const nextStartedAt =\n patch.startedAt !== undefined\n ? patch.startedAt\n : nextStatus === \"running\" || nextStatus === \"verifying\"\n ? (existing.startedAt ?? isoNow())\n : existing.startedAt;\n const nextCompletedAt =\n patch.completedAt !== undefined\n ? patch.completedAt\n : [\"completed\", \"failed\", \"canceled\", \"interrupted\"].includes(\n nextStatus,\n )\n ? (existing.completedAt ?? isoNow())\n : null;\n const nowIso = isoNow();\n\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_nodes\n SET parent_node_id = ${sqlText(\n patch.parentNodeId !== undefined\n ? patch.parentNodeId\n : existing.parentNodeId,\n )},\n kind = ${sqlQuote(patch.kind ?? existing.kind)},\n status = ${sqlQuote(nextStatus)},\n title = ${sqlQuote(patch.title ?? existing.title)},\n instructions = ${sqlQuote(\n patch.instructions ?? existing.instructions,\n )},\n acceptance_criteria_json = ${sqlJson(\n patch.acceptanceCriteria ?? existing.acceptanceCriteria,\n )},\n required_capabilities_json = ${sqlJson(\n patch.requiredCapabilities ?? existing.requiredCapabilities,\n )},\n expected_artifacts_json = ${sqlJson(\n patch.expectedArtifacts ?? existing.expectedArtifacts,\n )},\n assigned_session_id = ${sqlText(\n patch.assignedSessionId !== undefined\n ? patch.assignedSessionId\n : existing.assignedSessionId,\n )},\n assigned_label = ${sqlText(\n patch.assignedLabel !== undefined\n ? patch.assignedLabel\n : existing.assignedLabel,\n )},\n agent_type = ${sqlText(\n patch.agentType !== undefined\n ? patch.agentType\n : existing.agentType,\n )},\n workdir = ${sqlText(\n patch.workdir !== undefined ? patch.workdir : existing.workdir,\n )},\n repo = ${sqlText(\n patch.repo !== undefined ? patch.repo : existing.repo,\n )},\n priority = ${sqlInteger(patch.priority ?? existing.priority)},\n depth = ${sqlInteger(patch.depth ?? existing.depth)},\n sequence = ${sqlInteger(patch.sequence ?? existing.sequence)},\n created_from = ${sqlText(\n patch.createdFrom !== undefined\n ? patch.createdFrom\n : existing.createdFrom,\n )},\n metadata_json = ${sqlJson(nextMetadata)},\n updated_at = ${sqlQuote(nowIso)},\n started_at = ${sqlText(nextStartedAt)},\n completed_at = ${sqlText(nextCompletedAt)}\n WHERE id = ${sqlQuote(nodeId)}`,\n );\n await this.appendEvent({\n threadId: existing.threadId,\n sessionId:\n patch.assignedSessionId !== undefined\n ? patch.assignedSessionId\n : existing.assignedSessionId,\n eventType: \"task_node_updated\",\n summary: `Updated task node \"${patch.title ?? existing.title}\"`,\n data: {\n nodeId,\n status: nextStatus,\n },\n });\n await this.recomputeTaskGraphState(existing.threadId);\n }\n\n async listTaskNodesForThread(threadId: string): Promise<TaskNodeRecord[]> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_nodes\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY depth ASC, sequence ASC, created_at ASC`,\n );\n return rows.map(parseTaskNodeRow);\n }\n\n async listReadyTaskNodesForThread(\n threadId: string,\n ): Promise<TaskNodeRecord[]> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_nodes\n WHERE thread_id = ${sqlQuote(threadId)}\n AND status = 'ready'\n ORDER BY priority DESC, depth ASC, sequence ASC, created_at ASC`,\n );\n return rows.map(parseTaskNodeRow);\n }\n\n async createTaskDependency(\n input: CreateTaskDependencyInput,\n ): Promise<TaskDependencyRecord> {\n await this.ensureSchema();\n const createdAt = isoNow();\n const id = input.id?.trim() || `dep-${crypto.randomUUID()}`;\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_dependencies (\n id, thread_id, from_node_id, to_node_id, dependency_kind, required_status,\n metadata_json, created_at\n ) VALUES (\n ${sqlQuote(id)},\n ${sqlQuote(input.threadId)},\n ${sqlQuote(input.fromNodeId)},\n ${sqlQuote(input.toNodeId)},\n ${sqlQuote(input.dependencyKind ?? \"blocks\")},\n ${sqlQuote(input.requiredStatus ?? \"completed\")},\n ${sqlJson(input.metadata ?? {})},\n ${sqlQuote(createdAt)}\n )`,\n );\n await this.appendEvent({\n threadId: input.threadId,\n eventType: \"task_dependency_created\",\n summary: `Created dependency ${input.fromNodeId} -> ${input.toNodeId}`,\n data: {\n dependencyId: id,\n fromNodeId: input.fromNodeId,\n toNodeId: input.toNodeId,\n dependencyKind: input.dependencyKind ?? \"blocks\",\n requiredStatus: input.requiredStatus ?? \"completed\",\n },\n });\n const dependency = await this.getTaskDependency(id);\n if (!dependency) {\n throw new Error(`Failed to create task dependency ${id}`);\n }\n await this.recomputeTaskGraphState(input.threadId);\n return dependency;\n }\n\n async getTaskDependency(\n dependencyId: string,\n ): Promise<TaskDependencyRecord | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_dependencies\n WHERE id = ${sqlQuote(dependencyId)}\n LIMIT 1`,\n );\n return rows[0] ? parseTaskDependencyRow(rows[0]) : null;\n }\n\n async listTaskDependenciesForThread(\n threadId: string,\n ): Promise<TaskDependencyRecord[]> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_dependencies\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseTaskDependencyRow);\n }\n\n async createTaskClaim(input: CreateTaskClaimInput): Promise<TaskClaimRecord> {\n await this.ensureSchema();\n const claimedAt = input.claimedAt ?? isoNow();\n const id = input.id?.trim() || `claim-${crypto.randomUUID()}`;\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_claims (\n id, thread_id, node_id, session_id, claim_type, status, claimed_at,\n released_at, metadata_json\n ) VALUES (\n ${sqlQuote(id)},\n ${sqlQuote(input.threadId)},\n ${sqlQuote(input.nodeId)},\n ${sqlQuote(input.sessionId)},\n ${sqlQuote(input.claimType ?? \"execution\")},\n ${sqlQuote(input.status ?? \"active\")},\n ${sqlQuote(claimedAt)},\n ${sqlText(input.releasedAt ?? null)},\n ${sqlJson(input.metadata ?? {})}\n )`,\n );\n await this.appendEvent({\n threadId: input.threadId,\n sessionId: input.sessionId,\n eventType: \"task_claim_created\",\n summary: `Claimed task node ${input.nodeId}`,\n data: {\n claimId: id,\n nodeId: input.nodeId,\n sessionId: input.sessionId,\n claimType: input.claimType ?? \"execution\",\n status: input.status ?? \"active\",\n },\n });\n const claim = await this.getTaskClaim(id);\n if (!claim) {\n throw new Error(`Failed to create task claim ${id}`);\n }\n return claim;\n }\n\n async getTaskClaim(claimId: string): Promise<TaskClaimRecord | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_claims\n WHERE id = ${sqlQuote(claimId)}\n LIMIT 1`,\n );\n return rows[0] ? parseTaskClaimRow(rows[0]) : null;\n }\n\n async findActiveTaskClaim(\n nodeId: string,\n sessionId: string,\n ): Promise<TaskClaimRecord | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_claims\n WHERE node_id = ${sqlQuote(nodeId)}\n AND session_id = ${sqlQuote(sessionId)}\n AND status = 'active'\n ORDER BY claimed_at DESC\n LIMIT 1`,\n );\n return rows[0] ? parseTaskClaimRow(rows[0]) : null;\n }\n\n async updateTaskClaim(\n claimId: string,\n patch: UpdateTaskClaimInput,\n ): Promise<void> {\n await this.ensureSchema();\n const existing = await this.getTaskClaim(claimId);\n if (!existing) return;\n const nextMetadata = patch.metadata\n ? { ...existing.metadata, ...patch.metadata }\n : existing.metadata;\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_claims\n SET status = ${sqlQuote(patch.status ?? existing.status)},\n released_at = ${sqlText(\n patch.releasedAt !== undefined\n ? patch.releasedAt\n : existing.releasedAt,\n )},\n metadata_json = ${sqlJson(nextMetadata)}\n WHERE id = ${sqlQuote(claimId)}`,\n );\n }\n\n async listTaskClaimsForThread(threadId: string): Promise<TaskClaimRecord[]> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_claims\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY claimed_at ASC`,\n );\n return rows.map(parseTaskClaimRow);\n }\n\n async appendTaskMailboxMessage(\n input: AppendTaskMailboxMessageInput,\n ): Promise<TaskMailboxMessageRecord> {\n await this.ensureSchema();\n const id = input.id?.trim() || `mail-${crypto.randomUUID()}`;\n const createdAt = input.createdAt ?? isoNow();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_mailbox (\n id, thread_id, node_id, session_id, sender, recipient, subject, body,\n delivery_state, metadata_json, created_at, delivered_at\n ) VALUES (\n ${sqlQuote(id)},\n ${sqlQuote(input.threadId)},\n ${sqlText(input.nodeId ?? null)},\n ${sqlText(input.sessionId ?? null)},\n ${sqlQuote(input.sender)},\n ${sqlQuote(input.recipient)},\n ${sqlQuote(input.subject ?? \"\")},\n ${sqlQuote(input.body)},\n ${sqlQuote(input.deliveryState ?? \"pending\")},\n ${sqlJson(input.metadata ?? {})},\n ${sqlQuote(createdAt)},\n ${sqlText(input.deliveredAt ?? null)}\n )`,\n );\n await this.appendEvent({\n threadId: input.threadId,\n sessionId: input.sessionId ?? null,\n eventType: \"task_mailbox_message\",\n summary: `Mailbox message \"${input.subject ?? \"\"}\" queued for ${input.recipient}`,\n data: {\n messageId: id,\n nodeId: input.nodeId ?? null,\n sender: input.sender,\n recipient: input.recipient,\n deliveryState: input.deliveryState ?? \"pending\",\n },\n });\n const message = await this.getTaskMailboxMessage(id);\n if (!message) {\n throw new Error(`Failed to create mailbox message ${id}`);\n }\n return message;\n }\n\n async getTaskMailboxMessage(\n messageId: string,\n ): Promise<TaskMailboxMessageRecord | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_mailbox\n WHERE id = ${sqlQuote(messageId)}\n LIMIT 1`,\n );\n return rows[0] ? parseTaskMailboxMessageRow(rows[0]) : null;\n }\n\n async markTaskMailboxMessageDelivered(messageId: string): Promise<void> {\n await this.ensureSchema();\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_mailbox\n SET delivery_state = 'delivered',\n delivered_at = ${sqlQuote(isoNow())}\n WHERE id = ${sqlQuote(messageId)}`,\n );\n }\n\n async listTaskMailboxMessagesForThread(\n threadId: string,\n ): Promise<TaskMailboxMessageRecord[]> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_mailbox\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseTaskMailboxMessageRow);\n }\n\n async createTaskVerifierJob(\n input: CreateTaskVerifierJobInput,\n ): Promise<TaskVerifierJobRecord> {\n await this.ensureSchema();\n const id = input.id?.trim() || `verify-${crypto.randomUUID()}`;\n const createdAt = input.createdAt ?? isoNow();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_verifier_jobs (\n id, thread_id, node_id, status, verifier_type, title, instructions,\n config_json, metadata_json, created_at, started_at, completed_at\n ) VALUES (\n ${sqlQuote(id)},\n ${sqlQuote(input.threadId)},\n ${sqlQuote(input.nodeId)},\n ${sqlQuote(input.status ?? \"pending\")},\n ${sqlQuote(input.verifierType)},\n ${sqlQuote(input.title)},\n ${sqlQuote(input.instructions ?? \"\")},\n ${sqlJson(input.config ?? {})},\n ${sqlJson(input.metadata ?? {})},\n ${sqlQuote(createdAt)},\n ${sqlText(input.startedAt ?? null)},\n ${sqlText(input.completedAt ?? null)}\n )`,\n );\n await this.appendEvent({\n threadId: input.threadId,\n eventType: \"verifier_job_created\",\n summary: `Created verifier job \"${input.title}\"`,\n data: {\n verifierJobId: id,\n nodeId: input.nodeId,\n verifierType: input.verifierType,\n status: input.status ?? \"pending\",\n },\n });\n const job = await this.getTaskVerifierJob(id);\n if (!job) {\n throw new Error(`Failed to create verifier job ${id}`);\n }\n return job;\n }\n\n async getTaskVerifierJob(\n verifierJobId: string,\n ): Promise<TaskVerifierJobRecord | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_verifier_jobs\n WHERE id = ${sqlQuote(verifierJobId)}\n LIMIT 1`,\n );\n return rows[0] ? parseTaskVerifierJobRow(rows[0]) : null;\n }\n\n async updateTaskVerifierJob(\n verifierJobId: string,\n patch: UpdateTaskVerifierJobInput,\n ): Promise<void> {\n await this.ensureSchema();\n const existing = await this.getTaskVerifierJob(verifierJobId);\n if (!existing) return;\n const nextMetadata = patch.metadata\n ? { ...existing.metadata, ...patch.metadata }\n : existing.metadata;\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_verifier_jobs\n SET status = ${sqlQuote(patch.status ?? existing.status)},\n title = ${sqlQuote(patch.title ?? existing.title)},\n instructions = ${sqlQuote(\n patch.instructions ?? existing.instructions,\n )},\n config_json = ${sqlJson(patch.config ?? existing.config)},\n metadata_json = ${sqlJson(nextMetadata)},\n started_at = ${sqlText(\n patch.startedAt !== undefined\n ? patch.startedAt\n : existing.startedAt,\n )},\n completed_at = ${sqlText(\n patch.completedAt !== undefined\n ? patch.completedAt\n : existing.completedAt,\n )}\n WHERE id = ${sqlQuote(verifierJobId)}`,\n );\n }\n\n async listTaskVerifierJobsForThread(\n threadId: string,\n ): Promise<TaskVerifierJobRecord[]> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_verifier_jobs\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseTaskVerifierJobRow);\n }\n\n async recordTaskEvidence(\n input: RecordTaskEvidenceInput,\n ): Promise<TaskEvidenceRecord> {\n await this.ensureSchema();\n const id = input.id?.trim() || `evidence-${crypto.randomUUID()}`;\n const createdAt = isoNow();\n await executeRawSql(\n this.runtime,\n `INSERT INTO orchestrator_task_evidence (\n id, thread_id, node_id, session_id, verifier_job_id, evidence_type, title,\n summary, path, uri, content_json, metadata_json, created_at\n ) VALUES (\n ${sqlQuote(id)},\n ${sqlQuote(input.threadId)},\n ${sqlText(input.nodeId ?? null)},\n ${sqlText(input.sessionId ?? null)},\n ${sqlText(input.verifierJobId ?? null)},\n ${sqlQuote(input.evidenceType)},\n ${sqlQuote(input.title)},\n ${sqlQuote(input.summary ?? \"\")},\n ${sqlText(input.path ?? null)},\n ${sqlText(input.uri ?? null)},\n ${sqlJson(input.content ?? {})},\n ${sqlJson(input.metadata ?? {})},\n ${sqlQuote(createdAt)}\n )`,\n );\n await this.appendEvent({\n threadId: input.threadId,\n sessionId: input.sessionId ?? null,\n eventType: \"task_evidence_recorded\",\n summary: `Recorded ${input.evidenceType} evidence`,\n data: {\n evidenceId: id,\n nodeId: input.nodeId ?? null,\n verifierJobId: input.verifierJobId ?? null,\n title: input.title,\n },\n });\n const evidence = await this.getTaskEvidence(id);\n if (!evidence) {\n throw new Error(`Failed to create task evidence ${id}`);\n }\n return evidence;\n }\n\n async getTaskEvidence(\n evidenceId: string,\n ): Promise<TaskEvidenceRecord | null> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_evidence\n WHERE id = ${sqlQuote(evidenceId)}\n LIMIT 1`,\n );\n return rows[0] ? parseTaskEvidenceRow(rows[0]) : null;\n }\n\n async listTaskEvidenceForThread(\n threadId: string,\n ): Promise<TaskEvidenceRecord[]> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_evidence\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseTaskEvidenceRow);\n }\n\n private deriveDependentNodeStatus(\n node: TaskNodeRecord,\n incomingDependencies: TaskDependencyRecord[],\n nodesById: Map<string, TaskNodeRecord>,\n ): TaskNodeStatus {\n if (isTerminalTaskNodeStatus(node.status)) {\n return node.status;\n }\n if (\n node.status === \"running\" ||\n node.status === \"blocked\" ||\n node.status === \"waiting_on_user\" ||\n node.status === \"verifying\" ||\n node.status === \"claimed\"\n ) {\n return node.status;\n }\n\n const prerequisiteStatuses = incomingDependencies\n .map((dependency) => nodesById.get(dependency.fromNodeId))\n .filter((entry): entry is TaskNodeRecord => Boolean(entry))\n .map((entry) => entry.status);\n const allSatisfied =\n incomingDependencies.length === 0 ||\n incomingDependencies.every((dependency) => {\n const source = nodesById.get(dependency.fromNodeId);\n return (\n source !== undefined &&\n dependencyStatusSatisfied(source.status, dependency.requiredStatus)\n );\n });\n const hasFailedPrerequisite = prerequisiteStatuses.some(\n (status) =>\n status === \"failed\" ||\n status === \"canceled\" ||\n status === \"interrupted\",\n );\n\n if (node.kind === \"goal\" && incomingDependencies.length > 0) {\n if (allSatisfied) {\n return \"completed\";\n }\n return hasFailedPrerequisite ? \"failed\" : \"planned\";\n }\n\n if (node.assignedSessionId) {\n return node.status;\n }\n if (allSatisfied) {\n return \"ready\";\n }\n return hasFailedPrerequisite ? \"blocked\" : \"planned\";\n }\n\n private async recomputeTaskGraphState(threadId: string): Promise<void> {\n const [nodes, dependencies] = await Promise.all([\n this.listTaskNodesForThread(threadId),\n this.listTaskDependenciesForThread(threadId),\n ]);\n if (nodes.length === 0) {\n return;\n }\n\n const nodesById = new Map(nodes.map((node) => [node.id, node]));\n const incomingDependencies = new Map<string, TaskDependencyRecord[]>();\n for (const dependency of dependencies) {\n const bucket = incomingDependencies.get(dependency.toNodeId) ?? [];\n bucket.push(dependency);\n incomingDependencies.set(dependency.toNodeId, bucket);\n }\n\n const nowIso = isoNow();\n for (const node of nodes) {\n const nextStatus = this.deriveDependentNodeStatus(\n node,\n incomingDependencies.get(node.id) ?? [],\n nodesById,\n );\n if (nextStatus === node.status) {\n continue;\n }\n const nextCompletedAt =\n nextStatus === \"completed\" || nextStatus === \"failed\"\n ? (node.completedAt ?? nowIso)\n : null;\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_nodes\n SET status = ${sqlQuote(nextStatus)},\n updated_at = ${sqlQuote(nowIso)},\n completed_at = ${sqlText(nextCompletedAt)}\n WHERE id = ${sqlQuote(node.id)}`,\n );\n }\n }\n\n async getLastUsedRepo(): Promise<string | undefined> {\n await this.ensureSchema();\n const rows = await executeRawSql(\n this.runtime,\n `SELECT repo\n FROM orchestrator_task_sessions\n WHERE repo IS NOT NULL AND repo <> ''\n ORDER BY last_activity_at DESC\n LIMIT 1`,\n );\n return rows[0] ? toText(rows[0].repo) : undefined;\n }\n\n async listSessionsForThread(threadId: string): Promise<TaskSessionRecord[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_sessions\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY registered_at ASC`,\n );\n return rows.map(parseSessionRow);\n }\n\n async listDecisionsForThread(\n threadId: string,\n ): Promise<TaskDecisionRecord[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_decisions\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY timestamp ASC`,\n );\n return rows.map(parseDecisionRow);\n }\n\n async listDecisionsForSession(\n sessionId: string,\n ): Promise<TaskDecisionRecord[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_decisions\n WHERE session_id = ${sqlQuote(sessionId)}\n ORDER BY timestamp ASC`,\n );\n return rows.map(parseDecisionRow);\n }\n\n async listEventsForThread(threadId: string): Promise<TaskEventRecord[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_events\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY timestamp ASC`,\n );\n return rows.map(parseEventRow);\n }\n\n async listArtifactsForThread(\n threadId: string,\n ): Promise<TaskArtifactRecord[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_artifacts\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY created_at ASC`,\n );\n return rows.map(parseArtifactRow);\n }\n\n async listTranscriptsForThread(\n threadId: string,\n ): Promise<TaskTranscriptRecord[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM orchestrator_task_transcripts\n WHERE thread_id = ${sqlQuote(threadId)}\n ORDER BY timestamp ASC`,\n );\n return rows.map(parseTranscriptRow);\n }\n\n private async recomputeThreadStatus(threadId: string): Promise<void> {\n await this.ensureSchema();\n const thread = await this.getThreadRecord(threadId);\n if (!thread) return;\n if (thread.archivedAt) return;\n const controlState = toText(thread.metadata.controlState)\n .trim()\n .toLowerCase();\n\n const sessions = await this.listSessionsForThread(threadId);\n const nowIso = isoNow();\n let nextStatus: TaskThreadStatus = \"open\";\n let closedAt: string | null = null;\n\n const activeCount = sessions.filter((session) =>\n [\"active\", \"tool_running\"].includes(session.status),\n ).length;\n const waitingOnUserCount = sessions.filter(\n (session) => session.status === \"waiting_on_user\",\n ).length;\n const blockedCount = sessions.filter(\n (session) => session.status === \"blocked\",\n ).length;\n const interruptedCount = sessions.filter((session) =>\n [\"interrupted\", \"stopped\"].includes(session.status),\n ).length;\n const errorCount = sessions.filter(\n (session) => session.status === \"error\",\n ).length;\n const completedCount = sessions.filter(\n (session) => session.status === \"completed\",\n ).length;\n\n if (controlState === \"paused\" && activeCount === 0 && blockedCount === 0) {\n nextStatus = \"waiting_on_user\";\n } else if (\n controlState === \"stopped\" &&\n activeCount === 0 &&\n blockedCount === 0 &&\n waitingOnUserCount === 0\n ) {\n nextStatus = \"interrupted\";\n closedAt = nowIso;\n } else if (sessions.length === 0) {\n nextStatus = \"open\";\n } else if (activeCount > 0) {\n nextStatus = \"active\";\n } else if (waitingOnUserCount > 0) {\n nextStatus = \"waiting_on_user\";\n } else if (blockedCount > 0) {\n nextStatus = \"blocked\";\n } else if (interruptedCount > 0) {\n nextStatus = \"interrupted\";\n closedAt = nowIso;\n } else if (completedCount === sessions.length) {\n nextStatus = \"done\";\n closedAt = nowIso;\n } else if (errorCount > 0) {\n nextStatus = \"failed\";\n closedAt = nowIso;\n }\n\n await executeRawSql(\n this.runtime,\n `UPDATE orchestrator_task_threads\n SET status = ${sqlQuote(nextStatus)},\n closed_at = ${sqlText(closedAt)},\n updated_at = ${sqlQuote(nowIso)}\n WHERE id = ${sqlQuote(threadId)}`,\n );\n }\n}\n",
|
|
58
60
|
"/**\n * LIST_AGENTS action - List active task-agent sessions and task progress.\n *\n * Returns information about running PTY sessions together with the current\n * coordinator task state so the main agent can keep the user updated while\n * background work continues.\n *\n * @module actions/list-agents\n */\n\nimport type {\n Action,\n ActionResult,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { getCoordinator, type PTYService } from \"../services/pty-service.js\";\nimport type { SessionInfo } from \"../services/pty-types.js\";\nimport {\n formatTaskAgentStatus,\n getTaskAgentFrameworkState,\n TASK_AGENT_FRAMEWORK_LABELS,\n truncateTaskAgentText,\n} from \"../services/task-agent-frameworks.js\";\n\ninterface TaskLike {\n sessionId: string;\n agentType: string;\n label: string;\n originalTask: string;\n status: string;\n decisions: Array<{ reasoning?: string }>;\n completionSummary?: string;\n registeredAt: number;\n}\n\nfunction uniqueTasks(tasks: TaskLike[]): TaskLike[] {\n const seen = new Set<string>();\n const result: TaskLike[] = [];\n for (const task of tasks) {\n if (seen.has(task.sessionId)) continue;\n seen.add(task.sessionId);\n result.push(task);\n }\n return result;\n}\n\nexport const listAgentsAction: Action = {\n name: \"LIST_AGENTS\",\n\n similes: [\n \"LIST_CODING_AGENTS\",\n \"SHOW_CODING_AGENTS\",\n \"GET_ACTIVE_AGENTS\",\n \"LIST_SESSIONS\",\n \"SHOW_CODING_SESSIONS\",\n \"SHOW_TASK_AGENTS\",\n \"LIST_SUB_AGENTS\",\n \"SHOW_TASK_STATUS\",\n ],\n\n description:\n \"List active task agents together with current task progress so the main agent can keep the user updated while work continues asynchronously.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"What task agents are running right now and what are they doing?\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll pull the current task-agent status.\",\n action: \"LIST_AGENTS\",\n },\n },\n ],\n ],\n\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n ): Promise<boolean> => {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n return ptyService != null;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n if (callback) {\n await callback({\n text: \"PTY Service is not available.\",\n });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n const sessions = await ptyService.listSessions();\n const coordinator = getCoordinator(runtime);\n const tasks = uniqueTasks(\n ((coordinator?.getAllTaskContexts?.() ?? []) as TaskLike[]).slice(),\n );\n const frameworkState = await getTaskAgentFrameworkState(runtime, ptyService);\n\n if (sessions.length === 0 && tasks.length === 0) {\n const text =\n `No active task agents. Recommended default: ${TASK_AGENT_FRAMEWORK_LABELS[frameworkState.preferred.id]} (${frameworkState.preferred.reason}). ` +\n \"Use CREATE_TASK when the user needs substantial background work.\";\n if (callback) {\n await callback({ text });\n }\n return {\n success: true,\n text,\n data: {\n sessions: [],\n tasks: [],\n preferredTaskAgent: frameworkState.preferred,\n },\n };\n }\n\n const lines: string[] = [];\n if (sessions.length > 0) {\n lines.push(`Active task agents (${sessions.length}):`);\n for (const session of sessions) {\n const label =\n typeof session.metadata?.label === \"string\"\n ? session.metadata.label\n : session.name;\n lines.push(\n `- \"${label}\" (${session.agentType}, ${formatTaskAgentStatus(session.status)}) [session: ${session.id}]`,\n );\n }\n }\n\n if (tasks.length > 0) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(`Current task status (${tasks.length}):`);\n for (const task of tasks\n .slice()\n .sort((left, right) => right.registeredAt - left.registeredAt)) {\n const detail =\n task.completionSummary ||\n task.decisions.at(-1)?.reasoning ||\n truncateTaskAgentText(task.originalTask, 110);\n lines.push(\n `- [${task.status}] \"${task.label}\" (${task.agentType}) -> ${detail}`,\n );\n }\n }\n\n const reusableSessions = sessions.filter((session) => {\n const currentTask = tasks.find((task) => task.sessionId === session.id);\n return !currentTask || currentTask.status !== \"active\";\n });\n if (reusableSessions.length > 0) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(\n `Reusable task agents (${reusableSessions.length}): assign a new tracked task with SEND_TO_AGENT.`,\n );\n for (const session of reusableSessions) {\n const label =\n typeof session.metadata?.label === \"string\"\n ? session.metadata.label\n : session.name;\n lines.push(\n `- \"${label}\" (${session.agentType}) is ${formatTaskAgentStatus(session.status)} and can take a new task`,\n );\n }\n }\n\n const pending = coordinator?.getPendingConfirmations?.() ?? [];\n if (pending.length > 0) {\n lines.push(\"\");\n lines.push(\n `Pending confirmations: ${pending.length} (${coordinator?.getSupervisionLevel?.() ?? \"unknown\"} supervision).`,\n );\n }\n\n const text = lines.join(\"\\n\");\n if (callback) {\n await callback({ text });\n }\n\n return {\n success: true,\n text,\n data: {\n sessions: sessions.map((session: SessionInfo) => ({\n id: session.id,\n agentType: session.agentType,\n status: session.status,\n workdir: session.workdir,\n createdAt: session.createdAt.toISOString(),\n lastActivity: session.lastActivityAt.toISOString(),\n label:\n typeof session.metadata?.label === \"string\"\n ? session.metadata.label\n : session.name,\n })),\n tasks: tasks.map((task) => ({\n sessionId: task.sessionId,\n agentType: task.agentType,\n label: task.label,\n status: task.status,\n originalTask: task.originalTask,\n completionSummary: task.completionSummary,\n })),\n pendingConfirmations: pending.length,\n preferredTaskAgent: frameworkState.preferred,\n },\n };\n },\n\n parameters: [],\n};\n\nexport const listTaskAgentsAction = listAgentsAction;\n",
|
|
61
|
+
"import type { IAgentRuntime, Memory } from \"@elizaos/core\";\n\ntype RoleName = \"OWNER\" | \"ADMIN\" | \"USER\" | \"GUEST\";\ntype TaskAgentAbility = \"create\" | \"interact\";\ntype ConnectorPolicy = Partial<Record<TaskAgentAbility, RoleName>>;\ntype TaskAgentPolicyConfig = {\n default?: RoleName | ConnectorPolicy;\n connectors?: Record<string, RoleName | ConnectorPolicy>;\n};\n\nconst ROLE_RANK: Record<RoleName, number> = {\n GUEST: 0,\n USER: 1,\n ADMIN: 2,\n OWNER: 3,\n};\n\nconst DEFAULT_POLICY: TaskAgentPolicyConfig = {\n default: \"GUEST\",\n connectors: {\n discord: {\n create: \"ADMIN\",\n interact: \"ADMIN\",\n },\n },\n};\n\ntype RoleCheckResult = {\n role: RoleName;\n isAdmin: boolean;\n isOwner: boolean;\n};\n\nfunction normalizeRole(value: unknown): RoleName {\n const upper = typeof value === \"string\" ? value.trim().toUpperCase() : \"\";\n switch (upper) {\n case \"OWNER\":\n case \"ADMIN\":\n case \"USER\":\n return upper;\n default:\n return \"GUEST\";\n }\n}\n\nfunction normalizeConnectorPolicy(\n value: RoleName | ConnectorPolicy | undefined,\n): ConnectorPolicy {\n if (!value) return {};\n if (typeof value === \"string\") {\n const role = normalizeRole(value);\n return {\n create: role,\n interact: role,\n };\n }\n return {\n ...(value.create ? { create: normalizeRole(value.create) } : {}),\n ...(value.interact ? { interact: normalizeRole(value.interact) } : {}),\n };\n}\n\nfunction parseTaskAgentPolicy(runtime: IAgentRuntime): TaskAgentPolicyConfig {\n const configured =\n runtime.getSetting(\"TASK_AGENT_ROLE_POLICY\") ??\n runtime.getSetting(\"TASK_AGENT_CONNECTOR_ROLE_POLICY\");\n\n if (!configured) {\n return DEFAULT_POLICY;\n }\n\n let parsed: unknown = configured;\n if (typeof configured === \"string\") {\n try {\n parsed = JSON.parse(configured);\n } catch {\n return DEFAULT_POLICY;\n }\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return DEFAULT_POLICY;\n }\n\n const record = parsed as Record<string, unknown>;\n const connectors =\n record.connectors &&\n typeof record.connectors === \"object\" &&\n !Array.isArray(record.connectors)\n ? Object.fromEntries(\n Object.entries(record.connectors as Record<string, unknown>).map(\n ([connector, value]) => [\n connector,\n normalizeConnectorPolicy(value as RoleName | ConnectorPolicy),\n ],\n ),\n )\n : DEFAULT_POLICY.connectors;\n\n return {\n default: normalizeConnectorPolicy(\n (record.default ?? DEFAULT_POLICY.default) as RoleName | ConnectorPolicy,\n ),\n connectors,\n };\n}\n\nfunction getConnectorFromBridgeMetadata(message: Memory): string | null {\n const metadata = (message.content as Record<string, unknown> | undefined)\n ?.metadata;\n if (!metadata || typeof metadata !== \"object\") return null;\n const bridgeSender = (metadata as Record<string, unknown>).bridgeSender;\n if (!bridgeSender || typeof bridgeSender !== \"object\") return null;\n const liveMetadata = (bridgeSender as Record<string, unknown>).metadata;\n if (!liveMetadata || typeof liveMetadata !== \"object\") return null;\n\n for (const [connector, value] of Object.entries(\n liveMetadata as Record<string, unknown>,\n )) {\n if (value && typeof value === \"object\") {\n return connector;\n }\n }\n return null;\n}\n\nasync function resolveConnectorSource(\n runtime: IAgentRuntime,\n message: Memory,\n): Promise<string | null> {\n const content = message.content as Record<string, unknown> | undefined;\n const directSource =\n typeof content?.source === \"string\" && content.source !== \"client_chat\"\n ? content.source\n : null;\n if (directSource) return directSource;\n\n const bridgeSource = getConnectorFromBridgeMetadata(message);\n if (bridgeSource) return bridgeSource;\n\n try {\n const room = await runtime.getRoom(message.roomId);\n if (typeof room?.source === \"string\" && room.source.trim().length > 0) {\n return room.source;\n }\n } catch {\n // Ignore room lookup failures and fall through to null.\n }\n\n return null;\n}\n\nasync function resolveSenderRole(\n runtime: IAgentRuntime,\n message: Memory,\n): Promise<RoleCheckResult | null> {\n try {\n // Optional milady-side package — resolved at runtime only. We use a\n // dynamic module specifier so neither tsc nor biome flags it: tsc\n // doesn't try to resolve the literal at type-check time, and biome's\n // ts-ignore-prefers-ts-expect-error rule doesn't apply because there\n // is no directive. If the package isn't installed the runtime\n // `import()` simply throws and we fall through to the null return.\n const rolesModuleSpecifier = \"@miladyai/plugin-roles\";\n const rolesModule = (await import(rolesModuleSpecifier)) as {\n checkSenderRole?: (\n runtime: IAgentRuntime,\n message: Memory,\n ) => Promise<RoleCheckResult | null>;\n };\n if (typeof rolesModule.checkSenderRole !== \"function\") {\n return null;\n }\n return await rolesModule.checkSenderRole(runtime, message);\n } catch {\n return null;\n }\n}\n\nexport async function requireTaskAgentAccess(\n runtime: IAgentRuntime,\n message: Memory,\n ability: TaskAgentAbility,\n): Promise<\n | {\n allowed: true;\n connector: string | null;\n requiredRole: RoleName;\n actualRole: RoleName;\n }\n | {\n allowed: false;\n connector: string | null;\n requiredRole: RoleName;\n actualRole: RoleName;\n reason: string;\n }\n> {\n if (message.entityId === runtime.agentId) {\n return {\n allowed: true,\n connector: null,\n requiredRole: \"GUEST\",\n actualRole: \"OWNER\",\n };\n }\n\n const connector = await resolveConnectorSource(runtime, message);\n const policy = parseTaskAgentPolicy(runtime);\n const connectorPolicy = connector\n ? normalizeConnectorPolicy(policy.connectors?.[connector])\n : {};\n const defaultPolicy = normalizeConnectorPolicy(\n policy.default as RoleName | ConnectorPolicy,\n );\n const requiredRole =\n connectorPolicy[ability] ?? defaultPolicy[ability] ?? \"GUEST\";\n\n if (requiredRole === \"GUEST\") {\n return {\n allowed: true,\n connector,\n requiredRole,\n actualRole: \"GUEST\",\n };\n }\n\n const roleCheck = await resolveSenderRole(runtime, message);\n if (!roleCheck) {\n return {\n allowed: false,\n connector,\n requiredRole,\n actualRole: \"GUEST\",\n reason:\n connector === \"discord\"\n ? \"Task-agent access in Discord requires a verified OWNER or ADMIN role.\"\n : \"Task-agent access requires a verified role, but role context is unavailable.\",\n };\n }\n\n const actualRole = normalizeRole(roleCheck.role);\n if (ROLE_RANK[actualRole] < ROLE_RANK[requiredRole]) {\n return {\n allowed: false,\n connector,\n requiredRole,\n actualRole,\n reason:\n connector === \"discord\"\n ? `Task-agent access in Discord requires ${requiredRole} or higher. Current role: ${actualRole}.`\n : `Task-agent access requires ${requiredRole} or higher. Current role: ${actualRole}.`,\n };\n }\n\n return {\n allowed: true,\n connector,\n requiredRole,\n actualRole,\n };\n}\n",
|
|
62
|
+
"import type { Memory, State } from \"@elizaos/core\";\nimport type { SwarmCoordinator } from \"../services/swarm-coordinator.js\";\nimport type {\n ListTaskThreadsOptions,\n TaskThreadSummary,\n} from \"../services/task-registry.js\";\n\ntype MessageFields = {\n roomId?: string;\n userId?: string;\n content?: Record<string, unknown>;\n};\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction inferSearchText(text: string): string | undefined {\n const quoted =\n text.match(/\"([^\"]{3,120})\"/)?.[1] ??\n text.match(/'([^']{3,120})'/)?.[1];\n if (quoted) return quoted.trim();\n\n const topical =\n text.match(/\\bworking on\\s+(.+?)(?:[?.!,]|$)/i)?.[1] ??\n text.match(/\\bfor\\s+(.+?)(?:[?.!,]|$)/i)?.[1] ??\n text.match(/\\bon\\s+(.+?)(?:[?.!,]|$)/i)?.[1];\n return topical?.trim();\n}\n\nfunction buildScopedListOptions(\n message: Memory,\n includeArchived: boolean,\n): ListTaskThreadsOptions {\n const messageLike = message as unknown as MessageFields;\n return {\n includeArchived,\n roomId: stringValue(messageLike.roomId),\n ownerUserId: stringValue(messageLike.userId),\n limit: 10,\n };\n}\n\nasync function threadBySession(\n coordinator: SwarmCoordinator,\n sessionId: string,\n): Promise<TaskThreadSummary | null> {\n const threadId = await coordinator.taskRegistry.findThreadIdBySessionId(\n sessionId,\n );\n if (!threadId) return null;\n const detail = await coordinator.getTaskThread(threadId);\n return detail;\n}\n\nexport async function resolveTaskThreadTarget(params: {\n coordinator: SwarmCoordinator;\n message: Memory;\n state?: State;\n options?: Record<string, unknown>;\n includeArchived?: boolean;\n}): Promise<TaskThreadSummary | null> {\n const {\n coordinator,\n message,\n state,\n options,\n includeArchived = true,\n } = params;\n const content = (message.content ?? {}) as Record<string, unknown>;\n\n const explicitThreadId =\n stringValue(options?.threadId) ?? stringValue(content.threadId);\n if (explicitThreadId) {\n return coordinator.getTaskThread(explicitThreadId);\n }\n\n const codingSession =\n state && typeof state === \"object\"\n ? ((state as Record<string, unknown>).codingSession as\n | Record<string, unknown>\n | undefined)\n : undefined;\n const explicitSessionId =\n stringValue(options?.sessionId) ??\n stringValue(content.sessionId) ??\n stringValue(codingSession?.id);\n if (explicitSessionId) {\n const bySession = await threadBySession(coordinator, explicitSessionId);\n if (bySession) return bySession;\n }\n\n const search =\n stringValue(options?.search) ??\n stringValue(content.search) ??\n inferSearchText(\n typeof content.text === \"string\" ? content.text : \"\",\n );\n if (search) {\n const matches = await coordinator.listTaskThreads({\n ...buildScopedListOptions(message, includeArchived),\n search,\n });\n if (matches.length > 0) return matches[0];\n }\n\n const scoped = await coordinator.listTaskThreads(\n buildScopedListOptions(message, includeArchived),\n );\n if (scoped.length > 0) return scoped[0];\n\n const recent = await coordinator.listTaskThreads({\n includeArchived,\n limit: 10,\n });\n return recent[0] ?? null;\n}\n",
|
|
63
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport { requireTaskAgentAccess } from \"../services/task-policy.js\";\nimport { resolveTaskThreadTarget } from \"./task-thread-target.js\";\n\ntype TaskControlOperation =\n | \"pause\"\n | \"stop\"\n | \"resume\"\n | \"continue\"\n | \"archive\"\n | \"reopen\";\n\nfunction textValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction inferOperation(\n text: string,\n value?: string,\n): TaskControlOperation | null {\n const normalized = value?.trim().toLowerCase();\n if (\n normalized === \"pause\" ||\n normalized === \"stop\" ||\n normalized === \"resume\" ||\n normalized === \"continue\" ||\n normalized === \"archive\" ||\n normalized === \"reopen\"\n ) {\n return normalized;\n }\n if (/\\barchive\\b/i.test(text)) return \"archive\";\n if (/\\breopen\\b/i.test(text)) return \"reopen\";\n if (/\\bpause\\b|\\bhold on\\b|\\bthat's not right\\b/i.test(text)) return \"pause\";\n if (/\\bstop\\b|\\bcancel\\b|\\bkill\\b/i.test(text)) return \"stop\";\n if (/\\bresume\\b|\\bmake it so\\b|\\bdo it\\b|\\byea(h)? i'm down\\b/i.test(text)) {\n return \"resume\";\n }\n if (/\\bcontinue\\b|\\bgo ahead\\b/i.test(text)) return \"continue\";\n return null;\n}\n\nexport const taskControlAction: Action = {\n name: \"TASK_CONTROL\",\n similes: [\n \"CONTROL_TASK\",\n \"PAUSE_TASK\",\n \"RESUME_TASK\",\n \"STOP_TASK\",\n \"CONTINUE_TASK\",\n \"ARCHIVE_TASK\",\n \"REOPEN_TASK\",\n ],\n description:\n \"Pause, stop, resume, continue, archive, or reopen a coordinator task thread while preserving the durable thread history.\",\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Hold on a second, can you pause that and let's discuss if it's right?\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll pause the current task thread and preserve its state.\",\n action: \"TASK_CONTROL\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Stop, stop, stop doing what you're doing.\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll stop the running task thread and keep the history intact.\",\n action: \"TASK_CONTROL\",\n },\n },\n ],\n ],\n validate: async (runtime: IAgentRuntime): Promise<boolean> => {\n return Boolean(getCoordinator(runtime));\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const access = await requireTaskAgentAccess(runtime, message, \"interact\");\n if (!access.allowed) {\n if (callback) {\n await callback({ text: access.reason });\n }\n return { success: false, error: \"FORBIDDEN\", text: access.reason };\n }\n\n const coordinator = getCoordinator(runtime);\n if (!coordinator) {\n if (callback) {\n await callback({ text: \"Coordinator is not available.\" });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n const params = (options?.parameters as Record<string, unknown> | undefined) ?? {};\n const content = (message.content ?? {}) as Record<string, unknown>;\n const text = typeof content.text === \"string\" ? content.text : \"\";\n const operation = inferOperation(\n text,\n textValue(params.operation) ?? textValue(content.operation),\n );\n\n if (!operation) {\n if (callback) {\n await callback({\n text: \"No task-control operation was specified. Use pause, stop, resume, continue, archive, or reopen.\",\n });\n }\n return { success: false, error: \"INVALID_OPERATION\" };\n }\n\n const thread = await resolveTaskThreadTarget({\n coordinator,\n message,\n state,\n options: params,\n includeArchived: operation === \"reopen\" || operation === \"archive\",\n });\n if (!thread) {\n if (callback) {\n await callback({ text: \"I could not find a matching task thread.\" });\n }\n return { success: false, error: \"THREAD_NOT_FOUND\" };\n }\n\n const note =\n textValue(params.note) ??\n textValue(content.note) ??\n (text.length > 0 ? text : undefined);\n const instruction =\n textValue(params.instruction) ??\n textValue(content.instruction) ??\n (operation === \"continue\" || operation === \"resume\" ? text : undefined);\n const requestedAgentType =\n textValue(params.agentType) ?? textValue(content.agentType);\n\n let responseText = \"\";\n let data: Record<string, unknown> = { threadId: thread.id, operation };\n\n if (operation === \"pause\") {\n const result = await coordinator.pauseTaskThread(thread.id, note);\n responseText = `Paused \"${thread.title}\" and preserved the thread for follow-up discussion.`;\n data = { ...data, ...result };\n } else if (operation === \"stop\") {\n const result = await coordinator.stopTaskThread(thread.id, note);\n responseText = `Stopped \"${thread.title}\" and kept the thread history intact.`;\n data = { ...data, ...result };\n } else if (operation === \"archive\") {\n await coordinator.archiveTaskThread(thread.id);\n responseText = `Archived \"${thread.title}\".`;\n } else if (operation === \"reopen\") {\n await coordinator.reopenTaskThread(thread.id);\n responseText = `Reopened \"${thread.title}\".`;\n } else if (operation === \"continue\") {\n const nextInstruction =\n instruction?.trim() || `Continue the task \"${thread.title}\".`;\n const result = await coordinator.continueTaskThread(\n thread.id,\n nextInstruction,\n requestedAgentType,\n );\n responseText = result.reusedSession\n ? `Sent follow-up instructions to \"${thread.title}\" on the existing task session.`\n : `Resumed \"${thread.title}\" on a new task session.`;\n data = { ...data, ...result };\n } else {\n const result = await coordinator.resumeTaskThread(\n thread.id,\n instruction?.trim() || undefined,\n requestedAgentType,\n );\n responseText = result.reusedSession\n ? `Resumed \"${thread.title}\" on the current task session.`\n : `Resumed \"${thread.title}\" on a new task session.`;\n data = { ...data, ...result };\n }\n\n if (callback) {\n await callback({ text: responseText });\n }\n return {\n success: true,\n text: responseText,\n data: data as ActionResult[\"data\"],\n };\n },\n parameters: [\n {\n name: \"operation\",\n description: \"Control operation to apply to the task thread.\",\n required: true,\n schema: {\n type: \"string\" as const,\n enum: [\"pause\", \"stop\", \"resume\", \"continue\", \"archive\", \"reopen\"],\n },\n },\n {\n name: \"threadId\",\n description: \"Specific task thread id to control.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"sessionId\",\n description: \"Task session id to resolve into a thread when needed.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"search\",\n description: \"Search text used to find the relevant thread.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"note\",\n description: \"Optional reason for pausing or stopping the thread.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"instruction\",\n description: \"Follow-up instruction for resume or continue operations.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"agentType\",\n description: \"Optional framework override for a resumed task.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n ],\n};\n",
|
|
64
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n type Memory,\n} from \"@elizaos/core\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport {\n type ListTaskThreadsOptions,\n type TaskThreadStatus,\n} from \"../services/task-registry.js\";\nimport { requireTaskAgentAccess } from \"../services/task-policy.js\";\n\ntype HistoryMetric = \"list\" | \"count\" | \"detail\";\ntype HistoryWindow = \"active\" | \"today\" | \"yesterday\" | \"last_7_days\" | \"last_30_days\";\n\nfunction textValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction startOfDay(date: Date): Date {\n const copy = new Date(date);\n copy.setHours(0, 0, 0, 0);\n return copy;\n}\n\nfunction endOfDay(date: Date): Date {\n const copy = new Date(date);\n copy.setHours(23, 59, 59, 999);\n return copy;\n}\n\nfunction formatDate(date: Date): string {\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date);\n}\n\nfunction inferMetric(text: string, value?: string): HistoryMetric {\n const normalized = value?.trim().toLowerCase();\n if (normalized === \"count\" || normalized === \"detail\" || normalized === \"list\") {\n return normalized;\n }\n if (/\\bhow many\\b|\\bcount\\b/i.test(text)) return \"count\";\n if (/\\bshow me\\b|\\bgive me\\b|\\blist\\b|\\bwhat are\\b/i.test(text)) return \"list\";\n return \"detail\";\n}\n\nfunction inferStatuses(text: string, rawStatuses?: string[]): TaskThreadStatus[] | undefined {\n if (rawStatuses && rawStatuses.length > 0) {\n return rawStatuses as TaskThreadStatus[];\n }\n const statuses = new Set<TaskThreadStatus>();\n if (/\\bactive\\b|\\bright now\\b|\\bworking on right now\\b/i.test(text)) {\n statuses.add(\"active\");\n }\n if (/\\bblocked\\b/i.test(text)) {\n statuses.add(\"blocked\");\n }\n if (/\\binterrupted\\b|\\bpaused\\b/i.test(text)) {\n statuses.add(\"interrupted\");\n }\n if (/\\bdone\\b|\\bcompleted\\b|\\bfinished\\b/i.test(text)) {\n statuses.add(\"done\");\n }\n if (/\\bfailed\\b|\\berror\\b/i.test(text)) {\n statuses.add(\"failed\");\n }\n return statuses.size > 0 ? Array.from(statuses) : undefined;\n}\n\nfunction inferWindow(text: string, raw?: string): HistoryWindow | undefined {\n const normalized = raw?.trim().toLowerCase();\n if (\n normalized === \"active\" ||\n normalized === \"today\" ||\n normalized === \"yesterday\" ||\n normalized === \"last_7_days\" ||\n normalized === \"last_30_days\"\n ) {\n return normalized;\n }\n if (/\\bright now\\b|\\bcurrently\\b|\\bactive\\b/i.test(text)) return \"active\";\n if (/\\byesterday\\b/i.test(text)) return \"yesterday\";\n if (/\\blast week\\b|\\blast 7 days\\b|\\bin the last week\\b/i.test(text)) {\n return \"last_7_days\";\n }\n if (/\\blast month\\b|\\blast 30 days\\b/i.test(text)) return \"last_30_days\";\n if (/\\btoday\\b/i.test(text)) return \"today\";\n return undefined;\n}\n\nfunction inferSearch(text: string, raw?: string): string | undefined {\n if (raw?.trim()) return raw.trim();\n const quoted =\n text.match(/\"([^\"]{3,120})\"/)?.[1] ??\n text.match(/'([^']{3,120})'/)?.[1];\n if (quoted) return quoted.trim();\n const topical =\n text.match(/\\bworking on\\s+(.+?)(?:[?.!,]|$)/i)?.[1] ??\n text.match(/\\ball tasks where we were working on\\s+(.+?)(?:[?.!,]|$)/i)?.[1];\n return topical?.trim();\n}\n\nfunction buildWindowFilters(window: HistoryWindow | undefined): {\n latestActivityAfter?: number;\n latestActivityBefore?: number;\n label?: string;\n} {\n const now = new Date();\n if (window === \"active\") {\n return { label: \"active tasks right now\" };\n }\n if (window === \"today\") {\n const start = startOfDay(now);\n const end = endOfDay(now);\n return {\n latestActivityAfter: start.getTime(),\n latestActivityBefore: end.getTime(),\n label: `${formatDate(start)} through ${formatDate(end)}`,\n };\n }\n if (window === \"yesterday\") {\n const start = startOfDay(new Date(now.getTime() - 24 * 60 * 60 * 1000));\n const end = endOfDay(start);\n return {\n latestActivityAfter: start.getTime(),\n latestActivityBefore: end.getTime(),\n label: `${formatDate(start)} through ${formatDate(end)}`,\n };\n }\n if (window === \"last_7_days\") {\n const start = startOfDay(new Date(now.getTime() - 6 * 24 * 60 * 60 * 1000));\n return {\n latestActivityAfter: start.getTime(),\n latestActivityBefore: now.getTime(),\n label: `${formatDate(start)} through ${formatDate(now)}`,\n };\n }\n if (window === \"last_30_days\") {\n const start = startOfDay(new Date(now.getTime() - 29 * 24 * 60 * 60 * 1000));\n return {\n latestActivityAfter: start.getTime(),\n latestActivityBefore: now.getTime(),\n label: `${formatDate(start)} through ${formatDate(now)}`,\n };\n }\n return {};\n}\n\nfunction renderThreadLine(entry: {\n title: string;\n status: string;\n latestActivityAt?: number | null;\n summary?: string;\n}): string {\n const activity =\n typeof entry.latestActivityAt === \"number\"\n ? new Date(entry.latestActivityAt).toLocaleString(\"en-US\")\n : \"unknown time\";\n return `- ${entry.title} [${entry.status}] (${activity})${entry.summary ? `: ${entry.summary}` : \"\"}`;\n}\n\nexport const taskHistoryAction: Action = {\n name: \"TASK_HISTORY\",\n similes: [\n \"LIST_TASK_HISTORY\",\n \"GET_TASK_HISTORY\",\n \"SHOW_TASKS\",\n \"COUNT_TASKS\",\n \"TASK_STATUS_HISTORY\",\n ],\n description:\n \"Query coordinator task history without stuffing raw transcripts into model context. Use this for active work, yesterday/last-week summaries, topic search, counts, and thread detail lookup.\",\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"What are you working on right now?\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll check the coordinator's current task state.\",\n action: \"TASK_HISTORY\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"In the last week, give me all tasks where we were working on the Discord connector.\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll query the task history for that date range and topic.\",\n action: \"TASK_HISTORY\",\n },\n },\n ],\n ],\n validate: async (runtime: IAgentRuntime): Promise<boolean> => {\n return Boolean(getCoordinator(runtime));\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const access = await requireTaskAgentAccess(runtime, message, \"interact\");\n if (!access.allowed) {\n if (callback) {\n await callback({ text: access.reason });\n }\n return { success: false, error: \"FORBIDDEN\", text: access.reason };\n }\n\n const coordinator = getCoordinator(runtime);\n if (!coordinator) {\n if (callback) {\n await callback({ text: \"Coordinator is not available.\" });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n const params = (options?.parameters as Record<string, unknown> | undefined) ?? {};\n const content = (message.content ?? {}) as Record<string, unknown>;\n const text = typeof content.text === \"string\" ? content.text : \"\";\n\n const metric = inferMetric(\n text,\n textValue(params.metric) ?? textValue(content.metric),\n );\n const statuses = inferStatuses(\n text,\n Array.isArray(params.statuses)\n ? params.statuses.filter((value): value is string => typeof value === \"string\")\n : Array.isArray(content.statuses)\n ? content.statuses.filter((value): value is string => typeof value === \"string\")\n : undefined,\n );\n const window = inferWindow(\n text,\n textValue(params.window) ?? textValue(content.window),\n );\n const search = inferSearch(\n text,\n textValue(params.search) ?? textValue(content.search),\n );\n const limitRaw =\n Number(params.limit ?? content.limit ?? (metric === \"detail\" ? 1 : 10));\n const limit = Number.isFinite(limitRaw) && limitRaw > 0 ? Math.trunc(limitRaw) : 10;\n const includeArchived =\n (params.includeArchived as boolean | undefined) ??\n (content.includeArchived as boolean | undefined) ??\n false;\n const windowFilters = buildWindowFilters(window);\n\n const threadFilters: ListTaskThreadsOptions = {\n includeArchived,\n ...(statuses && statuses.length > 0 ? { statuses } : {}),\n ...(windowFilters.latestActivityAfter\n ? { latestActivityAfter: windowFilters.latestActivityAfter }\n : {}),\n ...(windowFilters.latestActivityBefore\n ? { latestActivityBefore: windowFilters.latestActivityBefore }\n : {}),\n ...(search ? { search } : {}),\n ...(window === \"active\" ? { hasActiveSession: true } : {}),\n limit,\n };\n\n const [count, threads] = await Promise.all([\n coordinator.countTaskThreads(threadFilters),\n coordinator.listTaskThreads(threadFilters),\n ]);\n\n const summaryWindow =\n windowFilters.label ??\n (window === \"active\" ? \"right now\" : includeArchived ? \"all recorded time\" : \"recent task history\");\n const summaryTopic = search ? ` for \"${search}\"` : \"\";\n const summaryStatus =\n statuses && statuses.length > 0 ? ` with status ${statuses.join(\", \")}` : \"\";\n\n let responseText = \"\";\n if (metric === \"count\") {\n responseText = `I found ${count} task${count === 1 ? \"\" : \"s\"} ${summaryWindow}${summaryTopic}${summaryStatus}.`;\n } else if (threads.length === 0) {\n responseText = `I did not find any tasks ${summaryWindow}${summaryTopic}${summaryStatus}.`;\n } else if (metric === \"detail\" && threads[0]) {\n const thread = await coordinator.getTaskThread(threads[0].id);\n responseText = [\n `The most relevant task is \"${threads[0].title}\" [${threads[0].status}].`,\n thread?.summary ? `Summary: ${thread.summary}` : \"\",\n thread?.latestWorkdir ? `Workspace: ${thread.latestWorkdir}` : \"\",\n thread?.latestRepo ? `Repository: ${thread.latestRepo}` : \"\",\n typeof thread?.latestActivityAt === \"number\"\n ? `Latest activity: ${new Date(thread.latestActivityAt).toLocaleString(\"en-US\")}`\n : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n } else {\n responseText = [\n `I found ${count} task${count === 1 ? \"\" : \"s\"} ${summaryWindow}${summaryTopic}${summaryStatus}.`,\n ...threads.slice(0, limit).map(renderThreadLine),\n ].join(\"\\n\");\n }\n\n if (callback) {\n await callback({ text: responseText });\n }\n return {\n success: true,\n text: responseText,\n data: {\n filters: threadFilters,\n window,\n count,\n threadIds: threads.map((thread) => thread.id),\n },\n };\n },\n parameters: [\n {\n name: \"metric\",\n description: \"Query mode: list, count, or detail.\",\n required: false,\n schema: { type: \"string\" as const, enum: [\"list\", \"count\", \"detail\"] },\n },\n {\n name: \"window\",\n description: \"Relative time window for the query.\",\n required: false,\n schema: {\n type: \"string\" as const,\n enum: [\"active\", \"today\", \"yesterday\", \"last_7_days\", \"last_30_days\"],\n },\n },\n {\n name: \"search\",\n description: \"Topic or free-text search string to match task threads.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"statuses\",\n description: \"Optional status filter list.\",\n required: false,\n schema: { type: \"array\" as const, items: { type: \"string\" as const } },\n },\n {\n name: \"limit\",\n description: \"Maximum number of thread summaries to return.\",\n required: false,\n schema: { type: \"number\" as const },\n },\n {\n name: \"includeArchived\",\n description: \"Whether archived threads should be included.\",\n required: false,\n schema: { type: \"boolean\" as const },\n },\n ],\n};\n",
|
|
65
|
+
"import { readFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { extractDevServerUrl } from \"./ansi-utils.js\";\nimport type { SwarmCoordinator } from \"./swarm-coordinator.js\";\nimport type { TaskArtifactRecord, TaskThreadDetail } from \"./task-registry.js\";\n\nexport type TaskShareTargetType =\n | \"artifact_uri\"\n | \"artifact_path\"\n | \"preview_url\"\n | \"workspace\";\n\nexport interface TaskShareTarget {\n type: TaskShareTargetType;\n label: string;\n value: string;\n source: string;\n remoteAccessible: boolean;\n}\n\nexport interface TaskShareDiscovery {\n threadId: string;\n title: string;\n shareCapabilities: string[];\n preferredTarget: TaskShareTarget | null;\n targets: TaskShareTarget[];\n}\n\nconst URL_RE = /\\bhttps?:\\/\\/[^\\s<>\"'`]+/gi;\n\nfunction resolveConfigPath(): string {\n const explicit =\n process.env.MILADY_CONFIG_PATH?.trim() ||\n process.env.ELIZA_CONFIG_PATH?.trim();\n if (explicit) return explicit;\n\n const stateDir =\n process.env.MILADY_STATE_DIR?.trim() ||\n process.env.ELIZA_STATE_DIR?.trim() ||\n path.join(os.homedir(), \".milady\");\n const namespace = process.env.ELIZA_NAMESPACE?.trim();\n const filename =\n !namespace || namespace === \"milady\" ? \"milady.json\" : `${namespace}.json`;\n return path.join(stateDir, filename);\n}\n\nfunction readMiladyConfig(): Record<string, unknown> | null {\n try {\n const raw = readFileSync(resolveConfigPath(), \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\nfunction detectShareCapabilities(): string[] {\n const config = readMiladyConfig();\n const capabilities: string[] = [];\n const gateway =\n config && typeof config.gateway === \"object\" && config.gateway\n ? (config.gateway as Record<string, unknown>)\n : null;\n const gatewayTailscale =\n gateway && typeof gateway.tailscale === \"object\" && gateway.tailscale\n ? (gateway.tailscale as Record<string, unknown>)\n : null;\n const gatewayRemote =\n gateway && typeof gateway.remote === \"object\" && gateway.remote\n ? (gateway.remote as Record<string, unknown>)\n : null;\n\n const tailscaleMode =\n typeof gatewayTailscale?.mode === \"string\" ? gatewayTailscale.mode : null;\n if (tailscaleMode && tailscaleMode !== \"off\") {\n capabilities.push(`tailscale:${tailscaleMode}`);\n }\n if (typeof gatewayRemote?.url === \"string\" && gatewayRemote.url.trim()) {\n capabilities.push(\"gateway-remote-url\");\n }\n if (\n typeof gatewayRemote?.sshTarget === \"string\" &&\n gatewayRemote.sshTarget.trim()\n ) {\n capabilities.push(\"gateway-remote-ssh\");\n }\n return capabilities;\n}\n\nfunction isRemoteAccessibleUrl(value: string): boolean {\n try {\n const parsed = new URL(value);\n const host = parsed.hostname.trim().toLowerCase();\n return ![\"localhost\", \"127.0.0.1\", \"0.0.0.0\"].includes(host);\n } catch {\n return false;\n }\n}\n\nfunction pushTarget(\n targets: TaskShareTarget[],\n seen: Set<string>,\n target: TaskShareTarget,\n): void {\n const key = `${target.type}:${target.value}`;\n if (seen.has(key)) return;\n seen.add(key);\n targets.push(target);\n}\n\nfunction artifactTargets(\n artifacts: TaskArtifactRecord[],\n targets: TaskShareTarget[],\n seen: Set<string>,\n): void {\n for (const artifact of artifacts) {\n if (artifact.uri?.trim()) {\n pushTarget(targets, seen, {\n type: \"artifact_uri\",\n label: artifact.title,\n value: artifact.uri,\n source: `artifact:${artifact.artifactType}`,\n remoteAccessible: isRemoteAccessibleUrl(artifact.uri),\n });\n }\n if (artifact.path?.trim()) {\n pushTarget(targets, seen, {\n type: \"artifact_path\",\n label: artifact.title,\n value: artifact.path,\n source: `artifact:${artifact.artifactType}`,\n remoteAccessible: false,\n });\n }\n }\n}\n\nfunction transcriptTargets(\n thread: TaskThreadDetail,\n targets: TaskShareTarget[],\n seen: Set<string>,\n): void {\n const recentTranscript = (thread.transcripts ?? [])\n .slice(-100)\n .map((entry) => entry.content)\n .join(\"\\n\");\n const previewUrl = extractDevServerUrl(recentTranscript);\n if (previewUrl) {\n pushTarget(targets, seen, {\n type: \"preview_url\",\n label: \"Live preview\",\n value: previewUrl,\n source: \"transcript:dev-server\",\n remoteAccessible: isRemoteAccessibleUrl(previewUrl),\n });\n }\n\n const discoveredUrls = recentTranscript.match(URL_RE) ?? [];\n for (const value of discoveredUrls) {\n pushTarget(targets, seen, {\n type: \"preview_url\",\n label: \"Discovered URL\",\n value,\n source: \"transcript:url\",\n remoteAccessible: isRemoteAccessibleUrl(value),\n });\n }\n}\n\nfunction workspaceTargets(\n thread: TaskThreadDetail,\n targets: TaskShareTarget[],\n seen: Set<string>,\n): void {\n if (thread.latestWorkdir?.trim()) {\n pushTarget(targets, seen, {\n type: \"workspace\",\n label: \"Workspace\",\n value: thread.latestWorkdir,\n source: \"thread:latest-workdir\",\n remoteAccessible: false,\n });\n }\n}\n\nfunction preferredTarget(targets: TaskShareTarget[]): TaskShareTarget | null {\n const remote = targets.find((target) => target.remoteAccessible);\n if (remote) return remote;\n const preview = targets.find((target) => target.type === \"preview_url\");\n if (preview) return preview;\n const artifact = targets.find((target) => target.type === \"artifact_path\");\n if (artifact) return artifact;\n return targets[0] ?? null;\n}\n\nexport async function discoverTaskShareOptions(\n coordinator: SwarmCoordinator,\n threadId: string,\n): Promise<TaskShareDiscovery | null> {\n const thread = await coordinator.getTaskThread(threadId);\n if (!thread) return null;\n\n const targets: TaskShareTarget[] = [];\n const seen = new Set<string>();\n artifactTargets(thread.artifacts ?? [], targets, seen);\n transcriptTargets(thread, targets, seen);\n workspaceTargets(thread, targets, seen);\n\n return {\n threadId: thread.id,\n title: thread.title,\n shareCapabilities: detectShareCapabilities(),\n preferredTarget: preferredTarget(targets),\n targets,\n };\n}\n",
|
|
66
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport { requireTaskAgentAccess } from \"../services/task-policy.js\";\nimport { discoverTaskShareOptions } from \"../services/task-share.js\";\nimport { resolveTaskThreadTarget } from \"./task-thread-target.js\";\n\nfunction artifactTypeForTarget(type: string): string {\n if (type === \"preview_url\" || type === \"artifact_uri\") return \"share_link\";\n if (type === \"artifact_path\") return \"share_path\";\n return \"workspace\";\n}\n\nexport const taskShareAction: Action = {\n name: \"TASK_SHARE\",\n similes: [\n \"SHARE_TASK_RESULT\",\n \"SHOW_TASK_ARTIFACT\",\n \"VIEW_TASK_OUTPUT\",\n \"CAN_I_SEE_IT\",\n \"PULL_IT_UP\",\n ],\n description:\n \"Discover the best available way to view or share a task result, including artifacts, live preview URLs, workspace paths, and environment share capabilities.\",\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Can I see it?\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll inspect the task artifacts and preview options.\",\n action: \"TASK_SHARE\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"How do I view that from a remote computer?\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll check the available share and remote-preview options.\",\n action: \"TASK_SHARE\",\n },\n },\n ],\n ],\n validate: async (runtime: IAgentRuntime): Promise<boolean> => {\n return Boolean(getCoordinator(runtime));\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const access = await requireTaskAgentAccess(runtime, message, \"interact\");\n if (!access.allowed) {\n if (callback) {\n await callback({ text: access.reason });\n }\n return { success: false, error: \"FORBIDDEN\", text: access.reason };\n }\n\n const coordinator = getCoordinator(runtime);\n if (!coordinator) {\n if (callback) {\n await callback({ text: \"Coordinator is not available.\" });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n const params = (options?.parameters as Record<string, unknown> | undefined) ?? {};\n const thread = await resolveTaskThreadTarget({\n coordinator,\n message,\n state,\n options: params,\n includeArchived: true,\n });\n if (!thread) {\n if (callback) {\n await callback({ text: \"I could not find a task thread to share.\" });\n }\n return { success: false, error: \"THREAD_NOT_FOUND\" };\n }\n\n const discovery = await discoverTaskShareOptions(coordinator, thread.id);\n if (!discovery || discovery.targets.length === 0) {\n const fallback = `I found the task thread \"${thread.title}\", but I did not find a preview URL or shareable artifact yet.`;\n if (callback) {\n await callback({ text: fallback });\n }\n return {\n success: false,\n error: \"NO_SHARE_TARGET\",\n text: fallback,\n data: { threadId: thread.id, shareCapabilities: discovery?.shareCapabilities ?? [] },\n };\n }\n\n const detail = await coordinator.getTaskThread(thread.id);\n const existingKeys = new Set(\n (detail?.artifacts ?? []).map((artifact) =>\n artifact.uri?.trim() || artifact.path?.trim() || `${artifact.artifactType}:${artifact.title}`,\n ),\n );\n for (const target of discovery.targets) {\n const key = target.value.trim();\n if (!key || existingKeys.has(key)) continue;\n await coordinator.taskRegistry.recordArtifact({\n threadId: thread.id,\n artifactType: artifactTypeForTarget(target.type),\n title: target.label,\n ...(target.type === \"artifact_path\" || target.type === \"workspace\"\n ? { path: target.value }\n : { uri: target.value }),\n metadata: {\n source: target.source,\n remoteAccessible: target.remoteAccessible,\n discoveredVia: \"task-share-action\",\n },\n });\n existingKeys.add(key);\n }\n\n const preferred = discovery.preferredTarget;\n const lines = [\n preferred\n ? `Best available view for \"${thread.title}\": ${preferred.value}`\n : `I found share options for \"${thread.title}\".`,\n ...discovery.targets.slice(0, 5).map(\n (target) =>\n `- ${target.label}: ${target.value}${target.remoteAccessible ? \" (remote-ready)\" : \"\"}`,\n ),\n discovery.shareCapabilities.length > 0\n ? `Environment share capabilities: ${discovery.shareCapabilities.join(\", \")}`\n : \"No explicit remote-share capability is configured, so local artifact paths and preview URLs are the only confirmed options right now.\",\n ].filter(Boolean);\n const responseText = lines.join(\"\\n\");\n\n if (callback) {\n await callback({ text: responseText });\n }\n return {\n success: true,\n text: responseText,\n data: {\n threadId: thread.id,\n preferredTarget: preferred,\n shareCapabilities: discovery.shareCapabilities,\n targetCount: discovery.targets.length,\n },\n };\n },\n parameters: [\n {\n name: \"threadId\",\n description: \"Specific task thread id to inspect.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"sessionId\",\n description: \"Task session id to resolve to its thread.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"search\",\n description: \"Search text used to find the task thread to share.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n ],\n};\n",
|
|
59
67
|
"/**\n * MANAGE_ISSUES action - Create, list, update, and close GitHub issues\n *\n * Provides full issue lifecycle management through the CodingWorkspaceService.\n * Supports creating issues, listing issues, adding comments, closing, and reopening.\n *\n * @module actions/manage-issues\n */\n\nimport type {\n Action,\n ActionResult,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\n\nexport const manageIssuesAction: Action = {\n name: \"MANAGE_ISSUES\",\n\n similes: [\n \"CREATE_ISSUE\",\n \"LIST_ISSUES\",\n \"CLOSE_ISSUE\",\n \"COMMENT_ISSUE\",\n \"UPDATE_ISSUE\",\n \"GET_ISSUE\",\n ],\n\n description:\n \"Manage GitHub issues for a repository. \" +\n \"Supports creating issues, listing issues, getting issue details, \" +\n \"adding comments, updating, closing, and reopening issues.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Create an issue on the testbed repo to add a login page\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll create that issue for you.\",\n action: \"MANAGE_ISSUES\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"List the open issues on HaruHunab1320/git-workspace-service-testbed\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Let me check the open issues for that repo.\",\n action: \"MANAGE_ISSUES\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Close issue #3 on the testbed repo\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll close that issue.\",\n action: \"MANAGE_ISSUES\",\n },\n },\n ],\n ],\n\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n ): Promise<boolean> => {\n const workspaceService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n return workspaceService != null;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const workspaceService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n if (!workspaceService) {\n if (callback) {\n await callback({ text: \"Workspace Service is not available.\" });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n // Wire auth prompt so OAuth device flow surfaces through chat\n workspaceService.setAuthPromptCallback((prompt) => {\n if (callback) {\n callback({\n text:\n `I need GitHub access to manage issues. Please authorize me:\\n\\n` +\n `Go to: ${prompt.verificationUri}\\n` +\n `Enter code: **${prompt.userCode}**\\n\\n` +\n `This code expires in ${Math.floor(prompt.expiresIn / 60)} minutes. ` +\n `I'll wait for you to complete authorization...`,\n });\n }\n });\n\n const params = options?.parameters;\n const content = message.content as Record<string, unknown>;\n const text = (content.text as string) ?? \"\";\n\n const operation =\n (params?.operation as string) ??\n (content.operation as string) ??\n inferOperation(text);\n const repo = (params?.repo as string) ?? (content.repo as string);\n\n if (!repo) {\n // Try to extract repo from text\n const urlMatch = text?.match(\n /(?:https?:\\/\\/github\\.com\\/)?([a-zA-Z0-9_.-]+\\/[a-zA-Z0-9_.-]+)/,\n );\n if (!urlMatch) {\n if (callback) {\n await callback({\n text: \"Please specify a repository (e.g., owner/repo or a GitHub URL).\",\n });\n }\n return { success: false, error: \"MISSING_REPO\" };\n }\n return handleOperation(\n workspaceService,\n urlMatch[1],\n operation,\n params ?? content,\n text,\n callback,\n );\n }\n\n return handleOperation(\n workspaceService,\n repo,\n operation,\n params ?? content,\n text,\n callback,\n );\n },\n\n parameters: [\n {\n name: \"operation\",\n description:\n \"The operation to perform: create, list, get, update, comment, close, reopen, add_labels\",\n required: true,\n schema: { type: \"string\" as const },\n },\n {\n name: \"repo\",\n description: \"Repository in owner/repo format or full GitHub URL.\",\n required: true,\n schema: { type: \"string\" as const },\n },\n {\n name: \"title\",\n description: \"Issue title (for create operation).\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"body\",\n description: \"Issue body/description (for create or comment operations).\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"issueNumber\",\n description:\n \"Issue number (for get, update, comment, close, reopen operations).\",\n required: false,\n schema: { type: \"number\" as const },\n },\n {\n name: \"labels\",\n description: \"Labels to add (comma-separated string or array).\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"state\",\n description:\n \"Filter by state: open, closed, or all (for list operation).\",\n required: false,\n schema: { type: \"string\" as const },\n },\n ],\n};\n\nasync function handleOperation(\n service: CodingWorkspaceService,\n repo: string,\n operation: string,\n params: Record<string, unknown>,\n originalText: string,\n callback?: HandlerCallback,\n): Promise<ActionResult | undefined> {\n try {\n switch (operation.toLowerCase()) {\n case \"create\": {\n const title = params.title as string;\n const body = params.body as string | undefined;\n\n // Support batch create: if no explicit title but text contains numbered items, create multiple\n if (!title) {\n const items = extractBulkItems(\n (params.text as string) ?? originalText,\n );\n if (items.length > 0) {\n const labels = parseLabels(params.labels);\n const created = [];\n for (const item of items) {\n const issue = await service.createIssue(repo, {\n title: item.title,\n body: item.body ?? \"\",\n labels: labels.length > 0 ? labels : undefined,\n });\n created.push(issue);\n }\n if (callback) {\n const summary = created\n .map((i) => `#${i.number}: ${i.title}\\n ${i.url}`)\n .join(\"\\n\");\n await callback({\n text: `Created ${created.length} issues:\\n${summary}`,\n });\n }\n return { success: true, data: { issues: created } };\n }\n\n if (callback)\n await callback({ text: \"Issue title is required for create.\" });\n return { success: false, error: \"MISSING_TITLE\" };\n }\n\n const labels = parseLabels(params.labels);\n const issue = await service.createIssue(repo, {\n title,\n body: body ?? \"\",\n labels: labels.length > 0 ? labels : undefined,\n });\n if (callback) {\n await callback({\n text: `Created issue #${issue.number}: ${issue.title}\\n${issue.url}`,\n });\n }\n return { success: true, data: { issue } };\n }\n\n case \"list\": {\n const stateFilter = (params.state as string) ?? \"open\";\n const labels = parseLabels(params.labels);\n const issues = await service.listIssues(repo, {\n state: stateFilter as \"open\" | \"closed\" | \"all\",\n labels: labels.length > 0 ? labels : undefined,\n });\n if (callback) {\n if (issues.length === 0) {\n await callback({\n text: `No ${stateFilter} issues found in ${repo}.`,\n });\n } else {\n const summary = issues\n .map(\n (i) =>\n `#${i.number} [${i.state}] ${i.title}${i.labels.length > 0 ? ` (${i.labels.join(\", \")})` : \"\"}`,\n )\n .join(\"\\n\");\n await callback({ text: `Issues in ${repo}:\\n${summary}` });\n }\n }\n return { success: true, data: { issues } };\n }\n\n case \"get\": {\n const issueNumber = Number(params.issueNumber);\n if (!issueNumber) {\n if (callback) await callback({ text: \"Issue number is required.\" });\n return { success: false, error: \"MISSING_ISSUE_NUMBER\" };\n }\n const issue = await service.getIssue(repo, issueNumber);\n if (callback) {\n await callback({\n text: `Issue #${issue.number}: ${issue.title} [${issue.state}]\\n\\n${issue.body}\\n\\nLabels: ${issue.labels.join(\", \") || \"none\"}\\n${issue.url}`,\n });\n }\n return { success: true, data: { issue } };\n }\n\n case \"update\": {\n const issueNumber = Number(params.issueNumber);\n if (!issueNumber) {\n if (callback) await callback({ text: \"Issue number is required.\" });\n return { success: false, error: \"MISSING_ISSUE_NUMBER\" };\n }\n const labels = parseLabels(params.labels);\n const issue = await service.updateIssue(repo, issueNumber, {\n title: params.title as string | undefined,\n body: params.body as string | undefined,\n labels: labels.length > 0 ? labels : undefined,\n });\n if (callback) {\n await callback({\n text: `Updated issue #${issue.number}: ${issue.title}`,\n });\n }\n return { success: true, data: { issue } };\n }\n\n case \"comment\": {\n const issueNumber = Number(params.issueNumber);\n const body = params.body as string;\n if (!issueNumber || !body) {\n if (callback)\n await callback({\n text: \"Issue number and comment body are required.\",\n });\n return { success: false, error: \"MISSING_PARAMS\" };\n }\n const comment = await service.addComment(repo, issueNumber, body);\n if (callback) {\n await callback({\n text: `Added comment to issue #${issueNumber}: ${comment.url}`,\n });\n }\n return { success: true, data: { comment } };\n }\n\n case \"close\": {\n const issueNumber = Number(params.issueNumber);\n if (!issueNumber) {\n if (callback) await callback({ text: \"Issue number is required.\" });\n return { success: false, error: \"MISSING_ISSUE_NUMBER\" };\n }\n const issue = await service.closeIssue(repo, issueNumber);\n if (callback) {\n await callback({\n text: `Closed issue #${issue.number}: ${issue.title}`,\n });\n }\n return { success: true, data: { issue } };\n }\n\n case \"reopen\": {\n const issueNumber = Number(params.issueNumber);\n if (!issueNumber) {\n if (callback) await callback({ text: \"Issue number is required.\" });\n return { success: false, error: \"MISSING_ISSUE_NUMBER\" };\n }\n const issue = await service.reopenIssue(repo, issueNumber);\n if (callback) {\n await callback({\n text: `Reopened issue #${issue.number}: ${issue.title}`,\n });\n }\n return { success: true, data: { issue } };\n }\n\n case \"add_labels\": {\n const issueNumber = Number(params.issueNumber);\n const labels = parseLabels(params.labels);\n if (!issueNumber || labels.length === 0) {\n if (callback)\n await callback({ text: \"Issue number and labels are required.\" });\n return { success: false, error: \"MISSING_PARAMS\" };\n }\n await service.addLabels(repo, issueNumber, labels);\n if (callback) {\n await callback({\n text: `Added labels [${labels.join(\", \")}] to issue #${issueNumber}`,\n });\n }\n return { success: true };\n }\n\n default:\n if (callback) {\n await callback({\n text: `Unknown operation: ${operation}. Use: create, list, get, update, comment, close, reopen, add_labels`,\n });\n }\n return { success: false, error: \"UNKNOWN_OPERATION\" };\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (callback) {\n await callback({ text: `Issue operation failed: ${errorMessage}` });\n }\n return { success: false, error: errorMessage };\n }\n}\n\n/**\n * Extract multiple issue titles/bodies from text containing numbered or bulleted items.\n * E.g. \"1) Add a login page 2) Fix the bug 3) Add tests\"\n */\nfunction extractBulkItems(\n text: string,\n): Array<{ title: string; body?: string }> {\n if (!text) return [];\n\n // Match numbered items: \"1) ...\", \"1. ...\", \"1: ...\"\n const numberedPattern =\n /(?:^|\\s)(\\d+)[).:-]\\s*(.+?)(?=(?:\\s+\\d+[).:-]\\s)|$)/gs;\n const items: Array<{ title: string; body?: string }> = [];\n\n for (const match of text.matchAll(numberedPattern)) {\n const raw = match[2].trim();\n if (raw.length > 0) {\n items.push({ title: raw });\n }\n }\n\n if (items.length >= 2) return items;\n\n // Fallback: split by common delimiters like \" - \" or newlines with bullets\n const bulletPattern = /(?:^|\\n)\\s*[-*•]\\s+(.+)/g;\n const bulletItems: Array<{ title: string; body?: string }> = [];\n for (const match of text.matchAll(bulletPattern)) {\n const raw = match[1].trim();\n if (raw.length > 0) {\n bulletItems.push({ title: raw });\n }\n }\n\n if (bulletItems.length >= 2) return bulletItems;\n\n return [];\n}\n\n/**\n * Infer the operation from the user's message text when the LLM\n * doesn't explicitly set the operation parameter.\n */\nfunction inferOperation(text: string): string {\n const lower = text.toLowerCase();\n\n // Order matters: check more specific patterns first\n if (/\\b(create|open|file|submit|make|add)\\b.*\\bissue/.test(lower))\n return \"create\";\n if (/\\bissue.*\\b(create|open|file|submit|make)\\b/.test(lower))\n return \"create\";\n if (/\\b(close|resolve)\\b.*\\bissue/.test(lower)) return \"close\";\n if (/\\bissue.*\\b(close|resolve)\\b/.test(lower)) return \"close\";\n if (/\\b(reopen|re-open)\\b.*\\bissue/.test(lower)) return \"reopen\";\n if (/\\b(comment|reply)\\b.*\\bissue/.test(lower)) return \"comment\";\n if (/\\bissue.*\\b(comment|reply)\\b/.test(lower)) return \"comment\";\n if (/\\b(update|edit|modify)\\b.*\\bissue/.test(lower)) return \"update\";\n if (/\\bissue.*\\b(update|edit|modify)\\b/.test(lower)) return \"update\";\n if (/\\b(label|tag)\\b.*\\bissue/.test(lower)) return \"add_labels\";\n if (/\\bget\\b.*\\bissue\\s*#?\\d/.test(lower)) return \"get\";\n if (/\\bissue\\s*#?\\d/.test(lower) && !/\\b(list|show|all)\\b/.test(lower))\n return \"get\";\n if (/\\b(list|show|check|what are)\\b.*\\bissue/.test(lower)) return \"list\";\n\n return \"list\";\n}\n\nfunction parseLabels(input: unknown): string[] {\n if (!input) return [];\n if (Array.isArray(input)) return input.map(String);\n if (typeof input === \"string\")\n return input\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return [];\n}\n",
|
|
60
68
|
"/**\n * PROVISION_WORKSPACE action - Create a git workspace for coding tasks\n *\n * Clones a repository or creates a worktree for isolated development.\n * Useful for setting up a clean environment before spawning a coding agent.\n *\n * @module actions/provision-workspace\n */\n\nimport type {\n Action,\n ActionResult,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport type {\n CodingWorkspaceService,\n WorkspaceResult,\n} from \"../services/workspace-service.js\";\n\nexport const provisionWorkspaceAction: Action = {\n name: \"PROVISION_WORKSPACE\",\n\n similes: [\n \"CREATE_WORKSPACE\",\n \"CLONE_REPO\",\n \"SETUP_WORKSPACE\",\n \"PREPARE_WORKSPACE\",\n ],\n\n description:\n \"Create a git workspace for coding tasks. \" +\n \"Can clone a repository or create a git worktree for isolated development.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Clone the repo and create a workspace for the feature\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll set up a workspace for you.\",\n action: \"PROVISION_WORKSPACE\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Create a worktree for the bug fix\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Creating an isolated worktree for the bug fix.\",\n action: \"PROVISION_WORKSPACE\",\n },\n },\n ],\n ],\n\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n ): Promise<boolean> => {\n const workspaceService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n return workspaceService != null;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const workspaceService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n if (!workspaceService) {\n if (callback) {\n await callback({\n text: \"Workspace Service is not available.\",\n });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n const content = message.content as {\n text?: string;\n repo?: string;\n baseBranch?: string;\n useWorktree?: boolean;\n parentWorkspaceId?: string;\n };\n\n // Try to extract repo URL from text if not provided explicitly\n let repo = content.repo;\n if (!repo && content.text) {\n // Match GitHub/GitLab/Bitbucket URLs\n const urlMatch = content.text.match(\n /https?:\\/\\/(?:github\\.com|gitlab\\.com|bitbucket\\.org)\\/[\\w.-]+\\/[\\w.-]+(?:\\.git)?/i,\n );\n if (urlMatch) {\n repo = urlMatch[0];\n }\n }\n\n if (!repo && !content.useWorktree) {\n if (callback) {\n await callback({\n text: \"Please specify a repository URL or use worktree mode with a parent workspace.\",\n });\n }\n return { success: false, error: \"MISSING_REPO\" };\n }\n\n // Validate repo URL against allowed domains\n if (repo) {\n const ALLOWED_DOMAINS =\n /^https?:\\/\\/(github\\.com|gitlab\\.com|bitbucket\\.org)\\//i;\n if (!ALLOWED_DOMAINS.test(repo)) {\n if (callback) {\n await callback({\n text: \"Repository URL must be from github.com, gitlab.com, or bitbucket.org.\",\n });\n }\n return { success: false, error: \"INVALID_REPO_DOMAIN\" };\n }\n }\n\n // For worktree mode, need parent\n let parentWorkspaceId = content.parentWorkspaceId;\n if (content.useWorktree && !parentWorkspaceId) {\n // Try to use the current workspace from state\n if (state?.codingWorkspace) {\n parentWorkspaceId = (state.codingWorkspace as { id: string }).id;\n } else {\n if (callback) {\n await callback({\n text: \"Worktree mode requires a parent workspace. Clone a repo first or specify parentWorkspaceId.\",\n });\n }\n return { success: false, error: \"MISSING_PARENT\" };\n }\n }\n\n try {\n const workspace: WorkspaceResult =\n await workspaceService.provisionWorkspace({\n repo: repo ?? \"\",\n baseBranch: content.baseBranch,\n useWorktree: content.useWorktree,\n parentWorkspaceId,\n });\n\n // Store workspace in state\n if (state) {\n state.codingWorkspace = {\n id: workspace.id,\n path: workspace.path,\n branch: workspace.branch,\n isWorktree: workspace.isWorktree,\n };\n }\n\n if (callback) {\n await callback({\n text:\n `Created workspace at ${workspace.path}\\n` +\n `Branch: ${workspace.branch}\\n` +\n `Type: ${workspace.isWorktree ? \"worktree\" : \"clone\"}`,\n });\n }\n\n return {\n success: true,\n text: `Created workspace ${workspace.id}`,\n data: {\n workspaceId: workspace.id,\n path: workspace.path,\n branch: workspace.branch,\n isWorktree: workspace.isWorktree,\n },\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (callback) {\n await callback({\n text: `Failed to provision workspace: ${errorMessage}`,\n });\n }\n return { success: false, error: errorMessage };\n }\n },\n\n parameters: [\n {\n name: \"repo\",\n description: \"Git repository URL to clone.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"baseBranch\",\n description: \"Base branch to create feature branch from (default: main).\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"useWorktree\",\n description: \"Create a git worktree instead of a full clone.\",\n required: false,\n schema: { type: \"boolean\" as const },\n },\n {\n name: \"parentWorkspaceId\",\n description: \"Parent workspace ID for worktree creation.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n ],\n};\n",
|
|
61
|
-
"import type {
|
|
62
|
-
"/**\n * SEND_TO_AGENT action - Send input to a running task agent.\n *\n * Allows sending text or commands to an active PTY session.\n * Useful for responding to prompts, providing feedback, or giving new instructions.\n *\n * @module actions/send-to-agent\n */\n\nimport type {\n Action,\n ActionResult,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { getCoordinator, type PTYService } from \"../services/pty-service.js\";\nimport { requireTaskAgentAccess } from \"../services/task-policy.js\";\nimport { normalizeAgentType } from \"../services/pty-types.js\";\n\nexport const sendToAgentAction: Action = {\n name: \"SEND_TO_AGENT\",\n\n similes: [\n \"SEND_TO_CODING_AGENT\",\n \"MESSAGE_CODING_AGENT\",\n \"INPUT_TO_AGENT\",\n \"RESPOND_TO_AGENT\",\n \"TELL_CODING_AGENT\",\n \"MESSAGE_AGENT\",\n \"TELL_TASK_AGENT\",\n ],\n\n description:\n \"Send text input or key presses to a running task-agent session. \" +\n \"Use this to respond to agent prompts, provide feedback, continue a task, or assign a fresh tracked task to an existing agent.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Tell the running sub-agent to accept the changes\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll send the approval to the task agent.\",\n action: \"SEND_TO_AGENT\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Say yes to the agent prompt\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Sending confirmation to the agent.\",\n action: \"SEND_TO_AGENT\",\n },\n },\n ],\n ],\n\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n ): Promise<boolean> => {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n return false;\n }\n // Fast-fail: listSessions() does a JSON-RPC call to the Node worker which\n // can take 30s to timeout when the worker is busy. Cap at 2s so action\n // validation doesn't block the entire message pipeline.\n try {\n const sessions = await Promise.race([\n ptyService.listSessions(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"validate timeout\")), 2000),\n ),\n ]);\n return sessions.length > 0;\n } catch {\n return false;\n }\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const access = await requireTaskAgentAccess(runtime, message, \"interact\");\n if (!access.allowed) {\n if (callback) {\n await callback({\n text: access.reason,\n });\n }\n return { success: false, error: \"FORBIDDEN\", text: access.reason };\n }\n\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n if (callback) {\n await callback({\n text: \"PTY Service is not available.\",\n });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n const params = options?.parameters as Record<string, unknown> | undefined;\n const content = message.content as {\n sessionId?: string;\n input?: string;\n keys?: string;\n task?: string;\n label?: string;\n };\n\n // Get session ID from content or state\n let sessionId = (params?.sessionId as string) ?? content.sessionId;\n if (!sessionId && state?.codingSession) {\n sessionId = (state.codingSession as { id: string }).id;\n }\n\n if (!sessionId) {\n // Try to find the most recent session\n const sessions = await ptyService.listSessions();\n if (sessions.length === 0) {\n if (callback) {\n await callback({\n text: \"No active task-agent sessions. Spawn an agent first.\",\n });\n }\n return { success: false, error: \"NO_SESSION\" };\n }\n sessionId = sessions[sessions.length - 1].id;\n }\n\n const session = ptyService.getSession(sessionId);\n if (!session) {\n if (callback) {\n await callback({\n text: `Session ${sessionId} not found.`,\n });\n }\n return { success: false, error: \"SESSION_NOT_FOUND\" };\n }\n\n try {\n const keys = (params?.keys as string) ?? content.keys;\n const trackedTask = (params?.task as string) ?? content.task;\n const taskLabel = (params?.label as string) ?? content.label;\n const input = (params?.input as string) ?? content.input ?? trackedTask;\n\n if (keys) {\n // Send special key sequence\n await ptyService.sendKeysToSession(sessionId, keys);\n if (callback) {\n await callback({\n text: \"Sent key sequence to task agent.\",\n });\n }\n return {\n success: true,\n text: \"Sent key sequence\",\n data: { sessionId, keys },\n };\n } else if (input) {\n // Send text input\n await ptyService.sendToSession(sessionId, input);\n if (trackedTask) {\n const coordinator = getCoordinator(runtime);\n const existingTask = coordinator?.getTaskContext(sessionId);\n const taskThread =\n coordinator && !existingTask\n ? await coordinator.createTaskThread({\n title:\n taskLabel ||\n (typeof session.metadata?.label === \"string\"\n ? session.metadata.label\n : `agent-${sessionId.slice(-8)}`),\n originalRequest: trackedTask,\n kind: \"coding\",\n roomId:\n typeof (message as unknown as Record<string, unknown>).roomId === \"string\"\n ? ((message as unknown as Record<string, unknown>).roomId as string)\n : null,\n ownerUserId:\n typeof (message as unknown as Record<string, unknown>).userId === \"string\"\n ? ((message as unknown as Record<string, unknown>).userId as string)\n : null,\n metadata: {\n source: \"send-to-agent-action\",\n messageId: message.id,\n sessionId,\n },\n })\n : null;\n if (coordinator) {\n await coordinator.registerTask(sessionId, {\n threadId: existingTask?.threadId ?? taskThread?.id ?? sessionId,\n agentType: normalizeAgentType(session.agentType),\n label:\n taskLabel ||\n existingTask?.label ||\n (typeof session.metadata?.label === \"string\"\n ? session.metadata.label\n : `agent-${sessionId.slice(-8)}`),\n originalTask: trackedTask,\n workdir: session.workdir,\n ...(existingTask?.repo ? { repo: existingTask.repo } : {}),\n });\n }\n }\n if (callback) {\n await callback({\n text: trackedTask\n ? `Assigned new tracked task to task agent: \"${trackedTask}\"`\n : `Sent to task agent: \"${input}\"`,\n });\n }\n return {\n success: true,\n text: trackedTask ? \"Assigned new task to agent\" : \"Sent input to agent\",\n data: { sessionId, input, ...(trackedTask ? { task: trackedTask } : {}) },\n };\n } else {\n if (callback) {\n await callback({\n text: \"No input provided. Specify 'input', 'task', or 'keys' parameter.\",\n });\n }\n return { success: false, error: \"NO_INPUT\" };\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (callback) {\n await callback({\n text: `Failed to send to agent: ${errorMessage}`,\n });\n }\n return { success: false, error: errorMessage };\n }\n },\n\n parameters: [\n {\n name: \"sessionId\",\n description:\n \"ID of the task-agent session to send to. If not specified, uses the current session.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"input\",\n description: \"Text input to send to the running task agent.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"task\",\n description:\n \"New tracked task to assign to the existing agent. This is also sent as the next input so LIST_AGENTS and provider status reflect the new assignment.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"label\",\n description:\n \"Optional label to use when tracking a newly assigned task on an existing agent.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"keys\",\n description:\n \"Special key sequence to send (e.g., 'Enter', 'Ctrl-C', 'y').\",\n required: false,\n schema: { type: \"string\" as const },\n },\n ],\n};\n\nexport const sendToTaskAgentAction = sendToAgentAction;\n",
|
|
63
|
-
"/**\n * SPAWN_AGENT action - Spawns a CLI task agent.\n *\n * Creates a new PTY session for a task agent (Claude Code, Codex, etc.)\n * and returns a session ID for subsequent interactions.\n *\n * @module actions/spawn-agent\n */\n\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport type { AgentCredentials, ApprovalPreset } from \"coding-agent-adapters\";\nimport type { PTYService } from \"../services/pty-service.js\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport {\n type CodingAgentType,\n isPiAgentType,\n normalizeAgentType,\n type SessionInfo,\n toPiCommand,\n} from \"../services/pty-types.js\";\nimport { readConfigEnvKey } from \"../services/config-env.js\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\nimport { buildAgentCredentials } from \"./coding-task-helpers.js\";\n\nexport const spawnAgentAction: Action = {\n name: \"SPAWN_AGENT\",\n\n similes: [\n \"SPAWN_CODING_AGENT\",\n \"START_CODING_AGENT\",\n \"LAUNCH_CODING_AGENT\",\n \"CREATE_CODING_AGENT\",\n \"SPAWN_CODER\",\n \"RUN_CODING_AGENT\",\n \"SPAWN_SUB_AGENT\",\n \"START_TASK_AGENT\",\n \"CREATE_AGENT\",\n ],\n\n description:\n \"Spawn a specific task agent inside an existing workspace when you need direct control. \" +\n \"These agents are intentionally open-ended and can handle investigation, writing, planning, testing, synthesis, repo work, and general async task execution. \" +\n \"Returns a session ID that can be used to interact with the agent.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Start a Codex task agent in that workspace and have it continue the investigation.\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll spawn a task agent in the current workspace and hand it the next chunk of work.\",\n action: \"SPAWN_AGENT\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Spin up a task agent for the follow-up work in this repo.\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll create a task-agent session for that.\",\n action: \"SPAWN_AGENT\",\n },\n },\n ],\n ],\n\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n ): Promise<boolean> => {\n // Check if PTYService is available\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n logger.warn(\"[SPAWN_AGENT] PTYService not available\");\n return false;\n }\n return true;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n if (callback) {\n await callback({\n text: \"PTY Service is not available. Cannot spawn a task agent.\",\n });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n // Extract parameters from options or message content\n const params = options?.parameters;\n const content = message.content as Record<string, unknown>;\n\n const explicitRawType =\n (params?.agentType as string) ?? (content.agentType as string);\n const rawAgentType =\n explicitRawType ?? (await ptyService.resolveAgentType());\n const agentType = normalizeAgentType(rawAgentType);\n const task = (params?.task as string) ?? (content.task as string);\n const piRequested = isPiAgentType(rawAgentType);\n const initialTask = piRequested ? toPiCommand(task) : task;\n\n // Resolve workdir: explicit param > state from PROVISION_WORKSPACE > most recent workspace > cwd\n let workdir = (params?.workdir as string) ?? (content.workdir as string);\n if (!workdir && state?.codingWorkspace) {\n workdir = (state.codingWorkspace as { path: string }).path;\n }\n if (!workdir) {\n // Check workspace service for most recently provisioned workspace\n const wsService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n if (wsService) {\n const workspaces = wsService.listWorkspaces();\n if (workspaces.length > 0) {\n workdir = workspaces[workspaces.length - 1].path;\n }\n }\n }\n if (!workdir) {\n if (callback) {\n await callback({\n text: \"No workspace found. Please provision a workspace first using PROVISION_WORKSPACE or provide a workdir.\",\n });\n }\n return { success: false, error: \"NO_WORKSPACE\" };\n }\n\n // Validate workdir is within allowed directories\n const resolvedWorkdir = path.resolve(workdir);\n const workspaceBaseDir = path.join(os.homedir(), \".milady\", \"workspaces\");\n const allowedPrefixes = [\n path.resolve(workspaceBaseDir),\n path.resolve(process.cwd()),\n ];\n const isAllowed = allowedPrefixes.some(\n (prefix) =>\n resolvedWorkdir.startsWith(prefix + path.sep) ||\n resolvedWorkdir === prefix,\n );\n if (!isAllowed) {\n if (callback) {\n await callback({\n text: \"The specified workdir is outside of allowed directories. Please use a workspace directory.\",\n });\n }\n return { success: false, error: \"WORKDIR_OUTSIDE_ALLOWED\" };\n }\n workdir = resolvedWorkdir;\n\n const memoryContent =\n (params?.memoryContent as string) ?? (content.memoryContent as string);\n const approvalPreset =\n (params?.approvalPreset as string) ?? (content.approvalPreset as string);\n\n // Custom credentials for MCP servers and other integrations\n const customCredentialKeys = runtime.getSetting(\"CUSTOM_CREDENTIAL_KEYS\") as\n | string\n | undefined;\n let customCredentials: Record<string, string> | undefined;\n if (customCredentialKeys) {\n customCredentials = {};\n for (const key of customCredentialKeys.split(\",\").map((k) => k.trim())) {\n const val = runtime.getSetting(key) as string | undefined;\n if (val) customCredentials[key] = val;\n }\n }\n\n // Build credentials based on the user's configured LLM provider.\n // Throws if cloud mode is selected but no cloud API key is paired.\n const llmProvider =\n readConfigEnvKey(\"PARALLAX_LLM_PROVIDER\") || \"subscription\";\n let credentials: AgentCredentials;\n try {\n credentials = buildAgentCredentials(runtime);\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Failed to build credentials\";\n logger.error(`[spawn-agent] ${msg}`);\n if (callback) {\n await callback({ text: msg });\n }\n return { success: false, error: \"INVALID_CREDENTIALS\" };\n }\n\n try {\n // Check if the agent CLI is installed (for non-shell agents)\n if (agentType !== \"shell\" && agentType !== \"pi\") {\n const [preflight] = await ptyService.checkAvailableAgents([\n agentType as Exclude<CodingAgentType, \"shell\" | \"pi\">,\n ]);\n if (preflight && !preflight.installed) {\n if (callback) {\n await callback({\n text:\n `${preflight.adapter} CLI is not installed.\\n` +\n `Install with: ${preflight.installCommand}\\n` +\n `Docs: ${preflight.docsUrl}`,\n });\n }\n return { success: false, error: \"AGENT_NOT_INSTALLED\" };\n }\n }\n\n // Check if coordinator is active — route blocking prompts through it\n const coordinator = getCoordinator(runtime);\n const taskThread =\n coordinator && task\n ? await coordinator.createTaskThread({\n title: `agent-${Date.now()}`,\n originalRequest: task,\n kind: \"coding\",\n roomId:\n typeof (message as unknown as Record<string, unknown>).roomId === \"string\"\n ? ((message as unknown as Record<string, unknown>).roomId as string)\n : null,\n ownerUserId:\n typeof (message as unknown as Record<string, unknown>).userId === \"string\"\n ? ((message as unknown as Record<string, unknown>).userId as string)\n : null,\n metadata: {\n source: \"spawn-agent-action\",\n messageId: message.id,\n requestedType: rawAgentType,\n },\n })\n : null;\n\n // Spawn the PTY session\n const session: SessionInfo = await ptyService.spawnSession({\n name: `task-${Date.now()}`,\n agentType,\n workdir,\n initialTask,\n memoryContent,\n credentials,\n approvalPreset:\n (approvalPreset as ApprovalPreset | undefined) ??\n ptyService.defaultApprovalPreset,\n customCredentials,\n // Let adapter auto-response handle startup prompts (API key, trust, etc.)\n // when using cloud/API key mode — the LLM coordinator misinterprets these.\n // In subscription mode, the coordinator handles all prompts.\n ...(coordinator && llmProvider === \"subscription\"\n ? { skipAdapterAutoResponse: true }\n : {}),\n metadata: {\n threadId: taskThread?.id,\n requestedType: rawAgentType,\n messageId: message.id,\n userId: (message as unknown as Record<string, unknown>).userId,\n },\n });\n\n // Register event handler for this session\n ptyService.onSessionEvent((sessionId, event, data) => {\n if (sessionId !== session.id) return;\n\n // Log session events for debugging\n logger.debug(\n `[Session ${sessionId}] ${event}: ${JSON.stringify(data)}`,\n );\n\n // When coordinator is active it owns chat messaging for these events\n if (!coordinator) {\n // Handle blocked state - agent is waiting for input\n if (event === \"blocked\" && callback) {\n callback({\n text: `Task agent is waiting for input: ${(data as { prompt?: string }).prompt ?? \"unknown prompt\"}`,\n });\n }\n\n // Handle completion\n if (event === \"completed\" && callback) {\n callback({\n text: \"Task agent completed the task.\",\n });\n }\n\n // Handle errors\n if (event === \"error\" && callback) {\n callback({\n text: `Task agent encountered an error: ${(data as { message?: string }).message ?? \"unknown error\"}`,\n });\n }\n }\n });\n if (coordinator && task) {\n await coordinator.registerTask(session.id, {\n threadId: taskThread?.id ?? session.id,\n agentType,\n label: `agent-${session.id.slice(-8)}`,\n originalTask: task,\n workdir,\n });\n }\n\n // Store session info in state for subsequent actions\n\n if (state) {\n state.codingSession = {\n id: session.id,\n agentType: session.agentType,\n workdir: session.workdir,\n status: session.status,\n };\n }\n\n if (callback) {\n await callback({\n text: `Started ${piRequested ? \"pi\" : agentType} task agent in ${workdir}${task ? ` with task: \"${task}\"` : \"\"}. Session ID: ${session.id}`,\n });\n }\n\n return {\n success: true,\n text: `Started ${piRequested ? \"pi\" : agentType} task agent`,\n data: {\n sessionId: session.id,\n agentType: piRequested ? \"pi\" : session.agentType,\n workdir: session.workdir,\n status: session.status,\n },\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger.error(\"[SPAWN_AGENT] Failed to spawn agent:\", errorMessage);\n\n if (callback) {\n await callback({\n text: `Failed to spawn task agent: ${errorMessage}`,\n });\n }\n\n return { success: false, error: errorMessage };\n }\n },\n\n parameters: [\n {\n name: \"agentType\",\n description:\n \"Specific task-agent framework to spawn. Options: claude (Claude Code), codex (OpenAI Codex), gemini (Google Gemini), aider, pi, shell (generic shell). \" +\n \"If omitted, the orchestrator picks the preferred available framework.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"workdir\",\n description:\n \"Working directory for the agent. Defaults to current directory.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"task\",\n description: \"Open-ended task or prompt to send to the task agent once spawned.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"memoryContent\",\n description:\n \"Instructions or shared context to write to the task agent's memory file before spawning.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"approvalPreset\",\n description:\n \"Permission level for the task agent: readonly (safe audit), standard (reads+web auto, writes prompt), permissive (file ops auto, shell prompts), autonomous (all auto, use with sandbox)\",\n required: false,\n schema: {\n type: \"string\" as const,\n enum: [\"readonly\", \"standard\", \"permissive\", \"autonomous\"],\n },\n },\n ],\n};\n\nexport const spawnTaskAgentAction = spawnAgentAction;\n",
|
|
64
|
-
"/**\n * Helper functions for the START_CODING_TASK action.\n *\n * - createScratchDir() -- Creates a scratch sandbox directory for non-repo tasks\n * - generateLabel() -- Generate a short semantic label from repo URL and/or task description\n * - registerSessionEvents() -- Register lifecycle event handlers for a spawned session\n *\n * @module actions/coding-task-helpers\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n} from \"@elizaos/core\";\nimport type { AgentCredentials } from \"coding-agent-adapters\";\nimport { readConfigCloudKey, readConfigEnvKey } from \"../services/config-env.js\";\nimport type { PTYService } from \"../services/pty-service.js\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\n\n/**\n * Eliza Cloud base URLs. The Anthropic SDK appends `/v1/messages` and the\n * OpenAI SDK appends `/chat/completions`, so each needs a different base.\n */\nconst ELIZA_CLOUD_ANTHROPIC_BASE = \"https://www.elizacloud.ai/api\";\nconst ELIZA_CLOUD_OPENAI_BASE = \"https://www.elizacloud.ai/api/v1\";\n\n/**\n * Build agent credentials based on the user's configured LLM provider.\n *\n * - subscription/api_keys: reads provider-specific API keys from runtime settings\n * - cloud: reads `cloud.apiKey` from milady.json and routes via Eliza Cloud base URLs.\n * Note: Eliza Cloud does NOT proxy Google/Gemini, so `googleKey` is left undefined.\n * Throws if cloud mode is selected but no cloud API key is paired.\n */\nexport function buildAgentCredentials(\n runtime: IAgentRuntime,\n): AgentCredentials {\n const llmProvider =\n readConfigEnvKey(\"PARALLAX_LLM_PROVIDER\") || \"subscription\";\n\n if (llmProvider === \"cloud\") {\n const cloudKey = readConfigCloudKey(\"apiKey\");\n if (!cloudKey) {\n throw new Error(\n \"Eliza Cloud is selected as the LLM provider but no cloud.apiKey \" +\n \"is paired. Pair your account in the Cloud settings section first.\",\n );\n }\n return {\n anthropicKey: cloudKey,\n openaiKey: cloudKey,\n // Eliza Cloud does not proxy Google/Gemini — left undefined intentionally\n googleKey: undefined,\n anthropicBaseUrl: ELIZA_CLOUD_ANTHROPIC_BASE,\n openaiBaseUrl: ELIZA_CLOUD_OPENAI_BASE,\n githubToken: runtime.getSetting(\"GITHUB_TOKEN\") as string | undefined,\n };\n }\n\n return {\n anthropicKey: runtime.getSetting(\"ANTHROPIC_API_KEY\") as\n | string\n | undefined,\n openaiKey: runtime.getSetting(\"OPENAI_API_KEY\") as string | undefined,\n googleKey: runtime.getSetting(\"GOOGLE_GENERATIVE_AI_API_KEY\") as\n | string\n | undefined,\n githubToken: runtime.getSetting(\"GITHUB_TOKEN\") as string | undefined,\n anthropicBaseUrl: runtime.getSetting(\"ANTHROPIC_BASE_URL\") as\n | string\n | undefined,\n openaiBaseUrl: runtime.getSetting(\"OPENAI_BASE_URL\") as\n | string\n | undefined,\n };\n}\n\n/**\n * Sanitize a label into a safe directory name.\n * Strips non-alphanumeric chars (keeps hyphens), lowercases, truncates to 60 chars.\n */\nfunction sanitizeDirName(label: string): string {\n return label\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-{2,}/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 60) || \"scratch\";\n}\n\n/**\n * Find a non-colliding directory path by appending -2, -3, etc. if needed.\n */\nfunction resolveNonColliding(baseDir: string, name: string): string {\n let candidate = path.join(baseDir, name);\n if (!fs.existsSync(candidate)) return candidate;\n for (let i = 2; i < 100; i++) {\n candidate = path.join(baseDir, `${name}-${i}`);\n if (!fs.existsSync(candidate)) return candidate;\n }\n // Fallback to uuid to guarantee uniqueness\n return path.join(baseDir, `${name}-${randomUUID().slice(0, 8)}`);\n}\n\n/**\n * Create a scratch sandbox directory for non-repo tasks.\n *\n * When `PARALLAX_CODING_DIRECTORY` is set (e.g. `~/Projects`), creates a\n * named subdir like `~/Projects/todo-app/` derived from the task label.\n * Otherwise falls back to `~/.milady/workspaces/{uuid}`.\n */\nexport function createScratchDir(\n runtime?: IAgentRuntime,\n label?: string,\n): string {\n // Check for user-configured coding directory.\n // Try runtime settings → config file env → process.env (in priority order).\n // Config file is checked directly because runtime.getSetting() doesn't read\n // the config env section, and process.env is only set at boot time.\n const codingDir =\n (runtime?.getSetting(\"PARALLAX_CODING_DIRECTORY\") as string) ??\n readConfigEnvKey(\"PARALLAX_CODING_DIRECTORY\") ??\n process.env.PARALLAX_CODING_DIRECTORY;\n\n if (codingDir?.trim()) {\n const resolved = codingDir.startsWith(\"~\")\n ? path.join(os.homedir(), codingDir.slice(1))\n : path.resolve(codingDir);\n const dirName = label ? sanitizeDirName(label) : `scratch-${randomUUID().slice(0, 8)}`;\n const scratchDir = resolveNonColliding(resolved, dirName);\n fs.mkdirSync(scratchDir, { recursive: true });\n return scratchDir;\n }\n\n // Default: ephemeral UUID-based dir\n const baseDir = path.join(os.homedir(), \".milady\", \"workspaces\");\n const scratchId = randomUUID();\n const scratchDir = path.join(baseDir, scratchId);\n fs.mkdirSync(scratchDir, { recursive: true });\n return scratchDir;\n}\n\n/**\n * Generate a short semantic label from repo URL and/or task description.\n * e.g. \"git-workspace-service-testbed/hello-mima\" or \"scratch/react-research\"\n */\nexport function generateLabel(\n repo: string | undefined,\n task: string | undefined,\n): string {\n const parts: string[] = [];\n\n if (repo) {\n // Extract repo name from URL: \"https://github.com/owner/my-repo.git\" -> \"my-repo\"\n const match = repo.match(/\\/([^/]+?)(?:\\.git)?$/);\n parts.push(match ? match[1] : \"repo\");\n } else {\n parts.push(\"scratch\");\n }\n\n if (task) {\n // Extract a slug from the first few meaningful words of the task\n const slug = task\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .split(/\\s+/)\n .filter(\n (w) =>\n w.length > 2 &&\n ![\"the\", \"and\", \"for\", \"with\", \"that\", \"this\", \"from\"].includes(w),\n )\n .slice(0, 3)\n .join(\"-\");\n if (slug) parts.push(slug);\n }\n\n return parts.join(\"/\");\n}\n\n/**\n * Register lifecycle event handlers for a spawned session.\n *\n * When `coordinatorActive` is true the SwarmCoordinator owns chat messaging\n * and session lifecycle for blocked / task_complete / error events.\n * This listener still handles scratch-dir cleanup regardless.\n */\nexport function registerSessionEvents(\n ptyService: PTYService,\n runtime: IAgentRuntime,\n sessionId: string,\n label: string,\n scratchDir: string | null,\n callback?: HandlerCallback,\n coordinatorActive = false,\n): void {\n let scratchRegistered = false;\n ptyService.onSessionEvent((sid, event, data) => {\n if (sid !== sessionId) return;\n\n // When coordinator is active it handles chat + lifecycle for these events\n if (!coordinatorActive) {\n if (event === \"blocked\" && callback) {\n callback({\n text: `Agent \"${label}\" is waiting for input: ${(data as { prompt?: string }).prompt ?? \"unknown prompt\"}`,\n });\n }\n if (event === \"task_complete\") {\n if (callback) {\n const response = (data as { response?: string }).response ?? \"\";\n const preview =\n response.length > 500 ? `${response.slice(0, 500)}...` : response;\n callback({\n text: preview\n ? `Agent \"${label}\" completed the task.\\n\\n${preview}`\n : `Agent \"${label}\" completed the task.`,\n });\n }\n // Force-kill the session after task completion — nothing to save.\n ptyService.stopSession(sessionId, /* force */ true).catch((err) => {\n logger.warn(\n `[START_CODING_TASK] Failed to stop session for \"${label}\" after task complete: ${err}`,\n );\n });\n }\n if (event === \"error\" && callback) {\n callback({\n text: `Agent \"${label}\" encountered an error: ${(data as { message?: string }).message ?? \"unknown error\"}`,\n });\n }\n }\n\n // Scratch lifecycle: register terminal scratch workspaces for retention\n // policy handling (ephemeral / pending_decision / persistent).\n if (\n (event === \"stopped\" || event === \"task_complete\" || event === \"error\") &&\n scratchDir &&\n !scratchRegistered\n ) {\n logger.info(\n `[scratch-lifecycle] Terminal event \"${event}\" for \"${label}\" — registering scratch workspace at ${scratchDir}`,\n );\n const wsService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n if (!wsService) {\n logger.warn(\n `[scratch-lifecycle] CODING_WORKSPACE_SERVICE not found — cannot register scratch workspace`,\n );\n // Leave scratchRegistered false so a later event can retry\n } else {\n wsService\n .registerScratchWorkspace(sessionId, scratchDir, label, event)\n .then(() => {\n scratchRegistered = true;\n })\n .catch((err) => {\n logger.warn(\n `[START_CODING_TASK] Failed to register scratch workspace for \"${label}\": ${err}`,\n );\n // Leave scratchRegistered false so a later event can retry\n });\n }\n }\n });\n}\n",
|
|
65
|
-
"/**\n * CREATE_TASK action - Unified action to set up and launch task agents.\n *\n * Combines workspace provisioning and agent spawning into a single atomic action.\n * - If a repo URL is provided, clones it into a fresh workspace\n * - If no repo, creates a scratch sandbox directory\n * - Spawns the specified task agent(s) in that workspace with the given task\n * - Supports multi-agent mode via pipe-delimited `agents` param\n *\n * This eliminates the need for multi-action chaining (PROVISION_WORKSPACE -> SPAWN_AGENT)\n * and ensures agents always run in an isolated directory.\n *\n * @module actions/start-coding-task\n */\n\nimport {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport type { AgentCredentials } from \"coding-agent-adapters\";\nimport type { PTYService } from \"../services/pty-service.js\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport { requireTaskAgentAccess } from \"../services/task-policy.js\";\nimport { normalizeAgentType } from \"../services/pty-types.js\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\nimport {\n type CodingTaskContext,\n handleMultiAgent,\n} from \"./coding-task-handlers.js\";\nimport { buildAgentCredentials } from \"./coding-task-helpers.js\";\n\nexport const startCodingTaskAction: Action = {\n name: \"CREATE_TASK\",\n\n similes: [\n \"START_CODING_TASK\",\n \"LAUNCH_CODING_TASK\",\n \"RUN_CODING_TASK\",\n \"START_AGENT_TASK\",\n \"SPAWN_AND_PROVISION\",\n \"CODE_THIS\",\n \"LAUNCH_TASK\",\n \"CREATE_SUBTASK\",\n ],\n\n description:\n \"Create one or more asynchronous task agents for any open-ended multi-step job. \" +\n \"These task agents can code, debug, research, write, analyze, plan, document, and automate while the main agent stays free to keep talking with the user. \" +\n \"If a repo URL is provided, a workspace is provisioned automatically; if no repo is provided, the task agent runs in a safe scratch directory. \" +\n \"Use this whenever the work is more involved than a simple direct reply. \" +\n \"IMPORTANT: If the user references a repository from conversation history (e.g. 'in the same repo', \" +\n \"'on that project', 'add a feature to it'), you MUST include the repo URL in the `repo` parameter. \" +\n \"If the task involves code changes to a real project but you don't know the repo URL, ASK the user for it \" +\n \"before calling this action — do not default to a scratch directory for real project work.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Take a deep pass on https://github.com/acme/my-app: debug the auth failure, fix it, run the tests, and summarize what changed.\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll create a background task agent for that repo and keep track of its progress.\",\n action: \"CREATE_TASK\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Spin up a couple of sub-agents to research current browser automation frameworks, compare them, and draft a recommendation.\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll coordinate parallel task agents for that and keep the results organized.\",\n action: \"CREATE_TASK\",\n },\n },\n ],\n ],\n\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n ): Promise<boolean> => {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n return ptyService != null;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const access = await requireTaskAgentAccess(runtime, message, \"create\");\n if (!access.allowed) {\n if (callback) {\n await callback({\n text: access.reason,\n });\n }\n return { success: false, error: \"FORBIDDEN\", text: access.reason };\n }\n\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n if (callback) {\n await callback({\n text: \"PTY Service is not available. Cannot create the task.\",\n });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n const wsService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n\n // Extract parameters\n const params = options?.parameters;\n const content = message.content as Record<string, unknown>;\n\n const explicitRawType =\n (params?.agentType as string) ?? (content.agentType as string);\n const rawAgentType =\n explicitRawType ?? (await ptyService.resolveAgentType());\n const defaultAgentType = normalizeAgentType(rawAgentType);\n const memoryContent =\n (params?.memoryContent as string) ?? (content.memoryContent as string);\n const approvalPreset =\n (params?.approvalPreset as string) ?? (content.approvalPreset as string);\n\n // Repo is optional -- extract from params, content, or text\n let repo = (params?.repo as string) ?? (content.repo as string);\n if (!repo && content.text) {\n const urlMatch = (content.text as string).match(\n /https?:\\/\\/(?:github\\.com|gitlab\\.com|bitbucket\\.org)\\/[\\w.-]+\\/[\\w.-]+(?:\\.git)?/i,\n );\n if (urlMatch) {\n repo = urlMatch[0];\n }\n }\n\n // Fallback chain: coordinator memory → disk history → workspace service.\n // Only use these fallbacks when the request implies working on an existing\n // project (e.g. \"in the same repo\", \"continue\", \"fix this\") rather than a\n // fresh scratch task. The reuseRepo flag or same-project language triggers it.\n const reuseRepo =\n (params?.reuseRepo as boolean) ??\n (content.reuseRepo as boolean) ??\n // Implicit intent: task text references an existing context\n /\\b(same\\s+repo|same\\s+project|continue|that\\s+repo|the\\s+repo|this\\s+repo|in\\s+the\\s+repo)\\b/i.test(\n (content.text as string) ?? \"\",\n );\n\n if (!repo && reuseRepo) {\n const coordinator = getCoordinator(runtime);\n const lastRepo = await coordinator?.getLastUsedRepoAsync();\n if (lastRepo) {\n repo = lastRepo;\n }\n }\n if (!repo && reuseRepo) {\n const wsService = runtime.getService(\"CODING_WORKSPACE_SERVICE\") as\n unknown as CodingWorkspaceService | undefined;\n if (wsService && typeof wsService.listWorkspaces === \"function\") {\n const withRepo = wsService\n .listWorkspaces()\n .find((ws) => ws.repo);\n if (withRepo) {\n repo = withRepo.repo;\n }\n }\n }\n\n // Build credentials (shared across all agents)\n const customCredentialKeys = runtime.getSetting(\"CUSTOM_CREDENTIAL_KEYS\") as\n | string\n | undefined;\n let customCredentials: Record<string, string> | undefined;\n if (customCredentialKeys) {\n customCredentials = {};\n for (const key of customCredentialKeys.split(\",\").map((k) => k.trim())) {\n const val = runtime.getSetting(key) as string | undefined;\n if (val) customCredentials[key] = val;\n }\n }\n\n let credentials: AgentCredentials;\n try {\n credentials = buildAgentCredentials(runtime);\n } catch (err) {\n const msg =\n err instanceof Error ? err.message : \"Failed to build credentials\";\n logger.error(`[start-coding-task] ${msg}`);\n if (callback) {\n await callback({ text: msg });\n }\n return { success: false, error: \"INVALID_CREDENTIALS\" };\n }\n\n const explicitLabel =\n (params?.label as string) ?? (content.label as string);\n\n // Build shared context for handlers\n const ctx: CodingTaskContext = {\n runtime,\n ptyService,\n wsService,\n credentials,\n customCredentials,\n callback,\n message,\n state,\n repo,\n defaultAgentType,\n rawAgentType,\n agentSelectionStrategy: ptyService.agentSelectionStrategy,\n memoryContent,\n approvalPreset,\n explicitLabel,\n };\n\n // --- Dispatch: build a pipe-delimited agents string for handleMultiAgent ---\n const agentsParam =\n (params?.agents as string) ?? (content.agents as string);\n\n if (agentsParam) {\n return handleMultiAgent(ctx, agentsParam);\n }\n\n // Single-agent mode: build a single-element agents string so we can\n // reuse handleMultiAgent (which handles length-1 specs fine).\n // Fall back to the user's message text when params extraction fails —\n // the user's request IS the task (e.g. \"build me a todo app\").\n const task = (params?.task as string) ?? (content.task as string);\n const userText = (content.text as string)?.trim() || \"\";\n const singleAgentSpec = task || userText;\n return handleMultiAgent(ctx, singleAgentSpec);\n },\n\n parameters: [\n {\n name: \"repo\",\n description:\n \"Git repository URL to clone (e.g. https://github.com/owner/repo). \" +\n \"ALWAYS provide this when the user is working on a real project or references a repo from context. \" +\n \"Only omit for pure research/scratch tasks with no target repository. \" +\n \"If unsure which repo, ask the user before spawning.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"agentType\",\n description:\n \"Specific task-agent framework to use. Options: claude, codex, gemini, aider, pi, shell. \" +\n \"If omitted, the orchestrator picks the current preferred framework automatically.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"task\",\n description:\n \"The open-ended task or prompt to send once the task agent is ready. Used for single-agent mode.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"agents\",\n description:\n \"Pipe-delimited list of task-agent assignments for multi-agent mode. Each segment is a task description. \" +\n \"Optionally prefix with an agent type: 'claude:Fix auth | gemini:Write tests | codex:Update docs'. \" +\n \"Each task agent gets its own workspace clone. If provided, the 'task' parameter is ignored.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"memoryContent\",\n description:\n \"Instructions or shared context to write to each task agent's memory file before spawning.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"label\",\n description:\n \"Short semantic label for this workspace. In multi-agent mode, each agent gets '{label}-1', '{label}-2', etc. \" +\n \"Auto-generated from repo/task if not provided.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"approvalPreset\",\n description:\n \"Permission level for all task agents: readonly, standard, permissive, autonomous.\",\n required: false,\n schema: {\n type: \"string\" as const,\n enum: [\"readonly\", \"standard\", \"permissive\", \"autonomous\"],\n },\n },\n ],\n};\n\nexport const createTaskAction = startCodingTaskAction;\n",
|
|
66
|
-
"/**\n * Handler logic for the START_CODING_TASK action.\n *\n * handleMultiAgent() handles both multi-agent and single-agent modes.\n * A single-agent call is just a length-1 agent spec.\n *\n * @module actions/coding-task-handlers\n */\n\nimport {\n type ActionResult,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport type { AgentCredentials, ApprovalPreset } from \"coding-agent-adapters\";\nimport type { PTYService } from \"../services/pty-service.js\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport {\n type CodingAgentType,\n isPiAgentType,\n normalizeAgentType,\n type SessionInfo,\n toPiCommand,\n} from \"../services/pty-types.js\";\nimport { readConfigEnvKey } from \"../services/config-env.js\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\nimport type { AgentSelectionStrategy } from \"../services/agent-selection.js\";\nimport { withTrajectoryContext } from \"../services/trajectory-context.js\";\nimport {\n formatPastExperience,\n queryPastExperience,\n} from \"../services/trajectory-feedback.js\";\nimport {\n createScratchDir,\n generateLabel,\n registerSessionEvents,\n} from \"./coding-task-helpers.js\";\n\n/** Maximum number of agents that can be spawned in a single multi-agent call */\nconst MAX_CONCURRENT_AGENTS = 8;\n\n/** Known agent type prefixes used in \"agentType:task\" spec format. */\nconst KNOWN_AGENT_PREFIXES = [\n \"claude\", \"claude-code\", \"claudecode\", \"codex\", \"openai\",\n \"gemini\", \"google\", \"aider\", \"pi\", \"pi-ai\", \"piai\",\n \"pi-coding-agent\", \"picodingagent\", \"shell\", \"bash\",\n] as const;\n\n/**\n * Strip an agent-type prefix from a spec string (e.g. \"claude:Fix the bug\" → \"Fix the bug\").\n * Returns the original string if no known prefix is found.\n */\nfunction stripAgentPrefix(spec: string): string {\n const colonIdx = spec.indexOf(\":\");\n if (colonIdx <= 0 || colonIdx >= 20) return spec;\n const prefix = spec.slice(0, colonIdx).trim().toLowerCase();\n if ((KNOWN_AGENT_PREFIXES as readonly string[]).includes(prefix)) {\n return spec.slice(colonIdx + 1).trim();\n }\n return spec;\n}\n\n/**\n * Build CLAUDE.md instructions that tell a swarm agent how to coordinate.\n * Each agent gets awareness of its role within the swarm and instructions\n * to surface design decisions explicitly so the orchestrator can share them.\n */\nfunction buildSwarmMemoryInstructions(\n agentLabel: string,\n agentTask: string,\n allSubtasks: string[],\n agentIndex: number,\n): string {\n const siblingTasks = allSubtasks\n .filter((_, i) => i !== agentIndex)\n .map((t, i) => ` ${i + 1}. ${t}`)\n .join(\"\\n\");\n\n return (\n `# Swarm Coordination\\n\\n` +\n `You are agent \"${agentLabel}\" in a multi-agent swarm of ${allSubtasks.length} agents.\\n` +\n `Your task: ${agentTask}\\n\\n` +\n `Other agents are working on:\\n${siblingTasks}\\n\\n` +\n `## Coordination Rules\\n\\n` +\n `- **Follow the Shared Context exactly.** The planning brief above contains ` +\n `concrete decisions (names, file paths, APIs, conventions). Use them as-is.\\n` +\n `- **Surface design decisions.** If you need to make a creative or architectural ` +\n `choice not covered by the Shared Context (naming something, choosing a library, ` +\n `designing an interface, picking an approach), state your decision clearly in your ` +\n `output so the orchestrator can share it with sibling agents. Write it as:\\n` +\n ` \"DECISION: [brief description of what you decided and why]\"\\n` +\n `- **Don't contradict sibling work.** If the orchestrator tells you about decisions ` +\n `other agents have made, align with them.\\n` +\n `- **Ask when uncertain.** If your task depends on another agent's output and you ` +\n `don't have enough context, ask rather than guessing.\\n`\n );\n}\n\n/**\n * Generate a shared context brief for a swarm of agents.\n * The LLM produces shared guidance (style, conventions, constraints) from\n * the user's request and subtask list. Task-type agnostic — works for coding,\n * research, writing, or any multi-agent workflow.\n */\nasync function generateSwarmContext(\n runtime: IAgentRuntime,\n subtasks: string[],\n userRequest: string,\n): Promise<string> {\n const taskList = subtasks\n .map((t, i) => ` ${i + 1}. ${t}`)\n .join(\"\\n\");\n\n const prompt =\n `You are an AI orchestrator about to launch ${subtasks.length} parallel agents. ` +\n `Before they start, produce a brief shared context document so all agents stay aligned.\\n\\n` +\n `User's request: \"${userRequest}\"\\n\\n` +\n `Subtasks being assigned:\\n${taskList}\\n\\n` +\n `Generate a concise shared context brief (3-10 bullet points) covering:\\n` +\n `- Project intent and overall goal\\n` +\n `- Key constraints or preferences from the user's request\\n` +\n `- Conventions all agents should follow (naming, style, patterns, tone)\\n` +\n `- How subtasks relate to each other (dependencies, shared interfaces, etc.)\\n` +\n `- Any decisions that should be consistent across all agents\\n\\n` +\n `CRITICAL — Concrete Decisions:\\n` +\n `If any subtask involves creative choices (naming a feature, choosing an approach, ` +\n `designing an API, picking a concept), YOU must make those decisions NOW in this brief. ` +\n `Do NOT leave creative choices to individual agents — they run in parallel and will ` +\n `each make different choices, causing inconsistency.\\n` +\n `For example: if one agent builds a feature and another writes tests for it, ` +\n `decide the feature name, file paths, function signatures, and key design choices here ` +\n `so both agents use the same names and structure.\\n\\n` +\n `Only include what's relevant — skip categories that don't apply. ` +\n `Be specific and actionable, not generic. Be as detailed as the task requires — ` +\n `a trivial task needs a few bullets, a complex task deserves a thorough roadmap.\\n\\n` +\n `Output ONLY the bullet points, no preamble.`;\n\n try {\n // Disable streaming so planning output doesn't pipe to the user's chat.\n // The action handler runs inside a streaming context; without stream:false,\n // the planning LLM response would be forwarded as chat text.\n const result = await withTrajectoryContext(\n runtime,\n { source: \"orchestrator\", decisionType: \"swarm-context-generation\" },\n () =>\n runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n temperature: 0.3,\n stream: false,\n }),\n );\n return result?.trim() || \"\";\n } catch (err) {\n logger.warn(`Swarm context generation failed: ${err}`);\n return \"\";\n }\n}\n\n/** Shared context passed to both multi-agent and single-agent handlers */\nexport interface CodingTaskContext {\n runtime: IAgentRuntime;\n ptyService: PTYService;\n wsService: CodingWorkspaceService | undefined;\n credentials: AgentCredentials;\n customCredentials: Record<string, string> | undefined;\n callback: HandlerCallback | undefined;\n message: Memory;\n state: State | undefined;\n repo: string | undefined;\n defaultAgentType: CodingAgentType;\n rawAgentType: string;\n agentSelectionStrategy: AgentSelectionStrategy;\n memoryContent: string | undefined;\n approvalPreset: string | undefined;\n explicitLabel: string | undefined;\n}\n\n/**\n * Multi-agent mode handler.\n *\n * Parses pipe-delimited agent specs and spawns each agent in its own\n * workspace clone (or scratch directory).\n */\nexport async function handleMultiAgent(\n ctx: CodingTaskContext,\n agentsParam: string,\n): Promise<ActionResult | undefined> {\n const {\n runtime,\n ptyService,\n wsService,\n credentials,\n customCredentials,\n callback,\n message,\n state,\n repo,\n defaultAgentType,\n rawAgentType,\n memoryContent,\n approvalPreset,\n explicitLabel,\n } = ctx;\n\n // Parse pipe-delimited agent specs: \"task1 | task2 | agentType:task3\"\n // A single empty string means \"spawn one agent with no initial task\".\n const agentSpecs = agentsParam\n .split(\"|\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n // If nothing parsed (e.g. empty string), treat as one agent with no task\n if (agentSpecs.length === 0) {\n agentSpecs.push(\"\");\n }\n\n // Cap multi-agent count to the concurrency limit\n if (agentSpecs.length > MAX_CONCURRENT_AGENTS) {\n if (callback) {\n await callback({\n text: `Too many agents requested (${agentSpecs.length}). Maximum is ${MAX_CONCURRENT_AGENTS}.`,\n });\n }\n return { success: false, error: \"TOO_MANY_AGENTS\" };\n }\n\n if (repo && !wsService) {\n if (callback) {\n await callback({\n text: \"Workspace Service is not available. Cannot clone repository.\",\n });\n }\n return { success: false, error: \"WORKSPACE_SERVICE_UNAVAILABLE\" };\n }\n\n if (callback) {\n await callback({\n text: `Launching ${agentSpecs.length} agents${repo ? ` on ${repo}` : \"\"}...`,\n });\n }\n\n // Planning phase: generate shared context brief for multi-agent coordination.\n // Strip agent-type prefixes from specs to get clean subtask descriptions.\n const cleanSubtasks = agentSpecs.map(stripAgentPrefix);\n const userRequest = (message.content as { text?: string })?.text ?? agentsParam;\n const swarmContext = agentSpecs.length > 1\n ? await generateSwarmContext(runtime, cleanSubtasks, userRequest)\n : \"\";\n\n // Store swarm context on coordinator for use in decision prompts\n if (swarmContext) {\n const coordinator = getCoordinator(runtime);\n coordinator?.setSwarmContext(swarmContext);\n }\n\n // Query past orchestrator experience for trajectory feedback injection.\n // This feeds lessons from previous agent sessions back into new agents,\n // preventing repeated mistakes and maintaining consistency with past decisions.\n const pastExperience = await queryPastExperience(runtime, {\n taskDescription: userRequest,\n lookbackHours: 48,\n maxEntries: 8,\n repo,\n });\n const pastExperienceBlock = formatPastExperience(pastExperience);\n\n const results: Array<{\n sessionId: string;\n agentType: string;\n workdir: string;\n workspaceId?: string;\n branch?: string;\n label: string;\n status: string;\n error?: string;\n }> = [];\n\n // Read LLM provider once before the spawn loop to avoid repeated sync I/O\n // and ensure consistent provider selection across all agents in this swarm.\n const llmProvider =\n readConfigEnvKey(\"PARALLAX_LLM_PROVIDER\") || \"subscription\";\n\n const coordinator = getCoordinator(runtime);\n const threadTitle = explicitLabel || generateLabel(repo, userRequest);\n const taskThread = coordinator\n ? await coordinator.createTaskThread({\n title: threadTitle,\n originalRequest: userRequest,\n kind: \"coding\",\n roomId: message.roomId,\n worldId: message.worldId,\n ownerUserId:\n ((message as unknown as Record<string, unknown>).userId as\n | string\n | undefined) ?? message.entityId,\n currentPlan:\n swarmContext && cleanSubtasks.length > 1\n ? {\n sharedContext: swarmContext,\n subtasks: cleanSubtasks,\n }\n : { subtasks: cleanSubtasks },\n metadata: {\n repo: repo ?? null,\n messageId: message.id,\n requestedAgents: agentSpecs.length,\n },\n })\n : null;\n\n for (const [i, spec] of agentSpecs.entries()) {\n // Parse optional \"agentType:task\" prefix.\n // In fixed mode, ignore LLM-chosen prefixes — all agents use the\n // configured default. Only ranked mode allows per-subtask overrides.\n let specAgentType = defaultAgentType;\n let specPiRequested = isPiAgentType(rawAgentType);\n let specRequestedType = rawAgentType;\n let specTask = spec;\n const colonIdx = spec.indexOf(\":\");\n if (\n ctx.agentSelectionStrategy !== \"fixed\" &&\n colonIdx > 0 &&\n colonIdx < 20\n ) {\n const prefix = spec.slice(0, colonIdx).trim().toLowerCase();\n if ((KNOWN_AGENT_PREFIXES as readonly string[]).includes(prefix)) {\n specRequestedType = prefix;\n specPiRequested = isPiAgentType(prefix);\n specAgentType = normalizeAgentType(prefix);\n specTask = spec.slice(colonIdx + 1).trim();\n }\n } else if (ctx.agentSelectionStrategy === \"fixed\" && colonIdx > 0 && colonIdx < 20) {\n // Strip the prefix from the task text but keep the default agent type\n specTask = stripAgentPrefix(spec);\n }\n\n // Generate label for this specific agent\n const specLabel = explicitLabel\n ? `${explicitLabel}-${i + 1}`\n : generateLabel(repo, specTask);\n\n try {\n // Provision workspace (each agent gets its own clone or scratch dir)\n let workdir: string;\n let workspaceId: string | undefined;\n let branch: string | undefined;\n\n if (repo && wsService) {\n const workspace = await wsService.provisionWorkspace({ repo });\n workdir = workspace.path;\n workspaceId = workspace.id;\n branch = workspace.branch;\n wsService.setLabel(workspace.id, specLabel);\n } else {\n workdir = createScratchDir(runtime, specLabel);\n }\n\n // Preflight check\n if (specAgentType !== \"shell\" && specAgentType !== \"pi\") {\n const [preflight] = await ptyService.checkAvailableAgents([\n specAgentType as Exclude<CodingAgentType, \"shell\" | \"pi\">,\n ]);\n if (preflight && !preflight.installed) {\n results.push({\n sessionId: \"\",\n agentType: specAgentType,\n workdir,\n label: specLabel,\n status: \"failed\",\n error: `${preflight.adapter} CLI is not installed`,\n });\n continue;\n }\n }\n\n // Check if coordinator is active — route blocking prompts through it\n // Spawn the agent — prepend shared context brief if available\n const taskWithContext = swarmContext\n ? `${specTask}\\n\\n--- Shared Context (from project planning) ---\\n${swarmContext}\\n--- End Shared Context ---`\n : specTask;\n const initialTask = specPiRequested ? toPiCommand(taskWithContext) : taskWithContext;\n const displayType = specPiRequested ? \"pi\" : specAgentType;\n\n // Append swarm coordination instructions to agent memory so the agent\n // knows to surface design decisions explicitly for the orchestrator.\n const swarmMemory = agentSpecs.length > 1 && swarmContext\n ? buildSwarmMemoryInstructions(specLabel, specTask, cleanSubtasks, i)\n : undefined;\n const agentMemory = [memoryContent, swarmMemory, pastExperienceBlock]\n .filter(Boolean)\n .join(\"\\n\\n\") || undefined;\n\n const session: SessionInfo = await ptyService.spawnSession({\n name: `coding-${Date.now()}-${i}`,\n agentType: specAgentType,\n workdir,\n initialTask,\n memoryContent: agentMemory,\n credentials,\n approvalPreset:\n (approvalPreset as ApprovalPreset | undefined) ??\n ptyService.defaultApprovalPreset,\n customCredentials,\n ...(coordinator && llmProvider === \"subscription\"\n ? { skipAdapterAutoResponse: true }\n : {}),\n metadata: {\n threadId: taskThread?.id,\n requestedType: specRequestedType,\n messageId: message.id,\n userId: (message as unknown as Record<string, unknown>).userId,\n workspaceId,\n label: specLabel,\n multiAgentIndex: i,\n },\n });\n\n // Register event handler\n const isScratch = !repo;\n const scratchDir = isScratch ? workdir : null;\n registerSessionEvents(\n ptyService,\n runtime,\n session.id,\n specLabel,\n scratchDir,\n callback,\n !!coordinator,\n );\n if (coordinator && specTask) {\n await coordinator.registerTask(session.id, {\n threadId: taskThread?.id ?? session.id,\n agentType: specAgentType,\n label: specLabel,\n originalTask: specTask,\n workdir,\n repo,\n });\n }\n\n results.push({\n sessionId: session.id,\n agentType: displayType,\n workdir,\n workspaceId,\n branch,\n label: specLabel,\n status: session.status,\n });\n\n if (callback) {\n await callback({\n text: `[${i + 1}/${agentSpecs.length}] Spawned ${displayType} agent as \"${specLabel}\"`,\n });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger.error(\n `[START_CODING_TASK] Failed to spawn agent ${i + 1}:`,\n errorMessage,\n );\n results.push({\n sessionId: \"\",\n agentType: specAgentType,\n workdir: \"\",\n label: specLabel,\n status: \"failed\",\n error: errorMessage,\n });\n }\n }\n\n // Store all sessions in state\n if (state) {\n state.codingSessions = results.filter((r) => r.sessionId);\n }\n\n const succeeded = results.filter((r) => r.sessionId);\n const failed = results.filter((r) => !r.sessionId);\n const summary = [\n `Launched ${succeeded.length}/${agentSpecs.length} agents${repo ? ` on ${repo}` : \"\"}:`,\n ...succeeded.map(\n (r) => ` - \"${r.label}\" (${r.agentType}) [session: ${r.sessionId}]`,\n ),\n ...(failed.length > 0\n ? [`Failed: ${failed.map((r) => `\"${r.label}\": ${r.error}`).join(\", \")}`]\n : []),\n ].join(\"\\n\");\n\n if (callback) {\n await callback({ text: summary });\n }\n\n return {\n success: failed.length === 0,\n text: summary,\n data: { agents: results },\n };\n}\n",
|
|
69
|
+
"import type { Memory } from \"@elizaos/core\";\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction readString(\n source: Record<string, unknown> | null,\n ...keys: string[]\n): string | undefined {\n if (!source) return undefined;\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n }\n return undefined;\n}\n\nexport function extractEvalRunMetadata(\n value: Memory | Record<string, unknown> | null | undefined,\n): {\n scenarioId?: string;\n batchId?: string;\n} {\n const record =\n value && \"content\" in value\n ? asRecord((value as Memory).content)\n : asRecord(value);\n const contentMetadata = asRecord(record?.metadata);\n const nestedSources = [\n asRecord(contentMetadata?.eval),\n asRecord(contentMetadata?.evaluation),\n asRecord(contentMetadata?.scenario),\n ];\n\n const scenarioId =\n readString(record, \"scenarioId\", \"scenario_id\") ??\n readString(contentMetadata, \"scenarioId\", \"scenario_id\") ??\n nestedSources\n .map((source) => readString(source, \"scenarioId\", \"scenario_id\"))\n .find(Boolean);\n const batchId =\n readString(record, \"batchId\", \"batch_id\") ??\n readString(contentMetadata, \"batchId\", \"batch_id\") ??\n nestedSources\n .map((source) => readString(source, \"batchId\", \"batch_id\"))\n .find(Boolean);\n\n return { scenarioId, batchId };\n}\n\nexport function mergeTaskThreadEvalMetadata(\n message: Memory | null | undefined,\n metadata: Record<string, unknown> | undefined,\n): {\n scenarioId?: string;\n batchId?: string;\n metadata: Record<string, unknown>;\n} {\n const merged = {\n ...(metadata ?? {}),\n };\n const { scenarioId, batchId } = extractEvalRunMetadata(message);\n\n if (scenarioId) {\n merged.scenarioId = scenarioId;\n }\n if (batchId) {\n merged.batchId = batchId;\n }\n\n return {\n scenarioId,\n batchId,\n metadata: merged,\n };\n}\n",
|
|
70
|
+
"/**\n * SEND_TO_AGENT action - Send input to a running task agent.\n *\n * Allows sending text or commands to an active PTY session.\n * Useful for responding to prompts, providing feedback, or giving new instructions.\n *\n * @module actions/send-to-agent\n */\n\nimport type {\n Action,\n ActionResult,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { getCoordinator, type PTYService } from \"../services/pty-service.js\";\nimport { requireTaskAgentAccess } from \"../services/task-policy.js\";\nimport { normalizeAgentType } from \"../services/pty-types.js\";\nimport { mergeTaskThreadEvalMetadata } from \"./eval-metadata.js\";\n\nexport const sendToAgentAction: Action = {\n name: \"SEND_TO_AGENT\",\n\n similes: [\n \"SEND_TO_CODING_AGENT\",\n \"MESSAGE_CODING_AGENT\",\n \"INPUT_TO_AGENT\",\n \"RESPOND_TO_AGENT\",\n \"TELL_CODING_AGENT\",\n \"MESSAGE_AGENT\",\n \"TELL_TASK_AGENT\",\n ],\n\n description:\n \"Send text input or key presses to a running task-agent session. \" +\n \"Use this to respond to agent prompts, provide feedback, continue a task, or assign a fresh tracked task to an existing agent.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Tell the running sub-agent to accept the changes\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll send the approval to the task agent.\",\n action: \"SEND_TO_AGENT\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Say yes to the agent prompt\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Sending confirmation to the agent.\",\n action: \"SEND_TO_AGENT\",\n },\n },\n ],\n ],\n\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n ): Promise<boolean> => {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n return false;\n }\n // Fast-fail: listSessions() does a JSON-RPC call to the Node worker which\n // can take 30s to timeout when the worker is busy. Cap at 2s so action\n // validation doesn't block the entire message pipeline.\n try {\n const sessions = await Promise.race([\n ptyService.listSessions(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"validate timeout\")), 2000),\n ),\n ]);\n return sessions.length > 0;\n } catch {\n return false;\n }\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const access = await requireTaskAgentAccess(runtime, message, \"interact\");\n if (!access.allowed) {\n if (callback) {\n await callback({\n text: access.reason,\n });\n }\n return { success: false, error: \"FORBIDDEN\", text: access.reason };\n }\n\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n if (callback) {\n await callback({\n text: \"PTY Service is not available.\",\n });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n const params = options?.parameters as Record<string, unknown> | undefined;\n const content = message.content as {\n sessionId?: string;\n input?: string;\n keys?: string;\n task?: string;\n label?: string;\n };\n\n // Get session ID from content or state\n let sessionId = (params?.sessionId as string) ?? content.sessionId;\n if (!sessionId && state?.codingSession) {\n sessionId = (state.codingSession as { id: string }).id;\n }\n\n if (!sessionId) {\n // Try to find the most recent session\n const sessions = await ptyService.listSessions();\n if (sessions.length === 0) {\n if (callback) {\n await callback({\n text: \"No active task-agent sessions. Spawn an agent first.\",\n });\n }\n return { success: false, error: \"NO_SESSION\" };\n }\n sessionId = sessions[sessions.length - 1].id;\n }\n\n const session = ptyService.getSession(sessionId);\n if (!session) {\n if (callback) {\n await callback({\n text: `Session ${sessionId} not found.`,\n });\n }\n return { success: false, error: \"SESSION_NOT_FOUND\" };\n }\n\n try {\n const keys = (params?.keys as string) ?? content.keys;\n const trackedTask = (params?.task as string) ?? content.task;\n const taskLabel = (params?.label as string) ?? content.label;\n const input = (params?.input as string) ?? content.input ?? trackedTask;\n\n if (keys) {\n // Send special key sequence\n await ptyService.sendKeysToSession(sessionId, keys);\n if (callback) {\n await callback({\n text: \"Sent key sequence to task agent.\",\n });\n }\n return {\n success: true,\n text: \"Sent key sequence\",\n data: { sessionId, keys },\n };\n } else if (input) {\n // Send text input\n await ptyService.sendToSession(sessionId, input);\n if (trackedTask) {\n const coordinator = getCoordinator(runtime);\n const existingTask = coordinator?.getTaskContext(sessionId);\n const evalMetadata = mergeTaskThreadEvalMetadata(message, {\n source: \"send-to-agent-action\",\n messageId: message.id,\n sessionId,\n });\n const taskThread =\n coordinator && !existingTask\n ? await coordinator.createTaskThread({\n title:\n taskLabel ||\n (typeof session.metadata?.label === \"string\"\n ? session.metadata.label\n : `agent-${sessionId.slice(-8)}`),\n originalRequest: trackedTask,\n roomId:\n typeof (message as unknown as Record<string, unknown>).roomId === \"string\"\n ? ((message as unknown as Record<string, unknown>).roomId as string)\n : null,\n ownerUserId:\n typeof (message as unknown as Record<string, unknown>).userId === \"string\"\n ? ((message as unknown as Record<string, unknown>).userId as string)\n : null,\n scenarioId: evalMetadata.scenarioId,\n batchId: evalMetadata.batchId,\n metadata: evalMetadata.metadata,\n })\n : null;\n if (coordinator) {\n await coordinator.registerTask(sessionId, {\n threadId: existingTask?.threadId ?? taskThread?.id ?? sessionId,\n agentType: normalizeAgentType(session.agentType),\n label:\n taskLabel ||\n existingTask?.label ||\n (typeof session.metadata?.label === \"string\"\n ? session.metadata.label\n : `agent-${sessionId.slice(-8)}`),\n originalTask: trackedTask,\n workdir: session.workdir,\n ...(existingTask?.repo ? { repo: existingTask.repo } : {}),\n metadata:\n session.metadata &&\n typeof session.metadata === \"object\" &&\n !Array.isArray(session.metadata)\n ? (session.metadata as Record<string, unknown>)\n : undefined,\n });\n }\n }\n if (callback) {\n await callback({\n text: trackedTask\n ? `Assigned new tracked task to task agent: \"${trackedTask}\"`\n : `Sent to task agent: \"${input}\"`,\n });\n }\n return {\n success: true,\n text: trackedTask ? \"Assigned new task to agent\" : \"Sent input to agent\",\n data: { sessionId, input, ...(trackedTask ? { task: trackedTask } : {}) },\n };\n } else {\n if (callback) {\n await callback({\n text: \"No input provided. Specify 'input', 'task', or 'keys' parameter.\",\n });\n }\n return { success: false, error: \"NO_INPUT\" };\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (callback) {\n await callback({\n text: `Failed to send to agent: ${errorMessage}`,\n });\n }\n return { success: false, error: errorMessage };\n }\n },\n\n parameters: [\n {\n name: \"sessionId\",\n description:\n \"ID of the task-agent session to send to. If not specified, uses the current session.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"input\",\n description: \"Text input to send to the running task agent.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"task\",\n description:\n \"New tracked task to assign to the existing agent. This is also sent as the next input so LIST_AGENTS and provider status reflect the new assignment.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"label\",\n description:\n \"Optional label to use when tracking a newly assigned task on an existing agent.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"keys\",\n description:\n \"Special key sequence to send (e.g., 'Enter', 'Ctrl-C', 'y').\",\n required: false,\n schema: { type: \"string\" as const },\n },\n ],\n};\n\nexport const sendToTaskAgentAction = sendToAgentAction;\n",
|
|
71
|
+
"/**\n * SPAWN_AGENT action - Spawns a CLI task agent.\n *\n * Creates a new PTY session for a task agent (Claude Code, Codex, etc.)\n * and returns a session ID for subsequent interactions.\n *\n * @module actions/spawn-agent\n */\n\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport type { AgentCredentials, ApprovalPreset } from \"coding-agent-adapters\";\nimport type { PTYService } from \"../services/pty-service.js\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport {\n type CodingAgentType,\n isPiAgentType,\n normalizeAgentType,\n type SessionInfo,\n toPiCommand,\n} from \"../services/pty-types.js\";\nimport { readConfigEnvKey } from \"../services/config-env.js\";\nimport { buildAgentCredentials } from \"../services/agent-credentials.js\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\nimport { mergeTaskThreadEvalMetadata } from \"./eval-metadata.js\";\n\nexport const spawnAgentAction: Action = {\n name: \"SPAWN_AGENT\",\n\n similes: [\n \"SPAWN_CODING_AGENT\",\n \"START_CODING_AGENT\",\n \"LAUNCH_CODING_AGENT\",\n \"CREATE_CODING_AGENT\",\n \"SPAWN_CODER\",\n \"RUN_CODING_AGENT\",\n \"SPAWN_SUB_AGENT\",\n \"START_TASK_AGENT\",\n \"CREATE_AGENT\",\n ],\n\n description:\n \"Spawn a specific task agent inside an existing workspace when you need direct control. \" +\n \"These agents are intentionally open-ended and can handle investigation, writing, planning, testing, synthesis, repo work, and general async task execution. \" +\n \"Returns a session ID that can be used to interact with the agent.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Start a Codex task agent in that workspace and have it continue the investigation.\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll spawn a task agent in the current workspace and hand it the next chunk of work.\",\n action: \"SPAWN_AGENT\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Spin up a task agent for the follow-up work in this repo.\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll create a task-agent session for that.\",\n action: \"SPAWN_AGENT\",\n },\n },\n ],\n ],\n\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n ): Promise<boolean> => {\n // Check if PTYService is available\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n logger.warn(\"[SPAWN_AGENT] PTYService not available\");\n return false;\n }\n return true;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n if (callback) {\n await callback({\n text: \"PTY Service is not available. Cannot spawn a task agent.\",\n });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n // Extract parameters from options or message content\n const params = options?.parameters;\n const content = message.content as Record<string, unknown>;\n\n const explicitRawType =\n (params?.agentType as string) ?? (content.agentType as string);\n const rawAgentType =\n explicitRawType ?? (await ptyService.resolveAgentType());\n const agentType = normalizeAgentType(rawAgentType);\n const task = (params?.task as string) ?? (content.task as string);\n const piRequested = isPiAgentType(rawAgentType);\n const initialTask = piRequested ? toPiCommand(task) : task;\n\n // Resolve workdir: explicit param > state from PROVISION_WORKSPACE > most recent workspace > cwd\n let workdir = (params?.workdir as string) ?? (content.workdir as string);\n if (!workdir && state?.codingWorkspace) {\n workdir = (state.codingWorkspace as { path: string }).path;\n }\n if (!workdir) {\n // Check workspace service for most recently provisioned workspace\n const wsService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n if (wsService) {\n const workspaces = wsService.listWorkspaces();\n if (workspaces.length > 0) {\n workdir = workspaces[workspaces.length - 1].path;\n }\n }\n }\n if (!workdir) {\n if (callback) {\n await callback({\n text: \"No workspace found. Please provision a workspace first using PROVISION_WORKSPACE or provide a workdir.\",\n });\n }\n return { success: false, error: \"NO_WORKSPACE\" };\n }\n\n // Validate workdir is within allowed directories\n const resolvedWorkdir = path.resolve(workdir);\n const workspaceBaseDir = path.join(os.homedir(), \".milady\", \"workspaces\");\n const allowedPrefixes = [\n path.resolve(workspaceBaseDir),\n path.resolve(process.cwd()),\n ];\n const isAllowed = allowedPrefixes.some(\n (prefix) =>\n resolvedWorkdir.startsWith(prefix + path.sep) ||\n resolvedWorkdir === prefix,\n );\n if (!isAllowed) {\n if (callback) {\n await callback({\n text: \"The specified workdir is outside of allowed directories. Please use a workspace directory.\",\n });\n }\n return { success: false, error: \"WORKDIR_OUTSIDE_ALLOWED\" };\n }\n workdir = resolvedWorkdir;\n\n const memoryContent =\n (params?.memoryContent as string) ?? (content.memoryContent as string);\n const approvalPreset =\n (params?.approvalPreset as string) ?? (content.approvalPreset as string);\n\n // Custom credentials for MCP servers and other integrations\n const customCredentialKeys = runtime.getSetting(\"CUSTOM_CREDENTIAL_KEYS\") as\n | string\n | undefined;\n let customCredentials: Record<string, string> | undefined;\n if (customCredentialKeys) {\n customCredentials = {};\n for (const key of customCredentialKeys.split(\",\").map((k) => k.trim())) {\n const val = runtime.getSetting(key) as string | undefined;\n if (val) customCredentials[key] = val;\n }\n }\n\n // Build credentials based on the user's configured LLM provider.\n // Throws if cloud mode is selected but no cloud API key is paired.\n const llmProvider =\n readConfigEnvKey(\"PARALLAX_LLM_PROVIDER\") || \"subscription\";\n let credentials: AgentCredentials;\n try {\n credentials = buildAgentCredentials(runtime);\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Failed to build credentials\";\n logger.error(`[spawn-agent] ${msg}`);\n if (callback) {\n await callback({ text: msg });\n }\n return { success: false, error: \"INVALID_CREDENTIALS\" };\n }\n\n try {\n // Check if the agent CLI is installed (for non-shell agents)\n if (agentType !== \"shell\" && agentType !== \"pi\") {\n const [preflight] = await ptyService.checkAvailableAgents([\n agentType as Exclude<CodingAgentType, \"shell\" | \"pi\">,\n ]);\n if (preflight && !preflight.installed) {\n if (callback) {\n await callback({\n text:\n `${preflight.adapter} CLI is not installed.\\n` +\n `Install with: ${preflight.installCommand}\\n` +\n `Docs: ${preflight.docsUrl}`,\n });\n }\n return { success: false, error: \"AGENT_NOT_INSTALLED\" };\n }\n }\n\n // Check if coordinator is active — route blocking prompts through it\n const coordinator = getCoordinator(runtime);\n const evalMetadata = mergeTaskThreadEvalMetadata(message, {\n source: \"spawn-agent-action\",\n messageId: message.id,\n requestedType: rawAgentType,\n });\n const taskThread =\n coordinator && task\n ? await coordinator.createTaskThread({\n title: `agent-${Date.now()}`,\n originalRequest: task,\n roomId:\n typeof (message as unknown as Record<string, unknown>).roomId === \"string\"\n ? ((message as unknown as Record<string, unknown>).roomId as string)\n : null,\n ownerUserId:\n typeof (message as unknown as Record<string, unknown>).userId === \"string\"\n ? ((message as unknown as Record<string, unknown>).userId as string)\n : null,\n scenarioId: evalMetadata.scenarioId,\n batchId: evalMetadata.batchId,\n metadata: evalMetadata.metadata,\n })\n : null;\n\n // Spawn the PTY session\n const session: SessionInfo = await ptyService.spawnSession({\n name: `task-${Date.now()}`,\n agentType,\n workdir,\n initialTask,\n memoryContent,\n credentials,\n approvalPreset:\n (approvalPreset as ApprovalPreset | undefined) ??\n ptyService.defaultApprovalPreset,\n customCredentials,\n // Let adapter auto-response handle startup prompts (API key, trust, etc.)\n // when using cloud/API key mode — the LLM coordinator misinterprets these.\n // In subscription mode, the coordinator handles all prompts.\n ...(coordinator && llmProvider === \"subscription\"\n ? { skipAdapterAutoResponse: true }\n : {}),\n metadata: {\n threadId: taskThread?.id,\n requestedType: rawAgentType,\n messageId: message.id,\n userId: (message as unknown as Record<string, unknown>).userId,\n },\n });\n\n // Register event handler for this session\n ptyService.onSessionEvent((sessionId, event, data) => {\n if (sessionId !== session.id) return;\n\n // Log session events for debugging\n logger.debug(\n `[Session ${sessionId}] ${event}: ${JSON.stringify(data)}`,\n );\n\n // When coordinator is active it owns chat messaging for these events\n if (!coordinator) {\n // Handle blocked state - agent is waiting for input\n if (event === \"blocked\" && callback) {\n callback({\n text: `Task agent is waiting for input: ${(data as { prompt?: string }).prompt ?? \"unknown prompt\"}`,\n });\n }\n\n // Handle completion\n if (event === \"completed\" && callback) {\n callback({\n text: \"Task agent completed the task.\",\n });\n }\n\n // Handle errors\n if (event === \"error\" && callback) {\n callback({\n text: `Task agent encountered an error: ${(data as { message?: string }).message ?? \"unknown error\"}`,\n });\n }\n }\n });\n if (coordinator && task) {\n await coordinator.registerTask(session.id, {\n threadId: taskThread?.id ?? session.id,\n agentType,\n label: `agent-${session.id.slice(-8)}`,\n originalTask: task,\n workdir,\n });\n }\n\n // Store session info in state for subsequent actions\n\n if (state) {\n state.codingSession = {\n id: session.id,\n agentType: session.agentType,\n workdir: session.workdir,\n status: session.status,\n };\n }\n\n if (callback) {\n await callback({\n text: `Started ${piRequested ? \"pi\" : agentType} task agent in ${workdir}${task ? ` with task: \"${task}\"` : \"\"}. Session ID: ${session.id}`,\n });\n }\n\n return {\n success: true,\n text: `Started ${piRequested ? \"pi\" : agentType} task agent`,\n data: {\n sessionId: session.id,\n agentType: piRequested ? \"pi\" : session.agentType,\n workdir: session.workdir,\n status: session.status,\n },\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger.error(\"[SPAWN_AGENT] Failed to spawn agent:\", errorMessage);\n\n if (callback) {\n await callback({\n text: `Failed to spawn task agent: ${errorMessage}`,\n });\n }\n\n return { success: false, error: errorMessage };\n }\n },\n\n parameters: [\n {\n name: \"agentType\",\n description:\n \"Specific task-agent framework to spawn. Options: claude (Claude Code), codex (OpenAI Codex), gemini (Google Gemini), aider, pi, shell (generic shell). \" +\n \"If omitted, the orchestrator picks the preferred available framework.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"workdir\",\n description:\n \"Working directory for the agent. Defaults to current directory.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"task\",\n description: \"Open-ended task or prompt to send to the task agent once spawned.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"memoryContent\",\n description:\n \"Instructions or shared context to write to the task agent's memory file before spawning.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"approvalPreset\",\n description:\n \"Permission level for the task agent: readonly (safe audit), standard (reads+web auto, writes prompt), permissive (file ops auto, shell prompts), autonomous (all auto, use with sandbox)\",\n required: false,\n schema: {\n type: \"string\" as const,\n enum: [\"readonly\", \"standard\", \"permissive\", \"autonomous\"],\n },\n },\n ],\n};\n\nexport const spawnTaskAgentAction = spawnAgentAction;\n",
|
|
72
|
+
"/**\n * CREATE_TASK action - Unified action to set up and launch task agents.\n *\n * Combines workspace provisioning and agent spawning into a single atomic action.\n * - If a repo URL is provided, clones it into a fresh workspace\n * - If no repo, creates a scratch sandbox directory\n * - Spawns the specified task agent(s) in that workspace with the given task\n * - Supports multi-agent mode via pipe-delimited `agents` param\n *\n * This eliminates the need for multi-action chaining (PROVISION_WORKSPACE -> SPAWN_AGENT)\n * and ensures agents always run in an isolated directory.\n *\n * @module actions/start-coding-task\n */\n\nimport {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport type { AgentCredentials } from \"coding-agent-adapters\";\nimport { buildAgentCredentials } from \"../services/agent-credentials.js\";\nimport type { PTYService } from \"../services/pty-service.js\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport { normalizeAgentType } from \"../services/pty-types.js\";\nimport { requireTaskAgentAccess } from \"../services/task-policy.js\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\nimport {\n type CodingTaskContext,\n handleMultiAgent,\n} from \"./coding-task-handlers.js\";\n\ntype BackgroundAction = Action & {\n suppressPostActionContinuation?: boolean;\n};\n\nexport const startCodingTaskAction: BackgroundAction = {\n name: \"CREATE_TASK\",\n\n similes: [\n \"START_CODING_TASK\",\n \"LAUNCH_CODING_TASK\",\n \"RUN_CODING_TASK\",\n \"START_AGENT_TASK\",\n \"SPAWN_AND_PROVISION\",\n \"CODE_THIS\",\n \"LAUNCH_TASK\",\n \"CREATE_SUBTASK\",\n ],\n\n description:\n \"Create one or more asynchronous task agents for any open-ended multi-step job. \" +\n \"These task agents can code, debug, research, write, analyze, plan, document, and automate while the main agent stays free to keep talking with the user. \" +\n \"If a repo URL is provided, a workspace is provisioned automatically; if no repo is provided, the task agent runs in a safe scratch directory. \" +\n \"Use this whenever the work is more involved than a simple direct reply. \" +\n \"IMPORTANT: If the user references a repository from conversation history (e.g. 'in the same repo', \" +\n \"'on that project', 'add a feature to it'), you MUST include the repo URL in the `repo` parameter. \" +\n \"If the task involves code changes to a real project but you don't know the repo URL, ASK the user for it \" +\n \"before calling this action — do not default to a scratch directory for real project work.\",\n\n suppressPostActionContinuation: true,\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Take a deep pass on https://github.com/acme/my-app: debug the auth failure, fix it, run the tests, and summarize what changed.\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll create a background task agent for that repo and keep track of its progress.\",\n action: \"CREATE_TASK\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Spin up a couple of sub-agents to research current browser automation frameworks, compare them, and draft a recommendation.\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll coordinate parallel task agents for that and keep the results organized.\",\n action: \"CREATE_TASK\",\n },\n },\n ],\n ],\n\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n ): Promise<boolean> => {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n return ptyService != null;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const access = await requireTaskAgentAccess(runtime, message, \"create\");\n if (!access.allowed) {\n if (callback) {\n await callback({\n text: access.reason,\n });\n }\n return { success: false, error: \"FORBIDDEN\", text: access.reason };\n }\n\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n if (callback) {\n await callback({\n text: \"PTY Service is not available. Cannot create the task.\",\n });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n const wsService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n\n // Extract parameters\n const params = options?.parameters;\n const content = message.content as Record<string, unknown>;\n\n const explicitRawType =\n (params?.agentType as string) ?? (content.agentType as string);\n const rawAgentType =\n explicitRawType ?? (await ptyService.resolveAgentType());\n const defaultAgentType = normalizeAgentType(rawAgentType);\n const memoryContent =\n (params?.memoryContent as string) ?? (content.memoryContent as string);\n const approvalPreset =\n (params?.approvalPreset as string) ?? (content.approvalPreset as string);\n\n // Repo is optional -- extract from params, content, or text\n let repo = (params?.repo as string) ?? (content.repo as string);\n if (!repo && content.text) {\n const urlMatch = (content.text as string).match(\n /https?:\\/\\/(?:github\\.com|gitlab\\.com|bitbucket\\.org)\\/[\\w.-]+\\/[\\w.-]+(?:\\.git)?/i,\n );\n if (urlMatch) {\n repo = urlMatch[0];\n }\n }\n\n // Fallback chain: coordinator memory → disk history → workspace service.\n // Only use these fallbacks when the request implies working on an existing\n // project (e.g. \"in the same repo\", \"continue\", \"fix this\") rather than a\n // fresh scratch task. The reuseRepo flag or same-project language triggers it.\n const reuseRepo =\n (params?.reuseRepo as boolean) ??\n (content.reuseRepo as boolean) ??\n // Implicit intent: task text references an existing context\n /\\b(same\\s+repo|same\\s+project|continue|that\\s+repo|the\\s+repo|this\\s+repo|in\\s+the\\s+repo)\\b/i.test(\n (content.text as string) ?? \"\",\n );\n\n if (!repo && reuseRepo) {\n const coordinator = getCoordinator(runtime);\n const lastRepo = await coordinator?.getLastUsedRepoAsync();\n if (lastRepo) {\n repo = lastRepo;\n }\n }\n if (!repo && reuseRepo) {\n const wsService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n if (wsService && typeof wsService.listWorkspaces === \"function\") {\n const withRepo = wsService.listWorkspaces().find((ws) => ws.repo);\n if (withRepo) {\n repo = withRepo.repo;\n }\n }\n }\n\n // Build credentials (shared across all agents)\n const customCredentialKeys = runtime.getSetting(\"CUSTOM_CREDENTIAL_KEYS\") as\n | string\n | undefined;\n let customCredentials: Record<string, string> | undefined;\n if (customCredentialKeys) {\n customCredentials = {};\n for (const key of customCredentialKeys.split(\",\").map((k) => k.trim())) {\n const val = runtime.getSetting(key) as string | undefined;\n if (val) customCredentials[key] = val;\n }\n }\n\n let credentials: AgentCredentials;\n try {\n credentials = buildAgentCredentials(runtime);\n } catch (err) {\n const msg =\n err instanceof Error ? err.message : \"Failed to build credentials\";\n logger.error(`[start-coding-task] ${msg}`);\n if (callback) {\n await callback({ text: msg });\n }\n return { success: false, error: \"INVALID_CREDENTIALS\" };\n }\n\n const explicitLabel =\n (params?.label as string) ?? (content.label as string);\n\n // Build shared context for handlers\n const ctx: CodingTaskContext = {\n runtime,\n ptyService,\n wsService,\n credentials,\n customCredentials,\n callback,\n message,\n state,\n repo,\n defaultAgentType,\n rawAgentType,\n agentSelectionStrategy: ptyService.agentSelectionStrategy,\n memoryContent,\n approvalPreset,\n explicitLabel,\n };\n\n // --- Dispatch: build a pipe-delimited agents string for handleMultiAgent ---\n const agentsParam =\n (params?.agents as string) ?? (content.agents as string);\n\n if (agentsParam) {\n return handleMultiAgent(ctx, agentsParam);\n }\n\n // Single-agent mode: build a single-element agents string so we can\n // reuse handleMultiAgent (which handles length-1 specs fine).\n // Fall back to the user's message text when params extraction fails —\n // the user's request IS the task (e.g. \"build me a todo app\").\n const task = (params?.task as string) ?? (content.task as string);\n const userText = (content.text as string)?.trim() || \"\";\n const singleAgentSpec = task || userText;\n return handleMultiAgent(ctx, singleAgentSpec);\n },\n\n parameters: [\n {\n name: \"repo\",\n description:\n \"Git repository URL to clone (e.g. https://github.com/owner/repo). \" +\n \"ALWAYS provide this when the user is working on a real project or references a repo from context. \" +\n \"Only omit for pure research/scratch tasks with no target repository. \" +\n \"If unsure which repo, ask the user before spawning.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"agentType\",\n description:\n \"Specific task-agent framework to use. Options: claude, codex, gemini, aider, pi, shell. \" +\n \"If omitted, the orchestrator picks the current preferred framework automatically.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"task\",\n description:\n \"The open-ended task or prompt to send once the task agent is ready. Used for single-agent mode.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"agents\",\n description:\n \"Pipe-delimited list of task-agent assignments for multi-agent mode. Each segment is a task description. \" +\n \"Optionally prefix with an agent type: 'claude:Fix auth | gemini:Write tests | codex:Update docs'. \" +\n \"Each task agent gets its own workspace clone. If provided, the 'task' parameter is ignored.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"memoryContent\",\n description:\n \"Instructions or shared context to write to each task agent's memory file before spawning.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"label\",\n description:\n \"Short semantic label for this workspace. In multi-agent mode, each agent gets '{label}-1', '{label}-2', etc. \" +\n \"Auto-generated from repo/task if not provided.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"approvalPreset\",\n description:\n \"Permission level for all task agents: readonly, standard, permissive, autonomous.\",\n required: false,\n schema: {\n type: \"string\" as const,\n enum: [\"readonly\", \"standard\", \"permissive\", \"autonomous\"],\n },\n },\n ],\n};\n\nexport const createTaskAction = startCodingTaskAction;\n",
|
|
73
|
+
"/**\n * Handler logic for the START_CODING_TASK action.\n *\n * handleMultiAgent() handles both multi-agent and single-agent modes.\n * A single-agent call is just a length-1 agent spec.\n *\n * @module actions/coding-task-handlers\n */\n\nimport {\n type ActionResult,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport type { AgentCredentials, ApprovalPreset } from \"coding-agent-adapters\";\nimport type { AgentSelectionStrategy } from \"../services/agent-selection.js\";\nimport { readConfigEnvKey } from \"../services/config-env.js\";\nimport type { PTYService } from \"../services/pty-service.js\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport {\n type CodingAgentType,\n isPiAgentType,\n normalizeAgentType,\n type SessionInfo,\n toPiCommand,\n} from \"../services/pty-types.js\";\nimport { withTrajectoryContext } from \"../services/trajectory-context.js\";\nimport {\n formatPastExperience,\n queryPastExperience,\n} from \"../services/trajectory-feedback.js\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\nimport {\n createScratchDir,\n generateLabel,\n registerSessionEvents,\n} from \"./coding-task-helpers.js\";\nimport { mergeTaskThreadEvalMetadata } from \"./eval-metadata.js\";\n\n/** Maximum number of agents that can be spawned in a single multi-agent call */\nconst MAX_CONCURRENT_AGENTS = 8;\n\n/** Known agent type prefixes used in \"agentType:task\" spec format. */\nconst KNOWN_AGENT_PREFIXES = [\n \"claude\",\n \"claude-code\",\n \"claudecode\",\n \"codex\",\n \"openai\",\n \"gemini\",\n \"google\",\n \"aider\",\n \"pi\",\n \"pi-ai\",\n \"piai\",\n \"pi-coding-agent\",\n \"picodingagent\",\n \"shell\",\n \"bash\",\n] as const;\n\n/**\n * Strip an agent-type prefix from a spec string (e.g. \"claude:Fix the bug\" → \"Fix the bug\").\n * Returns the original string if no known prefix is found.\n */\nfunction stripAgentPrefix(spec: string): string {\n const colonIdx = spec.indexOf(\":\");\n if (colonIdx <= 0 || colonIdx >= 20) return spec;\n const prefix = spec.slice(0, colonIdx).trim().toLowerCase();\n if ((KNOWN_AGENT_PREFIXES as readonly string[]).includes(prefix)) {\n return spec.slice(colonIdx + 1).trim();\n }\n return spec;\n}\n\n/**\n * Build CLAUDE.md instructions that tell a swarm agent how to coordinate.\n * Each agent gets awareness of its role within the swarm and instructions\n * to surface design decisions explicitly so the orchestrator can share them.\n */\nfunction buildSwarmMemoryInstructions(\n agentLabel: string,\n agentTask: string,\n allSubtasks: string[],\n agentIndex: number,\n): string {\n const siblingTasks = allSubtasks\n .filter((_, i) => i !== agentIndex)\n .map((t, i) => ` ${i + 1}. ${t}`)\n .join(\"\\n\");\n\n return (\n `# Swarm Coordination\\n\\n` +\n `You are agent \"${agentLabel}\" in a multi-agent swarm of ${allSubtasks.length} agents.\\n` +\n `Your task: ${agentTask}\\n\\n` +\n `Other agents are working on:\\n${siblingTasks}\\n\\n` +\n `## Coordination Rules\\n\\n` +\n `- **Follow the Shared Context exactly.** The planning brief above contains ` +\n `concrete decisions (names, file paths, APIs, conventions). Use them as-is.\\n` +\n `- **Surface design decisions.** If you need to make a creative or architectural ` +\n `choice not covered by the Shared Context (naming something, choosing a library, ` +\n `designing an interface, picking an approach), state your decision clearly in your ` +\n `output so the orchestrator can share it with sibling agents. Write it as:\\n` +\n ` \"DECISION: [brief description of what you decided and why]\"\\n` +\n `- **Don't contradict sibling work.** If the orchestrator tells you about decisions ` +\n `other agents have made, align with them.\\n` +\n `- **Ask when uncertain.** If your task depends on another agent's output and you ` +\n `don't have enough context, ask rather than guessing.\\n`\n );\n}\n\n/**\n * Generate a shared context brief for a swarm of agents.\n * The LLM produces shared guidance (style, conventions, constraints) from\n * the user's request and subtask list. Task-type agnostic — works for coding,\n * research, writing, or any multi-agent workflow.\n */\nasync function generateSwarmContext(\n runtime: IAgentRuntime,\n subtasks: string[],\n userRequest: string,\n): Promise<string> {\n const taskList = subtasks.map((t, i) => ` ${i + 1}. ${t}`).join(\"\\n\");\n\n const prompt =\n `You are an AI orchestrator about to launch ${subtasks.length} parallel agents. ` +\n `Before they start, produce a brief shared context document so all agents stay aligned.\\n\\n` +\n `User's request: \"${userRequest}\"\\n\\n` +\n `Subtasks being assigned:\\n${taskList}\\n\\n` +\n `Generate a concise shared context brief (3-10 bullet points) covering:\\n` +\n `- Project intent and overall goal\\n` +\n `- Key constraints or preferences from the user's request\\n` +\n `- Conventions all agents should follow (naming, style, patterns, tone)\\n` +\n `- How subtasks relate to each other (dependencies, shared interfaces, etc.)\\n` +\n `- Any decisions that should be consistent across all agents\\n\\n` +\n `CRITICAL — Concrete Decisions:\\n` +\n `If any subtask involves creative choices (naming a feature, choosing an approach, ` +\n `designing an API, picking a concept), YOU must make those decisions NOW in this brief. ` +\n `Do NOT leave creative choices to individual agents — they run in parallel and will ` +\n `each make different choices, causing inconsistency.\\n` +\n `For example: if one agent builds a feature and another writes tests for it, ` +\n `decide the feature name, file paths, function signatures, and key design choices here ` +\n `so both agents use the same names and structure.\\n\\n` +\n `Only include what's relevant — skip categories that don't apply. ` +\n `Be specific and actionable, not generic. Be as detailed as the task requires — ` +\n `a trivial task needs a few bullets, a complex task deserves a thorough roadmap.\\n\\n` +\n `Output ONLY the bullet points, no preamble.`;\n\n try {\n // Disable streaming so planning output doesn't pipe to the user's chat.\n // The action handler runs inside a streaming context; without stream:false,\n // the planning LLM response would be forwarded as chat text.\n const result = await withTrajectoryContext(\n runtime,\n { source: \"orchestrator\", decisionType: \"swarm-context-generation\" },\n () =>\n runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n temperature: 0.3,\n stream: false,\n }),\n );\n return result?.trim() || \"\";\n } catch (err) {\n logger.warn(`Swarm context generation failed: ${err}`);\n return \"\";\n }\n}\n\n/** Shared context passed to both multi-agent and single-agent handlers */\nexport interface CodingTaskContext {\n runtime: IAgentRuntime;\n ptyService: PTYService;\n wsService: CodingWorkspaceService | undefined;\n credentials: AgentCredentials;\n customCredentials: Record<string, string> | undefined;\n callback: HandlerCallback | undefined;\n message: Memory;\n state: State | undefined;\n repo: string | undefined;\n defaultAgentType: CodingAgentType;\n rawAgentType: string;\n agentSelectionStrategy: AgentSelectionStrategy;\n memoryContent: string | undefined;\n approvalPreset: string | undefined;\n explicitLabel: string | undefined;\n}\n\n/**\n * Multi-agent mode handler.\n *\n * Parses pipe-delimited agent specs and spawns each agent in its own\n * workspace clone (or scratch directory).\n */\nexport async function handleMultiAgent(\n ctx: CodingTaskContext,\n agentsParam: string,\n): Promise<ActionResult | undefined> {\n const {\n runtime,\n ptyService,\n wsService,\n credentials,\n customCredentials,\n callback,\n message,\n state,\n repo,\n defaultAgentType,\n rawAgentType,\n memoryContent,\n approvalPreset,\n explicitLabel,\n } = ctx;\n\n // Parse pipe-delimited agent specs: \"task1 | task2 | agentType:task3\"\n // A single empty string means \"spawn one agent with no initial task\".\n const agentSpecs = agentsParam\n .split(\"|\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n // If nothing parsed (e.g. empty string), treat as one agent with no task\n if (agentSpecs.length === 0) {\n agentSpecs.push(\"\");\n }\n\n // Cap multi-agent count to the concurrency limit\n if (agentSpecs.length > MAX_CONCURRENT_AGENTS) {\n if (callback) {\n await callback({\n text: `Too many agents requested (${agentSpecs.length}). Maximum is ${MAX_CONCURRENT_AGENTS}.`,\n });\n }\n return { success: false, error: \"TOO_MANY_AGENTS\" };\n }\n\n if (repo && !wsService) {\n if (callback) {\n await callback({\n text: \"Workspace Service is not available. Cannot clone repository.\",\n });\n }\n return { success: false, error: \"WORKSPACE_SERVICE_UNAVAILABLE\" };\n }\n\n if (callback) {\n await callback({\n text: `Launching ${agentSpecs.length} agents${repo ? ` on ${repo}` : \"\"}...`,\n });\n }\n\n // Planning phase: generate shared context brief for multi-agent coordination.\n // Strip agent-type prefixes from specs to get clean subtask descriptions.\n const cleanSubtasks = agentSpecs.map(stripAgentPrefix);\n const userRequest =\n (message.content as { text?: string })?.text ?? agentsParam;\n const swarmContext =\n agentSpecs.length > 1\n ? await generateSwarmContext(runtime, cleanSubtasks, userRequest)\n : \"\";\n\n // Store swarm context on coordinator for use in decision prompts\n if (swarmContext) {\n const coordinator = getCoordinator(runtime);\n coordinator?.setSwarmContext(swarmContext);\n }\n\n // Query past orchestrator experience for trajectory feedback injection.\n // This feeds lessons from previous agent sessions back into new agents,\n // preventing repeated mistakes and maintaining consistency with past decisions.\n const pastExperience = await queryPastExperience(runtime, {\n taskDescription: userRequest,\n lookbackHours: 48,\n maxEntries: 8,\n repo,\n });\n const pastExperienceBlock = formatPastExperience(pastExperience);\n\n const results: Array<{\n sessionId: string;\n agentType: string;\n workdir: string;\n workspaceId?: string;\n branch?: string;\n label: string;\n status: string;\n error?: string;\n }> = [];\n\n // Read LLM provider once before the spawn loop to avoid repeated sync I/O\n // and ensure consistent provider selection across all agents in this swarm.\n const llmProvider =\n readConfigEnvKey(\"PARALLAX_LLM_PROVIDER\") || \"subscription\";\n\n const coordinator = getCoordinator(runtime);\n const threadTitle = explicitLabel || generateLabel(repo, userRequest);\n const evalMetadata = mergeTaskThreadEvalMetadata(message, {\n repo: repo ?? null,\n messageId: message.id,\n requestedAgents: agentSpecs.length,\n });\n const taskThread = coordinator\n ? await coordinator.createTaskThread({\n title: threadTitle,\n originalRequest: userRequest,\n roomId: message.roomId,\n worldId: message.worldId,\n ownerUserId:\n ((message as unknown as Record<string, unknown>).userId as\n | string\n | undefined) ?? message.entityId,\n scenarioId: evalMetadata.scenarioId,\n batchId: evalMetadata.batchId,\n currentPlan:\n swarmContext && cleanSubtasks.length > 1\n ? {\n sharedContext: swarmContext,\n subtasks: cleanSubtasks,\n }\n : { subtasks: cleanSubtasks },\n metadata: evalMetadata.metadata,\n })\n : null;\n const plannedAgents = agentSpecs.map((spec, i) => {\n let specAgentType = defaultAgentType;\n let specPiRequested = isPiAgentType(rawAgentType);\n let specRequestedType = rawAgentType;\n let specTask = spec;\n const colonIdx = spec.indexOf(\":\");\n if (\n ctx.agentSelectionStrategy !== \"fixed\" &&\n colonIdx > 0 &&\n colonIdx < 20\n ) {\n const prefix = spec.slice(0, colonIdx).trim().toLowerCase();\n if ((KNOWN_AGENT_PREFIXES as readonly string[]).includes(prefix)) {\n specRequestedType = prefix;\n specPiRequested = isPiAgentType(prefix);\n specAgentType = normalizeAgentType(prefix);\n specTask = spec.slice(colonIdx + 1).trim();\n }\n } else if (\n ctx.agentSelectionStrategy === \"fixed\" &&\n colonIdx > 0 &&\n colonIdx < 20\n ) {\n specTask = stripAgentPrefix(spec);\n }\n\n const specLabel = explicitLabel\n ? `${explicitLabel}-${i + 1}`\n : generateLabel(repo, specTask);\n\n return {\n specAgentType,\n specPiRequested,\n specRequestedType,\n specTask,\n specLabel,\n };\n });\n\n const graphPlan =\n coordinator && taskThread\n ? await coordinator.planTaskThreadGraph({\n threadId: taskThread.id,\n title: threadTitle,\n originalRequest: userRequest,\n sharedContext: swarmContext || undefined,\n subtasks: plannedAgents.map((agent) => ({\n label: agent.specLabel,\n originalTask: agent.specTask,\n agentType: agent.specAgentType,\n repo,\n })),\n })\n : null;\n\n for (const [i, plannedAgent] of plannedAgents.entries()) {\n const {\n specAgentType,\n specPiRequested,\n specRequestedType,\n specTask,\n specLabel,\n } = plannedAgent;\n const taskNodeId = graphPlan?.workerNodes[i]?.id;\n\n try {\n // Provision workspace (each agent gets its own clone or scratch dir)\n let workdir: string;\n let workspaceId: string | undefined;\n let branch: string | undefined;\n\n if (repo && wsService) {\n const workspace = await wsService.provisionWorkspace({ repo });\n workdir = workspace.path;\n workspaceId = workspace.id;\n branch = workspace.branch;\n wsService.setLabel(workspace.id, specLabel);\n } else {\n workdir = createScratchDir(runtime, specLabel);\n }\n\n // Preflight check\n if (specAgentType !== \"shell\" && specAgentType !== \"pi\") {\n const [preflight] = await ptyService.checkAvailableAgents([\n specAgentType as Exclude<CodingAgentType, \"shell\" | \"pi\">,\n ]);\n if (preflight && !preflight.installed) {\n results.push({\n sessionId: \"\",\n agentType: specAgentType,\n workdir,\n label: specLabel,\n status: \"failed\",\n error: `${preflight.adapter} CLI is not installed`,\n });\n continue;\n }\n }\n\n // Check if coordinator is active — route blocking prompts through it\n // Spawn the agent — prepend shared context brief if available\n const taskWithContext = swarmContext\n ? `${specTask}\\n\\n--- Shared Context (from project planning) ---\\n${swarmContext}\\n--- End Shared Context ---`\n : specTask;\n const initialTask = specPiRequested\n ? toPiCommand(taskWithContext)\n : taskWithContext;\n const displayType = specPiRequested ? \"pi\" : specAgentType;\n\n // Append swarm coordination instructions to agent memory so the agent\n // knows to surface design decisions explicitly for the orchestrator.\n const swarmMemory =\n agentSpecs.length > 1 && swarmContext\n ? buildSwarmMemoryInstructions(specLabel, specTask, cleanSubtasks, i)\n : undefined;\n const agentMemory =\n [memoryContent, swarmMemory, pastExperienceBlock]\n .filter(Boolean)\n .join(\"\\n\\n\") || undefined;\n\n const session: SessionInfo = await ptyService.spawnSession({\n name: `coding-${Date.now()}-${i}`,\n agentType: specAgentType,\n workdir,\n initialTask,\n memoryContent: agentMemory,\n credentials,\n approvalPreset:\n (approvalPreset as ApprovalPreset | undefined) ??\n ptyService.defaultApprovalPreset,\n customCredentials,\n ...(coordinator && llmProvider === \"subscription\"\n ? { skipAdapterAutoResponse: true }\n : {}),\n metadata: {\n threadId: taskThread?.id,\n taskNodeId,\n requestedType: specRequestedType,\n messageId: message.id,\n userId: (message as unknown as Record<string, unknown>).userId,\n workspaceId,\n label: specLabel,\n multiAgentIndex: i,\n },\n });\n\n // Register event handler\n const isScratch = !repo;\n const scratchDir = isScratch ? workdir : null;\n registerSessionEvents(\n ptyService,\n runtime,\n session.id,\n specLabel,\n scratchDir,\n callback,\n !!coordinator,\n );\n if (coordinator && specTask) {\n await coordinator.registerTask(session.id, {\n threadId: taskThread?.id ?? session.id,\n taskNodeId,\n agentType: specAgentType,\n label: specLabel,\n originalTask: specTask,\n workdir,\n repo,\n metadata:\n session.metadata &&\n typeof session.metadata === \"object\" &&\n !Array.isArray(session.metadata)\n ? (session.metadata as Record<string, unknown>)\n : undefined,\n });\n }\n\n results.push({\n sessionId: session.id,\n agentType: displayType,\n workdir,\n workspaceId,\n branch,\n label: specLabel,\n status: session.status,\n });\n\n if (callback) {\n await callback({\n text: `[${i + 1}/${agentSpecs.length}] Spawned ${displayType} agent as \"${specLabel}\"`,\n });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger.error(\n `[START_CODING_TASK] Failed to spawn agent ${i + 1}:`,\n errorMessage,\n );\n results.push({\n sessionId: \"\",\n agentType: specAgentType,\n workdir: \"\",\n label: specLabel,\n status: \"failed\",\n error: errorMessage,\n });\n }\n }\n\n // Store all sessions in state\n if (state) {\n state.codingSessions = results.filter((r) => r.sessionId);\n }\n\n const succeeded = results.filter((r) => r.sessionId);\n const failed = results.filter((r) => !r.sessionId);\n const summary = [\n `Launched ${succeeded.length}/${agentSpecs.length} agents${repo ? ` on ${repo}` : \"\"}:`,\n ...succeeded.map(\n (r) => ` - \"${r.label}\" (${r.agentType}) [session: ${r.sessionId}]`,\n ),\n ...(failed.length > 0\n ? [`Failed: ${failed.map((r) => `\"${r.label}\": ${r.error}`).join(\", \")}`]\n : []),\n ].join(\"\\n\");\n\n if (callback) {\n await callback({ text: summary });\n }\n\n return {\n success: failed.length === 0,\n text: summary,\n data: { agents: results },\n };\n}\n",
|
|
67
74
|
"/**\n * Trajectory Feedback — Past Experience Injection\n *\n * Queries the trajectory database for past orchestrator decisions and\n * formats relevant experience as agent memory context. This closes the\n * loop between trajectory *output* (logging decisions) and trajectory\n * *input* (feeding experience back to agents at spawn time).\n *\n * Inspired by \"Codified Context\" (arXiv:2602.20478) — known failure\n * modes and past decisions are pre-loaded into agent context so they\n * don't repeat mistakes or re-derive solutions.\n *\n * @module services/trajectory-feedback\n */\n\nimport { type IAgentRuntime, logger as elizaLogger } from \"@elizaos/core\";\n\n/** Timeout for trajectory DB calls to prevent blocking agent spawn. */\nconst QUERY_TIMEOUT_MS = 5000;\nconst SLOW_PATH_BUDGET_MS = 15_000;\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error(`Trajectory query timed out after ${ms}ms`)), ms),\n ),\n ]);\n}\n\n// ─── Types ───\n\n/** A distilled experience entry from a past trajectory. */\ninterface PastExperience {\n /** When this experience was recorded */\n timestamp: number;\n /** The orchestrator decision type (coordination, turn-complete, etc.) */\n decisionType: string;\n /** Agent label that produced this experience */\n taskLabel: string;\n /** The key insight or decision (extracted from LLM response) */\n insight: string;\n}\n\n/** Options for querying past experience. */\nexport interface TrajectoryFeedbackOptions {\n /** Maximum number of recent trajectories to scan (default: 30) */\n maxTrajectories?: number;\n /** Maximum number of experience entries to return (default: 8) */\n maxEntries?: number;\n /** Only include trajectories from the last N hours (default: 48) */\n lookbackHours?: number;\n /** Task description for relevance filtering */\n taskDescription?: string;\n /** Repository URL — only return experience from the same repo */\n repo?: string;\n}\n\n// ─── Trajectory Logger Access ───\n\n/**\n * Resolve the trajectory logger from the runtime. Returns null if\n * trajectory logging isn't available (e.g. no database).\n */\nfunction getTrajectoryLogger(runtime: IAgentRuntime): TrajectoryLoggerRef | null {\n const runtimeAny = runtime as unknown as {\n getService?: (serviceType: string) => unknown;\n getServicesByType?: (serviceType: string) => unknown[];\n };\n\n // Try getService first (direct lookup)\n if (typeof runtimeAny.getService === \"function\") {\n const svc = runtimeAny.getService(\"trajectory_logger\");\n if (svc && typeof svc === \"object\" && hasListMethod(svc)) {\n return svc as TrajectoryLoggerRef;\n }\n }\n\n // Fallback: getServicesByType\n if (typeof runtimeAny.getServicesByType === \"function\") {\n const services = runtimeAny.getServicesByType(\"trajectory_logger\");\n if (Array.isArray(services)) {\n for (const svc of services) {\n if (svc && typeof svc === \"object\" && hasListMethod(svc)) {\n return svc as TrajectoryLoggerRef;\n }\n }\n }\n }\n\n return null;\n}\n\ntype TrajectoryLoggerRef = {\n listTrajectories: (options: {\n source?: string;\n limit?: number;\n startDate?: string;\n }) => Promise<{\n trajectories: Array<{\n id: string;\n source: string;\n startTime: number;\n llmCallCount: number;\n createdAt: string;\n metadata?: Record<string, unknown>;\n }>;\n total: number;\n }>;\n getTrajectoryDetail: (id: string) => Promise<{\n trajectoryId: string;\n metadata?: Record<string, unknown>;\n steps?: Array<{\n llmCalls?: Array<{\n purpose?: string;\n userPrompt?: string;\n response?: string;\n timestamp?: number;\n }>;\n }>;\n } | null>;\n};\n\nfunction hasListMethod(obj: object): boolean {\n const candidate = obj as Record<string, unknown>;\n return (\n typeof candidate.listTrajectories === \"function\" &&\n typeof candidate.getTrajectoryDetail === \"function\"\n );\n}\n\n// ─── Experience Extraction ───\n\n/**\n * Extract key decisions and insights from an LLM response.\n * Looks for structured decision markers and significant reasoning.\n */\nfunction extractInsights(response: string, purpose: string): string[] {\n const insights: string[] = [];\n\n // Extract explicit DECISION markers\n const decisionPattern = /DECISION:\\s*(.+?)(?:\\n|$)/gi;\n let match: RegExpExecArray | null;\n while ((match = decisionPattern.exec(response)) !== null) {\n insights.push(match[1].trim());\n }\n\n // Extract keyDecision from coordination responses\n const keyDecisionPattern = /\"keyDecision\"\\s*:\\s*\"([^\"]+)\"/g;\n while ((match = keyDecisionPattern.exec(response)) !== null) {\n insights.push(match[1].trim());\n }\n\n // For turn-complete and coordination decisions, extract the reasoning\n if (\n (purpose === \"turn-complete\" || purpose === \"coordination\") &&\n insights.length === 0\n ) {\n const reasoningPattern = /\"reasoning\"\\s*:\\s*\"([^\"]{20,200})\"/;\n const reasoningMatch = response.match(reasoningPattern);\n if (reasoningMatch) {\n insights.push(reasoningMatch[1].trim());\n }\n }\n\n return insights;\n}\n\n/**\n * Check if a past experience is potentially relevant to a new task.\n * Uses simple keyword overlap — not semantic search, but fast and\n * good enough for catching repeated patterns.\n */\nfunction isRelevant(experience: PastExperience, taskDescription: string): boolean {\n if (!taskDescription) return true; // No filter = include all\n\n const taskWords = new Set(\n taskDescription\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length > 3),\n );\n\n const insightWords = experience.insight\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length > 3);\n\n // At least 2 meaningful word overlaps\n let overlap = 0;\n for (const word of insightWords) {\n if (taskWords.has(word)) overlap++;\n if (overlap >= 2) return true;\n }\n\n return false;\n}\n\n// ─── Main Query ───\n\n/**\n * Query the trajectory database for past orchestrator decisions and\n * return distilled experience entries relevant to the current task.\n */\nexport async function queryPastExperience(\n runtime: IAgentRuntime,\n options: TrajectoryFeedbackOptions = {},\n): Promise<PastExperience[]> {\n const {\n maxTrajectories = 30,\n maxEntries = 8,\n lookbackHours = 48,\n taskDescription,\n repo,\n } = options;\n\n const logger = getTrajectoryLogger(runtime);\n if (!logger) return [];\n\n const startDate = new Date(\n Date.now() - lookbackHours * 60 * 60 * 1000,\n ).toISOString();\n\n try {\n // Fetch recent orchestrator trajectories\n const result = await withTimeout(logger.listTrajectories({\n source: \"orchestrator\",\n limit: maxTrajectories,\n startDate,\n }), QUERY_TIMEOUT_MS);\n\n if (!result.trajectories || result.trajectories.length === 0) return [];\n\n const experiences: PastExperience[] = [];\n const slowPathDeadline = Date.now() + SLOW_PATH_BUDGET_MS;\n\n // Scan each trajectory for insights. Prefer pre-extracted insights from\n // metadata (populated at write time by milaidy's trajectory-persistence)\n // to avoid loading full trajectory details with their large prompt/response\n // payloads. Fall back to getTrajectoryDetail for older trajectories that\n // predate the metadata insight extraction.\n const maxScans = Math.min(result.trajectories.length, maxTrajectories);\n for (let scanIdx = 0; scanIdx < maxScans; scanIdx++) {\n const summary = result.trajectories[scanIdx];\n\n const metadata = summary.metadata as\n | {\n orchestrator?: {\n decisionType?: string;\n taskLabel?: string;\n repo?: string;\n };\n insights?: unknown;\n }\n | undefined;\n const metadataInsights = Array.isArray(metadata?.insights)\n ? metadata.insights\n .filter(\n (value): value is string =>\n typeof value === \"string\" && value.trim().length > 0,\n )\n .slice(0, 50)\n : [];\n const decisionType =\n metadata?.orchestrator?.decisionType ?? \"unknown\";\n const taskLabel = metadata?.orchestrator?.taskLabel ?? \"\";\n const trajectoryRepo = metadata?.orchestrator?.repo;\n\n // Filter by repo: if a repo is specified, only include trajectories\n // from the same repo. This ensures agents working on repo A don't get\n // decisions made for repo B.\n if (repo && (!trajectoryRepo || trajectoryRepo !== repo)) continue;\n\n // Fast path: use pre-extracted insights from metadata (no full detail load)\n if (metadataInsights.length > 0) {\n elizaLogger.debug(\n `[trajectory-feedback] Fast path: ${metadataInsights.length} insight(s) from metadata for ${summary.id}`,\n );\n for (const insight of metadataInsights) {\n experiences.push({\n timestamp: summary.startTime,\n decisionType,\n taskLabel,\n insight,\n });\n }\n continue;\n }\n\n // Slow path (fallback): load full detail for pre-extraction trajectories\n if (Date.now() > slowPathDeadline) {\n elizaLogger.debug(\n `[trajectory-feedback] Slow path budget exhausted; stopping detail loads`,\n );\n break;\n }\n elizaLogger.debug(\n `[trajectory-feedback] Slow path: loading full detail for ${summary.id} (no metadata insights)`,\n );\n const detail = await withTimeout(\n logger.getTrajectoryDetail(summary.id),\n QUERY_TIMEOUT_MS,\n ).catch(() => null);\n if (!detail?.steps) continue;\n\n for (const step of detail.steps) {\n if (!step.llmCalls) continue;\n\n for (const call of step.llmCalls) {\n if (!call.response) continue;\n\n const insights = extractInsights(\n call.response,\n call.purpose ?? decisionType,\n );\n\n for (const insight of insights) {\n experiences.push({\n timestamp: call.timestamp ?? summary.startTime,\n decisionType: call.purpose ?? decisionType,\n taskLabel,\n insight,\n });\n }\n }\n }\n }\n\n // Filter by relevance if task description provided\n let filtered = taskDescription\n ? experiences.filter((e) => isRelevant(e, taskDescription))\n : experiences;\n\n // If relevance filtering removed everything, fall back to all experiences\n if (filtered.length === 0 && experiences.length > 0) {\n filtered = experiences;\n }\n\n // Deduplicate by insight text (keep most recent)\n const seen = new Map<string, PastExperience>();\n for (const exp of filtered) {\n const key = exp.insight.toLowerCase();\n const existing = seen.get(key);\n if (!existing || exp.timestamp > existing.timestamp) {\n seen.set(key, exp);\n }\n }\n\n // Return most recent entries, capped\n return Array.from(seen.values())\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, maxEntries);\n } catch (err) {\n // Non-critical — log and return empty\n elizaLogger.error(`[trajectory-feedback] Failed to query past experience: ${err}`);\n return [];\n }\n}\n\n// ─── Formatting ───\n\n/**\n * Format past experience entries as a markdown section suitable for\n * injection into agent memory (CLAUDE.md / GEMINI.md).\n *\n * Returns empty string if no relevant experience is found.\n */\nexport function formatPastExperience(experiences: PastExperience[]): string {\n if (experiences.length === 0) return \"\";\n\n const lines = experiences.map((e) => {\n const age = formatAge(e.timestamp);\n const label = e.taskLabel ? ` [${e.taskLabel}]` : \"\";\n return `- ${e.insight}${label} (${age})`;\n });\n\n return (\n `# Past Experience\\n\\n` +\n `The following decisions and insights were captured from recent agent sessions. ` +\n `Use them to avoid repeating mistakes and to stay consistent with established patterns.\\n\\n` +\n `${lines.join(\"\\n\")}\\n`\n );\n}\n\n/** Format a timestamp as a human-readable relative age (e.g. \"2h ago\", \"1d ago\"). */\nfunction formatAge(timestamp: number): string {\n const diffMs = Date.now() - timestamp;\n const hours = Math.floor(diffMs / (1000 * 60 * 60));\n if (hours < 1) return \"just now\";\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n",
|
|
75
|
+
"/**\n * Helper functions for the START_CODING_TASK action.\n *\n * - createScratchDir() -- Creates a scratch sandbox directory for non-repo tasks\n * - generateLabel() -- Generate a short semantic label from repo URL and/or task description\n * - registerSessionEvents() -- Register lifecycle event handlers for a spawned session\n *\n * @module actions/coding-task-helpers\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type HandlerCallback,\n logger,\n} from \"@elizaos/core\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport { readConfigEnvKey } from \"../services/config-env.js\";\nimport type { PTYService } from \"../services/pty-service.js\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\n\n/**\n * Sanitize a label into a safe directory name.\n * Strips non-alphanumeric chars (keeps hyphens), lowercases, truncates to 60 chars.\n */\nfunction sanitizeDirName(label: string): string {\n return (\n label\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-{2,}/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 60) || \"scratch\"\n );\n}\n\n/**\n * Find a non-colliding directory path by appending -2, -3, etc. if needed.\n */\nfunction resolveNonColliding(baseDir: string, name: string): string {\n let candidate = path.join(baseDir, name);\n if (!fs.existsSync(candidate)) return candidate;\n for (let i = 2; i < 100; i++) {\n candidate = path.join(baseDir, `${name}-${i}`);\n if (!fs.existsSync(candidate)) return candidate;\n }\n // Fallback to uuid to guarantee uniqueness\n return path.join(baseDir, `${name}-${randomUUID().slice(0, 8)}`);\n}\n\n/**\n * Create a scratch sandbox directory for non-repo tasks.\n *\n * When `PARALLAX_CODING_DIRECTORY` is set (e.g. `~/Projects`), creates a\n * named subdir like `~/Projects/todo-app/` derived from the task label.\n * Otherwise falls back to `~/.milady/workspaces/{uuid}`.\n */\nexport function createScratchDir(\n runtime?: IAgentRuntime,\n label?: string,\n): string {\n // Check for user-configured coding directory.\n // Try runtime settings → config file env → process.env (in priority order).\n // Config file is checked directly because runtime.getSetting() doesn't read\n // the config env section, and process.env is only set at boot time.\n const codingDir =\n (runtime?.getSetting(\"PARALLAX_CODING_DIRECTORY\") as string) ??\n readConfigEnvKey(\"PARALLAX_CODING_DIRECTORY\") ??\n process.env.PARALLAX_CODING_DIRECTORY;\n\n if (codingDir?.trim()) {\n const resolved = codingDir.startsWith(\"~\")\n ? path.join(os.homedir(), codingDir.slice(1))\n : path.resolve(codingDir);\n const dirName = label\n ? sanitizeDirName(label)\n : `scratch-${randomUUID().slice(0, 8)}`;\n const scratchDir = resolveNonColliding(resolved, dirName);\n fs.mkdirSync(scratchDir, { recursive: true });\n return scratchDir;\n }\n\n // Default: ephemeral UUID-based dir\n const baseDir = path.join(os.homedir(), \".milady\", \"workspaces\");\n const scratchId = randomUUID();\n const scratchDir = path.join(baseDir, scratchId);\n fs.mkdirSync(scratchDir, { recursive: true });\n return scratchDir;\n}\n\n/**\n * Generate a short semantic label from repo URL and/or task description.\n * e.g. \"git-workspace-service-testbed/hello-mima\" or \"scratch/react-research\"\n */\nexport function generateLabel(\n repo: string | undefined,\n task: string | undefined,\n): string {\n const parts: string[] = [];\n\n if (repo) {\n // Extract repo name from URL: \"https://github.com/owner/my-repo.git\" -> \"my-repo\"\n const match = repo.match(/\\/([^/]+?)(?:\\.git)?$/);\n parts.push(match ? match[1] : \"repo\");\n } else {\n parts.push(\"scratch\");\n }\n\n if (task) {\n // Extract a slug from the first few meaningful words of the task\n const slug = task\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .split(/\\s+/)\n .filter(\n (w) =>\n w.length > 2 &&\n ![\"the\", \"and\", \"for\", \"with\", \"that\", \"this\", \"from\"].includes(w),\n )\n .slice(0, 3)\n .join(\"-\");\n if (slug) parts.push(slug);\n }\n\n return parts.join(\"/\");\n}\n\n/**\n * Register lifecycle event handlers for a spawned session.\n *\n * When `coordinatorActive` is true the SwarmCoordinator owns chat messaging\n * and session lifecycle for blocked / task_complete / error events.\n * This listener still handles scratch-dir cleanup regardless.\n */\nexport function registerSessionEvents(\n ptyService: PTYService,\n runtime: IAgentRuntime,\n sessionId: string,\n label: string,\n scratchDir: string | null,\n callback?: HandlerCallback,\n coordinatorActive = false,\n): void {\n let scratchRegistered = false;\n ptyService.onSessionEvent((sid, event, data) => {\n if (sid !== sessionId) return;\n\n // When coordinator is active it handles chat + lifecycle for these events\n if (!coordinatorActive) {\n if (event === \"blocked\" && callback) {\n callback({\n text: `Agent \"${label}\" is waiting for input: ${(data as { prompt?: string }).prompt ?? \"unknown prompt\"}`,\n });\n }\n if (event === \"task_complete\") {\n if (callback) {\n const response = (data as { response?: string }).response ?? \"\";\n const preview =\n response.length > 500 ? `${response.slice(0, 500)}...` : response;\n callback({\n text: preview\n ? `Agent \"${label}\" completed the task.\\n\\n${preview}`\n : `Agent \"${label}\" completed the task.`,\n });\n }\n // Force-kill the session after task completion — nothing to save.\n ptyService.stopSession(sessionId, /* force */ true).catch((err) => {\n logger.warn(\n `[START_CODING_TASK] Failed to stop session for \"${label}\" after task complete: ${err}`,\n );\n });\n }\n if (event === \"error\" && callback) {\n callback({\n text: `Agent \"${label}\" encountered an error: ${(data as { message?: string }).message ?? \"unknown error\"}`,\n });\n }\n }\n\n // Scratch lifecycle: register terminal scratch workspaces for retention\n // policy handling (ephemeral / pending_decision / persistent).\n if (\n (event === \"stopped\" || event === \"task_complete\" || event === \"error\") &&\n scratchDir &&\n !scratchRegistered\n ) {\n logger.info(\n `[scratch-lifecycle] Terminal event \"${event}\" for \"${label}\" — registering scratch workspace at ${scratchDir}`,\n );\n const wsService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n if (!wsService) {\n logger.warn(\n `[scratch-lifecycle] CODING_WORKSPACE_SERVICE not found — cannot register scratch workspace`,\n );\n // Leave scratchRegistered false so a later event can retry\n } else {\n wsService\n .registerScratchWorkspace(sessionId, scratchDir, label, event)\n .then(() => {\n scratchRegistered = true;\n })\n .catch((err) => {\n logger.warn(\n `[START_CODING_TASK] Failed to register scratch workspace for \"${label}\": ${err}`,\n );\n // Leave scratchRegistered false so a later event can retry\n });\n }\n }\n });\n}\n",
|
|
68
76
|
"/**\n * STOP_AGENT action - Stop a running task-agent session.\n *\n * Terminates an active PTY session. Use when the agent is done,\n * stuck, or needs to be cancelled.\n *\n * @module actions/stop-agent\n */\n\nimport {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport type { PTYService } from \"../services/pty-service.js\";\n\nexport const stopAgentAction: Action = {\n name: \"STOP_AGENT\",\n\n similes: [\n \"STOP_CODING_AGENT\",\n \"KILL_CODING_AGENT\",\n \"TERMINATE_AGENT\",\n \"END_CODING_SESSION\",\n \"CANCEL_AGENT\",\n \"CANCEL_TASK_AGENT\",\n \"STOP_SUB_AGENT\",\n ],\n\n description:\n \"Stop a running task-agent session. \" +\n \"Terminates the PTY session and cleans up resources.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Stop the task agent\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll stop the task-agent session.\",\n action: \"STOP_AGENT\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Kill the stuck agent\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Terminating the task agent.\",\n action: \"STOP_AGENT\",\n },\n },\n ],\n ],\n\n validate: async (\n runtime: IAgentRuntime,\n _message: Memory,\n ): Promise<boolean> => {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n return false;\n }\n try {\n const sessions = await Promise.race([\n ptyService.listSessions(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"validate timeout\")), 2000),\n ),\n ]);\n return sessions.length > 0;\n } catch {\n return false;\n }\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n if (!ptyService) {\n if (callback) {\n await callback({\n text: \"PTY Service is not available.\",\n });\n }\n return { success: false, error: \"SERVICE_UNAVAILABLE\" };\n }\n\n const params = options?.parameters as Record<string, unknown> | undefined;\n const content = message.content as {\n sessionId?: string;\n all?: boolean;\n };\n\n // Stop all sessions if requested\n if ((params?.all as boolean) ?? content.all) {\n const sessions = await ptyService.listSessions();\n if (sessions.length === 0) {\n if (callback) {\n await callback({\n text: \"No active task-agent sessions to stop.\",\n });\n }\n return { success: true, text: \"No sessions to stop\" };\n }\n\n for (const session of sessions) {\n try {\n await ptyService.stopSession(session.id);\n } catch (err) {\n logger.error(`Failed to stop session ${session.id}: ${err}`);\n }\n }\n\n // Clear state\n if (state?.codingSession) {\n delete state.codingSession;\n }\n\n if (callback) {\n await callback({\n text: `Stopped ${sessions.length} task-agent session(s).`,\n });\n }\n return {\n success: true,\n text: `Stopped ${sessions.length} sessions`,\n data: { stoppedCount: sessions.length },\n };\n }\n\n // Stop specific session\n let sessionId = (params?.sessionId as string) ?? content.sessionId;\n if (!sessionId && state?.codingSession) {\n sessionId = (state.codingSession as { id: string }).id;\n }\n\n if (!sessionId) {\n const sessions = await ptyService.listSessions();\n if (sessions.length === 0) {\n if (callback) {\n await callback({\n text: \"No active task-agent sessions to stop.\",\n });\n }\n return { success: true, text: \"No sessions to stop\" };\n }\n sessionId = sessions[sessions.length - 1].id;\n }\n\n const session = ptyService.getSession(sessionId);\n if (!session) {\n if (callback) {\n await callback({\n text: `Session ${sessionId} not found.`,\n });\n }\n return { success: false, error: \"SESSION_NOT_FOUND\" };\n }\n\n try {\n await ptyService.stopSession(sessionId);\n\n // Clear state if this was the current session\n if (\n state?.codingSession &&\n (state.codingSession as { id: string }).id === sessionId\n ) {\n delete state.codingSession;\n }\n\n if (callback) {\n await callback({\n text: `Stopped task-agent session ${sessionId}.`,\n });\n }\n return {\n success: true,\n text: `Stopped session ${sessionId}`,\n data: { sessionId, agentType: session.agentType },\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (callback) {\n await callback({\n text: `Failed to stop agent: ${errorMessage}`,\n });\n }\n return { success: false, error: errorMessage };\n }\n },\n\n parameters: [\n {\n name: \"sessionId\",\n description:\n \"ID of the session to stop. If not specified, stops the current session.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"all\",\n description: \"If true, stop all active task-agent sessions.\",\n required: false,\n schema: { type: \"boolean\" as const },\n },\n ],\n};\n\nexport const stopTaskAgentAction = stopAgentAction;\n",
|
|
69
|
-
"/**\n * Provider that injects structured task-agent action examples into the prompt context.\n *\n * ElizaOS core only shows exampleCalls from its static action-docs registry,\n * which doesn't include custom plugin actions. This provider bridges the gap\n * by formatting our task-agent action examples in the same structured format\n * the model sees for core actions.\n *\n * @module providers/action-examples\n */\n\nimport type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { PTYService } from \"../services/pty-service.js\";\nimport {\n formatTaskAgentFrameworkLine,\n getTaskAgentFrameworkState,\n looksLikeTaskAgentRequest,\n TASK_AGENT_FRAMEWORK_LABELS,\n} from \"../services/task-agent-frameworks.js\";\n\nexport const codingAgentExamplesProvider: Provider = {\n name: \"CODING_AGENT_EXAMPLES\",\n description:\n \"Structured examples showing how to use open-ended task-agent actions, framework availability, and subscription-aware defaults\",\n position: -1,\n\n get: async (runtime: IAgentRuntime, message: Memory, _state: State) => {\n const userText =\n (typeof message.content === \"string\"\n ? message.content\n : message.content?.text) ?? \"\";\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n const frameworkState = await getTaskAgentFrameworkState(runtime, ptyService);\n const frameworkLines = frameworkState.frameworks.map(\n formatTaskAgentFrameworkLine,\n );\n\n const compactText = [\n \"# Task Agent Action Call Examples\",\n \"Use task agents for anything more complicated than a simple direct reply.\",\n \"They are asynchronous, open-ended workers that can code, debug, research, write, analyze, plan, document, and automate while you stay free to keep talking with the user.\",\n \"\",\n `Recommended default right now: ${TASK_AGENT_FRAMEWORK_LABELS[frameworkState.preferred.id]} (${frameworkState.preferred.reason}).`,\n ...(frameworkState.configuredSubscriptionProvider\n ? [\n `Configured Milady subscription provider: ${frameworkState.configuredSubscriptionProvider}. Prefer the matching user-backed CLI first so Milady does not waste cloud chat capacity.`,\n ]\n : []),\n \"\",\n \"Current task-agent frameworks:\",\n ...frameworkLines,\n \"\",\n \"Canonical actions:\",\n \"- CREATE_TASK: launch one or more background task agents, optionally against a repo or workspace.\",\n \"- SPAWN_AGENT: start a specific task agent in an existing workspace when you need direct control.\",\n \"- SEND_TO_AGENT: reply to a running agent or send keys to unblock it.\",\n \"- LIST_AGENTS: inspect active task agents and current task status.\",\n \"- STOP_AGENT: cancel a running task agent.\",\n \"- PROVISION_WORKSPACE / FINALIZE_WORKSPACE: manage workspaces before or after agent work when needed.\",\n ].join(\"\\n\");\n\n if (!looksLikeTaskAgentRequest(userText)) {\n return {\n data: {\n preferredTaskAgent: frameworkState.preferred.id,\n frameworks: frameworkState.frameworks,\n },\n values: { taskAgentExamples: compactText },\n text: compactText,\n };\n }\n\n const detailedText = [\n compactText,\n \"\",\n \"Examples:\",\n 'User: \"Investigate why the production login flow started returning 401s in https://github.com/acme/app and fix it.\"',\n \"Assistant:\",\n \"<actions>\",\n \" <action>REPLY</action>\",\n \" <action>CREATE_TASK</action>\",\n \"</actions>\",\n \"<params>\",\n \" <CREATE_TASK>\",\n \" <repo>https://github.com/acme/app</repo>\",\n \" <task>Investigate the production login 401s, implement the fix, run the relevant tests, and summarize the root cause.</task>\",\n \" </CREATE_TASK>\",\n \"</params>\",\n \"\",\n 'User: \"Spin up a few sub-agents to research the current browser automation options, compare them, and draft a recommendation doc.\"',\n \"Assistant:\",\n \"<actions>\",\n \" <action>REPLY</action>\",\n \" <action>CREATE_TASK</action>\",\n \"</actions>\",\n \"<params>\",\n \" <CREATE_TASK>\",\n ' <agents>Research Playwright tradeoffs and browser sandboxing. Your identifier is \"research\". | Compare Stagehand, Playwright, and browser-use for Milady. Your identifier is \"comparison\". | Draft a recommendation memo in TASK_AGENTS.md using the findings. Your identifier is \"writer\".</agents>',\n \" </CREATE_TASK>\",\n \"</params>\",\n \"\",\n 'User: \"Tell the running sub-agent to accept that prompt and continue.\"',\n \"Assistant:\",\n \"<actions>\",\n \" <action>REPLY</action>\",\n \" <action>SEND_TO_AGENT</action>\",\n \"</actions>\",\n \"<params>\",\n \" <SEND_TO_AGENT>\",\n \" <input>Yes, accept it and continue.</input>\",\n \" </SEND_TO_AGENT>\",\n \"</params>\",\n \"\",\n \"Guidance:\",\n \"- Prefer CREATE_TASK whenever the work is open-ended, multi-step, or can continue asynchronously.\",\n \"- If the task references a real repository or prior workspace, include the repo or workspace context instead of dropping the agent into scratch space.\",\n \"- Use multiple agents only when the subtasks are clearly separable and benefit from parallelism.\",\n ].join(\"\\n\");\n\n return {\n data: {\n preferredTaskAgent: frameworkState.preferred.id,\n frameworks: frameworkState.frameworks,\n },\n values: { taskAgentExamples: detailedText },\n text: detailedText,\n };\n },\n};\n\nexport const taskAgentExamplesProvider = codingAgentExamplesProvider;\n",
|
|
77
|
+
"/**\n * Provider that injects structured task-agent action examples into the prompt context.\n *\n * ElizaOS core only shows exampleCalls from its static action-docs registry,\n * which doesn't include custom plugin actions. This provider bridges the gap\n * by formatting our task-agent action examples in the same structured format\n * the model sees for core actions.\n *\n * @module providers/action-examples\n */\n\nimport type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { PTYService } from \"../services/pty-service.js\";\nimport {\n formatTaskAgentFrameworkLine,\n getTaskAgentFrameworkState,\n looksLikeTaskAgentRequest,\n TASK_AGENT_FRAMEWORK_LABELS,\n} from \"../services/task-agent-frameworks.js\";\n\nexport const codingAgentExamplesProvider: Provider = {\n name: \"CODING_AGENT_EXAMPLES\",\n description:\n \"Structured examples showing how to use open-ended task-agent actions, framework availability, and subscription-aware defaults\",\n position: -1,\n\n get: async (runtime: IAgentRuntime, message: Memory, _state: State) => {\n const userText =\n (typeof message.content === \"string\"\n ? message.content\n : message.content?.text) ?? \"\";\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n const frameworkState = await getTaskAgentFrameworkState(runtime, ptyService);\n const frameworkLines = frameworkState.frameworks.map(\n formatTaskAgentFrameworkLine,\n );\n\n const compactText = [\n \"# Task Agent Action Call Examples\",\n \"Use task agents for anything more complicated than a simple direct reply.\",\n \"They are asynchronous, open-ended workers that can code, debug, research, write, analyze, plan, document, and automate while you stay free to keep talking with the user.\",\n \"\",\n `Recommended default right now: ${TASK_AGENT_FRAMEWORK_LABELS[frameworkState.preferred.id]} (${frameworkState.preferred.reason}).`,\n ...(frameworkState.configuredSubscriptionProvider\n ? [\n `Configured Milady subscription provider: ${frameworkState.configuredSubscriptionProvider}. Prefer the matching user-backed CLI first so Milady does not waste cloud chat capacity.`,\n ]\n : []),\n \"\",\n \"Current task-agent frameworks:\",\n ...frameworkLines,\n \"\",\n \"Canonical actions:\",\n \"- CREATE_TASK: launch one or more background task agents, optionally against a repo or workspace.\",\n \"- SPAWN_AGENT: start a specific task agent in an existing workspace when you need direct control.\",\n \"- SEND_TO_AGENT: reply to a running agent or send keys to unblock it.\",\n \"- LIST_AGENTS: inspect active task agents and current task status.\",\n \"- STOP_AGENT: cancel a running task agent.\",\n \"- TASK_HISTORY: answer questions like what is running now, what happened yesterday, or what changed last week without loading raw history into context.\",\n \"- TASK_CONTROL: pause, stop, resume, continue, archive, or reopen a tracked task thread.\",\n \"- TASK_SHARE: find the best artifact, preview URL, or workspace path when the user asks to see the result.\",\n \"- PROVISION_WORKSPACE / FINALIZE_WORKSPACE: manage workspaces before or after agent work when needed.\",\n ].join(\"\\n\");\n\n if (!looksLikeTaskAgentRequest(userText)) {\n return {\n data: {\n preferredTaskAgent: frameworkState.preferred.id,\n frameworks: frameworkState.frameworks,\n },\n values: { taskAgentExamples: compactText },\n text: compactText,\n };\n }\n\n const detailedText = [\n compactText,\n \"\",\n \"Examples:\",\n 'User: \"Investigate why the production login flow started returning 401s in https://github.com/acme/app and fix it.\"',\n \"Assistant:\",\n \"<actions>\",\n \" <action>REPLY</action>\",\n \" <action>CREATE_TASK</action>\",\n \"</actions>\",\n \"<params>\",\n \" <CREATE_TASK>\",\n \" <repo>https://github.com/acme/app</repo>\",\n \" <task>Investigate the production login 401s, implement the fix, run the relevant tests, and summarize the root cause.</task>\",\n \" </CREATE_TASK>\",\n \"</params>\",\n \"\",\n 'User: \"Spin up a few sub-agents to research the current browser automation options, compare them, and draft a recommendation doc.\"',\n \"Assistant:\",\n \"<actions>\",\n \" <action>REPLY</action>\",\n \" <action>CREATE_TASK</action>\",\n \"</actions>\",\n \"<params>\",\n \" <CREATE_TASK>\",\n ' <agents>Research Playwright tradeoffs and browser sandboxing. Your identifier is \"research\". | Compare Stagehand, Playwright, and browser-use for Milady. Your identifier is \"comparison\". | Draft a recommendation memo in TASK_AGENTS.md using the findings. Your identifier is \"writer\".</agents>',\n \" </CREATE_TASK>\",\n \"</params>\",\n \"\",\n 'User: \"Tell the running sub-agent to accept that prompt and continue.\"',\n \"Assistant:\",\n \"<actions>\",\n \" <action>REPLY</action>\",\n \" <action>SEND_TO_AGENT</action>\",\n \"</actions>\",\n \"<params>\",\n \" <SEND_TO_AGENT>\",\n \" <input>Yes, accept it and continue.</input>\",\n \" </SEND_TO_AGENT>\",\n \"</params>\",\n \"\",\n 'User: \"What are you working on right now?\"',\n \"Assistant:\",\n \"<actions>\",\n \" <action>TASK_HISTORY</action>\",\n \"</actions>\",\n \"<params>\",\n \" <TASK_HISTORY>\",\n \" <metric>list</metric>\",\n \" <window>active</window>\",\n \" </TASK_HISTORY>\",\n \"</params>\",\n \"\",\n \"User: \\\"Hold on a second, can you pause that and let's discuss if it's right?\\\"\",\n \"Assistant:\",\n \"<actions>\",\n \" <action>REPLY</action>\",\n \" <action>TASK_CONTROL</action>\",\n \"</actions>\",\n \"<params>\",\n \" <TASK_CONTROL>\",\n \" <operation>pause</operation>\",\n \" </TASK_CONTROL>\",\n \"</params>\",\n \"\",\n 'User: \"Can I see it?\"',\n \"Assistant:\",\n \"<actions>\",\n \" <action>TASK_SHARE</action>\",\n \"</actions>\",\n \"<params>\",\n \" <TASK_SHARE />\",\n \"</params>\",\n \"\",\n \"Guidance:\",\n \"- Prefer CREATE_TASK whenever the work is open-ended, multi-step, or can continue asynchronously.\",\n \"- If the task references a real repository or prior workspace, include the repo or workspace context instead of dropping the agent into scratch space.\",\n \"- Use multiple agents only when the subtasks are clearly separable and benefit from parallelism.\",\n \"- Use TASK_HISTORY instead of free-form guessing when the user asks about current work, counts, yesterday, last week, or topic-scoped history.\",\n \"- Use TASK_CONTROL when the user wants to pause, stop, resume, continue, archive, or reopen a task thread.\",\n \"- Use TASK_SHARE when the user asks to see the output, pull it up, or view it remotely.\",\n ].join(\"\\n\");\n\n return {\n data: {\n preferredTaskAgent: frameworkState.preferred.id,\n frameworks: frameworkState.frameworks,\n },\n values: { taskAgentExamples: detailedText },\n text: detailedText,\n };\n },\n};\n\nexport const taskAgentExamplesProvider = codingAgentExamplesProvider;\n",
|
|
70
78
|
"/**\n * Provider that injects active workspace and task-agent context into every prompt.\n *\n * Milady needs to know what workspaces exist, which agents are running, and\n * their current status without having to call LIST_AGENTS every message. This\n * provider reads from the workspace service, PTY service, and coordinator to\n * build a live context summary that's always available in the prompt.\n *\n * @module providers/active-workspace-context\n */\n\nimport type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { PTYService } from \"../services/pty-service.js\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport type { SessionInfo } from \"../services/pty-types.js\";\nimport {\n formatTaskAgentStatus,\n getTaskAgentFrameworkState,\n TASK_AGENT_FRAMEWORK_LABELS,\n truncateTaskAgentText,\n} from \"../services/task-agent-frameworks.js\";\nimport type {\n CodingWorkspaceService,\n WorkspaceResult,\n} from \"../services/workspace-service.js\";\n\ninterface TaskLike {\n sessionId: string;\n agentType: string;\n label: string;\n originalTask: string;\n status: string;\n decisions: Array<{ reasoning?: string }>;\n completionSummary?: string;\n registeredAt: number;\n}\n\nfunction uniqueTasks(tasks: TaskLike[]): TaskLike[] {\n const seen = new Set<string>();\n const result: TaskLike[] = [];\n for (const task of tasks) {\n if (seen.has(task.sessionId)) continue;\n seen.add(task.sessionId);\n result.push(task);\n }\n return result;\n}\n\nexport const activeWorkspaceContextProvider: Provider = {\n name: \"ACTIVE_WORKSPACE_CONTEXT\",\n description:\n \"Live status of active workspaces, task-agent sessions, and current task progress\",\n position: 1,\n\n get: async (runtime: IAgentRuntime, _message: Memory, _state: State) => {\n const ptyService = runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | undefined;\n const wsService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n const coordinator = getCoordinator(runtime);\n const frameworkState = await getTaskAgentFrameworkState(runtime, ptyService);\n\n const sessions = ptyService\n ? await Promise.race([\n ptyService.listSessions(),\n new Promise<SessionInfo[]>((resolve) =>\n setTimeout(() => resolve([]), 2000),\n ),\n ])\n : [];\n const workspaces = wsService?.listWorkspaces() ?? [];\n const tasks = uniqueTasks(\n ((coordinator?.getAllTaskContexts?.() ?? []) as TaskLike[]).slice(),\n );\n const reusableSessions = sessions.filter((session) => {\n const currentTask = tasks.find((task) => task.sessionId === session.id);\n return !currentTask || currentTask.status !== \"active\";\n });\n\n const lines: string[] = [\"# Active Workspaces & Task Agents\"];\n lines.push(\n `Preferred framework: ${TASK_AGENT_FRAMEWORK_LABELS[frameworkState.preferred.id]} (${frameworkState.preferred.reason}).`,\n );\n\n if (workspaces.length === 0 && sessions.length === 0 && tasks.length === 0) {\n lines.push(\"No active workspaces or task-agent sessions.\");\n lines.push(\n \"Use CREATE_TASK when the user needs anything more involved than a simple direct reply.\",\n );\n } else {\n if (workspaces.length > 0) {\n lines.push(\"\");\n lines.push(`## Workspaces (${workspaces.length})`);\n for (const workspace of workspaces) {\n const workspaceSessions = sessions.filter(\n (session) => session.workdir === workspace.path,\n );\n const agentSummary =\n workspaceSessions.length > 0\n ? workspaceSessions\n .map(\n (session) =>\n `${session.agentType}:${formatTaskAgentStatus(session.status)}`,\n )\n .join(\", \")\n : \"no task agents\";\n lines.push(\n `- \"${workspace.label ?? workspace.id.slice(0, 8)}\" -> ${workspace.repo ?? \"scratch\"} (${workspace.branch ?? \"no branch\"}, ${agentSummary})`,\n );\n }\n }\n\n const trackedPaths = new Set(workspaces.map((workspace) => workspace.path));\n const standaloneSessions = sessions.filter(\n (session) => !trackedPaths.has(session.workdir),\n );\n\n if (standaloneSessions.length > 0) {\n lines.push(\"\");\n lines.push(`## Standalone Sessions (${standaloneSessions.length})`);\n for (const session of standaloneSessions) {\n const label =\n typeof session.metadata?.label === \"string\"\n ? session.metadata.label\n : session.name;\n lines.push(\n `- \"${label}\" (${session.agentType}, ${formatTaskAgentStatus(session.status)}) [session: ${session.id}]`,\n );\n }\n }\n\n if (tasks.length > 0) {\n lines.push(\"\");\n lines.push(`## Current Task Status (${tasks.length})`);\n for (const task of tasks\n .slice()\n .sort((left, right) => right.registeredAt - left.registeredAt)) {\n const latestDecision = task.decisions.at(-1);\n const detail =\n task.completionSummary ||\n latestDecision?.reasoning ||\n truncateTaskAgentText(task.originalTask, 110);\n lines.push(\n `- [${task.status}] \"${task.label}\" (${task.agentType}) -> ${detail}`,\n );\n }\n }\n\n const pending = coordinator?.getPendingConfirmations?.() ?? [];\n if (pending.length > 0) {\n lines.push(\"\");\n lines.push(\n `## Pending Confirmations (${pending.length}) - supervision: ${coordinator?.getSupervisionLevel?.() ?? \"unknown\"}`,\n );\n for (const confirmation of pending) {\n lines.push(\n `- \"${confirmation.taskContext.label}\" blocked on \"${truncateTaskAgentText(confirmation.promptText, 140)}\" -> suggested: ${confirmation.llmDecision.action ?? \"review\"}`,\n );\n }\n }\n\n if (reusableSessions.length > 0) {\n lines.push(\"\");\n lines.push(`## Reusable Agents (${reusableSessions.length})`);\n for (const session of reusableSessions) {\n const label =\n typeof session.metadata?.label === \"string\"\n ? session.metadata.label\n : session.name;\n lines.push(\n `- \"${label}\" (${session.agentType}) is ${formatTaskAgentStatus(session.status)} and can take a new tracked task via SEND_TO_AGENT`,\n );\n }\n }\n }\n\n if (sessions.length > 0 || tasks.length > 0) {\n lines.push(\"\");\n lines.push(\n \"Use SEND_TO_AGENT to unblock a running agent or assign it a new tracked task, LIST_AGENTS to inspect progress, STOP_AGENT to cancel, and FINALIZE_WORKSPACE when the work should be published or wrapped up.\",\n );\n }\n\n const text = lines.join(\"\\n\");\n return {\n data: {\n activeWorkspaces: workspaces.map((ws: WorkspaceResult) => ({\n id: ws.id,\n label: ws.label,\n repo: ws.repo,\n branch: ws.branch,\n path: ws.path,\n })),\n activeSessions: sessions.map((session) => ({\n id: session.id,\n label:\n typeof session.metadata?.label === \"string\"\n ? session.metadata.label\n : session.name,\n agentType: session.agentType,\n status: session.status,\n workdir: session.workdir,\n })),\n currentTasks: tasks,\n preferredTaskAgent: frameworkState.preferred,\n frameworks: frameworkState.frameworks,\n },\n values: { activeWorkspaceContext: text },\n text,\n };\n },\n};\n",
|
|
71
79
|
"/**\n * Coding Workspace Service - Manages git workspaces for coding tasks\n *\n * Delegates to:\n * - workspace-github.ts (issue management, OAuth, PAT auth)\n * - workspace-git-ops.ts (status, commit, push, PR creation)\n * - workspace-lifecycle.ts (GC, scratch dir cleanup)\n * - workspace-types.ts (shared interface definitions)\n *\n * @module services/workspace-service\n */\n\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs/promises\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport {\n type CreateIssueOptions,\n CredentialService,\n GitHubPatClient,\n type IssueComment,\n type IssueInfo,\n type IssueState,\n MemoryTokenStore,\n type PullRequestInfo,\n type WorkspaceConfig,\n type WorkspaceEvent,\n WorkspaceService,\n} from \"git-workspace-service\";\n\nimport type { AuthPromptCallback } from \"./workspace-github.js\";\nimport {\n type GitHubContext,\n addComment as ghAddComment,\n addLabels as ghAddLabels,\n closeIssue as ghCloseIssue,\n createIssue as ghCreateIssue,\n getIssue as ghGetIssue,\n listComments as ghListComments,\n listIssues as ghListIssues,\n reopenIssue as ghReopenIssue,\n updateIssue as ghUpdateIssue,\n} from \"./workspace-github.js\";\n\nexport type { AuthPromptCallback } from \"./workspace-github.js\";\n\nimport {\n commit as gitCommit,\n createPR as gitCreatePR,\n getStatus as gitGetStatus,\n push as gitPush,\n} from \"./workspace-git-ops.js\";\n\nimport {\n gcOrphanedWorkspaces,\n removeScratchDir,\n} from \"./workspace-lifecycle.js\";\nimport { readConfigEnvKey } from \"./config-env.js\";\n\nexport type {\n CodingWorkspaceConfig,\n CommitOptions,\n PROptions,\n ProvisionWorkspaceOptions,\n PushOptions,\n WorkspaceResult,\n WorkspaceStatusResult,\n} from \"./workspace-types.js\";\n\nimport type {\n CodingWorkspaceConfig,\n CommitOptions,\n PROptions,\n ProvisionWorkspaceOptions,\n PushOptions,\n WorkspaceResult,\n WorkspaceStatusResult,\n} from \"./workspace-types.js\";\n\ntype WorkspaceEventCallback = (event: WorkspaceEvent) => void;\ntype ScratchRetentionPolicy = \"ephemeral\" | \"pending_decision\" | \"persistent\";\ntype ScratchTerminalEvent = \"stopped\" | \"task_complete\" | \"error\";\n\nexport interface ScratchWorkspaceRecord {\n sessionId: string;\n label: string;\n path: string;\n status: \"pending_decision\" | \"kept\" | \"promoted\";\n createdAt: number;\n terminalAt: number;\n terminalEvent: ScratchTerminalEvent;\n expiresAt?: number;\n}\n\nexport class CodingWorkspaceService {\n static serviceType = \"CODING_WORKSPACE_SERVICE\";\n capabilityDescription = \"Manages git workspaces for coding tasks\";\n\n private runtime: IAgentRuntime;\n private workspaceService: WorkspaceService | null = null;\n private credentialService: CredentialService | null = null;\n private githubClient: GitHubPatClient | null = null;\n private githubAuthInProgress: Promise<GitHubPatClient> | null = null;\n private serviceConfig: CodingWorkspaceConfig;\n private workspaces: Map<string, WorkspaceResult> = new Map();\n private labels: Map<string, string> = new Map(); // label -> workspaceId\n private scratchBySession: Map<string, ScratchWorkspaceRecord> = new Map();\n private scratchCleanupTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private eventCallbacks: WorkspaceEventCallback[] = [];\n private authPromptCallback: AuthPromptCallback | null = null;\n /** Callback fired when a scratch workspace enters pending_decision state. */\n private scratchDecisionCallback:\n | ((record: ScratchWorkspaceRecord) => Promise<void>)\n | null = null;\n\n constructor(runtime: IAgentRuntime, config: CodingWorkspaceConfig = {}) {\n this.runtime = runtime;\n this.serviceConfig = {\n baseDir:\n config.baseDir ?? path.join(os.homedir(), \".milady\", \"workspaces\"),\n branchPrefix: config.branchPrefix ?? \"milady\",\n debug: config.debug ?? false,\n workspaceTtlMs: config.workspaceTtlMs ?? 24 * 60 * 60 * 1000,\n };\n }\n\n static async start(runtime: IAgentRuntime): Promise<CodingWorkspaceService> {\n const config = runtime.getSetting(\"CODING_WORKSPACE_CONFIG\") as\n | CodingWorkspaceConfig\n | null\n | undefined;\n const service = new CodingWorkspaceService(runtime, config ?? {});\n await service.initialize();\n return service;\n }\n\n static async stopRuntime(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(\"CODING_WORKSPACE_SERVICE\") as unknown as\n | CodingWorkspaceService\n | undefined;\n if (service) {\n await service.stop();\n }\n }\n\n private async initialize(): Promise<void> {\n this.credentialService = new CredentialService({\n tokenStore: new MemoryTokenStore(),\n });\n\n this.workspaceService = new WorkspaceService({\n config: {\n baseDir: this.serviceConfig.baseDir as string,\n branchPrefix: this.serviceConfig.branchPrefix,\n },\n credentialService: this.credentialService,\n logger: this.serviceConfig.debug\n ? {\n info: (data: unknown, msg?: string) =>\n console.log(`[WorkspaceService] ${msg ?? \"\"}`, data),\n warn: (data: unknown, msg?: string) =>\n console.warn(`[WorkspaceService] ${msg ?? \"\"}`, data),\n error: (data: unknown, msg?: string) =>\n console.error(`[WorkspaceService] ${msg ?? \"\"}`, data),\n debug: (_data: unknown, msg?: string) => this.log(`${msg ?? \"\"}`),\n }\n : undefined,\n });\n\n await this.workspaceService.initialize();\n\n const githubToken = this.runtime.getSetting(\"GITHUB_TOKEN\") as\n | string\n | undefined;\n if (githubToken) {\n this.githubClient = new GitHubPatClient({ token: githubToken });\n this.log(\"GitHubPatClient initialized with PAT\");\n } else {\n this.log(\n \"GITHUB_TOKEN not set - will use OAuth device flow when GitHub access is needed\",\n );\n }\n\n this.workspaceService.onEvent((event: WorkspaceEvent) => {\n this.emitEvent(event);\n });\n\n this.log(\"CodingWorkspaceService initialized\");\n\n // Run startup GC in background (non-blocking)\n this.gcOrphanedWorkspaces().catch((err) => {\n console.warn(\"[CodingWorkspaceService] Startup GC failed:\", err);\n });\n }\n\n async stop(): Promise<void> {\n for (const timer of this.scratchCleanupTimers.values()) {\n clearTimeout(timer);\n }\n this.scratchCleanupTimers.clear();\n for (const [id] of this.workspaces) {\n try {\n await this.removeWorkspace(id);\n } catch (err) {\n this.log(`Error cleaning up workspace ${id}: ${err}`);\n }\n }\n this.workspaces.clear();\n this.workspaceService = null;\n this.credentialService = null;\n this.githubClient = null;\n this.log(\"CodingWorkspaceService shutdown complete\");\n }\n\n /** Provision a new workspace */\n async provisionWorkspace(\n options: ProvisionWorkspaceOptions,\n ): Promise<WorkspaceResult> {\n if (!this.workspaceService) {\n throw new Error(\"CodingWorkspaceService not initialized\");\n }\n\n // Strip trailing slashes to prevent git-workspace-service from\n // appending .git incorrectly (e.g. \"repo/\" -> \"repo/.git\")\n const repo = options.repo.replace(/\\/+$/, \"\");\n const executionId = options.execution?.id ?? `exec-${Date.now()}`;\n const taskId = options.task?.id ?? `task-${Date.now()}`;\n\n const workspaceConfig: WorkspaceConfig = {\n repo,\n strategy: options.useWorktree ? \"worktree\" : \"clone\",\n parentWorkspace: options.parentWorkspaceId,\n branchStrategy: \"feature_branch\",\n branchName: options.branchName,\n baseBranch: options.baseBranch ?? \"main\",\n execution: {\n id: executionId,\n patternName: options.execution?.patternName ?? \"milady-coding\",\n },\n task: {\n id: taskId,\n role: options.task?.role ?? \"coding-agent\",\n slug: options.task?.slug,\n },\n userCredentials: options.userCredentials\n ? {\n type: options.userCredentials.type,\n token: options.userCredentials.token ?? \"\",\n provider: \"github\",\n }\n : undefined,\n };\n\n const workspace = await this.workspaceService.provision(workspaceConfig);\n const result: WorkspaceResult = {\n id: workspace.id,\n path: workspace.path,\n branch: workspace.branch.name,\n baseBranch: workspace.branch.baseBranch,\n isWorktree: workspace.strategy === \"worktree\",\n repo: workspace.repo,\n status: workspace.status,\n };\n\n this.workspaces.set(workspace.id, result);\n this.log(`Provisioned workspace ${workspace.id}`);\n return result;\n }\n\n getWorkspace(id: string): WorkspaceResult | undefined {\n return this.workspaces.get(id);\n }\n\n listWorkspaces(): WorkspaceResult[] {\n return Array.from(this.workspaces.values());\n }\n\n /**\n * Assign a semantic label to a workspace (e.g. \"auth-bugfix\").\n * If the label already exists, it is reassigned to the new workspace.\n */\n setLabel(workspaceId: string, label: string): void {\n const workspace = this.workspaces.get(workspaceId);\n if (!workspace) {\n throw new Error(`Workspace ${workspaceId} not found`);\n }\n if (workspace.label) {\n this.labels.delete(workspace.label);\n }\n const existing = this.labels.get(label);\n if (existing && existing !== workspaceId) {\n const oldWs = this.workspaces.get(existing);\n if (oldWs) oldWs.label = undefined;\n }\n workspace.label = label;\n this.labels.set(label, workspaceId);\n this.log(`Labeled workspace ${workspaceId} as \"${label}\"`);\n }\n\n getWorkspaceByLabel(label: string): WorkspaceResult | undefined {\n const id = this.labels.get(label);\n return id ? this.workspaces.get(id) : undefined;\n }\n\n /** Resolve a workspace by label or ID. */\n resolveWorkspace(labelOrId: string): WorkspaceResult | undefined {\n return (\n this.getWorkspaceByLabel(labelOrId) ?? this.workspaces.get(labelOrId)\n );\n }\n\n // === Delegated Git Operations ===\n\n async getStatus(workspaceId: string): Promise<WorkspaceStatusResult> {\n const workspace = this.workspaces.get(workspaceId);\n if (!workspace) {\n throw new Error(`Workspace ${workspaceId} not found`);\n }\n return gitGetStatus(workspace.path);\n }\n\n async commit(workspaceId: string, options: CommitOptions): Promise<string> {\n const workspace = this.workspaces.get(workspaceId);\n if (!workspace) {\n throw new Error(`Workspace ${workspaceId} not found`);\n }\n const hash = await gitCommit(workspace.path, options, (msg) =>\n this.log(msg),\n );\n this.log(`Committed ${hash.slice(0, 8)} in workspace ${workspaceId}`);\n return hash;\n }\n\n async push(workspaceId: string, options?: PushOptions): Promise<void> {\n const workspace = this.workspaces.get(workspaceId);\n if (!workspace) {\n throw new Error(`Workspace ${workspaceId} not found`);\n }\n await gitPush(workspace.path, workspace.branch, options, (msg) =>\n this.log(msg),\n );\n this.log(`Pushed workspace ${workspaceId}`);\n }\n\n async createPR(\n workspaceId: string,\n options: PROptions,\n ): Promise<PullRequestInfo> {\n if (!this.workspaceService) {\n throw new Error(\"CodingWorkspaceService not initialized\");\n }\n const workspace = this.workspaces.get(workspaceId);\n if (!workspace) {\n throw new Error(`Workspace ${workspaceId} not found`);\n }\n return gitCreatePR(\n this.workspaceService,\n workspace,\n workspaceId,\n options,\n (msg) => this.log(msg),\n );\n }\n\n // === Delegated GitHub / Issue Management ===\n\n private getGitHubContext(): GitHubContext {\n return {\n runtime: this.runtime,\n githubClient: this.githubClient,\n setGithubClient: (client: GitHubPatClient) => {\n this.githubClient = client;\n },\n githubAuthInProgress: this.githubAuthInProgress,\n setGithubAuthInProgress: (p: Promise<GitHubPatClient> | null) => {\n this.githubAuthInProgress = p;\n },\n authPromptCallback: this.authPromptCallback,\n log: (msg: string) => this.log(msg),\n };\n }\n\n /** Set a callback to surface OAuth auth prompts to the user. */\n setAuthPromptCallback(callback: AuthPromptCallback): void {\n this.authPromptCallback = callback;\n }\n\n /**\n * Register a callback fired when a scratch workspace enters pending_decision.\n * Used to prompt the user via chat: \"Want to keep this code?\"\n */\n setScratchDecisionCallback(\n callback: (record: ScratchWorkspaceRecord) => Promise<void>,\n ): void {\n this.scratchDecisionCallback = callback;\n }\n\n async createIssue(\n repo: string,\n options: CreateIssueOptions,\n ): Promise<IssueInfo> {\n return ghCreateIssue(this.getGitHubContext(), repo, options);\n }\n\n async getIssue(repo: string, issueNumber: number): Promise<IssueInfo> {\n return ghGetIssue(this.getGitHubContext(), repo, issueNumber);\n }\n\n async listIssues(\n repo: string,\n options?: {\n state?: IssueState | \"all\";\n labels?: string[];\n assignee?: string;\n },\n ): Promise<IssueInfo[]> {\n return ghListIssues(this.getGitHubContext(), repo, options);\n }\n\n async updateIssue(\n repo: string,\n issueNumber: number,\n options: {\n title?: string;\n body?: string;\n state?: IssueState;\n labels?: string[];\n assignees?: string[];\n },\n ): Promise<IssueInfo> {\n return ghUpdateIssue(this.getGitHubContext(), repo, issueNumber, options);\n }\n\n async addComment(\n repo: string,\n issueNumber: number,\n body: string,\n ): Promise<IssueComment> {\n return ghAddComment(this.getGitHubContext(), repo, issueNumber, body);\n }\n\n async listComments(\n repo: string,\n issueNumber: number,\n ): Promise<IssueComment[]> {\n return ghListComments(this.getGitHubContext(), repo, issueNumber);\n }\n\n async closeIssue(repo: string, issueNumber: number): Promise<IssueInfo> {\n return ghCloseIssue(this.getGitHubContext(), repo, issueNumber);\n }\n\n async reopenIssue(repo: string, issueNumber: number): Promise<IssueInfo> {\n return ghReopenIssue(this.getGitHubContext(), repo, issueNumber);\n }\n\n async addLabels(\n repo: string,\n issueNumber: number,\n labels: string[],\n ): Promise<void> {\n return ghAddLabels(this.getGitHubContext(), repo, issueNumber, labels);\n }\n\n // === Workspace Lifecycle ===\n\n async removeWorkspace(workspaceId: string): Promise<void> {\n if (!this.workspaceService) {\n throw new Error(\"CodingWorkspaceService not initialized\");\n }\n await this.workspaceService.cleanup(workspaceId);\n const workspace = this.workspaces.get(workspaceId);\n if (workspace?.label) {\n this.labels.delete(workspace.label);\n }\n this.workspaces.delete(workspaceId);\n this.log(`Removed workspace ${workspaceId}`);\n }\n\n onEvent(callback: WorkspaceEventCallback): () => void {\n this.eventCallbacks.push(callback);\n return () => {\n const index = this.eventCallbacks.indexOf(callback);\n if (index !== -1) {\n this.eventCallbacks.splice(index, 1);\n }\n };\n }\n\n private emitEvent(event: WorkspaceEvent): void {\n for (const callback of this.eventCallbacks) {\n try {\n callback(event);\n } catch (err) {\n this.log(`Event callback error: ${err}`);\n }\n }\n }\n\n /** Remove a scratch directory — allowed under base dir or user coding directory. */\n async removeScratchDir(dirPath: string): Promise<void> {\n const rawCodingDir =\n (this.runtime.getSetting(\"PARALLAX_CODING_DIRECTORY\") as string) ??\n this.readConfigEnvKey(\"PARALLAX_CODING_DIRECTORY\") ??\n process.env.PARALLAX_CODING_DIRECTORY;\n const codingDir = rawCodingDir?.trim()\n ? rawCodingDir.trim().startsWith(\"~\")\n ? path.join(os.homedir(), rawCodingDir.trim().slice(1))\n : path.resolve(rawCodingDir.trim())\n : undefined;\n const allowedDirs = codingDir ? [codingDir] : undefined;\n return removeScratchDir(\n dirPath,\n this.serviceConfig.baseDir as string,\n (msg) => this.log(msg),\n allowedDirs,\n );\n }\n\n listScratchWorkspaces(): ScratchWorkspaceRecord[] {\n return Array.from(this.scratchBySession.values()).sort(\n (a, b) => b.terminalAt - a.terminalAt,\n );\n }\n\n async registerScratchWorkspace(\n sessionId: string,\n dirPath: string,\n label: string,\n terminalEvent: ScratchTerminalEvent,\n ): Promise<ScratchWorkspaceRecord | null> {\n const now = Date.now();\n const existing = this.scratchBySession.get(sessionId);\n const base: ScratchWorkspaceRecord = existing ?? {\n sessionId,\n label,\n path: dirPath,\n createdAt: now,\n terminalAt: now,\n terminalEvent,\n status: \"pending_decision\",\n };\n\n const policy = this.getScratchRetentionPolicy();\n this.log(`Scratch retention policy: \"${policy}\" for \"${label}\"`);\n if (policy === \"ephemeral\") {\n await this.removeScratchDir(dirPath);\n this.scratchBySession.delete(sessionId);\n this.clearScratchCleanupTimer(sessionId);\n return null;\n }\n\n const record: ScratchWorkspaceRecord = {\n ...base,\n label,\n path: dirPath,\n terminalAt: now,\n terminalEvent,\n status: policy === \"persistent\" ? \"kept\" : \"pending_decision\",\n expiresAt: undefined,\n };\n this.scratchBySession.set(sessionId, record);\n\n if (record.status === \"pending_decision\") {\n const ttlMs = this.getScratchDecisionTtlMs();\n record.expiresAt = now + ttlMs;\n this.scheduleScratchCleanup(sessionId, ttlMs);\n // Prompt user via chat: \"Want to keep this code?\"\n if (this.scratchDecisionCallback) {\n this.log(`Firing scratch decision prompt for \"${label}\" at ${dirPath}`);\n this.scratchDecisionCallback(record).catch((err) => {\n console.warn(`[workspace] Failed to send scratch decision prompt: ${err}`);\n });\n } else {\n this.log(`No scratch decision callback wired — skipping prompt for \"${label}\"`);\n }\n } else {\n this.clearScratchCleanupTimer(sessionId);\n }\n return record;\n }\n\n async keepScratchWorkspace(sessionId: string): Promise<ScratchWorkspaceRecord> {\n const record = this.requireScratchWorkspace(sessionId);\n const next: ScratchWorkspaceRecord = {\n ...record,\n status: \"kept\",\n expiresAt: undefined,\n };\n this.scratchBySession.set(sessionId, next);\n this.clearScratchCleanupTimer(sessionId);\n return next;\n }\n\n async deleteScratchWorkspace(sessionId: string): Promise<void> {\n const record = this.requireScratchWorkspace(sessionId);\n await this.removeScratchDir(record.path);\n this.scratchBySession.delete(sessionId);\n this.clearScratchCleanupTimer(sessionId);\n }\n\n async promoteScratchWorkspace(\n sessionId: string,\n name?: string,\n ): Promise<ScratchWorkspaceRecord> {\n const record = this.requireScratchWorkspace(sessionId);\n const baseDir = this.serviceConfig.baseDir as string;\n const suggestedName = this.sanitizeWorkspaceName(name || record.label);\n const targetPath = await this.allocatePromotedPath(baseDir, suggestedName);\n try {\n await fs.rename(record.path, targetPath);\n } catch (error) {\n const isExdev =\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"EXDEV\";\n if (!isExdev) throw error;\n await fs.cp(record.path, targetPath, { recursive: true });\n await fs.access(targetPath);\n await fs.rm(record.path, { recursive: true, force: true });\n }\n\n const next: ScratchWorkspaceRecord = {\n ...record,\n path: targetPath,\n status: \"promoted\",\n expiresAt: undefined,\n };\n this.scratchBySession.set(sessionId, next);\n this.clearScratchCleanupTimer(sessionId);\n return next;\n }\n\n /** GC orphaned workspace directories older than workspaceTtlMs. */\n private async gcOrphanedWorkspaces(): Promise<void> {\n return gcOrphanedWorkspaces(\n this.serviceConfig.baseDir as string,\n this.serviceConfig.workspaceTtlMs ?? 24 * 60 * 60 * 1000,\n new Set(this.workspaces.keys()),\n (msg) => this.log(msg),\n );\n }\n\n private log(message: string): void {\n if (this.serviceConfig.debug) {\n console.log(`[CodingWorkspaceService] ${message}`);\n }\n }\n\n /** Read a key from the config file's env section (live, no restart needed). */\n private readConfigEnvKey(key: string): string | undefined {\n return readConfigEnvKey(key);\n }\n\n private getScratchRetentionPolicy(): ScratchRetentionPolicy {\n const setting = (\n this.runtime.getSetting(\"PARALLAX_SCRATCH_RETENTION\") ??\n this.readConfigEnvKey(\"PARALLAX_SCRATCH_RETENTION\") ??\n process.env.PARALLAX_SCRATCH_RETENTION\n ) as string | undefined;\n const normalized = setting?.trim().toLowerCase();\n if (normalized === \"ephemeral\") return \"ephemeral\";\n if (normalized === \"persistent\" || normalized === \"keep\") {\n return \"persistent\";\n }\n // When a coding directory is configured and no explicit retention was set,\n // default to persistent — users don't expect named folders in ~/Projects\n // to auto-delete. If the user explicitly chose pending_decision, respect it.\n if (!normalized) {\n const codingDir =\n (this.runtime.getSetting(\"PARALLAX_CODING_DIRECTORY\") as string) ??\n this.readConfigEnvKey(\"PARALLAX_CODING_DIRECTORY\") ??\n process.env.PARALLAX_CODING_DIRECTORY;\n if (codingDir?.trim()) return \"persistent\";\n }\n return \"pending_decision\";\n }\n\n private getScratchDecisionTtlMs(): number {\n const setting = this.runtime.getSetting(\n \"PARALLAX_SCRATCH_DECISION_TTL_MS\",\n ) as string | number | undefined;\n const parsed = Number(setting ?? process.env.PARALLAX_SCRATCH_DECISION_TTL_MS);\n if (Number.isFinite(parsed) && parsed > 0) return parsed;\n return 24 * 60 * 60 * 1000;\n }\n\n private requireScratchWorkspace(sessionId: string): ScratchWorkspaceRecord {\n const record = this.scratchBySession.get(sessionId);\n if (!record) {\n throw new Error(`Scratch workspace for session ${sessionId} not found`);\n }\n return record;\n }\n\n private clearScratchCleanupTimer(sessionId: string): void {\n const timer = this.scratchCleanupTimers.get(sessionId);\n if (timer) {\n clearTimeout(timer);\n this.scratchCleanupTimers.delete(sessionId);\n }\n }\n\n private scheduleScratchCleanup(sessionId: string, ttlMs: number): void {\n this.clearScratchCleanupTimer(sessionId);\n const timer = setTimeout(async () => {\n try {\n const record = this.scratchBySession.get(sessionId);\n if (!record || record.status !== \"pending_decision\") return;\n await this.removeScratchDir(record.path);\n } catch (error) {\n console.warn(\n `[CodingWorkspaceService] scratch cleanup failed for ${sessionId}: ${String(error)}`,\n );\n } finally {\n this.scratchBySession.delete(sessionId);\n this.scratchCleanupTimers.delete(sessionId);\n }\n }, ttlMs);\n this.scratchCleanupTimers.set(sessionId, timer);\n }\n\n private sanitizeWorkspaceName(raw: string): string {\n const compact = raw\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n return compact || `scratch-${Date.now().toString(36)}`;\n }\n\n private async allocatePromotedPath(\n baseDir: string,\n baseName: string,\n ): Promise<string> {\n const baseResolved = path.resolve(baseDir);\n for (let i = 0; i < 1000; i++) {\n const candidateName = i === 0 ? baseName : `${baseName}-${i}`;\n const candidate = path.resolve(baseResolved, candidateName);\n if (\n candidate !== baseResolved &&\n !candidate.startsWith(`${baseResolved}${path.sep}`)\n ) {\n continue;\n }\n try {\n await fs.access(candidate);\n } catch {\n return candidate;\n }\n }\n throw new Error(\"Unable to allocate promoted workspace path\");\n }\n}\n",
|
|
72
80
|
"/**\n * GitHub integration for Coding Workspace Service\n *\n * Extracted from workspace-service.ts — provides GitHub API access\n * via PAT or OAuth device flow, plus all issue management operations.\n *\n * @module services/workspace-github\n */\n\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport {\n type CreateIssueOptions,\n GitHubPatClient,\n type IssueComment,\n type IssueInfo,\n type IssueState,\n OAuthDeviceFlow,\n} from \"git-workspace-service\";\n\n/**\n * Callback for surfacing auth prompts to the user.\n * Returns the auth prompt text so Milady can relay it through chat.\n */\nexport type AuthPromptCallback = (prompt: {\n verificationUri: string;\n userCode: string;\n expiresIn: number;\n}) => void;\n\n/**\n * Context object passed by CodingWorkspaceService into every GitHub function.\n * Lets us keep the extracted functions stateless while still mutating shared state.\n */\nexport interface GitHubContext {\n runtime: IAgentRuntime;\n githubClient: GitHubPatClient | null;\n setGithubClient: (client: GitHubPatClient) => void;\n githubAuthInProgress: Promise<GitHubPatClient> | null;\n setGithubAuthInProgress: (p: Promise<GitHubPatClient> | null) => void;\n authPromptCallback: AuthPromptCallback | null;\n log: (msg: string) => void;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────\n\nexport function parseOwnerRepo(repo: string): {\n owner: string;\n repo: string;\n} {\n // Handle URLs like https://github.com/owner/repo or owner/repo\n const match = repo.match(/(?:github\\.com\\/)?([^/]+)\\/([^/.]+)/);\n if (!match) {\n throw new Error(`Cannot parse owner/repo from: ${repo}`);\n }\n return { owner: match[1], repo: match[2] };\n}\n\n// ── Auth ───────────────────────────────────────────────────────────\n\nexport async function ensureGitHubClient(\n ctx: GitHubContext,\n): Promise<GitHubPatClient> {\n // Already have a client\n if (ctx.githubClient) return ctx.githubClient;\n\n // Auth already in progress (another call triggered it) - wait for it\n if (ctx.githubAuthInProgress) return ctx.githubAuthInProgress;\n\n // Check for PAT (re-check in case it was set after init)\n const githubToken = ctx.runtime.getSetting(\"GITHUB_TOKEN\") as\n | string\n | undefined;\n if (githubToken) {\n const client = new GitHubPatClient({ token: githubToken });\n ctx.setGithubClient(client);\n ctx.log(\"GitHubPatClient initialized with PAT (late binding)\");\n return client;\n }\n\n // Try OAuth device flow (explicit user consent, scoped permissions)\n const clientId = ctx.runtime.getSetting(\"GITHUB_OAUTH_CLIENT_ID\") as\n | string\n | undefined;\n if (!clientId) {\n throw new Error(\n \"GitHub access required but no credentials available. \" +\n \"Set GITHUB_TOKEN (PAT) or GITHUB_OAUTH_CLIENT_ID (for OAuth device flow).\",\n );\n }\n\n // Start OAuth - deduplicate concurrent requests\n const authPromise = performOAuthFlow(ctx, clientId);\n ctx.setGithubAuthInProgress(authPromise);\n try {\n const client = await authPromise;\n return client;\n } finally {\n ctx.setGithubAuthInProgress(null);\n }\n}\n\nexport async function performOAuthFlow(\n ctx: GitHubContext,\n clientId: string,\n): Promise<GitHubPatClient> {\n // Read directly from process.env — this is a server-side secret that\n // should not be exposed through the plugin getSetting() allowlist.\n const clientSecret = process.env.GITHUB_OAUTH_CLIENT_SECRET;\n\n const oauth = new OAuthDeviceFlow({\n clientId,\n clientSecret,\n permissions: {\n repositories: { type: \"public\" },\n contents: \"write\",\n issues: \"write\",\n pullRequests: \"write\",\n metadata: \"read\",\n },\n timeout: 300, // 5 minutes\n });\n\n // Step 1: Request device code\n const deviceCode = await oauth.requestDeviceCode();\n\n // Step 2: Surface the auth prompt to the user\n if (ctx.authPromptCallback) {\n ctx.authPromptCallback({\n verificationUri: deviceCode.verificationUri,\n userCode: deviceCode.userCode,\n expiresIn: deviceCode.expiresIn,\n });\n } else {\n // Fallback: log to console\n console.log(\n `\\n[GitHub Auth] Go to ${deviceCode.verificationUri} and enter code: ${deviceCode.userCode}\\n`,\n );\n }\n\n // Step 3: Poll until user completes auth\n const token = await oauth.pollForToken(deviceCode);\n\n // Step 4: Create client with the obtained token\n const client = new GitHubPatClient({ token: token.accessToken });\n ctx.setGithubClient(client);\n ctx.log(\"GitHubPatClient initialized via OAuth device flow\");\n return client;\n}\n\n// ── Issue Management ───────────────────────────────────────────────\n\nexport async function createIssue(\n ctx: GitHubContext,\n repo: string,\n options: CreateIssueOptions,\n): Promise<IssueInfo> {\n const client = await ensureGitHubClient(ctx);\n const { owner, repo: repoName } = parseOwnerRepo(repo);\n const issue = await client.createIssue(owner, repoName, options);\n ctx.log(`Created issue #${issue.number}: ${issue.title}`);\n return issue;\n}\n\nexport async function getIssue(\n ctx: GitHubContext,\n repo: string,\n issueNumber: number,\n): Promise<IssueInfo> {\n const client = await ensureGitHubClient(ctx);\n const { owner, repo: repoName } = parseOwnerRepo(repo);\n return client.getIssue(owner, repoName, issueNumber);\n}\n\nexport async function listIssues(\n ctx: GitHubContext,\n repo: string,\n options?: {\n state?: IssueState | \"all\";\n labels?: string[];\n assignee?: string;\n },\n): Promise<IssueInfo[]> {\n const client = await ensureGitHubClient(ctx);\n const { owner, repo: repoName } = parseOwnerRepo(repo);\n return client.listIssues(owner, repoName, options);\n}\n\nexport async function updateIssue(\n ctx: GitHubContext,\n repo: string,\n issueNumber: number,\n options: {\n title?: string;\n body?: string;\n state?: IssueState;\n labels?: string[];\n assignees?: string[];\n },\n): Promise<IssueInfo> {\n const client = await ensureGitHubClient(ctx);\n const { owner, repo: repoName } = parseOwnerRepo(repo);\n return client.updateIssue(owner, repoName, issueNumber, options);\n}\n\nexport async function addComment(\n ctx: GitHubContext,\n repo: string,\n issueNumber: number,\n body: string,\n): Promise<IssueComment> {\n const client = await ensureGitHubClient(ctx);\n const { owner, repo: repoName } = parseOwnerRepo(repo);\n return client.addComment(owner, repoName, issueNumber, { body });\n}\n\nexport async function listComments(\n ctx: GitHubContext,\n repo: string,\n issueNumber: number,\n): Promise<IssueComment[]> {\n const client = await ensureGitHubClient(ctx);\n const { owner, repo: repoName } = parseOwnerRepo(repo);\n return client.listComments(owner, repoName, issueNumber);\n}\n\nexport async function closeIssue(\n ctx: GitHubContext,\n repo: string,\n issueNumber: number,\n): Promise<IssueInfo> {\n const client = await ensureGitHubClient(ctx);\n const { owner, repo: repoName } = parseOwnerRepo(repo);\n const issue = await client.closeIssue(owner, repoName, issueNumber);\n ctx.log(`Closed issue #${issueNumber}`);\n return issue;\n}\n\nexport async function reopenIssue(\n ctx: GitHubContext,\n repo: string,\n issueNumber: number,\n): Promise<IssueInfo> {\n const client = await ensureGitHubClient(ctx);\n const { owner, repo: repoName } = parseOwnerRepo(repo);\n return client.reopenIssue(owner, repoName, issueNumber);\n}\n\nexport async function addLabels(\n ctx: GitHubContext,\n repo: string,\n issueNumber: number,\n labels: string[],\n): Promise<void> {\n const client = await ensureGitHubClient(ctx);\n const { owner, repo: repoName } = parseOwnerRepo(repo);\n await client.addLabels(owner, repoName, issueNumber, labels);\n}\n",
|
|
73
81
|
"/**\n * Git operations for Coding Workspace Service\n *\n * Extracted from workspace-service.ts — provides git status, commit, push,\n * and PR creation as standalone functions operating on workspace paths.\n *\n * @module services/workspace-git-ops\n */\n\nimport type {\n PullRequestInfo,\n WorkspaceFinalization,\n WorkspaceService,\n} from \"git-workspace-service\";\nimport type {\n CommitOptions,\n PROptions,\n PushOptions,\n WorkspaceResult,\n WorkspaceStatusResult,\n} from \"./workspace-service.js\";\n\n/**\n * Get workspace git status (branch, staged/modified/untracked files).\n */\nexport async function getStatus(\n workspacePath: string,\n): Promise<WorkspaceStatusResult> {\n const { execFileSync } = await import(\"node:child_process\");\n\n const statusOutput = execFileSync(\"git\", [\"status\", \"--porcelain\"], {\n cwd: workspacePath,\n encoding: \"utf-8\",\n });\n\n const branchOutput = execFileSync(\"git\", [\"branch\", \"--show-current\"], {\n cwd: workspacePath,\n encoding: \"utf-8\",\n }).trim();\n\n const lines = statusOutput.split(\"\\n\").filter(Boolean);\n const modified: string[] = [];\n const staged: string[] = [];\n const untracked: string[] = [];\n\n for (const line of lines) {\n const indexStatus = line[0];\n const workTreeStatus = line[1];\n const filename = line.slice(3);\n\n if (indexStatus === \"?\" && workTreeStatus === \"?\") {\n untracked.push(filename);\n } else if (indexStatus !== \" \" && indexStatus !== \"?\") {\n staged.push(filename);\n } else if (workTreeStatus !== \" \") {\n modified.push(filename);\n }\n }\n\n return {\n branch: branchOutput,\n clean: lines.length === 0,\n modified,\n staged,\n untracked,\n };\n}\n\n/**\n * Commit changes in a workspace directory.\n * Returns the commit hash.\n */\nexport async function commit(\n workspacePath: string,\n options: CommitOptions,\n log: (msg: string) => void,\n): Promise<string> {\n const { execFileSync } = await import(\"node:child_process\");\n\n if (options.all) {\n execFileSync(\"git\", [\"add\", \"-A\"], { cwd: workspacePath });\n }\n\n execFileSync(\"git\", [\"commit\", \"-m\", options.message], {\n cwd: workspacePath,\n });\n\n const hash = execFileSync(\"git\", [\"rev-parse\", \"HEAD\"], {\n cwd: workspacePath,\n encoding: \"utf-8\",\n }).trim();\n\n log(`Committed ${hash.slice(0, 8)} in workspace at ${workspacePath}`);\n return hash;\n}\n\n/**\n * Push changes to remote for a workspace.\n */\nexport async function push(\n workspacePath: string,\n branch: string,\n options: PushOptions | undefined,\n log: (msg: string) => void,\n): Promise<void> {\n const { execFileSync } = await import(\"node:child_process\");\n\n const args = [\"push\"];\n if (options?.setUpstream) {\n args.push(\"-u\", \"origin\", branch);\n }\n if (options?.force) {\n args.push(\"--force\");\n }\n\n execFileSync(\"git\", args, { cwd: workspacePath });\n log(`Pushed workspace at ${workspacePath}`);\n}\n\n/**\n * Create a pull request for a workspace via the underlying WorkspaceService.\n */\nexport async function createPR(\n workspaceService: WorkspaceService,\n workspace: WorkspaceResult,\n workspaceId: string,\n options: PROptions,\n log: (msg: string) => void,\n): Promise<PullRequestInfo> {\n const finalization: WorkspaceFinalization = {\n push: false, // Already pushed\n createPr: true,\n pr: {\n title: options.title,\n body: options.body,\n targetBranch: options.base ?? workspace.baseBranch,\n draft: options.draft,\n labels: options.labels,\n reviewers: options.reviewers,\n },\n cleanup: false,\n };\n\n const result = await workspaceService.finalize(workspaceId, finalization);\n if (!result) {\n throw new Error(\"Failed to create PR\");\n }\n\n log(`Created PR #${result.number} for workspace ${workspaceId}`);\n return result;\n}\n",
|
|
74
82
|
"/**\n * Workspace lifecycle utilities — garbage collection and scratch directory cleanup.\n *\n * Extracted from workspace-service.ts to reduce module size.\n *\n * @module services/workspace-lifecycle\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\n/**\n * Remove a scratch directory (non-git workspace used for ad-hoc tasks).\n * Safe to call for any path under the workspaces base dir.\n */\nexport async function removeScratchDir(\n dirPath: string,\n baseDir: string,\n log: (msg: string) => void,\n allowedDirs?: string[],\n): Promise<void> {\n const resolved = path.resolve(dirPath);\n\n // Safety: only remove if under baseDir or one of the allowed directories\n const expandTilde = (p: string) =>\n p.startsWith(\"~\") ? path.join(os.homedir(), p.slice(1)) : p;\n const allAllowed = [baseDir, ...(allowedDirs ?? [])];\n const isAllowed = allAllowed.some((dir) => {\n const resolvedDir = path.resolve(expandTilde(dir)) + path.sep;\n return resolved.startsWith(resolvedDir) || resolved === path.resolve(expandTilde(dir));\n });\n\n if (!isAllowed) {\n console.warn(\n `[CodingWorkspaceService] Refusing to remove dir outside allowed paths: ${resolved}`,\n );\n return;\n }\n try {\n await fs.promises.rm(resolved, { recursive: true, force: true });\n log(`Removed scratch dir ${resolved}`);\n } catch (err) {\n console.warn(\n `[CodingWorkspaceService] Failed to remove scratch dir ${resolved}:`,\n err,\n );\n }\n}\n\n/**\n * Garbage-collect orphaned workspace directories.\n * Removes directories older than the given TTL that aren't tracked by the current session.\n */\nexport async function gcOrphanedWorkspaces(\n baseDir: string,\n workspaceTtlMs: number,\n trackedWorkspaceIds: Set<string>,\n log: (msg: string) => void,\n): Promise<void> {\n if (workspaceTtlMs === 0) {\n log(\"Workspace GC disabled (workspaceTtlMs=0)\");\n return;\n }\n\n let entries: fs.Dirent[];\n try {\n entries = await fs.promises.readdir(baseDir, { withFileTypes: true });\n } catch {\n // Base dir doesn't exist yet — nothing to clean\n return;\n }\n\n const now = Date.now();\n let removed = 0;\n let skipped = 0;\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n // Skip directories tracked by the current session\n if (trackedWorkspaceIds.has(entry.name)) {\n skipped++;\n continue;\n }\n\n const dirPath = path.join(baseDir, entry.name);\n try {\n const stat = await fs.promises.stat(dirPath);\n const age = now - stat.mtimeMs;\n\n if (age > workspaceTtlMs) {\n await fs.promises.rm(dirPath, { recursive: true, force: true });\n removed++;\n } else {\n skipped++;\n }\n } catch (err) {\n // Stat or remove failed — skip\n log(`GC: skipping ${entry.name}: ${err}`);\n skipped++;\n }\n }\n\n if (removed > 0 || skipped > 0) {\n console.log(\n `[CodingWorkspaceService] Startup GC: removed ${removed} orphaned workspace(s), kept ${skipped}`,\n );\n }\n}\n",
|
|
75
|
-
"/**\n * Task Agent Route Handlers\n *\n * Handles routes for PTY-based task-agent management:\n * - Preflight checks, metrics, workspace files\n * - Approval presets and config\n * - Agent CRUD: list, spawn, get, send, stop, output\n *\n * @module api/agent-routes\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { access, readFile, realpath, rm } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport {\n isPiAgentType,\n normalizeAgentType,\n toPiCommand,\n} from \"../services/pty-types.js\";\nimport { getTaskAgentFrameworkState } from \"../services/task-agent-frameworks.js\";\nimport type { RouteContext } from \"./routes.js\";\nimport { parseBody, sendError, sendJson } from \"./routes.js\";\n\nconst execFileAsync = promisify(execFile);\nconst PREFLIGHT_DONE = new Set<string>();\nconst PREFLIGHT_INFLIGHT = new Map<string, Promise<void>>();\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nfunction shouldAutoPreflight(): boolean {\n if (process.env.PARALLAX_BENCHMARK_PREFLIGHT_AUTO === \"1\") return true;\n return false;\n}\n\nfunction isPathInside(parent: string, candidate: string): boolean {\n return candidate === parent || candidate.startsWith(`${parent}${path.sep}`);\n}\n\nasync function resolveSafeVenvPath(\n workdir: string,\n venvDirRaw: string,\n): Promise<string> {\n const venvDir = venvDirRaw.trim();\n if (!venvDir) {\n throw new Error(\"PARALLAX_BENCHMARK_PREFLIGHT_VENV must be non-empty\");\n }\n if (path.isAbsolute(venvDir)) {\n throw new Error(\n \"PARALLAX_BENCHMARK_PREFLIGHT_VENV must be relative to workdir\",\n );\n }\n\n const normalized = path.normalize(venvDir);\n if (\n normalized === \".\" ||\n normalized === \"..\" ||\n normalized.startsWith(`..${path.sep}`)\n ) {\n throw new Error(\n \"PARALLAX_BENCHMARK_PREFLIGHT_VENV must stay within workdir\",\n );\n }\n\n const workdirResolved = path.resolve(workdir);\n const workdirReal = await realpath(workdirResolved);\n const resolved = path.resolve(workdirReal, normalized);\n if (!isPathInside(workdirReal, resolved)) {\n throw new Error(\n \"PARALLAX_BENCHMARK_PREFLIGHT_VENV resolves outside workdir\",\n );\n }\n if (resolved === workdirReal) {\n throw new Error(\n \"PARALLAX_BENCHMARK_PREFLIGHT_VENV must not resolve to workdir root\",\n );\n }\n\n // Canonicalize candidate when present to reject symlink escapes.\n try {\n const resolvedReal = await realpath(resolved);\n if (!isPathInside(workdirReal, resolvedReal) || resolvedReal === workdirReal) {\n throw new Error(\n \"PARALLAX_BENCHMARK_PREFLIGHT_VENV resolves outside workdir\",\n );\n }\n } catch (err) {\n const maybeErr = err as NodeJS.ErrnoException;\n if (maybeErr?.code !== \"ENOENT\") throw err;\n const parentReal = await realpath(path.dirname(resolved));\n if (!isPathInside(workdirReal, parentReal)) {\n throw new Error(\n \"PARALLAX_BENCHMARK_PREFLIGHT_VENV parent resolves outside workdir\",\n );\n }\n }\n\n return resolved;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function resolveRequirementsPath(workdir: string): Promise<string | null> {\n const workdirReal = await realpath(path.resolve(workdir));\n const candidates = [\n path.join(workdir, \"apps\", \"api\", \"requirements.txt\"),\n path.join(workdir, \"requirements.txt\"),\n ];\n for (const candidate of candidates) {\n if (!(await fileExists(candidate))) continue;\n try {\n const candidateReal = await realpath(candidate);\n if (isPathInside(workdirReal, candidateReal)) return candidateReal;\n } catch {\n // Ignore malformed candidate and keep scanning.\n }\n }\n return null;\n}\n\nasync function fingerprintRequirementsFile(requirementsPath: string): Promise<string> {\n const file = await readFile(requirementsPath);\n return createHash(\"sha256\").update(file).digest(\"hex\");\n}\n\nasync function runBenchmarkPreflight(workdir: string): Promise<void> {\n if (!shouldAutoPreflight()) return;\n\n const requirementsPath = await resolveRequirementsPath(workdir);\n if (!requirementsPath) return;\n const requirementsFingerprint =\n await fingerprintRequirementsFile(requirementsPath);\n\n const mode =\n process.env.PARALLAX_BENCHMARK_PREFLIGHT_MODE?.toLowerCase() === \"warm\"\n ? \"warm\"\n : \"cold\";\n const venvDir = process.env.PARALLAX_BENCHMARK_PREFLIGHT_VENV || \".benchmark-venv\";\n const venvPath = await resolveSafeVenvPath(workdir, venvDir);\n const pythonInVenv = path.join(\n venvPath,\n process.platform === \"win32\" ? \"Scripts\" : \"bin\",\n process.platform === \"win32\" ? \"python.exe\" : \"python\",\n );\n const key = `${workdir}::${mode}::${venvPath}::${requirementsFingerprint}`;\n if (PREFLIGHT_DONE.has(key)) {\n if (await fileExists(pythonInVenv)) return;\n PREFLIGHT_DONE.delete(key);\n }\n const existing = PREFLIGHT_INFLIGHT.get(key);\n if (existing) {\n await existing;\n return;\n }\n\n const run = (async () => {\n const pythonCommand = process.platform === \"win32\" ? \"python\" : \"python3\";\n\n if (mode === \"cold\") {\n await rm(venvPath, { recursive: true, force: true });\n }\n\n const hasVenv = await fileExists(pythonInVenv);\n if (!hasVenv) {\n await execFileAsync(pythonCommand, [\"-m\", \"venv\", venvPath], {\n cwd: workdir,\n timeout: 120_000,\n maxBuffer: 8 * 1024 * 1024,\n });\n }\n\n await execFileAsync(\n pythonInVenv,\n [\"-m\", \"pip\", \"install\", \"--upgrade\", \"pip\"],\n {\n cwd: workdir,\n timeout: 300_000,\n maxBuffer: 8 * 1024 * 1024,\n },\n );\n\n await execFileAsync(\n pythonInVenv,\n [\"-m\", \"pip\", \"install\", \"-r\", requirementsPath],\n {\n cwd: workdir,\n timeout: 600_000,\n maxBuffer: 16 * 1024 * 1024,\n },\n );\n\n PREFLIGHT_DONE.add(key);\n })();\n PREFLIGHT_INFLIGHT.set(key, run);\n try {\n await run;\n } finally {\n PREFLIGHT_INFLIGHT.delete(key);\n }\n}\n\n/**\n * Handle task-agent routes (/api/coding-agents/*)\n * Returns true if the route was handled, false otherwise\n */\nexport async function handleAgentRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n ctx: RouteContext,\n): Promise<boolean> {\n const method = req.method?.toUpperCase();\n\n // === Preflight Check ===\n // GET /api/coding-agents/preflight\n if (method === \"GET\" && pathname === \"/api/coding-agents/preflight\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const results = await ctx.ptyService.checkAvailableAgents();\n sendJson(res, results as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Preflight check failed\",\n 500,\n );\n }\n return true;\n }\n\n // POST /api/coding-agents/auth/:agent — trigger CLI auth flow\n const authMatch = pathname.match(/^\\/api\\/coding-agents\\/auth\\/(\\w+)$/);\n if (method === \"POST\" && authMatch) {\n const rawAgentType = authMatch[1];\n\n // Validate agent type before instantiating an adapter.\n // Must stay in sync with PTYService.checkAvailableAgents() default list.\n const SUPPORTED_AGENTS: ReadonlyArray<string> = [\n \"claude\",\n \"codex\",\n \"gemini\",\n \"aider\",\n ];\n if (!SUPPORTED_AGENTS.includes(rawAgentType)) {\n sendError(res, `Unsupported agent type: ${rawAgentType}`, 400);\n return true;\n }\n\n const agentType = rawAgentType as import(\"coding-agent-adapters\").AdapterType;\n try {\n const { createAdapter } = await import(\"coding-agent-adapters\");\n const adapter = createAdapter(agentType);\n const result = await adapter.triggerAuth();\n if (!result) {\n sendError(res, `No auth flow available for ${agentType}`, 400);\n } else {\n sendJson(res, result as unknown as JsonValue);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : \"Auth trigger failed\";\n // Defensive fallback: primary input validation is handled by\n // SUPPORTED_AGENTS above, so reaching here means the adapter package's\n // own validation failed (e.g. internal lookup table mismatch). The regex\n // is brittle if `coding-agent-adapters` changes its error wording, but\n // it lets us return 400 instead of 500 for likely client errors.\n const status = /unknown adapter|unsupported/i.test(msg) ? 400 : 500;\n sendError(res, msg, status);\n }\n return true;\n }\n\n // GET /api/coding-agents/metrics\n if (method === \"GET\" && pathname === \"/api/coding-agents/metrics\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n sendJson(res, ctx.ptyService.getAgentMetrics() as unknown as JsonValue);\n return true;\n }\n\n // === Scratch Workspace Retention ===\n // GET /api/coding-agents/scratch\n if (method === \"GET\" && pathname === \"/api/coding-agents/scratch\") {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n sendJson(\n res,\n ctx.workspaceService.listScratchWorkspaces() as unknown as JsonValue,\n );\n return true;\n }\n\n // POST /api/coding-agents/:id/scratch/(keep|delete|promote)\n const scratchActionMatch = pathname.match(\n /^\\/api\\/coding-agents\\/([^/]+)\\/scratch\\/(keep|delete|promote)$/,\n );\n if (method === \"POST\" && scratchActionMatch) {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n const sessionId = scratchActionMatch[1];\n const action = scratchActionMatch[2];\n try {\n if (action === \"keep\") {\n const scratch = await ctx.workspaceService.keepScratchWorkspace(\n sessionId,\n );\n sendJson(res, { success: true, scratch } as unknown as JsonValue);\n return true;\n }\n if (action === \"delete\") {\n await ctx.workspaceService.deleteScratchWorkspace(sessionId);\n sendJson(\n res,\n { success: true, deleted: true, sessionId } as unknown as JsonValue,\n );\n return true;\n }\n const body = await parseBody(req);\n const promoteName =\n typeof body.name === \"string\" ? body.name : undefined;\n const scratch = await ctx.workspaceService.promoteScratchWorkspace(\n sessionId,\n promoteName,\n );\n sendJson(res, { success: true, scratch } as unknown as JsonValue);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const status = message.includes(\"not found\") ? 404 : 500;\n sendError(res, message, status);\n }\n return true;\n }\n\n // === Workspace Files ===\n // GET /api/coding-agents/workspace-files?agentType=claude\n if (method === \"GET\" && pathname === \"/api/coding-agents/workspace-files\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const url = new URL(req.url || \"\", `http://${req.headers.host}`);\n const agentType = url.searchParams.get(\"agentType\");\n if (!agentType) {\n sendError(\n res,\n \"agentType query parameter required (claude, gemini, codex, aider, pi)\",\n 400,\n );\n return true;\n }\n\n if (isPiAgentType(agentType)) {\n sendJson(res, {\n agentType: \"pi\",\n memoryFilePath: \".pi/agent/settings.json\",\n files: [],\n } as unknown as JsonValue);\n return true;\n }\n\n const files = ctx.ptyService.getWorkspaceFiles(\n agentType as import(\"coding-agent-adapters\").AdapterType,\n );\n const memoryFilePath = ctx.ptyService.getMemoryFilePath(\n agentType as import(\"coding-agent-adapters\").AdapterType,\n );\n sendJson(res, {\n agentType,\n memoryFilePath,\n files,\n } as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error\n ? error.message\n : \"Failed to get workspace files\",\n 500,\n );\n }\n return true;\n }\n\n // === Approval Presets ===\n // GET /api/coding-agents/approval-presets\n if (method === \"GET\" && pathname === \"/api/coding-agents/approval-presets\") {\n try {\n const { listPresets } = await import(\"coding-agent-adapters\");\n const presets = listPresets();\n sendJson(res, presets as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to list presets\",\n 500,\n );\n }\n return true;\n }\n\n // GET /api/coding-agents/settings\n if (method === \"GET\" && pathname === \"/api/coding-agents/settings\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n const frameworkState = await getTaskAgentFrameworkState(\n ctx.runtime,\n ctx.ptyService,\n );\n sendJson(res, {\n defaultApprovalPreset: ctx.ptyService.defaultApprovalPreset,\n agentSelectionStrategy: ctx.ptyService.agentSelectionStrategy,\n defaultAgentType: ctx.ptyService.defaultAgentType,\n preferredAgentType: frameworkState.preferred.id,\n preferredAgentReason: frameworkState.preferred.reason,\n configuredSubscriptionProvider: frameworkState.configuredSubscriptionProvider,\n frameworks: frameworkState.frameworks,\n } as unknown as JsonValue);\n return true;\n }\n\n // GET /api/coding-agents/approval-config?agentType=claude&preset=autonomous\n if (method === \"GET\" && pathname === \"/api/coding-agents/approval-config\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n const url = new URL(req.url || \"\", `http://${req.headers.host}`);\n const agentType = url.searchParams.get(\"agentType\");\n const preset = url.searchParams.get(\"preset\");\n if (!agentType || !preset) {\n sendError(res, \"agentType and preset query parameters required\", 400);\n return true;\n }\n\n try {\n const config = ctx.ptyService.getApprovalConfig(\n agentType as import(\"coding-agent-adapters\").AdapterType,\n preset as import(\"coding-agent-adapters\").ApprovalPreset,\n );\n sendJson(res, config as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to generate config\",\n 500,\n );\n }\n return true;\n }\n\n // === List Agents ===\n // GET /api/coding-agents\n if (method === \"GET\" && pathname === \"/api/coding-agents\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const sessions = await ctx.ptyService.listSessions();\n sendJson(res, sessions as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to list agents\",\n 500,\n );\n }\n return true;\n }\n\n // === Spawn Agent ===\n // POST /api/coding-agents/spawn\n if (method === \"POST\" && pathname === \"/api/coding-agents/spawn\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const body = await parseBody(req);\n const {\n agentType,\n workdir: rawWorkdir,\n task,\n memoryContent,\n approvalPreset,\n customCredentials,\n metadata,\n } = body;\n\n // Validate workdir: must be within workspace base dir or cwd\n const workspaceBaseDir = path.join(os.homedir(), \".milady\", \"workspaces\");\n const workspaceBaseDirResolved = path.resolve(workspaceBaseDir);\n const cwdResolved = path.resolve(process.cwd());\n const workspaceBaseDirReal = await realpath(workspaceBaseDirResolved).catch(\n () => workspaceBaseDirResolved,\n );\n const cwdReal = await realpath(cwdResolved).catch(() => cwdResolved);\n const allowedPrefixes = [workspaceBaseDirReal, cwdReal];\n let workdir = rawWorkdir as string | undefined;\n if (workdir) {\n const resolved = path.resolve(workdir);\n const resolvedReal = await realpath(resolved).catch(() => null);\n if (!resolvedReal) {\n sendError(res, \"workdir must exist\", 403);\n return true;\n }\n const isAllowed = allowedPrefixes.some(\n (prefix) =>\n resolvedReal === prefix || resolvedReal.startsWith(prefix + path.sep),\n );\n if (!isAllowed) {\n sendError(\n res,\n \"workdir must be within workspace base directory or cwd\",\n 403,\n );\n return true;\n }\n workdir = resolvedReal;\n }\n\n // Check concurrency limit before spawning\n const activeSessions = await ctx.ptyService.listSessions();\n const maxSessions = 8;\n if (activeSessions.length >= maxSessions) {\n sendError(\n res,\n `Concurrent session limit reached (${maxSessions})`,\n 429,\n );\n return true;\n }\n\n if (workdir) {\n try {\n await runBenchmarkPreflight(workdir);\n } catch (preflightError) {\n console.warn(\n `[coding-agent] benchmark preflight failed for ${workdir}:`,\n preflightError,\n );\n }\n }\n\n // Build credentials from runtime\n const credentials = {\n anthropicKey: ctx.runtime.getSetting(\"ANTHROPIC_API_KEY\") as\n | string\n | undefined,\n openaiKey: ctx.runtime.getSetting(\"OPENAI_API_KEY\") as\n | string\n | undefined,\n googleKey: ctx.runtime.getSetting(\"GOOGLE_GENERATIVE_AI_API_KEY\") as\n | string\n | undefined,\n githubToken: ctx.runtime.getSetting(\"GITHUB_TOKEN\") as\n | string\n | undefined,\n };\n\n // Read model preferences from runtime settings\n const agentStr = agentType\n ? (agentType as string).toLowerCase()\n : await ctx.ptyService.resolveAgentType();\n const piRequested = isPiAgentType(agentStr);\n const normalizedType = normalizeAgentType(agentStr);\n const prefixMap: Record<string, string> = {\n claude: \"PARALLAX_CLAUDE\",\n gemini: \"PARALLAX_GEMINI\",\n codex: \"PARALLAX_CODEX\",\n aider: \"PARALLAX_AIDER\",\n };\n const prefix = prefixMap[agentStr];\n const modelPowerful = prefix\n ? (ctx.runtime.getSetting(`${prefix}_MODEL_POWERFUL`) as string | null)\n : null;\n const modelFast = prefix\n ? (ctx.runtime.getSetting(`${prefix}_MODEL_FAST`) as string | null)\n : null;\n const aiderProvider =\n agentStr === \"aider\"\n ? (ctx.runtime.getSetting(\"PARALLAX_AIDER_PROVIDER\") as string | null)\n : null;\n\n // Check if coordinator is active — route blocking prompts through it\n const coordinator = getCoordinator(ctx.runtime);\n const requestedThreadId =\n typeof (metadata as Record<string, unknown>)?.threadId === \"string\"\n ? ((metadata as Record<string, unknown>).threadId as string)\n : null;\n const taskThread =\n coordinator && task && !requestedThreadId\n ? await coordinator.createTaskThread({\n title:\n ((metadata as Record<string, unknown>)?.label as string | undefined) ??\n `Task ${Date.now()}`,\n originalRequest: task as string,\n kind: \"coding\",\n metadata: {\n workdir: workdir ?? null,\n source: \"api-spawn\",\n },\n })\n : requestedThreadId\n ? await coordinator?.getTaskThread(requestedThreadId)\n : null;\n\n const session = await ctx.ptyService.spawnSession({\n name: `agent-${Date.now()}`,\n agentType: normalizedType,\n workdir: workdir as string,\n initialTask: piRequested\n ? toPiCommand(task as string | undefined)\n : (task as string),\n memoryContent: memoryContent as string | undefined,\n credentials,\n approvalPreset: approvalPreset as\n | import(\"coding-agent-adapters\").ApprovalPreset\n | undefined,\n customCredentials: customCredentials as\n | Record<string, string>\n | undefined,\n // Let adapter auto-response handle known prompts (permissions, trust, etc.)\n // instantly. The coordinator handles only unrecognized prompts via LLM.\n metadata: {\n threadId: taskThread?.id ?? requestedThreadId,\n requestedType: agentStr,\n ...(metadata as Record<string, unknown>),\n ...(aiderProvider ? { provider: aiderProvider } : {}),\n modelPrefs: {\n ...(modelPowerful ? { powerful: modelPowerful } : {}),\n ...(modelFast ? { fast: modelFast } : {}),\n },\n },\n });\n if (coordinator && task) {\n const label = (metadata as Record<string, unknown>)?.label as\n | string\n | undefined;\n await coordinator.registerTask(session.id, {\n threadId: taskThread?.id ?? requestedThreadId ?? session.id,\n agentType:\n agentStr as import(\"../services/pty-service.js\").CodingAgentType,\n label: label || `agent-${session.id.slice(-8)}`,\n originalTask: task as string,\n workdir: session.workdir,\n });\n }\n\n sendJson(\n res,\n {\n sessionId: session.id,\n agentType: session.agentType,\n workdir: session.workdir,\n status: session.status,\n } as unknown as JsonValue,\n 201,\n );\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to spawn agent\",\n 500,\n );\n }\n return true;\n }\n\n // === Get Agent Status ===\n // GET /api/coding-agents/:id\n const agentMatch = pathname.match(/^\\/api\\/coding-agents\\/([^/]+)$/);\n if (method === \"GET\" && agentMatch) {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n const sessionId = agentMatch[1];\n const session = ctx.ptyService.getSession(sessionId);\n\n if (!session) {\n sendError(res, \"Agent session not found\", 404);\n return true;\n }\n\n sendJson(res, session as unknown as JsonValue);\n return true;\n }\n\n // === Send to Agent ===\n // POST /api/coding-agents/:id/send\n const sendMatch = pathname.match(/^\\/api\\/coding-agents\\/([^/]+)\\/send$/);\n if (method === \"POST\" && sendMatch) {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const sessionId = sendMatch[1];\n const body = await parseBody(req);\n const { input, keys } = body;\n\n if (keys) {\n // Send special keys (e.g. \"enter\", [\"down\",\"enter\"], \"Ctrl-C\")\n await ctx.ptyService.sendKeysToSession(\n sessionId,\n keys as string | string[],\n );\n sendJson(res, { success: true });\n } else if (input && typeof input === \"string\") {\n await ctx.ptyService.sendToSession(sessionId, input);\n sendJson(res, { success: true });\n } else {\n sendError(\n res,\n \"Either 'input' (string) or 'keys' (string|string[]) required\",\n 400,\n );\n return true;\n }\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to send input\",\n 500,\n );\n }\n return true;\n }\n\n // === Stop Agent ===\n // POST /api/coding-agents/:id/stop\n const stopMatch = pathname.match(/^\\/api\\/coding-agents\\/([^/]+)\\/stop$/);\n if (method === \"POST\" && stopMatch) {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const sessionId = stopMatch[1];\n await ctx.ptyService.stopSession(sessionId);\n sendJson(res, { success: true, sessionId });\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to stop agent\",\n 500,\n );\n }\n return true;\n }\n\n // === Get Agent Output ===\n // GET /api/coding-agents/:id/output\n const outputMatch = pathname.match(/^\\/api\\/coding-agents\\/([^/]+)\\/output$/);\n if (method === \"GET\" && outputMatch) {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const sessionId = outputMatch[1];\n const url = new URL(req.url || \"\", `http://${req.headers.host}`);\n const lines = parseInt(url.searchParams.get(\"lines\") || \"100\", 10);\n\n const output = await ctx.ptyService.getSessionOutput(sessionId, lines);\n sendJson(res, { sessionId, output });\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to get output\",\n 500,\n );\n }\n return true;\n }\n\n // === Get Buffered Terminal Output (raw ANSI for xterm.js hydration) ===\n // GET /api/coding-agents/:id/buffered-output\n const bufferedMatch = pathname.match(\n /^\\/api\\/coding-agents\\/([^/]+)\\/buffered-output$/,\n );\n if (method === \"GET\" && bufferedMatch) {\n if (!ctx.ptyService?.consoleBridge) {\n sendError(res, \"Console bridge not available\", 503);\n return true;\n }\n try {\n const sessionId = bufferedMatch[1];\n const output = ctx.ptyService.consoleBridge.getBufferedOutput(sessionId);\n sendJson(res, { sessionId, output });\n } catch (error) {\n sendError(\n res,\n error instanceof Error\n ? error.message\n : \"Failed to get buffered output\",\n 500,\n );\n }\n return true;\n }\n\n // Route not handled\n return false;\n}\n",
|
|
76
|
-
"/**\n * Swarm Coordinator Route Handlers\n *\n * Provides SSE streaming and HTTP API for the coordination layer:\n * - SSE event stream for real-time dashboard\n * - Task status and context queries\n * - Pending confirmation management\n * - Supervision level control\n *\n * @module api/coordinator-routes\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { SwarmCoordinator } from \"../services/swarm-coordinator.js\";\nimport type { TaskThreadStatus } from \"../services/task-registry.js\";\nimport { getTaskAgentFrameworkState } from \"../services/task-agent-frameworks.js\";\nimport type { RouteContext } from \"./routes.js\";\nimport { parseBody, sendError, sendJson } from \"./routes.js\";\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nconst COORDINATOR_PREFIX = \"/api/coding-agents/coordinator\";\n\n/**\n * Handle coordinator routes (/api/coding-agents/coordinator/*)\n * Returns true if the route was handled, false otherwise.\n */\nexport async function handleCoordinatorRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n ctx: RouteContext & { coordinator?: SwarmCoordinator },\n): Promise<boolean> {\n if (!pathname.startsWith(COORDINATOR_PREFIX)) {\n return false;\n }\n\n const method = req.method?.toUpperCase();\n const subPath = pathname.slice(COORDINATOR_PREFIX.length);\n\n if (!ctx.coordinator) {\n sendError(res, \"Swarm Coordinator not available\", 503);\n return true;\n }\n\n const coordinator = ctx.coordinator;\n\n // === SSE Event Stream ===\n // GET /api/coding-agents/coordinator/events\n if (method === \"GET\" && subPath === \"/events\") {\n // CORS is handled by the server middleware — no need to set it here.\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n // Send initial comment to establish connection\n res.write(\":ok\\n\\n\");\n\n // Register as SSE client (sends snapshot on connect)\n const unsubscribe = coordinator.addSseClient(res);\n\n // Clean up on close\n req.on(\"close\", unsubscribe);\n\n // Keep-alive ping every 30s\n const keepAlive = setInterval(() => {\n if (res.writableEnded) {\n clearInterval(keepAlive);\n return;\n }\n res.write(\":ping\\n\\n\");\n }, 30_000);\n\n req.on(\"close\", () => clearInterval(keepAlive));\n\n return true;\n }\n\n // === All Task Contexts ===\n // GET /api/coding-agents/coordinator/status\n if (method === \"GET\" && subPath === \"/status\") {\n const allTasks = coordinator.getAllTaskContexts();\n const persistedThreads = await coordinator.listTaskThreads({\n includeArchived: false,\n limit: 50,\n });\n // Only return active tasks — stopped/completed/error are terminal states\n // and should not appear in the UI after refresh.\n const tasks = allTasks.filter(\n (t) => t.status !== \"stopped\" && t.status !== \"completed\" && t.status !== \"error\",\n );\n const recentTasks = allTasks\n .slice()\n .sort((left, right) => right.registeredAt - left.registeredAt)\n .slice(0, 10);\n const frameworkState = await getTaskAgentFrameworkState(\n ctx.runtime,\n ctx.ptyService ?? undefined,\n );\n sendJson(res, {\n supervisionLevel: coordinator.getSupervisionLevel(),\n taskCount: tasks.length,\n tasks: tasks.map((t) => ({\n threadId: t.threadId,\n sessionId: t.sessionId,\n agentType: t.agentType,\n label: t.label,\n originalTask: t.originalTask,\n workdir: t.workdir,\n status: t.status,\n decisionCount: t.decisions.length,\n autoResolvedCount: t.autoResolvedCount,\n completionSummary: t.completionSummary,\n lastActivityAt: t.lastActivityAt,\n })),\n recentTasks: recentTasks.map((t) => ({\n threadId: t.threadId,\n sessionId: t.sessionId,\n agentType: t.agentType,\n label: t.label,\n status: t.status,\n originalTask: t.originalTask,\n completionSummary: t.completionSummary,\n registeredAt: t.registeredAt,\n lastActivityAt: t.lastActivityAt,\n })),\n taskThreadCount: persistedThreads.length,\n taskThreads: persistedThreads.map((thread) => ({\n id: thread.id,\n title: thread.title,\n kind: thread.kind,\n status: thread.status,\n originalRequest: thread.originalRequest,\n summary: thread.summary,\n sessionCount: thread.sessionCount,\n activeSessionCount: thread.activeSessionCount,\n latestSessionId: thread.latestSessionId,\n latestSessionLabel: thread.latestSessionLabel,\n latestWorkdir: thread.latestWorkdir,\n latestRepo: thread.latestRepo,\n latestActivityAt: thread.latestActivityAt,\n decisionCount: thread.decisionCount,\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n closedAt: thread.closedAt,\n archivedAt: thread.archivedAt,\n })),\n pendingConfirmations: coordinator.getPendingConfirmations().length,\n preferredAgentType: frameworkState.preferred.id,\n preferredAgentReason: frameworkState.preferred.reason,\n frameworks: frameworkState.frameworks,\n } as unknown as JsonValue);\n return true;\n }\n\n // === Task Threads ===\n // GET /api/coding-agents/coordinator/threads\n if (method === \"GET\" && subPath === \"/threads\") {\n const url = new URL(req.url ?? pathname, \"http://localhost\");\n const includeArchived = url.searchParams.get(\"includeArchived\") === \"true\";\n const status = url.searchParams.get(\"status\") ?? undefined;\n const search = url.searchParams.get(\"search\") ?? undefined;\n const limitRaw = url.searchParams.get(\"limit\");\n const limit =\n limitRaw && Number.isFinite(Number(limitRaw)) ? Number(limitRaw) : undefined;\n\n const threads = await coordinator.listTaskThreads({\n includeArchived,\n status: (status as TaskThreadStatus | null) ?? undefined,\n search,\n limit,\n });\n sendJson(res, threads as unknown as JsonValue);\n return true;\n }\n\n // GET /api/coding-agents/coordinator/threads/:threadId\n const threadMatch = subPath.match(/^\\/threads\\/([^/]+)$/);\n if (method === \"GET\" && threadMatch) {\n const thread = await coordinator.getTaskThread(threadMatch[1]);\n if (!thread) {\n sendError(res, \"Task thread not found\", 404);\n return true;\n }\n sendJson(res, thread as unknown as JsonValue);\n return true;\n }\n\n // POST /api/coding-agents/coordinator/threads/:threadId/archive\n const archiveMatch = subPath.match(/^\\/threads\\/([^/]+)\\/archive$/);\n if (method === \"POST\" && archiveMatch) {\n await coordinator.archiveTaskThread(archiveMatch[1]);\n sendJson(res, { success: true, threadId: archiveMatch[1], status: \"archived\" });\n return true;\n }\n\n // POST /api/coding-agents/coordinator/threads/:threadId/reopen\n const reopenMatch = subPath.match(/^\\/threads\\/([^/]+)\\/reopen$/);\n if (method === \"POST\" && reopenMatch) {\n await coordinator.reopenTaskThread(reopenMatch[1]);\n sendJson(res, { success: true, threadId: reopenMatch[1], status: \"open\" });\n return true;\n }\n\n // === Single Task Context ===\n // GET /api/coding-agents/coordinator/tasks/:sessionId\n const taskMatch = subPath.match(/^\\/tasks\\/([^/]+)$/);\n if (method === \"GET\" && taskMatch) {\n const sessionId = taskMatch[1];\n const task = await coordinator.getTaskContextSnapshot(sessionId);\n if (!task) {\n sendError(res, \"Task context not found\", 404);\n return true;\n }\n sendJson(res, task as unknown as JsonValue);\n return true;\n }\n\n // === Pending Confirmations ===\n // GET /api/coding-agents/coordinator/pending\n if (method === \"GET\" && subPath === \"/pending\") {\n const pending = coordinator.getPendingConfirmations();\n sendJson(\n res,\n pending.map((p) => ({\n sessionId: p.sessionId,\n promptText: p.promptText,\n suggestedAction: p.llmDecision.action,\n suggestedResponse: p.llmDecision.response,\n reasoning: p.llmDecision.reasoning,\n agentType: p.taskContext.agentType,\n label: p.taskContext.label,\n createdAt: p.createdAt,\n })) as unknown as JsonValue,\n );\n return true;\n }\n\n // === Confirm/Reject Pending Decision ===\n // POST /api/coding-agents/coordinator/confirm/:sessionId\n const confirmMatch = subPath.match(/^\\/confirm\\/([^/]+)$/);\n if (method === \"POST\" && confirmMatch) {\n try {\n const sessionId = confirmMatch[1];\n const body = await parseBody(req);\n const approved = body.approved !== false; // default: approved\n const override = body.override as\n | { response?: string; useKeys?: boolean; keys?: string[] }\n | undefined;\n\n await coordinator.confirmDecision(sessionId, approved, override);\n sendJson(res, { success: true, sessionId, approved });\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to confirm decision\",\n error instanceof Error && error.message.includes(\"No pending\")\n ? 404\n : 500,\n );\n }\n return true;\n }\n\n // === Supervision Level ===\n // GET /api/coding-agents/coordinator/supervision\n if (method === \"GET\" && subPath === \"/supervision\") {\n sendJson(res, { level: coordinator.getSupervisionLevel() });\n return true;\n }\n\n // POST /api/coding-agents/coordinator/supervision\n if (method === \"POST\" && subPath === \"/supervision\") {\n try {\n const body = await parseBody(req);\n const level = body.level as string;\n if (![\"autonomous\", \"confirm\", \"notify\"].includes(level)) {\n sendError(\n res,\n 'Invalid supervision level. Must be \"autonomous\", \"confirm\", or \"notify\"',\n 400,\n );\n return true;\n }\n coordinator.setSupervisionLevel(\n level as \"autonomous\" | \"confirm\" | \"notify\",\n );\n sendJson(res, { success: true, level });\n } catch (error) {\n sendError(\n res,\n error instanceof Error\n ? error.message\n : \"Failed to set supervision level\",\n 500,\n );\n }\n return true;\n }\n\n // Not a coordinator route we recognize\n return false;\n}\n",
|
|
83
|
+
"/**\n * Task Agent Route Handlers\n *\n * Handles routes for PTY-based task-agent management:\n * - Preflight checks, metrics, workspace files\n * - Approval presets and config\n * - Agent CRUD: list, spawn, get, send, stop, output\n *\n * @module api/agent-routes\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { access, readFile, realpath, rm } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport {\n isPiAgentType,\n normalizeAgentType,\n toPiCommand,\n} from \"../services/pty-types.js\";\nimport { getTaskAgentFrameworkState } from \"../services/task-agent-frameworks.js\";\nimport { extractEvalRunMetadata } from \"../actions/eval-metadata.js\";\nimport type { RouteContext } from \"./routes.js\";\nimport { parseBody, sendError, sendJson } from \"./routes.js\";\n\nconst execFileAsync = promisify(execFile);\nconst PREFLIGHT_DONE = new Set<string>();\nconst PREFLIGHT_INFLIGHT = new Map<string, Promise<void>>();\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nfunction shouldAutoPreflight(): boolean {\n if (process.env.PARALLAX_BENCHMARK_PREFLIGHT_AUTO === \"1\") return true;\n return false;\n}\n\nfunction isPathInside(parent: string, candidate: string): boolean {\n return candidate === parent || candidate.startsWith(`${parent}${path.sep}`);\n}\n\nasync function resolveSafeVenvPath(\n workdir: string,\n venvDirRaw: string,\n): Promise<string> {\n const venvDir = venvDirRaw.trim();\n if (!venvDir) {\n throw new Error(\"PARALLAX_BENCHMARK_PREFLIGHT_VENV must be non-empty\");\n }\n if (path.isAbsolute(venvDir)) {\n throw new Error(\n \"PARALLAX_BENCHMARK_PREFLIGHT_VENV must be relative to workdir\",\n );\n }\n\n const normalized = path.normalize(venvDir);\n if (\n normalized === \".\" ||\n normalized === \"..\" ||\n normalized.startsWith(`..${path.sep}`)\n ) {\n throw new Error(\n \"PARALLAX_BENCHMARK_PREFLIGHT_VENV must stay within workdir\",\n );\n }\n\n const workdirResolved = path.resolve(workdir);\n const workdirReal = await realpath(workdirResolved);\n const resolved = path.resolve(workdirReal, normalized);\n if (!isPathInside(workdirReal, resolved)) {\n throw new Error(\n \"PARALLAX_BENCHMARK_PREFLIGHT_VENV resolves outside workdir\",\n );\n }\n if (resolved === workdirReal) {\n throw new Error(\n \"PARALLAX_BENCHMARK_PREFLIGHT_VENV must not resolve to workdir root\",\n );\n }\n\n // Canonicalize candidate when present to reject symlink escapes.\n try {\n const resolvedReal = await realpath(resolved);\n if (!isPathInside(workdirReal, resolvedReal) || resolvedReal === workdirReal) {\n throw new Error(\n \"PARALLAX_BENCHMARK_PREFLIGHT_VENV resolves outside workdir\",\n );\n }\n } catch (err) {\n const maybeErr = err as NodeJS.ErrnoException;\n if (maybeErr?.code !== \"ENOENT\") throw err;\n const parentReal = await realpath(path.dirname(resolved));\n if (!isPathInside(workdirReal, parentReal)) {\n throw new Error(\n \"PARALLAX_BENCHMARK_PREFLIGHT_VENV parent resolves outside workdir\",\n );\n }\n }\n\n return resolved;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function resolveRequirementsPath(workdir: string): Promise<string | null> {\n const workdirReal = await realpath(path.resolve(workdir));\n const candidates = [\n path.join(workdir, \"apps\", \"api\", \"requirements.txt\"),\n path.join(workdir, \"requirements.txt\"),\n ];\n for (const candidate of candidates) {\n if (!(await fileExists(candidate))) continue;\n try {\n const candidateReal = await realpath(candidate);\n if (isPathInside(workdirReal, candidateReal)) return candidateReal;\n } catch {\n // Ignore malformed candidate and keep scanning.\n }\n }\n return null;\n}\n\nasync function fingerprintRequirementsFile(requirementsPath: string): Promise<string> {\n const file = await readFile(requirementsPath);\n return createHash(\"sha256\").update(file).digest(\"hex\");\n}\n\nasync function runBenchmarkPreflight(workdir: string): Promise<void> {\n if (!shouldAutoPreflight()) return;\n\n const requirementsPath = await resolveRequirementsPath(workdir);\n if (!requirementsPath) return;\n const requirementsFingerprint =\n await fingerprintRequirementsFile(requirementsPath);\n\n const mode =\n process.env.PARALLAX_BENCHMARK_PREFLIGHT_MODE?.toLowerCase() === \"warm\"\n ? \"warm\"\n : \"cold\";\n const venvDir = process.env.PARALLAX_BENCHMARK_PREFLIGHT_VENV || \".benchmark-venv\";\n const venvPath = await resolveSafeVenvPath(workdir, venvDir);\n const pythonInVenv = path.join(\n venvPath,\n process.platform === \"win32\" ? \"Scripts\" : \"bin\",\n process.platform === \"win32\" ? \"python.exe\" : \"python\",\n );\n const key = `${workdir}::${mode}::${venvPath}::${requirementsFingerprint}`;\n if (PREFLIGHT_DONE.has(key)) {\n if (await fileExists(pythonInVenv)) return;\n PREFLIGHT_DONE.delete(key);\n }\n const existing = PREFLIGHT_INFLIGHT.get(key);\n if (existing) {\n await existing;\n return;\n }\n\n const run = (async () => {\n const pythonCommand = process.platform === \"win32\" ? \"python\" : \"python3\";\n\n if (mode === \"cold\") {\n await rm(venvPath, { recursive: true, force: true });\n }\n\n const hasVenv = await fileExists(pythonInVenv);\n if (!hasVenv) {\n await execFileAsync(pythonCommand, [\"-m\", \"venv\", venvPath], {\n cwd: workdir,\n timeout: 120_000,\n maxBuffer: 8 * 1024 * 1024,\n });\n }\n\n await execFileAsync(\n pythonInVenv,\n [\"-m\", \"pip\", \"install\", \"--upgrade\", \"pip\"],\n {\n cwd: workdir,\n timeout: 300_000,\n maxBuffer: 8 * 1024 * 1024,\n },\n );\n\n await execFileAsync(\n pythonInVenv,\n [\"-m\", \"pip\", \"install\", \"-r\", requirementsPath],\n {\n cwd: workdir,\n timeout: 600_000,\n maxBuffer: 16 * 1024 * 1024,\n },\n );\n\n PREFLIGHT_DONE.add(key);\n })();\n PREFLIGHT_INFLIGHT.set(key, run);\n try {\n await run;\n } finally {\n PREFLIGHT_INFLIGHT.delete(key);\n }\n}\n\n/**\n * Handle task-agent routes (/api/coding-agents/*)\n * Returns true if the route was handled, false otherwise\n */\nexport async function handleAgentRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n ctx: RouteContext,\n): Promise<boolean> {\n const method = req.method?.toUpperCase();\n\n // === Preflight Check ===\n // GET /api/coding-agents/preflight\n if (method === \"GET\" && pathname === \"/api/coding-agents/preflight\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const results = await ctx.ptyService.checkAvailableAgents();\n sendJson(res, results as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Preflight check failed\",\n 500,\n );\n }\n return true;\n }\n\n // POST /api/coding-agents/auth/:agent — trigger CLI auth flow\n const authMatch = pathname.match(/^\\/api\\/coding-agents\\/auth\\/(\\w+)$/);\n if (method === \"POST\" && authMatch) {\n const rawAgentType = authMatch[1];\n\n // Validate agent type before instantiating an adapter.\n // Must stay in sync with PTYService.checkAvailableAgents() default list.\n const SUPPORTED_AGENTS: ReadonlyArray<string> = [\n \"claude\",\n \"codex\",\n \"gemini\",\n \"aider\",\n ];\n if (!SUPPORTED_AGENTS.includes(rawAgentType)) {\n sendError(res, `Unsupported agent type: ${rawAgentType}`, 400);\n return true;\n }\n\n const agentType = rawAgentType as import(\"coding-agent-adapters\").AdapterType;\n try {\n const { createAdapter } = await import(\"coding-agent-adapters\");\n const adapter = createAdapter(agentType);\n const result = await (\n adapter as typeof adapter & {\n triggerAuth?: () => Promise<unknown>;\n }\n ).triggerAuth?.();\n if (!result) {\n sendError(res, `No auth flow available for ${agentType}`, 400);\n } else {\n sendJson(res, result as unknown as JsonValue);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : \"Auth trigger failed\";\n // Defensive fallback: primary input validation is handled by\n // SUPPORTED_AGENTS above, so reaching here means the adapter package's\n // own validation failed (e.g. internal lookup table mismatch). The regex\n // is brittle if `coding-agent-adapters` changes its error wording, but\n // it lets us return 400 instead of 500 for likely client errors.\n const status = /unknown adapter|unsupported/i.test(msg) ? 400 : 500;\n sendError(res, msg, status);\n }\n return true;\n }\n\n // GET /api/coding-agents/metrics\n if (method === \"GET\" && pathname === \"/api/coding-agents/metrics\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n sendJson(res, ctx.ptyService.getAgentMetrics() as unknown as JsonValue);\n return true;\n }\n\n // === Scratch Workspace Retention ===\n // GET /api/coding-agents/scratch\n if (method === \"GET\" && pathname === \"/api/coding-agents/scratch\") {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n sendJson(\n res,\n ctx.workspaceService.listScratchWorkspaces() as unknown as JsonValue,\n );\n return true;\n }\n\n // POST /api/coding-agents/:id/scratch/(keep|delete|promote)\n const scratchActionMatch = pathname.match(\n /^\\/api\\/coding-agents\\/([^/]+)\\/scratch\\/(keep|delete|promote)$/,\n );\n if (method === \"POST\" && scratchActionMatch) {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n const sessionId = scratchActionMatch[1];\n const action = scratchActionMatch[2];\n try {\n if (action === \"keep\") {\n const scratch = await ctx.workspaceService.keepScratchWorkspace(\n sessionId,\n );\n sendJson(res, { success: true, scratch } as unknown as JsonValue);\n return true;\n }\n if (action === \"delete\") {\n await ctx.workspaceService.deleteScratchWorkspace(sessionId);\n sendJson(\n res,\n { success: true, deleted: true, sessionId } as unknown as JsonValue,\n );\n return true;\n }\n const body = await parseBody(req);\n const promoteName =\n typeof body.name === \"string\" ? body.name : undefined;\n const scratch = await ctx.workspaceService.promoteScratchWorkspace(\n sessionId,\n promoteName,\n );\n sendJson(res, { success: true, scratch } as unknown as JsonValue);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const status = message.includes(\"not found\") ? 404 : 500;\n sendError(res, message, status);\n }\n return true;\n }\n\n // === Workspace Files ===\n // GET /api/coding-agents/workspace-files?agentType=claude\n if (method === \"GET\" && pathname === \"/api/coding-agents/workspace-files\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const url = new URL(req.url || \"\", `http://${req.headers.host}`);\n const agentType = url.searchParams.get(\"agentType\");\n if (!agentType) {\n sendError(\n res,\n \"agentType query parameter required (claude, gemini, codex, aider, pi)\",\n 400,\n );\n return true;\n }\n\n if (isPiAgentType(agentType)) {\n sendJson(res, {\n agentType: \"pi\",\n memoryFilePath: \".pi/agent/settings.json\",\n files: [],\n } as unknown as JsonValue);\n return true;\n }\n\n const files = ctx.ptyService.getWorkspaceFiles(\n agentType as import(\"coding-agent-adapters\").AdapterType,\n );\n const memoryFilePath = ctx.ptyService.getMemoryFilePath(\n agentType as import(\"coding-agent-adapters\").AdapterType,\n );\n sendJson(res, {\n agentType,\n memoryFilePath,\n files,\n } as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error\n ? error.message\n : \"Failed to get workspace files\",\n 500,\n );\n }\n return true;\n }\n\n // === Approval Presets ===\n // GET /api/coding-agents/approval-presets\n if (method === \"GET\" && pathname === \"/api/coding-agents/approval-presets\") {\n try {\n const { listPresets } = await import(\"coding-agent-adapters\");\n const presets = listPresets();\n sendJson(res, presets as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to list presets\",\n 500,\n );\n }\n return true;\n }\n\n // GET /api/coding-agents/settings\n if (method === \"GET\" && pathname === \"/api/coding-agents/settings\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n const frameworkState = await getTaskAgentFrameworkState(\n ctx.runtime,\n ctx.ptyService,\n );\n sendJson(res, {\n defaultApprovalPreset: ctx.ptyService.defaultApprovalPreset,\n agentSelectionStrategy: ctx.ptyService.agentSelectionStrategy,\n defaultAgentType: ctx.ptyService.defaultAgentType,\n preferredAgentType: frameworkState.preferred.id,\n preferredAgentReason: frameworkState.preferred.reason,\n configuredSubscriptionProvider: frameworkState.configuredSubscriptionProvider,\n frameworks: frameworkState.frameworks,\n } as unknown as JsonValue);\n return true;\n }\n\n // GET /api/coding-agents/approval-config?agentType=claude&preset=autonomous\n if (method === \"GET\" && pathname === \"/api/coding-agents/approval-config\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n const url = new URL(req.url || \"\", `http://${req.headers.host}`);\n const agentType = url.searchParams.get(\"agentType\");\n const preset = url.searchParams.get(\"preset\");\n if (!agentType || !preset) {\n sendError(res, \"agentType and preset query parameters required\", 400);\n return true;\n }\n\n try {\n const config = ctx.ptyService.getApprovalConfig(\n agentType as import(\"coding-agent-adapters\").AdapterType,\n preset as import(\"coding-agent-adapters\").ApprovalPreset,\n );\n sendJson(res, config as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to generate config\",\n 500,\n );\n }\n return true;\n }\n\n // === List Agents ===\n // GET /api/coding-agents\n if (method === \"GET\" && pathname === \"/api/coding-agents\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const sessions = await ctx.ptyService.listSessions();\n sendJson(res, sessions as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to list agents\",\n 500,\n );\n }\n return true;\n }\n\n // === Spawn Agent ===\n // POST /api/coding-agents/spawn\n if (method === \"POST\" && pathname === \"/api/coding-agents/spawn\") {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const body = await parseBody(req);\n const {\n agentType,\n workdir: rawWorkdir,\n task,\n memoryContent,\n approvalPreset,\n customCredentials,\n metadata,\n } = body;\n\n // Validate workdir: must be within workspace base dir or cwd\n const workspaceBaseDir = path.join(os.homedir(), \".milady\", \"workspaces\");\n const workspaceBaseDirResolved = path.resolve(workspaceBaseDir);\n const cwdResolved = path.resolve(process.cwd());\n const workspaceBaseDirReal = await realpath(workspaceBaseDirResolved).catch(\n () => workspaceBaseDirResolved,\n );\n const cwdReal = await realpath(cwdResolved).catch(() => cwdResolved);\n const allowedPrefixes = [workspaceBaseDirReal, cwdReal];\n let workdir = rawWorkdir as string | undefined;\n if (workdir) {\n const resolved = path.resolve(workdir);\n const resolvedReal = await realpath(resolved).catch(() => null);\n if (!resolvedReal) {\n sendError(res, \"workdir must exist\", 403);\n return true;\n }\n const isAllowed = allowedPrefixes.some(\n (prefix) =>\n resolvedReal === prefix || resolvedReal.startsWith(prefix + path.sep),\n );\n if (!isAllowed) {\n sendError(\n res,\n \"workdir must be within workspace base directory or cwd\",\n 403,\n );\n return true;\n }\n workdir = resolvedReal;\n }\n\n // Check concurrency limit before spawning\n const activeSessions = await ctx.ptyService.listSessions();\n const maxSessions = 8;\n if (activeSessions.length >= maxSessions) {\n sendError(\n res,\n `Concurrent session limit reached (${maxSessions})`,\n 429,\n );\n return true;\n }\n\n if (workdir) {\n try {\n await runBenchmarkPreflight(workdir);\n } catch (preflightError) {\n console.warn(\n `[coding-agent] benchmark preflight failed for ${workdir}:`,\n preflightError,\n );\n }\n }\n\n // Build credentials from runtime\n const credentials = {\n anthropicKey: ctx.runtime.getSetting(\"ANTHROPIC_API_KEY\") as\n | string\n | undefined,\n openaiKey: ctx.runtime.getSetting(\"OPENAI_API_KEY\") as\n | string\n | undefined,\n googleKey: ctx.runtime.getSetting(\"GOOGLE_GENERATIVE_AI_API_KEY\") as\n | string\n | undefined,\n githubToken: ctx.runtime.getSetting(\"GITHUB_TOKEN\") as\n | string\n | undefined,\n };\n\n // Read model preferences from runtime settings\n const agentStr = agentType\n ? (agentType as string).toLowerCase()\n : await ctx.ptyService.resolveAgentType();\n const piRequested = isPiAgentType(agentStr);\n const normalizedType = normalizeAgentType(agentStr);\n const prefixMap: Record<string, string> = {\n claude: \"PARALLAX_CLAUDE\",\n gemini: \"PARALLAX_GEMINI\",\n codex: \"PARALLAX_CODEX\",\n aider: \"PARALLAX_AIDER\",\n };\n const prefix = prefixMap[agentStr];\n const modelPowerful = prefix\n ? (ctx.runtime.getSetting(`${prefix}_MODEL_POWERFUL`) as string | null)\n : null;\n const modelFast = prefix\n ? (ctx.runtime.getSetting(`${prefix}_MODEL_FAST`) as string | null)\n : null;\n const aiderProvider =\n agentStr === \"aider\"\n ? (ctx.runtime.getSetting(\"PARALLAX_AIDER_PROVIDER\") as string | null)\n : null;\n\n // Check if coordinator is active — route blocking prompts through it\n const coordinator = getCoordinator(ctx.runtime);\n const requestedThreadId =\n typeof (metadata as Record<string, unknown>)?.threadId === \"string\"\n ? ((metadata as Record<string, unknown>).threadId as string)\n : null;\n const evalRunMetadata = extractEvalRunMetadata(\n metadata as Record<string, unknown>,\n );\n const taskThread =\n coordinator && task && !requestedThreadId\n ? await coordinator.createTaskThread({\n title:\n ((metadata as Record<string, unknown>)?.label as string | undefined) ??\n `Task ${Date.now()}`,\n originalRequest: task as string,\n scenarioId: evalRunMetadata.scenarioId,\n batchId: evalRunMetadata.batchId,\n metadata: {\n workdir: workdir ?? null,\n source: \"api-spawn\",\n ...(evalRunMetadata.scenarioId\n ? { scenarioId: evalRunMetadata.scenarioId }\n : {}),\n ...(evalRunMetadata.batchId\n ? { batchId: evalRunMetadata.batchId }\n : {}),\n },\n })\n : requestedThreadId\n ? await coordinator?.getTaskThread(requestedThreadId)\n : null;\n\n const session = await ctx.ptyService.spawnSession({\n name: `agent-${Date.now()}`,\n agentType: normalizedType,\n workdir: workdir as string,\n initialTask: piRequested\n ? toPiCommand(task as string | undefined)\n : (task as string),\n memoryContent: memoryContent as string | undefined,\n credentials,\n approvalPreset: approvalPreset as\n | import(\"coding-agent-adapters\").ApprovalPreset\n | undefined,\n customCredentials: customCredentials as\n | Record<string, string>\n | undefined,\n // Let adapter auto-response handle known prompts (permissions, trust, etc.)\n // instantly. The coordinator handles only unrecognized prompts via LLM.\n metadata: {\n threadId: taskThread?.id ?? requestedThreadId,\n requestedType: agentStr,\n ...(metadata as Record<string, unknown>),\n ...(aiderProvider ? { provider: aiderProvider } : {}),\n modelPrefs: {\n ...(modelPowerful ? { powerful: modelPowerful } : {}),\n ...(modelFast ? { fast: modelFast } : {}),\n },\n },\n });\n if (coordinator && task) {\n const label = (metadata as Record<string, unknown>)?.label as\n | string\n | undefined;\n await coordinator.registerTask(session.id, {\n threadId: taskThread?.id ?? requestedThreadId ?? session.id,\n agentType:\n agentStr as import(\"../services/pty-service.js\").CodingAgentType,\n label: label || `agent-${session.id.slice(-8)}`,\n originalTask: task as string,\n workdir: session.workdir,\n });\n }\n\n sendJson(\n res,\n {\n sessionId: session.id,\n agentType: session.agentType,\n workdir: session.workdir,\n status: session.status,\n } as unknown as JsonValue,\n 201,\n );\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to spawn agent\",\n 500,\n );\n }\n return true;\n }\n\n // === Get Agent Status ===\n // GET /api/coding-agents/:id\n const agentMatch = pathname.match(/^\\/api\\/coding-agents\\/([^/]+)$/);\n if (method === \"GET\" && agentMatch) {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n const sessionId = agentMatch[1];\n const session = ctx.ptyService.getSession(sessionId);\n\n if (!session) {\n sendError(res, \"Agent session not found\", 404);\n return true;\n }\n\n sendJson(res, session as unknown as JsonValue);\n return true;\n }\n\n // === Send to Agent ===\n // POST /api/coding-agents/:id/send\n const sendMatch = pathname.match(/^\\/api\\/coding-agents\\/([^/]+)\\/send$/);\n if (method === \"POST\" && sendMatch) {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const sessionId = sendMatch[1];\n const body = await parseBody(req);\n const { input, keys } = body;\n\n if (keys) {\n // Send special keys (e.g. \"enter\", [\"down\",\"enter\"], \"Ctrl-C\")\n await ctx.ptyService.sendKeysToSession(\n sessionId,\n keys as string | string[],\n );\n sendJson(res, { success: true });\n } else if (input && typeof input === \"string\") {\n await ctx.ptyService.sendToSession(sessionId, input);\n sendJson(res, { success: true });\n } else {\n sendError(\n res,\n \"Either 'input' (string) or 'keys' (string|string[]) required\",\n 400,\n );\n return true;\n }\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to send input\",\n 500,\n );\n }\n return true;\n }\n\n // === Stop Agent ===\n // POST /api/coding-agents/:id/stop\n const stopMatch = pathname.match(/^\\/api\\/coding-agents\\/([^/]+)\\/stop$/);\n if (method === \"POST\" && stopMatch) {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const sessionId = stopMatch[1];\n await ctx.ptyService.stopSession(sessionId);\n sendJson(res, { success: true, sessionId });\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to stop agent\",\n 500,\n );\n }\n return true;\n }\n\n // === Get Agent Output ===\n // GET /api/coding-agents/:id/output\n const outputMatch = pathname.match(/^\\/api\\/coding-agents\\/([^/]+)\\/output$/);\n if (method === \"GET\" && outputMatch) {\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n try {\n const sessionId = outputMatch[1];\n const url = new URL(req.url || \"\", `http://${req.headers.host}`);\n const lines = parseInt(url.searchParams.get(\"lines\") || \"100\", 10);\n\n const output = await ctx.ptyService.getSessionOutput(sessionId, lines);\n sendJson(res, { sessionId, output });\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to get output\",\n 500,\n );\n }\n return true;\n }\n\n // === Get Buffered Terminal Output (raw ANSI for xterm.js hydration) ===\n // GET /api/coding-agents/:id/buffered-output\n const bufferedMatch = pathname.match(\n /^\\/api\\/coding-agents\\/([^/]+)\\/buffered-output$/,\n );\n if (method === \"GET\" && bufferedMatch) {\n if (!ctx.ptyService?.consoleBridge) {\n sendError(res, \"Console bridge not available\", 503);\n return true;\n }\n try {\n const sessionId = bufferedMatch[1];\n const output = ctx.ptyService.consoleBridge.getBufferedOutput(sessionId);\n sendJson(res, { sessionId, output });\n } catch (error) {\n sendError(\n res,\n error instanceof Error\n ? error.message\n : \"Failed to get buffered output\",\n 500,\n );\n }\n return true;\n }\n\n // Route not handled\n return false;\n}\n",
|
|
84
|
+
"/**\n * Swarm Coordinator Route Handlers\n *\n * Provides SSE streaming and HTTP API for the coordination layer:\n * - SSE event stream for real-time dashboard\n * - Task status and context queries\n * - Pending confirmation management\n * - Supervision level control\n *\n * @module api/coordinator-routes\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { SwarmCoordinator } from \"../services/swarm-coordinator.js\";\nimport { getTaskAgentFrameworkState } from \"../services/task-agent-frameworks.js\";\nimport type {\n TaskThreadKind,\n TaskThreadStatus,\n} from \"../services/task-registry.js\";\nimport { discoverTaskShareOptions } from \"../services/task-share.js\";\nimport type { RouteContext } from \"./routes.js\";\nimport { parseBody, sendError, sendJson } from \"./routes.js\";\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nconst COORDINATOR_PREFIX = \"/api/coding-agents/coordinator\";\n\n/**\n * Handle coordinator routes (/api/coding-agents/coordinator/*)\n * Returns true if the route was handled, false otherwise.\n */\nexport async function handleCoordinatorRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n ctx: RouteContext & { coordinator?: SwarmCoordinator },\n): Promise<boolean> {\n if (!pathname.startsWith(COORDINATOR_PREFIX)) {\n return false;\n }\n\n const method = req.method?.toUpperCase();\n const subPath = pathname.slice(COORDINATOR_PREFIX.length);\n\n if (!ctx.coordinator) {\n sendError(res, \"Swarm Coordinator not available\", 503);\n return true;\n }\n\n const coordinator = ctx.coordinator;\n\n // === SSE Event Stream ===\n // GET /api/coding-agents/coordinator/events\n if (method === \"GET\" && subPath === \"/events\") {\n // CORS is handled by the server middleware — no need to set it here.\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n // Send initial comment to establish connection\n res.write(\":ok\\n\\n\");\n\n // Register as SSE client (sends snapshot on connect)\n const unsubscribe = coordinator.addSseClient(res);\n\n // Clean up on close\n req.on(\"close\", unsubscribe);\n\n // Keep-alive ping every 30s\n const keepAlive = setInterval(() => {\n if (res.writableEnded) {\n clearInterval(keepAlive);\n return;\n }\n res.write(\":ping\\n\\n\");\n }, 30_000);\n\n req.on(\"close\", () => clearInterval(keepAlive));\n\n return true;\n }\n\n // === All Task Contexts ===\n // GET /api/coding-agents/coordinator/status\n if (method === \"GET\" && subPath === \"/status\") {\n const allTasks = coordinator.getAllTaskContexts();\n const persistedThreads = await coordinator.listTaskThreads({\n includeArchived: false,\n limit: 50,\n });\n // Only return active tasks — stopped/completed/error are terminal states\n // and should not appear in the UI after refresh.\n const tasks = allTasks.filter(\n (t) =>\n t.status !== \"stopped\" &&\n t.status !== \"completed\" &&\n t.status !== \"error\",\n );\n const recentTasks = allTasks\n .slice()\n .sort((left, right) => right.registeredAt - left.registeredAt)\n .slice(0, 10);\n const frameworkState = await getTaskAgentFrameworkState(\n ctx.runtime,\n ctx.ptyService ?? undefined,\n );\n sendJson(res, {\n supervisionLevel: coordinator.getSupervisionLevel(),\n taskCount: tasks.length,\n tasks: tasks.map((t) => ({\n threadId: t.threadId,\n taskNodeId: t.taskNodeId ?? null,\n sessionId: t.sessionId,\n agentType: t.agentType,\n label: t.label,\n originalTask: t.originalTask,\n workdir: t.workdir,\n status: t.status,\n decisionCount: t.decisions.length,\n autoResolvedCount: t.autoResolvedCount,\n completionSummary: t.completionSummary,\n lastActivityAt: t.lastActivityAt,\n })),\n recentTasks: recentTasks.map((t) => ({\n threadId: t.threadId,\n taskNodeId: t.taskNodeId ?? null,\n sessionId: t.sessionId,\n agentType: t.agentType,\n label: t.label,\n status: t.status,\n originalTask: t.originalTask,\n completionSummary: t.completionSummary,\n registeredAt: t.registeredAt,\n lastActivityAt: t.lastActivityAt,\n })),\n taskThreadCount: persistedThreads.length,\n taskThreads: persistedThreads.map((thread) => ({\n id: thread.id,\n title: thread.title,\n kind: thread.kind,\n status: thread.status,\n scenarioId: thread.scenarioId,\n batchId: thread.batchId,\n originalRequest: thread.originalRequest,\n summary: thread.summary,\n sessionCount: thread.sessionCount,\n activeSessionCount: thread.activeSessionCount,\n latestSessionId: thread.latestSessionId,\n latestSessionLabel: thread.latestSessionLabel,\n latestWorkdir: thread.latestWorkdir,\n latestRepo: thread.latestRepo,\n latestActivityAt: thread.latestActivityAt,\n decisionCount: thread.decisionCount,\n nodeCount: thread.nodeCount,\n readyNodeCount: thread.readyNodeCount,\n completedNodeCount: thread.completedNodeCount,\n verifierJobCount: thread.verifierJobCount,\n evidenceCount: thread.evidenceCount,\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n closedAt: thread.closedAt,\n archivedAt: thread.archivedAt,\n })),\n pendingConfirmations: coordinator.getPendingConfirmations().length,\n preferredAgentType: frameworkState.preferred.id,\n preferredAgentReason: frameworkState.preferred.reason,\n frameworks: frameworkState.frameworks,\n } as unknown as JsonValue);\n return true;\n }\n\n // === Task Threads ===\n // GET /api/coding-agents/coordinator/threads\n if (method === \"GET\" && subPath === \"/threads\") {\n const url = new URL(req.url ?? pathname, \"http://localhost\");\n const includeArchived = url.searchParams.get(\"includeArchived\") === \"true\";\n const status = url.searchParams.get(\"status\") ?? undefined;\n const statusesRaw = url.searchParams.get(\"statuses\");\n const statuses = statusesRaw\n ?.split(\",\")\n .map((value) => value.trim())\n .filter(Boolean) as TaskThreadStatus[] | undefined;\n const kind = (url.searchParams.get(\"kind\") ?? undefined) as\n | TaskThreadKind\n | undefined;\n const roomId = url.searchParams.get(\"roomId\") ?? undefined;\n const worldId = url.searchParams.get(\"worldId\") ?? undefined;\n const ownerUserId = url.searchParams.get(\"ownerUserId\") ?? undefined;\n const scenarioId = url.searchParams.get(\"scenarioId\") ?? undefined;\n const batchId = url.searchParams.get(\"batchId\") ?? undefined;\n const createdAfter = url.searchParams.get(\"createdAfter\") ?? undefined;\n const createdBefore = url.searchParams.get(\"createdBefore\") ?? undefined;\n const updatedAfter = url.searchParams.get(\"updatedAfter\") ?? undefined;\n const updatedBefore = url.searchParams.get(\"updatedBefore\") ?? undefined;\n const latestActivityAfterRaw = url.searchParams.get(\"latestActivityAfter\");\n const latestActivityBeforeRaw = url.searchParams.get(\n \"latestActivityBefore\",\n );\n const latestActivityAfter =\n latestActivityAfterRaw && Number.isFinite(Number(latestActivityAfterRaw))\n ? Number(latestActivityAfterRaw)\n : undefined;\n const latestActivityBefore =\n latestActivityBeforeRaw &&\n Number.isFinite(Number(latestActivityBeforeRaw))\n ? Number(latestActivityBeforeRaw)\n : undefined;\n const hasActiveSessionRaw = url.searchParams.get(\"hasActiveSession\");\n const hasActiveSession =\n hasActiveSessionRaw === null ? undefined : hasActiveSessionRaw === \"true\";\n const search = url.searchParams.get(\"search\") ?? undefined;\n const limitRaw = url.searchParams.get(\"limit\");\n const limit =\n limitRaw && Number.isFinite(Number(limitRaw))\n ? Number(limitRaw)\n : undefined;\n\n const threads = await coordinator.listTaskThreads({\n includeArchived,\n status: (status as TaskThreadStatus | null) ?? undefined,\n statuses,\n kind,\n roomId,\n worldId,\n ownerUserId,\n scenarioId,\n batchId,\n createdAfter,\n createdBefore,\n updatedAfter,\n updatedBefore,\n latestActivityAfter,\n latestActivityBefore,\n hasActiveSession,\n search,\n limit,\n });\n sendJson(res, threads as unknown as JsonValue);\n return true;\n }\n\n if (method === \"GET\" && subPath === \"/threads/count\") {\n const url = new URL(req.url ?? pathname, \"http://localhost\");\n const includeArchived = url.searchParams.get(\"includeArchived\") === \"true\";\n const status = url.searchParams.get(\"status\") ?? undefined;\n const statusesRaw = url.searchParams.get(\"statuses\");\n const statuses = statusesRaw\n ?.split(\",\")\n .map((value) => value.trim())\n .filter(Boolean) as TaskThreadStatus[] | undefined;\n const kind = (url.searchParams.get(\"kind\") ?? undefined) as\n | TaskThreadKind\n | undefined;\n const roomId = url.searchParams.get(\"roomId\") ?? undefined;\n const worldId = url.searchParams.get(\"worldId\") ?? undefined;\n const ownerUserId = url.searchParams.get(\"ownerUserId\") ?? undefined;\n const scenarioId = url.searchParams.get(\"scenarioId\") ?? undefined;\n const batchId = url.searchParams.get(\"batchId\") ?? undefined;\n const createdAfter = url.searchParams.get(\"createdAfter\") ?? undefined;\n const createdBefore = url.searchParams.get(\"createdBefore\") ?? undefined;\n const updatedAfter = url.searchParams.get(\"updatedAfter\") ?? undefined;\n const updatedBefore = url.searchParams.get(\"updatedBefore\") ?? undefined;\n const latestActivityAfterRaw = url.searchParams.get(\"latestActivityAfter\");\n const latestActivityBeforeRaw = url.searchParams.get(\n \"latestActivityBefore\",\n );\n const latestActivityAfter =\n latestActivityAfterRaw && Number.isFinite(Number(latestActivityAfterRaw))\n ? Number(latestActivityAfterRaw)\n : undefined;\n const latestActivityBefore =\n latestActivityBeforeRaw &&\n Number.isFinite(Number(latestActivityBeforeRaw))\n ? Number(latestActivityBeforeRaw)\n : undefined;\n const hasActiveSessionRaw = url.searchParams.get(\"hasActiveSession\");\n const hasActiveSession =\n hasActiveSessionRaw === null ? undefined : hasActiveSessionRaw === \"true\";\n const search = url.searchParams.get(\"search\") ?? undefined;\n\n const total = await coordinator.countTaskThreads({\n includeArchived,\n status: (status as TaskThreadStatus | null) ?? undefined,\n statuses,\n kind,\n roomId,\n worldId,\n ownerUserId,\n scenarioId,\n batchId,\n createdAfter,\n createdBefore,\n updatedAfter,\n updatedBefore,\n latestActivityAfter,\n latestActivityBefore,\n hasActiveSession,\n search,\n });\n sendJson(res, { total });\n return true;\n }\n\n // GET /api/coding-agents/coordinator/threads/:threadId\n const threadMatch = subPath.match(/^\\/threads\\/([^/]+)$/);\n if (method === \"GET\" && threadMatch) {\n const thread = await coordinator.getTaskThread(threadMatch[1]);\n if (!thread) {\n sendError(res, \"Task thread not found\", 404);\n return true;\n }\n sendJson(res, thread as unknown as JsonValue);\n return true;\n }\n\n const shareMatch = subPath.match(/^\\/threads\\/([^/]+)\\/share$/);\n if (method === \"GET\" && shareMatch) {\n const share = await discoverTaskShareOptions(coordinator, shareMatch[1]);\n if (!share) {\n sendError(res, \"Task thread not found\", 404);\n return true;\n }\n sendJson(res, share as unknown as JsonValue);\n return true;\n }\n\n // POST /api/coding-agents/coordinator/threads/:threadId/archive\n const archiveMatch = subPath.match(/^\\/threads\\/([^/]+)\\/archive$/);\n if (method === \"POST\" && archiveMatch) {\n await coordinator.archiveTaskThread(archiveMatch[1]);\n sendJson(res, {\n success: true,\n threadId: archiveMatch[1],\n status: \"archived\",\n });\n return true;\n }\n\n // POST /api/coding-agents/coordinator/threads/:threadId/reopen\n const reopenMatch = subPath.match(/^\\/threads\\/([^/]+)\\/reopen$/);\n if (method === \"POST\" && reopenMatch) {\n await coordinator.reopenTaskThread(reopenMatch[1]);\n sendJson(res, { success: true, threadId: reopenMatch[1], status: \"open\" });\n return true;\n }\n\n const controlMatch = subPath.match(/^\\/threads\\/([^/]+)\\/control$/);\n if (method === \"POST\" && controlMatch) {\n try {\n const body = await parseBody(req);\n const action = typeof body.action === \"string\" ? body.action.trim() : \"\";\n const note = typeof body.note === \"string\" ? body.note : undefined;\n const instruction =\n typeof body.instruction === \"string\" ? body.instruction : undefined;\n const agentType =\n typeof body.agentType === \"string\" ? body.agentType : undefined;\n\n if (action === \"pause\") {\n const result = await coordinator.pauseTaskThread(controlMatch[1], note);\n sendJson(res, { success: true, action, ...result });\n return true;\n }\n if (action === \"stop\") {\n const result = await coordinator.stopTaskThread(controlMatch[1], note);\n sendJson(res, { success: true, action, ...result });\n return true;\n }\n if (action === \"resume\") {\n const result = await coordinator.resumeTaskThread(\n controlMatch[1],\n instruction,\n agentType,\n );\n sendJson(res, { success: true, action, ...result });\n return true;\n }\n if (action === \"continue\") {\n const result = await coordinator.continueTaskThread(\n controlMatch[1],\n instruction ?? `Continue task thread ${controlMatch[1]}.`,\n agentType,\n );\n sendJson(res, { success: true, action, ...result });\n return true;\n }\n\n sendError(\n res,\n 'Invalid control action. Must be \"pause\", \"stop\", \"resume\", or \"continue\".',\n 400,\n );\n } catch (error) {\n sendError(\n res,\n error instanceof Error\n ? error.message\n : \"Failed to control task thread\",\n 500,\n );\n }\n return true;\n }\n\n // === Single Task Context ===\n // GET /api/coding-agents/coordinator/tasks/:sessionId\n const taskMatch = subPath.match(/^\\/tasks\\/([^/]+)$/);\n if (method === \"GET\" && taskMatch) {\n const sessionId = taskMatch[1];\n const task = await coordinator.getTaskContextSnapshot(sessionId);\n if (!task) {\n sendError(res, \"Task context not found\", 404);\n return true;\n }\n sendJson(res, task as unknown as JsonValue);\n return true;\n }\n\n // === Pending Confirmations ===\n // GET /api/coding-agents/coordinator/pending\n if (method === \"GET\" && subPath === \"/pending\") {\n const pending = coordinator.getPendingConfirmations();\n sendJson(\n res,\n pending.map((p) => ({\n sessionId: p.sessionId,\n promptText: p.promptText,\n suggestedAction: p.llmDecision.action,\n suggestedResponse: p.llmDecision.response,\n reasoning: p.llmDecision.reasoning,\n agentType: p.taskContext.agentType,\n label: p.taskContext.label,\n createdAt: p.createdAt,\n })) as unknown as JsonValue,\n );\n return true;\n }\n\n // === Confirm/Reject Pending Decision ===\n // POST /api/coding-agents/coordinator/confirm/:sessionId\n const confirmMatch = subPath.match(/^\\/confirm\\/([^/]+)$/);\n if (method === \"POST\" && confirmMatch) {\n try {\n const sessionId = confirmMatch[1];\n const body = await parseBody(req);\n const approved = body.approved !== false; // default: approved\n const override = body.override as\n | { response?: string; useKeys?: boolean; keys?: string[] }\n | undefined;\n\n await coordinator.confirmDecision(sessionId, approved, override);\n sendJson(res, { success: true, sessionId, approved });\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to confirm decision\",\n error instanceof Error && error.message.includes(\"No pending\")\n ? 404\n : 500,\n );\n }\n return true;\n }\n\n // === Supervision Level ===\n // GET /api/coding-agents/coordinator/supervision\n if (method === \"GET\" && subPath === \"/supervision\") {\n sendJson(res, { level: coordinator.getSupervisionLevel() });\n return true;\n }\n\n // POST /api/coding-agents/coordinator/supervision\n if (method === \"POST\" && subPath === \"/supervision\") {\n try {\n const body = await parseBody(req);\n const level = body.level as string;\n if (![\"autonomous\", \"confirm\", \"notify\"].includes(level)) {\n sendError(\n res,\n 'Invalid supervision level. Must be \"autonomous\", \"confirm\", or \"notify\"',\n 400,\n );\n return true;\n }\n coordinator.setSupervisionLevel(\n level as \"autonomous\" | \"confirm\" | \"notify\",\n );\n sendJson(res, { success: true, level });\n } catch (error) {\n sendError(\n res,\n error instanceof Error\n ? error.message\n : \"Failed to set supervision level\",\n 500,\n );\n }\n return true;\n }\n\n // Not a coordinator route we recognize\n return false;\n}\n",
|
|
77
85
|
"/**\n * Coding Agent HTTP Hooks — Webhook Endpoint\n *\n * Receives structured hook events from coding agent CLI hooks systems.\n * Claude Code sends native HTTP hooks; Gemini CLI bridges via curl commands.\n * Replaces fragile PTY output scraping for state detection with deterministic\n * event-driven signals.\n *\n * @module api/hook-routes\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { RouteContext } from \"./routes.js\";\nimport { parseBody, sendError, sendJson } from \"./routes.js\";\n\n/**\n * Hook event payload (subset of fields we use).\n * Supports both Claude Code (native HTTP) and Gemini CLI (curl bridge).\n *\n * Claude docs: https://docs.anthropic.com/en/docs/claude-code/hooks\n * Gemini docs: https://geminicli.com/docs/hooks/reference\n */\ninterface HookEventPayload {\n hook_event_name: string;\n session_id?: string;\n cwd?: string;\n // Claude uses snake_case, Gemini uses camelCase\n tool_name?: string;\n toolName?: string;\n tool_input?: Record<string, unknown>;\n notification_type?: string;\n notificationType?: string;\n message?: string;\n}\n\n/**\n * Handle Claude Code HTTP hook routes.\n * Returns true if the route was handled, false otherwise.\n */\nexport async function handleHookRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n ctx: RouteContext,\n): Promise<boolean> {\n if (pathname !== \"/api/coding-agents/hooks\") return false;\n\n const method = req.method?.toUpperCase();\n if (method !== \"POST\") {\n sendError(res, \"Method not allowed\", 405);\n return true;\n }\n\n if (!ctx.ptyService) {\n sendError(res, \"PTY Service not available\", 503);\n return true;\n }\n\n let body: Record<string, unknown>;\n try {\n body = await parseBody(req);\n } catch (err) {\n sendError(\n res,\n err instanceof Error ? err.message : \"Failed to parse request body\",\n 400,\n );\n return true;\n }\n\n const payload = body as unknown as HookEventPayload;\n const eventName = payload.hook_event_name;\n if (!eventName) {\n sendError(res, \"Missing hook_event_name\", 400);\n return true;\n }\n\n // Normalize field names: Gemini uses camelCase, Claude uses snake_case\n const toolName = payload.tool_name ?? payload.toolName;\n const notificationType =\n payload.notification_type ?? payload.notificationType;\n\n // Look up PTY session: prefer explicit header, fall back to cwd-based lookup\n const headerSessionId = req.headers[\"x-parallax-session-id\"] as\n | string\n | undefined;\n const sessionId = headerSessionId\n ? headerSessionId\n : payload.cwd\n ? ctx.ptyService.findSessionIdByCwd(payload.cwd)\n : undefined;\n\n if (!sessionId) {\n // Not fatal — the hook may fire before we've tracked the session.\n // Return success so the CLI doesn't retry.\n sendJson(res, { status: \"ignored\", reason: \"session_not_found\" });\n return true;\n }\n\n // Dispatch by event type\n switch (eventName) {\n // ── Claude Code events ──────────────────────────────────────────\n\n case \"PermissionRequest\": {\n // Auto-approve all tool permissions natively — no PTY keystroke needed.\n sendJson(res, {\n hookSpecificOutput: {\n hookEventName: \"PermissionRequest\",\n decision: { behavior: \"allow\" },\n },\n });\n ctx.ptyService.handleHookEvent(sessionId, \"permission_approved\", {\n tool: toolName,\n });\n return true;\n }\n\n case \"PreToolUse\": {\n // Track which tool is running — suppress stall detection.\n ctx.ptyService.handleHookEvent(sessionId, \"tool_running\", {\n toolName,\n source: \"hook\",\n });\n // Return allow decision so the tool proceeds without permission prompt.\n sendJson(res, {\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: \"allow\",\n },\n });\n return true;\n }\n\n case \"Stop\": {\n // Agent finished responding — mark task complete.\n ctx.ptyService.handleHookEvent(sessionId, \"task_complete\", {\n source: \"hook\",\n });\n sendJson(res, {});\n return true;\n }\n\n case \"TaskCompleted\": {\n ctx.ptyService.handleHookEvent(sessionId, \"task_complete\", {\n source: \"hook_task_completed\",\n });\n sendJson(res, {});\n return true;\n }\n\n // ── Gemini CLI events ───────────────────────────────────────────\n\n case \"BeforeTool\": {\n // Track which tool is running — suppress stall detection.\n ctx.ptyService.handleHookEvent(sessionId, \"tool_running\", {\n toolName,\n source: \"gemini_hook\",\n });\n // Return allow + continue so Gemini proceeds without permission prompt.\n sendJson(res, { decision: \"allow\", continue: true });\n return true;\n }\n\n case \"AfterTool\": {\n // Tool finished — update activity (back to \"active\" state).\n ctx.ptyService.handleHookEvent(sessionId, \"notification\", {\n type: \"tool_complete\",\n message: `Tool ${toolName ?? \"unknown\"} finished`,\n });\n sendJson(res, { continue: true });\n return true;\n }\n\n case \"AfterAgent\": {\n // Agent loop ended — mark task complete.\n ctx.ptyService.handleHookEvent(sessionId, \"task_complete\", {\n source: \"gemini_hook\",\n });\n sendJson(res, { continue: true });\n return true;\n }\n\n case \"SessionEnd\": {\n // Session ending — mark exit.\n ctx.ptyService.handleHookEvent(sessionId, \"session_end\", {\n source: \"hook\",\n });\n sendJson(res, { continue: true });\n return true;\n }\n\n // ── Shared events ───────────────────────────────────────────────\n\n case \"Notification\": {\n // State change notifications (idle, permission, auth).\n // Gemini ToolPermission notifications get auto-approved.\n if (notificationType === \"ToolPermission\") {\n ctx.ptyService.handleHookEvent(sessionId, \"permission_approved\", {\n tool: toolName,\n });\n sendJson(res, { decision: \"allow\", continue: true });\n return true;\n }\n ctx.ptyService.handleHookEvent(sessionId, \"notification\", {\n type: notificationType,\n message: payload.message,\n });\n sendJson(res, { continue: true });\n return true;\n }\n\n default: {\n // Unknown event — acknowledge without action.\n sendJson(res, { status: \"ignored\", reason: \"unknown_event\" });\n return true;\n }\n }\n}\n",
|
|
78
86
|
"/**\n * Issue Route Handlers\n *\n * Handles routes for GitHub issue management:\n * - List issues, create issue\n * - Get issue, comment on issue, close issue\n *\n * @module api/issue-routes\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { RouteContext } from \"./routes.js\";\nimport { parseBody, sendError, sendJson } from \"./routes.js\";\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\n/**\n * Handle issue routes (/api/issues/*)\n * Returns true if the route was handled, false otherwise\n */\nexport async function handleIssueRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n ctx: RouteContext,\n): Promise<boolean> {\n const method = req.method?.toUpperCase();\n\n // GET /api/issues?repo=owner/repo&state=open\n if (method === \"GET\" && pathname === \"/api/issues\") {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n\n try {\n const url = new URL(req.url || \"\", `http://${req.headers.host}`);\n const repo = url.searchParams.get(\"repo\");\n if (!repo) {\n sendError(res, \"repo query parameter required\", 400);\n return true;\n }\n const state = url.searchParams.get(\"state\") as\n | \"open\"\n | \"closed\"\n | \"all\"\n | null;\n const labelsParam = url.searchParams.get(\"labels\");\n const labels = labelsParam\n ? labelsParam.split(\",\").map((s) => s.trim())\n : undefined;\n\n const issues = await ctx.workspaceService.listIssues(repo, {\n state: state ?? \"open\",\n labels,\n });\n sendJson(res, issues as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to list issues\",\n 500,\n );\n }\n return true;\n }\n\n // POST /api/issues\n if (method === \"POST\" && pathname === \"/api/issues\") {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n\n try {\n const body = await parseBody(req);\n const { repo, title, body: issueBody, labels } = body;\n if (!repo || !title) {\n sendError(res, \"repo and title are required\", 400);\n return true;\n }\n\n const issue = await ctx.workspaceService.createIssue(repo as string, {\n title: title as string,\n body: (issueBody as string) ?? \"\",\n labels: labels as string[] | undefined,\n });\n sendJson(res, issue as unknown as JsonValue, 201);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to create issue\",\n 500,\n );\n }\n return true;\n }\n\n // GET /api/issues/:repo/:number (e.g., /api/issues/owner/repo/42)\n const issueGetMatch = pathname.match(\n /^\\/api\\/issues\\/([^/]+)\\/([^/]+)\\/(\\d+)$/,\n );\n if (method === \"GET\" && issueGetMatch) {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n\n try {\n const repo = `${issueGetMatch[1]}/${issueGetMatch[2]}`;\n const issueNumber = parseInt(issueGetMatch[3], 10);\n const issue = await ctx.workspaceService.getIssue(repo, issueNumber);\n sendJson(res, issue as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to get issue\",\n 500,\n );\n }\n return true;\n }\n\n // POST /api/issues/:repo/:number/comment\n const commentMatch = pathname.match(\n /^\\/api\\/issues\\/([^/]+)\\/([^/]+)\\/(\\d+)\\/comment$/,\n );\n if (method === \"POST\" && commentMatch) {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n\n try {\n const repo = `${commentMatch[1]}/${commentMatch[2]}`;\n const issueNumber = parseInt(commentMatch[3], 10);\n const body = await parseBody(req);\n if (!body.body) {\n sendError(res, \"body is required\", 400);\n return true;\n }\n const comment = await ctx.workspaceService.addComment(\n repo,\n issueNumber,\n body.body as string,\n );\n sendJson(res, comment as unknown as JsonValue, 201);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to add comment\",\n 500,\n );\n }\n return true;\n }\n\n // POST /api/issues/:repo/:number/close\n const closeMatch = pathname.match(\n /^\\/api\\/issues\\/([^/]+)\\/([^/]+)\\/(\\d+)\\/close$/,\n );\n if (method === \"POST\" && closeMatch) {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n\n try {\n const repo = `${closeMatch[1]}/${closeMatch[2]}`;\n const issueNumber = parseInt(closeMatch[3], 10);\n const issue = await ctx.workspaceService.closeIssue(repo, issueNumber);\n sendJson(res, issue as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to close issue\",\n 500,\n );\n }\n return true;\n }\n\n // Route not handled\n return false;\n}\n",
|
|
79
87
|
"/**\n * Workspace Route Handlers\n *\n * Handles routes for git workspace management:\n * - Provision (clone repos, create worktrees)\n * - Get status, commit, push, create PR, delete\n *\n * @module api/workspace-routes\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { RouteContext } from \"./routes.js\";\nimport { parseBody, sendError, sendJson } from \"./routes.js\";\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\n/**\n * Handle workspace routes (/api/workspace/*)\n * Returns true if the route was handled, false otherwise\n */\nexport async function handleWorkspaceRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n ctx: RouteContext,\n): Promise<boolean> {\n const method = req.method?.toUpperCase();\n\n // POST /api/workspace/provision\n if (method === \"POST\" && pathname === \"/api/workspace/provision\") {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n\n try {\n const body = await parseBody(req);\n const { repo, baseBranch, useWorktree, parentWorkspaceId, branchName } =\n body;\n\n const workspace = await ctx.workspaceService.provisionWorkspace({\n repo: repo as string,\n baseBranch: baseBranch as string,\n branchName: branchName as string | undefined,\n useWorktree: useWorktree as boolean,\n parentWorkspaceId: parentWorkspaceId as string,\n });\n\n sendJson(\n res,\n {\n id: workspace.id,\n path: workspace.path,\n branch: workspace.branch,\n isWorktree: workspace.isWorktree,\n } as unknown as JsonValue,\n 201,\n );\n } catch (error) {\n sendError(\n res,\n error instanceof Error\n ? error.message\n : \"Failed to provision workspace\",\n 500,\n );\n }\n return true;\n }\n\n // GET /api/workspace/:id\n const workspaceMatch = pathname.match(/^\\/api\\/workspace\\/([^/]+)$/);\n if (method === \"GET\" && workspaceMatch) {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n\n try {\n const workspaceId = workspaceMatch[1];\n const status = await ctx.workspaceService.getStatus(workspaceId);\n sendJson(res, status as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to get workspace\",\n 500,\n );\n }\n return true;\n }\n\n // POST /api/workspace/:id/commit\n const commitMatch = pathname.match(/^\\/api\\/workspace\\/([^/]+)\\/commit$/);\n if (method === \"POST\" && commitMatch) {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n\n try {\n const workspaceId = commitMatch[1];\n const body = await parseBody(req);\n const { message } = body;\n\n const result = await ctx.workspaceService.commit(workspaceId, {\n message: message as string,\n all: true,\n });\n\n sendJson(res, result as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to commit\",\n 500,\n );\n }\n return true;\n }\n\n // POST /api/workspace/:id/push\n const pushMatch = pathname.match(/^\\/api\\/workspace\\/([^/]+)\\/push$/);\n if (method === \"POST\" && pushMatch) {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n\n try {\n const workspaceId = pushMatch[1];\n const body = await parseBody(req);\n\n const result = await ctx.workspaceService.push(workspaceId, {\n force: body.force as boolean,\n setUpstream: body.setUpstream as boolean,\n });\n\n sendJson(res, result as unknown as JsonValue);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to push\",\n 500,\n );\n }\n return true;\n }\n\n // POST /api/workspace/:id/pr\n const prMatch = pathname.match(/^\\/api\\/workspace\\/([^/]+)\\/pr$/);\n if (method === \"POST\" && prMatch) {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n\n try {\n const workspaceId = prMatch[1];\n const body = await parseBody(req);\n\n const result = await ctx.workspaceService.createPR(workspaceId, {\n title: body.title as string,\n body: body.body as string,\n base: body.baseBranch as string,\n draft: body.draft as boolean,\n });\n\n sendJson(res, result as unknown as JsonValue, 201);\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to create PR\",\n 500,\n );\n }\n return true;\n }\n\n // DELETE /api/workspace/:id\n const deleteMatch = pathname.match(/^\\/api\\/workspace\\/([^/]+)$/);\n if (method === \"DELETE\" && deleteMatch) {\n if (!ctx.workspaceService) {\n sendError(res, \"Workspace Service not available\", 503);\n return true;\n }\n\n try {\n const workspaceId = deleteMatch[1];\n await ctx.workspaceService.removeWorkspace(workspaceId);\n sendJson(res, { success: true, workspaceId });\n } catch (error) {\n sendError(\n res,\n error instanceof Error ? error.message : \"Failed to remove workspace\",\n 500,\n );\n }\n return true;\n }\n\n // Route not handled\n return false;\n}\n",
|
|
80
88
|
"/**\n * Task Agent API Routes — Dispatcher\n *\n * Provides shared helpers (parseBody, sendJson, sendError), types, and the\n * top-level route dispatcher that delegates to domain-specific route modules.\n *\n * @module api/routes\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport type { PTYService } from \"../services/pty-service.js\";\nimport type { SwarmCoordinator } from \"../services/swarm-coordinator.js\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\nimport { handleAgentRoutes } from \"./agent-routes.js\";\nimport { handleCoordinatorRoutes } from \"./coordinator-routes.js\";\nimport { handleHookRoutes } from \"./hook-routes.js\";\nimport { handleIssueRoutes } from \"./issue-routes.js\";\nimport { handleWorkspaceRoutes } from \"./workspace-routes.js\";\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport interface RouteContext {\n runtime: IAgentRuntime;\n ptyService: PTYService | null;\n workspaceService: CodingWorkspaceService | null;\n coordinator?: SwarmCoordinator;\n}\n\n// Max request body size (1 MB)\nexport const MAX_BODY_SIZE = 1024 * 1024;\n\n// Helper to parse JSON body with size limit\nexport async function parseBody(\n req: IncomingMessage,\n): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n let body = \"\";\n let size = 0;\n req.on(\"data\", (chunk: Buffer | string) => {\n size += typeof chunk === \"string\" ? chunk.length : chunk.byteLength;\n if (size > MAX_BODY_SIZE) {\n req.destroy();\n reject(new Error(\"Request body too large\"));\n return;\n }\n body += chunk;\n });\n req.on(\"end\", () => {\n try {\n resolve(body ? JSON.parse(body) : {});\n } catch {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\n// Helper to send JSON response\nexport function sendJson(\n res: ServerResponse,\n data: JsonValue,\n status = 200,\n): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n\n// Helper to send error\nexport function sendError(\n res: ServerResponse,\n message: string,\n status = 400,\n): void {\n sendJson(res, { error: message }, status);\n}\n\n/**\n * Handle task-agent routes\n * Returns true if the route was handled, false otherwise\n */\nexport async function handleCodingAgentRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n ctx: RouteContext,\n): Promise<boolean> {\n const normalizedPathname = pathname.startsWith(\"/api/task-agents\")\n ? pathname.replace(/^\\/api\\/task-agents/, \"/api/coding-agents\")\n : pathname;\n\n // Delegate to hook routes first — hooks need fast responses\n if (await handleHookRoutes(req, res, normalizedPathname, ctx)) {\n return true;\n }\n\n // Delegate to coordinator routes (before agent routes — more specific prefix)\n if (await handleCoordinatorRoutes(req, res, normalizedPathname, ctx)) {\n return true;\n }\n\n // Delegate to agent routes\n if (await handleAgentRoutes(req, res, normalizedPathname, ctx)) {\n return true;\n }\n\n // Delegate to workspace routes\n if (await handleWorkspaceRoutes(req, res, normalizedPathname, ctx)) {\n return true;\n }\n\n // Delegate to issue routes\n if (await handleIssueRoutes(req, res, normalizedPathname, ctx)) {\n return true;\n }\n\n // Route not handled\n return false;\n}\n\n/**\n * Create route handler with services from runtime\n */\nexport function createCodingAgentRouteHandler(\n runtime: IAgentRuntime,\n coordinator?: SwarmCoordinator,\n) {\n return (req: IncomingMessage, res: ServerResponse, pathname: string) => {\n const ctx: RouteContext = {\n runtime,\n ptyService: runtime.getService(\"PTY_SERVICE\") as unknown as\n | PTYService\n | null,\n workspaceService: runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | null,\n coordinator:\n coordinator ??\n (runtime.getService(\"SWARM_COORDINATOR\") as unknown as\n | SwarmCoordinator\n | undefined),\n };\n return handleCodingAgentRoutes(req, res, pathname, ctx);\n };\n}\n\nexport const createTaskAgentRouteHandler = createCodingAgentRouteHandler;\n",
|
|
81
|
-
"/**\n * Task Agent Plugin for Milady\n *\n * Provides orchestration capabilities for CLI-based task agents:\n * - PTY session management (spawn, control, monitor task agents)\n * - Git workspace provisioning (clone, branch, PR creation)\n * - GitHub issue management (create, list, update, close)\n * - Integration with Claude Code, Codex, Gemini CLI, Aider, Pi, etc.\n *\n * @module @elizaos/plugin-agent-orchestrator\n */\n\nimport type { Plugin } from \"@elizaos/core\";\nimport { finalizeWorkspaceAction } from \"./actions/finalize-workspace.js\";\nimport { listAgentsAction } from \"./actions/list-agents.js\";\n// Actions - Issue management\nimport { manageIssuesAction } from \"./actions/manage-issues.js\";\n// Actions - Workspace management\nimport { provisionWorkspaceAction } from \"./actions/provision-workspace.js\";\nimport { sendToAgentAction } from \"./actions/send-to-agent.js\";\n// Actions - PTY management\nimport { spawnAgentAction } from \"./actions/spawn-agent.js\";\n// Actions - Unified task launcher\nimport { startCodingTaskAction } from \"./actions/start-coding-task.js\";\nimport { stopAgentAction } from \"./actions/stop-agent.js\";\n// Providers\nimport { codingAgentExamplesProvider } from \"./providers/action-examples.js\";\nimport { activeWorkspaceContextProvider } from \"./providers/active-workspace-context.js\";\n// Services\nimport { PTYService } from \"./services/pty-service.js\";\nimport { CodingWorkspaceService } from \"./services/workspace-service.js\";\n\nexport const taskAgentPlugin: Plugin = {\n name: \"@elizaos/plugin-agent-orchestrator\",\n description:\n \"Orchestrate open-ended task agents (Claude Code, Codex, Gemini CLI, Aider, Pi, etc.) via PTY sessions, \" +\n \"manage workspaces, track current task status, and keep background work moving while the main agent stays in conversation\",\n\n // NOTE: init() is NOT reliably called by ElizaOS for workspace plugins.\n // SwarmCoordinator and auth callback wiring is done in PTYService.start()\n // which ElizaOS calls reliably via the services lifecycle.\n\n // Services manage PTY sessions and git workspaces\n // biome-ignore lint/suspicious/noExplicitAny: ElizaOS Plugin type expects Service[] but our classes don't extend their base Service\n services: [PTYService as any, CodingWorkspaceService as any],\n\n // Actions expose capabilities to the agent\n actions: [\n // Unified task launcher (provision + spawn in one step)\n startCodingTaskAction,\n // PTY session management (for direct control)\n spawnAgentAction,\n sendToAgentAction,\n stopAgentAction,\n listAgentsAction,\n // Workspace management\n provisionWorkspaceAction,\n finalizeWorkspaceAction,\n // Issue management\n manageIssuesAction,\n ],\n\n // No evaluators needed for now\n evaluators: [],\n\n // Providers inject context into the prompt\n providers: [\n activeWorkspaceContextProvider, // Live workspace/session state\n codingAgentExamplesProvider, // Structured action call examples\n ],\n};\n\nexport const codingAgentPlugin = taskAgentPlugin;\n\nexport default taskAgentPlugin;\n\n// Re-export coding agent adapter types\nexport type {\n AdapterType,\n AgentCredentials,\n AgentFileDescriptor,\n ApprovalConfig,\n ApprovalPreset,\n PreflightResult,\n PresetDefinition,\n RiskLevel,\n ToolCategory,\n WriteMemoryOptions,\n} from \"coding-agent-adapters\";\nexport { finalizeWorkspaceAction } from \"./actions/finalize-workspace.js\";\nexport { listAgentsAction } from \"./actions/list-agents.js\";\nexport { manageIssuesAction } from \"./actions/manage-issues.js\";\nexport { provisionWorkspaceAction } from \"./actions/provision-workspace.js\";\nexport { sendToAgentAction } from \"./actions/send-to-agent.js\";\nexport { spawnAgentAction } from \"./actions/spawn-agent.js\";\nexport { createTaskAction } from \"./actions/start-coding-task.js\";\nexport { listTaskAgentsAction } from \"./actions/list-agents.js\";\nexport { sendToTaskAgentAction } from \"./actions/send-to-agent.js\";\nexport { spawnTaskAgentAction } from \"./actions/spawn-agent.js\";\n// Re-export actions\nexport { startCodingTaskAction } from \"./actions/start-coding-task.js\";\nexport { stopAgentAction } from \"./actions/stop-agent.js\";\nexport { stopTaskAgentAction } from \"./actions/stop-agent.js\";\n// Re-export API routes for server integration\nexport {\n createCodingAgentRouteHandler,\n createTaskAgentRouteHandler,\n handleCodingAgentRoutes,\n} from \"./api/routes.js\";\n// Re-export service types\nexport type {\n CodingAgentType,\n PTYServiceConfig,\n SessionEventName,\n SessionInfo,\n SpawnSessionOptions,\n} from \"./services/pty-service.js\";\n// Re-export services for direct access\nexport { getCoordinator, PTYService } from \"./services/pty-service.js\";\nexport type {\n AgentDecisionCallback,\n ChatMessageCallback,\n CoordinationDecision,\n PendingDecision,\n SupervisionLevel,\n SwarmCompleteCallback,\n SwarmEvent,\n TaskCompletionSummary,\n TaskContext,\n WsBroadcastCallback,\n} from \"./services/swarm-coordinator.js\";\nexport { SwarmCoordinator } from \"./services/swarm-coordinator.js\";\nexport type { CoordinationLLMResponse, SharedDecision } from \"./services/swarm-coordinator-prompts.js\";\nexport {\n buildBlockedEventMessage,\n buildTurnCompleteEventMessage,\n} from \"./services/swarm-coordinator-prompts.js\";\nexport type {\n AuthPromptCallback,\n CodingWorkspaceConfig,\n CommitOptions,\n ProvisionWorkspaceOptions,\n PushOptions,\n WorkspaceResult,\n} from \"./services/workspace-service.js\";\nexport { CodingWorkspaceService } from \"./services/workspace-service.js\";\n"
|
|
89
|
+
"/**\n * Task Agent Plugin for Milady\n *\n * Provides orchestration capabilities for CLI-based task agents:\n * - PTY session management (spawn, control, monitor task agents)\n * - Git workspace provisioning (clone, branch, PR creation)\n * - GitHub issue management (create, list, update, close)\n * - Integration with Claude Code, Codex, Gemini CLI, Aider, Pi, etc.\n *\n * @module @elizaos/plugin-agent-orchestrator\n */\n\nimport type { Plugin } from \"@elizaos/core\";\nimport { finalizeWorkspaceAction } from \"./actions/finalize-workspace.js\";\nimport { listAgentsAction } from \"./actions/list-agents.js\";\nimport { taskControlAction } from \"./actions/task-control.js\";\nimport { taskHistoryAction } from \"./actions/task-history.js\";\nimport { taskShareAction } from \"./actions/task-share.js\";\n// Actions - Issue management\nimport { manageIssuesAction } from \"./actions/manage-issues.js\";\n// Actions - Workspace management\nimport { provisionWorkspaceAction } from \"./actions/provision-workspace.js\";\nimport { sendToAgentAction } from \"./actions/send-to-agent.js\";\n// Actions - PTY management\nimport { spawnAgentAction } from \"./actions/spawn-agent.js\";\n// Actions - Unified task launcher\nimport { startCodingTaskAction } from \"./actions/start-coding-task.js\";\nimport { stopAgentAction } from \"./actions/stop-agent.js\";\n// Providers\nimport { codingAgentExamplesProvider } from \"./providers/action-examples.js\";\nimport { activeWorkspaceContextProvider } from \"./providers/active-workspace-context.js\";\n// Services\nimport { PTYService } from \"./services/pty-service.js\";\nimport { CodingWorkspaceService } from \"./services/workspace-service.js\";\n\nexport const taskAgentPlugin: Plugin = {\n name: \"@elizaos/plugin-agent-orchestrator\",\n description:\n \"Orchestrate open-ended task agents (Claude Code, Codex, Gemini CLI, Aider, Pi, etc.) via PTY sessions, \" +\n \"manage workspaces, track current task status, and keep background work moving while the main agent stays in conversation\",\n\n // NOTE: init() is NOT reliably called by ElizaOS for workspace plugins.\n // SwarmCoordinator and auth callback wiring is done in PTYService.start()\n // which ElizaOS calls reliably via the services lifecycle.\n\n // Services manage PTY sessions and git workspaces\n // biome-ignore lint/suspicious/noExplicitAny: ElizaOS Plugin type expects Service[] but our classes don't extend their base Service\n services: [PTYService as any, CodingWorkspaceService as any],\n\n // Actions expose capabilities to the agent\n actions: [\n // Unified task launcher (provision + spawn in one step)\n startCodingTaskAction,\n // PTY session management (for direct control)\n spawnAgentAction,\n sendToAgentAction,\n stopAgentAction,\n listAgentsAction,\n taskHistoryAction,\n taskControlAction,\n taskShareAction,\n // Workspace management\n provisionWorkspaceAction,\n finalizeWorkspaceAction,\n // Issue management\n manageIssuesAction,\n ],\n\n // No evaluators needed for now\n evaluators: [],\n\n // Providers inject context into the prompt\n providers: [\n activeWorkspaceContextProvider, // Live workspace/session state\n codingAgentExamplesProvider, // Structured action call examples\n ],\n};\n\nexport const codingAgentPlugin = taskAgentPlugin;\n\nexport default taskAgentPlugin;\n\n// Re-export coding agent adapter types\nexport type {\n AdapterType,\n AgentCredentials,\n AgentFileDescriptor,\n ApprovalConfig,\n ApprovalPreset,\n PreflightResult,\n PresetDefinition,\n RiskLevel,\n ToolCategory,\n WriteMemoryOptions,\n} from \"coding-agent-adapters\";\nexport { finalizeWorkspaceAction } from \"./actions/finalize-workspace.js\";\nexport { listAgentsAction } from \"./actions/list-agents.js\";\nexport { manageIssuesAction } from \"./actions/manage-issues.js\";\nexport { provisionWorkspaceAction } from \"./actions/provision-workspace.js\";\nexport { sendToAgentAction } from \"./actions/send-to-agent.js\";\nexport { spawnAgentAction } from \"./actions/spawn-agent.js\";\nexport { taskControlAction } from \"./actions/task-control.js\";\nexport { taskHistoryAction } from \"./actions/task-history.js\";\nexport { taskShareAction } from \"./actions/task-share.js\";\nexport { createTaskAction } from \"./actions/start-coding-task.js\";\nexport { listTaskAgentsAction } from \"./actions/list-agents.js\";\nexport { sendToTaskAgentAction } from \"./actions/send-to-agent.js\";\nexport { spawnTaskAgentAction } from \"./actions/spawn-agent.js\";\n// Re-export actions\nexport { startCodingTaskAction } from \"./actions/start-coding-task.js\";\nexport { stopAgentAction } from \"./actions/stop-agent.js\";\nexport { stopTaskAgentAction } from \"./actions/stop-agent.js\";\n// Re-export API routes for server integration\nexport {\n createCodingAgentRouteHandler,\n createTaskAgentRouteHandler,\n handleCodingAgentRoutes,\n} from \"./api/routes.js\";\n// Re-export service types\nexport type {\n CodingAgentType,\n PTYServiceConfig,\n SessionEventName,\n SessionInfo,\n SpawnSessionOptions,\n} from \"./services/pty-service.js\";\n// Re-export services for direct access\nexport { getCoordinator, PTYService } from \"./services/pty-service.js\";\nexport type {\n AgentDecisionCallback,\n ChatMessageCallback,\n CoordinationDecision,\n PendingDecision,\n SupervisionLevel,\n SwarmCompleteCallback,\n SwarmEvent,\n TaskCompletionSummary,\n TaskContext,\n WsBroadcastCallback,\n} from \"./services/swarm-coordinator.js\";\nexport { SwarmCoordinator } from \"./services/swarm-coordinator.js\";\nexport type { CoordinationLLMResponse, SharedDecision } from \"./services/swarm-coordinator-prompts.js\";\nexport {\n buildBlockedEventMessage,\n buildTurnCompleteEventMessage,\n} from \"./services/swarm-coordinator-prompts.js\";\nexport type {\n AuthPromptCallback,\n CodingWorkspaceConfig,\n CommitOptions,\n ProvisionWorkspaceOptions,\n PushOptions,\n WorkspaceResult,\n} from \"./services/workspace-service.js\";\nexport { CodingWorkspaceService } from \"./services/workspace-service.js\";\n"
|
|
82
90
|
],
|
|
83
|
-
"mappings": "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",
|
|
84
|
-
"debugId": "
|
|
91
|
+
"mappings": "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",
|
|
92
|
+
"debugId": "EA5312D04A2FFC5264756E2164756E21",
|
|
85
93
|
"names": []
|
|
86
94
|
}
|