mastracode 0.26.0-alpha.5 → 0.26.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 (117) hide show
  1. package/CHANGELOG.md +133 -0
  2. package/dist/acp/agent.d.ts +4 -4
  3. package/dist/acp/agent.d.ts.map +1 -1
  4. package/dist/acp/event-mapper.d.ts +3 -3
  5. package/dist/acp/event-mapper.d.ts.map +1 -1
  6. package/dist/acp/server.d.ts +2 -2
  7. package/dist/acp/server.d.ts.map +1 -1
  8. package/dist/{acp-7DQDVR3M.js → acp-G5OLW7EV.js} +12 -12
  9. package/dist/acp-G5OLW7EV.js.map +1 -0
  10. package/dist/{acp-NTTZEFVN.cjs → acp-YSYEXVBE.cjs} +15 -15
  11. package/dist/acp-YSYEXVBE.cjs.map +1 -0
  12. package/dist/acp.cjs +2 -2
  13. package/dist/acp.js +1 -1
  14. package/dist/agents/instructions.d.ts.map +1 -1
  15. package/dist/agents/mastracode-gateway.d.ts +8 -1
  16. package/dist/agents/mastracode-gateway.d.ts.map +1 -1
  17. package/dist/agents/memory.d.ts +1 -1
  18. package/dist/agents/model.d.ts +1 -1
  19. package/dist/agents/modes/build.d.ts +2 -2
  20. package/dist/agents/modes/build.d.ts.map +1 -1
  21. package/dist/agents/modes/explore.d.ts +2 -2
  22. package/dist/agents/modes/explore.d.ts.map +1 -1
  23. package/dist/agents/modes/plan.d.ts +2 -2
  24. package/dist/agents/modes/plan.d.ts.map +1 -1
  25. package/dist/agents/prompts/plan.d.ts +5 -4
  26. package/dist/agents/prompts/plan.d.ts.map +1 -1
  27. package/dist/agents/thread-caveman-state.d.ts +2 -2
  28. package/dist/agents/thread-caveman-state.d.ts.map +1 -1
  29. package/dist/agents/tool-availability.d.ts +5 -1
  30. package/dist/agents/tool-availability.d.ts.map +1 -1
  31. package/dist/{chunk-QO4KIOLG.js → chunk-GT3A3LAA.js} +221 -117
  32. package/dist/chunk-GT3A3LAA.js.map +1 -0
  33. package/dist/{chunk-IU477VVQ.js → chunk-IFUIWWGJ.js} +8 -8
  34. package/dist/chunk-IFUIWWGJ.js.map +1 -0
  35. package/dist/{chunk-DVBJN36L.cjs → chunk-KGBCGF6C.cjs} +47 -23
  36. package/dist/chunk-KGBCGF6C.cjs.map +1 -0
  37. package/dist/{chunk-L67CU2OP.js → chunk-LUSQ75XP.js} +233 -136
  38. package/dist/chunk-LUSQ75XP.js.map +1 -0
  39. package/dist/{chunk-F3TKSK3C.js → chunk-NDCWIAKG.js} +43 -21
  40. package/dist/chunk-NDCWIAKG.js.map +1 -0
  41. package/dist/{chunk-UW25EMMX.cjs → chunk-NUKVNLFS.cjs} +1160 -1063
  42. package/dist/chunk-NUKVNLFS.cjs.map +1 -0
  43. package/dist/{chunk-DPRNPXVC.cjs → chunk-VBH3L4LD.cjs} +8 -8
  44. package/dist/chunk-VBH3L4LD.cjs.map +1 -0
  45. package/dist/{chunk-MUZ2ZLWN.cjs → chunk-Z3HFSXTB.cjs} +256 -152
  46. package/dist/chunk-Z3HFSXTB.cjs.map +1 -0
  47. package/dist/cli.cjs +33 -33
  48. package/dist/cli.cjs.map +1 -1
  49. package/dist/cli.js +18 -18
  50. package/dist/cli.js.map +1 -1
  51. package/dist/evals/context-builder.d.ts +5 -5
  52. package/dist/evals/context-builder.d.ts.map +1 -1
  53. package/dist/headless.d.ts +3 -3
  54. package/dist/headless.d.ts.map +1 -1
  55. package/dist/index.cjs +10 -10
  56. package/dist/index.d.ts +36 -34
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +1 -1
  59. package/dist/mcp/config.d.ts +6 -2
  60. package/dist/mcp/config.d.ts.map +1 -1
  61. package/dist/processors/plan-rejection-abort.d.ts.map +1 -1
  62. package/dist/tools/request-sandbox-access.d.ts.map +1 -1
  63. package/dist/tools/utils.d.ts +2 -2
  64. package/dist/tui/commands/api-keys.d.ts +15 -0
  65. package/dist/tui/commands/api-keys.d.ts.map +1 -1
  66. package/dist/tui/commands/clone.d.ts +1 -1
  67. package/dist/tui/commands/goal.d.ts +2 -2
  68. package/dist/tui/commands/goal.d.ts.map +1 -1
  69. package/dist/tui/commands/types.d.ts +3 -3
  70. package/dist/tui/commands/types.d.ts.map +1 -1
  71. package/dist/tui/components/assistant-message.d.ts +3 -3
  72. package/dist/tui/components/assistant-message.d.ts.map +1 -1
  73. package/dist/tui/components/help-overlay.d.ts +1 -1
  74. package/dist/tui/components/help-overlay.d.ts.map +1 -1
  75. package/dist/tui/components/login-selector.d.ts +1 -1
  76. package/dist/tui/components/om-progress.d.ts +2 -2
  77. package/dist/tui/components/om-progress.d.ts.map +1 -1
  78. package/dist/tui/components/plan-approval-inline.d.ts.map +1 -1
  79. package/dist/tui/components/task-progress.d.ts +1 -1
  80. package/dist/tui/components/thread-selector.d.ts +4 -4
  81. package/dist/tui/components/thread-selector.d.ts.map +1 -1
  82. package/dist/tui/event-dispatch.d.ts +3 -3
  83. package/dist/tui/event-dispatch.d.ts.map +1 -1
  84. package/dist/tui/handlers/agent-lifecycle.d.ts +1 -1
  85. package/dist/tui/handlers/agent-lifecycle.d.ts.map +1 -1
  86. package/dist/tui/handlers/message.d.ts +4 -4
  87. package/dist/tui/handlers/message.d.ts.map +1 -1
  88. package/dist/tui/handlers/prompts.d.ts +1 -1
  89. package/dist/tui/handlers/prompts.d.ts.map +1 -1
  90. package/dist/tui/handlers/types.d.ts +3 -2
  91. package/dist/tui/handlers/types.d.ts.map +1 -1
  92. package/dist/tui/mastra-tui.d.ts +3 -3
  93. package/dist/tui/mastra-tui.d.ts.map +1 -1
  94. package/dist/tui/render-messages.d.ts +4 -3
  95. package/dist/tui/render-messages.d.ts.map +1 -1
  96. package/dist/tui/setup.d.ts +1 -1
  97. package/dist/tui/setup.d.ts.map +1 -1
  98. package/dist/tui/state.d.ts +24 -10
  99. package/dist/tui/state.d.ts.map +1 -1
  100. package/dist/tui/status-line.d.ts.map +1 -1
  101. package/dist/tui.cjs +19 -19
  102. package/dist/tui.js +2 -2
  103. package/dist/utils/plan-diff.d.ts +25 -0
  104. package/dist/utils/plan-diff.d.ts.map +1 -0
  105. package/dist/utils/plans.d.ts +41 -12
  106. package/dist/utils/plans.d.ts.map +1 -1
  107. package/package.json +16 -16
  108. package/dist/acp-7DQDVR3M.js.map +0 -1
  109. package/dist/acp-NTTZEFVN.cjs.map +0 -1
  110. package/dist/chunk-DPRNPXVC.cjs.map +0 -1
  111. package/dist/chunk-DVBJN36L.cjs.map +0 -1
  112. package/dist/chunk-F3TKSK3C.js.map +0 -1
  113. package/dist/chunk-IU477VVQ.js.map +0 -1
  114. package/dist/chunk-L67CU2OP.js.map +0 -1
  115. package/dist/chunk-MUZ2ZLWN.cjs.map +0 -1
  116. package/dist/chunk-QO4KIOLG.js.map +0 -1
  117. package/dist/chunk-UW25EMMX.cjs.map +0 -1
@@ -19,7 +19,7 @@ function mapToolKind(toolName) {
19
19
  if (name.includes("think") || name.includes("reason")) return "think";
20
20
  return "other";
21
21
  }
22
- function handleHarnessEvent(event, state, connection, session) {
22
+ function handleAgentControllerEvent(event, state, connection, session) {
23
23
  if (!state) return;
24
24
  switch (event.type) {
25
25
  case "agent_start":
@@ -161,7 +161,7 @@ function accumulateUsage(target, usage) {
161
161
  }
162
162
  var MastraCodeAcpAgent = class {
163
163
  connection;
164
- harness;
164
+ controller;
165
165
  session;
166
166
  modes;
167
167
  unsubscribeSessionEvents;
@@ -176,13 +176,13 @@ var MastraCodeAcpAgent = class {
176
176
  }
177
177
  return threadId;
178
178
  }
179
- constructor(connection, harness, session, modes) {
179
+ constructor(connection, controller, session, modes) {
180
180
  this.connection = connection;
181
- this.harness = harness;
181
+ this.controller = controller;
182
182
  this.session = session;
183
183
  this.modes = modes;
184
184
  this.unsubscribeSessionEvents = this.session.subscribe((event) => {
185
- handleHarnessEvent(event, this.currentPromptState, this.connection, this.session);
185
+ handleAgentControllerEvent(event, this.currentPromptState, this.connection, this.session);
186
186
  });
187
187
  }
188
188
  dispose() {
@@ -215,7 +215,7 @@ var MastraCodeAcpAgent = class {
215
215
  const currentModeId = this.session.mode.get();
216
216
  let models;
217
217
  try {
218
- const availableModels = await this.harness.listAvailableModels();
218
+ const availableModels = await this.controller.listAvailableModels();
219
219
  const currentModelId = this.session.model.get();
220
220
  models = {
221
221
  currentModelId: currentModelId ?? "",
@@ -326,5 +326,5 @@ function mapStopReason(reason) {
326
326
  }
327
327
 
328
328
  export { MastraCodeAcpAgent, setAutoApprove };
329
- //# sourceMappingURL=chunk-IU477VVQ.js.map
330
- //# sourceMappingURL=chunk-IU477VVQ.js.map
329
+ //# sourceMappingURL=chunk-IFUIWWGJ.js.map
330
+ //# sourceMappingURL=chunk-IFUIWWGJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/acp/event-mapper.ts","../src/acp/agent.ts"],"names":["usage","reason"],"mappings":"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","file":"chunk-IFUIWWGJ.js","sourcesContent":["import type { SessionNotification, RequestPermissionRequest, AgentSideConnection } from '@agentclientprotocol/sdk';\nimport type { AgentControllerEvent, Session, TokenUsage } from '@mastra/core/agent-controller';\n\nlet autoApprove = false;\n\n/**\n * Enable or disable automatic tool approval (set via --dangerous-auto-approve CLI flag).\n */\nexport function setAutoApprove(value: boolean): void {\n autoApprove = value;\n}\n\n/**\n * Map a mastracode tool name to an ACP ToolKind.\n */\nfunction mapToolKind(\n toolName: string,\n): 'read' | 'edit' | 'delete' | 'move' | 'search' | 'execute' | 'think' | 'fetch' | 'other' {\n const name = toolName.toLowerCase();\n if (name.includes('edit') || name.includes('write') || name.includes('replace') || name.includes('patch'))\n return 'edit';\n if (name.includes('read') || name.includes('view') || name.includes('list') || name.includes('find')) return 'read';\n if (name.includes('delete') || name.includes('remove')) return 'delete';\n if (name.includes('search') || name.includes('grep') || name.includes('query')) return 'search';\n if (name.includes('execute') || name.includes('run') || name.includes('command') || name.includes('shell'))\n return 'execute';\n if (\n name.includes('fetch') ||\n name.includes('curl') ||\n name.includes('http') ||\n name.includes('browse') ||\n name.includes('navigate')\n )\n return 'fetch';\n if (name.includes('think') || name.includes('reason')) return 'think';\n return 'other';\n}\n\n/**\n * Accumulated state for an active prompt turn.\n */\nexport interface PromptState {\n sessionId: string;\n lastTextLength: number;\n usage: TokenUsage;\n resolve: (reason: 'complete' | 'aborted' | 'error' | 'suspended') => void;\n}\n\n/**\n * Translate an AgentControllerEvent into an ACP SessionNotification and send it\n * via the provided connection. Returns null for events that don't produce\n * a session update.\n */\nexport function handleAgentControllerEvent(\n event: AgentControllerEvent,\n state: PromptState | null,\n connection: AgentSideConnection,\n session: Session,\n): void {\n if (!state) return;\n\n switch (event.type) {\n case 'agent_start':\n state.lastTextLength = 0;\n break;\n\n case 'message_update': {\n if (event.message.role !== 'assistant') break;\n const fullText = event.message.content\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\n .map(p => p.text)\n .join('');\n if (fullText.length > state.lastTextLength) {\n const delta = fullText.slice(state.lastTextLength);\n state.lastTextLength = fullText.length;\n sendUpdate(connection, state.sessionId, {\n sessionUpdate: 'agent_message_chunk',\n content: { type: 'text', text: delta },\n });\n }\n break;\n }\n\n case 'message_end':\n state.lastTextLength = 0;\n break;\n\n case 'tool_start':\n sendUpdate(connection, state.sessionId, {\n sessionUpdate: 'tool_call',\n toolCallId: event.toolCallId,\n title: event.toolName,\n kind: mapToolKind(event.toolName),\n status: 'in_progress',\n rawInput: JSON.stringify(event.args),\n });\n break;\n\n case 'tool_end':\n sendUpdate(connection, state.sessionId, {\n sessionUpdate: 'tool_call_update',\n toolCallId: event.toolCallId,\n status: event.isError ? 'failed' : 'completed',\n rawOutput: typeof event.result === 'string' ? event.result : JSON.stringify(event.result),\n });\n break;\n\n case 'tool_approval_required':\n void handleToolApproval(state, connection, session, event).catch(err => {\n process.stderr.write(`[acp] handleToolApproval error: ${err}\\n`);\n });\n break;\n\n case 'tool_suspended':\n void handleToolSuspended(state, connection, session, event).catch(err => {\n process.stderr.write(`[acp] handleToolSuspended error: ${err}\\n`);\n });\n break;\n\n case 'usage_update':\n accumulateUsage(state.usage, event.usage);\n break;\n\n case 'agent_end':\n state.resolve(event.reason ?? 'complete');\n break;\n\n // Ignored in v1: om_*, subagent_*, workspace_*, task_updated, etc.\n default:\n break;\n }\n}\n\nfunction sendUpdate(connection: AgentSideConnection, sessionId: string, update: SessionNotification['update']): void {\n connection.sessionUpdate({ sessionId, update }).catch(err => {\n process.stderr.write(`[acp] sessionUpdate error: ${err}\\n`);\n });\n}\n\nasync function handleToolApproval(\n state: PromptState,\n connection: AgentSideConnection,\n session: Session,\n event: Extract<AgentControllerEvent, { type: 'tool_approval_required' }>,\n): Promise<void> {\n // Auto-approve if --dangerous-auto-approve flag is set\n if (autoApprove) {\n session.respondToToolApproval({ decision: 'approve' });\n return;\n }\n\n const req: RequestPermissionRequest = {\n sessionId: state.sessionId,\n toolCall: {\n toolCallId: event.toolCallId,\n title: event.toolName,\n rawInput: JSON.stringify(event.args),\n },\n options: [\n { optionId: 'approve', name: 'Allow', kind: 'allow_once' },\n { optionId: 'reject', name: 'Reject', kind: 'reject_once' },\n ],\n };\n\n try {\n const resp = await connection.requestPermission(req);\n if (resp.outcome.outcome === 'selected') {\n const decision = resp.outcome.optionId === 'approve' ? 'approve' : 'decline';\n session.respondToToolApproval({ decision });\n } else {\n session.respondToToolApproval({ decision: 'decline' });\n }\n } catch (err) {\n process.stderr.write(`[acp] requestPermission error: ${err}\\n`);\n session.respondToToolApproval({ decision: 'decline' });\n }\n}\n\nasync function handleToolSuspended(\n state: PromptState,\n connection: AgentSideConnection,\n session: Session,\n event: Extract<AgentControllerEvent, { type: 'tool_suspended' }>,\n): Promise<void> {\n const { toolCallId, toolName, args, suspendPayload } = event;\n\n // Auto-resolve certain suspensions (mirrors headless.ts autoResolve)\n if (toolName === 'request_access' || (suspendPayload as any)?.kind === 'sandbox_access_request') {\n void session.respondToToolSuspension({ toolCallId, resumeData: 'Yes' });\n return;\n }\n\n if (toolName === 'submit_plan') {\n // Request permission for plan approval\n const req: RequestPermissionRequest = {\n sessionId: state.sessionId,\n toolCall: {\n toolCallId,\n title: toolName,\n rawInput: JSON.stringify(args),\n },\n options: [\n { optionId: 'approve', name: 'Approve Plan', kind: 'allow_once' },\n { optionId: 'reject', name: 'Reject Plan', kind: 'reject_once' },\n ],\n };\n\n try {\n const resp = await connection.requestPermission(req);\n const action =\n resp.outcome.outcome === 'selected' && resp.outcome.optionId === 'approve' ? 'approved' : 'rejected';\n void session.respondToToolSuspension({ toolCallId, resumeData: { action } });\n } catch {\n void session.respondToToolSuspension({ toolCallId, resumeData: { action: 'rejected' } });\n }\n return;\n }\n\n // For ask_user and other suspensions, auto-resolve\n void session.respondToToolSuspension({\n toolCallId,\n resumeData: 'Proceed with your best judgment. Do not ask further questions.',\n });\n}\n\nfunction accumulateUsage(target: TokenUsage, usage: TokenUsage): void {\n target.promptTokens += usage.promptTokens;\n target.completionTokens += usage.completionTokens;\n target.totalTokens += usage.totalTokens;\n if (usage.reasoningTokens) target.reasoningTokens = (target.reasoningTokens ?? 0) + usage.reasoningTokens;\n if (usage.cachedInputTokens) target.cachedInputTokens = (target.cachedInputTokens ?? 0) + usage.cachedInputTokens;\n if (usage.cacheCreationInputTokens) {\n target.cacheCreationInputTokens = (target.cacheCreationInputTokens ?? 0) + usage.cacheCreationInputTokens;\n }\n}\n","import type {\n Agent,\n AgentSideConnection,\n InitializeRequest,\n InitializeResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n CancelNotification,\n ContentBlock,\n} from '@agentclientprotocol/sdk';\nimport { PROTOCOL_VERSION } from '@agentclientprotocol/sdk';\nimport type { AgentController, AgentControllerMode, Session } from '@mastra/core/agent-controller';\nimport { handleAgentControllerEvent } from './event-mapper.js';\nimport type { PromptState } from './event-mapper.js';\n\n/**\n * ACP Agent implementation that wraps a mastracode Controller.\n * Each instance represents one ACP connection from a client.\n */\nexport class MastraCodeAcpAgent implements Agent {\n private readonly connection: AgentSideConnection;\n private readonly controller: AgentController;\n private readonly session: Session;\n private readonly modes: AgentControllerMode[];\n private readonly unsubscribeSessionEvents: () => void;\n private readonly sessionMap = new Map<string, string>(); // sessionId -> threadId\n private currentPromptState: PromptState | null = null;\n private promptMutex: Promise<void> = Promise.resolve();\n\n private getThreadIdOrThrow(sessionId: string): string {\n const threadId = this.sessionMap.get(sessionId);\n if (!threadId) {\n throw new Error(`Unknown ACP sessionId: ${sessionId}`);\n }\n return threadId;\n }\n\n constructor(\n connection: AgentSideConnection,\n controller: AgentController,\n session: Session,\n modes: AgentControllerMode[],\n ) {\n this.connection = connection;\n this.controller = controller;\n this.session = session;\n this.modes = modes;\n\n // Register persistent event listener\n this.unsubscribeSessionEvents = this.session.subscribe(event => {\n handleAgentControllerEvent(event, this.currentPromptState, this.connection, this.session);\n });\n }\n\n dispose(): void {\n this.unsubscribeSessionEvents();\n }\n\n async initialize(_request: InitializeRequest): Promise<InitializeResponse> {\n return {\n protocolVersion: PROTOCOL_VERSION,\n agentInfo: {\n name: 'mastracode',\n title: 'Mastra Code',\n version: '0.1.0',\n },\n agentCapabilities: {\n loadSession: false,\n },\n };\n }\n\n async authenticate(): Promise<void> {\n // No-op: mastracode handles its own auth\n }\n\n async newSession(_request: NewSessionRequest): Promise<NewSessionResponse> {\n const thread = await this.session.thread.create();\n const sessionId = thread.id;\n this.sessionMap.set(sessionId, thread.id);\n\n // Switch to the new thread\n await this.session.thread.switch({ threadId: thread.id });\n\n // Build modes list from constructor param\n const availableModes = this.modes.map((m: AgentControllerMode) => ({\n id: m.id,\n name: m.name ?? m.id,\n }));\n\n const currentModeId = this.session.mode.get();\n\n // Build models list (best-effort)\n let models: NewSessionResponse['models'];\n try {\n const availableModels = await this.controller.listAvailableModels();\n const currentModelId = this.session.model.get();\n models = {\n currentModelId: currentModelId ?? '',\n availableModels: availableModels.map(m => ({\n modelId: m.id,\n name: m.modelName,\n })),\n };\n } catch {\n // Model listing may fail if no providers are configured\n }\n\n return {\n sessionId,\n modes: {\n currentModeId,\n availableModes,\n },\n models,\n };\n }\n\n async prompt(request: PromptRequest): Promise<PromptResponse> {\n const { sessionId, prompt: contentBlocks } = request;\n\n // Extract text from content blocks\n const text = extractTextFromContentBlocks(contentBlocks);\n\n const threadId = this.getThreadIdOrThrow(sessionId);\n\n // Serialize prompts via mutex\n const prevMutex = this.promptMutex;\n let resolveMutex: () => void;\n this.promptMutex = new Promise<void>(resolve => {\n resolveMutex = resolve;\n });\n\n await prevMutex;\n\n try {\n // Ensure we're on the right thread while prompts are serialized\n await this.session.thread.switch({ threadId });\n\n // Create prompt state that will be resolved when agent_end fires\n const result = new Promise<{\n reason: 'complete' | 'aborted' | 'error' | 'suspended';\n usage: PromptState['usage'];\n }>(resolve => {\n const usage: PromptState['usage'] = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n\n this.currentPromptState = {\n sessionId,\n lastTextLength: 0,\n usage,\n resolve: reason => {\n resolve({ reason, usage });\n this.currentPromptState = null;\n },\n };\n });\n\n // Send the message to the session\n try {\n await this.session.sendMessage({ content: text });\n } catch (error) {\n this.currentPromptState = null;\n throw error;\n }\n\n // Wait for agent_end to resolve\n const { reason, usage } = await result;\n\n return {\n stopReason: mapStopReason(reason),\n usage: {\n inputTokens: usage.promptTokens,\n outputTokens: usage.completionTokens,\n totalTokens: usage.totalTokens,\n thoughtTokens: usage.reasoningTokens,\n cachedReadTokens: usage.cachedInputTokens,\n cachedWriteTokens: usage.cacheCreationInputTokens,\n },\n };\n } finally {\n resolveMutex!();\n }\n }\n\n async cancel(_notification: CancelNotification): Promise<void> {\n this.session.abort();\n }\n\n async setSessionMode(params: { sessionId: string; modeId: string }): Promise<void> {\n const threadId = this.getThreadIdOrThrow(params.sessionId);\n await this.session.thread.switch({ threadId });\n this.session.mode.set({ modeId: params.modeId });\n }\n\n async unstable_setSessionModel(params: { sessionId: string; modelId: string }): Promise<void> {\n const threadId = this.getThreadIdOrThrow(params.sessionId);\n await this.session.thread.switch({ threadId });\n this.session.model.set({ modelId: params.modelId });\n }\n}\n\nexport function extractTextFromContentBlocks(blocks: ContentBlock[]): string {\n const parts: string[] = [];\n for (const block of blocks) {\n if (block.type === 'text') {\n parts.push(block.text);\n } else if (block.type === 'resource_link') {\n parts.push(`[resource: ${block.uri}]`);\n } else if (block.type === 'resource') {\n parts.push(`[resource: ${block.resource.uri}]`);\n }\n }\n return parts.join('\\n');\n}\n\nexport function mapStopReason(\n reason: 'complete' | 'aborted' | 'error' | 'suspended',\n): 'end_turn' | 'cancelled' | 'max_tokens' | 'max_turn_requests' | 'refusal' {\n switch (reason) {\n case 'complete':\n return 'end_turn';\n case 'aborted':\n return 'cancelled';\n case 'error':\n return 'end_turn';\n case 'suspended':\n return 'end_turn';\n }\n}\n"]}
@@ -1495,10 +1495,26 @@ function getPlansDir() {
1495
1495
  function getLocalPlansDir(projectPath) {
1496
1496
  return path2__namespace.default.join(projectPath, chunkBULVNQ2P_cjs.DEFAULT_CONFIG_DIR, "plans");
1497
1497
  }
1498
+ function getLocalPlansRelativeDir() {
1499
+ return path2__namespace.default.join(chunkBULVNQ2P_cjs.DEFAULT_CONFIG_DIR, "plans");
1500
+ }
1498
1501
  function slugify(str) {
1499
1502
  const slug = str.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
1500
1503
  return slug || "untitled";
1501
1504
  }
1505
+ function resolvePlanPath(projectPath, submittedPath) {
1506
+ if (!submittedPath) return void 0;
1507
+ return path2__namespace.default.isAbsolute(submittedPath) ? submittedPath : path2__namespace.default.resolve(projectPath, submittedPath);
1508
+ }
1509
+ function isPlanFilePath(projectPath, targetPath) {
1510
+ const abs = resolvePlanPath(projectPath, targetPath);
1511
+ if (!abs) return false;
1512
+ if (path2__namespace.default.extname(abs).toLowerCase() !== ".md") return false;
1513
+ const plansDir = path2__namespace.default.resolve(getLocalPlansDir(projectPath));
1514
+ const rel = path2__namespace.default.relative(plansDir, abs);
1515
+ if (rel === "" || rel.startsWith("..") || path2__namespace.default.isAbsolute(rel)) return false;
1516
+ return !rel.includes(path2__namespace.default.sep);
1517
+ }
1502
1518
  async function savePlanToDisk(opts) {
1503
1519
  const { title, plan, resourceId } = opts;
1504
1520
  const plansDir = opts.plansDir ?? getPlansDir();
@@ -1521,26 +1537,32 @@ ${plan}
1521
1537
  `;
1522
1538
  await fs2__default.default.writeFile(path2__namespace.default.join(dir, filename), content, "utf-8");
1523
1539
  }
1524
- async function savePlanSnapshot(opts) {
1525
- const { title, plan, projectPath } = opts;
1526
- const plansDir = opts.plansDir ?? getLocalPlansDir(projectPath);
1527
- const baseDir = path2__namespace.default.resolve(plansDir);
1528
- await fs2__default.default.mkdir(baseDir, { recursive: true });
1529
- const filename = `${slugify(title)}.md`;
1530
- const target = path2__namespace.default.resolve(baseDir, filename);
1531
- const rel = path2__namespace.default.relative(baseDir, target);
1532
- if (rel.startsWith("..") || path2__namespace.default.isAbsolute(rel)) {
1533
- throw new Error(`Invalid plan title: ${title}`);
1540
+ async function readPlanFile(absPath) {
1541
+ let raw;
1542
+ try {
1543
+ raw = await fs2__default.default.readFile(absPath, "utf-8");
1544
+ } catch {
1545
+ return void 0;
1534
1546
  }
1535
- const content = `# ${title}
1536
-
1537
- ${plan}
1538
- `;
1539
- await fs2__default.default.writeFile(target, content, "utf-8");
1540
- return filename;
1547
+ const lines = raw.split(/\r?\n/);
1548
+ const headingIndex = lines.findIndex((line) => line.trim().length > 0);
1549
+ const heading = headingIndex >= 0 ? lines[headingIndex] : void 0;
1550
+ if (heading?.startsWith("# ")) {
1551
+ const title = heading.slice(2).trim();
1552
+ const plan = lines.slice(headingIndex + 1).join("\n").replace(/^\n+/, "").trimEnd();
1553
+ return { title, plan };
1554
+ }
1555
+ return { title: "", plan: raw.trimEnd() };
1541
1556
  }
1542
- function getPlanFilename(title) {
1543
- return `${slugify(title)}.md`;
1557
+ async function approvePlanFile(opts) {
1558
+ const { planPath, title, resourceId, plansDir } = opts;
1559
+ const current = await readPlanFile(planPath);
1560
+ if (!current) {
1561
+ return void 0;
1562
+ }
1563
+ const resolvedTitle = title || current.title || "Implementation Plan";
1564
+ await savePlanToDisk({ title: resolvedTitle, plan: current.plan, resourceId, plansDir });
1565
+ return path2__namespace.default.basename(planPath);
1544
1566
  }
1545
1567
 
1546
1568
  exports.BOX_INDENT = BOX_INDENT;
@@ -1556,6 +1578,7 @@ exports.THREAD_ACTIVE_MODEL_PACK_ID_KEY = THREAD_ACTIVE_MODEL_PACK_ID_KEY;
1556
1578
  exports.ThreadLockError = ThreadLockError;
1557
1579
  exports.acquireThreadLock = acquireThreadLock;
1558
1580
  exports.applyThemeMode = applyThemeMode;
1581
+ exports.approvePlanFile = approvePlanFile;
1559
1582
  exports.buildOpenAICodexOAuthFetch = buildOpenAICodexOAuthFetch;
1560
1583
  exports.checkProfileProviderMismatch = checkProfileProviderMismatch;
1561
1584
  exports.createBrowserFromSettings = createBrowserFromSettings;
@@ -1567,31 +1590,32 @@ exports.getAvailableOmPacks = getAvailableOmPacks;
1567
1590
  exports.getCustomProviderId = getCustomProviderId;
1568
1591
  exports.getEditorTheme = getEditorTheme;
1569
1592
  exports.getEffectiveThinkingLevel = getEffectiveThinkingLevel;
1593
+ exports.getLocalPlansRelativeDir = getLocalPlansRelativeDir;
1570
1594
  exports.getMarkdownTheme = getMarkdownTheme;
1571
- exports.getPlanFilename = getPlanFilename;
1572
1595
  exports.getPlansDir = getPlansDir;
1573
1596
  exports.getSelectListTheme = getSelectListTheme;
1574
1597
  exports.getSettingsListTheme = getSettingsListTheme;
1575
1598
  exports.getTermWidth = getTermWidth;
1576
1599
  exports.getThemeMode = getThemeMode;
1600
+ exports.isPlanFilePath = isPlanFilePath;
1577
1601
  exports.loadSettings = loadSettings;
1578
1602
  exports.luminance = luminance;
1579
1603
  exports.mastra = mastra;
1580
1604
  exports.mastraBrand = mastraBrand;
1581
1605
  exports.openaiCodexProvider = openaiCodexProvider;
1606
+ exports.readPlanFile = readPlanFile;
1582
1607
  exports.releaseAllThreadLocks = releaseAllThreadLocks;
1583
1608
  exports.releaseThreadLock = releaseThreadLock;
1584
1609
  exports.resolveModelDefaults = resolveModelDefaults;
1585
1610
  exports.resolveOmRoleModel = resolveOmRoleModel;
1611
+ exports.resolvePlanPath = resolvePlanPath;
1586
1612
  exports.resolveThreadActiveModelPackId = resolveThreadActiveModelPackId;
1587
1613
  exports.restoreTerminalForeground = restoreTerminalForeground;
1588
- exports.savePlanSnapshot = savePlanSnapshot;
1589
- exports.savePlanToDisk = savePlanToDisk;
1590
1614
  exports.saveSettings = saveSettings;
1591
1615
  exports.setAuthStorage = setAuthStorage;
1592
1616
  exports.setProfileProvider = setProfileProvider;
1593
1617
  exports.theme = theme;
1594
1618
  exports.tintHex = tintHex;
1595
1619
  exports.toCustomProviderModelId = toCustomProviderModelId;
1596
- //# sourceMappingURL=chunk-DVBJN36L.cjs.map
1597
- //# sourceMappingURL=chunk-DVBJN36L.cjs.map
1620
+ //# sourceMappingURL=chunk-KGBCGF6C.cjs.map
1621
+ //# sourceMappingURL=chunk-KGBCGF6C.cjs.map