@mastra/code-sdk 1.15.0-alpha.9 → 1.15.1-alpha.0

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 (145) hide show
  1. package/dist/acp/agent.js +2 -1
  2. package/dist/acp/agent.js.map +1 -1
  3. package/dist/acp/event-mapper.js +0 -2
  4. package/dist/acp/event-mapper.js.map +1 -1
  5. package/dist/acp.js +1 -2
  6. package/dist/agent-connections/registry.js.map +1 -1
  7. package/dist/agent-connections/signal-provider.js.map +1 -1
  8. package/dist/agent-connections/state-processor.js.map +1 -1
  9. package/dist/agent-connections/tools.js +26 -24
  10. package/dist/agent-connections/tools.js.map +1 -1
  11. package/dist/agents/background-completion.d.ts +15 -2
  12. package/dist/agents/background-completion.d.ts.map +1 -1
  13. package/dist/agents/background-completion.js +19 -2
  14. package/dist/agents/background-completion.js.map +1 -1
  15. package/dist/agents/instructions.js +3 -2
  16. package/dist/agents/instructions.js.map +1 -1
  17. package/dist/agents/mastracode-gateway.js +35 -27
  18. package/dist/agents/mastracode-gateway.js.map +1 -1
  19. package/dist/agents/memory.d.ts.map +1 -1
  20. package/dist/agents/memory.js +17 -3
  21. package/dist/agents/memory.js.map +1 -1
  22. package/dist/agents/prompts/agent-instructions.js +1 -1
  23. package/dist/agents/prompts/agent-instructions.js.map +1 -1
  24. package/dist/agents/prompts/index.js +3 -2
  25. package/dist/agents/prompts/index.js.map +1 -1
  26. package/dist/agents/prompts/plan.js +2 -1
  27. package/dist/agents/prompts/plan.js.map +1 -1
  28. package/dist/agents/sandbox-filesystem.d.ts +28 -0
  29. package/dist/agents/sandbox-filesystem.d.ts.map +1 -1
  30. package/dist/agents/sandbox-filesystem.js +81 -2
  31. package/dist/agents/sandbox-filesystem.js.map +1 -1
  32. package/dist/agents/tools.d.ts.map +1 -1
  33. package/dist/agents/tools.js +18 -12
  34. package/dist/agents/tools.js.map +1 -1
  35. package/dist/agents/workspace.js +2 -1
  36. package/dist/agents/workspace.js.map +1 -1
  37. package/dist/auth/account-rotation-processor.js +2 -1
  38. package/dist/auth/account-rotation-processor.js.map +1 -1
  39. package/dist/auth/providers/anthropic.js +2 -2
  40. package/dist/auth/providers/anthropic.js.map +1 -1
  41. package/dist/auth/providers/github-copilot.js +1 -1
  42. package/dist/auth/providers/github-copilot.js.map +1 -1
  43. package/dist/auth/providers/openai-codex.js +3 -2
  44. package/dist/auth/providers/openai-codex.js.map +1 -1
  45. package/dist/auth/providers/xai.js +1 -1
  46. package/dist/auth/providers/xai.js.map +1 -1
  47. package/dist/clipboard/index.js +5 -4
  48. package/dist/clipboard/index.js.map +1 -1
  49. package/dist/evals/context-builder.js +1 -3
  50. package/dist/evals/context-builder.js.map +1 -1
  51. package/dist/evals/scorers/outcome.js +2 -1
  52. package/dist/evals/scorers/outcome.js.map +1 -1
  53. package/dist/factory/remote-controller.js.map +1 -1
  54. package/dist/factory/remote-session.d.ts +1 -1
  55. package/dist/factory/remote-session.d.ts.map +1 -1
  56. package/dist/factory/remote-session.js +15 -13
  57. package/dist/factory/remote-session.js.map +1 -1
  58. package/dist/headless/cli.js +2 -1
  59. package/dist/headless/cli.js.map +1 -1
  60. package/dist/headless/run-mc.js +9 -9
  61. package/dist/headless/run-mc.js.map +1 -1
  62. package/dist/hooks/executor.js +3 -1
  63. package/dist/hooks/executor.js.map +1 -1
  64. package/dist/hooks/manager.js +40 -26
  65. package/dist/hooks/manager.js.map +1 -1
  66. package/dist/index.d.ts +2 -2
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +56 -29
  69. package/dist/index.js.map +1 -1
  70. package/dist/knowledge-inspector.js +2 -2
  71. package/dist/knowledge-inspector.js.map +1 -1
  72. package/dist/lsp/server.js +4 -2
  73. package/dist/lsp/server.js.map +1 -1
  74. package/dist/mcp/manager.d.ts.map +1 -1
  75. package/dist/mcp/manager.js +14 -2
  76. package/dist/mcp/manager.js.map +1 -1
  77. package/dist/onboarding/settings.js +5 -2
  78. package/dist/onboarding/settings.js.map +1 -1
  79. package/dist/platform/index.js +5 -3
  80. package/dist/platform/index.js.map +1 -1
  81. package/dist/plugins/loader.js +3 -1
  82. package/dist/plugins/loader.js.map +1 -1
  83. package/dist/plugins/manager.js +2 -1
  84. package/dist/plugins/manager.js.map +1 -1
  85. package/dist/plugins/package-link.js.map +1 -1
  86. package/dist/plugins/scaffold.js +4 -2
  87. package/dist/plugins/scaffold.js.map +1 -1
  88. package/dist/plugins/signal-lane.js.map +1 -1
  89. package/dist/process-memory-diagnostics.js +2 -1
  90. package/dist/process-memory-diagnostics.js.map +1 -1
  91. package/dist/providers/amazon-bedrock-gateway.js +2 -1
  92. package/dist/providers/amazon-bedrock-gateway.js.map +1 -1
  93. package/dist/providers/amazon-bedrock.js +2 -2
  94. package/dist/providers/amazon-bedrock.js.map +1 -1
  95. package/dist/providers/claude-max.d.ts.map +1 -1
  96. package/dist/providers/claude-max.js +14 -10
  97. package/dist/providers/claude-max.js.map +1 -1
  98. package/dist/providers/github-copilot-gateway.js.map +1 -1
  99. package/dist/providers/github-copilot.js +13 -12
  100. package/dist/providers/github-copilot.js.map +1 -1
  101. package/dist/providers/openai-codex.js +14 -11
  102. package/dist/providers/openai-codex.js.map +1 -1
  103. package/dist/providers/provider-thinking.js.map +1 -1
  104. package/dist/providers/thinking-request.js +1 -1
  105. package/dist/providers/thinking-request.js.map +1 -1
  106. package/dist/schedules/run-script.js +1 -1
  107. package/dist/schedules/run-script.js.map +1 -1
  108. package/dist/schedules/scheduler.js.map +1 -1
  109. package/dist/tools/request-sandbox-access.js +7 -5
  110. package/dist/tools/request-sandbox-access.js.map +1 -1
  111. package/dist/tools/utils.js +3 -1
  112. package/dist/tools/utils.js.map +1 -1
  113. package/dist/tools/web-search.d.ts +13 -11
  114. package/dist/tools/web-search.d.ts.map +1 -1
  115. package/dist/tools/web-search.js +21 -15
  116. package/dist/tools/web-search.js.map +1 -1
  117. package/dist/utils/debug-log.js +2 -2
  118. package/dist/utils/debug-log.js.map +1 -1
  119. package/dist/utils/gateway-sync.js +1 -1
  120. package/dist/utils/gateway-sync.js.map +1 -1
  121. package/dist/utils/local-observability.d.ts +1 -1
  122. package/dist/utils/local-observability.d.ts.map +1 -1
  123. package/dist/utils/local-observability.js +1 -1
  124. package/dist/utils/local-observability.js.map +1 -1
  125. package/dist/utils/prune-cli.js +10 -8
  126. package/dist/utils/prune-cli.js.map +1 -1
  127. package/dist/utils/signals-pubsub.js.map +1 -1
  128. package/dist/utils/slash-command-processor.js +1 -1
  129. package/dist/utils/slash-command-processor.js.map +1 -1
  130. package/dist/utils/stdin-pipe.js +1 -1
  131. package/dist/utils/stdin-pipe.js.map +1 -1
  132. package/dist/utils/storage-factory.d.ts.map +1 -1
  133. package/dist/utils/storage-factory.js +1 -1
  134. package/dist/utils/storage-factory.js.map +1 -1
  135. package/dist/utils/storage-maintenance.js +1 -1
  136. package/dist/utils/storage-maintenance.js.map +1 -1
  137. package/dist/utils/update-check.js +2 -1
  138. package/dist/utils/update-check.js.map +1 -1
  139. package/dist/utils/wake-session.d.ts +1 -1
  140. package/dist/utils/wake-session.d.ts.map +1 -1
  141. package/dist/utils/wake-session.js +8 -1
  142. package/dist/utils/wake-session.js.map +1 -1
  143. package/dist/workflows/register-primitives.js +1 -1
  144. package/dist/workflows/register-primitives.js.map +1 -1
  145. package/package.json +22 -22
@@ -1 +1 @@
1
- {"version":3,"file":"run-mc.js","names":["#maxBuffer","#closed","#resolvers","#buffer"],"sources":["../../src/headless/run-mc.ts"],"sourcesContent":["/**\n * Core programmatic runner for MastraCode headless runs.\n *\n * `runMC` is a pure async runner: it takes an already-built `controller` +\n * `session` (from `createMastraCode(...)`), resolves run config, subscribes to\n * the session, applies a {@link ResolutionPolicy} for approvals/suspensions,\n * sends the prompt, and aggregates events into a {@link RunMCResult}.\n *\n * It never touches `process.*` and never calls `process.exit`. The returned\n * {@link MCRun} is async-iterable over controller events and also resolves to a\n * final result via `result`.\n */\nimport { isSessionStartupCancelledError } from '@mastra/core/agent-controller';\nimport type { AgentControllerEvent, Session } from '@mastra/core/agent-controller';\n\nimport { MODEL_FALLBACK_STATE_KEY } from '../auth/account-rotation-processor.js';\nimport { GoalManager } from '../goal-manager.js';\nimport { createGoalReminderSignal } from '../goal-signal.js';\nimport { THREAD_ACTIVE_MODEL_PACK_ID_KEY } from '../onboarding/settings.js';\n\nimport { autoApprovePolicy } from './policy.js';\nimport type { MCRun, ResolutionPolicy, RunMCOptions, RunMCResult, RunMCStatus } from './types.js';\n\nfunction exitCodeForStatus(status: RunMCStatus): number {\n switch (status) {\n case 'completed':\n case 'done':\n return 0;\n case 'timeout':\n return 2;\n default:\n return 1;\n }\n}\n\ninterface MutableResult {\n text: string;\n finishReason?: string;\n usage?: RunMCResult['usage'];\n toolCalls: RunMCResult['toolCalls'];\n toolResults: RunMCResult['toolResults'];\n error?: RunMCResult['error'];\n threadId?: string;\n activeAssistantMessageId?: string;\n}\n\nfunction aggregate(event: AgentControllerEvent, acc: MutableResult): void {\n switch (event.type) {\n case 'message_start':\n if (event.message.role === 'assistant') acc.activeAssistantMessageId = event.message.id;\n break;\n case 'message_update':\n if (event.event.type === 'text-delta' && event.id === acc.activeAssistantMessageId) {\n acc.text += event.event.delta;\n }\n break;\n case 'message_end':\n if (event.id === acc.activeAssistantMessageId) acc.activeAssistantMessageId = undefined;\n break;\n case 'tool_start':\n acc.toolCalls.push({ id: event.toolCallId, name: event.toolName, args: event.args });\n break;\n case 'tool_end': {\n const matching = acc.toolCalls.find(c => c.id === event.toolCallId);\n acc.toolResults.push({\n id: event.toolCallId,\n name: matching?.name ?? '',\n result: event.result,\n isError: event.isError,\n });\n break;\n }\n case 'usage_update':\n acc.usage = {\n inputTokens: event.usage.promptTokens,\n outputTokens: event.usage.completionTokens,\n totalTokens: event.usage.totalTokens,\n };\n break;\n case 'error':\n acc.error = {\n name: event.error.name,\n message: event.error.message,\n stack: event.error.stack,\n };\n break;\n }\n}\n\n/** Resolve a thread by its exact ID. Titles are not unique, so we don't match on them. */\nasync function resolveThread<TState extends Record<string, unknown>>(\n session: Session<TState>,\n threadId: string,\n resourceId?: string,\n): Promise<{ threadId: string } | { error: string }> {\n const threads = await session.thread.list(resourceId ? { allResources: true } : undefined);\n\n const byId = threads.find(thread => thread.id === threadId && (!resourceId || thread.resourceId === resourceId));\n if (byId) return { threadId: byId.id };\n\n return { error: `No thread found with ID \"${threadId}\"` };\n}\n\n/**\n * A simple back-pressured async queue. Events are pushed in; consumers pull via\n * the async iterator. `close()` ends iteration after draining buffered events.\n *\n * Buffered events are bounded by `maxBuffer`: if a consumer never iterates (the\n * result-only path, `await run.result` without `for await (...)`) — or simply\n * falls far behind — the oldest buffered events are dropped instead of growing\n * without limit. The aggregated {@link RunMCResult} is built independently of\n * this queue, so dropping buffered events never affects the final result.\n */\nclass EventQueue<T> {\n #buffer: T[] = [];\n #resolvers: Array<(r: IteratorResult<T>) => void> = [];\n #closed = false;\n readonly #maxBuffer: number;\n\n constructor(maxBuffer = 10_000) {\n this.#maxBuffer = maxBuffer;\n }\n\n push(value: T): void {\n if (this.#closed) return;\n const resolve = this.#resolvers.shift();\n if (resolve) {\n resolve({ value, done: false });\n return;\n }\n this.#buffer.push(value);\n if (this.#buffer.length > this.#maxBuffer) {\n // Bound memory: drop the oldest event once over the cap.\n this.#buffer.shift();\n }\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n for (const resolve of this.#resolvers.splice(0)) {\n resolve({ value: undefined as unknown as T, done: true });\n }\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.#buffer.length > 0) {\n return Promise.resolve({ value: this.#buffer.shift()!, done: false });\n }\n if (this.#closed) {\n return Promise.resolve({ value: undefined as unknown as T, done: true });\n }\n return new Promise<IteratorResult<T>>(resolve => this.#resolvers.push(resolve));\n },\n };\n }\n}\n\n/**\n * Run a headless MastraCode turn. Returns an {@link MCRun} handle that is\n * async-iterable over controller events and resolves to a {@link RunMCResult}.\n */\nexport function runMC<TState extends Record<string, unknown>>(options: RunMCOptions<TState>): MCRun {\n const { controller, session } = options;\n const goal = options.goal;\n const policy: ResolutionPolicy = options.policy ?? autoApprovePolicy;\n\n const queue = new EventQueue<AgentControllerEvent>();\n const acc: MutableResult = { text: '', toolCalls: [], toolResults: [] };\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let timedOut = false;\n let aborted = false;\n let maxTurnsExceeded = false;\n let assistantTurns = 0;\n let activeAssistantMessageId: string | undefined;\n let settled = false;\n let agentStarts = 0;\n let unsubscribe: (() => void) | undefined;\n let resolveResult!: (r: RunMCResult) => void;\n\n const result = new Promise<RunMCResult>(resolve => {\n resolveResult = resolve;\n });\n\n function finish(status: RunMCStatus, data: Partial<RunMCResult> = {}): void {\n if (settled) return;\n settled = true;\n if (timeoutId) clearTimeout(timeoutId);\n unsubscribe?.();\n queue.close();\n resolveResult({\n status,\n text: acc.text,\n finishReason: acc.finishReason,\n usage: acc.usage,\n toolCalls: acc.toolCalls,\n toolResults: acc.toolResults,\n threadId: acc.threadId ?? session.thread.getId() ?? undefined,\n error: acc.error,\n exitCode: exitCodeForStatus(status),\n ...data,\n });\n }\n\n function fail(message: string, name = 'Error'): void {\n if (!acc.error) acc.error = { name, message };\n finish('error');\n }\n\n function failUnresolvedSuspension(toolName?: string): void {\n fail(`Run ended with an unresolved ${toolName ? `${toolName} suspension` : 'tool suspension'}.`);\n }\n\n /**\n * Ask the policy for the next parked tool. The session starts a fresh\n * run for it, so this run stays open until that run ends. Returns false when\n * nothing is left to resume.\n */\n function resumeNextSuspension(): boolean {\n const next = session.displayState.get().pendingSuspensions.values().next();\n if (next.done) return false;\n const { toolCallId, toolName } = next.value;\n let outcome: ReturnType<ResolutionPolicy['onSuspension']>;\n try {\n outcome = policy.onSuspension({ type: 'tool_suspended', ...next.value });\n } catch (err) {\n fail(`Resolution policy failed: ${(err as Error).message}`);\n return true;\n }\n if ('abort' in outcome) {\n abort();\n // This run has already ended suspended, so no further agent_end is due.\n finish('aborted');\n return true;\n }\n const { resumeData } = outcome;\n // The session clears the ending run's state right after emitting\n // agent_end, so resume on a later task, as an interactive client would.\n setTimeout(() => {\n if (settled) return;\n if (timedOut) return finish('timeout');\n if (aborted) return finish('aborted');\n const startsBeforeResume = agentStarts;\n session.respondToToolSuspension({ toolCallId, resumeData }).then(\n () => {\n // The session returns without starting a run when the suspension is\n // no longer parked; nothing else would end this run then.\n if (!settled && agentStarts === startsBeforeResume) failUnresolvedSuspension(toolName);\n },\n (err: unknown) => fail(`Failed to resume ${toolName}: ${(err as Error).message}`),\n );\n }, 0);\n return true;\n }\n\n function abort(): void {\n if (settled) return;\n aborted = true;\n session.abort();\n }\n\n if (options.signal) {\n if (options.signal.aborted) {\n // Defer so the caller can attach iteration / result handlers first.\n queueMicrotask(() => abort());\n } else {\n options.signal.addEventListener('abort', () => abort(), { once: true });\n }\n }\n\n function armTimeout(): void {\n if (!options.timeoutMs || settled) return;\n if (timeoutId) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timedOut = true;\n session.abort();\n if (goal) finish('timeout');\n }, options.timeoutMs);\n }\n\n // Kick off the run asynchronously so the MCRun handle is returned synchronously.\n void (async () => {\n armTimeout();\n\n // --- Subscribe ---\n unsubscribe = session.subscribe(event => {\n if (settled) return;\n if (event.type === 'agent_start') agentStarts += 1;\n if (goal) armTimeout();\n\n if (event.type === 'tool_approval_required') {\n let decision: 'approve' | 'deny';\n try {\n decision = policy.onToolApproval(event);\n } catch (err) {\n fail(`Resolution policy failed: ${(err as Error).message}`);\n return;\n }\n session.respondToToolApproval({\n decision: decision === 'approve' ? 'approve' : 'decline',\n toolCallId: event.toolCallId,\n });\n queue.push(event);\n return;\n }\n\n if (event.type === 'message_start' && event.message.role === 'assistant') {\n activeAssistantMessageId = event.message.id;\n }\n\n aggregate(event, acc);\n queue.push(event);\n\n if (event.type === 'error' && goal) {\n finish('error');\n return;\n }\n\n // Count agentic turns (one assistant response = one turn). When the cap is\n // reached, abort the run; agent_end then resolves as 'max_turns'.\n if (event.type === 'message_end' && event.id === activeAssistantMessageId && options.maxTurns !== undefined) {\n activeAssistantMessageId = undefined;\n assistantTurns += 1;\n if (assistantTurns >= options.maxTurns && !maxTurnsExceeded) {\n maxTurnsExceeded = true;\n abort();\n }\n }\n\n if (event.type === 'goal_evaluation' && goal && !event.payload.pending) {\n if (event.payload.status === 'done' || event.payload.status === 'paused') {\n finish(event.payload.status, {\n objective: goal.objective,\n goalEvent: event,\n reason: event.payload.reason ?? event.payload.results?.[0]?.reason,\n iterations: event.payload.iteration,\n maxRuns: event.payload.maxRuns,\n });\n }\n return;\n }\n\n if (event.type === 'agent_end') {\n acc.finishReason = event.reason;\n // A suspended run is parked, not finished: nothing more arrives until a\n // parked tool is answered, including goal evaluations.\n if (event.reason === 'suspended' && !timedOut && !aborted) {\n if (!resumeNextSuspension()) failUnresolvedSuspension();\n return;\n }\n // Goal evaluations can arrive after the agent stream ends, so goal runs\n // remain active until a terminal goal_evaluation is emitted.\n if (goal) return;\n if (timedOut) {\n finish('timeout');\n } else if (event.reason === 'error') {\n finish('error');\n } else if (maxTurnsExceeded && event.reason !== 'complete') {\n // The cap forced an abort while the agent still had work to do.\n finish('max_turns');\n } else if ((event.reason === 'aborted' || aborted) && !maxTurnsExceeded) {\n finish('aborted');\n } else {\n finish('completed');\n }\n }\n });\n\n // --- Thread resolution (read-only) ---\n const thread = options.thread;\n const targetResourceId = options.resourceId ?? session.identity.getResourceId();\n let restoredThreadId: string | undefined;\n try {\n if (thread?.id) {\n const resolved = await resolveThread(session, thread.id, targetResourceId);\n if ('error' in resolved) return fail(resolved.error);\n restoredThreadId = resolved.threadId;\n } else if (thread?.continueLatest) {\n const threads = await session.thread.list(targetResourceId ? { allResources: true } : undefined);\n const resourceThreads = targetResourceId\n ? threads.filter(candidate => candidate.resourceId === targetResourceId)\n : threads;\n if (resourceThreads.length > 0) {\n restoredThreadId = [...resourceThreads].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())[0]!.id;\n }\n }\n } catch (err) {\n return fail(`Failed to resolve thread: ${(err as Error).message}`);\n }\n\n // --- Config validation (read-only) ---\n const restoredThreadSelection = Boolean(restoredThreadId || thread?.clone);\n const modeIdForModel = options.mode ?? (options.modeDefaults ? session.mode.get() : undefined);\n const configuredDefaultModelId = modeIdForModel ? options.modeDefaults?.[modeIdForModel] : undefined;\n // A pack's model is not resolved here: a resumed thread restores its\n // persisted mode during thread selection, and the pack selection depends\n // on that mode. It is resolved and validated during config application.\n const modelIdToApply = options.pack\n ? options.model\n : (options.model ?? (options.mode || !restoredThreadSelection ? configuredDefaultModelId : undefined));\n // Where modelIdToApply came from, so validation errors name the right source.\n const modelSource = options.model ? 'flag' : 'mode';\n try {\n if (options.mode && !controller.listModes().some(mode => mode.id === options.mode)) {\n return fail(`Unknown mode: \"${options.mode}\"`);\n }\n\n if (modelIdToApply) {\n const available = await controller.listAvailableModels();\n const match = available.find(model => model.id === modelIdToApply);\n if (!match) {\n if (modelSource === 'flag') return fail(`Unknown model: \"${modelIdToApply}\"`);\n return fail(`Unknown model \"${modelIdToApply}\" configured for mode \"${modeIdForModel}\"`);\n }\n if (!match.hasApiKey) {\n const keyHint = match.apiKeyEnvVar ? ` Set ${match.apiKeyEnvVar} to use this model.` : '';\n if (modelSource === 'flag') return fail(`Model \"${modelIdToApply}\" has no API key configured.${keyHint}`);\n return fail(`Model \"${modelIdToApply}\" (mode: ${modeIdForModel}) has no API key configured.${keyHint}`);\n }\n }\n } catch (err) {\n return fail(`Failed to resolve run config: ${(err as Error).message}`);\n }\n\n // --- Resource id ---\n try {\n if (options.resourceId) {\n await controller.setResourceId(session, { resourceId: options.resourceId });\n }\n } catch (err) {\n return fail(`Failed to set resource id: ${(err as Error).message}`);\n }\n\n // --- Thread selection ---\n try {\n if (restoredThreadId) {\n await session.thread.switch({ threadId: restoredThreadId });\n } else if (!thread?.clone) {\n await session.thread.create();\n }\n } catch (err) {\n return fail(`Failed to select thread: ${(err as Error).message}`);\n }\n\n // --- Clone ---\n if (thread?.clone) {\n try {\n await session.thread.clone();\n } catch (err) {\n return fail(`Failed to clone thread: ${(err as Error).message}`);\n }\n }\n\n // --- Config application ---\n try {\n if (options.mode) {\n await session.mode.switch({ modeId: options.mode });\n }\n let packModelId: string | undefined;\n if (options.pack) {\n // Resolve the selection against the mode in effect now — thread\n // selection above may have restored a resumed thread's persisted mode.\n const packModeId = options.mode ?? session.mode.get();\n const packSelection = options.pack.resolve(packModeId);\n if (!packSelection) {\n return fail(`Model pack \"${options.pack.id}\" has no model for ${packModeId} mode`);\n }\n const available = await controller.listAvailableModels();\n const match = available.find(model => model.id === packSelection.modelId);\n if (!match) {\n return fail(`Unknown model \"${packSelection.modelId}\" from pack \"${options.pack.id}\"`);\n }\n if (!match.hasApiKey) {\n const keyHint = match.apiKeyEnvVar ? ` Set ${match.apiKeyEnvVar} to use this model.` : '';\n return fail(\n `Model \"${packSelection.modelId}\" (pack: ${options.pack.id}) has no API key configured.${keyHint}`,\n );\n }\n packModelId = packSelection.modelId;\n // Mirror /models → Activate on the session: sticky thread pack id,\n // subagent models, and the fallback route. Clears any pending fallback\n // from a continued thread so the pack's own route starts clean.\n await session.thread.setSetting({ key: THREAD_ACTIVE_MODEL_PACK_ID_KEY, value: options.pack.id });\n await session.thread.setSetting({ key: MODEL_FALLBACK_STATE_KEY, value: undefined });\n for (const [agentType, modelId] of Object.entries(packSelection.subagentModels ?? {})) {\n await session.subagents.model.set({ modelId, agentType });\n }\n await session.state.set({\n modelRoute: packSelection.modelRoute,\n [MODEL_FALLBACK_STATE_KEY]: null,\n } as unknown as Partial<TState>);\n }\n const sessionModelId = modelIdToApply ?? packModelId;\n if (sessionModelId) {\n await session.model.switch(sessionModelId);\n }\n // Persist the pack activation (global default) only once the pack has\n // fully taken effect on the session — a failed model switch above must\n // not leave the global default changed.\n options.pack?.onApplied?.();\n if (options.thinkingLevel) {\n await session.state.set({ thinkingLevel: options.thinkingLevel } as unknown as Partial<TState>);\n }\n } catch (err) {\n return fail(`Failed to apply run config: ${(err as Error).message}`);\n }\n\n // --- Title ---\n if (options.title) {\n try {\n await session.thread.rename({ title: options.title });\n } catch (err) {\n return fail(`Failed to set thread title: ${(err as Error).message}`);\n }\n }\n\n // --- Start ---\n try {\n if (goal) {\n const threadId = session.thread.getId();\n if (!threadId || !(await session.thread.getById({ threadId }))) {\n await session.thread.create();\n }\n\n const goalManager = goal.goalManager ?? new GoalManager();\n const state = {\n controller,\n session,\n goalManager,\n pendingNewThread: false,\n } as any;\n const objective = await goalManager.setGoal(state, goal.objective, goal.judgeModelId, goal.maxRuns);\n if (!objective) return fail('Failed to set goal.');\n\n const agent = controller.getCurrentAgent(session);\n const persisted = await agent.getObjective({ threadId: session.thread.getId()! });\n if (!persisted || persisted.id !== objective.id) {\n return fail('Failed to persist goal objective before sending goal signal.');\n }\n\n await goalManager.saveToThread(state);\n if (!settled) await session.sendSignal(createGoalReminderSignal(objective)).accepted;\n } else {\n if (!options.prompt) return fail('A prompt or goal is required.');\n await session.sendMessage({ content: options.prompt });\n }\n } catch (err) {\n if (\n isSessionStartupCancelledError(err) ||\n (err instanceof Error && err.name === 'AbortError' && (aborted || timedOut || options.signal?.aborted))\n ) {\n return finish(timedOut ? 'timeout' : maxTurnsExceeded ? 'max_turns' : 'aborted');\n }\n return fail(`Failed to start run: ${(err as Error).message}`);\n }\n })();\n\n return {\n result,\n abort,\n [Symbol.asyncIterator](): AsyncIterator<AgentControllerEvent> {\n return queue[Symbol.asyncIterator]();\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"run-mc.js","names":[],"sources":["../../src/headless/run-mc.ts"],"sourcesContent":["/**\n * Core programmatic runner for MastraCode headless runs.\n *\n * `runMC` is a pure async runner: it takes an already-built `controller` +\n * `session` (from `createMastraCode(...)`), resolves run config, subscribes to\n * the session, applies a {@link ResolutionPolicy} for approvals/suspensions,\n * sends the prompt, and aggregates events into a {@link RunMCResult}.\n *\n * It never touches `process.*` and never calls `process.exit`. The returned\n * {@link MCRun} is async-iterable over controller events and also resolves to a\n * final result via `result`.\n */\nimport { isSessionStartupCancelledError } from '@mastra/core/agent-controller';\nimport type { AgentControllerEvent, Session } from '@mastra/core/agent-controller';\n\nimport { MODEL_FALLBACK_STATE_KEY } from '../auth/account-rotation-processor.js';\nimport { GoalManager } from '../goal-manager.js';\nimport { createGoalReminderSignal } from '../goal-signal.js';\nimport { THREAD_ACTIVE_MODEL_PACK_ID_KEY } from '../onboarding/settings.js';\n\nimport { autoApprovePolicy } from './policy.js';\nimport type { MCRun, ResolutionPolicy, RunMCOptions, RunMCResult, RunMCStatus } from './types.js';\n\nfunction exitCodeForStatus(status: RunMCStatus): number {\n switch (status) {\n case 'completed':\n case 'done':\n return 0;\n case 'timeout':\n return 2;\n default:\n return 1;\n }\n}\n\ninterface MutableResult {\n text: string;\n finishReason?: string;\n usage?: RunMCResult['usage'];\n toolCalls: RunMCResult['toolCalls'];\n toolResults: RunMCResult['toolResults'];\n error?: RunMCResult['error'];\n threadId?: string;\n activeAssistantMessageId?: string;\n}\n\nfunction aggregate(event: AgentControllerEvent, acc: MutableResult): void {\n switch (event.type) {\n case 'message_start':\n if (event.message.role === 'assistant') acc.activeAssistantMessageId = event.message.id;\n break;\n case 'message_update':\n if (event.event.type === 'text-delta' && event.id === acc.activeAssistantMessageId) {\n acc.text += event.event.delta;\n }\n break;\n case 'message_end':\n if (event.id === acc.activeAssistantMessageId) acc.activeAssistantMessageId = undefined;\n break;\n case 'tool_start':\n acc.toolCalls.push({ id: event.toolCallId, name: event.toolName, args: event.args });\n break;\n case 'tool_end': {\n const matching = acc.toolCalls.find(c => c.id === event.toolCallId);\n acc.toolResults.push({\n id: event.toolCallId,\n name: matching?.name ?? '',\n result: event.result,\n isError: event.isError,\n });\n break;\n }\n case 'usage_update':\n acc.usage = {\n inputTokens: event.usage.promptTokens,\n outputTokens: event.usage.completionTokens,\n totalTokens: event.usage.totalTokens,\n };\n break;\n case 'error':\n acc.error = {\n name: event.error.name,\n message: event.error.message,\n stack: event.error.stack,\n };\n break;\n }\n}\n\n/** Resolve a thread by its exact ID. Titles are not unique, so we don't match on them. */\nasync function resolveThread<TState extends Record<string, unknown>>(\n session: Session<TState>,\n threadId: string,\n resourceId?: string,\n): Promise<{ threadId: string } | { error: string }> {\n const threads = await session.thread.list(resourceId ? { allResources: true } : undefined);\n\n const byId = threads.find(thread => thread.id === threadId && (!resourceId || thread.resourceId === resourceId));\n if (byId) return { threadId: byId.id };\n\n return { error: `No thread found with ID \"${threadId}\"` };\n}\n\n/**\n * A simple back-pressured async queue. Events are pushed in; consumers pull via\n * the async iterator. `close()` ends iteration after draining buffered events.\n *\n * Buffered events are bounded by `maxBuffer`: if a consumer never iterates (the\n * result-only path, `await run.result` without `for await (...)`) — or simply\n * falls far behind — the oldest buffered events are dropped instead of growing\n * without limit. The aggregated {@link RunMCResult} is built independently of\n * this queue, so dropping buffered events never affects the final result.\n */\nclass EventQueue<T> {\n #buffer: T[] = [];\n #resolvers: Array<(r: IteratorResult<T>) => void> = [];\n #closed = false;\n readonly #maxBuffer: number;\n\n constructor(maxBuffer = 10_000) {\n this.#maxBuffer = maxBuffer;\n }\n\n push(value: T): void {\n if (this.#closed) return;\n const resolve = this.#resolvers.shift();\n if (resolve) {\n resolve({ value, done: false });\n return;\n }\n this.#buffer.push(value);\n if (this.#buffer.length > this.#maxBuffer) {\n // Bound memory: drop the oldest event once over the cap.\n this.#buffer.shift();\n }\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n for (const resolve of this.#resolvers.splice(0)) {\n resolve({ value: undefined as unknown as T, done: true });\n }\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.#buffer.length > 0) {\n return Promise.resolve({ value: this.#buffer.shift()!, done: false });\n }\n if (this.#closed) {\n return Promise.resolve({ value: undefined as unknown as T, done: true });\n }\n return new Promise<IteratorResult<T>>(resolve => this.#resolvers.push(resolve));\n },\n };\n }\n}\n\n/**\n * Run a headless MastraCode turn. Returns an {@link MCRun} handle that is\n * async-iterable over controller events and resolves to a {@link RunMCResult}.\n */\nexport function runMC<TState extends Record<string, unknown>>(options: RunMCOptions<TState>): MCRun {\n const { controller, session } = options;\n const goal = options.goal;\n const policy: ResolutionPolicy = options.policy ?? autoApprovePolicy;\n\n const queue = new EventQueue<AgentControllerEvent>();\n const acc: MutableResult = { text: '', toolCalls: [], toolResults: [] };\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let timedOut = false;\n let aborted = false;\n let maxTurnsExceeded = false;\n let assistantTurns = 0;\n let activeAssistantMessageId: string | undefined;\n let settled = false;\n let agentStarts = 0;\n let unsubscribe: (() => void) | undefined;\n let resolveResult!: (r: RunMCResult) => void;\n\n const result = new Promise<RunMCResult>(resolve => {\n resolveResult = resolve;\n });\n\n function finish(status: RunMCStatus, data: Partial<RunMCResult> = {}): void {\n if (settled) return;\n settled = true;\n if (timeoutId) clearTimeout(timeoutId);\n unsubscribe?.();\n queue.close();\n resolveResult({\n status,\n text: acc.text,\n finishReason: acc.finishReason,\n usage: acc.usage,\n toolCalls: acc.toolCalls,\n toolResults: acc.toolResults,\n threadId: acc.threadId ?? session.thread.getId() ?? undefined,\n error: acc.error,\n exitCode: exitCodeForStatus(status),\n ...data,\n });\n }\n\n function fail(message: string, name = 'Error'): void {\n if (!acc.error) acc.error = { name, message };\n finish('error');\n }\n\n function failUnresolvedSuspension(toolName?: string): void {\n fail(`Run ended with an unresolved ${toolName ? `${toolName} suspension` : 'tool suspension'}.`);\n }\n\n /**\n * Ask the policy for the next parked tool. The session starts a fresh\n * run for it, so this run stays open until that run ends. Returns false when\n * nothing is left to resume.\n */\n function resumeNextSuspension(): boolean {\n const next = session.displayState.get().pendingSuspensions.values().next();\n if (next.done) return false;\n const { toolCallId, toolName } = next.value;\n let outcome: ReturnType<ResolutionPolicy['onSuspension']>;\n try {\n outcome = policy.onSuspension({ type: 'tool_suspended', ...next.value });\n } catch (err) {\n fail(`Resolution policy failed: ${(err as Error).message}`);\n return true;\n }\n if ('abort' in outcome) {\n abort();\n // This run has already ended suspended, so no further agent_end is due.\n finish('aborted');\n return true;\n }\n const { resumeData } = outcome;\n // The session clears the ending run's state right after emitting\n // agent_end, so resume on a later task, as an interactive client would.\n setTimeout(() => {\n if (settled) return;\n if (timedOut) return finish('timeout');\n if (aborted) return finish('aborted');\n const startsBeforeResume = agentStarts;\n session.respondToToolSuspension({ toolCallId, resumeData }).then(\n () => {\n // The session returns without starting a run when the suspension is\n // no longer parked; nothing else would end this run then.\n if (!settled && agentStarts === startsBeforeResume) failUnresolvedSuspension(toolName);\n },\n (err: unknown) => fail(`Failed to resume ${toolName}: ${(err as Error).message}`),\n );\n }, 0);\n return true;\n }\n\n function abort(): void {\n if (settled) return;\n aborted = true;\n session.abort();\n }\n\n if (options.signal) {\n if (options.signal.aborted) {\n // Defer so the caller can attach iteration / result handlers first.\n queueMicrotask(() => abort());\n } else {\n options.signal.addEventListener('abort', () => abort(), { once: true });\n }\n }\n\n function armTimeout(): void {\n if (!options.timeoutMs || settled) return;\n if (timeoutId) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timedOut = true;\n session.abort();\n if (goal) finish('timeout');\n }, options.timeoutMs);\n }\n\n // Kick off the run asynchronously so the MCRun handle is returned synchronously.\n void (async () => {\n armTimeout();\n\n // --- Subscribe ---\n unsubscribe = session.subscribe(event => {\n if (settled) return;\n if (event.type === 'agent_start') agentStarts += 1;\n if (goal) armTimeout();\n\n if (event.type === 'tool_approval_required') {\n let decision: 'approve' | 'deny';\n try {\n decision = policy.onToolApproval(event);\n } catch (err) {\n fail(`Resolution policy failed: ${(err as Error).message}`);\n return;\n }\n session.respondToToolApproval({\n decision: decision === 'approve' ? 'approve' : 'decline',\n toolCallId: event.toolCallId,\n });\n queue.push(event);\n return;\n }\n\n if (event.type === 'message_start' && event.message.role === 'assistant') {\n activeAssistantMessageId = event.message.id;\n }\n\n aggregate(event, acc);\n queue.push(event);\n\n if (event.type === 'error' && goal) {\n finish('error');\n return;\n }\n\n // Count agentic turns (one assistant response = one turn). When the cap is\n // reached, abort the run; agent_end then resolves as 'max_turns'.\n if (event.type === 'message_end' && event.id === activeAssistantMessageId && options.maxTurns !== undefined) {\n activeAssistantMessageId = undefined;\n assistantTurns += 1;\n if (assistantTurns >= options.maxTurns && !maxTurnsExceeded) {\n maxTurnsExceeded = true;\n abort();\n }\n }\n\n if (event.type === 'goal_evaluation' && goal && !event.payload.pending) {\n if (event.payload.status === 'done' || event.payload.status === 'paused') {\n finish(event.payload.status, {\n objective: goal.objective,\n goalEvent: event,\n reason: event.payload.reason ?? event.payload.results?.[0]?.reason,\n iterations: event.payload.iteration,\n maxRuns: event.payload.maxRuns,\n });\n }\n return;\n }\n\n if (event.type === 'agent_end') {\n acc.finishReason = event.reason;\n // A suspended run is parked, not finished: nothing more arrives until a\n // parked tool is answered, including goal evaluations.\n if (event.reason === 'suspended' && !timedOut && !aborted) {\n if (!resumeNextSuspension()) failUnresolvedSuspension();\n return;\n }\n // Goal evaluations can arrive after the agent stream ends, so goal runs\n // remain active until a terminal goal_evaluation is emitted.\n if (goal) return;\n if (timedOut) {\n finish('timeout');\n } else if (event.reason === 'error') {\n finish('error');\n } else if (maxTurnsExceeded && event.reason !== 'complete') {\n // The cap forced an abort while the agent still had work to do.\n finish('max_turns');\n } else if ((event.reason === 'aborted' || aborted) && !maxTurnsExceeded) {\n finish('aborted');\n } else {\n finish('completed');\n }\n }\n });\n\n // --- Thread resolution (read-only) ---\n const thread = options.thread;\n const targetResourceId = options.resourceId ?? session.identity.getResourceId();\n let restoredThreadId: string | undefined;\n try {\n if (thread?.id) {\n const resolved = await resolveThread(session, thread.id, targetResourceId);\n if ('error' in resolved) return fail(resolved.error);\n restoredThreadId = resolved.threadId;\n } else if (thread?.continueLatest) {\n const threads = await session.thread.list(targetResourceId ? { allResources: true } : undefined);\n const resourceThreads = targetResourceId\n ? threads.filter(candidate => candidate.resourceId === targetResourceId)\n : threads;\n if (resourceThreads.length > 0) {\n restoredThreadId = [...resourceThreads].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())[0]!.id;\n }\n }\n } catch (err) {\n return fail(`Failed to resolve thread: ${(err as Error).message}`);\n }\n\n // --- Config validation (read-only) ---\n const restoredThreadSelection = Boolean(restoredThreadId || thread?.clone);\n const modeIdForModel = options.mode ?? (options.modeDefaults ? session.mode.get() : undefined);\n const configuredDefaultModelId = modeIdForModel ? options.modeDefaults?.[modeIdForModel] : undefined;\n // A pack's model is not resolved here: a resumed thread restores its\n // persisted mode during thread selection, and the pack selection depends\n // on that mode. It is resolved and validated during config application.\n const modelIdToApply = options.pack\n ? options.model\n : (options.model ?? (options.mode || !restoredThreadSelection ? configuredDefaultModelId : undefined));\n // Where modelIdToApply came from, so validation errors name the right source.\n const modelSource = options.model ? 'flag' : 'mode';\n try {\n if (options.mode && !controller.listModes().some(mode => mode.id === options.mode)) {\n return fail(`Unknown mode: \"${options.mode}\"`);\n }\n\n if (modelIdToApply) {\n const available = await controller.listAvailableModels();\n const match = available.find(model => model.id === modelIdToApply);\n if (!match) {\n if (modelSource === 'flag') return fail(`Unknown model: \"${modelIdToApply}\"`);\n return fail(`Unknown model \"${modelIdToApply}\" configured for mode \"${modeIdForModel}\"`);\n }\n if (!match.hasApiKey) {\n const keyHint = match.apiKeyEnvVar ? ` Set ${match.apiKeyEnvVar} to use this model.` : '';\n if (modelSource === 'flag') return fail(`Model \"${modelIdToApply}\" has no API key configured.${keyHint}`);\n return fail(`Model \"${modelIdToApply}\" (mode: ${modeIdForModel}) has no API key configured.${keyHint}`);\n }\n }\n } catch (err) {\n return fail(`Failed to resolve run config: ${(err as Error).message}`);\n }\n\n // --- Resource id ---\n try {\n if (options.resourceId) {\n await controller.setResourceId(session, { resourceId: options.resourceId });\n }\n } catch (err) {\n return fail(`Failed to set resource id: ${(err as Error).message}`);\n }\n\n // --- Thread selection ---\n try {\n if (restoredThreadId) {\n await session.thread.switch({ threadId: restoredThreadId });\n } else if (!thread?.clone) {\n await session.thread.create();\n }\n } catch (err) {\n return fail(`Failed to select thread: ${(err as Error).message}`);\n }\n\n // --- Clone ---\n if (thread?.clone) {\n try {\n await session.thread.clone();\n } catch (err) {\n return fail(`Failed to clone thread: ${(err as Error).message}`);\n }\n }\n\n // --- Config application ---\n try {\n if (options.mode) {\n await session.mode.switch({ modeId: options.mode });\n }\n let packModelId: string | undefined;\n if (options.pack) {\n // Resolve the selection against the mode in effect now — thread\n // selection above may have restored a resumed thread's persisted mode.\n const packModeId = options.mode ?? session.mode.get();\n const packSelection = options.pack.resolve(packModeId);\n if (!packSelection) {\n return fail(`Model pack \"${options.pack.id}\" has no model for ${packModeId} mode`);\n }\n const available = await controller.listAvailableModels();\n const match = available.find(model => model.id === packSelection.modelId);\n if (!match) {\n return fail(`Unknown model \"${packSelection.modelId}\" from pack \"${options.pack.id}\"`);\n }\n if (!match.hasApiKey) {\n const keyHint = match.apiKeyEnvVar ? ` Set ${match.apiKeyEnvVar} to use this model.` : '';\n return fail(\n `Model \"${packSelection.modelId}\" (pack: ${options.pack.id}) has no API key configured.${keyHint}`,\n );\n }\n packModelId = packSelection.modelId;\n // Mirror /models → Activate on the session: sticky thread pack id,\n // subagent models, and the fallback route. Clears any pending fallback\n // from a continued thread so the pack's own route starts clean.\n await session.thread.setSetting({ key: THREAD_ACTIVE_MODEL_PACK_ID_KEY, value: options.pack.id });\n await session.thread.setSetting({ key: MODEL_FALLBACK_STATE_KEY, value: undefined });\n for (const [agentType, modelId] of Object.entries(packSelection.subagentModels ?? {})) {\n await session.subagents.model.set({ modelId, agentType });\n }\n await session.state.set({\n modelRoute: packSelection.modelRoute,\n [MODEL_FALLBACK_STATE_KEY]: null,\n } as unknown as Partial<TState>);\n }\n const sessionModelId = modelIdToApply ?? packModelId;\n if (sessionModelId) {\n await session.model.switch(sessionModelId);\n }\n // Persist the pack activation (global default) only once the pack has\n // fully taken effect on the session — a failed model switch above must\n // not leave the global default changed.\n options.pack?.onApplied?.();\n if (options.thinkingLevel) {\n await session.state.set({ thinkingLevel: options.thinkingLevel } as unknown as Partial<TState>);\n }\n } catch (err) {\n return fail(`Failed to apply run config: ${(err as Error).message}`);\n }\n\n // --- Title ---\n if (options.title) {\n try {\n await session.thread.rename({ title: options.title });\n } catch (err) {\n return fail(`Failed to set thread title: ${(err as Error).message}`);\n }\n }\n\n // --- Start ---\n try {\n if (goal) {\n const threadId = session.thread.getId();\n if (!threadId || !(await session.thread.getById({ threadId }))) {\n await session.thread.create();\n }\n\n const goalManager = goal.goalManager ?? new GoalManager();\n const state = {\n controller,\n session,\n goalManager,\n pendingNewThread: false,\n } as any;\n const objective = await goalManager.setGoal(state, goal.objective, goal.judgeModelId, goal.maxRuns);\n if (!objective) return fail('Failed to set goal.');\n\n const agent = controller.getCurrentAgent(session);\n const persisted = await agent.getObjective({ threadId: session.thread.getId()! });\n if (!persisted || persisted.id !== objective.id) {\n return fail('Failed to persist goal objective before sending goal signal.');\n }\n\n await goalManager.saveToThread(state);\n if (!settled) await session.sendSignal(createGoalReminderSignal(objective)).accepted;\n } else {\n if (!options.prompt) return fail('A prompt or goal is required.');\n await session.sendMessage({ content: options.prompt });\n }\n } catch (err) {\n if (\n isSessionStartupCancelledError(err) ||\n (err instanceof Error && err.name === 'AbortError' && (aborted || timedOut || options.signal?.aborted))\n ) {\n return finish(timedOut ? 'timeout' : maxTurnsExceeded ? 'max_turns' : 'aborted');\n }\n return fail(`Failed to start run: ${(err as Error).message}`);\n }\n })();\n\n return {\n result,\n abort,\n [Symbol.asyncIterator](): AsyncIterator<AgentControllerEvent> {\n return queue[Symbol.asyncIterator]();\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuBA,SAAS,kBAAkB,QAA6B;CACtD,QAAQ,QAAR;EACE,KAAK;EACL,KAAK,QACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAaA,SAAS,UAAU,OAA6B,KAA0B;CACxE,QAAQ,MAAM,MAAd;EACE,KAAK;GACH,IAAI,MAAM,QAAQ,SAAS,aAAa,IAAI,2BAA2B,MAAM,QAAQ;GACrF;EACF,KAAK;GACH,IAAI,MAAM,MAAM,SAAS,gBAAgB,MAAM,OAAO,IAAI,0BACxD,IAAI,QAAQ,MAAM,MAAM;GAE1B;EACF,KAAK;GACH,IAAI,MAAM,OAAO,IAAI,0BAA0B,IAAI,2BAA2B,KAAA;GAC9E;EACF,KAAK;GACH,IAAI,UAAU,KAAK;IAAE,IAAI,MAAM;IAAY,MAAM,MAAM;IAAU,MAAM,MAAM;GAAK,CAAC;GACnF;EACF,KAAK,YAAY;GACf,MAAM,WAAW,IAAI,UAAU,MAAK,MAAK,EAAE,OAAO,MAAM,UAAU;GAClE,IAAI,YAAY,KAAK;IACnB,IAAI,MAAM;IACV,MAAM,UAAU,QAAQ;IACxB,QAAQ,MAAM;IACd,SAAS,MAAM;GACjB,CAAC;GACD;EACF;EACA,KAAK;GACH,IAAI,QAAQ;IACV,aAAa,MAAM,MAAM;IACzB,cAAc,MAAM,MAAM;IAC1B,aAAa,MAAM,MAAM;GAC3B;GACA;EACF,KAAK,SACH,IAAI,QAAQ;GACV,MAAM,MAAM,MAAM;GAClB,SAAS,MAAM,MAAM;GACrB,OAAO,MAAM,MAAM;EACrB;CAEJ;AACF;;AAGA,eAAe,cACb,SACA,UACA,YACmD;CAGnD,MAAM,QAAO,MAFS,QAAQ,OAAO,KAAK,aAAa,EAAE,cAAc,KAAK,IAAI,KAAA,CAAS,EAAA,CAEpE,MAAK,WAAU,OAAO,OAAO,aAAa,CAAC,cAAc,OAAO,eAAe,WAAW;CAC/G,IAAI,MAAM,OAAO,EAAE,UAAU,KAAK,GAAG;CAErC,OAAO,EAAE,OAAO,4BAA4B,SAAS,GAAG;AAC1D;;;;;;;;;;;AAYA,IAAM,aAAN,MAAoB;CAClB,UAAe,CAAC;CAChB,aAAoD,CAAC;CACrD,UAAU;CACV;CAEA,YAAY,YAAY,KAAQ;EAC9B,KAAK,aAAa;CACpB;CAEA,KAAK,OAAgB;EACnB,IAAI,KAAK,SAAS;EAClB,MAAM,UAAU,KAAK,WAAW,MAAM;EACtC,IAAI,SAAS;GACX,QAAQ;IAAE;IAAO,MAAM;GAAM,CAAC;GAC9B;EACF;EACA,KAAK,QAAQ,KAAK,KAAK;EACvB,IAAI,KAAK,QAAQ,SAAS,KAAK,YAE7B,KAAK,QAAQ,MAAM;CAEvB;CAEA,QAAc;EACZ,IAAI,KAAK,SAAS;EAClB,KAAK,UAAU;EACf,KAAK,MAAM,WAAW,KAAK,WAAW,OAAO,CAAC,GAC5C,QAAQ;GAAE,OAAO,KAAA;GAA2B,MAAM;EAAK,CAAC;CAE5D;CAEA,CAAC,OAAO,iBAAmC;EACzC,OAAO,EACL,YAAwC;GACtC,IAAI,KAAK,QAAQ,SAAS,GACxB,OAAO,QAAQ,QAAQ;IAAE,OAAO,KAAK,QAAQ,MAAM;IAAI,MAAM;GAAM,CAAC;GAEtE,IAAI,KAAK,SACP,OAAO,QAAQ,QAAQ;IAAE,OAAO,KAAA;IAA2B,MAAM;GAAK,CAAC;GAEzE,OAAO,IAAI,SAA2B,YAAW,KAAK,WAAW,KAAK,OAAO,CAAC;EAChF,EACF;CACF;AACF;;;;;AAMA,SAAgB,MAA8C,SAAsC;CAClG,MAAM,EAAE,YAAY,YAAY;CAChC,MAAM,OAAO,QAAQ;CACrB,MAAM,SAA2B,QAAQ,UAAU;CAEnD,MAAM,QAAQ,IAAI,WAAiC;CACnD,MAAM,MAAqB;EAAE,MAAM;EAAI,WAAW,CAAC;EAAG,aAAa,CAAC;CAAE;CAEtE,IAAI;CACJ,IAAI,WAAW;CACf,IAAI,UAAU;CACd,IAAI,mBAAmB;CACvB,IAAI,iBAAiB;CACrB,IAAI;CACJ,IAAI,UAAU;CACd,IAAI,cAAc;CAClB,IAAI;CACJ,IAAI;CAEJ,MAAM,SAAS,IAAI,SAAqB,YAAW;EACjD,gBAAgB;CAClB,CAAC;CAED,SAAS,OAAO,QAAqB,OAA6B,CAAC,GAAS;EAC1E,IAAI,SAAS;EACb,UAAU;EACV,IAAI,WAAW,aAAa,SAAS;EACrC,cAAc;EACd,MAAM,MAAM;EACZ,cAAc;GACZ;GACA,MAAM,IAAI;GACV,cAAc,IAAI;GAClB,OAAO,IAAI;GACX,WAAW,IAAI;GACf,aAAa,IAAI;GACjB,UAAU,IAAI,YAAY,QAAQ,OAAO,MAAM,KAAK,KAAA;GACpD,OAAO,IAAI;GACX,UAAU,kBAAkB,MAAM;GAClC,GAAG;EACL,CAAC;CACH;CAEA,SAAS,KAAK,SAAiB,OAAO,SAAe;EACnD,IAAI,CAAC,IAAI,OAAO,IAAI,QAAQ;GAAE;GAAM;EAAQ;EAC5C,OAAO,OAAO;CAChB;CAEA,SAAS,yBAAyB,UAAyB;EACzD,KAAK,gCAAgC,WAAW,GAAG,SAAS,eAAe,kBAAkB,EAAE;CACjG;;;;;;CAOA,SAAS,uBAAgC;EACvC,MAAM,OAAO,QAAQ,aAAa,IAAI,CAAC,CAAC,mBAAmB,OAAO,CAAC,CAAC,KAAK;EACzE,IAAI,KAAK,MAAM,OAAO;EACtB,MAAM,EAAE,YAAY,aAAa,KAAK;EACtC,IAAI;EACJ,IAAI;GACF,UAAU,OAAO,aAAa;IAAE,MAAM;IAAkB,GAAG,KAAK;GAAM,CAAC;EACzE,SAAS,KAAK;GACZ,KAAK,6BAA8B,IAAc,SAAS;GAC1D,OAAO;EACT;EACA,IAAI,WAAW,SAAS;GACtB,MAAM;GAEN,OAAO,SAAS;GAChB,OAAO;EACT;EACA,MAAM,EAAE,eAAe;EAGvB,iBAAiB;GACf,IAAI,SAAS;GACb,IAAI,UAAU,OAAO,OAAO,SAAS;GACrC,IAAI,SAAS,OAAO,OAAO,SAAS;GACpC,MAAM,qBAAqB;GAC3B,QAAQ,wBAAwB;IAAE;IAAY;GAAW,CAAC,CAAC,CAAC,WACpD;IAGJ,IAAI,CAAC,WAAW,gBAAgB,oBAAoB,yBAAyB,QAAQ;GACvF,IACC,QAAiB,KAAK,oBAAoB,SAAS,IAAK,IAAc,SAAS,CAClF;EACF,GAAG,CAAC;EACJ,OAAO;CACT;CAEA,SAAS,QAAc;EACrB,IAAI,SAAS;EACb,UAAU;EACV,QAAQ,MAAM;CAChB;CAEA,IAAI,QAAQ,QAAQ;EAClB,IAAI,QAAQ,OAAO,SAEjB,qBAAqB,MAAM,CAAC;OAE5B,QAAQ,OAAO,iBAAiB,eAAe,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC;CAE1E;CAEA,SAAS,aAAmB;EAC1B,IAAI,CAAC,QAAQ,aAAa,SAAS;EACnC,IAAI,WAAW,aAAa,SAAS;EACrC,YAAY,iBAAiB;GAC3B,WAAW;GACX,QAAQ,MAAM;GACd,IAAI,MAAM,OAAO,SAAS;EAC5B,GAAG,QAAQ,SAAS;CACtB;CAGA,CAAM,YAAY;EAChB,WAAW;EAGX,cAAc,QAAQ,WAAU,UAAS;GACvC,IAAI,SAAS;GACb,IAAI,MAAM,SAAS,eAAe,eAAe;GACjD,IAAI,MAAM,WAAW;GAErB,IAAI,MAAM,SAAS,0BAA0B;IAC3C,IAAI;IACJ,IAAI;KACF,WAAW,OAAO,eAAe,KAAK;IACxC,SAAS,KAAK;KACZ,KAAK,6BAA8B,IAAc,SAAS;KAC1D;IACF;IACA,QAAQ,sBAAsB;KAC5B,UAAU,aAAa,YAAY,YAAY;KAC/C,YAAY,MAAM;IACpB,CAAC;IACD,MAAM,KAAK,KAAK;IAChB;GACF;GAEA,IAAI,MAAM,SAAS,mBAAmB,MAAM,QAAQ,SAAS,aAC3D,2BAA2B,MAAM,QAAQ;GAG3C,UAAU,OAAO,GAAG;GACpB,MAAM,KAAK,KAAK;GAEhB,IAAI,MAAM,SAAS,WAAW,MAAM;IAClC,OAAO,OAAO;IACd;GACF;GAIA,IAAI,MAAM,SAAS,iBAAiB,MAAM,OAAO,4BAA4B,QAAQ,aAAa,KAAA,GAAW;IAC3G,2BAA2B,KAAA;IAC3B,kBAAkB;IAClB,IAAI,kBAAkB,QAAQ,YAAY,CAAC,kBAAkB;KAC3D,mBAAmB;KACnB,MAAM;IACR;GACF;GAEA,IAAI,MAAM,SAAS,qBAAqB,QAAQ,CAAC,MAAM,QAAQ,SAAS;IACtE,IAAI,MAAM,QAAQ,WAAW,UAAU,MAAM,QAAQ,WAAW,UAC9D,OAAO,MAAM,QAAQ,QAAQ;KAC3B,WAAW,KAAK;KAChB,WAAW;KACX,QAAQ,MAAM,QAAQ,UAAU,MAAM,QAAQ,UAAU,EAAE,EAAE;KAC5D,YAAY,MAAM,QAAQ;KAC1B,SAAS,MAAM,QAAQ;IACzB,CAAC;IAEH;GACF;GAEA,IAAI,MAAM,SAAS,aAAa;IAC9B,IAAI,eAAe,MAAM;IAGzB,IAAI,MAAM,WAAW,eAAe,CAAC,YAAY,CAAC,SAAS;KACzD,IAAI,CAAC,qBAAqB,GAAG,yBAAyB;KACtD;IACF;IAGA,IAAI,MAAM;IACV,IAAI,UACF,OAAO,SAAS;SACX,IAAI,MAAM,WAAW,SAC1B,OAAO,OAAO;SACT,IAAI,oBAAoB,MAAM,WAAW,YAE9C,OAAO,WAAW;SACb,KAAK,MAAM,WAAW,aAAa,YAAY,CAAC,kBACrD,OAAO,SAAS;SAEhB,OAAO,WAAW;GAEtB;EACF,CAAC;EAGD,MAAM,SAAS,QAAQ;EACvB,MAAM,mBAAmB,QAAQ,cAAc,QAAQ,SAAS,cAAc;EAC9E,IAAI;EACJ,IAAI;GACF,IAAI,QAAQ,IAAI;IACd,MAAM,WAAW,MAAM,cAAc,SAAS,OAAO,IAAI,gBAAgB;IACzE,IAAI,WAAW,UAAU,OAAO,KAAK,SAAS,KAAK;IACnD,mBAAmB,SAAS;GAC9B,OAAO,IAAI,QAAQ,gBAAgB;IACjC,MAAM,UAAU,MAAM,QAAQ,OAAO,KAAK,mBAAmB,EAAE,cAAc,KAAK,IAAI,KAAA,CAAS;IAC/F,MAAM,kBAAkB,mBACpB,QAAQ,QAAO,cAAa,UAAU,eAAe,gBAAgB,IACrE;IACJ,IAAI,gBAAgB,SAAS,GAC3B,mBAAmB,CAAC,GAAG,eAAe,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAE;GAE9G;EACF,SAAS,KAAK;GACZ,OAAO,KAAK,6BAA8B,IAAc,SAAS;EACnE;EAGA,MAAM,0BAA0B,QAAQ,oBAAoB,QAAQ,KAAK;EACzE,MAAM,iBAAiB,QAAQ,SAAS,QAAQ,eAAe,QAAQ,KAAK,IAAI,IAAI,KAAA;EACpF,MAAM,2BAA2B,iBAAiB,QAAQ,eAAe,kBAAkB,KAAA;EAI3F,MAAM,iBAAiB,QAAQ,OAC3B,QAAQ,QACP,QAAQ,UAAU,QAAQ,QAAQ,CAAC,0BAA0B,2BAA2B,KAAA;EAE7F,MAAM,cAAc,QAAQ,QAAQ,SAAS;EAC7C,IAAI;GACF,IAAI,QAAQ,QAAQ,CAAC,WAAW,UAAU,CAAC,CAAC,MAAK,SAAQ,KAAK,OAAO,QAAQ,IAAI,GAC/E,OAAO,KAAK,kBAAkB,QAAQ,KAAK,EAAE;GAG/C,IAAI,gBAAgB;IAElB,MAAM,SAAQ,MADU,WAAW,oBAAoB,EAAA,CAC/B,MAAK,UAAS,MAAM,OAAO,cAAc;IACjE,IAAI,CAAC,OAAO;KACV,IAAI,gBAAgB,QAAQ,OAAO,KAAK,mBAAmB,eAAe,EAAE;KAC5E,OAAO,KAAK,kBAAkB,eAAe,yBAAyB,eAAe,EAAE;IACzF;IACA,IAAI,CAAC,MAAM,WAAW;KACpB,MAAM,UAAU,MAAM,eAAe,QAAQ,MAAM,aAAa,uBAAuB;KACvF,IAAI,gBAAgB,QAAQ,OAAO,KAAK,UAAU,eAAe,8BAA8B,SAAS;KACxG,OAAO,KAAK,UAAU,eAAe,WAAW,eAAe,8BAA8B,SAAS;IACxG;GACF;EACF,SAAS,KAAK;GACZ,OAAO,KAAK,iCAAkC,IAAc,SAAS;EACvE;EAGA,IAAI;GACF,IAAI,QAAQ,YACV,MAAM,WAAW,cAAc,SAAS,EAAE,YAAY,QAAQ,WAAW,CAAC;EAE9E,SAAS,KAAK;GACZ,OAAO,KAAK,8BAA+B,IAAc,SAAS;EACpE;EAGA,IAAI;GACF,IAAI,kBACF,MAAM,QAAQ,OAAO,OAAO,EAAE,UAAU,iBAAiB,CAAC;QACrD,IAAI,CAAC,QAAQ,OAClB,MAAM,QAAQ,OAAO,OAAO;EAEhC,SAAS,KAAK;GACZ,OAAO,KAAK,4BAA6B,IAAc,SAAS;EAClE;EAGA,IAAI,QAAQ,OACV,IAAI;GACF,MAAM,QAAQ,OAAO,MAAM;EAC7B,SAAS,KAAK;GACZ,OAAO,KAAK,2BAA4B,IAAc,SAAS;EACjE;EAIF,IAAI;GACF,IAAI,QAAQ,MACV,MAAM,QAAQ,KAAK,OAAO,EAAE,QAAQ,QAAQ,KAAK,CAAC;GAEpD,IAAI;GACJ,IAAI,QAAQ,MAAM;IAGhB,MAAM,aAAa,QAAQ,QAAQ,QAAQ,KAAK,IAAI;IACpD,MAAM,gBAAgB,QAAQ,KAAK,QAAQ,UAAU;IACrD,IAAI,CAAC,eACH,OAAO,KAAK,eAAe,QAAQ,KAAK,GAAG,qBAAqB,WAAW,MAAM;IAGnF,MAAM,SAAQ,MADU,WAAW,oBAAoB,EAAA,CAC/B,MAAK,UAAS,MAAM,OAAO,cAAc,OAAO;IACxE,IAAI,CAAC,OACH,OAAO,KAAK,kBAAkB,cAAc,QAAQ,eAAe,QAAQ,KAAK,GAAG,EAAE;IAEvF,IAAI,CAAC,MAAM,WAAW;KACpB,MAAM,UAAU,MAAM,eAAe,QAAQ,MAAM,aAAa,uBAAuB;KACvF,OAAO,KACL,UAAU,cAAc,QAAQ,WAAW,QAAQ,KAAK,GAAG,8BAA8B,SAC3F;IACF;IACA,cAAc,cAAc;IAI5B,MAAM,QAAQ,OAAO,WAAW;KAAE,KAAK;KAAiC,OAAO,QAAQ,KAAK;IAAG,CAAC;IAChG,MAAM,QAAQ,OAAO,WAAW;KAAE,KAAK;KAA0B,OAAO,KAAA;IAAU,CAAC;IACnF,KAAK,MAAM,CAAC,WAAW,YAAY,OAAO,QAAQ,cAAc,kBAAkB,CAAC,CAAC,GAClF,MAAM,QAAQ,UAAU,MAAM,IAAI;KAAE;KAAS;IAAU,CAAC;IAE1D,MAAM,QAAQ,MAAM,IAAI;KACtB,YAAY,cAAc;MACzB,2BAA2B;IAC9B,CAA+B;GACjC;GACA,MAAM,iBAAiB,kBAAkB;GACzC,IAAI,gBACF,MAAM,QAAQ,MAAM,OAAO,cAAc;GAK3C,QAAQ,MAAM,YAAY;GAC1B,IAAI,QAAQ,eACV,MAAM,QAAQ,MAAM,IAAI,EAAE,eAAe,QAAQ,cAAc,CAA+B;EAElG,SAAS,KAAK;GACZ,OAAO,KAAK,+BAAgC,IAAc,SAAS;EACrE;EAGA,IAAI,QAAQ,OACV,IAAI;GACF,MAAM,QAAQ,OAAO,OAAO,EAAE,OAAO,QAAQ,MAAM,CAAC;EACtD,SAAS,KAAK;GACZ,OAAO,KAAK,+BAAgC,IAAc,SAAS;EACrE;EAIF,IAAI;GACF,IAAI,MAAM;IACR,MAAM,WAAW,QAAQ,OAAO,MAAM;IACtC,IAAI,CAAC,YAAY,CAAE,MAAM,QAAQ,OAAO,QAAQ,EAAE,SAAS,CAAC,GAC1D,MAAM,QAAQ,OAAO,OAAO;IAG9B,MAAM,cAAc,KAAK,eAAe,IAAI,YAAY;IACxD,MAAM,QAAQ;KACZ;KACA;KACA;KACA,kBAAkB;IACpB;IACA,MAAM,YAAY,MAAM,YAAY,QAAQ,OAAO,KAAK,WAAW,KAAK,cAAc,KAAK,OAAO;IAClG,IAAI,CAAC,WAAW,OAAO,KAAK,qBAAqB;IAGjD,MAAM,YAAY,MADJ,WAAW,gBAAgB,OACb,CAAC,CAAC,aAAa,EAAE,UAAU,QAAQ,OAAO,MAAM,EAAG,CAAC;IAChF,IAAI,CAAC,aAAa,UAAU,OAAO,UAAU,IAC3C,OAAO,KAAK,8DAA8D;IAG5E,MAAM,YAAY,aAAa,KAAK;IACpC,IAAI,CAAC,SAAS,MAAM,QAAQ,WAAW,yBAAyB,SAAS,CAAC,CAAC,CAAC;GAC9E,OAAO;IACL,IAAI,CAAC,QAAQ,QAAQ,OAAO,KAAK,+BAA+B;IAChE,MAAM,QAAQ,YAAY,EAAE,SAAS,QAAQ,OAAO,CAAC;GACvD;EACF,SAAS,KAAK;GACZ,IACE,+BAA+B,GAAG,KACjC,eAAe,SAAS,IAAI,SAAS,iBAAiB,WAAW,YAAY,QAAQ,QAAQ,UAE9F,OAAO,OAAO,WAAW,YAAY,mBAAmB,cAAc,SAAS;GAEjF,OAAO,KAAK,wBAAyB,IAAc,SAAS;EAC9D;CACF,EAAA,CAAG;CAEH,OAAO;EACL;EACA;EACA,CAAC,OAAO,iBAAsD;GAC5D,OAAO,MAAM,OAAO,cAAc,CAAC;EACrC;CACF;AACF"}
@@ -11,7 +11,9 @@ async function executeHook(hook, stdinPayload) {
11
11
  const startTime = Date.now();
12
12
  return new Promise((resolve) => {
13
13
  const isWindows = process.platform === "win32";
14
- const child = spawn(isWindows ? "cmd" : "/bin/sh", isWindows ? ["/c", hook.command] : ["-c", hook.command], {
14
+ const shell = isWindows ? "cmd" : "/bin/sh";
15
+ const shellArgs = isWindows ? ["/c", hook.command] : ["-c", hook.command];
16
+ const child = spawn(shell, shellArgs, {
15
17
  stdio: [
16
18
  "pipe",
17
19
  "pipe",
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","names":[],"sources":["../../src/hooks/executor.ts"],"sourcesContent":["/**\n * Hook process execution.\n * Spawns shell commands, handles stdin/stdout/exit-code protocol.\n */\n\nimport { spawn } from 'node:child_process';\nimport type { HookDefinition, HookStdin, HookResult, HookStdout, HookEventResult } from './types.js';\nimport { isBlockingEvent } from './types.js';\n\nconst DEFAULT_TIMEOUT = 10_000;\n\nexport async function executeHook(hook: HookDefinition, stdinPayload: HookStdin): Promise<HookResult> {\n const timeout = hook.timeout ?? DEFAULT_TIMEOUT;\n const startTime = Date.now();\n\n return new Promise<HookResult>(resolve => {\n const isWindows = process.platform === 'win32';\n const shell = isWindows ? 'cmd' : '/bin/sh';\n const shellArgs = isWindows ? ['/c', hook.command] : ['-c', hook.command];\n\n const child = spawn(shell, shellArgs, {\n stdio: ['pipe', 'pipe', 'pipe'],\n cwd: stdinPayload.cwd,\n // Without this, Node's default Windows argument escaping re-quotes\n // hook.command before cmd.exe ever sees it, so a quoted path (or any\n // path containing spaces) reaches the child process with literal \"\n // characters embedded in it. mastracode/tui's shell-runner.ts already\n // sets this for its own cmd invocations; this call site just missed it.\n ...(isWindows ? { windowsVerbatimArguments: true } : {}),\n env: {\n ...process.env,\n MASTRA_HOOK_EVENT: stdinPayload.hook_event_name,\n },\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n let resolved = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill('SIGKILL');\n }, timeout);\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', exitCode => {\n clearTimeout(timer);\n if (resolved) return;\n resolved = true;\n\n let parsedStdout: HookStdout | undefined;\n if (stdout.trim()) {\n try {\n parsedStdout = JSON.parse(stdout.trim()) as HookStdout;\n } catch {\n // Not valid JSON — ignore\n }\n }\n\n resolve({\n hook,\n exitCode: exitCode ?? 1,\n stdout: parsedStdout,\n stderr: stderr.trim() || undefined,\n timedOut,\n durationMs: Date.now() - startTime,\n });\n });\n\n child.on('error', error => {\n clearTimeout(timer);\n if (resolved) return;\n resolved = true;\n\n resolve({\n hook,\n exitCode: 1,\n stderr: error.message,\n timedOut: false,\n durationMs: Date.now() - startTime,\n });\n });\n\n // A hook that never reads stdin (or exits before we finish writing) closes\n // the pipe under us. That surfaces asynchronously as an EPIPE 'error' event\n // on the socket, which Node escalates to an unhandled error — taking the\n // whole host process down — unless something is listening. The hook's real\n // outcome still arrives via 'close', so absorb it.\n child.stdin?.on('error', () => {});\n\n try {\n child.stdin?.write(JSON.stringify(stdinPayload));\n child.stdin?.end();\n } catch {\n // Synchronous stdin write failure — process continues\n }\n });\n}\n\nexport function matchesHook(hook: HookDefinition, context: { tool_name?: string }): boolean {\n if (!hook.matcher) return true;\n\n if (hook.matcher.tool_name) {\n if (!context.tool_name) return false;\n try {\n return new RegExp(hook.matcher.tool_name).test(context.tool_name);\n } catch {\n return false;\n }\n }\n\n return true;\n}\n\nexport async function runHooksForEvent(\n hooks: HookDefinition[],\n stdinPayload: HookStdin,\n matchContext: { tool_name?: string } = {},\n): Promise<HookEventResult> {\n const results: HookResult[] = [];\n const warnings: string[] = [];\n let additionalContext: string | undefined;\n\n const applicable = hooks.filter(h => matchesHook(h, matchContext));\n if (applicable.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const blocking = isBlockingEvent(stdinPayload.hook_event_name);\n\n for (const hook of applicable) {\n const result = await executeHook(hook, stdinPayload);\n results.push(result);\n\n if (result.stdout?.additionalContext) {\n additionalContext = additionalContext\n ? `${additionalContext}\\n${result.stdout.additionalContext}`\n : result.stdout.additionalContext;\n }\n\n if (result.timedOut) {\n warnings.push(`Hook timed out after ${hook.timeout ?? DEFAULT_TIMEOUT}ms: ${hook.command}`);\n continue;\n }\n\n if (result.exitCode === 2 && blocking) {\n const reason = result.stdout?.reason || result.stderr || `Blocked by hook: ${hook.description || hook.command}`;\n\n return {\n allowed: false,\n blockReason: reason,\n additionalContext,\n results,\n warnings,\n };\n }\n\n if (result.exitCode === 0) continue;\n\n const warnMsg = result.stderr || `Hook exited with code ${result.exitCode}`;\n warnings.push(`${hook.description || hook.command}: ${warnMsg}`);\n }\n\n return { allowed: true, additionalContext, results, warnings };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"executor.js","names":[],"sources":["../../src/hooks/executor.ts"],"sourcesContent":["/**\n * Hook process execution.\n * Spawns shell commands, handles stdin/stdout/exit-code protocol.\n */\n\nimport { spawn } from 'node:child_process';\nimport type { HookDefinition, HookStdin, HookResult, HookStdout, HookEventResult } from './types.js';\nimport { isBlockingEvent } from './types.js';\n\nconst DEFAULT_TIMEOUT = 10_000;\n\nexport async function executeHook(hook: HookDefinition, stdinPayload: HookStdin): Promise<HookResult> {\n const timeout = hook.timeout ?? DEFAULT_TIMEOUT;\n const startTime = Date.now();\n\n return new Promise<HookResult>(resolve => {\n const isWindows = process.platform === 'win32';\n const shell = isWindows ? 'cmd' : '/bin/sh';\n const shellArgs = isWindows ? ['/c', hook.command] : ['-c', hook.command];\n\n const child = spawn(shell, shellArgs, {\n stdio: ['pipe', 'pipe', 'pipe'],\n cwd: stdinPayload.cwd,\n // Without this, Node's default Windows argument escaping re-quotes\n // hook.command before cmd.exe ever sees it, so a quoted path (or any\n // path containing spaces) reaches the child process with literal \"\n // characters embedded in it. mastracode/tui's shell-runner.ts already\n // sets this for its own cmd invocations; this call site just missed it.\n ...(isWindows ? { windowsVerbatimArguments: true } : {}),\n env: {\n ...process.env,\n MASTRA_HOOK_EVENT: stdinPayload.hook_event_name,\n },\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n let resolved = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill('SIGKILL');\n }, timeout);\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', exitCode => {\n clearTimeout(timer);\n if (resolved) return;\n resolved = true;\n\n let parsedStdout: HookStdout | undefined;\n if (stdout.trim()) {\n try {\n parsedStdout = JSON.parse(stdout.trim()) as HookStdout;\n } catch {\n // Not valid JSON — ignore\n }\n }\n\n resolve({\n hook,\n exitCode: exitCode ?? 1,\n stdout: parsedStdout,\n stderr: stderr.trim() || undefined,\n timedOut,\n durationMs: Date.now() - startTime,\n });\n });\n\n child.on('error', error => {\n clearTimeout(timer);\n if (resolved) return;\n resolved = true;\n\n resolve({\n hook,\n exitCode: 1,\n stderr: error.message,\n timedOut: false,\n durationMs: Date.now() - startTime,\n });\n });\n\n // A hook that never reads stdin (or exits before we finish writing) closes\n // the pipe under us. That surfaces asynchronously as an EPIPE 'error' event\n // on the socket, which Node escalates to an unhandled error — taking the\n // whole host process down — unless something is listening. The hook's real\n // outcome still arrives via 'close', so absorb it.\n child.stdin?.on('error', () => {});\n\n try {\n child.stdin?.write(JSON.stringify(stdinPayload));\n child.stdin?.end();\n } catch {\n // Synchronous stdin write failure — process continues\n }\n });\n}\n\nexport function matchesHook(hook: HookDefinition, context: { tool_name?: string }): boolean {\n if (!hook.matcher) return true;\n\n if (hook.matcher.tool_name) {\n if (!context.tool_name) return false;\n try {\n return new RegExp(hook.matcher.tool_name).test(context.tool_name);\n } catch {\n return false;\n }\n }\n\n return true;\n}\n\nexport async function runHooksForEvent(\n hooks: HookDefinition[],\n stdinPayload: HookStdin,\n matchContext: { tool_name?: string } = {},\n): Promise<HookEventResult> {\n const results: HookResult[] = [];\n const warnings: string[] = [];\n let additionalContext: string | undefined;\n\n const applicable = hooks.filter(h => matchesHook(h, matchContext));\n if (applicable.length === 0) {\n return { allowed: true, results: [], warnings: [] };\n }\n\n const blocking = isBlockingEvent(stdinPayload.hook_event_name);\n\n for (const hook of applicable) {\n const result = await executeHook(hook, stdinPayload);\n results.push(result);\n\n if (result.stdout?.additionalContext) {\n additionalContext = additionalContext\n ? `${additionalContext}\\n${result.stdout.additionalContext}`\n : result.stdout.additionalContext;\n }\n\n if (result.timedOut) {\n warnings.push(`Hook timed out after ${hook.timeout ?? DEFAULT_TIMEOUT}ms: ${hook.command}`);\n continue;\n }\n\n if (result.exitCode === 2 && blocking) {\n const reason = result.stdout?.reason || result.stderr || `Blocked by hook: ${hook.description || hook.command}`;\n\n return {\n allowed: false,\n blockReason: reason,\n additionalContext,\n results,\n warnings,\n };\n }\n\n if (result.exitCode === 0) continue;\n\n const warnMsg = result.stderr || `Hook exited with code ${result.exitCode}`;\n warnings.push(`${hook.description || hook.command}: ${warnMsg}`);\n }\n\n return { allowed: true, additionalContext, results, warnings };\n}\n"],"mappings":"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"}
@@ -86,49 +86,55 @@ var HookManager = class {
86
86
  async runPreToolUse(toolName, toolInput) {
87
87
  const hooks = this.config.PreToolUse;
88
88
  if (!hooks || hooks.length === 0) return emptyResult();
89
- return runHooksForEvent(hooks, {
89
+ const stdin = {
90
90
  ...this.baseStdinFields("PreToolUse"),
91
91
  tool_name: toolName,
92
92
  tool_input: toolInput
93
- }, { tool_name: toolName });
93
+ };
94
+ return runHooksForEvent(hooks, stdin, { tool_name: toolName });
94
95
  }
95
96
  async runPostToolUse(toolName, toolInput, toolOutput, toolError) {
96
97
  const hooks = this.config.PostToolUse;
97
98
  if (!hooks || hooks.length === 0) return emptyResult();
98
- return runHooksForEvent(hooks, {
99
+ const stdin = {
99
100
  ...this.baseStdinFields("PostToolUse"),
100
101
  tool_name: toolName,
101
102
  tool_input: toolInput,
102
103
  tool_output: toolOutput,
103
104
  tool_error: toolError
104
- }, { tool_name: toolName });
105
+ };
106
+ return runHooksForEvent(hooks, stdin, { tool_name: toolName });
105
107
  }
106
108
  async runUserPromptSubmit(userMessage) {
107
109
  const hooks = this.config.UserPromptSubmit;
108
110
  if (!hooks || hooks.length === 0) return emptyResult();
109
- return runHooksForEvent(hooks, {
111
+ const stdin = {
110
112
  ...this.baseStdinFields("UserPromptSubmit"),
111
113
  user_message: userMessage
112
- });
114
+ };
115
+ return runHooksForEvent(hooks, stdin);
113
116
  }
114
117
  async runStop(assistantMessage, stopReason) {
115
118
  const hooks = this.config.Stop;
116
119
  if (!hooks || hooks.length === 0) return emptyResult();
117
- return runHooksForEvent(hooks, {
120
+ const stdin = {
118
121
  ...this.baseStdinFields("Stop"),
119
122
  assistant_message: assistantMessage,
120
123
  stop_reason: stopReason
121
- });
124
+ };
125
+ return runHooksForEvent(hooks, stdin);
122
126
  }
123
127
  async runSessionStart() {
124
128
  const hooks = this.config.SessionStart;
125
129
  if (!hooks || hooks.length === 0) return emptyResult();
126
- return runHooksForEvent(hooks, this.sessionStdin("SessionStart"));
130
+ const stdin = this.sessionStdin("SessionStart");
131
+ return runHooksForEvent(hooks, stdin);
127
132
  }
128
133
  async runSessionEnd() {
129
134
  const hooks = this.config.SessionEnd;
130
135
  if (!hooks || hooks.length === 0) return emptyResult();
131
- return runHooksForEvent(hooks, this.sessionStdin("SessionEnd"));
136
+ const stdin = this.sessionStdin("SessionEnd");
137
+ return runHooksForEvent(hooks, stdin);
132
138
  }
133
139
  /**
134
140
  * Fire notification hooks (non-blocking, fire-and-forget).
@@ -137,53 +143,57 @@ var HookManager = class {
137
143
  runNotification(reason, message) {
138
144
  const hooks = this.config.Notification;
139
145
  if (!hooks || hooks.length === 0) return;
140
- runHooksForEvent(hooks, {
146
+ const stdin = {
141
147
  ...this.baseStdinFields("Notification"),
142
148
  reason,
143
149
  message
144
- }).catch(() => {});
150
+ };
151
+ runHooksForEvent(hooks, stdin).catch(() => {});
145
152
  }
146
153
  async runAgentStart() {
147
154
  const hooks = this.config.AgentStart;
148
155
  if (!hooks || hooks.length === 0) return emptyResult();
149
156
  const runId = this.runId;
150
157
  if (!runId) return emptyResult();
151
- return runHooksForEvent(hooks, {
158
+ const stdin = {
152
159
  ...this.baseStdinFields("AgentStart"),
153
160
  run_id: runId
154
- });
161
+ };
162
+ return runHooksForEvent(hooks, stdin);
155
163
  }
156
164
  async runAgentEnd(stopReason) {
157
165
  const hooks = this.config.AgentEnd;
158
166
  if (!hooks || hooks.length === 0) return emptyResult();
159
167
  const runId = this.runId;
160
168
  if (!runId) return emptyResult();
161
- return runHooksForEvent(hooks, {
169
+ const stdin = {
162
170
  ...this.baseStdinFields("AgentEnd"),
163
171
  run_id: runId,
164
172
  stop_reason: stopReason
165
- });
173
+ };
174
+ return runHooksForEvent(hooks, stdin);
166
175
  }
167
176
  async runPermissionRequest(permissionKind, toolCallId, toolName, toolInput) {
168
177
  const hooks = this.config.PermissionRequest;
169
178
  if (!hooks || hooks.length === 0) return emptyResult();
170
179
  const runId = this.runId;
171
180
  if (!runId) return emptyResult();
172
- return runHooksForEvent(hooks, {
181
+ const stdin = {
173
182
  ...this.baseStdinFields("PermissionRequest"),
174
183
  run_id: runId,
175
184
  permission_kind: permissionKind,
176
185
  tool_call_id: toolCallId,
177
186
  tool_name: toolName,
178
187
  ...toolInput !== void 0 ? { tool_input: toolInput } : {}
179
- });
188
+ };
189
+ return runHooksForEvent(hooks, stdin);
180
190
  }
181
191
  async runPermissionResult(permissionKind, toolCallId, toolName, decision, toolInput) {
182
192
  const hooks = this.config.PermissionResult;
183
193
  if (!hooks || hooks.length === 0) return emptyResult();
184
194
  const runId = this.runId;
185
195
  if (!runId) return emptyResult();
186
- return runHooksForEvent(hooks, {
196
+ const stdin = {
187
197
  ...this.baseStdinFields("PermissionResult"),
188
198
  run_id: runId,
189
199
  permission_kind: permissionKind,
@@ -191,25 +201,27 @@ var HookManager = class {
191
201
  tool_name: toolName,
192
202
  decision,
193
203
  ...toolInput !== void 0 ? { tool_input: toolInput } : {}
194
- });
204
+ };
205
+ return runHooksForEvent(hooks, stdin);
195
206
  }
196
207
  async runInterrupt(reason) {
197
208
  const hooks = this.config.Interrupt;
198
209
  if (!hooks || hooks.length === 0) return emptyResult();
199
210
  const runId = this.runId;
200
211
  if (!runId) return emptyResult();
201
- return runHooksForEvent(hooks, {
212
+ const stdin = {
202
213
  ...this.baseStdinFields("Interrupt"),
203
214
  run_id: runId,
204
215
  reason
205
- });
216
+ };
217
+ return runHooksForEvent(hooks, stdin);
206
218
  }
207
219
  async runSubagentStart(toolCallId, agentType, task, modelId, forked) {
208
220
  const hooks = this.config.SubagentStart;
209
221
  if (!hooks || hooks.length === 0) return emptyResult();
210
222
  const runId = this.runId;
211
223
  if (!runId) return emptyResult();
212
- return runHooksForEvent(hooks, {
224
+ const stdin = {
213
225
  ...this.baseStdinFields("SubagentStart"),
214
226
  run_id: runId,
215
227
  tool_call_id: toolCallId,
@@ -217,14 +229,15 @@ var HookManager = class {
217
229
  task,
218
230
  ...modelId !== void 0 ? { model_id: modelId } : {},
219
231
  ...forked !== void 0 ? { forked } : {}
220
- });
232
+ };
233
+ return runHooksForEvent(hooks, stdin);
221
234
  }
222
235
  async runSubagentEnd(toolCallId, agentType, result, isError, durationMs) {
223
236
  const hooks = this.config.SubagentEnd;
224
237
  if (!hooks || hooks.length === 0) return emptyResult();
225
238
  const runId = this.runId;
226
239
  if (!runId) return emptyResult();
227
- return runHooksForEvent(hooks, {
240
+ const stdin = {
228
241
  ...this.baseStdinFields("SubagentEnd"),
229
242
  run_id: runId,
230
243
  tool_call_id: toolCallId,
@@ -232,7 +245,8 @@ var HookManager = class {
232
245
  result,
233
246
  is_error: isError,
234
247
  duration_ms: durationMs
235
- });
248
+ };
249
+ return runHooksForEvent(hooks, stdin);
236
250
  }
237
251
  };
238
252
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","names":[],"sources":["../../src/hooks/manager.ts"],"sourcesContent":["/**\n * HookManager — high-level orchestration for the hooks system.\n * Created once at startup, provides methods for each lifecycle event.\n */\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\nimport { loadHooksConfig, getProjectHooksPath, getGlobalHooksPath } from './config.js';\nimport { runHooksForEvent } from './executor.js';\nimport type {\n HooksConfig,\n HookEventResult,\n HookEventName,\n HookStdinToolEvent,\n HookStdinUserPrompt,\n HookStdinStop,\n HookStdinSession,\n HookStdinNotification,\n HookStdinAgentStart,\n HookStdinAgentEnd,\n HookStdinPermissionRequest,\n HookStdinPermissionResult,\n HookStdinInterrupt,\n HookStdinSubagentStart,\n HookStdinSubagentEnd,\n PermissionKind,\n PermissionDecision,\n InterruptReason,\n SessionWorktreeInfo,\n} from './types.js';\n\nconst emptyResult = (): HookEventResult => ({ allowed: true, results: [], warnings: [] });\n\nexport class HookManager {\n private config: HooksConfig;\n private projectDir: string;\n private sessionId: string;\n private configDirName: string;\n private homeDir?: string;\n private runId?: string;\n private worktree?: SessionWorktreeInfo;\n\n constructor(\n projectDir: string,\n sessionId: string,\n configDirName = DEFAULT_CONFIG_DIR,\n homeDir?: string,\n worktree?: SessionWorktreeInfo,\n ) {\n this.worktree = worktree;\n this.projectDir = projectDir;\n this.sessionId = sessionId;\n this.configDirName = configDirName;\n this.homeDir = homeDir;\n this.config = loadHooksConfig(projectDir, configDirName, homeDir);\n }\n\n reload(): void {\n this.config = loadHooksConfig(this.projectDir, this.configDirName, this.homeDir);\n }\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n /** Set the active agent run id. Included as `run_id` in all hook stdin while a run is active. */\n setRunId(runId: string): void {\n this.runId = runId;\n }\n\n /** Clear the active run id. Call only after end-of-run hooks (AgentEnd, Stop) have been dispatched. */\n clearRunId(): void {\n this.runId = undefined;\n }\n\n getRunId(): string | undefined {\n return this.runId;\n }\n\n hasHooks(): boolean {\n return Object.keys(this.config).length > 0;\n }\n\n getConfig(): HooksConfig {\n return this.config;\n }\n\n getConfigPaths(): { project: string; global: string } {\n return {\n project: getProjectHooksPath(this.projectDir, this.configDirName),\n global: getGlobalHooksPath(this.configDirName, this.homeDir),\n };\n }\n\n // =========================================================================\n // Stdin Helpers\n // =========================================================================\n\n /**\n * Build the common stdin base fields. `run_id` is included when an active run\n * is set, so every event dispatched during a run carries the same identifier.\n */\n private baseStdinFields<T extends HookEventName>(\n hook_event_name: T,\n ): {\n session_id: string;\n cwd: string;\n hook_event_name: T;\n run_id?: string;\n } {\n const base: { session_id: string; cwd: string; hook_event_name: T; run_id?: string } = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name,\n };\n if (this.runId) base.run_id = this.runId;\n return base;\n }\n\n /**\n * Session stdin, carrying worktree identity when there is one. Emitted on both\n * session events so a hook that provisions on start can tear down on end using\n * the same fields.\n */\n private sessionStdin(hook_event_name: 'SessionStart' | 'SessionEnd'): HookStdinSession {\n const stdin: HookStdinSession = this.baseStdinFields(hook_event_name);\n if (this.worktree) {\n stdin.worktree_path = this.worktree.path;\n if (this.worktree.branch) stdin.branch = this.worktree.branch;\n if (this.worktree.mainRepoPath) stdin.main_repo_path = this.worktree.mainRepoPath;\n }\n return stdin;\n }\n\n // =========================================================================\n // Blocking Event Methods (decisions enforced by callers)\n // =========================================================================\n\n async runPreToolUse(toolName: string, toolInput: unknown): Promise<HookEventResult> {\n const hooks = this.config.PreToolUse;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinToolEvent = {\n ...this.baseStdinFields('PreToolUse'),\n tool_name: toolName,\n tool_input: toolInput,\n };\n\n return runHooksForEvent(hooks, stdin, { tool_name: toolName });\n }\n\n async runPostToolUse(\n toolName: string,\n toolInput: unknown,\n toolOutput: unknown,\n toolError: boolean,\n ): Promise<HookEventResult> {\n const hooks = this.config.PostToolUse;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinToolEvent = {\n ...this.baseStdinFields('PostToolUse'),\n tool_name: toolName,\n tool_input: toolInput,\n tool_output: toolOutput,\n tool_error: toolError,\n };\n\n return runHooksForEvent(hooks, stdin, { tool_name: toolName });\n }\n\n async runUserPromptSubmit(userMessage: string): Promise<HookEventResult> {\n const hooks = this.config.UserPromptSubmit;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinUserPrompt = {\n ...this.baseStdinFields('UserPromptSubmit'),\n user_message: userMessage,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runStop(\n assistantMessage: string | undefined,\n stopReason: 'complete' | 'aborted' | 'error',\n ): Promise<HookEventResult> {\n const hooks = this.config.Stop;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinStop = {\n ...this.baseStdinFields('Stop'),\n assistant_message: assistantMessage,\n stop_reason: stopReason,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runSessionStart(): Promise<HookEventResult> {\n const hooks = this.config.SessionStart;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinSession = this.sessionStdin('SessionStart');\n\n return runHooksForEvent(hooks, stdin);\n }\n async runSessionEnd(): Promise<HookEventResult> {\n const hooks = this.config.SessionEnd;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinSession = this.sessionStdin('SessionEnd');\n\n return runHooksForEvent(hooks, stdin);\n }\n\n /**\n * Fire notification hooks (non-blocking, fire-and-forget).\n * Called when the TUI is waiting for user input.\n */\n runNotification(reason: string, message?: string): void {\n const hooks = this.config.Notification;\n if (!hooks || hooks.length === 0) return;\n\n const stdin: HookStdinNotification = {\n ...this.baseStdinFields('Notification'),\n reason,\n message,\n };\n\n // Fire-and-forget — don't await\n runHooksForEvent(hooks, stdin).catch(() => {});\n }\n\n // =========================================================================\n // Lifecycle Event Methods (non-blocking: observe behavior, never enforce)\n // =========================================================================\n\n async runAgentStart(): Promise<HookEventResult> {\n const hooks = this.config.AgentStart;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinAgentStart = {\n ...this.baseStdinFields('AgentStart'),\n run_id: runId,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runAgentEnd(stopReason: 'complete' | 'aborted' | 'error' | 'suspended'): Promise<HookEventResult> {\n const hooks = this.config.AgentEnd;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinAgentEnd = {\n ...this.baseStdinFields('AgentEnd'),\n run_id: runId,\n stop_reason: stopReason,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runPermissionRequest(\n permissionKind: PermissionKind,\n toolCallId: string,\n toolName: string,\n toolInput?: unknown,\n ): Promise<HookEventResult> {\n const hooks = this.config.PermissionRequest;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinPermissionRequest = {\n ...this.baseStdinFields('PermissionRequest'),\n run_id: runId,\n permission_kind: permissionKind,\n tool_call_id: toolCallId,\n tool_name: toolName,\n ...(toolInput !== undefined ? { tool_input: toolInput } : {}),\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runPermissionResult(\n permissionKind: PermissionKind,\n toolCallId: string,\n toolName: string,\n decision: PermissionDecision,\n toolInput?: unknown,\n ): Promise<HookEventResult> {\n const hooks = this.config.PermissionResult;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinPermissionResult = {\n ...this.baseStdinFields('PermissionResult'),\n run_id: runId,\n permission_kind: permissionKind,\n tool_call_id: toolCallId,\n tool_name: toolName,\n decision,\n ...(toolInput !== undefined ? { tool_input: toolInput } : {}),\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runInterrupt(reason: InterruptReason): Promise<HookEventResult> {\n const hooks = this.config.Interrupt;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinInterrupt = {\n ...this.baseStdinFields('Interrupt'),\n run_id: runId,\n reason,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runSubagentStart(\n toolCallId: string,\n agentType: string,\n task: string,\n modelId?: string,\n forked?: boolean,\n ): Promise<HookEventResult> {\n const hooks = this.config.SubagentStart;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinSubagentStart = {\n ...this.baseStdinFields('SubagentStart'),\n run_id: runId,\n tool_call_id: toolCallId,\n agent_type: agentType,\n task,\n ...(modelId !== undefined ? { model_id: modelId } : {}),\n ...(forked !== undefined ? { forked } : {}),\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runSubagentEnd(\n toolCallId: string,\n agentType: string,\n result: unknown,\n isError: boolean,\n durationMs: number,\n ): Promise<HookEventResult> {\n const hooks = this.config.SubagentEnd;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinSubagentEnd = {\n ...this.baseStdinFields('SubagentEnd'),\n run_id: runId,\n tool_call_id: toolCallId,\n agent_type: agentType,\n result,\n is_error: isError,\n duration_ms: durationMs,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","names":[],"sources":["../../src/hooks/manager.ts"],"sourcesContent":["/**\n * HookManager — high-level orchestration for the hooks system.\n * Created once at startup, provides methods for each lifecycle event.\n */\nimport { DEFAULT_CONFIG_DIR } from '../constants.js';\nimport { loadHooksConfig, getProjectHooksPath, getGlobalHooksPath } from './config.js';\nimport { runHooksForEvent } from './executor.js';\nimport type {\n HooksConfig,\n HookEventResult,\n HookEventName,\n HookStdinToolEvent,\n HookStdinUserPrompt,\n HookStdinStop,\n HookStdinSession,\n HookStdinNotification,\n HookStdinAgentStart,\n HookStdinAgentEnd,\n HookStdinPermissionRequest,\n HookStdinPermissionResult,\n HookStdinInterrupt,\n HookStdinSubagentStart,\n HookStdinSubagentEnd,\n PermissionKind,\n PermissionDecision,\n InterruptReason,\n SessionWorktreeInfo,\n} from './types.js';\n\nconst emptyResult = (): HookEventResult => ({ allowed: true, results: [], warnings: [] });\n\nexport class HookManager {\n private config: HooksConfig;\n private projectDir: string;\n private sessionId: string;\n private configDirName: string;\n private homeDir?: string;\n private runId?: string;\n private worktree?: SessionWorktreeInfo;\n\n constructor(\n projectDir: string,\n sessionId: string,\n configDirName = DEFAULT_CONFIG_DIR,\n homeDir?: string,\n worktree?: SessionWorktreeInfo,\n ) {\n this.worktree = worktree;\n this.projectDir = projectDir;\n this.sessionId = sessionId;\n this.configDirName = configDirName;\n this.homeDir = homeDir;\n this.config = loadHooksConfig(projectDir, configDirName, homeDir);\n }\n\n reload(): void {\n this.config = loadHooksConfig(this.projectDir, this.configDirName, this.homeDir);\n }\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n /** Set the active agent run id. Included as `run_id` in all hook stdin while a run is active. */\n setRunId(runId: string): void {\n this.runId = runId;\n }\n\n /** Clear the active run id. Call only after end-of-run hooks (AgentEnd, Stop) have been dispatched. */\n clearRunId(): void {\n this.runId = undefined;\n }\n\n getRunId(): string | undefined {\n return this.runId;\n }\n\n hasHooks(): boolean {\n return Object.keys(this.config).length > 0;\n }\n\n getConfig(): HooksConfig {\n return this.config;\n }\n\n getConfigPaths(): { project: string; global: string } {\n return {\n project: getProjectHooksPath(this.projectDir, this.configDirName),\n global: getGlobalHooksPath(this.configDirName, this.homeDir),\n };\n }\n\n // =========================================================================\n // Stdin Helpers\n // =========================================================================\n\n /**\n * Build the common stdin base fields. `run_id` is included when an active run\n * is set, so every event dispatched during a run carries the same identifier.\n */\n private baseStdinFields<T extends HookEventName>(\n hook_event_name: T,\n ): {\n session_id: string;\n cwd: string;\n hook_event_name: T;\n run_id?: string;\n } {\n const base: { session_id: string; cwd: string; hook_event_name: T; run_id?: string } = {\n session_id: this.sessionId,\n cwd: this.projectDir,\n hook_event_name,\n };\n if (this.runId) base.run_id = this.runId;\n return base;\n }\n\n /**\n * Session stdin, carrying worktree identity when there is one. Emitted on both\n * session events so a hook that provisions on start can tear down on end using\n * the same fields.\n */\n private sessionStdin(hook_event_name: 'SessionStart' | 'SessionEnd'): HookStdinSession {\n const stdin: HookStdinSession = this.baseStdinFields(hook_event_name);\n if (this.worktree) {\n stdin.worktree_path = this.worktree.path;\n if (this.worktree.branch) stdin.branch = this.worktree.branch;\n if (this.worktree.mainRepoPath) stdin.main_repo_path = this.worktree.mainRepoPath;\n }\n return stdin;\n }\n\n // =========================================================================\n // Blocking Event Methods (decisions enforced by callers)\n // =========================================================================\n\n async runPreToolUse(toolName: string, toolInput: unknown): Promise<HookEventResult> {\n const hooks = this.config.PreToolUse;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinToolEvent = {\n ...this.baseStdinFields('PreToolUse'),\n tool_name: toolName,\n tool_input: toolInput,\n };\n\n return runHooksForEvent(hooks, stdin, { tool_name: toolName });\n }\n\n async runPostToolUse(\n toolName: string,\n toolInput: unknown,\n toolOutput: unknown,\n toolError: boolean,\n ): Promise<HookEventResult> {\n const hooks = this.config.PostToolUse;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinToolEvent = {\n ...this.baseStdinFields('PostToolUse'),\n tool_name: toolName,\n tool_input: toolInput,\n tool_output: toolOutput,\n tool_error: toolError,\n };\n\n return runHooksForEvent(hooks, stdin, { tool_name: toolName });\n }\n\n async runUserPromptSubmit(userMessage: string): Promise<HookEventResult> {\n const hooks = this.config.UserPromptSubmit;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinUserPrompt = {\n ...this.baseStdinFields('UserPromptSubmit'),\n user_message: userMessage,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runStop(\n assistantMessage: string | undefined,\n stopReason: 'complete' | 'aborted' | 'error',\n ): Promise<HookEventResult> {\n const hooks = this.config.Stop;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinStop = {\n ...this.baseStdinFields('Stop'),\n assistant_message: assistantMessage,\n stop_reason: stopReason,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runSessionStart(): Promise<HookEventResult> {\n const hooks = this.config.SessionStart;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinSession = this.sessionStdin('SessionStart');\n\n return runHooksForEvent(hooks, stdin);\n }\n async runSessionEnd(): Promise<HookEventResult> {\n const hooks = this.config.SessionEnd;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const stdin: HookStdinSession = this.sessionStdin('SessionEnd');\n\n return runHooksForEvent(hooks, stdin);\n }\n\n /**\n * Fire notification hooks (non-blocking, fire-and-forget).\n * Called when the TUI is waiting for user input.\n */\n runNotification(reason: string, message?: string): void {\n const hooks = this.config.Notification;\n if (!hooks || hooks.length === 0) return;\n\n const stdin: HookStdinNotification = {\n ...this.baseStdinFields('Notification'),\n reason,\n message,\n };\n\n // Fire-and-forget — don't await\n runHooksForEvent(hooks, stdin).catch(() => {});\n }\n\n // =========================================================================\n // Lifecycle Event Methods (non-blocking: observe behavior, never enforce)\n // =========================================================================\n\n async runAgentStart(): Promise<HookEventResult> {\n const hooks = this.config.AgentStart;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinAgentStart = {\n ...this.baseStdinFields('AgentStart'),\n run_id: runId,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runAgentEnd(stopReason: 'complete' | 'aborted' | 'error' | 'suspended'): Promise<HookEventResult> {\n const hooks = this.config.AgentEnd;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinAgentEnd = {\n ...this.baseStdinFields('AgentEnd'),\n run_id: runId,\n stop_reason: stopReason,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runPermissionRequest(\n permissionKind: PermissionKind,\n toolCallId: string,\n toolName: string,\n toolInput?: unknown,\n ): Promise<HookEventResult> {\n const hooks = this.config.PermissionRequest;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinPermissionRequest = {\n ...this.baseStdinFields('PermissionRequest'),\n run_id: runId,\n permission_kind: permissionKind,\n tool_call_id: toolCallId,\n tool_name: toolName,\n ...(toolInput !== undefined ? { tool_input: toolInput } : {}),\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runPermissionResult(\n permissionKind: PermissionKind,\n toolCallId: string,\n toolName: string,\n decision: PermissionDecision,\n toolInput?: unknown,\n ): Promise<HookEventResult> {\n const hooks = this.config.PermissionResult;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinPermissionResult = {\n ...this.baseStdinFields('PermissionResult'),\n run_id: runId,\n permission_kind: permissionKind,\n tool_call_id: toolCallId,\n tool_name: toolName,\n decision,\n ...(toolInput !== undefined ? { tool_input: toolInput } : {}),\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runInterrupt(reason: InterruptReason): Promise<HookEventResult> {\n const hooks = this.config.Interrupt;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinInterrupt = {\n ...this.baseStdinFields('Interrupt'),\n run_id: runId,\n reason,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runSubagentStart(\n toolCallId: string,\n agentType: string,\n task: string,\n modelId?: string,\n forked?: boolean,\n ): Promise<HookEventResult> {\n const hooks = this.config.SubagentStart;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinSubagentStart = {\n ...this.baseStdinFields('SubagentStart'),\n run_id: runId,\n tool_call_id: toolCallId,\n agent_type: agentType,\n task,\n ...(modelId !== undefined ? { model_id: modelId } : {}),\n ...(forked !== undefined ? { forked } : {}),\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n\n async runSubagentEnd(\n toolCallId: string,\n agentType: string,\n result: unknown,\n isError: boolean,\n durationMs: number,\n ): Promise<HookEventResult> {\n const hooks = this.config.SubagentEnd;\n if (!hooks || hooks.length === 0) {\n return emptyResult();\n }\n const runId = this.runId;\n if (!runId) {\n return emptyResult();\n }\n\n const stdin: HookStdinSubagentEnd = {\n ...this.baseStdinFields('SubagentEnd'),\n run_id: runId,\n tool_call_id: toolCallId,\n agent_type: agentType,\n result,\n is_error: isError,\n duration_ms: durationMs,\n };\n\n return runHooksForEvent(hooks, stdin);\n }\n}\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -190,8 +190,8 @@ export interface MastraCodeConfig {
190
190
  * Bring the session that owns `resourceId` online when a notification is
191
191
  * delivered and no session in this process owns it (a deferred delivery
192
192
  * after the session closed, a restart, another replica). Without it such a
193
- * delivery wakes the thread with no request context: no owner identity, no
194
- * model selection. Create the session as its owner, or throw when the owner
193
+ * notification stays pending until a process whose session runs the thread
194
+ * delivers it. Create the session as its owner, or throw when the owner
195
195
  * can't be resolved. When set, a delivery that still finds no owning session
196
196
  * fails with that error instead of running.
197
197
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}