@goondocks/myco 0.14.2 → 0.14.3

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.
Files changed (83) hide show
  1. package/dist/{agent-run-VYXDQ5L5.js → agent-run-A7YYMN6S.js} +4 -4
  2. package/dist/{agent-tasks-Q7AU3OP2.js → agent-tasks-MDVJW5SV.js} +4 -4
  3. package/dist/{chunk-EASRP2I3.js → chunk-HSMD2COQ.js} +2 -2
  4. package/dist/{chunk-PLMMWIJC.js → chunk-NBPZI5UD.js} +2 -2
  5. package/dist/{chunk-5JZWS63K.js → chunk-PGYJSXSK.js} +2 -2
  6. package/dist/{chunk-IUJLMJKN.js → chunk-QMGQSA5A.js} +2 -2
  7. package/dist/{chunk-CD5SYW45.js → chunk-XRVLSSJY.js} +2 -2
  8. package/dist/{cli-EXGQAFYL.js → cli-HEPHQSLV.js} +32 -32
  9. package/dist/{client-CA4TAT5Q.js → client-ZXC6IY63.js} +3 -3
  10. package/dist/{doctor-G27T4FZA.js → doctor-Q5WJBNSZ.js} +4 -4
  11. package/dist/{executor-SK3XFJQ7.js → executor-YX2MA4T3.js} +4 -2
  12. package/dist/executor-YX2MA4T3.js.map +1 -0
  13. package/dist/{init-7PCZOANM.js → init-KWCGGLP3.js} +7 -7
  14. package/dist/{init-wizard-EQZ7YTRT.js → init-wizard-YUT7MIYZ.js} +2 -2
  15. package/dist/{main-RDRKAEEB.js → main-WHGJ6UV7.js} +8 -8
  16. package/dist/{open-GE6DB5GH.js → open-CBNGDM32.js} +4 -4
  17. package/dist/{post-compact-YIOMON3E.js → post-compact-AANLN7TR.js} +4 -4
  18. package/dist/{post-tool-use-YRSXGMEC.js → post-tool-use-X3IFZEMV.js} +3 -3
  19. package/dist/{post-tool-use-failure-XNNJ6INZ.js → post-tool-use-failure-T6KAFDFF.js} +4 -4
  20. package/dist/{pre-compact-X7BNZVUO.js → pre-compact-FY7BPS4J.js} +4 -4
  21. package/dist/{remove-POWCAYFI.js → remove-TN3BLJEC.js} +4 -4
  22. package/dist/{restart-REP4X4OM.js → restart-KT4R3QN5.js} +5 -5
  23. package/dist/{search-YAI5VOKX.js → search-NQFXQUUQ.js} +4 -4
  24. package/dist/{server-DX6MOYFP.js → server-6QIP325R.js} +3 -3
  25. package/dist/{session-RHQGSRAQ.js → session-E7B3B4ZQ.js} +4 -4
  26. package/dist/{session-end-CNEVUWO5.js → session-end-H2E42BZG.js} +3 -3
  27. package/dist/{session-start-LHTHF5RU.js → session-start-FLND66CU.js} +3 -3
  28. package/dist/{setup-llm-EE67TRXS.js → setup-llm-YAXEM23S.js} +4 -4
  29. package/dist/src/cli.js +1 -1
  30. package/dist/src/daemon/main.js +1 -1
  31. package/dist/src/hooks/post-tool-use.js +1 -1
  32. package/dist/src/hooks/session-end.js +1 -1
  33. package/dist/src/hooks/session-start.js +1 -1
  34. package/dist/src/hooks/stop.js +1 -1
  35. package/dist/src/hooks/user-prompt-submit.js +1 -1
  36. package/dist/src/mcp/server.js +1 -1
  37. package/dist/src/symbionts/templates/hook-guard.cjs +3 -0
  38. package/dist/{stats-GRMKI7TA.js → stats-MD4PUVRL.js} +5 -5
  39. package/dist/{stop-BJW2B5MT.js → stop-CFUWXMNB.js} +3 -3
  40. package/dist/{stop-failure-5UC7NFH4.js → stop-failure-ZOHR2EUI.js} +4 -4
  41. package/dist/{subagent-start-YMMRFAKH.js → subagent-start-AXZAVBJU.js} +4 -4
  42. package/dist/{subagent-stop-2TZTLCYU.js → subagent-stop-FVQGEEZ4.js} +4 -4
  43. package/dist/{task-completed-UX7EJD6S.js → task-completed-NKJU2SRN.js} +4 -4
  44. package/dist/{update-MY3K3RE5.js → update-2C4WQ4WP.js} +4 -4
  45. package/dist/{user-prompt-submit-X3MER6I4.js → user-prompt-submit-RRSLN6LA.js} +3 -3
  46. package/dist/{version-54TTGX44.js → version-CGFXQBSI.js} +2 -2
  47. package/package.json +1 -1
  48. package/dist/executor-SK3XFJQ7.js.map +0 -1
  49. /package/dist/{agent-run-VYXDQ5L5.js.map → agent-run-A7YYMN6S.js.map} +0 -0
  50. /package/dist/{agent-tasks-Q7AU3OP2.js.map → agent-tasks-MDVJW5SV.js.map} +0 -0
  51. /package/dist/{chunk-EASRP2I3.js.map → chunk-HSMD2COQ.js.map} +0 -0
  52. /package/dist/{chunk-PLMMWIJC.js.map → chunk-NBPZI5UD.js.map} +0 -0
  53. /package/dist/{chunk-5JZWS63K.js.map → chunk-PGYJSXSK.js.map} +0 -0
  54. /package/dist/{chunk-IUJLMJKN.js.map → chunk-QMGQSA5A.js.map} +0 -0
  55. /package/dist/{chunk-CD5SYW45.js.map → chunk-XRVLSSJY.js.map} +0 -0
  56. /package/dist/{cli-EXGQAFYL.js.map → cli-HEPHQSLV.js.map} +0 -0
  57. /package/dist/{client-CA4TAT5Q.js.map → client-ZXC6IY63.js.map} +0 -0
  58. /package/dist/{doctor-G27T4FZA.js.map → doctor-Q5WJBNSZ.js.map} +0 -0
  59. /package/dist/{init-7PCZOANM.js.map → init-KWCGGLP3.js.map} +0 -0
  60. /package/dist/{init-wizard-EQZ7YTRT.js.map → init-wizard-YUT7MIYZ.js.map} +0 -0
  61. /package/dist/{main-RDRKAEEB.js.map → main-WHGJ6UV7.js.map} +0 -0
  62. /package/dist/{open-GE6DB5GH.js.map → open-CBNGDM32.js.map} +0 -0
  63. /package/dist/{post-compact-YIOMON3E.js.map → post-compact-AANLN7TR.js.map} +0 -0
  64. /package/dist/{post-tool-use-YRSXGMEC.js.map → post-tool-use-X3IFZEMV.js.map} +0 -0
  65. /package/dist/{post-tool-use-failure-XNNJ6INZ.js.map → post-tool-use-failure-T6KAFDFF.js.map} +0 -0
  66. /package/dist/{pre-compact-X7BNZVUO.js.map → pre-compact-FY7BPS4J.js.map} +0 -0
  67. /package/dist/{remove-POWCAYFI.js.map → remove-TN3BLJEC.js.map} +0 -0
  68. /package/dist/{restart-REP4X4OM.js.map → restart-KT4R3QN5.js.map} +0 -0
  69. /package/dist/{search-YAI5VOKX.js.map → search-NQFXQUUQ.js.map} +0 -0
  70. /package/dist/{server-DX6MOYFP.js.map → server-6QIP325R.js.map} +0 -0
  71. /package/dist/{session-RHQGSRAQ.js.map → session-E7B3B4ZQ.js.map} +0 -0
  72. /package/dist/{session-end-CNEVUWO5.js.map → session-end-H2E42BZG.js.map} +0 -0
  73. /package/dist/{session-start-LHTHF5RU.js.map → session-start-FLND66CU.js.map} +0 -0
  74. /package/dist/{setup-llm-EE67TRXS.js.map → setup-llm-YAXEM23S.js.map} +0 -0
  75. /package/dist/{stats-GRMKI7TA.js.map → stats-MD4PUVRL.js.map} +0 -0
  76. /package/dist/{stop-BJW2B5MT.js.map → stop-CFUWXMNB.js.map} +0 -0
  77. /package/dist/{stop-failure-5UC7NFH4.js.map → stop-failure-ZOHR2EUI.js.map} +0 -0
  78. /package/dist/{subagent-start-YMMRFAKH.js.map → subagent-start-AXZAVBJU.js.map} +0 -0
  79. /package/dist/{subagent-stop-2TZTLCYU.js.map → subagent-stop-FVQGEEZ4.js.map} +0 -0
  80. /package/dist/{task-completed-UX7EJD6S.js.map → task-completed-NKJU2SRN.js.map} +0 -0
  81. /package/dist/{update-MY3K3RE5.js.map → update-2C4WQ4WP.js.map} +0 -0
  82. /package/dist/{user-prompt-submit-X3MER6I4.js.map → user-prompt-submit-RRSLN6LA.js.map} +0 -0
  83. /package/dist/{version-54TTGX44.js.map → version-CGFXQBSI.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent/executor.ts","../src/agent/tools.ts","../src/db/queries/agent-state.ts","../src/agent/context.ts","../src/agent/orchestrator.ts","../src/intelligence/response.ts","../src/agent/context-queries.ts","../src/agent/provider.ts"],"sourcesContent":["/**\n * Agent executor.\n *\n * Orchestrates a single agent run:\n * 1. Initializes the database for the vault.\n * 2. Resolves effective config (definition + agent DB overrides + task).\n * 3. Guards against concurrent runs for the same agent.\n * 4. Creates a run record in the database.\n * 5. Builds the task prompt (vault context + task + optional instruction).\n * 6. Executes the Claude Agent SDK query — single call for flat tasks,\n * wave-based parallel execution for phased tasks.\n * 7. Records cost/token data and marks the run completed or failed.\n */\n\nimport crypto from 'node:crypto';\nimport { resolve } from 'node:path';\nimport { epochSeconds, DEFAULT_AGENT_ID, MS_PER_SECOND, PHASE_SUMMARY_MAX_CHARS } from '@myco/constants.js';\nimport { errorMessage as toErrorMessage } from '@myco/utils/error-message.js';\nimport { initDatabase, vaultDbPath, getDatabase } from '@myco/db/client.js';\nimport { createSchema } from '@myco/db/schema.js';\nimport { getAgent } from '@myco/db/queries/agents.js';\nimport { getTask, getDefaultTask } from '@myco/db/queries/tasks.js';\nimport {\n insertRun,\n updateRunStatus,\n getRunningRunForTask,\n STATUS_RUNNING,\n STATUS_COMPLETED,\n STATUS_FAILED,\n} from '@myco/db/queries/runs.js';\nimport {\n resolveDefinitionsDir,\n loadAgentDefinition,\n loadSystemPrompt,\n resolveEffectiveConfig,\n} from './loader.js';\nimport { loadAllTasks } from './registry.js';\nimport { createVaultToolServer, createScopedVaultToolServer } from './tools.js';\nimport { buildVaultContext } from './context.js';\nimport { composeOrchestratorPrompt, parseOrchestratorPlan, applyDirectives, DEFAULT_ORCHESTRATOR_MAX_TURNS } from './orchestrator.js';\nimport { executeContextQueries } from './context-queries.js';\nimport { buildPhaseEnv } from './provider.js';\nimport { loadConfig } from '@myco/config/loader.js';\nimport type { ContextQueryResult } from './context-queries.js';\nimport type { ProviderConfig } from './types.js';\nimport type {\n RunOptions,\n AgentRunResult,\n EffectiveConfig,\n PhaseDefinition,\n PhaseResult,\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Run status returned when a concurrent run is already active. */\nconst STATUS_SKIPPED = 'skipped';\n\n/** Reason string when skipping due to concurrency guard. */\nconst SKIP_REASON_ALREADY_RUNNING = 'already_running';\n\n/** Section header for vault context in the composed prompt. */\nconst PROMPT_SECTION_TASK = '## Task: ';\n\n/** Section header for user instruction in the composed prompt. */\nconst PROMPT_SECTION_INSTRUCTION = '## User Instruction';\n\n/** Separator between prompt sections. */\nconst PROMPT_SECTION_SEPARATOR = '\\n\\n';\n\n/** MCP server name for the vault tool server. */\nconst MCP_SERVER_NAME = 'myco-vault';\n\n/** Whether to persist the agent session to disk. */\nconst PERSIST_SESSION = true;\n\n/** Header for prior phase context in phased prompts. */\nconst PROMPT_SECTION_PRIOR_PHASES = '## Prior Phase Results';\n\n/** Header for the current phase in phased prompts. */\nconst PROMPT_SECTION_CURRENT_PHASE = '## Current Phase: ';\n\n// ---------------------------------------------------------------------------\n// Prompt composition\n// ---------------------------------------------------------------------------\n\n/**\n * Build the full task prompt from vault context, task definition, and\n * optional user instruction.\n *\n * Task prompts support template variables:\n * - `{{session_id}}` — replaced with the session ID from instruction (if present)\n * - `{{instruction}}` — the raw user instruction text\n */\nexport function composeTaskPrompt(\n vaultContext: string,\n taskDisplayName: string,\n taskPrompt: string,\n instruction?: string,\n): string {\n // Extract session_id from instruction if it contains one (UUID pattern)\n const sessionIdMatch = instruction?.match(/\\b([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\\b/i);\n const sessionId = sessionIdMatch?.[1] ?? '';\n\n // Template variable substitution in task prompt\n let resolvedPrompt = taskPrompt;\n resolvedPrompt = resolvedPrompt.replace(/\\{\\{session_id\\}\\}/g, sessionId);\n resolvedPrompt = resolvedPrompt.replace(/\\{\\{instruction\\}\\}/g, instruction ?? '');\n\n const parts = [\n vaultContext,\n `${PROMPT_SECTION_TASK}${taskDisplayName}\\n${resolvedPrompt}`,\n ];\n\n if (instruction) {\n parts.push(`${PROMPT_SECTION_INSTRUCTION}\\n${instruction}`);\n }\n\n return parts.join(PROMPT_SECTION_SEPARATOR);\n}\n\n/**\n * Build the prompt for a single phase in a phased execution.\n *\n * Includes vault context, the task overview, prior phase summaries,\n * and the current phase instructions.\n */\nexport function composePhasePrompt(\n vaultContext: string,\n taskDisplayName: string,\n taskOverview: string,\n phase: PhaseDefinition,\n priorPhaseResults: PhaseResult[],\n instruction?: string,\n): string {\n const parts = [\n vaultContext,\n `${PROMPT_SECTION_TASK}${taskDisplayName}\\n${taskOverview}`,\n ];\n\n if (instruction) {\n parts.push(`${PROMPT_SECTION_INSTRUCTION}\\n${instruction}`);\n }\n\n // Include prior phase results as context (unless the phase opts out)\n if (priorPhaseResults.length > 0 && !phase.skipPriorContext) {\n const summaries = priorPhaseResults.map((pr) => {\n const truncated = pr.summary.length > PHASE_SUMMARY_MAX_CHARS\n ? pr.summary.slice(0, PHASE_SUMMARY_MAX_CHARS) + '...'\n : pr.summary;\n return `### ${pr.name} (${pr.status})\\n${truncated}`;\n });\n parts.push(`${PROMPT_SECTION_PRIOR_PHASES}\\n${summaries.join('\\n\\n')}`);\n }\n\n // Current phase instructions\n parts.push(`${PROMPT_SECTION_CURRENT_PHASE}${phase.name}\\n${phase.prompt}`);\n\n return parts.join(PROMPT_SECTION_SEPARATOR);\n}\n\n// ---------------------------------------------------------------------------\n// Ollama model pre-loading\n// ---------------------------------------------------------------------------\n\n/** Timeout for Ollama model pre-load request (ms). */\nconst OLLAMA_PRELOAD_TIMEOUT_MS = 30_000;\n\n/**\n * Ensure an Ollama model variant exists with the desired context length.\n *\n * The Anthropic-compatible endpoint (/v1/messages) always loads models at\n * default context — it ignores /api/chat preloads and API-created params.\n * The only reliable way is `ollama create` with a Modelfile containing\n * `PARAMETER num_ctx`. Creates a variant named `{model}-ctx{contextLength}`.\n *\n * Returns the variant model name to use.\n */\nasync function ensureOllamaContextVariant(\n model: string,\n contextLength: number,\n): Promise<string> {\n const { execFileSync } = await import('node:child_process');\n const { writeFileSync, unlinkSync } = await import('node:fs');\n const { tmpdir } = await import('node:os');\n const { join } = await import('node:path');\n\n const baseName = model.replace(/:latest$/, '');\n const variantName = `${baseName}-ctx${contextLength}`;\n\n try {\n // Check if variant already exists\n execFileSync('ollama', ['show', variantName], { stdio: 'ignore' });\n return variantName;\n } catch {\n // Doesn't exist — create it\n }\n\n try {\n const modelfilePath = join(tmpdir(), `myco-modelfile-${Date.now()}`);\n writeFileSync(modelfilePath, `FROM ${model}\\nPARAMETER num_ctx ${contextLength}\\n`);\n execFileSync('ollama', ['create', variantName, '-f', modelfilePath], {\n stdio: 'ignore',\n timeout: OLLAMA_PRELOAD_TIMEOUT_MS,\n });\n try { unlinkSync(modelfilePath); } catch { /* cleanup best-effort */ }\n return variantName;\n } catch {\n return model; // Fall back to original\n }\n}\n\n// ---------------------------------------------------------------------------\n// Wave computation (Kahn's algorithm)\n// ---------------------------------------------------------------------------\n\n/**\n * Compute execution waves from phase dependency graph.\n *\n * Uses Kahn's algorithm to topologically sort phases into waves.\n * Phases in the same wave have no dependencies on each other and\n * can execute in parallel via Promise.allSettled().\n *\n * @throws Error if circular dependencies are detected.\n */\nexport function computeWaves(phases: PhaseDefinition[]): PhaseDefinition[][] {\n const nameToPhase = new Map(phases.map(p => [p.name, p]));\n const inDegree = new Map<string, number>();\n const dependents = new Map<string, string[]>(); // dependency → phases that depend on it\n\n // Initialize\n for (const phase of phases) {\n inDegree.set(phase.name, 0);\n dependents.set(phase.name, []);\n }\n\n // Build adjacency — skip dependencies on phases not in the set\n // (they may have been removed by orchestrator directives)\n for (const phase of phases) {\n const deps = phase.dependsOn ?? [];\n for (const dep of deps) {\n if (!nameToPhase.has(dep)) continue; // skipped/removed phase — treat as satisfied\n inDegree.set(phase.name, (inDegree.get(phase.name) ?? 0) + 1);\n dependents.get(dep)!.push(phase.name);\n }\n }\n\n // Collect waves\n const waves: PhaseDefinition[][] = [];\n const completed = new Set<string>();\n\n while (completed.size < phases.length) {\n // Find all phases with zero unsatisfied deps\n const wave: PhaseDefinition[] = [];\n for (const phase of phases) {\n if (completed.has(phase.name)) continue;\n if ((inDegree.get(phase.name) ?? 0) === 0) {\n wave.push(phase);\n }\n }\n\n if (wave.length === 0) {\n const remaining = phases.filter(p => !completed.has(p.name)).map(p => p.name);\n throw new Error(`Circular dependency detected among phases: ${remaining.join(', ')}`);\n }\n\n waves.push(wave);\n\n // Mark wave as completed and decrement dependents' in-degrees\n for (const phase of wave) {\n completed.add(phase.name);\n for (const dependent of (dependents.get(phase.name) ?? [])) {\n inDegree.set(dependent, (inDegree.get(dependent) ?? 0) - 1);\n }\n }\n }\n\n return waves;\n}\n\n// ---------------------------------------------------------------------------\n// Session ID generation\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a deterministic session ID (UUID format) for a phase.\n * Derived from run ID + phase name so the same run always produces\n * the same session IDs.\n */\nfunction phaseSessionId(runId: string, phaseName: string): string {\n const hash = crypto.createHash('sha256').update(`${runId}-${phaseName}`).digest('hex');\n // Format as UUID: 8-4-4-4-12\n return [\n hash.slice(0, 8),\n hash.slice(8, 12),\n hash.slice(12, 16),\n hash.slice(16, 20),\n hash.slice(20, 32),\n ].join('-');\n}\n\n// ---------------------------------------------------------------------------\n// Single-phase execution helper\n// ---------------------------------------------------------------------------\n\n/**\n * Execute a single phase query.\n *\n * Isolated helper that runs one query() call with scoped tools,\n * provider env, and phase-specific config.\n */\nasync function executePhase(\n query: typeof import('@anthropic-ai/claude-agent-sdk').query,\n phasePrompt: string,\n phaseModel: string,\n systemPrompt: string,\n toolServer: ReturnType<typeof createScopedVaultToolServer>,\n phase: PhaseDefinition,\n env: Record<string, string | undefined> | undefined,\n sessionId?: string,\n abortController?: AbortController,\n): Promise<PhaseResult> {\n let phaseCost = 0;\n let phaseTokens = 0;\n let phaseTurns = 0;\n let phaseSummary = '';\n\n try {\n for await (const message of query({\n prompt: phasePrompt,\n options: {\n model: phaseModel,\n systemPrompt,\n mcpServers: { [MCP_SERVER_NAME]: toolServer },\n strictMcpConfig: true,\n maxTurns: phase.maxTurns,\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n persistSession: PERSIST_SESSION,\n env,\n tools: [],\n ...(sessionId ? { sessionId } : {}),\n ...(abortController ? { abortController } : {}),\n },\n })) {\n if (message.type === 'result') {\n phaseCost = message.total_cost_usd ?? 0;\n phaseTokens =\n (message.usage.input_tokens ?? 0) + (message.usage.output_tokens ?? 0);\n phaseTurns = message.num_turns ?? 0;\n if ('result' in message && typeof message.result === 'string') {\n phaseSummary = message.result;\n }\n }\n }\n\n if (phase.required && phaseTurns === 0) {\n console.warn(`[agent] Required phase \"${phase.name}\" produced 0 turns`);\n }\n\n return {\n name: phase.name,\n status: 'completed',\n turnsUsed: phaseTurns,\n tokensUsed: phaseTokens,\n costUsd: phaseCost,\n summary: phaseSummary,\n };\n } catch (err) {\n return {\n name: phase.name,\n status: 'failed',\n turnsUsed: phaseTurns,\n tokensUsed: phaseTokens,\n costUsd: phaseCost,\n summary: `Error: ${toErrorMessage(err)}`,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Single-query execution (non-phased tasks)\n// ---------------------------------------------------------------------------\n\n/**\n * Execute a single query() call for non-phased tasks.\n *\n * @returns tokens used, cost, and status.\n */\nasync function executeSingleQuery(\n config: EffectiveConfig,\n systemPrompt: string,\n taskPrompt: string,\n agentId: string,\n runId: string,\n provider?: ProviderConfig,\n embeddingManager?: RunOptions['embeddingManager'],\n abortController?: AbortController,\n vaultDir?: string,\n): Promise<{ tokensUsed: number; costUsd: number }> {\n const { query } = await import('@anthropic-ai/claude-agent-sdk');\n const toolServer = createVaultToolServer(agentId, runId, { embeddingManager, vaultDir });\n const baseEnv = buildPhaseEnv(provider);\n const env = { ...(baseEnv ?? process.env), MYCO_AGENT_SESSION: '1' };\n // Model priority: provider model override → task YAML model\n const effectiveModel = provider?.model ?? config.model;\n\n let resultCostUsd = 0;\n let resultTokens = 0;\n\n for await (const message of query({\n prompt: taskPrompt,\n options: {\n model: effectiveModel,\n systemPrompt,\n mcpServers: { [MCP_SERVER_NAME]: toolServer },\n strictMcpConfig: true,\n maxTurns: config.maxTurns,\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n persistSession: PERSIST_SESSION,\n env,\n tools: [],\n ...(abortController ? { abortController } : {}),\n },\n })) {\n if (message.type === 'result') {\n resultCostUsd = message.total_cost_usd ?? 0;\n resultTokens =\n (message.usage.input_tokens ?? 0) + (message.usage.output_tokens ?? 0);\n }\n }\n\n return { tokensUsed: resultTokens, costUsd: resultCostUsd };\n}\n\n// ---------------------------------------------------------------------------\n// Phased execution (wave-based parallel)\n// ---------------------------------------------------------------------------\n\n/**\n * Execute a phased task — wave-based parallel query() calls.\n *\n * Phases are sorted into waves via `computeWaves()`. Phases within the same\n * wave execute concurrently via `Promise.allSettled()`. Each phase gets:\n * - Scoped tools (only the tools listed in the phase definition)\n * - Its own turn budget (maxTurns)\n * - Optional model override (falls back to task/agent model)\n * - Isolated provider env (via SDK `env` option — no process.env mutation)\n * - Context from prior wave results\n * - Deterministic session ID derived from run ID + phase name\n *\n * The executor controls the loop — the LLM cannot skip phases.\n */\nasync function executePhasedQuery(\n config: EffectiveConfig,\n systemPrompt: string,\n vaultContext: string,\n agentId: string,\n runId: string,\n taskProviderOverride?: ProviderConfig,\n phaseProviderOverrides?: Record<string, { provider?: ProviderConfig; maxTurns?: number }>,\n instruction?: string,\n embeddingManager?: RunOptions['embeddingManager'],\n abortController?: AbortController,\n projectRoot?: string,\n vaultDir?: string,\n): Promise<{ tokensUsed: number; costUsd: number; phases: PhaseResult[] }> {\n const { query } = await import('@anthropic-ai/claude-agent-sdk');\n\n const phases = config.phases!;\n const phaseResults: PhaseResult[] = [];\n let totalTokens = 0;\n let totalCost = 0;\n let runningTurnCount = 0;\n\n // ---------------------------------------------------------------------------\n // Orchestrator planning (opt-in via config.orchestrator.enabled)\n // ---------------------------------------------------------------------------\n\n let effectivePhases = [...phases];\n\n if (config.orchestrator?.enabled) {\n // 1. Run context queries (if any)\n const contextQueries = config.contextQueries\n ? Object.values(config.contextQueries).flat()\n : [];\n const contextResults: ContextQueryResult[] = contextQueries.length > 0\n ? await executeContextQueries(agentId, contextQueries)\n : [];\n\n // 2. Compose orchestrator prompt\n const orchestratorPrompt = composeOrchestratorPrompt(vaultContext, phases, contextResults);\n const orchestratorModel = config.orchestrator.model ?? config.model;\n const orchestratorMaxTurns = config.orchestrator.maxTurns ?? DEFAULT_ORCHESTRATOR_MAX_TURNS;\n\n // 3. Call orchestrator (no tools — planning only)\n let planResponse = '';\n for await (const message of query({\n prompt: orchestratorPrompt,\n options: {\n model: orchestratorModel,\n maxTurns: orchestratorMaxTurns,\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n persistSession: PERSIST_SESSION,\n tools: [],\n },\n })) {\n if (message.type === 'result' && 'result' in message && typeof message.result === 'string') {\n planResponse = message.result;\n }\n }\n\n // 4. Parse plan and apply directives\n const plan = parseOrchestratorPlan(planResponse, phases);\n effectivePhases = applyDirectives(phases, plan.phases);\n }\n\n // ---------------------------------------------------------------------------\n // Wave-based phase execution\n // ---------------------------------------------------------------------------\n\n // Build a map from phase name to its YAML declaration order for stable output\n const declarationOrder = new Map(phases.map((p, i) => [p.name, i]));\n\n const waves = computeWaves(effectivePhases);\n\n for (const wave of waves) {\n const executions = wave.map((phase, indexInWave) => {\n const phasePrompt = composePhasePrompt(\n vaultContext,\n config.taskDisplayName,\n config.taskPrompt,\n phase,\n phaseResults,\n instruction,\n );\n\n // Apply myco.yaml per-phase overrides (maxTurns, provider)\n const phaseOverride = phaseProviderOverrides?.[phase.name];\n const effectiveMaxTurns = phaseOverride?.maxTurns ?? phase.maxTurns;\n\n // Model priority: phase YAML → myco.yaml phase provider → myco.yaml task provider → task YAML\n const phaseModel = phase.model ?? phaseOverride?.provider?.model ?? taskProviderOverride?.model ?? config.model;\n const toolServer = createScopedVaultToolServer(\n agentId,\n runId,\n phase.tools,\n {\n turnOffset: runningTurnCount + (indexInWave * effectiveMaxTurns),\n embeddingManager,\n projectRoot,\n vaultDir,\n },\n );\n\n // Provider priority: phase YAML → myco.yaml phase → myco.yaml task → task YAML execution → default\n const phaseProvider = phase.provider ?? phaseOverride?.provider ?? taskProviderOverride ?? config.execution?.provider;\n const baseEnv = buildPhaseEnv(phaseProvider);\n const env = { ...(baseEnv ?? process.env), MYCO_AGENT_SESSION: '1' };\n const sessionId = phaseSessionId(runId, phase.name);\n\n // Pass effective maxTurns to executePhase via a modified phase object\n const effectivePhase = effectiveMaxTurns !== phase.maxTurns\n ? { ...phase, maxTurns: effectiveMaxTurns }\n : phase;\n\n return executePhase(query, phasePrompt, phaseModel, systemPrompt, toolServer, effectivePhase, env, sessionId, abortController);\n });\n\n const settled = await Promise.allSettled(executions);\n\n // Map settled results to PhaseResult[]\n const waveResults: PhaseResult[] = settled.map((outcome, i) => {\n if (outcome.status === 'fulfilled') {\n return outcome.value;\n }\n // Promise.allSettled rejected — shouldn't happen since executePhase catches,\n // but handle defensively\n return {\n name: wave[i].name,\n status: 'failed' as const,\n turnsUsed: 0,\n tokensUsed: 0,\n costUsd: 0,\n summary: `Error: ${toErrorMessage(outcome.reason)}`,\n };\n });\n\n // Sort by YAML declaration order for stable output\n waveResults.sort((a, b) =>\n (declarationOrder.get(a.name) ?? 0) - (declarationOrder.get(b.name) ?? 0),\n );\n\n // Accumulate results and totals\n for (const result of waveResults) {\n phaseResults.push(result);\n totalTokens += result.tokensUsed;\n totalCost += result.costUsd;\n runningTurnCount += result.turnsUsed;\n }\n\n // If any required phase in this wave failed, stop the pipeline\n const shouldStop = wave.some((phase, i) => {\n if (!phase.required) return false;\n const outcome = settled[i];\n if (outcome.status === 'rejected') return true;\n return outcome.value.status === 'failed';\n });\n\n if (shouldStop) {\n break;\n }\n }\n\n return { tokensUsed: totalTokens, costUsd: totalCost, phases: phaseResults };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Run an agent against a vault.\n *\n * For tasks with a `phases` array, uses wave-based parallel execution\n * (phases sorted into dependency waves via Kahn's algorithm). For tasks\n * without phases, uses a single query() call.\n *\n * @param vaultDir — absolute path to the vault directory.\n * @param options — optional overrides for agent, task, and instruction.\n * @returns the run result with status, token usage, and cost.\n */\nexport async function runAgent(\n vaultDir: string,\n options?: RunOptions,\n): Promise<AgentRunResult> {\n // 1. Init DB (idempotent — returns existing instance if already open)\n const db = initDatabase(vaultDbPath(vaultDir));\n createSchema(db);\n\n const agentId = options?.agentId ?? DEFAULT_AGENT_ID;\n\n // 2. Concurrency guard — block duplicate runs of the SAME task, not all tasks.\n // Different tasks (e.g., full-intelligence and skill-generate) can run concurrently.\n // When no task is specified, resolve the effective task name first so the guard applies.\n const requestedTask = options?.task;\n {\n const effectiveTask = requestedTask\n ?? getDefaultTask(agentId)?.id;\n if (effectiveTask) {\n const runningId = getRunningRunForTask(agentId, effectiveTask);\n if (runningId) {\n return {\n runId: runningId,\n status: STATUS_SKIPPED,\n reason: SKIP_REASON_ALREADY_RUNNING,\n };\n }\n }\n }\n\n // 3. Resolve config\n const definitionsDir = resolveDefinitionsDir();\n const definition = loadAgentDefinition(definitionsDir);\n\n // Load agent and task — both are sync DB lookups\n const agentRow = getAgent(agentId);\n const taskRow = options?.task\n ? getTask(options.task)\n : getDefaultTask(agentId);\n\n // Structural fields (phases, execution, contextQueries) come from the registry\n // (built-in YAML merged with user vault tasks) rather than the DB flat columns.\n const allTasks = loadAllTasks(definitionsDir, vaultDir);\n const taskName = taskRow?.id ?? options?.task;\n const yamlTask = taskName ? allTasks.get(taskName) : undefined;\n\n const taskOverrides = taskRow\n ? {\n name: taskRow.id,\n displayName: taskRow.display_name ?? taskRow.id,\n description: taskRow.description ?? '',\n agent: taskRow.agent_id,\n prompt: taskRow.prompt,\n isDefault: taskRow.is_default === 1,\n ...(taskRow.tool_overrides\n ? { toolOverrides: JSON.parse(taskRow.tool_overrides) as string[] }\n : {}),\n // Scalar config from YAML (model, turns, timeout) — DB doesn't store these\n ...(yamlTask?.model ? { model: yamlTask.model } : {}),\n ...(yamlTask?.maxTurns ? { maxTurns: yamlTask.maxTurns } : {}),\n ...(yamlTask?.timeoutSeconds ? { timeoutSeconds: yamlTask.timeoutSeconds } : {}),\n // Structural config from YAML\n ...(yamlTask?.phases ? { phases: yamlTask.phases } : {}),\n ...(yamlTask?.execution ? { execution: yamlTask.execution } : {}),\n ...(yamlTask?.contextQueries ? { contextQueries: yamlTask.contextQueries } : {}),\n ...(yamlTask?.orchestrator ? { orchestrator: yamlTask.orchestrator } : {}),\n }\n : undefined;\n\n const config = resolveEffectiveConfig(definition, agentRow, taskOverrides);\n\n // Load myco.yaml for provider overrides (global, per-task, per-phase)\n let taskProviderOverride: ProviderConfig | undefined;\n let phaseProviderOverrides: Record<string, { provider?: ProviderConfig; maxTurns?: number }> = {};\n try {\n const mycoConfig = loadConfig(vaultDir);\n\n // Helper to convert myco.yaml snake_case provider to runtime camelCase\n // API keys are NOT stored in myco.yaml — they flow via env vars (settings.json → hooks → daemon)\n const toProviderConfig = (p: { type: 'cloud' | 'ollama' | 'lmstudio'; base_url?: string; model?: string; context_length?: number }): ProviderConfig => ({\n type: p.type, baseUrl: p.base_url, model: p.model, contextLength: p.context_length,\n });\n\n // Per-task override takes priority over global\n const taskConfig = taskName ? mycoConfig.agent.tasks?.[taskName] : undefined;\n const globalProvider = mycoConfig.agent.provider;\n\n if (taskConfig?.provider) {\n taskProviderOverride = toProviderConfig(taskConfig.provider);\n } else if (globalProvider) {\n taskProviderOverride = toProviderConfig(globalProvider);\n }\n\n // Per-phase overrides from myco.yaml\n if (taskConfig?.phases) {\n for (const [phaseName, phaseConfig] of Object.entries(taskConfig.phases)) {\n phaseProviderOverrides[phaseName] = {\n ...(phaseConfig.provider ? { provider: toProviderConfig(phaseConfig.provider) } : {}),\n ...(phaseConfig.maxTurns != null ? { maxTurns: phaseConfig.maxTurns } : {}),\n };\n }\n }\n } catch {\n // Config load failure is non-fatal — proceed without overrides\n }\n\n // 4. Create run record\n const runId = options?.resumeRunId ?? crypto.randomUUID();\n const now = epochSeconds();\n\n if (!options?.resumeRunId) {\n insertRun({\n id: runId,\n agent_id: agentId,\n task: config.taskName,\n instruction: options?.instruction ?? null,\n status: STATUS_RUNNING,\n started_at: now,\n });\n }\n\n // 5. Build prompt components\n const systemPrompt = loadSystemPrompt(definitionsDir, config.systemPromptPath);\n const vaultContext = buildVaultContext(agentId);\n\n // 6. Build run metadata for audit trail\n const effectiveProvider = taskProviderOverride ?? config.execution?.provider;\n const effectiveModel = effectiveProvider?.model ?? config.model;\n const runMeta = {\n model: effectiveModel,\n provider: effectiveProvider?.type ?? 'cloud',\n ...(effectiveProvider?.baseUrl ? { baseUrl: effectiveProvider.baseUrl } : {}),\n };\n\n // 7. Ensure Ollama model has correct context length (creates variant if needed)\n if (effectiveProvider?.type === 'ollama' && effectiveProvider.contextLength && effectiveProvider.model) {\n const variantModel = await ensureOllamaContextVariant(\n effectiveProvider.model,\n effectiveProvider.contextLength,\n );\n // Override the model name so the SDK uses the context-aware variant\n taskProviderOverride = { ...taskProviderOverride!, model: variantModel };\n }\n\n // 8. Execute — phased or single query\n // Create abort controller for task-level timeout enforcement\n const taskAbortController = new AbortController();\n const timeoutMs = config.timeoutSeconds * MS_PER_SECOND;\n const timeoutId = setTimeout(() => {\n console.warn(`[agent] Run ${runId} exceeded timeout (${config.timeoutSeconds}s), aborting`);\n taskAbortController.abort();\n }, timeoutMs);\n timeoutId.unref?.();\n\n let phaseResults: PhaseResult[] | undefined;\n try {\n let tokensUsed: number;\n let costUsd: number;\n\n if (config.phases && config.phases.length > 0) {\n // Phased execution: wave-based parallel query() per phase with scoped tools\n const projectRoot = resolve(vaultDir, '..');\n const result = await executePhasedQuery(\n config,\n systemPrompt,\n vaultContext,\n agentId,\n runId,\n taskProviderOverride,\n phaseProviderOverrides,\n options?.instruction,\n options?.embeddingManager,\n taskAbortController,\n projectRoot,\n vaultDir,\n );\n tokensUsed = result.tokensUsed;\n costUsd = result.costUsd;\n phaseResults = result.phases;\n } else {\n // Single-query execution (backward compatible)\n const taskPrompt = composeTaskPrompt(\n vaultContext,\n config.taskDisplayName,\n config.taskPrompt,\n options?.instruction,\n );\n\n // Provider priority for single-query: myco.yaml task override → task execution config → default\n const singleProvider = taskProviderOverride ?? config.execution?.provider;\n\n const result = await executeSingleQuery(\n config,\n systemPrompt,\n taskPrompt,\n agentId,\n runId,\n singleProvider,\n options?.embeddingManager,\n taskAbortController,\n vaultDir,\n );\n tokensUsed = result.tokensUsed;\n costUsd = result.costUsd;\n }\n\n clearTimeout(timeoutId);\n const completedAt = epochSeconds();\n updateRunStatus(runId, STATUS_COMPLETED, {\n completed_at: completedAt,\n tokens_used: tokensUsed,\n cost_usd: costUsd,\n actions_taken: JSON.stringify({ ...runMeta, ...(phaseResults ? { phases: phaseResults } : {}) }),\n });\n\n return {\n runId,\n status: STATUS_COMPLETED,\n tokensUsed,\n costUsd,\n ...(phaseResults ? { phases: phaseResults } : {}),\n };\n } catch (err) {\n clearTimeout(timeoutId);\n // 7. Error handling — mark run as failed, preserve phase results\n // Aggressively extract error info — the SDK may throw non-Error objects\n let errorMessage: string;\n if (err instanceof Error) {\n errorMessage = err.message || err.constructor.name || 'Error (no message)';\n if (err.stack) errorMessage += `\\n${err.stack.split('\\n').slice(0, 3).join('\\n')}`;\n } else if (typeof err === 'string') {\n errorMessage = err || 'Empty string error';\n } else {\n try { errorMessage = JSON.stringify(err); } catch { errorMessage = 'Unserializable error'; }\n }\n const failedAt = epochSeconds();\n\n // Log to stderr (daemon may capture) and to structured log\n console.error(`[agent] Run ${runId} failed: ${errorMessage}`);\n\n try {\n updateRunStatus(runId, STATUS_FAILED, {\n completed_at: failedAt,\n error: errorMessage,\n // Preserve phase results collected before the failure\n actions_taken: JSON.stringify({ ...runMeta, ...(phaseResults ? { phases: phaseResults } : {}) }),\n });\n } catch (dbErr) {\n // DB failure in error path — log it but don't mask the original error\n console.error(`[agent] Failed to save error to DB:`, dbErr);\n }\n\n return {\n runId,\n status: STATUS_FAILED,\n error: errorMessage,\n ...(phaseResults ? { phases: phaseResults } : {}),\n };\n }\n}\n","/**\n * Vault MCP tool server for the agent.\n *\n * Creates 21 tools that expose SQLite query helpers to the agent\n * via the Claude Agent SDK. Tools are grouped into:\n * - Read tools: vault_unprocessed, vault_spores, vault_sessions, vault_search_fts,\n * vault_search_semantic, vault_state, vault_entities, vault_edges,\n * vault_read_digest\n * - Write tools: vault_create_spore, vault_create_entity, vault_create_edge,\n * vault_resolve_spore, vault_update_session, vault_set_state,\n * vault_write_digest, vault_mark_processed\n * - Observability: vault_report\n *\n * `agentId` and `runId` are captured in closures — tools inject them\n * automatically so the agent cannot impersonate another agent.\n */\n\nimport crypto from 'node:crypto';\nimport { writeFileSync, mkdirSync, rmSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { z } from 'zod/v4';\nimport { tool, createSdkMcpServer } from '@anthropic-ai/claude-agent-sdk';\nimport { epochSeconds, SEARCH_SIMILARITY_THRESHOLD, TEAM_SOURCE_PREFIX, DEFAULT_LIST_LIMIT } from '@myco/constants.js';\nimport { getPluginVersion } from '@myco/version.js';\nimport { getDatabase } from '@myco/db/client.js';\nimport { getUnprocessedBatches, markBatchProcessed } from '@myco/db/queries/batches.js';\nimport { listSpores, insertSpore, updateSporeStatus, DEFAULT_IMPORTANCE } from '@myco/db/queries/spores.js';\nimport { listSessions, updateSession } from '@myco/db/queries/sessions.js';\nimport { getStatesForAgent, setState } from '@myco/db/queries/agent-state.js';\nimport { insertReport } from '@myco/db/queries/reports.js';\nimport { insertTurn } from '@myco/db/queries/turns.js';\nimport { EMBEDDABLE_TABLES, type EmbeddableTable } from '@myco/db/queries/embeddings.js';\nimport { fullTextSearch } from '@myco/db/queries/search.js';\nimport { insertEntity, listEntities } from '@myco/db/queries/entities.js';\nimport { insertGraphEdge, listGraphEdges } from '@myco/db/queries/graph-edges.js';\nimport { createSporeLineage } from '@myco/db/queries/lineage.js';\nimport { insertResolutionEvent } from '@myco/db/queries/resolution-events.js';\nimport { upsertDigestExtract, listDigestExtracts } from '@myco/db/queries/digest-extracts.js';\nimport {\n insertCandidate, getCandidate, listCandidates, updateCandidate,\n} from '@myco/db/queries/skill-candidates.js';\nimport {\n insertSkillRecord, getSkillRecord, getSkillRecordByName,\n listSkillRecords, updateSkillRecord,\n} from '@myco/db/queries/skill-records.js';\nimport { insertLineage } from '@myco/db/queries/skill-lineage.js';\nimport { deleteCandidate } from '@myco/db/queries/skill-candidates.js';\nimport { deleteSkillRecordCascade } from '@myco/db/queries/skill-records.js';\nimport type { EmbeddingManager } from '@myco/daemon/embedding/index.js';\nimport type { TeamSyncClient } from '@myco/daemon/team-sync.js';\nimport { notify } from '@myco/notifications/notify.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default limit for unprocessed batches query. */\nconst DEFAULT_UNPROCESSED_LIMIT = 50;\n\n/** Default limit for spore listing. */\nconst DEFAULT_SPORES_LIMIT = 50;\n\n/** Default limit for session listing. */\nconst DEFAULT_SESSIONS_LIMIT = 20;\n\n/** Default limit for similarity search results. */\nconst DEFAULT_SEARCH_LIMIT = 10;\n\n/** Default embeddable table for search. */\nconst DEFAULT_SEARCH_TABLE: EmbeddableTable = 'spores';\n\n/** Default limit for entity listing. */\nconst DEFAULT_ENTITIES_LIMIT = 50;\n\n/** Default limit for edge listing. */\nconst DEFAULT_EDGES_LIMIT = 50;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Format a value as a JSON text content block for tool output. */\nfunction textResult(data: unknown): { content: Array<{ type: 'text'; text: string }> } {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data) }] };\n}\n\n// ---------------------------------------------------------------------------\n// Skill content validation (module-scope — avoids re-creation per server instantiation)\n// ---------------------------------------------------------------------------\n\n/** Maximum lines for a generated skill. */\nexport const MAX_SKILL_LINES = 500;\n\n/** Required frontmatter fields for Myco-managed skills. */\nexport const REQUIRED_FRONTMATTER_FIELDS = ['name', 'description', 'managed_by', 'user-invocable', 'allowed-tools'] as const;\n\n/**\n * Validate skill content before writing. Returns an array of issues\n * (empty = valid). This is a deterministic quality gate — the agent\n * must fix all issues before the skill is accepted.\n */\nexport function validateSkillContent(content: string, dirName: string): string[] {\n const issues: string[] = [];\n\n // Check for frontmatter delimiters\n const fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!fmMatch) {\n issues.push('Missing YAML frontmatter (must start with --- and end with ---)');\n return issues; // Can't check fields without frontmatter\n }\n\n const frontmatter = fmMatch[1];\n\n // Check required fields\n for (const field of REQUIRED_FRONTMATTER_FIELDS) {\n if (!frontmatter.includes(`${field}:`)) {\n issues.push(`Missing required frontmatter field: ${field}`);\n }\n }\n\n // Check myco: prefix on name\n const nameMatch = frontmatter.match(/^name:\\s*(.+)$/m);\n if (nameMatch && !nameMatch[1].trim().startsWith('myco:')) {\n issues.push(`Skill name must start with \"myco:\" prefix. Got: \"${nameMatch[1].trim()}\"`);\n }\n\n // Check managed_by: myco\n const managedMatch = frontmatter.match(/^managed_by:\\s*(.+)$/m);\n if (managedMatch && managedMatch[1].trim() !== 'myco') {\n issues.push(`managed_by must be \"myco\". Got: \"${managedMatch[1].trim()}\"`);\n }\n\n // Check allowed-tools values — must be Claude Code tool names, not vault agent tools.\n // These skills run in developer Claude Code sessions, not the agent pipeline.\n const allowedToolsMatch = frontmatter.match(/^allowed-tools:\\s*(.+)$/m);\n if (allowedToolsMatch) {\n const toolsValue = allowedToolsMatch[1].trim();\n // Reject vault_* tool names — common LLM mistake of copying its own tool context\n if (toolsValue.includes('vault_')) {\n issues.push(\n 'allowed-tools contains vault agent tool names (vault_*). ' +\n 'Skills run in Claude Code sessions — use Claude Code tool names instead: ' +\n 'Read, Edit, Write, Bash, Grep, Glob'\n );\n }\n }\n // Also check YAML list format (- vault_search_fts etc.)\n const listToolLines = frontmatter.match(/^\\s+-\\s+vault_\\w+/gm);\n if (listToolLines) {\n issues.push(\n 'allowed-tools contains vault agent tool names (vault_*). ' +\n 'Skills run in Claude Code sessions — use Claude Code tool names instead: ' +\n 'Read, Edit, Write, Bash, Grep, Glob'\n );\n }\n\n // Check line count\n const lineCount = content.split('\\n').length;\n if (lineCount > MAX_SKILL_LINES) {\n issues.push(`Skill is ${lineCount} lines (max ${MAX_SKILL_LINES})`);\n }\n\n return issues;\n}\n\n// ---------------------------------------------------------------------------\n// Tool definitions factory\n// ---------------------------------------------------------------------------\n\n/** Total number of vault tools defined. */\nexport const VAULT_TOOL_COUNT = 21;\n\n/** Options for createVaultTools beyond the required agentId and runId. */\nexport interface VaultToolOptions {\n turnOffset?: number;\n embeddingManager?: EmbeddingManager;\n teamClient?: TeamSyncClient | null;\n machineId?: string;\n projectRoot?: string;\n vaultDir?: string;\n}\n\n/**\n * Create the 21 vault tool definitions for the agent (includes 3 skill tools:\n * vault_skill_candidates, vault_skill_records, vault_write_skill).\n *\n * Exposed for testing (call handler directly) and for the MCP server factory.\n */\nexport function createVaultTools(agentId: string, runId: string, options?: VaultToolOptions) {\n const { turnOffset = 0, embeddingManager, teamClient, machineId, projectRoot, vaultDir } = options ?? {};\n /** Turn number counter — incremented per tool call (read and write) within a run. */\n let turnCounter = turnOffset;\n\n /**\n * Record a turn in the audit trail.\n * Called for ALL tool invocations (read and write) for full visibility.\n * Fire-and-forget — does not block the tool response.\n */\n function recordTurn(toolName: string, toolInput: unknown): void {\n turnCounter++;\n try {\n insertTurn({\n run_id: runId,\n agent_id: agentId,\n turn_number: turnCounter,\n tool_name: toolName,\n tool_input: JSON.stringify(toolInput),\n started_at: epochSeconds(),\n });\n } catch {\n /* audit trail is best-effort */\n }\n }\n\n // -------------------------------------------------------------------------\n // Read tools\n // -------------------------------------------------------------------------\n\n const vaultUnprocessed = tool(\n 'vault_unprocessed',\n 'Get unprocessed prompt batches, ordered by id ASC. Supports cursor-based pagination.',\n {\n after_id: z.number().optional().describe('Return batches with id greater than this'),\n limit: z.number().optional().describe('Maximum number of batches to return'),\n },\n async (args) => {\n recordTurn('vault_unprocessed', args);\n const batches = getUnprocessedBatches({\n after_id: args.after_id,\n limit: args.limit ?? DEFAULT_UNPROCESSED_LIMIT,\n });\n return textResult(batches);\n },\n { annotations: { readOnlyHint: true } },\n );\n\n const vaultSpores = tool(\n 'vault_spores',\n 'List spores with optional filters (agent, observation type, status, session).',\n {\n agent_id: z.string().optional().describe('Filter by agent ID'),\n observation_type: z.string().optional().describe('Filter by observation type (e.g., gotcha, decision)'),\n status: z.enum(['active', 'superseded', 'archived']).optional().describe('Filter by status'),\n session_id: z.string().optional().describe('Filter by session ID'),\n limit: z.number().optional().describe('Maximum number of spores to return'),\n },\n async (args) => {\n recordTurn('vault_spores', args);\n const spores = listSpores({\n agent_id: args.agent_id,\n observation_type: args.observation_type,\n status: args.status,\n session_id: args.session_id,\n limit: args.limit ?? DEFAULT_SPORES_LIMIT,\n });\n return textResult(spores);\n },\n { annotations: { readOnlyHint: true } },\n );\n\n const vaultSessions = tool(\n 'vault_sessions',\n 'List sessions with optional status filter, ordered by created_at DESC.',\n {\n limit: z.number().optional().describe('Maximum number of sessions to return'),\n status: z.string().optional().describe('Filter by status (active, completed)'),\n },\n async (args) => {\n recordTurn('vault_sessions', args);\n const sessions = listSessions({\n limit: args.limit ?? DEFAULT_SESSIONS_LIMIT,\n status: args.status,\n });\n return textResult(sessions);\n },\n { annotations: { readOnlyHint: true } },\n );\n\n const vaultSearchFts = tool(\n 'vault_search_fts',\n 'Full-text search across sessions, spores, prompt batches, and activities using FTS5. Best for finding exact keywords, file paths, function names, and specific text. Searches: session titles/summaries, spore content, user prompts, AI response summaries, tool calls.',\n {\n query: z.string().describe('Search query text'),\n type: z.string().optional().describe('Restrict to a result type (session, spore, prompt_batch, activity)'),\n limit: z.number().optional().describe('Maximum number of results to return'),\n },\n async (args) => {\n recordTurn('vault_search_fts', args);\n try {\n const results = fullTextSearch(args.query, {\n type: args.type,\n limit: args.limit ?? DEFAULT_SEARCH_LIMIT,\n });\n return textResult({ results });\n } catch {\n return textResult({ results: [], message: 'Search unavailable' });\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n\n const vaultSearchSemantic = tool(\n 'vault_search_semantic',\n 'Semantic similarity search across embedded vault content (spores, sessions, plans, artifacts). Best for finding conceptually related content. Returns results ranked by similarity score.',\n {\n query: z.string().describe('Search query text'),\n namespace: z.string().optional().describe('Restrict to a content type: spores, sessions, plans, artifacts. Omit to search all.'),\n limit: z.number().optional().describe('Maximum results to return'),\n },\n async (args) => {\n recordTurn('vault_search_semantic', args);\n if (!embeddingManager) {\n return textResult({ results: [], message: 'Embedding provider unavailable' });\n }\n try {\n const queryVector = await embeddingManager.embedQuery(args.query);\n if (!queryVector) {\n return textResult({ results: [], message: 'Embedding provider unavailable' });\n }\n const searchLimit = args.limit ?? DEFAULT_SEARCH_LIMIT;\n\n // Fire local and team search in parallel\n const [localResults, teamResults] = await Promise.all([\n Promise.resolve(\n embeddingManager.searchVectors(queryVector, {\n namespace: args.namespace,\n limit: searchLimit,\n threshold: SEARCH_SIMILARITY_THRESHOLD,\n }).map((r) => ({ ...r, source: 'local' as const })),\n ),\n teamClient\n ? teamClient.search(args.query, { limit: searchLimit })\n .then((res) => res.results.map((r) => ({ ...r, source: `${TEAM_SOURCE_PREFIX}${r.machine_id}` })))\n .catch(() => [] as Array<Record<string, unknown>>)\n : Promise.resolve([] as Array<Record<string, unknown>>),\n ]);\n\n // Deduplicate: skip team results from this machine (we already have them locally)\n const dedupedTeam = machineId\n ? teamResults.filter((r) => (r as Record<string, unknown>).machine_id !== machineId)\n : teamResults;\n\n // Merge by similarity/score (normalize to common key), slice to limit\n const merged = [\n ...localResults.map((r) => ({ ...r, score: r.similarity })),\n ...dedupedTeam,\n ]\n .sort((a, b) => ((b.score as number) ?? 0) - ((a.score as number) ?? 0))\n .slice(0, searchLimit);\n\n return textResult({ results: merged });\n } catch {\n return textResult({ results: [], message: 'Semantic search unavailable' });\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n\n const vaultState = tool(\n 'vault_state',\n 'Get all state key-value pairs for the current agent.',\n {},\n async () => {\n recordTurn('vault_state', {});\n const states = getStatesForAgent(agentId);\n return textResult(states);\n },\n { annotations: { readOnlyHint: true } },\n );\n\n const vaultEntities = tool(\n 'vault_entities',\n 'List knowledge graph entities with optional filters.',\n {\n type: z.enum(['component', 'concept', 'person']).optional().describe('Filter by entity type'),\n name: z.string().optional().describe('Filter by entity name (exact match)'),\n limit: z.number().optional().describe('Maximum entities to return'),\n },\n async (args) => {\n recordTurn('vault_entities', args);\n const entities = listEntities({\n agent_id: agentId,\n type: args.type,\n name: args.name,\n limit: args.limit ?? DEFAULT_ENTITIES_LIMIT,\n });\n return textResult(entities);\n },\n { annotations: { readOnlyHint: true } },\n );\n\n const vaultEdges = tool(\n 'vault_edges',\n 'List knowledge graph edges with optional filters. Use to check existing relationships before creating new ones.',\n {\n source_id: z.string().optional().describe('Filter by source node ID'),\n target_id: z.string().optional().describe('Filter by target node ID'),\n type: z.string().optional().describe('Filter by edge type (REFERENCES, DEPENDS_ON, AFFECTS, etc.)'),\n limit: z.number().optional().describe('Maximum edges to return'),\n },\n async (args) => {\n recordTurn('vault_edges', args);\n const edges = listGraphEdges({\n sourceId: args.source_id,\n targetId: args.target_id,\n type: args.type,\n agentId: agentId,\n limit: args.limit ?? DEFAULT_EDGES_LIMIT,\n });\n return textResult(edges);\n },\n { annotations: { readOnlyHint: true } },\n );\n\n // -------------------------------------------------------------------------\n // Write tools\n // -------------------------------------------------------------------------\n\n const vaultCreateSpore = tool(\n 'vault_create_spore',\n 'Create a new spore (observation) in the vault. The agent_id is set automatically.',\n {\n observation_type: z.string().describe('Type of observation (gotcha, decision, discovery, trade-off, bug_fix, etc.)'),\n content: z.string().describe('The observation content in markdown'),\n session_id: z.string().optional().describe('Associated session ID'),\n prompt_batch_id: z.number().optional().describe('Associated prompt batch ID'),\n importance: z.number().optional().describe('Importance score 1-10 (default 5)'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n context: z.string().optional().describe('Additional context about the observation'),\n file_path: z.string().optional().describe('Related file path'),\n properties: z.string().optional().describe('JSON metadata (e.g., {\"consolidated_from\": [...]} for wisdom spores)'),\n },\n async (args) => {\n const id = crypto.randomUUID();\n const now = epochSeconds();\n\n const spore = insertSpore({\n id,\n agent_id: agentId,\n machine_id: machineId,\n observation_type: args.observation_type,\n content: args.content,\n session_id: args.session_id ?? null,\n prompt_batch_id: args.prompt_batch_id ?? null,\n importance: args.importance ?? DEFAULT_IMPORTANCE,\n tags: args.tags ? JSON.stringify(args.tags) : null,\n context: args.context ?? null,\n file_path: args.file_path ?? null,\n properties: args.properties ?? null,\n created_at: now,\n });\n\n // Best-effort: structural lineage edges (FROM_SESSION, EXTRACTED_FROM, DERIVED_FROM)\n try { createSporeLineage(spore); } catch { /* lineage best-effort */ }\n\n embeddingManager?.onContentWritten('spores', spore.id, args.content, {\n status: 'active',\n observation_type: args.observation_type,\n session_id: args.session_id,\n }).catch(() => {});\n\n // Spore notifications are batched post-run (daemon emits summary after agent completes)\n recordTurn('vault_create_spore', args);\n return textResult(spore);\n },\n );\n\n const vaultCreateEntity = tool(\n 'vault_create_entity',\n 'Create or update an entity in the knowledge graph. Uses UPSERT on (agent_id, type, name).',\n {\n type: z.enum(['component', 'concept', 'person']).describe('Entity type'),\n name: z.string().describe('Entity name (unique within agent + type)'),\n properties: z.record(z.string(), z.unknown()).optional().describe('Additional properties as key-value pairs'),\n },\n async (args) => {\n const id = crypto.randomUUID();\n const now = epochSeconds();\n const props = args.properties ? JSON.stringify(args.properties) : null;\n\n const entity = insertEntity({\n id,\n agent_id: agentId,\n machine_id: machineId,\n type: args.type,\n name: args.name,\n properties: props,\n first_seen: now,\n last_seen: now,\n });\n\n recordTurn('vault_create_entity', args);\n return textResult(entity);\n },\n );\n\n const vaultCreateEdge = tool(\n 'vault_create_edge',\n 'Create a semantic edge in the knowledge graph. Lineage edges (FROM_SESSION, EXTRACTED_FROM, HAS_BATCH, DERIVED_FROM) are created automatically — do NOT create those.',\n {\n source_id: z.string().describe('Source node ID'),\n source_type: z.enum(['session', 'batch', 'spore', 'entity']).describe('Source node type'),\n target_id: z.string().describe('Target node ID'),\n target_type: z.enum(['session', 'batch', 'spore', 'entity']).describe('Target node type'),\n type: z.enum(['RELATES_TO', 'SUPERSEDED_BY', 'REFERENCES', 'DEPENDS_ON', 'AFFECTS']).describe('Semantic edge type'),\n session_id: z.string().optional().describe('Session where this relationship was observed'),\n confidence: z.number().optional().describe('Confidence score 0-1 (default 1.0)'),\n properties: z.record(z.string(), z.unknown()).optional().describe('Additional properties as key-value pairs'),\n },\n async (args) => {\n const now = epochSeconds();\n const props = args.properties ? JSON.stringify(args.properties) : undefined;\n\n const edge = insertGraphEdge({\n agent_id: agentId,\n machine_id: machineId,\n source_id: args.source_id,\n source_type: args.source_type,\n target_id: args.target_id,\n target_type: args.target_type,\n type: args.type,\n session_id: args.session_id,\n confidence: args.confidence,\n properties: props,\n created_at: now,\n });\n\n recordTurn('vault_create_edge', args);\n return textResult(edge);\n },\n );\n\n const vaultResolveSpore = tool(\n 'vault_resolve_spore',\n 'Resolve a spore by updating its status and recording a resolution event.',\n {\n spore_id: z.string().describe('ID of the spore to resolve'),\n action: z.enum(['supersede', 'archive', 'merge', 'split', 'consolidate']).describe('Resolution action'),\n new_spore_id: z.string().optional().describe('ID of the replacement spore (for supersede/merge)'),\n reason: z.string().optional().describe('Explanation for the resolution'),\n session_id: z.string().optional().describe('Session where this resolution occurred'),\n },\n async (args) => {\n const now = epochSeconds();\n\n // Update spore status\n const statusMap: Record<string, string> = {\n supersede: 'superseded',\n archive: 'archived',\n merge: 'merged',\n split: 'split',\n consolidate: 'consolidated',\n };\n const newStatus = statusMap[args.action] ?? args.action;\n const updatedSpore = updateSporeStatus(args.spore_id, newStatus, now);\n\n // Record resolution event\n const eventId = crypto.randomUUID();\n insertResolutionEvent({\n id: eventId,\n agent_id: agentId,\n machine_id: machineId,\n spore_id: args.spore_id,\n action: args.action,\n new_spore_id: args.new_spore_id ?? null,\n reason: args.reason ?? null,\n session_id: args.session_id ?? null,\n created_at: now,\n });\n\n if (newStatus !== 'active') {\n try { embeddingManager?.onStatusChanged('spores', args.spore_id, newStatus); } catch { /* best-effort */ }\n }\n\n recordTurn('vault_resolve_spore', args);\n return textResult({ spore: updatedSpore, resolution_event_id: eventId });\n },\n );\n\n const vaultUpdateSession = tool(\n 'vault_update_session',\n 'Update a session title and/or summary. When generating for the first time, provide BOTH title and summary. Title should be under 80 characters and reflect the full session scope.',\n {\n session_id: z.string().describe('Session ID to update'),\n title: z.string().optional().describe('New session title'),\n summary: z.string().optional().describe('New session summary'),\n },\n async (args) => {\n const updates: Record<string, unknown> = {};\n if (args.title !== undefined) updates.title = args.title;\n if (args.summary !== undefined) updates.summary = args.summary;\n\n const session = updateSession(args.session_id, updates);\n\n if (args.summary) {\n embeddingManager?.onContentWritten('sessions', args.session_id, args.summary, {}).catch(() => {});\n }\n\n recordTurn('vault_update_session', args);\n return textResult(session);\n },\n );\n\n const vaultSetState = tool(\n 'vault_set_state',\n 'Set a key-value state pair for the current agent. Used for bookmarks, cursors, and preferences.',\n {\n key: z.string().describe('State key (e.g., last_processed_batch_id, cursor)'),\n value: z.string().describe('State value (stored as text)'),\n },\n async (args) => {\n const now = epochSeconds();\n const state = setState(agentId, args.key, args.value, now);\n\n recordTurn('vault_set_state', args);\n return textResult(state);\n },\n );\n\n const vaultReadDigest = tool(\n 'vault_read_digest',\n 'Read current digest extracts. Without a tier parameter, returns a summary of all tiers (content length, generation time). With a tier parameter, returns the full content for that specific tier.',\n {\n tier: z.number().optional().describe('Specific tier to read in full (e.g., 1500, 5000, 10000). Omit to get summary of all tiers.'),\n },\n async (args) => {\n recordTurn('vault_read_digest', args);\n const extracts = listDigestExtracts(agentId);\n\n if (args.tier !== undefined) {\n const extract = extracts.find(e => e.tier === args.tier);\n if (!extract) return textResult({ tier: args.tier, content: null, message: 'No digest at this tier' });\n return textResult({ tier: extract.tier, content: extract.content, generated_at: extract.generated_at });\n }\n\n // Summary mode — return metadata for all tiers\n return textResult(extracts.map(e => ({\n tier: e.tier,\n content_length: e.content.length,\n generated_at: e.generated_at,\n })));\n },\n { annotations: { readOnlyHint: true } },\n );\n\n const vaultWriteDigest = tool(\n 'vault_write_digest',\n 'Write or update a digest extract at a specific token tier. Uses UPSERT on (agent_id, tier).',\n {\n tier: z.number().describe('Token budget tier (e.g., 1500, 5000, 10000)'),\n content: z.string().describe('The digest extract content in markdown'),\n },\n async (args) => {\n const now = epochSeconds();\n\n const extract = upsertDigestExtract({\n agent_id: agentId,\n tier: args.tier,\n content: args.content,\n generated_at: now,\n });\n\n // Digest notifications are batched post-run (daemon emits summary after agent completes)\n recordTurn('vault_write_digest', args);\n return textResult(extract);\n },\n );\n\n const vaultMarkProcessed = tool(\n 'vault_mark_processed',\n 'Mark a prompt batch as processed so it is not returned by vault_unprocessed.',\n {\n batch_id: z.number().describe('ID of the prompt batch to mark as processed'),\n },\n async (args) => {\n const batch = markBatchProcessed(args.batch_id);\n\n recordTurn('vault_mark_processed', args);\n return textResult(batch);\n },\n );\n\n // -------------------------------------------------------------------------\n // Observability tool\n // -------------------------------------------------------------------------\n\n const vaultReport = tool(\n 'vault_report',\n 'Record an observability report for the current run. Use action \"skip\" when skipping expected operations (e.g., not updating a session summary) with reasoning in the summary field.',\n {\n action: z.string().describe('Action name (e.g., extract, consolidate, digest, skip)'),\n summary: z.string().describe('Human-readable summary of what was done'),\n details: z.record(z.string(), z.unknown()).optional().describe('Structured details as key-value pairs'),\n },\n async (args) => {\n recordTurn('vault_report', args);\n const now = epochSeconds();\n\n const report = insertReport({\n run_id: runId,\n agent_id: agentId,\n action: args.action,\n summary: args.summary,\n details: args.details ? JSON.stringify(args.details) : null,\n created_at: now,\n });\n\n return textResult(report);\n },\n );\n\n // -------------------------------------------------------------------------\n // Skill lifecycle tools\n // -------------------------------------------------------------------------\n\n const vaultSkillCandidates = tool(\n 'vault_skill_candidates',\n 'Manage skill candidates (identified topics that may become skills). Supports list, get, create, and update actions.',\n {\n action: z.enum(['list', 'get', 'create', 'update', 'delete']).describe('Action to perform'),\n id: z.string().optional().describe('Candidate ID (required for get/update)'),\n topic: z.string().optional().describe('Skill topic (required for create)'),\n rationale: z.string().optional().describe('Why this should be a skill (required for create)'),\n confidence: z.number().optional().describe('Confidence score 0-1'),\n status: z.enum(['identified', 'approved', 'generated', 'dismissed']).optional().describe('Candidate status. Only these values are valid.'),\n source_ids: z.string().optional().describe('JSON array of source spore/entity IDs'),\n skill_id: z.string().optional().describe('Associated skill record ID (after materialization)'),\n limit: z.number().optional().describe('Maximum candidates to return (for list)'),\n },\n async (args) => {\n recordTurn('vault_skill_candidates', args);\n\n switch (args.action) {\n case 'list': {\n const candidates = listCandidates({\n agent_id: agentId,\n status: args.status,\n limit: args.limit ?? DEFAULT_LIST_LIMIT,\n });\n return textResult(candidates);\n }\n\n case 'get': {\n if (!args.id) return textResult({ error: 'id is required for get action' });\n const candidate = getCandidate(args.id);\n if (!candidate) return textResult({ error: `Candidate not found: ${args.id}` });\n return textResult(candidate);\n }\n\n case 'create': {\n if (!args.topic || !args.rationale) {\n return textResult({ error: 'topic and rationale are required for create action' });\n }\n const now = epochSeconds();\n const candidate = insertCandidate({\n id: crypto.randomUUID(),\n agent_id: agentId,\n machine_id: machineId,\n topic: args.topic,\n rationale: args.rationale,\n confidence: args.confidence,\n status: args.status,\n source_ids: args.source_ids,\n created_at: now,\n updated_at: now,\n });\n notify(vaultDir, {\n domain: 'skills',\n type: 'skill.surveyed',\n title: `Skill candidate: ${args.topic}`,\n message: args.rationale.slice(0, 120),\n link: '/skills?tab=candidates',\n metadata: { candidateId: candidate.id, topic: args.topic },\n });\n return textResult(candidate);\n }\n\n case 'update': {\n if (!args.id) return textResult({ error: 'id is required for update action' });\n const now = epochSeconds();\n const updated = updateCandidate(args.id, {\n ...(args.topic !== undefined ? { topic: args.topic } : {}),\n ...(args.rationale !== undefined ? { rationale: args.rationale } : {}),\n ...(args.confidence !== undefined ? { confidence: args.confidence } : {}),\n ...(args.status !== undefined ? { status: args.status } : {}),\n ...(args.source_ids !== undefined ? { source_ids: args.source_ids } : {}),\n ...(args.skill_id !== undefined ? { skill_id: args.skill_id } : {}),\n updated_at: now,\n });\n if (!updated) return textResult({ error: `Candidate not found: ${args.id}` });\n return textResult(updated);\n }\n\n case 'delete': {\n if (!args.id) return textResult({ error: 'id is required for delete action' });\n const deleted = deleteCandidate(args.id);\n if (!deleted) return textResult({ error: `Candidate not found: ${args.id}` });\n return textResult({ deleted: true, id: args.id });\n }\n\n default:\n return textResult({ error: `Unknown action: ${args.action}` });\n }\n },\n );\n\n const vaultSkillRecords = tool(\n 'vault_skill_records',\n 'Read, update, and delete skill records (materialized skills on disk). Supports list, get, update, and delete actions.',\n {\n action: z.enum(['list', 'get', 'update', 'delete']).describe('Action to perform'),\n id: z.string().optional().describe('Skill record ID or name (required for get/update/delete)'),\n status: z.enum(['active', 'stale', 'retired']).optional().describe('Filter by status'),\n generation: z.number().optional().describe('New generation number (for update)'),\n source_ids: z.string().optional().describe('JSON array of source IDs (for update)'),\n description: z.string().optional().describe('Updated description (for update)'),\n limit: z.number().optional().describe('Maximum records to return (for list)'),\n },\n async (args) => {\n recordTurn('vault_skill_records', args);\n\n switch (args.action) {\n case 'list': {\n const records = listSkillRecords({\n agent_id: agentId,\n status: args.status,\n limit: args.limit ?? DEFAULT_LIST_LIMIT,\n });\n return textResult(records);\n }\n\n case 'get': {\n if (!args.id) return textResult({ error: 'id is required for get action' });\n const record = getSkillRecord(args.id) ?? getSkillRecordByName(args.id);\n if (!record) return textResult({ error: `Skill record not found: ${args.id}` });\n return textResult(record);\n }\n\n case 'update': {\n if (!args.id) return textResult({ error: 'id is required for update action' });\n // Resolve by id or name\n const existing = getSkillRecord(args.id) ?? getSkillRecordByName(args.id);\n if (!existing) return textResult({ error: `Skill record not found: ${args.id}` });\n\n const now = epochSeconds();\n const updated = updateSkillRecord(existing.id, {\n ...(args.status !== undefined ? { status: args.status } : {}),\n ...(args.generation !== undefined ? { generation: args.generation } : {}),\n ...(args.source_ids !== undefined ? { source_ids: args.source_ids } : {}),\n ...(args.description !== undefined ? { description: args.description } : {}),\n updated_at: now,\n });\n if (!updated) return textResult({ error: `Failed to update skill record: ${existing.id}` });\n return textResult(updated);\n }\n\n case 'delete': {\n if (!args.id) return textResult({ error: 'id is required for delete action' });\n const result = deleteSkillRecordCascade(args.id);\n if (!result) return textResult({ error: `Skill record not found: ${args.id}` });\n // Disk + symlink cleanup (best-effort)\n const root = projectRoot ?? process.cwd();\n if (!/[/\\\\]|\\.\\./.test(result.name)) {\n const skillDir = resolve(root, '.agents', 'skills', result.name);\n try { rmSync(skillDir, { recursive: true, force: true }); } catch (err) {\n console.warn('[vault_skill_records] Failed to remove skill directory:', err instanceof Error ? err.message : err);\n }\n try {\n const { syncSkillSymlinks } = await import('../symbionts/installer.js');\n syncSkillSymlinks(root, result.name, { remove: true });\n } catch (err) {\n console.warn('[vault_skill_records] Failed to remove symlinks:', err instanceof Error ? err.message : err);\n }\n }\n return textResult({ deleted: true, id: result.id, name: result.name });\n }\n\n default:\n return textResult({ error: `Unknown action: ${args.action}` });\n }\n },\n );\n\n const vaultWriteSkill = tool(\n 'vault_write_skill',\n 'Write a SKILL.md file to disk and create or update the corresponding skill record and lineage entry.',\n {\n name: z.string().describe('Skill directory name (kebab-case, NO colon). The myco: prefix goes in the SKILL.md frontmatter name field, not here.'),\n display_name: z.string().describe('Human-readable display name'),\n description: z.string().describe('Short description of what the skill does'),\n content: z.string().describe('Full SKILL.md content in markdown'),\n source_ids: z.string().optional().describe('JSON array of source spore/entity IDs'),\n candidate_id: z.string().optional().describe('Candidate ID that prompted this skill creation'),\n rationale: z.string().optional().describe('Why this skill was created or updated'),\n },\n async (args) => {\n // Validate skill content before writing — reject malformed skills\n const validationErrors = validateSkillContent(args.content, args.name);\n if (validationErrors.length > 0) {\n recordTurn('vault_write_skill', args);\n return textResult({\n error: 'Skill validation failed. Fix these issues and try again.',\n issues: validationErrors,\n });\n }\n\n // Path traversal guard — reject names containing path separators or dot-dot sequences\n if (!args.name || /[/\\\\]|\\.\\./.test(args.name)) {\n recordTurn('vault_write_skill', args);\n return textResult({\n error: 'Invalid skill name: must be a simple directory name without path separators or \"..\"',\n });\n }\n\n const root = projectRoot ?? process.cwd();\n const skillDir = resolve(root, '.agents', 'skills', args.name);\n const skillPath = resolve(skillDir, 'SKILL.md');\n\n // Write file to disk — must succeed before any DB operations\n try {\n mkdirSync(skillDir, { recursive: true });\n writeFileSync(skillPath, args.content, 'utf-8');\n } catch (err) {\n return textResult({ error: `Failed to write skill file: ${err instanceof Error ? err.message : String(err)}` });\n }\n\n // Create agent-specific symlinks so each symbiont discovers the skill.\n // Uses the shared syncSkillSymlinks which reads manifest skillsTarget paths.\n try {\n const { syncSkillSymlinks } = await import('@myco/symbionts/installer.js');\n syncSkillSymlinks(root, args.name);\n } catch (err) {\n // Best-effort — skill file is written, symlinks are convenience\n console.warn('[vault_write_skill] syncSkillSymlinks failed:', err instanceof Error ? err.message : err);\n }\n\n const now = epochSeconds();\n const relativePath = `.agents/skills/${args.name}/SKILL.md`;\n\n // Check for existing record\n const existing = getSkillRecordByName(args.name);\n\n let recordId = '';\n let generation = 0;\n\n // All DB mutations wrapped in a transaction for atomicity.\n // File write (above) is the source of truth; DB is derived.\n const txDb = getDatabase();\n txDb.transaction(() => {\n if (existing) {\n // Update existing record — bump generation\n generation = existing.generation + 1;\n recordId = existing.id;\n updateSkillRecord(existing.id, {\n display_name: args.display_name,\n description: args.description,\n generation,\n ...(args.source_ids !== undefined ? { source_ids: args.source_ids } : {}),\n path: relativePath,\n updated_at: now,\n });\n\n // Record lineage\n insertLineage({\n id: crypto.randomUUID(),\n skill_id: existing.id,\n generation,\n action: 'updated',\n rationale: args.rationale ?? 'Skill content updated',\n source_ids_added: args.source_ids,\n content_snapshot: args.content,\n created_at: now,\n });\n } else {\n // Create new record\n recordId = crypto.randomUUID();\n generation = 1;\n insertSkillRecord({\n id: recordId,\n agent_id: agentId,\n machine_id: machineId,\n name: args.name,\n display_name: args.display_name,\n description: args.description,\n candidate_id: args.candidate_id ?? null,\n source_ids: args.source_ids,\n path: relativePath,\n created_at: now,\n updated_at: now,\n });\n\n // Record lineage\n insertLineage({\n id: crypto.randomUUID(),\n skill_id: recordId,\n generation,\n action: 'created',\n rationale: args.rationale ?? 'Initial skill creation',\n source_ids_added: args.source_ids,\n content_snapshot: args.content,\n created_at: now,\n });\n\n // Auto-link candidate: find the approved candidate this skill was generated from.\n // Strategy: exact candidate_id → prefix match.\n // Does NOT depend on the agent passing the correct ID.\n const approvedCandidates = listCandidates({ status: 'approved', limit: 10 });\n let linkedCandidate = false;\n\n // 1. Try exact candidate_id if provided\n if (args.candidate_id && !linkedCandidate) {\n const exact = updateCandidate(args.candidate_id, {\n status: 'generated', skill_id: recordId, updated_at: now,\n });\n if (exact) linkedCandidate = true;\n }\n\n // 2. Try prefix match on candidate_id (agent truncates UUIDs)\n if (args.candidate_id && !linkedCandidate) {\n const prefixMatch = approvedCandidates.find((c) => c.id.startsWith(args.candidate_id!));\n if (prefixMatch) {\n updateCandidate(prefixMatch.id, {\n status: 'generated', skill_id: recordId, updated_at: now,\n });\n linkedCandidate = true;\n }\n }\n\n // No blind fallback — if neither exact nor prefix match found the candidate,\n // skip linking. The candidate stays 'approved' for the next generate cycle.\n // The daemon injection (Layer 2) ensures candidate_id is always provided in\n // scheduled runs, making this fallback-skip path rare.\n }\n })();\n\n const isNew = generation === 1;\n notify(vaultDir, {\n domain: 'skills',\n type: isNew ? 'skill.created' : 'skill.evolved',\n title: isNew ? `Skill created: ${args.display_name}` : `Skill evolved: ${args.display_name}`,\n message: args.description.slice(0, 120),\n link: `/skills?skill=${encodeURIComponent(args.name)}`,\n metadata: { skillId: recordId, name: args.name, generation },\n });\n\n recordTurn('vault_write_skill', args);\n return textResult({\n id: recordId,\n name: args.name,\n path: relativePath,\n generation,\n });\n },\n );\n\n // -------------------------------------------------------------------------\n // Assemble and return\n // -------------------------------------------------------------------------\n\n return [\n vaultUnprocessed,\n vaultSpores,\n vaultSessions,\n vaultSearchFts,\n vaultSearchSemantic,\n vaultState,\n vaultEntities,\n vaultEdges,\n vaultCreateSpore,\n vaultCreateEntity,\n vaultCreateEdge,\n vaultResolveSpore,\n vaultUpdateSession,\n vaultSetState,\n vaultReadDigest,\n vaultWriteDigest,\n vaultMarkProcessed,\n vaultReport,\n vaultSkillCandidates,\n vaultSkillRecords,\n vaultWriteSkill,\n ];\n}\n\n// ---------------------------------------------------------------------------\n// MCP server factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a vault MCP tool server with 21 tools for the agent.\n *\n * Wraps `createVaultTools()` with `createSdkMcpServer()` from the\n * Claude Agent SDK.\n *\n * @param agentId — the agent identity, injected into all write operations.\n * @param runId — the current agent run ID, injected into reports and turns.\n * @returns an MCP server config with instance, suitable for the SDK.\n */\nexport function createVaultToolServer(agentId: string, runId: string, options?: Pick<VaultToolOptions, 'embeddingManager' | 'vaultDir'>) {\n const tools = createVaultTools(agentId, runId, options);\n\n return createSdkMcpServer({\n name: 'myco-vault',\n version: getPluginVersion(),\n tools,\n });\n}\n\n/**\n * Create a vault MCP tool server scoped to a subset of tools.\n *\n * Used by the phased executor to restrict each phase to only the tools\n * it needs. Tools not in `toolNames` are excluded from the server.\n *\n * @param agentId — the agent identity, injected into all write operations.\n * @param runId — the current agent run ID, injected into reports and turns.\n * @param toolNames — tool names to include (e.g., ['vault_unprocessed', 'vault_create_spore']).\n * @returns an MCP server config with only the specified tools.\n */\nexport function createScopedVaultToolServer(\n agentId: string,\n runId: string,\n toolNames: string[],\n options?: Pick<VaultToolOptions, 'turnOffset' | 'embeddingManager' | 'projectRoot' | 'vaultDir'>,\n) {\n const allTools = createVaultTools(agentId, runId, options);\n const nameSet = new Set(toolNames);\n const scopedTools = allTools.filter((t) => nameSet.has(t.name));\n\n return createSdkMcpServer({\n name: 'myco-vault',\n version: getPluginVersion(),\n tools: scopedTools,\n });\n}\n","/**\n * Agent state key-value query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Row shape returned from agent_state queries. */\nexport interface AgentStateRow {\n agent_id: string;\n key: string;\n value: string;\n updated_at: number;\n}\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst STATE_COLUMNS = [\n 'agent_id',\n 'key',\n 'value',\n 'updated_at',\n] as const;\n\nconst SELECT_COLUMNS = STATE_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed AgentStateRow. */\nfunction toAgentStateRow(row: Record<string, unknown>): AgentStateRow {\n return {\n agent_id: row.agent_id as string,\n key: row.key as string,\n value: row.value as string,\n updated_at: row.updated_at as number,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Get a single state value for an agent by key.\n *\n * @returns the state row, or null if not found.\n */\nexport function getState(\n agentId: string,\n key: string,\n): AgentStateRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM agent_state WHERE agent_id = ? AND key = ?`,\n ).get(agentId, key) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toAgentStateRow(row);\n}\n\n/**\n * Set a state value for an agent. Inserts or updates on conflict.\n *\n * The composite primary key (agent_id, key) ensures each agent\n * has at most one value per key. On conflict, the value and updated_at\n * are overwritten.\n */\nexport function setState(\n agentId: string,\n key: string,\n value: string,\n updatedAt: number,\n): AgentStateRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO agent_state (agent_id, key, value, updated_at)\n VALUES (?, ?, ?, ?)\n ON CONFLICT (agent_id, key) DO UPDATE SET\n value = EXCLUDED.value,\n updated_at = EXCLUDED.updated_at`,\n ).run(agentId, key, value, updatedAt);\n\n return toAgentStateRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM agent_state WHERE agent_id = ? AND key = ?`).get(agentId, key) as Record<string, unknown>,\n );\n}\n\n/**\n * Get all state key-value pairs for an agent, ordered by key ASC.\n */\nexport function getStatesForAgent(\n agentId: string,\n): AgentStateRow[] {\n const db = getDatabase();\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM agent_state\n WHERE agent_id = ?\n ORDER BY key ASC`,\n ).all(agentId) as Record<string, unknown>[];\n\n return rows.map(toAgentStateRow);\n}\n","/**\n * Vault context builder for agent task prompt injection.\n *\n * Queries SQLite for aggregate vault metrics and agent state,\n * then formats them as a markdown block suitable for inclusion\n * in the agent's task prompt.\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { getStatesForAgent } from '@myco/db/queries/agent-state.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default value for unset state entries. */\nconst STATE_UNSET = '(unset)';\n\n/** Key used by the agent to store its last processed batch ID. */\nconst STATE_KEY_LAST_PROCESSED_BATCH = 'last_processed_batch_id';\n\n/** Status value for active spores. */\nconst SPORE_STATUS_ACTIVE = 'active';\n\n// ---------------------------------------------------------------------------\n// Count helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Count rows in a table with optional WHERE clause.\n *\n * The table name is validated by the caller (always a literal from this module).\n * Parameterized `conditions` protect against SQL injection for dynamic values.\n */\nfunction countRows(\n table: string,\n conditions: Array<{ clause: string; value: unknown }> = [],\n): number {\n const db = getDatabase();\n\n const whereParts: string[] = [];\n const params: unknown[] = [];\n\n for (const { clause, value } of conditions) {\n whereParts.push(clause);\n params.push(value);\n }\n\n const whereClause = whereParts.length > 0 ? `WHERE ${whereParts.join(' AND ')}` : '';\n\n const row = db.prepare(\n `SELECT count(*) AS count FROM ${table} ${whereClause}`,\n ).get(...params) as { count: number };\n\n return Number(row.count);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Build a markdown context block describing the current vault state\n * for a specific agent.\n *\n * Includes:\n * - Agent state key-value pairs (cursor position, preferences)\n * - Aggregate counts (sessions, spores, entities, edges, unprocessed batches)\n * - Last digest timestamp (if any)\n *\n * @param agentId — the agent to build context for.\n * @returns a markdown-formatted string.\n */\nexport function buildVaultContext(agentId: string): string {\n // All queries are synchronous\n const states = getStatesForAgent(agentId);\n const totalSessions = countRows('sessions');\n const totalActiveSpores = countRows('spores', [{ clause: 'status = ?', value: SPORE_STATUS_ACTIVE }]);\n const totalEntities = countRows('entities');\n const totalEdges = countRows('graph_edges');\n const unprocessedBatches = countRows('prompt_batches', [{ clause: 'processed = ?', value: 0 }]);\n const lastDigestAt = getLastDigestTimestamp(agentId);\n\n const stateMap = new Map(states.map((s) => [s.key, s.value]));\n\n const lastProcessedBatchId = stateMap.get(STATE_KEY_LAST_PROCESSED_BATCH) ?? STATE_UNSET;\n\n const lines = [\n '## Current Vault State',\n `agent_id: ${agentId}`,\n `last_processed_batch_id: ${lastProcessedBatchId}`,\n `unprocessed_batches: ${unprocessedBatches}`,\n `total_sessions: ${totalSessions}`,\n `total_active_spores: ${totalActiveSpores}`,\n `total_entities: ${totalEntities}`,\n `total_edges: ${totalEdges}`,\n `last_digest_at: ${lastDigestAt}`,\n ];\n\n return lines.join('\\n');\n}\n\n/**\n * Get the most recent digest generation timestamp for an agent.\n *\n * @returns epoch seconds of the last digest, or 0 if no digests exist.\n */\nfunction getLastDigestTimestamp(agentId: string): number {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT MAX(generated_at) AS max_at\n FROM digest_extracts\n WHERE agent_id = ?`,\n ).get(agentId) as { max_at: number | null } | undefined;\n\n return row?.max_at ?? 0;\n}\n","/**\n * Orchestrator planning call.\n *\n * Composes the orchestrator prompt, parses the LLM response into a structured\n * plan, and applies phase directives to PhaseDefinition objects.\n *\n * This module is pure logic — no SDK calls. SDK invocation happens in the\n * executor integration (Task 5).\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { findPackageRoot } from '@myco/utils/find-package-root.js';\nimport { extractJson } from '@myco/intelligence/response.js';\nimport type { PhaseDefinition, OrchestratorPlan, OrchestratorPhaseDirective } from './types.js';\nimport type { ContextQueryResult } from './context-queries.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default max turns for the orchestrator's own LLM call. */\nexport const DEFAULT_ORCHESTRATOR_MAX_TURNS = 3;\n\n/** Filename of the orchestrator prompt template. */\nconst ORCHESTRATOR_PROMPT_FILE = 'orchestrator.md';\n\n/** Number of characters to show from a phase's prompt as a preview. */\nconst PHASE_PROMPT_PREVIEW_CHARS = 100;\n\n/** Section header injected into a phase prompt when contextNotes are present. */\nconst ORCHESTRATOR_GUIDANCE_HEADER = '## Orchestrator Guidance';\n\n/** Placeholder substituted when no context query results are available. */\nconst NO_CONTEXT_QUERIES_TEXT = 'No context queries configured.';\n\n/** Fallback reasoning string used when JSON parsing fails. */\nconst FALLBACK_REASONING_PARSE_ERROR = 'Orchestrator response could not be parsed — running all phases with defaults.';\n\n/** Fallback reasoning string used when the parsed plan has no phases array. */\nconst FALLBACK_REASONING_MISSING_PHASES = 'Orchestrator plan missing phases array — running all phases with defaults.';\n\n// ---------------------------------------------------------------------------\n// Template placeholder names\n// ---------------------------------------------------------------------------\n\nconst PLACEHOLDER_VAULT_STATE = '{{vault_state}}';\nconst PLACEHOLDER_PHASE_DEFINITIONS = '{{phase_definitions}}';\nconst PLACEHOLDER_CONTEXT_RESULTS = '{{context_results}}';\n\n// ---------------------------------------------------------------------------\n// Prompt template loading\n// ---------------------------------------------------------------------------\n\n/**\n * Load the orchestrator prompt template from disk.\n *\n * Resolves the path relative to this file so it works in both dev and built\n * (tsup) environments. The `prompts/` directory is a sibling of this file.\n */\n/** Cached prompt template — loaded once, reused across calls. */\nlet cachedPromptTemplate: string | undefined;\n\nfunction loadPromptTemplate(): string {\n if (!cachedPromptTemplate) {\n const scriptDir = path.dirname(fileURLToPath(import.meta.url));\n\n // Check sibling prompts/ directory first (tsc output or dev mode)\n const adjacentPath = path.join(scriptDir, 'prompts', ORCHESTRATOR_PROMPT_FILE);\n if (fs.existsSync(adjacentPath)) {\n cachedPromptTemplate = fs.readFileSync(adjacentPath, 'utf-8');\n return cachedPromptTemplate;\n }\n\n // tsup bundles into dist/chunk-XXXX.js — walk up to package root\n const root = findPackageRoot(scriptDir);\n if (root) {\n const distPath = path.join(root, 'dist', 'src', 'agent', 'prompts', ORCHESTRATOR_PROMPT_FILE);\n if (fs.existsSync(distPath)) {\n cachedPromptTemplate = fs.readFileSync(distPath, 'utf-8');\n return cachedPromptTemplate;\n }\n const srcPath = path.join(root, 'src', 'agent', 'prompts', ORCHESTRATOR_PROMPT_FILE);\n cachedPromptTemplate = fs.readFileSync(srcPath, 'utf-8');\n return cachedPromptTemplate;\n }\n\n // Final fallback\n cachedPromptTemplate = fs.readFileSync(adjacentPath, 'utf-8');\n }\n return cachedPromptTemplate;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compose the orchestrator prompt by substituting runtime data into the\n * template.\n *\n * @param vaultState - Free-form summary of current vault state.\n * @param phases - Phase definitions available for this task.\n * @param contextResults - Results from pre-execution context queries.\n * @returns The fully composed prompt string.\n */\nexport function composeOrchestratorPrompt(\n vaultState: string,\n phases: PhaseDefinition[],\n contextResults: ContextQueryResult[],\n): string {\n const template = loadPromptTemplate();\n\n const phaseList = formatPhaseList(phases);\n const contextSection = formatContextResults(contextResults);\n\n return template\n .replace(PLACEHOLDER_VAULT_STATE, vaultState)\n .replace(PLACEHOLDER_PHASE_DEFINITIONS, phaseList)\n .replace(PLACEHOLDER_CONTEXT_RESULTS, contextSection);\n}\n\n/**\n * Parse the orchestrator's LLM response into a structured plan.\n *\n * Accepts JSON that is either raw or wrapped in a ```json code block.\n * Validates that the parsed value has a `phases` array.\n *\n * On any failure — malformed JSON, missing array, empty input — returns a\n * safe fallback plan that runs all phases with no modifications.\n *\n * Never throws.\n *\n * @param response - Raw LLM response text.\n * @param phases - Phase definitions; used to construct the fallback plan.\n * @returns A valid OrchestratorPlan.\n */\nexport function parseOrchestratorPlan(\n response: string,\n phases: PhaseDefinition[],\n): OrchestratorPlan {\n const trimmed = response.trim();\n\n if (!trimmed) {\n return buildRunAllPlan(phases, FALLBACK_REASONING_PARSE_ERROR);\n }\n\n try {\n const parsed = extractJson(trimmed);\n\n if (!isOrchestratorPlanShape(parsed)) {\n return buildRunAllPlan(phases, FALLBACK_REASONING_MISSING_PHASES);\n }\n\n return parsed;\n } catch {\n return buildRunAllPlan(phases, FALLBACK_REASONING_PARSE_ERROR);\n }\n}\n\n/**\n * Apply orchestrator directives to a set of phase definitions.\n *\n * For each phase:\n * - If the directive says `skip: true` and the phase is not required, it is\n * excluded from the result.\n * - If the directive says `skip: true` but the phase IS required, it is kept\n * and a warning is logged.\n * - If the directive provides `maxTurns`, the phase's turn limit is overridden.\n * - If the directive provides `contextNotes`, they are appended to the phase\n * prompt under `## Orchestrator Guidance`.\n *\n * Phase order is preserved. Phases with no matching directive pass through\n * unchanged.\n *\n * @param phases - Original phase definitions.\n * @param directives - Directives from the orchestrator's plan.\n * @returns Modified phase definitions.\n */\nexport function applyDirectives(\n phases: PhaseDefinition[],\n directives: OrchestratorPhaseDirective[],\n): PhaseDefinition[] {\n const directiveMap = new Map<string, OrchestratorPhaseDirective>(\n directives.map((d) => [d.name, d]),\n );\n\n const result: PhaseDefinition[] = [];\n\n for (const phase of phases) {\n const directive = directiveMap.get(phase.name);\n\n if (!directive) {\n result.push(phase);\n continue;\n }\n\n if (directive.skip) {\n if (phase.required) {\n console.warn(\n `[orchestrator] Cannot skip required phase \"${phase.name}\" — keeping it. Reason: ${directive.skipReason ?? 'none given'}`,\n );\n result.push(applyNonSkipDirective(phase, directive));\n }\n // Non-required phases with skip: true are simply excluded.\n continue;\n }\n\n result.push(applyNonSkipDirective(phase, directive));\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Apply non-skip directive fields (maxTurns, contextNotes) to a phase.\n */\nfunction applyNonSkipDirective(\n phase: PhaseDefinition,\n directive: OrchestratorPhaseDirective,\n): PhaseDefinition {\n let updated = { ...phase };\n\n if (directive.maxTurns !== undefined) {\n updated = { ...updated, maxTurns: directive.maxTurns };\n }\n\n if (directive.contextNotes) {\n updated = {\n ...updated,\n prompt: `${updated.prompt}\\n\\n${ORCHESTRATOR_GUIDANCE_HEADER}\\n\\n${directive.contextNotes}`,\n };\n }\n\n return updated;\n}\n\n/**\n * Format phases as a bulleted list for the prompt template.\n */\nfunction formatPhaseList(phases: PhaseDefinition[]): string {\n if (phases.length === 0) {\n return '(no phases defined)';\n }\n\n return phases\n .map((p) => {\n const preview = p.prompt.slice(0, PHASE_PROMPT_PREVIEW_CHARS);\n const ellipsis = p.prompt.length > PHASE_PROMPT_PREVIEW_CHARS ? '...' : '';\n return `- **${p.name}** (maxTurns: ${p.maxTurns}, required: ${p.required}): ${preview}${ellipsis}`;\n })\n .join('\\n');\n}\n\n/**\n * Format context query results as sections for the prompt template.\n */\nfunction formatContextResults(results: ContextQueryResult[]): string {\n if (results.length === 0) {\n return NO_CONTEXT_QUERIES_TEXT;\n }\n\n return results\n .map((r) => {\n const dataSection = r.error\n ? `Error: ${r.error}`\n : JSON.stringify(r.data, null, 2);\n return `### ${r.tool}\\nPurpose: ${r.purpose}\\n\\n${dataSection}`;\n })\n .join('\\n\\n');\n}\n\n/**\n * Type guard: check that a parsed value has the OrchestratorPlan shape.\n */\nfunction isOrchestratorPlanShape(value: unknown): value is OrchestratorPlan {\n if (typeof value !== 'object' || value === null) return false;\n const obj = value as Record<string, unknown>;\n return Array.isArray(obj['phases']);\n}\n\n/**\n * Build a fallback \"run everything\" plan from the available phases.\n */\nfunction buildRunAllPlan(phases: PhaseDefinition[], reasoning: string): OrchestratorPlan {\n return {\n phases: phases.map((p) => ({ name: p.name, skip: false })),\n reasoning,\n };\n}\n","/**\n * Clean LLM response text before parsing.\n *\n * Reasoning models (DeepSeek, Qwen, GLM, etc.) embed chain-of-thought\n * in the response using special tags. These must be stripped before\n * JSON parsing or value extraction.\n */\n\n// Patterns for reasoning model chain-of-thought tokens.\n// Order matters: most specific patterns first.\nconst REASONING_PATTERNS = [\n // <think>...</think>answer (DeepSeek, Qwen, GLM, many others)\n /<think>[\\s\\S]*?<\\/think>\\s*/gi,\n // Implicit opening: reasoning...</think>answer (GLM-4.7 observed)\n /^[\\s\\S]*?<\\/think>\\s*/i,\n // <reasoning>...</reasoning>answer\n /<reasoning>[\\s\\S]*?<\\/reasoning>\\s*/gi,\n // <|thinking|>...<|/thinking|>answer\n /<\\|thinking\\|>[\\s\\S]*?<\\|\\/thinking\\|>\\s*/gi,\n // Plain-text \"Thinking Process:\" block followed by actual content\n // (Qwen 3.5 via LM Studio without native thinking mode)\n // Matches from \"Thinking Process:\" up to the last numbered step, then the synthesis follows\n /^Thinking Process:[\\s\\S]*?(?=\\n(?:## |# |\\*\\*[A-Z]))/i,\n];\n\n/**\n * Strip reasoning/chain-of-thought tokens from LLM response text.\n * Returns the final answer without the thinking process.\n */\nexport function stripReasoningTokens(text: string): string {\n if (!text) return text;\n\n for (const pattern of REASONING_PATTERNS) {\n const stripped = text.replace(pattern, '').trim();\n if (stripped && stripped !== text.trim()) {\n return stripped;\n }\n }\n\n return text;\n}\n\n/**\n * Extract JSON from an LLM response that may contain markdown fences,\n * reasoning tokens, or other wrapper text.\n *\n * Tries in order:\n * 1. Strip reasoning tokens\n * 2. Extract from ```json ... ``` code fences\n * 3. Find bare {...} JSON object\n * 4. Parse the cleaned text directly\n */\nexport function extractJson(text: string): unknown {\n const cleaned = stripReasoningTokens(text);\n\n // Try code fence extraction\n const fenceMatch = cleaned.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n if (fenceMatch) {\n return JSON.parse(fenceMatch[1].trim());\n }\n\n // Try bare JSON object\n const objectMatch = cleaned.match(/\\{[\\s\\S]*\\}/);\n if (objectMatch) {\n return JSON.parse(objectMatch[0]);\n }\n\n // Try direct parse\n return JSON.parse(cleaned);\n}\n\n/**\n * Extract a numeric value from an LLM response that may contain\n * reasoning tokens or extra text around the number.\n */\nexport function extractNumber(text: string): number {\n const cleaned = stripReasoningTokens(text).trim();\n const match = cleaned.match(/(\\d+\\.?\\d*)/);\n if (match) return parseFloat(match[1]);\n return parseFloat(cleaned);\n}\n","/**\n * Context query execution for pre-phase vault lookups.\n *\n * Executes lightweight vault queries before the orchestrator makes planning\n * decisions. Uses the same DB query functions as the vault tools but bypasses\n * the MCP layer entirely.\n */\n\nimport type { ContextQuery } from './types.js';\nimport { errorMessage as toErrorMessage } from '@myco/utils/error-message.js';\nimport { getUnprocessedBatches } from '@myco/db/queries/batches.js';\nimport { listSpores } from '@myco/db/queries/spores.js';\nimport { listSessions } from '@myco/db/queries/sessions.js';\nimport { getStatesForAgent } from '@myco/db/queries/agent-state.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default limit for context query results when none specified. */\nconst DEFAULT_CONTEXT_QUERY_LIMIT = 10;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Result of a single context query execution. */\nexport interface ContextQueryResult {\n tool: string;\n purpose: string;\n data: unknown;\n error?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Execute a list of context queries against the vault database.\n *\n * Each query is routed to the appropriate DB function based on `query.tool`.\n * On failure:\n * - Required queries throw — the caller should abort.\n * - Optional queries return a result with `error` set and `data: null`.\n *\n * Unknown tool names always throw, regardless of `required`.\n *\n * @param agentId - The agent ID to scope agent-specific queries.\n * @param queries - The list of context queries to execute.\n * @returns Resolved results in the same order as the input queries.\n */\nexport async function executeContextQueries(\n agentId: string,\n queries: ContextQuery[],\n): Promise<ContextQueryResult[]> {\n // Validate all tool names upfront — unknown tools are a programming error.\n for (const query of queries) {\n validateTool(query.tool);\n }\n\n // Execute all queries in parallel — they hit independent DB tables.\n const settled = await Promise.allSettled(\n queries.map(async (query) => {\n const limit = query.limit ?? DEFAULT_CONTEXT_QUERY_LIMIT;\n const data = await executeQuery(agentId, query.tool, limit);\n return { tool: query.tool, purpose: query.purpose, data } satisfies ContextQueryResult;\n }),\n );\n\n // Map settled results, throwing for required failures.\n const results: ContextQueryResult[] = [];\n for (let i = 0; i < settled.length; i++) {\n const outcome = settled[i];\n const query = queries[i];\n\n if (outcome.status === 'fulfilled') {\n results.push(outcome.value);\n } else {\n const message = toErrorMessage(outcome.reason);\n\n if (query.required) {\n throw new Error(\n `Required context query \"${query.tool}\" failed: ${message}`,\n );\n }\n\n results.push({\n tool: query.tool,\n purpose: query.purpose,\n data: null,\n error: message,\n });\n }\n }\n\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\n/** Set of recognized context query tool names. */\nconst KNOWN_CONTEXT_QUERY_TOOLS = new Set([\n 'vault_unprocessed',\n 'vault_spores',\n 'vault_sessions',\n 'vault_state',\n]);\n\n/**\n * Guard against unknown tool names.\n *\n * Unknown tools are a programming error (misconfigured task YAML), so they\n * always throw — even if the query is not marked required.\n */\nfunction validateTool(tool: string): void {\n if (!KNOWN_CONTEXT_QUERY_TOOLS.has(tool)) {\n throw new Error(`Unknown context query tool: \"${tool}\"`);\n }\n}\n\n/**\n * Route a single query to the appropriate DB function.\n */\nasync function executeQuery(\n agentId: string,\n tool: string,\n limit: number,\n): Promise<unknown> {\n switch (tool) {\n case 'vault_unprocessed':\n return getUnprocessedBatches({ limit });\n\n case 'vault_spores':\n return listSpores({ agent_id: agentId, limit });\n\n case 'vault_sessions':\n return listSessions({ limit });\n\n case 'vault_state':\n return getStatesForAgent(agentId);\n\n default:\n throw new Error(`Unknown context query tool: \"${tool}\"`);\n }\n}\n","import type { ProviderConfig } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Named constants — env var names and default values\n// ---------------------------------------------------------------------------\n\nconst ENV_ANTHROPIC_BASE_URL = 'ANTHROPIC_BASE_URL';\nconst ENV_ANTHROPIC_AUTH_TOKEN = 'ANTHROPIC_AUTH_TOKEN';\nconst ENV_ANTHROPIC_API_KEY = 'ANTHROPIC_API_KEY';\nconst ENV_OLLAMA_NUM_CTX = 'OLLAMA_NUM_CTX';\nconst DEFAULT_OLLAMA_URL = 'http://localhost:11434';\nconst DEFAULT_LMSTUDIO_URL = 'http://localhost:1234';\nconst OLLAMA_AUTH_TOKEN = 'ollama';\nconst LMSTUDIO_AUTH_TOKEN = 'lmstudio';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Build an env object for a phase's query() call.\n *\n * Returns `undefined` when no provider override is needed (SDK defaults to\n * `process.env`). Only creates a new object when overrides are required,\n * avoiding unnecessary copies of the full process.env.\n */\nexport function buildPhaseEnv(provider?: ProviderConfig): Record<string, string | undefined> | undefined {\n if (!provider || provider.type === 'cloud') return undefined;\n return { ...process.env, ...getProviderEnvVars(provider) };\n}\n\n/**\n * Get env vars for a provider config.\n */\nexport function getProviderEnvVars(provider: ProviderConfig): Record<string, string> {\n switch (provider.type) {\n case 'cloud':\n return {};\n case 'ollama':\n return {\n [ENV_ANTHROPIC_BASE_URL]: provider.baseUrl ?? DEFAULT_OLLAMA_URL,\n [ENV_ANTHROPIC_AUTH_TOKEN]: OLLAMA_AUTH_TOKEN,\n [ENV_ANTHROPIC_API_KEY]: '',\n ...(provider.contextLength ? { [ENV_OLLAMA_NUM_CTX]: String(provider.contextLength) } : {}),\n };\n case 'lmstudio':\n return {\n [ENV_ANTHROPIC_BASE_URL]: provider.baseUrl ?? DEFAULT_LMSTUDIO_URL,\n [ENV_ANTHROPIC_AUTH_TOKEN]: provider.apiKey ?? LMSTUDIO_AUTH_TOKEN,\n [ENV_ANTHROPIC_API_KEY]: '',\n };\n default:\n return {};\n }\n}\n"],"mappings":"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","names":["crypto","resolve","tool","writeFileSync","crypto","resolve","errorMessage"]}
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  VAULT_GITIGNORE,
7
7
  registerSymbionts
8
- } from "./chunk-EASRP2I3.js";
8
+ } from "./chunk-HSMD2COQ.js";
9
9
  import {
10
10
  parseStringFlag
11
11
  } from "./chunk-SAKJMNSR.js";
@@ -24,8 +24,8 @@ import {
24
24
  initDatabase,
25
25
  vaultDbPath
26
26
  } from "./chunk-MYX5NCRH.js";
27
- import "./chunk-IUJLMJKN.js";
28
- import "./chunk-5JZWS63K.js";
27
+ import "./chunk-QMGQSA5A.js";
28
+ import "./chunk-PGYJSXSK.js";
29
29
  import {
30
30
  detectSymbionts,
31
31
  loadManifests,
@@ -52,7 +52,7 @@ async function run(args) {
52
52
  const nonInteractive = args.includes("--non-interactive");
53
53
  const isInteractive = !nonInteractive && !!process.stdin.isTTY;
54
54
  if (isInteractive) {
55
- const { printBanner } = await import("./init-wizard-EQZ7YTRT.js");
55
+ const { printBanner } = await import("./init-wizard-YUT7MIYZ.js");
56
56
  printBanner();
57
57
  }
58
58
  const vaultDir = vaultPath ? vaultPath.startsWith("~/") ? path.join(os.homedir(), vaultPath.slice(2)) : path.resolve(vaultPath) : path.join(resolveVaultDir());
@@ -82,7 +82,7 @@ async function run(args) {
82
82
  }
83
83
  }
84
84
  if (shouldRunWizard) {
85
- const { runWizard, buildEmbeddingConfig, buildAgentConfig } = await import("./init-wizard-EQZ7YTRT.js");
85
+ const { runWizard, buildEmbeddingConfig, buildAgentConfig } = await import("./init-wizard-YUT7MIYZ.js");
86
86
  const answers = await runWizard();
87
87
  wizardAnswers = answers;
88
88
  if (answers.embeddingProvider !== "skip") {
@@ -163,7 +163,7 @@ async function run(args) {
163
163
  registerSymbionts(selectedManifests, projectRoot, pkgRoot, "Registered");
164
164
  }
165
165
  }
166
- const { DaemonClient } = await import("./client-CA4TAT5Q.js");
166
+ const { DaemonClient } = await import("./client-ZXC6IY63.js");
167
167
  const client = new DaemonClient(vaultDir);
168
168
  const daemonHealthy = await client.ensureRunning();
169
169
  let daemonUrl = "";
@@ -193,4 +193,4 @@ async function run(args) {
193
193
  export {
194
194
  run
195
195
  };
196
- //# sourceMappingURL=init-7PCZOANM.js.map
196
+ //# sourceMappingURL=init-KWCGGLP3.js.map
@@ -12,7 +12,7 @@ import {
12
12
  import "./chunk-5YQ6VOFZ.js";
13
13
  import {
14
14
  getPluginVersion
15
- } from "./chunk-5JZWS63K.js";
15
+ } from "./chunk-PGYJSXSK.js";
16
16
  import "./chunk-LPUQPDC2.js";
17
17
  import {
18
18
  DEFAULT_OLLAMA_EMBEDDING_MODEL,
@@ -291,4 +291,4 @@ export {
291
291
  printBanner,
292
292
  runWizard
293
293
  };
294
- //# sourceMappingURL=init-wizard-EQZ7YTRT.js.map
294
+ //# sourceMappingURL=init-wizard-YUT7MIYZ.js.map
@@ -65,7 +65,7 @@ import {
65
65
  getEmbeddingQueueDepth,
66
66
  getUnembedded,
67
67
  markEmbedded
68
- } from "./chunk-CD5SYW45.js";
68
+ } from "./chunk-XRVLSSJY.js";
69
69
  import {
70
70
  getMachineId
71
71
  } from "./chunk-ENWBFX7F.js";
@@ -93,7 +93,7 @@ import {
93
93
  readSecrets,
94
94
  writeSecret
95
95
  } from "./chunk-RJMXDUMA.js";
96
- import "./chunk-EASRP2I3.js";
96
+ import "./chunk-HSMD2COQ.js";
97
97
  import "./chunk-SAKJMNSR.js";
98
98
  import {
99
99
  checkLocalProvider
@@ -164,10 +164,10 @@ import {
164
164
  } from "./chunk-MYX5NCRH.js";
165
165
  import {
166
166
  resolveCliEntryPath
167
- } from "./chunk-IUJLMJKN.js";
167
+ } from "./chunk-QMGQSA5A.js";
168
168
  import {
169
169
  getPluginVersion
170
- } from "./chunk-5JZWS63K.js";
170
+ } from "./chunk-PGYJSXSK.js";
171
171
  import {
172
172
  loadManifests
173
173
  } from "./chunk-QFMBZ72S.js";
@@ -5241,7 +5241,7 @@ async function main() {
5241
5241
  async function triggerTitleSummary(sessionId) {
5242
5242
  if (config.agent.summary_batch_interval <= 0) return;
5243
5243
  try {
5244
- const { runAgent } = await import("./executor-SK3XFJQ7.js");
5244
+ const { runAgent } = await import("./executor-YX2MA4T3.js");
5245
5245
  runAgent(vaultDir, {
5246
5246
  task: "title-summary",
5247
5247
  instruction: `Process session ${sessionId} only`,
@@ -6001,7 +6001,7 @@ async function main() {
6001
6001
  if (task === "skill-generate" && !instruction) {
6002
6002
  instruction = buildSkillGenerateInstruction();
6003
6003
  }
6004
- const { runAgent } = await import("./executor-SK3XFJQ7.js");
6004
+ const { runAgent } = await import("./executor-YX2MA4T3.js");
6005
6005
  const resultPromise = runAgent(vaultDir, { task, instruction, agentId, embeddingManager });
6006
6006
  const effectiveAgentId = agentId ?? "myco-agent";
6007
6007
  const runId = getLatestRunId(effectiveAgentId, task);
@@ -6412,7 +6412,7 @@ async function main() {
6412
6412
  else runningTasks.delete(name);
6413
6413
  },
6414
6414
  runTask: async (taskName) => {
6415
- const { runAgent } = await import("./executor-SK3XFJQ7.js");
6415
+ const { runAgent } = await import("./executor-YX2MA4T3.js");
6416
6416
  const instruction = taskName === "skill-generate" ? buildSkillGenerateInstruction() : void 0;
6417
6417
  const result = await runAgent(vaultDir, { task: taskName, instruction, embeddingManager });
6418
6418
  logger.info(LOG_KINDS.AGENT_RUN, `Scheduled task ${taskName} completed`, {
@@ -6522,4 +6522,4 @@ export {
6522
6522
  handleUserPrompt,
6523
6523
  main
6524
6524
  };
6525
- //# sourceMappingURL=main-RDRKAEEB.js.map
6525
+ //# sourceMappingURL=main-WHGJ6UV7.js.map
@@ -1,13 +1,13 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  connectToDaemon
4
- } from "./chunk-EASRP2I3.js";
4
+ } from "./chunk-HSMD2COQ.js";
5
5
  import "./chunk-SAKJMNSR.js";
6
6
  import "./chunk-TNCBMGWB.js";
7
7
  import "./chunk-HHZ3RTEI.js";
8
8
  import "./chunk-MYX5NCRH.js";
9
- import "./chunk-IUJLMJKN.js";
10
- import "./chunk-5JZWS63K.js";
9
+ import "./chunk-QMGQSA5A.js";
10
+ import "./chunk-PGYJSXSK.js";
11
11
  import "./chunk-LPUQPDC2.js";
12
12
  import "./chunk-TRA3R4EC.js";
13
13
  import "./chunk-S6I62FAH.js";
@@ -36,4 +36,4 @@ async function run(_args, vaultDir) {
36
36
  export {
37
37
  run
38
38
  };
39
- //# sourceMappingURL=open-GE6DB5GH.js.map
39
+ //# sourceMappingURL=open-CBNGDM32.js.map
@@ -1,11 +1,11 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  sendEvent
4
- } from "./chunk-PLMMWIJC.js";
4
+ } from "./chunk-NBPZI5UD.js";
5
5
  import "./chunk-V7XG6V6C.js";
6
6
  import "./chunk-OQVKLTQY.js";
7
- import "./chunk-IUJLMJKN.js";
8
- import "./chunk-5JZWS63K.js";
7
+ import "./chunk-QMGQSA5A.js";
8
+ import "./chunk-PGYJSXSK.js";
9
9
  import "./chunk-QFMBZ72S.js";
10
10
  import "./chunk-LPUQPDC2.js";
11
11
  import "./chunk-TRA3R4EC.js";
@@ -27,4 +27,4 @@ async function main() {
27
27
  export {
28
28
  main
29
29
  };
30
- //# sourceMappingURL=post-compact-YIOMON3E.js.map
30
+ //# sourceMappingURL=post-compact-AANLN7TR.js.map
@@ -8,8 +8,8 @@ import {
8
8
  } from "./chunk-OQVKLTQY.js";
9
9
  import {
10
10
  DaemonClient
11
- } from "./chunk-IUJLMJKN.js";
12
- import "./chunk-5JZWS63K.js";
11
+ } from "./chunk-QMGQSA5A.js";
12
+ import "./chunk-PGYJSXSK.js";
13
13
  import "./chunk-QFMBZ72S.js";
14
14
  import "./chunk-LPUQPDC2.js";
15
15
  import {
@@ -60,4 +60,4 @@ async function main() {
60
60
  export {
61
61
  main
62
62
  };
63
- //# sourceMappingURL=post-tool-use-YRSXGMEC.js.map
63
+ //# sourceMappingURL=post-tool-use-X3IFZEMV.js.map
@@ -1,11 +1,11 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  sendEvent
4
- } from "./chunk-PLMMWIJC.js";
4
+ } from "./chunk-NBPZI5UD.js";
5
5
  import "./chunk-V7XG6V6C.js";
6
6
  import "./chunk-OQVKLTQY.js";
7
- import "./chunk-IUJLMJKN.js";
8
- import "./chunk-5JZWS63K.js";
7
+ import "./chunk-QMGQSA5A.js";
8
+ import "./chunk-PGYJSXSK.js";
9
9
  import "./chunk-QFMBZ72S.js";
10
10
  import "./chunk-LPUQPDC2.js";
11
11
  import "./chunk-TRA3R4EC.js";
@@ -29,4 +29,4 @@ async function main() {
29
29
  export {
30
30
  main
31
31
  };
32
- //# sourceMappingURL=post-tool-use-failure-XNNJ6INZ.js.map
32
+ //# sourceMappingURL=post-tool-use-failure-T6KAFDFF.js.map
@@ -1,11 +1,11 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  sendEvent
4
- } from "./chunk-PLMMWIJC.js";
4
+ } from "./chunk-NBPZI5UD.js";
5
5
  import "./chunk-V7XG6V6C.js";
6
6
  import "./chunk-OQVKLTQY.js";
7
- import "./chunk-IUJLMJKN.js";
8
- import "./chunk-5JZWS63K.js";
7
+ import "./chunk-QMGQSA5A.js";
8
+ import "./chunk-PGYJSXSK.js";
9
9
  import "./chunk-QFMBZ72S.js";
10
10
  import "./chunk-LPUQPDC2.js";
11
11
  import "./chunk-TRA3R4EC.js";
@@ -26,4 +26,4 @@ async function main() {
26
26
  export {
27
27
  main
28
28
  };
29
- //# sourceMappingURL=pre-compact-X7BNZVUO.js.map
29
+ //# sourceMappingURL=pre-compact-FY7BPS4J.js.map