@elizaos/plugin-agent-orchestrator 0.3.7 → 0.3.9

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/index.js.map CHANGED
@@ -1,28 +1,28 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/services/ansi-utils.ts", "../src/services/swarm-coordinator-prompts.ts", "../src/services/swarm-event-triage.ts", "../src/services/swarm-decision-loop.ts", "../src/actions/finalize-workspace.ts", "../src/actions/list-agents.ts", "../src/actions/manage-issues.ts", "../src/actions/provision-workspace.ts", "../src/actions/send-to-agent.ts", "../src/actions/spawn-agent.ts", "../src/services/pty-service.ts", "../src/services/agent-metrics.ts", "../src/services/agent-selection.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-idle-watchdog.ts", "../src/actions/coding-task-handlers.ts", "../src/actions/coding-task-helpers.ts", "../src/actions/start-coding-task.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/issue-routes.ts", "../src/api/workspace-routes.ts", "../src/api/routes.ts", "../src/index.ts"],
3
+ "sources": ["../src/services/ansi-utils.ts", "../src/services/swarm-coordinator-prompts.ts", "../src/services/swarm-event-triage.ts", "../src/services/swarm-decision-loop.ts", "../src/actions/finalize-workspace.ts", "../src/actions/list-agents.ts", "../src/actions/manage-issues.ts", "../src/actions/provision-workspace.ts", "../src/actions/send-to-agent.ts", "../src/actions/spawn-agent.ts", "../src/services/pty-service.ts", "../src/services/agent-metrics.ts", "../src/services/agent-selection.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-idle-watchdog.ts", "../src/actions/coding-task-handlers.ts", "../src/actions/coding-task-helpers.ts", "../src/actions/start-coding-task.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/** Lines that are just CLI loading/thinking status — no meaningful content. */\nconst LOADING_LINE =\n /^\\s*(?:thinking|Forging|Shenaniganing|Inferring|Cooking|Brewing|Loading|Scheming|Pondering|Conjuring|Manifesting|Reflecting|Synthesizing|Vibing|Summoning|Compiling|processing|Elucidating|Cogitat\\w+|Bak\\w+)(?:…|\\.{3})?(?:\\s*\\(.*\\))?\\s*$/i;\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/**\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 // Lines with only whitespace/punctuation and no alphanumeric content\n if (!/[a-zA-Z0-9]/.test(trimmed)) 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 * 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/** 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}\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): 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 coding agents. ` +\n `A ${taskCtx.agentType} coding 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 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\"), do NOT use \"complete\" yet. ` +\n `Instead respond with \"Review your PR, run each test plan item to verify it works, update the PR to check off each item, then confirm all items pass\".\\n` +\n `- Only use \"complete\" if the agent confirmed it verified ALL test plan items after creating the PR.\\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` +\n `Respond with ONLY a JSON object:\\n` +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\"}`\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): 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 coding agents. ` +\n `A ${taskCtx.agentType} coding 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 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` +\n `Respond with ONLY a JSON object:\\n` +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\"}`\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): 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 coding agents. ` +\n `A ${taskCtx.agentType} coding 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 historySection +\n `\\nOutput from this turn:\\n` +\n `---\\n${turnOutput.slice(-3000)}\\n---\\n\\n` +\n `The agent completed a turn. Decide if the OVERALL task is done or if more work is needed.\\n\\n` +\n `IMPORTANT: Coding agents work in multiple turns. A single turn completing does NOT mean ` +\n `the task is done. You must verify that EVERY objective in the original task has been addressed ` +\n `in the output before declaring \"complete\".\\n\\n` +\n `Your options:\\n\\n` +\n `1. \"respond\" — The agent finished a step but the overall task is NOT done yet. ` +\n `Send a follow-up instruction to continue. Set \"response\" to the next instruction ` +\n `(e.g. \"Now run the tests\", \"Create a PR with these changes\", \"Continue with the next part\"). ` +\n `THIS IS THE DEFAULT — most turns are intermediate steps, not the final result.\\n\\n` +\n `2. \"complete\" — The original task objectives have ALL been fully met. For repo-based tasks, ` +\n `this means code was written, changes were committed, pushed, AND a pull request was created. ` +\n `Only use this when you can point to specific evidence in the output for EVERY objective ` +\n `(e.g. \"Created pull request #N\" in the output).\\n\\n` +\n `3. \"escalate\" — Something looks wrong or you're unsure whether the task is complete. ` +\n `Let the human decide.\\n\\n` +\n `4. \"ignore\" — Should not normally be used here.\\n\\n` +\n `Guidelines:\\n` +\n `- BEFORE choosing \"complete\", enumerate each objective from the original task and verify ` +\n `evidence in the output. If ANY objective lacks evidence, use \"respond\" with the missing work.\\n` +\n `- A PR being created does NOT mean the task is done — check that the PR covers ALL requested changes.\\n` +\n `- If the task mentions multiple features/fixes, verify EACH one is addressed, not just the first.\\n` +\n `- If the agent only analyzed code or read files, it hasn't done the actual work yet — send a follow-up.\\n` +\n `- If the agent wrote code but didn't test it and testing seems appropriate, ask it to run tests.\\n` +\n `- If the output shows errors or failed tests, send a follow-up to fix them.\\n` +\n `- IMPORTANT: If the working directory is a git repository clone (not a scratch dir), the agent ` +\n `MUST commit its changes, push them, and create a pull request before the task can be \"complete\". ` +\n `If the output only shows code edits with no git commit or PR, respond with \"Now commit your changes, push, and create a pull request\".\\n` +\n `- IMPORTANT: Creating a PR is NOT the final step. If this is the turn where the PR was created ` +\n `(i.e. \"Created pull request\" or a PR URL appears for the FIRST time and no previous decision ` +\n `already sent a review follow-up), respond with \"Review your PR, run each test plan item to verify ` +\n `it works, update the PR to check off each item, then confirm all items pass\".\\n` +\n `- If a previous decision ALREADY sent a review/verification follow-up (check the decision history), ` +\n `and the agent has now responded with its review results, you MAY mark \"complete\" if the agent ` +\n `indicates the work is done (e.g. \"Done\", \"verified\", \"all checks pass\", \"Here's what I did\", ` +\n `or a clear summary of completed work). Do NOT require exact phrases — use judgment.\\n` +\n `- Keep follow-up instructions concise and specific.\\n` +\n `- When asking agents to verify work, prefer CLI tools (gh, curl, cat, git diff, etc.) over ` +\n `browser automation. Browser tools may not be available in headless environments and can cause delays.\\n` +\n `- Default to \"respond\" — only use \"complete\" when you're certain ALL work is done.\\n\\n` +\n `Respond with ONLY a JSON object:\\n` +\n `{\"action\": \"respond|complete|escalate|ignore\", \"response\": \"...\", \"useKeys\": false, \"keys\": [], \"reasoning\": \"...\"}`\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): 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 `[Coding 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 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, respond to review & verify test plan items before completing.\\n` +\n `- When in doubt, escalate.\\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\": \"...\"}\\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): 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 `[Coding 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 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\" — ALL task objectives met (code written, committed, PR created & verified)\\n` +\n `- \"escalate\" — something looks wrong, ask the user\\n` +\n `- \"ignore\" — should not normally be used here\\n\\n` +\n `Guidelines:\\n` +\n `- Verify evidence for EVERY objective before using \"complete\".\\n` +\n `- If code was written but not committed/pushed/PR'd, respond with next step.\\n` +\n `- If a PR was just created, respond to review & verify test plan items.\\n` +\n `- When asking agents to verify work, prefer CLI tools (gh, curl, cat, etc.) over browser automation.\\n` +\n `- Default to \"respond\" — only \"complete\" when certain ALL work is done.\\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\": \"...\"}\\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 return result;\n } catch {\n return null;\n }\n}\n",
7
7
  "/**\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\";\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 coding 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 runtime.useModel(ModelType.TEXT_SMALL, { prompt });\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",
8
- "/**\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 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 TaskContextSummary,\n} from \"./swarm-coordinator-prompts.js\";\nimport {\n classifyEventTier,\n type TriageContext,\n} from \"./swarm-event-triage.js\";\n\n// ─── Constants ───\n\n/** Maximum consecutive auto-responses before escalating to a human. */\nconst MAX_AUTO_RESPONSES = 10;\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/**\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/** 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\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 if (!allDone) return;\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.sendChatMessage(\n `All ${tasks.length} coding agents finished (${parts.join(\", \")}). Review their work when you're ready.`,\n \"coding-agent\",\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\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 );\n\n try {\n const result = await ctx.runtime.useModel(ModelType.TEXT_SMALL, {\n 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 if (decision.useKeys && decision.keys) {\n await ctx.ptyService.sendKeysToSession(sessionId, decision.keys);\n } else if (decision.response !== undefined) {\n await ctx.ptyService.sendToSession(sessionId, decision.response);\n }\n break;\n\n case \"complete\": {\n // LLM recognized the task is done — trigger completion flow\n const taskCtx = ctx.tasks.get(sessionId);\n if (taskCtx) {\n taskCtx.status = \"completed\";\n }\n ctx.broadcast({\n type: \"task_complete\",\n sessionId,\n timestamp: Date.now(),\n data: { reasoning: decision.reasoning },\n });\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 ctx.sendChatMessage(\n summary\n ? `Finished \"${taskCtx?.label ?? sessionId}\".\\n\\n${summary}`\n : `Finished \"${taskCtx?.label ?? sessionId}\".`,\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 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.decisions.push({\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 taskCtx.status = \"error\";\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 taskCtx.decisions.push({\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 // Throttled chat message: 1st, 2nd, then every 5th\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.sendChatMessage(\n `[${taskCtx.label}] Approved: ${excerpt}`,\n \"coding-agent\",\n );\n }\n return;\n }\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 taskCtx.decisions.push({\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 taskCtx.decisions.push({\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 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 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 // 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: \"turn_complete\",\n promptText: \"\",\n recentOutput: turnOutput,\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 const prompt = buildTurnCompletePrompt(\n toContextSummary(taskCtx),\n turnOutput,\n toDecisionHistory(taskCtx),\n );\n try {\n const result = await ctx.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n decision = parseCoordinationResponse(result);\n } catch (err) {\n ctx.log(`Turn-complete LLM call failed: ${err}`);\n }\n } else {\n // Creative — try Milaidy pipeline, fall back to small LLM\n if (agentDecisionCb) {\n const eventMessage = buildTurnCompleteEventMessage(\n toContextSummary(taskCtx),\n turnOutput,\n toDecisionHistory(taskCtx),\n );\n try {\n decision = await agentDecisionCb(eventMessage, sessionId, taskCtx);\n if (decision) decisionFromPipeline = true;\n } catch (err) {\n ctx.log(`Agent decision callback failed for turn-complete: ${err} — falling back to small LLM`);\n }\n }\n\n if (!decision) {\n const prompt = buildTurnCompletePrompt(\n toContextSummary(taskCtx),\n turnOutput,\n toDecisionHistory(taskCtx),\n );\n try {\n const result = await ctx.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n decision = parseCoordinationResponse(result);\n } catch (err) {\n ctx.log(`Turn-complete LLM fallback call failed: ${err}`);\n }\n }\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 taskCtx.decisions.push({\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 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.sendChatMessage(\n `[${taskCtx.label}] Turn done, continuing: ${preview}`,\n \"coding-agent\",\n );\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 }\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 );\n try {\n decision = await agentDecisionCb(eventMessage, sessionId, taskCtx);\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 taskCtx.decisions.push({\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.decisions.push({\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: decision.action,\n response: formatDecisionResponse(decision),\n reasoning: decision.reasoning,\n });\n\n // Reset auto-resolved count on manual decision\n taskCtx.autoResolvedCount = 0;\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.sendChatMessage(\n `[${taskCtx.label}] ${actionDesc} — ${reasonExcerpt}`,\n \"coding-agent\",\n );\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 }\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 );\n try {\n decision = await agentDecisionCb(eventMessage, sessionId, taskCtx);\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 ctx.pendingDecisions.set(sessionId, {\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 } else {\n // Queue the LLM's suggestion for human approval\n ctx.pendingDecisions.set(sessionId, {\n sessionId,\n promptText,\n recentOutput: output,\n llmDecision: decision,\n taskContext: taskCtx,\n createdAt: Date.now(),\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 }\n}\n",
8
+ "/**\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 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 TaskContextSummary,\n} from \"./swarm-coordinator-prompts.js\";\nimport {\n classifyEventTier,\n type TriageContext,\n} from \"./swarm-event-triage.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// ─── 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/**\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/** 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\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 if (!allDone) return;\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.sendChatMessage(\n `All ${tasks.length} coding agents finished (${parts.join(\", \")}). Review their work when you're ready.`,\n \"coding-agent\",\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\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 );\n\n try {\n const result = await ctx.runtime.useModel(ModelType.TEXT_SMALL, {\n 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 if (decision.useKeys && decision.keys) {\n await ctx.ptyService.sendKeysToSession(sessionId, decision.keys);\n } else if (decision.response !== undefined) {\n await ctx.ptyService.sendToSession(sessionId, decision.response);\n }\n break;\n\n case \"complete\": {\n // LLM recognized the task is done — trigger completion flow\n const taskCtx = ctx.tasks.get(sessionId);\n if (taskCtx) {\n taskCtx.status = \"completed\";\n }\n ctx.broadcast({\n type: \"task_complete\",\n sessionId,\n timestamp: Date.now(),\n data: { reasoning: decision.reasoning },\n });\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 ctx.sendChatMessage(\n summary\n ? `Finished \"${taskCtx?.label ?? sessionId}\".\\n\\n${summary}`\n : `Finished \"${taskCtx?.label ?? sessionId}\".`,\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 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.decisions.push({\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 taskCtx.status = \"error\";\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 taskCtx.decisions.push({\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 // 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 taskCtx.decisions.push({\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 taskCtx.decisions.push({\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 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 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 // 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 );\n try {\n const result = await ctx.runtime.useModel(ModelType.TEXT_SMALL, {\n 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 taskCtx.decisions.push({\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 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 }\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 );\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 taskCtx.decisions.push({\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.decisions.push({\n timestamp: Date.now(),\n event: \"blocked\",\n promptText,\n decision: decision.action,\n response: formatDecisionResponse(decision),\n reasoning: decision.reasoning,\n });\n\n // Reset auto-resolved count on manual decision\n taskCtx.autoResolvedCount = 0;\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 }\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 );\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 ctx.pendingDecisions.set(sessionId, {\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 } else {\n // Queue the LLM's suggestion for human approval\n ctx.pendingDecisions.set(sessionId, {\n sessionId,\n promptText,\n recentOutput: output,\n llmDecision: decision,\n taskContext: taskCtx,\n createdAt: Date.now(),\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 }\n}\n",
9
9
  "/**\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 coding 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 coding 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 coding agent\\n\\nGenerated by Milady coding 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 coding 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",
10
10
  "/**\n * LIST_CODING_AGENTS action - List active coding agent sessions\n *\n * Returns information about all running PTY sessions,\n * including their status, agent type, and working directory.\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 type { PTYService } from \"../services/pty-service.js\";\nimport type { SessionInfo } from \"../services/pty-types.js\";\n\nexport const listAgentsAction: Action = {\n name: \"LIST_CODING_AGENTS\",\n\n similes: [\n \"SHOW_CODING_AGENTS\",\n \"GET_ACTIVE_AGENTS\",\n \"LIST_SESSIONS\",\n \"SHOW_CODING_SESSIONS\",\n ],\n\n description:\n \"List all active coding agent sessions. \" +\n \"Shows session IDs, agent types, status, and working directories.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"What coding agents are running?\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Let me check the active coding sessions.\",\n action: \"LIST_CODING_AGENTS\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Show me the coding sessions\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Here are the active coding agents.\",\n action: \"LIST_CODING_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\n if (sessions.length === 0) {\n if (callback) {\n await callback({\n text: \"No active coding agents. Use SPAWN_CODING_AGENT to start one.\",\n });\n }\n return {\n success: true,\n text: \"No active coding agents\",\n data: { sessions: [] },\n };\n }\n\n // Format session info for display\n const sessionSummaries = 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 }));\n\n // Build readable text summary\n const lines = sessions.map((session: SessionInfo, index: number) => {\n const statusEmoji =\n {\n running: \"▶️\",\n idle: \"⏸️\",\n blocked: \"⚠️\",\n completed: \"✅\",\n error: \"❌\",\n }[session.status as string] ?? \"❓\";\n\n return `${index + 1}. ${statusEmoji} ${session.agentType} (${session.id.slice(0, 8)}...)\\n 📁 ${session.workdir}\\n Status: ${session.status}`;\n });\n\n if (callback) {\n await callback({\n text: `Active coding agents:\\n\\n${lines.join(\"\\n\\n\")}`,\n });\n }\n\n return {\n success: true,\n text: `Found ${sessions.length} active coding agents`,\n data: { sessions: sessionSummaries },\n };\n },\n\n parameters: [],\n};\n",
11
11
  "/**\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",
12
12
  "/**\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",
13
13
  "/**\n * SEND_TO_CODING_AGENT action - Send input to a running coding 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 type { PTYService } from \"../services/pty-service.js\";\n\nexport const sendToAgentAction: Action = {\n name: \"SEND_TO_CODING_AGENT\",\n\n similes: [\n \"MESSAGE_CODING_AGENT\",\n \"INPUT_TO_AGENT\",\n \"RESPOND_TO_AGENT\",\n \"TELL_CODING_AGENT\",\n ],\n\n description:\n \"Send text input to a running coding agent session. \" +\n \"Use this to respond to agent prompts, provide feedback, or give new instructions.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Tell the coding agent to accept the changes\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll send the approval to the coding agent.\",\n action: \"SEND_TO_CODING_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_CODING_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 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 content = message.content as {\n sessionId?: string;\n input?: string;\n keys?: string;\n };\n\n // Get session ID from content or state\n let sessionId = 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 coding 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 if (content.keys) {\n // Send special key sequence\n await ptyService.sendKeysToSession(sessionId, content.keys);\n if (callback) {\n await callback({\n text: `Sent key sequence to coding agent.`,\n });\n }\n return {\n success: true,\n text: \"Sent key sequence\",\n data: { sessionId, keys: content.keys },\n };\n } else if (content.input) {\n // Send text input\n await ptyService.sendToSession(sessionId, content.input);\n if (callback) {\n await callback({\n text: `Sent to coding agent: \"${content.input}\"`,\n });\n }\n return {\n success: true,\n text: \"Sent input to agent\",\n data: { sessionId, input: content.input },\n };\n } else {\n if (callback) {\n await callback({\n text: \"No input provided. Specify 'input' 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 coding 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 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",
14
14
  "/**\n * SPAWN_CODING_AGENT action - Spawns a CLI coding agent\n *\n * Creates a new PTY session for a coding 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 type { CodingWorkspaceService } from \"../services/workspace-service.js\";\n\nexport const spawnAgentAction: Action = {\n name: \"SPAWN_CODING_AGENT\",\n\n similes: [\n \"START_CODING_AGENT\",\n \"LAUNCH_CODING_AGENT\",\n \"CREATE_CODING_AGENT\",\n \"SPAWN_CODER\",\n \"RUN_CODING_AGENT\",\n ],\n\n description:\n \"Spawn a CLI coding agent (Claude Code, Codex, Gemini, Aider, Pi) to work on a coding task. \" +\n \"The agent runs in a PTY session and can execute code, run tests, and make changes. \" +\n \"Returns a session ID that can be used to interact with the agent.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Spawn Claude Code to fix the bug in auth.ts\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll spawn Claude Code to work on that. Let me set up the coding session.\",\n action: \"SPAWN_CODING_AGENT\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Start a coding agent to implement the new feature\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll create a coding session for that task.\",\n action: \"SPAWN_CODING_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_CODING_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 coding 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 rawAgentType =\n (params?.agentType as string) ??\n (content.agentType as string) ??\n \"claude\";\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 from runtime settings\n const credentials: AgentCredentials = {\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 };\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\n // Spawn the PTY session\n const session: SessionInfo = await ptyService.spawnSession({\n name: `coding-${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 ...(coordinator ? { skipAdapterAutoResponse: true } : {}),\n metadata: {\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: `Coding 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: \"Coding agent completed the task.\",\n });\n }\n\n // Handle errors\n if (event === \"error\" && callback) {\n callback({\n text: `Coding agent encountered an error: ${(data as { message?: string }).message ?? \"unknown error\"}`,\n });\n }\n }\n });\n if (coordinator && task) {\n coordinator.registerTask(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 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} coding 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} coding 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_CODING_AGENT] Failed to spawn agent:\", errorMessage);\n\n if (callback) {\n await callback({\n text: `Failed to spawn coding agent: ${errorMessage}`,\n });\n }\n\n return { success: false, error: errorMessage };\n }\n },\n\n parameters: [\n {\n name: \"agentType\",\n description:\n \"Type of coding agent to spawn. Options: claude (Claude Code), codex (OpenAI Codex), gemini (Google Gemini), aider, pi, shell (generic shell)\",\n required: false,\n schema: { type: \"string\" as const, default: \"claude\" },\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: \"Initial task or prompt to send to the agent once spawned.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"memoryContent\",\n description:\n \"Instructions/context to write to the agent's memory file (e.g. CLAUDE.md) before spawning.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"approvalPreset\",\n description:\n \"Permission level: 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",
15
- "/** @module services/pty-service */\n\nimport { 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 {\n type AgentSelectionStrategy,\n selectAgentType,\n} from \"./agent-selection.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\";\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 = \"Manages PTY sessions for CLI coding agents\";\n\n private runtime: IAgentRuntime;\n private manager: PTYManager | BunCompatiblePTYManager | null = null;\n private usingBunWorker: boolean = false;\n private serviceConfig: PTYServiceConfig;\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 sessionOutputBuffers: Map<string, string[]> = 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 ?? \"permissive\",\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 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 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 return (taskCtx?.decisions.length ?? 0) > 0;\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 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\n if (this.manager) {\n await this.manager.shutdown();\n this.manager = null;\n }\n this.sessionMetadata.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\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 (options.approvalPreset && 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: options.approvalPreset },\n } as SpawnConfig);\n this.log(\n `Wrote approval config (${options.approvalPreset}) for ${resolvedAgentType}: ${written.join(\", \")}`,\n );\n } catch (err) {\n this.log(`Failed to write approval config: ${err}`);\n }\n }\n\n // Inject allowedDirectories into Claude settings to restrict auto-approval scope\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 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 allowedDirectories: ${err}`);\n }\n }\n\n const spawnConfig = buildSpawnConfig(\n sessionId,\n {\n ...options,\n agentType: resolvedAgentType,\n initialTask: resolvedInitialTask,\n },\n workdir,\n );\n const session = await this.manager.spawn(spawnConfig);\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 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 };\n\n // Buffer output for Bun worker path (no logs() method available)\n if (this.usingBunWorker) {\n setupOutputBuffer(ctx, session.id);\n }\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 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 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 return stopSessionIO(\n this.ioContext(),\n sessionId,\n this.sessionMetadata,\n this.sessionWorkdirs,\n (msg) => this.log(msg),\n force,\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 ?? \"permissive\";\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 /** Default agent type when strategy is \"fixed\" — env var takes precedence. */\n get defaultAgentType(): AdapterType {\n const fromEnv = this.runtime.getSetting(\"PARALLAX_DEFAULT_AGENT_TYPE\") as\n | string\n | undefined;\n if (\n fromEnv &&\n [\"claude\", \"gemini\", \"codex\", \"aider\"].includes(fromEnv.toLowerCase())\n ) {\n return fromEnv.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 strategy = this.agentSelectionStrategy;\n const fixedAgentType = this.defaultAgentType;\n\n if (strategy === \"fixed\") {\n return fixedAgentType;\n }\n\n // Ranked mode — need installed agents list\n const preflight = await this.checkAvailableAgents();\n const metrics = this.metricsTracker.getAll();\n\n return selectAgentType({\n config: { strategy, fixedAgentType },\n metrics,\n installedAgents: preflight,\n });\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 undefined;\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 return sessions.map((s) =>\n this.toSessionInfo(s, this.sessionWorkdirs.get(s.id)),\n );\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 isSessionBlocked(sessionId: string): boolean {\n const session = this.getSession(sessionId);\n return session?.status === \"authenticating\";\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 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 // ─── 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 emitEvent(sessionId: string, event: string, data: unknown): void {\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 if (this.serviceConfig.debug) {\n logger.debug(`[PTYService] ${message}`);\n }\n }\n}\n",
15
+ "/** @module services/pty-service */\n\nimport { 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 {\n type AgentSelectionStrategy,\n selectAgentType,\n} from \"./agent-selection.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\";\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 = \"Manages PTY sessions for CLI coding agents\";\n\n private runtime: IAgentRuntime;\n private manager: PTYManager | BunCompatiblePTYManager | null = null;\n private usingBunWorker: boolean = false;\n private serviceConfig: PTYServiceConfig;\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 sessionOutputBuffers: Map<string, string[]> = 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 ?? \"permissive\",\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 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 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 const taskCtx = coordinator.getTaskContext(sessionId);\n if (taskCtx) taskCtx.taskDelivered = true;\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 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\n if (this.manager) {\n await this.manager.shutdown();\n this.manager = null;\n }\n this.sessionMetadata.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\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 (options.approvalPreset && 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: options.approvalPreset },\n } as SpawnConfig);\n this.log(\n `Wrote approval config (${options.approvalPreset}) for ${resolvedAgentType}: ${written.join(\", \")}`,\n );\n } catch (err) {\n this.log(`Failed to write approval config: ${err}`);\n }\n }\n\n // Inject allowedDirectories and HTTP hooks into Claude settings\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 const serverPort =\n (this.runtime.getSetting(\"SERVER_PORT\") as string | undefined) ??\n \"2138\";\n const adapter = this.getAdapter(\"claude\");\n const hookProtocol = adapter.getHookTelemetryProtocol({\n httpUrl: `http://localhost:${serverPort}/api/coding-agents/hooks`,\n sessionId,\n });\n if (hookProtocol) {\n settings.hooks = 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 const spawnConfig = buildSpawnConfig(\n sessionId,\n {\n ...options,\n agentType: resolvedAgentType,\n initialTask: resolvedInitialTask,\n },\n workdir,\n );\n const session = await this.manager.spawn(spawnConfig);\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 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 const taskCtx = coordinator.getTaskContext(sessionId);\n if (taskCtx) taskCtx.taskDelivered = true;\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 // 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 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 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 return stopSessionIO(\n this.ioContext(),\n sessionId,\n this.sessionMetadata,\n this.sessionWorkdirs,\n (msg) => this.log(msg),\n force,\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 ?? \"permissive\";\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 /** Default agent type when strategy is \"fixed\" — env var takes precedence. */\n get defaultAgentType(): AdapterType {\n const fromEnv = this.runtime.getSetting(\"PARALLAX_DEFAULT_AGENT_TYPE\") as\n | string\n | undefined;\n if (\n fromEnv &&\n [\"claude\", \"gemini\", \"codex\", \"aider\"].includes(fromEnv.toLowerCase())\n ) {\n return fromEnv.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 strategy = this.agentSelectionStrategy;\n const fixedAgentType = this.defaultAgentType;\n\n if (strategy === \"fixed\") {\n return fixedAgentType;\n }\n\n // Ranked mode — need installed agents list\n const preflight = await this.checkAvailableAgents();\n const metrics = this.metricsTracker.getAll();\n\n return selectAgentType({\n config: { strategy, fixedAgentType },\n metrics,\n installedAgents: preflight,\n });\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 undefined;\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 return sessions.map((s) =>\n this.toSessionInfo(s, this.sessionWorkdirs.get(s.id)),\n );\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 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 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 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 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 // ─── 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 emitEvent(sessionId: string, event: string, data: unknown): void {\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",
16
16
  "/**\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",
17
17
  "/**\n * Dynamic agent selection strategy.\n *\n * Chooses which coding-agent CLI to spawn when the caller does not\n * specify an explicit `agentType`.\n *\n * - **fixed** — always returns `config.fixedAgentType`\n * - **ranked** — scores each installed agent on success rate,\n * stall frequency, and completion speed, then\n * returns the highest-scoring one\n *\n * @module services/agent-selection\n */\n\nimport type { AdapterType, PreflightResult } from \"coding-agent-adapters\";\n// ── Types ────────────────────────────────────────────────────────────\n\nexport type AgentSelectionStrategy = \"fixed\" | \"ranked\";\n\n/** Subset of AgentMetrics fields used for scoring. */\nexport interface AgentScoreInput {\n spawned: number;\n completed: number;\n stallCount: number;\n avgCompletionMs: number;\n}\n\nexport interface AgentSelectionConfig {\n strategy: AgentSelectionStrategy;\n fixedAgentType: AdapterType;\n}\n\nexport interface AgentSelectionContext {\n config: AgentSelectionConfig;\n /** Per-agent-type metrics snapshot (may be empty). */\n metrics: Record<string, AgentScoreInput>;\n /** Preflight results — only the `installed` ones are candidates. */\n installedAgents: PreflightResult[];\n}\n\n// ── Scoring ──────────────────────────────────────────────────────────\n\n/**\n * Compute a 0–1 score for a single agent based on its metrics.\n *\n * - `successRate` = completed / spawned (0.5 neutral prior when no data)\n * - `volumeWeight` = min(1, spawned / 5) — blends toward neutral at low N\n * - `stallPenalty` = (stallCount / spawned) * 0.3\n * - `speedPenalty` = min(avgCompletionMs / 300_000, 1) * 0.1 — weak tiebreaker\n *\n * Cold-start (no spawns): returns 0.5 so all agents are equal.\n */\nexport function computeAgentScore(\n metrics: AgentScoreInput | undefined,\n): number {\n if (!metrics || metrics.spawned === 0) return 0.5;\n\n const { spawned, completed, stallCount, avgCompletionMs } = metrics;\n\n const rawSuccess = completed / spawned;\n const volumeWeight = Math.min(1, spawned / 5);\n const successRate = rawSuccess * volumeWeight + 0.5 * (1 - volumeWeight);\n\n const stallPenalty = (stallCount / spawned) * 0.3;\n const speedPenalty = Math.min(avgCompletionMs / 300_000, 1) * 0.1;\n\n return Math.max(0, successRate - stallPenalty - speedPenalty);\n}\n\n// ── Selection ────────────────────────────────────────────────────────\n\n/** Default ordering when scores are tied — first entry wins. */\nconst DEFAULT_ORDER: AdapterType[] = [\"claude\", \"gemini\", \"codex\", \"aider\"];\n\n/**\n * Select the best agent type given the current strategy, metrics, and\n * installed agents.\n *\n * Explicit user choice (`params.agentType`) should be resolved by the\n * caller *before* reaching this function.\n */\nexport function selectAgentType(ctx: AgentSelectionContext): AdapterType {\n if (ctx.config.strategy === \"fixed\") {\n return ctx.config.fixedAgentType;\n }\n\n // ── ranked mode ──\n const installed = new Set(\n ctx.installedAgents\n .filter((r) => r.installed)\n .map((r) => r.adapter as AdapterType),\n );\n\n // If nothing is installed, fall back to config default\n if (installed.size === 0) {\n return ctx.config.fixedAgentType;\n }\n\n let bestAgent: AdapterType = ctx.config.fixedAgentType;\n let bestScore = -1;\n\n for (const agent of DEFAULT_ORDER) {\n if (!installed.has(agent)) continue;\n const score = computeAgentScore(ctx.metrics[agent]);\n if (score > bestScore) {\n bestScore = score;\n bestAgent = agent;\n }\n }\n\n return bestAgent;\n}\n",
18
18
  "/**\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\";\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 // 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 // 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",
19
- "/**\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 /** Check if a session has an active task in the coordinator. */\n hasActiveTask?: (sessionId: string) => boolean;\n /** Check if a session's task has had any coordinator activity (decisions > 0). */\n hasTaskActivity?: (sessionId: string) => boolean;\n}\n\n/**\n * If a session has an active task with activity (decisions > 0), 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 });\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: { code: number; signal: string }) => {\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 });\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",
20
- "/**\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 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 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 * 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",
21
- "/**\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 \"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 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 pushDefaultRules: (sessionId: string, agentType: string) => Promise<void>;\n toSessionInfo: (\n session: SessionHandle | WorkerSessionHandle,\n workdir?: string,\n ) => SessionInfo;\n log: (msg: string) => void;\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 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 MIN_NEW_LINES = 15; // agent working produces significant output\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 < MIN_NEW_LINES) {\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 // 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: { ...buildSanitizedBaseEnv(), ...options.env, ...modelEnv },\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",
19
+ "/**\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 /** 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: { code: number; signal: string }) => {\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",
20
+ "/**\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 .claude/settings.json so they don't\n // leak to other Claude instances using the same workdir.\n const workdir = sessionWorkdirs.get(sessionId);\n if (workdir) {\n try {\n await cleanupClaudeHooks(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 HTTP hooks from a workspace's .claude/settings.json.\n * Best-effort — errors are logged but not thrown.\n */\nasync function cleanupClaudeHooks(\n workdir: string,\n log: (msg: string) => void,\n): Promise<void> {\n const settingsPath = join(workdir, \".claude\", \"settings.json\");\n try {\n const raw = await readFile(settingsPath, \"utf-8\");\n const settings = JSON.parse(raw) as Record<string, unknown>;\n if (!settings.hooks) return; // nothing to clean\n delete settings.hooks;\n await writeFile(settingsPath, JSON.stringify(settings, null, 2), \"utf-8\");\n log(`Cleaned up hooks from ${settingsPath}`);\n } catch {\n // File may not exist or may already be clean — ignore\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",
21
+ "/**\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 \"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 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 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\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 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 MIN_NEW_LINES = 15; // agent working produces significant output\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 < MIN_NEW_LINES) {\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",
22
22
  "/**\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 coding agent adapters (default: true) */\n registerCodingAdapters?: boolean;\n /** Maximum concurrent PTY sessions (default: 8) */\n maxConcurrentSessions?: number;\n /**\n * Default approval preset for coding 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: \"permissive\"\n */\n defaultApprovalPreset?: ApprovalPreset;\n}\n\n/** Available coding 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",
23
23
  "/**\n * Stall classification subsystem — determines what a \"stalled\" coding 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\";\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 coding agent sessions. ` +\n `A ${agentType} coding 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 runtime.useModel(ModelType.TEXT_SMALL, {\n 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 coding agent sessions. ` +\n `A ${agentType} coding 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, respond to review & verify test plan items before completing.\\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 runtime.useModel(ModelType.TEXT_SMALL, {\n 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",
24
- "/**\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 type { PTYService } from \"./pty-service.js\";\nimport type { CodingAgentType } from \"./pty-types.js\";\nimport type { CoordinationLLMResponse } from \"./swarm-coordinator-prompts.js\";\nimport {\n checkAllTasksComplete,\n executeDecision as execDecision,\n handleBlocked,\n handleTurnComplete,\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 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\nexport type SupervisionLevel = \"autonomous\" | \"confirm\" | \"notify\";\n\nexport interface TaskContext {\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: \"active\" | \"completed\" | \"error\" | \"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}\n\nexport interface CoordinationDecision {\n timestamp: number;\n event: string;\n promptText: string;\n decision: \"respond\" | \"escalate\" | \"ignore\" | \"complete\" | \"auto_resolved\" | \"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 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 /** 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 broadcast(event: SwarmEvent): void;\n sendChatMessage(text: string, source?: string): void;\n log(message: string): void;\n getSupervisionLevel(): SupervisionLevel;\n getAgentDecisionCallback(): AgentDecisionCallback | null;\n}\n\n// ─── Constants ───\n\n/** Time to buffer events for unregistered sessions (ms). */\nconst UNREGISTERED_BUFFER_MS = 2000;\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\n// ─── Service ───\n\nexport class SwarmCoordinator implements SwarmCoordinatorContext {\n static serviceType = \"SWARM_COORDINATOR\";\n\n readonly runtime: IAgentRuntime;\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 /** 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 /** 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 /** Buffered events during pause — replayed on resume. */\n private pauseBuffer: Array<{ sessionId: string; event: string; data: unknown }> = [];\n\n /** Auto-resume timeout handle. */\n private pauseTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(runtime: IAgentRuntime) {\n this.runtime = runtime;\n }\n\n // ─── Chat Callback ───\n\n /** Inject a callback (from server.ts) to route messages to the user's chat UI. */\n setChatCallback(cb: ChatMessageCallback): void {\n this.chatCallback = cb;\n this.log(\"Chat callback wired\");\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 this.log(\"WS broadcast callback wired\");\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(\"Agent decision callback wired — events will route through Milaidy\");\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 start(ptyService: PTYService): void {\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 stop(): void {\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 this.unregisteredBuffer.clear();\n this.lastSeenOutput.clear();\n this.lastToolNotification.clear();\n this.agentDecisionCb = null;\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.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(\"Coordinator paused — buffering LLM decisions until user message is processed\");\n this.broadcast({ type: \"coordinator_paused\", sessionId: \"\", timestamp: Date.now(), data: {} });\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(`Coordinator resumed — replaying ${this.pauseBuffer.length} buffered events`);\n this.broadcast({ type: \"coordinator_resumed\", sessionId: \"\", timestamp: Date.now(), data: {} });\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((err) => {\n this.log(`Error replaying buffered event: ${err}`);\n });\n }\n }\n\n // ─── Task Registration ───\n\n registerTask(\n sessionId: string,\n context: {\n agentType: CodingAgentType;\n label: string;\n originalTask: string;\n workdir: string;\n repo?: string;\n },\n ): void {\n this.tasks.set(sessionId, {\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 });\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 // Flush any buffered events for this session\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 }\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 getLastUsedRepo(): string | undefined {\n let latest: TaskContext | undefined;\n for (const task of this.tasks.values()) {\n if (\n task.repo &&\n (!latest || task.registeredAt > latest.registeredAt)\n ) {\n latest = task;\n }\n }\n return latest?.repo;\n }\n\n getTaskContext(sessionId: string): TaskContext | undefined {\n return this.tasks.get(sessionId);\n }\n\n getAllTaskContexts(): TaskContext[] {\n return Array.from(this.tasks.values());\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\n this.wsBroadcast?.(event);\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 const taskCtx = this.tasks.get(sessionId);\n\n // Buffer events for unregistered sessions (race condition guard)\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 // Re-check after delay\n setTimeout(() => {\n const stillBuffered = this.unregisteredBuffer.get(sessionId);\n if (stillBuffered && stillBuffered.length > 0) {\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(\n sessionId,\n entry.event,\n entry.data,\n ).catch(() => {});\n }\n } else {\n // Still no task context — discard\n this.unregisteredBuffer.delete(sessionId);\n this.log(\n `Discarding ${stillBuffered.length} buffered events for unregistered session ${sessionId}`,\n );\n }\n }\n }, UNREGISTERED_BUFFER_MS);\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 if (taskCtx.status === \"stopped\" || taskCtx.status === \"error\" || taskCtx.status === \"completed\") {\n if (event !== \"stopped\" && event !== \"error\") {\n this.log(`Ignoring \"${event}\" for ${taskCtx.label} (status: ${taskCtx.status})`);\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: 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(`Buffered \"${event}\" for ${taskCtx.label} (coordinator paused)`);\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 await handleBlocked(this, sessionId, taskCtx, data);\n break;\n\n case \"task_complete\": {\n // The adapter detected a turn completion (agent back at idle prompt).\n // Don't immediately stop — ask the LLM if the overall task is done\n // or if the agent needs more turns.\n this.broadcast({\n type: \"turn_complete\",\n sessionId,\n timestamp: Date.now(),\n data,\n });\n\n await handleTurnComplete(this, sessionId, taskCtx, data);\n break;\n }\n\n case \"error\": {\n taskCtx.status = \"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 this.sendChatMessage(\n `\"${taskCtx.label}\" hit an error: ${errorMsg}`,\n \"coding-agent\",\n );\n checkAllTasksComplete(this);\n break;\n }\n\n case \"stopped\":\n taskCtx.status = \"stopped\";\n this.inFlightDecisions.delete(sessionId);\n this.broadcast({\n type: \"stopped\",\n sessionId,\n timestamp: Date.now(),\n data,\n });\n checkAllTasksComplete(this);\n break;\n\n case \"ready\":\n this.broadcast({\n type: \"ready\",\n sessionId,\n timestamp: Date.now(),\n data,\n });\n break;\n\n case \"tool_running\": {\n // Agent is actively working via an external tool — keep watchdog happy\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 // 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 toolData = data as {\n toolName?: string;\n description?: string;\n };\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.sendChatMessage(\n `[${taskCtx.label}] Running ${toolDesc}.${urlSuffix} The agent is working outside the terminal — I'll let it finish.`,\n \"coding-agent\",\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 }\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 this.pendingDecisions.delete(sessionId);\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.decisions.push({\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 taskCtx.autoResolvedCount = 0;\n }\n\n await this.executeDecision(sessionId, decision);\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.decisions.push({\n timestamp: Date.now(),\n event: \"blocked\",\n promptText: pending.promptText,\n decision: \"escalate\",\n reasoning: \"Human rejected the suggested action\",\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",
25
- "/**\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 TaskContextSummary,\n} from \"./swarm-coordinator-prompts.js\";\nimport { checkAllTasksComplete, executeDecision } from \"./swarm-decision-loop.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\") continue;\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.decisions.push({\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.decisions.push({\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 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 prompt = buildIdleCheckPrompt(\n contextSummary,\n recentOutput,\n idleMinutes,\n taskCtx.idleCheckCount,\n MAX_IDLE_CHECKS,\n decisionHistory,\n );\n\n let decision: CoordinationLLMResponse | null = null;\n try {\n const result = await ctx.runtime.useModel(ModelType.TEXT_SMALL, {\n 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 taskCtx.decisions.push({\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.sendChatMessage(\n `[${taskCtx.label}] Idle for ${idleMinutes}m — ${actionDesc}`,\n \"coding-agent\",\n );\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",
24
+ "/**\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 type { PTYService } from \"./pty-service.js\";\nimport type { CodingAgentType } from \"./pty-types.js\";\nimport type { CoordinationLLMResponse } from \"./swarm-coordinator-prompts.js\";\nimport {\n checkAllTasksComplete,\n executeDecision as execDecision,\n handleBlocked,\n handleTurnComplete,\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 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\nexport type SupervisionLevel = \"autonomous\" | \"confirm\" | \"notify\";\n\nexport interface TaskContext {\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: \"active\" | \"completed\" | \"error\" | \"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}\n\nexport interface CoordinationDecision {\n timestamp: number;\n event: string;\n promptText: string;\n decision: \"respond\" | \"escalate\" | \"ignore\" | \"complete\" | \"auto_resolved\" | \"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 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 /** 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 broadcast(event: SwarmEvent): void;\n sendChatMessage(text: string, source?: string): void;\n log(message: string): void;\n getSupervisionLevel(): SupervisionLevel;\n getAgentDecisionCallback(): AgentDecisionCallback | null;\n}\n\n// ─── Constants ───\n\n/** Time to buffer events for unregistered sessions (ms). */\nconst UNREGISTERED_BUFFER_MS = 2000;\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\n// ─── Service ───\n\nexport class SwarmCoordinator implements SwarmCoordinatorContext {\n static serviceType = \"SWARM_COORDINATOR\";\n\n readonly runtime: IAgentRuntime;\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 /** 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 /** 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 /** Buffered events during pause — replayed on resume. */\n private pauseBuffer: Array<{ sessionId: string; event: string; data: unknown }> = [];\n\n /** Auto-resume timeout handle. */\n private pauseTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(runtime: IAgentRuntime) {\n this.runtime = runtime;\n }\n\n // ─── Chat Callback ───\n\n /** Inject a callback (from server.ts) to route messages to the user's chat UI. */\n setChatCallback(cb: ChatMessageCallback): void {\n this.chatCallback = cb;\n this.log(\"Chat callback wired\");\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 this.log(\"WS broadcast callback wired\");\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(\"Agent decision callback wired — events will route through Milaidy\");\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 start(ptyService: PTYService): void {\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 stop(): void {\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 this.unregisteredBuffer.clear();\n this.lastSeenOutput.clear();\n this.lastToolNotification.clear();\n this.agentDecisionCb = null;\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.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(\"Coordinator paused — buffering LLM decisions until user message is processed\");\n this.broadcast({ type: \"coordinator_paused\", sessionId: \"\", timestamp: Date.now(), data: {} });\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(`Coordinator resumed — replaying ${this.pauseBuffer.length} buffered events`);\n this.broadcast({ type: \"coordinator_resumed\", sessionId: \"\", timestamp: Date.now(), data: {} });\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((err) => {\n this.log(`Error replaying buffered event: ${err}`);\n });\n }\n }\n\n // ─── Task Registration ───\n\n registerTask(\n sessionId: string,\n context: {\n agentType: CodingAgentType;\n label: string;\n originalTask: string;\n workdir: string;\n repo?: string;\n },\n ): void {\n this.tasks.set(sessionId, {\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 });\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 // Flush any buffered events for this session\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 }\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 getLastUsedRepo(): string | undefined {\n let latest: TaskContext | undefined;\n for (const task of this.tasks.values()) {\n if (\n task.repo &&\n (!latest || task.registeredAt > latest.registeredAt)\n ) {\n latest = task;\n }\n }\n return latest?.repo;\n }\n\n getTaskContext(sessionId: string): TaskContext | undefined {\n return this.tasks.get(sessionId);\n }\n\n getAllTaskContexts(): TaskContext[] {\n return Array.from(this.tasks.values());\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\n this.wsBroadcast?.(event);\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 const taskCtx = this.tasks.get(sessionId);\n\n // Buffer events for unregistered sessions (race condition guard)\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 // Re-check after delay\n setTimeout(() => {\n const stillBuffered = this.unregisteredBuffer.get(sessionId);\n if (stillBuffered && stillBuffered.length > 0) {\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(\n sessionId,\n entry.event,\n entry.data,\n ).catch(() => {});\n }\n } else {\n // Still no task context — discard\n this.unregisteredBuffer.delete(sessionId);\n this.log(\n `Discarding ${stillBuffered.length} buffered events for unregistered session ${sessionId}`,\n );\n }\n }\n }, UNREGISTERED_BUFFER_MS);\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 if (taskCtx.status === \"stopped\" || taskCtx.status === \"error\" || taskCtx.status === \"completed\") {\n if (event !== \"stopped\" && event !== \"error\") {\n this.log(`Ignoring \"${event}\" for ${taskCtx.label} (status: ${taskCtx.status})`);\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: 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(`Buffered \"${event}\" for ${taskCtx.label} (coordinator paused)`);\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 await handleBlocked(this, sessionId, taskCtx, data);\n break;\n\n case \"task_complete\": {\n // The adapter detected a turn completion (agent back at idle prompt).\n // Don't immediately stop — ask the LLM if the overall task is done\n // or if the agent needs more turns.\n this.broadcast({\n type: \"turn_complete\",\n sessionId,\n timestamp: Date.now(),\n data,\n });\n\n await handleTurnComplete(this, sessionId, taskCtx, data);\n break;\n }\n\n case \"error\": {\n taskCtx.status = \"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 this.sendChatMessage(\n `\"${taskCtx.label}\" hit an error: ${errorMsg}`,\n \"coding-agent\",\n );\n checkAllTasksComplete(this);\n break;\n }\n\n case \"stopped\":\n taskCtx.status = \"stopped\";\n this.inFlightDecisions.delete(sessionId);\n this.broadcast({\n type: \"stopped\",\n sessionId,\n timestamp: Date.now(),\n data,\n });\n checkAllTasksComplete(this);\n break;\n\n case \"ready\":\n this.broadcast({\n type: \"ready\",\n sessionId,\n timestamp: Date.now(),\n data,\n });\n break;\n\n case \"tool_running\": {\n // Agent is actively working via an external tool — keep watchdog happy\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 }\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 this.pendingDecisions.delete(sessionId);\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.decisions.push({\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 taskCtx.autoResolvedCount = 0;\n }\n\n await this.executeDecision(sessionId, decision);\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.decisions.push({\n timestamp: Date.now(),\n event: \"blocked\",\n promptText: pending.promptText,\n decision: \"escalate\",\n reasoning: \"Human rejected the suggested action\",\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",
25
+ "/**\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 TaskContextSummary,\n} from \"./swarm-coordinator-prompts.js\";\nimport { checkAllTasksComplete, executeDecision } from \"./swarm-decision-loop.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\") continue;\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.decisions.push({\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.decisions.push({\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 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 prompt = buildIdleCheckPrompt(\n contextSummary,\n recentOutput,\n idleMinutes,\n taskCtx.idleCheckCount,\n MAX_IDLE_CHECKS,\n decisionHistory,\n );\n\n let decision: CoordinationLLMResponse | null = null;\n try {\n const result = await ctx.runtime.useModel(ModelType.TEXT_SMALL, {\n 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 taskCtx.decisions.push({\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",
26
26
  "/**\n * Handler logic for the START_CODING_TASK action.\n *\n * - handleMultiAgent() -- Multi-agent mode (pipe-delimited `agents` param)\n * - handleSingleAgent() -- Single-agent mode (standard handler path)\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 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 type { CodingWorkspaceService } from \"../services/workspace-service.js\";\nimport type { AgentSelectionStrategy } from \"../services/agent-selection.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/** 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 const agentSpecs = agentsParam\n .split(\"|\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n if (agentSpecs.length === 0) {\n if (callback) {\n await callback({\n text: \"No agent tasks provided in agents parameter.\",\n });\n }\n return { success: false, error: \"EMPTY_AGENTS_PARAM\" };\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 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 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 const knownTypes = [\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 ];\n if (knownTypes.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 const prefix = spec.slice(0, colonIdx).trim().toLowerCase();\n const knownTypes = [\n \"claude\", \"claude-code\", \"claudecode\", \"codex\", \"openai\",\n \"gemini\", \"google\", \"aider\", \"pi\", \"pi-ai\", \"piai\",\n \"pi-coding-agent\", \"picodingagent\", \"shell\", \"bash\",\n ];\n if (knownTypes.includes(prefix)) {\n specTask = spec.slice(colonIdx + 1).trim();\n }\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();\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 const coordinator = getCoordinator(runtime);\n\n // Spawn the agent\n const initialTask = specPiRequested ? toPiCommand(specTask) : specTask;\n const displayType = specPiRequested ? \"pi\" : specAgentType;\n const session: SessionInfo = await ptyService.spawnSession({\n name: `coding-${Date.now()}-${i}`,\n agentType: specAgentType,\n workdir,\n initialTask,\n memoryContent,\n credentials,\n approvalPreset:\n (approvalPreset as ApprovalPreset | undefined) ??\n ptyService.defaultApprovalPreset,\n customCredentials,\n ...(coordinator ? { skipAdapterAutoResponse: true } : {}),\n metadata: {\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 coordinator.registerTask(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\n/**\n * Single-agent mode handler.\n *\n * Provisions a workspace (clone or scratch) and spawns a single coding agent.\n */\nexport async function handleSingleAgent(\n ctx: CodingTaskContext,\n task: string | undefined,\n): Promise<ActionResult | undefined> {\n logger.debug(\n `[START_CODING_TASK] handleSingleAgent called, agentType=${ctx.defaultAgentType}, task=${task ? \"yes\" : \"none\"}, repo=${ctx.repo ?? \"none\"}`,\n );\n const {\n runtime,\n ptyService,\n wsService,\n credentials,\n customCredentials,\n callback,\n message,\n state,\n repo,\n defaultAgentType: agentType,\n rawAgentType,\n memoryContent,\n approvalPreset,\n explicitLabel,\n } = ctx;\n\n // Generate or use explicit label\n const label = explicitLabel || generateLabel(repo, task);\n\n // --- Step 1: Resolve workspace directory ---\n let workdir: string;\n let workspaceId: string | undefined;\n let branch: string | undefined;\n\n if (repo) {\n if (!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 try {\n if (callback) {\n await callback({ text: `Cloning ${repo}...` });\n }\n\n const workspace = await wsService.provisionWorkspace({ repo });\n workdir = workspace.path;\n workspaceId = workspace.id;\n branch = workspace.branch;\n\n wsService.setLabel(workspace.id, label);\n\n if (state) {\n state.codingWorkspace = {\n id: workspace.id,\n path: workspace.path,\n branch: workspace.branch,\n isWorktree: workspace.isWorktree,\n label,\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 clone repository: ${errorMessage}`,\n });\n }\n return { success: false, error: errorMessage };\n }\n } else {\n workdir = createScratchDir();\n }\n\n // --- Step 2: Spawn the agent ---\n logger.debug(\n `[START_CODING_TASK] Spawning ${agentType} agent, task: ${task ? `\"${task.slice(0, 80)}...\"` : \"(none)\"}, workdir: ${workdir}`,\n );\n try {\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 logger.warn(\n `[START_CODING_TASK] ${preflight.adapter} CLI not installed`,\n );\n if (callback) {\n await callback({\n text: `${preflight.adapter} CLI is not installed.\\nInstall with: ${preflight.installCommand}\\nDocs: ${preflight.docsUrl}`,\n });\n }\n return { success: false, error: \"AGENT_NOT_INSTALLED\" };\n }\n logger.debug(\n `[START_CODING_TASK] Preflight OK: ${preflight?.adapter} installed`,\n );\n }\n\n const piRequested = isPiAgentType(rawAgentType);\n const initialTask = piRequested ? toPiCommand(task) : task;\n const displayType = piRequested ? \"pi\" : agentType;\n\n // Check if coordinator is active — route blocking prompts through it\n const coordinator = getCoordinator(runtime);\n\n logger.debug(\n `[START_CODING_TASK] Calling spawnSession (${agentType}, coordinator=${!!coordinator})`,\n );\n const session: SessionInfo = await ptyService.spawnSession({\n name: `coding-${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 ...(coordinator ? { skipAdapterAutoResponse: true } : {}),\n metadata: {\n requestedType: rawAgentType,\n messageId: message.id,\n userId: (message as unknown as Record<string, unknown>).userId,\n workspaceId,\n label,\n },\n });\n logger.debug(\n `[START_CODING_TASK] Session spawned: ${session.id} (${session.status})`,\n );\n\n // Register event handler\n const isScratchWorkspace = !repo;\n const scratchDir = isScratchWorkspace ? workdir : null;\n registerSessionEvents(\n ptyService,\n runtime,\n session.id,\n label,\n scratchDir,\n callback,\n !!coordinator,\n );\n if (coordinator && task) {\n coordinator.registerTask(session.id, {\n agentType,\n label,\n originalTask: task,\n workdir,\n repo,\n });\n }\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 const summary = repo\n ? `Cloned ${repo} and started ${displayType} agent as \"${label}\"${task ? ` with task: \"${task}\"` : \"\"}`\n : `Started ${displayType} agent as \"${label}\" in scratch workspace${task ? ` with task: \"${task}\"` : \"\"}`;\n\n if (callback) {\n await callback({ text: `${summary}\\nSession ID: ${session.id}` });\n }\n\n return {\n success: true,\n text: summary,\n data: {\n sessionId: session.id,\n agentType: displayType,\n workdir: session.workdir,\n workspaceId,\n branch,\n label,\n status: session.status,\n },\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(\"[START_CODING_TASK] Failed to spawn agent:\", errorMessage);\n\n if (callback) {\n await callback({\n text: `Failed to start coding agent: ${errorMessage}`,\n });\n }\n return { success: false, error: errorMessage };\n }\n}\n",
27
27
  "/**\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 { PTYService } from \"../services/pty-service.js\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\n\n/** Create a scratch sandbox directory for non-repo tasks */\nexport function createScratchDir(): string {\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 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 // Auto-cleanup scratch directories when the session exits (always runs)\n if (\n (event === \"stopped\" || event === \"task_complete\" || event === \"error\") &&\n scratchDir\n ) {\n const wsService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | undefined;\n if (wsService) {\n wsService.removeScratchDir(scratchDir).catch((err) => {\n logger.warn(\n `[START_CODING_TASK] Failed to cleanup scratch dir for \"${label}\": ${err}`,\n );\n });\n }\n }\n });\n}\n",
28
28
  "/**\n * START_CODING_TASK action - Unified action to set up and launch coding 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 coding 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_CODING_AGENT)\n * and ensures agents always run in an isolated directory.\n *\n * @module actions/start-coding-task\n */\n\nimport type {\n Action,\n ActionResult,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n 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 { normalizeAgentType } from \"../services/pty-types.js\";\nimport type { CodingWorkspaceService } from \"../services/workspace-service.js\";\nimport {\n type CodingTaskContext,\n handleMultiAgent,\n handleSingleAgent,\n} from \"./coding-task-handlers.js\";\n\nexport const startCodingTaskAction: Action = {\n name: \"START_CODING_TASK\",\n\n similes: [\n \"LAUNCH_CODING_TASK\",\n \"RUN_CODING_TASK\",\n \"START_AGENT_TASK\",\n \"SPAWN_AND_PROVISION\",\n \"CODE_THIS\",\n ],\n\n description:\n \"Start a coding task: optionally clone a repo, then spawn a coding agent (Claude Code, Codex, Gemini, Aider, Pi) \" +\n \"to work on it. If no repo is provided, the agent runs in a safe scratch directory. \" +\n \"Use this whenever the user asks to work on code, research something with an agent, or run any agent task. \" +\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: \"Set up a workspace for https://github.com/acme/my-app and have Claude fix the auth bug\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll clone the repo and spawn Claude to fix the auth bug.\",\n action: \"START_CODING_TASK\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Use a coding agent to research the latest React patterns\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll spin up an agent to research that for you.\",\n action: \"START_CODING_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 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 start coding 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: if no repo was explicitly provided, check the coordinator for\n // the most recently used repo. Handles \"in the same repo\" style requests.\n if (!repo) {\n const coordinator = getCoordinator(runtime);\n const lastRepo = coordinator?.getLastUsedRepo();\n if (lastRepo) {\n repo = lastRepo;\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 const credentials: AgentCredentials = {\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 };\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 // --- Check for multi-agent mode ---\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 ---\n const task = (params?.task as string) ?? (content.task as string);\n return handleSingleAgent(ctx, task);\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 \"Type of coding agent to spawn (default for all agents). Options: claude, codex, gemini, aider, pi, shell.\",\n required: false,\n schema: { type: \"string\" as const, default: \"claude\" },\n },\n {\n name: \"task\",\n description:\n \"The task or prompt to send to the agent once it's 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 agent tasks for multi-agent mode. Each segment is a task description. \" +\n \"Optionally prefix with agent type: 'claude:Fix auth | gemini:Write tests | codex:Update docs'. \" +\n \"Each 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/context to write to each agent's memory file (e.g. CLAUDE.md) 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 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",
@@ -35,12 +35,13 @@
35
35
  "/**\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 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): Promise<void> {\n const resolved = path.resolve(dirPath);\n const resolvedBase = path.resolve(baseDir) + path.sep;\n if (\n !resolved.startsWith(resolvedBase) &&\n resolved !== path.resolve(baseDir)\n ) {\n console.warn(\n `[CodingWorkspaceService] Refusing to remove dir outside base: ${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",
36
36
  "/**\n * Coding Agent Route Handlers\n *\n * Handles routes for PTY-based coding 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 * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { getCoordinator } from \"../services/pty-service.js\";\nimport {\n isPiAgentType,\n normalizeAgentType,\n toPiCommand,\n} from \"../services/pty-types.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\n/**\n * Handle coding 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 // 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 // === 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 sendJson(res, {\n defaultApprovalPreset: ctx.ptyService.defaultApprovalPreset,\n agentSelectionStrategy: ctx.ptyService.agentSelectionStrategy,\n defaultAgentType: ctx.ptyService.defaultAgentType,\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(\n os.homedir(),\n \".milady\",\n \"workspaces\",\n );\n const allowedPrefixes = [\n path.resolve(workspaceBaseDir),\n path.resolve(process.cwd()),\n ];\n let workdir = rawWorkdir as string | undefined;\n if (workdir) {\n const resolved = path.resolve(workdir);\n const isAllowed = allowedPrefixes.some(\n (prefix) =>\n resolved === prefix || resolved.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 = resolved;\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 // 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\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 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 coordinator.registerTask(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",
37
37
  "/**\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 { 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 // 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 sendJson(res, {\n supervisionLevel: coordinator.getSupervisionLevel(),\n taskCount: tasks.length,\n tasks: tasks.map((t) => ({\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 })),\n pendingConfirmations: coordinator.getPendingConfirmations().length,\n } as unknown as JsonValue);\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 = coordinator.getTaskContext(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",
38
+ "/**\n * Claude Code HTTP Hooks — Webhook Endpoint\n *\n * Receives structured hook events from Claude Code's HTTP hooks system.\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 * Claude Code hook event payload (subset of fields we use).\n * Full schema: https://docs.anthropic.com/en/docs/claude-code/hooks\n */\ninterface HookEventPayload {\n hook_event_name: string;\n session_id?: string;\n cwd?: string;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n notification_type?: 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 // 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 Claude Code 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 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: payload.tool_name,\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: payload.tool_name,\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 \"Notification\": {\n // State change notifications (idle, permission, auth).\n ctx.ptyService.handleHookEvent(sessionId, \"notification\", {\n type: payload.notification_type,\n message: payload.message,\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 default: {\n // Unknown event — acknowledge without action.\n sendJson(res, { status: \"ignored\", reason: \"unknown_event\" });\n return true;\n }\n }\n}\n",
38
39
  "/**\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",
39
40
  "/**\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",
40
- "/**\n * Coding 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 { 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 coding 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 // Delegate to coordinator routes (before agent routes — more specific prefix)\n if (await handleCoordinatorRoutes(req, res, pathname, ctx)) {\n return true;\n }\n\n // Delegate to agent routes\n if (await handleAgentRoutes(req, res, pathname, ctx)) {\n return true;\n }\n\n // Delegate to workspace routes\n if (await handleWorkspaceRoutes(req, res, pathname, ctx)) {\n return true;\n }\n\n // Delegate to issue routes\n if (await handleIssueRoutes(req, res, pathname, 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 const ptyService = runtime.getService(\n \"PTY_SERVICE\",\n ) as unknown as PTYService | null;\n const workspaceService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | null;\n\n const ctx: RouteContext = {\n runtime,\n ptyService,\n workspaceService,\n coordinator,\n };\n\n return (req: IncomingMessage, res: ServerResponse, pathname: string) =>\n handleCodingAgentRoutes(req, res, pathname, ctx);\n}\n",
41
+ "/**\n * Coding 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 coding 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 // Delegate to hook routes first — hooks need fast responses\n if (await handleHookRoutes(req, res, pathname, ctx)) {\n return true;\n }\n\n // Delegate to coordinator routes (before agent routes — more specific prefix)\n if (await handleCoordinatorRoutes(req, res, pathname, ctx)) {\n return true;\n }\n\n // Delegate to agent routes\n if (await handleAgentRoutes(req, res, pathname, ctx)) {\n return true;\n }\n\n // Delegate to workspace routes\n if (await handleWorkspaceRoutes(req, res, pathname, ctx)) {\n return true;\n }\n\n // Delegate to issue routes\n if (await handleIssueRoutes(req, res, pathname, 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 const ptyService = runtime.getService(\n \"PTY_SERVICE\",\n ) as unknown as PTYService | null;\n const workspaceService = runtime.getService(\n \"CODING_WORKSPACE_SERVICE\",\n ) as unknown as CodingWorkspaceService | null;\n\n const ctx: RouteContext = {\n runtime,\n ptyService,\n workspaceService,\n coordinator,\n };\n\n return (req: IncomingMessage, res: ServerResponse, pathname: string) =>\n handleCodingAgentRoutes(req, res, pathname, ctx);\n}\n",
41
42
  "/**\n * Coding Agent Plugin for Milady\n *\n * Provides orchestration capabilities for CLI-based coding agents:\n * - PTY session management (spawn, control, monitor coding 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 codingAgentPlugin: Plugin = {\n name: \"@elizaos/plugin-agent-orchestrator\",\n description:\n \"Orchestrate CLI coding agents (Claude Code, Codex, Gemini, Aider, Pi, etc.) via PTY sessions, \" +\n \"manage git workspaces, and handle GitHub issues for autonomous coding tasks\",\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 default codingAgentPlugin;\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\";\n// Re-export actions\nexport { startCodingTaskAction } from \"./actions/start-coding-task.js\";\nexport { stopAgentAction } from \"./actions/stop-agent.js\";\n// Re-export API routes for server integration\nexport {\n createCodingAgentRouteHandler,\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 SwarmEvent,\n TaskContext,\n WsBroadcastCallback,\n} from \"./services/swarm-coordinator.js\";\nexport { SwarmCoordinator } from \"./services/swarm-coordinator.js\";\nexport type { CoordinationLLMResponse } 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"
42
43
  ],
43
- "mappings": "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",
44
- "debugId": "D5A4E2FBAF42C88664756E2164756E21",
44
+ "mappings": "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",
45
+ "debugId": "54C728A058C6B9C264756E2164756E21",
45
46
  "names": []
46
47
  }