@elizaos/plugin-agent-orchestrator 0.3.0 → 0.3.2
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 +58 -37
- package/dist/index.js.map +9 -9
- package/package.json +1 -1
- package/dist/actions/coding-task-handlers.d.ts +0 -44
- package/dist/actions/coding-task-handlers.d.ts.map +0 -1
- package/dist/actions/coding-task-helpers.d.ts +0 -27
- package/dist/actions/coding-task-helpers.d.ts.map +0 -1
- package/dist/actions/finalize-workspace.d.ts +0 -11
- package/dist/actions/finalize-workspace.d.ts.map +0 -1
- package/dist/actions/list-agents.d.ts +0 -11
- package/dist/actions/list-agents.d.ts.map +0 -1
- package/dist/actions/manage-issues.d.ts +0 -11
- package/dist/actions/manage-issues.d.ts.map +0 -1
- package/dist/actions/provision-workspace.d.ts +0 -11
- package/dist/actions/provision-workspace.d.ts.map +0 -1
- package/dist/actions/send-to-agent.d.ts +0 -11
- package/dist/actions/send-to-agent.d.ts.map +0 -1
- package/dist/actions/spawn-agent.d.ts +0 -11
- package/dist/actions/spawn-agent.d.ts.map +0 -1
- package/dist/actions/start-coding-task.d.ts +0 -17
- package/dist/actions/start-coding-task.d.ts.map +0 -1
- package/dist/actions/stop-agent.d.ts +0 -11
- package/dist/actions/stop-agent.d.ts.map +0 -1
- package/dist/api/agent-routes.d.ts +0 -18
- package/dist/api/agent-routes.d.ts.map +0 -1
- package/dist/api/coordinator-routes.d.ts +0 -22
- package/dist/api/coordinator-routes.d.ts.map +0 -1
- package/dist/api/issue-routes.d.ts +0 -17
- package/dist/api/issue-routes.d.ts.map +0 -1
- package/dist/api/routes.d.ts +0 -36
- package/dist/api/routes.d.ts.map +0 -1
- package/dist/api/workspace-routes.d.ts +0 -17
- package/dist/api/workspace-routes.d.ts.map +0 -1
- package/dist/index.d.ts +0 -33
- package/dist/index.d.ts.map +0 -1
- package/dist/providers/action-examples.d.ts +0 -13
- package/dist/providers/action-examples.d.ts.map +0 -1
- package/dist/providers/active-workspace-context.d.ts +0 -13
- package/dist/providers/active-workspace-context.d.ts.map +0 -1
- package/dist/services/agent-metrics.d.ts +0 -28
- package/dist/services/agent-metrics.d.ts.map +0 -1
- package/dist/services/agent-selection.d.ts +0 -53
- package/dist/services/agent-selection.d.ts.map +0 -1
- package/dist/services/ansi-utils.d.ts +0 -48
- package/dist/services/ansi-utils.d.ts.map +0 -1
- package/dist/services/pty-auto-response.d.ts +0 -30
- package/dist/services/pty-auto-response.d.ts.map +0 -1
- package/dist/services/pty-init.d.ts +0 -45
- package/dist/services/pty-init.d.ts.map +0 -1
- package/dist/services/pty-service.d.ts +0 -92
- package/dist/services/pty-service.d.ts.map +0 -1
- package/dist/services/pty-session-io.d.ts +0 -46
- package/dist/services/pty-session-io.d.ts.map +0 -1
- package/dist/services/pty-spawn.d.ts +0 -50
- package/dist/services/pty-spawn.d.ts.map +0 -1
- package/dist/services/pty-types.d.ts +0 -80
- package/dist/services/pty-types.d.ts.map +0 -1
- package/dist/services/stall-classifier.d.ts +0 -44
- package/dist/services/stall-classifier.d.ts.map +0 -1
- package/dist/services/swarm-coordinator-prompts.d.ts +0 -75
- package/dist/services/swarm-coordinator-prompts.d.ts.map +0 -1
- package/dist/services/swarm-coordinator.d.ts +0 -196
- package/dist/services/swarm-coordinator.d.ts.map +0 -1
- package/dist/services/swarm-decision-loop.d.ts +0 -44
- package/dist/services/swarm-decision-loop.d.ts.map +0 -1
- package/dist/services/swarm-event-triage.d.ts +0 -49
- package/dist/services/swarm-event-triage.d.ts.map +0 -1
- package/dist/services/swarm-idle-watchdog.d.ts +0 -22
- package/dist/services/swarm-idle-watchdog.d.ts.map +0 -1
- package/dist/services/workspace-git-ops.d.ts +0 -28
- package/dist/services/workspace-git-ops.d.ts.map +0 -1
- package/dist/services/workspace-github.d.ts +0 -58
- package/dist/services/workspace-github.d.ts.map +0 -1
- package/dist/services/workspace-lifecycle.d.ts +0 -18
- package/dist/services/workspace-lifecycle.d.ts.map +0 -1
- package/dist/services/workspace-service.d.ts +0 -84
- package/dist/services/workspace-service.d.ts.map +0 -1
- package/dist/services/workspace-types.d.ts +0 -81
- package/dist/services/workspace-types.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -3,28 +3,28 @@
|
|
|
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"],
|
|
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
|
-
"/**\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 `- 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 `- 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",
|
|
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/** 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 // Stop the session\n ctx.ptyService.stopSession(sessionId).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 // Stop the session to prevent further out-of-scope access\n taskCtx.status = \"error\";\n ctx.ptyService?.stopSession(sessionId).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 // Debounce — skip if already assessing this session\n if (ctx.inFlightDecisions.has(sessionId)) {\n ctx.log(`Skipping turn-complete assessment for ${sessionId} (in-flight)`);\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 }\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 }\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 }\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/** 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 // Debounce — skip if already assessing this session\n if (ctx.inFlightDecisions.has(sessionId)) {\n ctx.log(`Skipping turn-complete assessment for ${sessionId} (in-flight)`);\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 }\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 }\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 }\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 { classifyStallOutput } 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 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 (runtime.services as Map<string, Service[]>).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 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 });\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): 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 );\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 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, strip suggestedResponse\n // so the PTY worker doesn't auto-respond. The coordinator's LLM decision\n // loop will handle blocked prompts instead — it has full task context and\n // can make smarter choices than the stall classifier's generic suggestion.\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 { classifyStallOutput } 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 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 (runtime.services as Map<string, Service[]>).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 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 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, strip suggestedResponse\n // so the PTY worker doesn't auto-respond. The coordinator's LLM decision\n // loop will handle blocked prompts instead — it has full task context and\n // can make smarter choices than the stall classifier's generic suggestion.\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",
|
|
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}\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\n // If this session has an active task AND has a task-response marker,\n // the stall classifier detected task completion. Emit task_complete so\n // the coordinator can evaluate whether the overall task is done.\n // Guard on marker existence to avoid premature completion on startup\n // ready events that fire before any work has been done.\n if (\n ctx.hasActiveTask?.(session.id) &&\n ctx.taskResponseMarkers.has(session.id)\n ) {\n const response = captureTaskResponse(\n session.id,\n ctx.sessionOutputBuffers,\n ctx.taskResponseMarkers,\n );\n ctx.log(\n `session_ready for active task ${session.id} — forwarding as task_complete (stall classifier path)`,\n );\n ctx.emitEvent(session.id, \"task_complete\", { session, response });\n }\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 if (\n ctx.hasActiveTask?.(session.id) &&\n ctx.taskResponseMarkers.has(session.id)\n ) {\n const response = captureTaskResponse(\n session.id,\n ctx.sessionOutputBuffers,\n ctx.taskResponseMarkers,\n );\n ctx.log(\n `session_ready for active task ${session.id} — forwarding as task_complete (stall classifier path)`,\n );\n ctx.emitEvent(session.id, \"task_complete\", { session, response });\n }\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 */\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): Promise<void> {\n const session = ctx.manager.get(sessionId);\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
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 let taskSent = false;\n const sendTask = () => {\n if (taskSent) return;\n taskSent = true;\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 }\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",
|
|
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\";\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",
|
|
24
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\";\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 /** 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 /** 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.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 //
|
|
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",
|
|
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 {\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 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 let specAgentType = defaultAgentType;\n let specPiRequested = isPiAgentType(rawAgentType);\n let specRequestedType = rawAgentType;\n let specTask = spec;\n const colonIdx = spec.indexOf(\":\");\n if (colonIdx > 0 && colonIdx < 20) {\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 }\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
|
-
"/**\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 //
|
|
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 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",
|
|
29
29
|
"/**\n * STOP_CODING_AGENT action - Stop a running coding agent session\n *\n * Terminates an active PTY session. Use when the agent is done,\n * stuck, or needs to be cancelled.\n *\n * @module actions/stop-agent\n */\n\nimport {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport type { PTYService } from \"../services/pty-service.js\";\n\nexport const stopAgentAction: Action = {\n name: \"STOP_CODING_AGENT\",\n\n similes: [\n \"KILL_CODING_AGENT\",\n \"TERMINATE_AGENT\",\n \"END_CODING_SESSION\",\n \"CANCEL_AGENT\",\n ],\n\n description:\n \"Stop a running coding agent session. \" +\n \"Terminates the PTY session and cleans up resources.\",\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Stop the coding agent\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll stop the coding session.\",\n action: \"STOP_CODING_AGENT\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Kill the stuck agent\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Terminating the coding agent.\",\n action: \"STOP_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 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 all?: boolean;\n };\n\n // Stop all sessions if requested\n if (content.all) {\n const sessions = await ptyService.listSessions();\n if (sessions.length === 0) {\n if (callback) {\n await callback({\n text: \"No active coding sessions to stop.\",\n });\n }\n return { success: true, text: \"No sessions to stop\" };\n }\n\n for (const session of sessions) {\n try {\n await ptyService.stopSession(session.id);\n } catch (err) {\n logger.error(`Failed to stop session ${session.id}: ${err}`);\n }\n }\n\n // Clear state\n if (state?.codingSession) {\n delete state.codingSession;\n }\n\n if (callback) {\n await callback({\n text: `Stopped ${sessions.length} coding session(s).`,\n });\n }\n return {\n success: true,\n text: `Stopped ${sessions.length} sessions`,\n data: { stoppedCount: sessions.length },\n };\n }\n\n // Stop specific session\n let sessionId = content.sessionId;\n if (!sessionId && state?.codingSession) {\n sessionId = (state.codingSession as { id: string }).id;\n }\n\n if (!sessionId) {\n const sessions = await ptyService.listSessions();\n if (sessions.length === 0) {\n if (callback) {\n await callback({\n text: \"No active coding sessions to stop.\",\n });\n }\n return { success: true, text: \"No sessions to stop\" };\n }\n sessionId = sessions[sessions.length - 1].id;\n }\n\n const session = ptyService.getSession(sessionId);\n if (!session) {\n if (callback) {\n await callback({\n text: `Session ${sessionId} not found.`,\n });\n }\n return { success: false, error: \"SESSION_NOT_FOUND\" };\n }\n\n try {\n await ptyService.stopSession(sessionId);\n\n // Clear state if this was the current session\n if (\n state?.codingSession &&\n (state.codingSession as { id: string }).id === sessionId\n ) {\n delete state.codingSession;\n }\n\n if (callback) {\n await callback({\n text: `Stopped coding agent session ${sessionId}.`,\n });\n }\n return {\n success: true,\n text: `Stopped session ${sessionId}`,\n data: { sessionId, agentType: session.agentType },\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (callback) {\n await callback({\n text: `Failed to stop agent: ${errorMessage}`,\n });\n }\n return { success: false, error: errorMessage };\n }\n },\n\n parameters: [\n {\n name: \"sessionId\",\n description:\n \"ID of the session to stop. If not specified, stops the current session.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"all\",\n description: \"If true, stop all active coding sessions.\",\n required: false,\n schema: { type: \"boolean\" as const },\n },\n ],\n};\n",
|
|
30
30
|
"/**\n * Provider that injects structured action call examples into the prompt context.\n *\n * ElizaOS core only shows exampleCalls from its static action-docs registry,\n * which doesn't include custom plugin actions. This provider bridges the gap\n * by formatting our coding agent action examples in the same structured format\n * the model sees for core actions.\n *\n * @module providers/action-examples\n */\n\nimport type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\n\ninterface ActionCallExample {\n user: string;\n actions: string[];\n params?: Record<string, Record<string, string>>;\n}\n\nconst CODING_AGENT_EXAMPLES: ActionCallExample[] = [\n {\n user: \"Can you set up a workspace for https://github.com/acme/my-app and have Claude fix the login bug?\",\n actions: [\"REPLY\", \"START_CODING_TASK\"],\n params: {\n START_CODING_TASK: {\n repo: \"https://github.com/acme/my-app\",\n agentType: \"claude\",\n task: \"Fix the login bug in src/auth.ts — users are getting 401 errors after token refresh\",\n },\n },\n },\n {\n user: \"Use a coding agent to research the latest Next.js patterns and summarize them\",\n actions: [\"REPLY\", \"START_CODING_TASK\"],\n params: {\n START_CODING_TASK: {\n agentType: \"claude\",\n task: \"Research the latest Next.js patterns (app router, server components, etc.) and write a summary in RESEARCH.md\",\n },\n },\n },\n {\n user: \"Use pi to investigate flaky tests and write findings to FLAKY_TESTS.md\",\n actions: [\"REPLY\", \"START_CODING_TASK\"],\n params: {\n START_CODING_TASK: {\n agentType: \"pi\",\n task: \"Investigate flaky tests, identify likely root causes, and write your findings to FLAKY_TESTS.md\",\n },\n },\n },\n {\n user: \"Tell the coding agent to accept those changes\",\n actions: [\"REPLY\", \"SEND_TO_CODING_AGENT\"],\n params: {\n SEND_TO_CODING_AGENT: {\n input: \"Yes, accept the changes\",\n },\n },\n },\n {\n user: \"The agent is asking me to press enter, can you handle that?\",\n actions: [\"REPLY\", \"SEND_TO_CODING_AGENT\"],\n params: {\n SEND_TO_CODING_AGENT: {\n keys: \"Enter\",\n },\n },\n },\n {\n user: \"Create a PR for what the agent did\",\n actions: [\"REPLY\", \"FINALIZE_WORKSPACE\"],\n params: {\n FINALIZE_WORKSPACE: {\n prTitle: \"Fix login bug in auth module\",\n prBody:\n \"Resolved 401 errors after token refresh by fixing the token expiry check\",\n },\n },\n },\n];\n\nfunction formatExample(ex: ActionCallExample): string {\n const actionTags = ex.actions\n .map((a) => ` <action>${a}</action>`)\n .join(\"\\n\");\n const paramBlocks = Object.entries(ex.params ?? {})\n .map(([actionName, params]) => {\n const inner = Object.entries(params)\n .map(([k, v]) => ` <${k}>${v}</${k}>`)\n .join(\"\\n\");\n return ` <${actionName}>\\n${inner}\\n </${actionName}>`;\n })\n .join(\"\\n\");\n const paramsSection = paramBlocks\n ? `\\n<params>\\n${paramBlocks}\\n</params>`\n : \"\";\n return `User: ${ex.user}\\nAssistant:\\n<actions>\\n${actionTags}\\n</actions>${paramsSection}`;\n}\n\n// Multi-agent example uses the pipe-delimited `agents` param to spawn multiple agents in one action call.\n// Each segment is a separate task. Optionally prefix with agent type: \"claude:task | gemini:task\".\n// Each agent gets its own workspace clone — they cannot see each other's work.\nconst MULTI_AGENT_EXAMPLE = `User: Spin up 3 agents on https://github.com/acme/app — one to fix auth, one to write tests, one to update docs\nAssistant:\n<actions>\n <action>REPLY</action>\n <action>START_CODING_TASK</action>\n</actions>\n<params>\n <START_CODING_TASK>\n <repo>https://github.com/acme/app</repo>\n <agents>Fix the authentication bug in src/auth.ts — users get 401 after token refresh. Your unique identifier is \"alpha\". | Write comprehensive unit tests for the auth module in src/auth.ts. Your unique identifier is \"beta\". | Update the API documentation in docs/ to reflect the new auth flow. Your unique identifier is \"gamma\".</agents>\n </START_CODING_TASK>\n</params>`;\n\nexport const codingAgentExamplesProvider: Provider = {\n name: \"CODING_AGENT_EXAMPLES\",\n description:\n \"Structured examples showing how to use coding agent actions with parameters\",\n position: -1, // Low priority — supplementary context\n\n get: async (_runtime: IAgentRuntime, _message: Memory, _state: State) => {\n const examples = CODING_AGENT_EXAMPLES.map(formatExample).join(\"\\n\\n\");\n const text = [\n \"# Coding Agent Action Call Examples\",\n \"When the user asks you to work on code, clone repos, spawn agents, or run agent tasks,\",\n \"you MUST select the appropriate actions and include parameters. Do NOT just describe\",\n \"what you would do — actually select the actions.\",\n \"\",\n \"IMPORTANT: Use START_CODING_TASK to launch coding agents. It handles workspace setup\",\n \"automatically. If a repo URL is provided, it clones it first. If no repo, the agent\",\n \"runs in a safe scratch directory. You do NOT need to call PROVISION_WORKSPACE separately.\",\n \"\",\n \"## Single Agent Examples\",\n \"\",\n examples,\n \"\",\n \"## Multi-Agent Example\",\n \"To spawn multiple agents, use the `agents` parameter with pipe-delimited (|) tasks.\",\n \"Each segment becomes a separate agent with its own workspace clone.\",\n \"You can optionally prefix each segment with an agent type: 'claude:task | gemini:task'.\",\n \"CRITICAL: Give each agent a DIFFERENT task with unique instructions, topics, file names,\",\n \"and unique identifiers so their work is clearly differentiated.\",\n \"\",\n MULTI_AGENT_EXAMPLE,\n ].join(\"\\n\");\n\n return {\n data: { codingAgentExamples: CODING_AGENT_EXAMPLES },\n values: { codingAgentExamples: text },\n text,\n };\n },\n};\n",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
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
41
|
"/**\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
42
|
],
|
|
43
|
-
"mappings": "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",
|
|
44
|
-
"debugId": "
|
|
43
|
+
"mappings": "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",
|
|
44
|
+
"debugId": "BA5A6C5F800D868764756E2164756E21",
|
|
45
45
|
"names": []
|
|
46
46
|
}
|