@bastani/atomic 0.9.35-alpha.2 → 0.9.35-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/package.json +1 -1
  4. package/dist/builtin/subagents/package.json +1 -1
  5. package/dist/builtin/web-access/package.json +1 -1
  6. package/dist/builtin/workflows/CHANGELOG.md +13 -0
  7. package/dist/builtin/workflows/builtin/{chunk-s7y3hw0n.js → chunk-3xffzzbg.js} +1 -1
  8. package/dist/builtin/workflows/builtin/{chunk-0d0pd4fz.js → chunk-7fvrnzhb.js} +1 -1
  9. package/dist/builtin/workflows/builtin/{chunk-119gt64q.js → chunk-8c3ae7tt.js} +8 -1
  10. package/dist/builtin/workflows/builtin/{chunk-y68758re.js → chunk-rhkg3d8e.js} +1 -1
  11. package/dist/builtin/workflows/builtin/goal.js +2 -2
  12. package/dist/builtin/workflows/builtin/index.js +3 -3
  13. package/dist/builtin/workflows/builtin/ralph.js +2 -2
  14. package/dist/builtin/workflows/package.json +1 -1
  15. package/dist/builtin/workflows/src/extension/index.bundle.mjs +510 -35
  16. package/dist/builtin/workflows/src/index.js +87 -29
  17. package/dist/core/agent-session-accessors.d.ts.map +1 -1
  18. package/dist/core/agent-session-accessors.js +7 -1
  19. package/dist/core/agent-session-accessors.js.map +1 -1
  20. package/dist/core/agent-session-custom-message-commit.js +15 -15
  21. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  22. package/dist/core/agent-session-events.d.ts.map +1 -1
  23. package/dist/core/agent-session-events.js +4 -0
  24. package/dist/core/agent-session-events.js.map +1 -1
  25. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  26. package/dist/core/agent-session-extension-bindings.js +61 -1
  27. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  28. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  29. package/dist/core/agent-session-message-queue.js +3 -1
  30. package/dist/core/agent-session-message-queue.js.map +1 -1
  31. package/dist/core/agent-session-methods.d.ts +5 -3
  32. package/dist/core/agent-session-methods.d.ts.map +1 -1
  33. package/dist/core/agent-session-methods.js.map +1 -1
  34. package/dist/core/agent-session-persistent-custom-messages.js +1 -1
  35. package/dist/core/agent-session-persistent-custom-messages.js.map +1 -1
  36. package/dist/core/agent-session-prompt.d.ts +3 -1
  37. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  38. package/dist/core/agent-session-prompt.js +79 -9
  39. package/dist/core/agent-session-prompt.js.map +1 -1
  40. package/dist/core/agent-session-summary.d.ts.map +1 -1
  41. package/dist/core/agent-session-summary.js +17 -2
  42. package/dist/core/agent-session-summary.js.map +1 -1
  43. package/dist/core/agent-session-tree.js +1 -1
  44. package/dist/core/agent-session-tree.js.map +1 -1
  45. package/dist/core/agent-session.d.ts +1 -0
  46. package/dist/core/agent-session.d.ts.map +1 -1
  47. package/dist/core/agent-session.js +1 -0
  48. package/dist/core/agent-session.js.map +1 -1
  49. package/dist/core/auth-storage-backends.d.ts +1 -0
  50. package/dist/core/auth-storage-backends.d.ts.map +1 -1
  51. package/dist/core/auth-storage-backends.js +37 -23
  52. package/dist/core/auth-storage-backends.js.map +1 -1
  53. package/dist/core/compaction/session-summarization.d.ts +1 -0
  54. package/dist/core/compaction/session-summarization.d.ts.map +1 -1
  55. package/dist/core/compaction/session-summarization.js +7 -1
  56. package/dist/core/compaction/session-summarization.js.map +1 -1
  57. package/dist/core/extensions/agent-events.d.ts +15 -7
  58. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  59. package/dist/core/extensions/agent-events.js.map +1 -1
  60. package/dist/core/extensions/context-types.d.ts +6 -0
  61. package/dist/core/extensions/context-types.d.ts.map +1 -1
  62. package/dist/core/extensions/context-types.js.map +1 -1
  63. package/dist/core/extensions/index.d.ts +1 -1
  64. package/dist/core/extensions/index.d.ts.map +1 -1
  65. package/dist/core/extensions/index.js.map +1 -1
  66. package/dist/core/extensions/runner-context.d.ts +4 -0
  67. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  68. package/dist/core/extensions/runner-context.js +8 -0
  69. package/dist/core/extensions/runner-context.js.map +1 -1
  70. package/dist/core/extensions/runner-events.d.ts +1 -1
  71. package/dist/core/extensions/runner-events.d.ts.map +1 -1
  72. package/dist/core/extensions/runner-events.js +4 -3
  73. package/dist/core/extensions/runner-events.js.map +1 -1
  74. package/dist/core/extensions/runner.d.ts +3 -1
  75. package/dist/core/extensions/runner.d.ts.map +1 -1
  76. package/dist/core/extensions/runner.js +8 -2
  77. package/dist/core/extensions/runner.js.map +1 -1
  78. package/dist/core/extensions/runtime-types.d.ts +4 -0
  79. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  80. package/dist/core/extensions/runtime-types.js.map +1 -1
  81. package/dist/core/extensions/workflow-run-control.d.ts +12 -2
  82. package/dist/core/extensions/workflow-run-control.d.ts.map +1 -1
  83. package/dist/core/extensions/workflow-run-control.js.map +1 -1
  84. package/dist/core/package-manager-resource-patterns.d.ts.map +1 -1
  85. package/dist/core/package-manager-resource-patterns.js +4 -2
  86. package/dist/core/package-manager-resource-patterns.js.map +1 -1
  87. package/dist/core/session-manager-archive.d.ts +2 -0
  88. package/dist/core/session-manager-archive.d.ts.map +1 -1
  89. package/dist/core/session-manager-archive.js +41 -19
  90. package/dist/core/session-manager-archive.js.map +1 -1
  91. package/dist/core/session-manager-core.d.ts +1 -0
  92. package/dist/core/session-manager-core.d.ts.map +1 -1
  93. package/dist/core/session-manager-core.js +8 -4
  94. package/dist/core/session-manager-core.js.map +1 -1
  95. package/dist/core/session-manager-list.d.ts.map +1 -1
  96. package/dist/core/session-manager-list.js +4 -10
  97. package/dist/core/session-manager-list.js.map +1 -1
  98. package/dist/core/session-manager-types.d.ts +2 -1
  99. package/dist/core/session-manager-types.d.ts.map +1 -1
  100. package/dist/core/session-manager-types.js.map +1 -1
  101. package/dist/core/session-manager.d.ts +1 -1
  102. package/dist/core/session-manager.d.ts.map +1 -1
  103. package/dist/core/session-manager.js.map +1 -1
  104. package/dist/core/workflow-summary-lifecycle.d.ts +4 -0
  105. package/dist/core/workflow-summary-lifecycle.d.ts.map +1 -0
  106. package/dist/core/workflow-summary-lifecycle.js +40 -0
  107. package/dist/core/workflow-summary-lifecycle.js.map +1 -0
  108. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  109. package/dist/extensions/codemode/execute.js +20 -6
  110. package/dist/extensions/codemode/execute.js.map +1 -1
  111. package/dist/extensions/mcp/cli.d.ts.map +1 -1
  112. package/dist/extensions/mcp/cli.js +4 -7
  113. package/dist/extensions/mcp/cli.js.map +1 -1
  114. package/dist/extensions/mcp/client/client.d.ts.map +1 -1
  115. package/dist/extensions/mcp/client/client.js +5 -4
  116. package/dist/extensions/mcp/client/client.js.map +1 -1
  117. package/dist/extensions/mcp/client/index.d.ts +2 -2
  118. package/dist/extensions/mcp/client/index.d.ts.map +1 -1
  119. package/dist/extensions/mcp/client/index.js.map +1 -1
  120. package/dist/extensions/mcp/client/protocol/content.d.ts +4 -1
  121. package/dist/extensions/mcp/client/protocol/content.d.ts.map +1 -1
  122. package/dist/extensions/mcp/client/protocol/content.js.map +1 -1
  123. package/dist/extensions/mcp/client/transports/streamable-http.d.ts +2 -2
  124. package/dist/extensions/mcp/client/transports/streamable-http.d.ts.map +1 -1
  125. package/dist/extensions/mcp/client/transports/streamable-http.js +7 -5
  126. package/dist/extensions/mcp/client/transports/streamable-http.js.map +1 -1
  127. package/dist/extensions/mcp/client/transports/transport.d.ts +4 -1
  128. package/dist/extensions/mcp/client/transports/transport.d.ts.map +1 -1
  129. package/dist/extensions/mcp/client/transports/transport.js.map +1 -1
  130. package/dist/extensions/mcp/index.d.ts.map +1 -1
  131. package/dist/extensions/mcp/index.js +2 -4
  132. package/dist/extensions/mcp/index.js.map +1 -1
  133. package/dist/extensions/mcp/runtime.d.ts +1 -8
  134. package/dist/extensions/mcp/runtime.d.ts.map +1 -1
  135. package/dist/extensions/mcp/runtime.js +2 -41
  136. package/dist/extensions/mcp/runtime.js.map +1 -1
  137. package/dist/extensions/mcp/tools.js +1 -1
  138. package/dist/extensions/mcp/tools.js.map +1 -1
  139. package/dist/index-extensions.d.ts +1 -1
  140. package/dist/index-extensions.d.ts.map +1 -1
  141. package/dist/index-extensions.js.map +1 -1
  142. package/dist/index.d.ts +1 -1
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js.map +1 -1
  145. package/dist/modes/interactive/components/session-selector-list.d.ts.map +1 -1
  146. package/dist/modes/interactive/components/session-selector-list.js +2 -1
  147. package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
  148. package/dist/modes/print-mode.d.ts.map +1 -1
  149. package/dist/modes/print-mode.js +5 -0
  150. package/dist/modes/print-mode.js.map +1 -1
  151. package/dist/modes/rpc/rpc-client-api.d.ts +7 -2
  152. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  153. package/dist/modes/rpc/rpc-client-api.js +13 -0
  154. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  155. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  156. package/dist/modes/rpc/rpc-command-handler.js +19 -0
  157. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  158. package/dist/modes/rpc/rpc-types.d.ts +50 -1
  159. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  160. package/dist/modes/rpc/rpc-types.js.map +1 -1
  161. package/docs/extensions/authoring.md +2 -0
  162. package/docs/extensions/events.md +9 -3
  163. package/docs/guides/non-interactive.md +2 -0
  164. package/docs/mcp-servers.md +2 -0
  165. package/docs/packages/reference.md +2 -0
  166. package/docs/rpc/protocol.md +15 -0
  167. package/docs/rpc.md +1 -0
  168. package/docs/sdk.md +9 -1
  169. package/docs/sessions.md +2 -2
  170. package/docs/workflows/operations.md +11 -3
  171. package/npm-shrinkwrap.json +32 -32
  172. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-prompt.js","sourceRoot":"","sources":["../../src/core/agent-session-prompt.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { ImageContent, TextContent } from \"@bastani/pi-ai/compat\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { stripFrontmatter } from \"../utils/frontmatter.ts\";\nimport { processImage } from \"../utils/image-process.ts\";\nimport { resolveWorkflowStageDeliveryTarget } from \"./agent-session-delivery-forwarding.ts\";\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport type { PromptDisposition, PromptOptions, QueuedInputDisposition } from \"./agent-session-types.js\";\nimport {\n\tformatNoApiKeyFoundMessage,\n\tformatNoModelSelectedMessage,\n\tformatUnresolvedModelMessage,\n} from \"./auth-guidance.ts\";\nimport { runCallback } from \"./callback-activity.ts\";\nimport { expandPromptTemplate } from \"./prompt-templates.ts\";\nimport {\n\tassertSessionOpen,\n\tsessionGenerationClosing,\n\tsessionLifetime,\n\tsessionQuitSignal,\n\ttrackSessionWork,\n} from \"./session-lifecycle-work.ts\";\nimport { getSkillCatalog } from \"./skill-catalog.ts\";\n\ntype UserMessageDeliveryAction = \"prompt\" | \"steer\" | \"followUp\" | \"handled\";\n\nfunction assistantHasRecoverableOutput(message: AgentMessage): boolean {\n\tif (message.role !== \"assistant\") return false;\n\treturn message.content.some((block) => {\n\t\tif (block.type === \"text\") return block.text.length > 0;\n\t\tif (block.type === \"thinking\") return block.thinking.length > 0;\n\t\treturn true;\n\t});\n}\n\ntype PromptOptionsWithWorkflowDelivery = PromptOptions & {\n\treadonly __workflowDelivery?: {\n\t\treadonly beforeDelivery?: () => void;\n\t\t/** Called only after an idle prompt has synchronously entered the agent turn. */\n\t\treadonly promptStarted?: () => void;\n\t\treadonly delivered?: (action: UserMessageDeliveryAction) => void;\n\t};\n};\n\n/** Dispatch registered extension slash commands without changing the raw queue pause gate. */\nexport async function tryExecuteSessionSlashCommand(\n\tsession: Pick<AgentSession, \"_tryExecuteExtensionCommand\">,\n\ttext: string,\n): Promise<boolean> {\n\tif (!text.startsWith(\"/\")) return false;\n\treturn session._tryExecuteExtensionCommand(text);\n}\n\nasync function _normalizePromptImages(\n\tthis: AgentSession,\n\timages: ImageContent[] | undefined,\n): Promise<{ images: ImageContent[]; hints: string[] }> {\n\tif (!images) return { images: [], hints: [] };\n\n\tconst normalizedImages: ImageContent[] = [];\n\tconst hints: string[] = [];\n\tfor (const image of images) {\n\t\tconst processed = await processImage(Buffer.from(image.data, \"base64\"), image.mimeType, {\n\t\t\tautoResizeImages: this.settingsManager.getImageAutoResize(),\n\t\t\tresizeOptions: this.model?.inputLimits?.images?.resize,\n\t\t});\n\t\tif (!processed.ok) {\n\t\t\thints.push(processed.message);\n\t\t\tcontinue;\n\t\t}\n\t\tnormalizedImages.push({ type: \"image\", data: processed.data, mimeType: processed.mimeType });\n\t\thints.push(...processed.hints);\n\t}\n\treturn { images: normalizedImages, hints };\n}\n\nexport async function prompt(this: AgentSession, text: string, options?: PromptOptions): Promise<void> {\n\tif (this._disposed || sessionGenerationClosing.has(this))\n\t\tthrow Object.assign(new Error(\"Session is closed\"), { code: \"SessionClosed\" });\n\tconst owner = resolveWorkflowStageDeliveryTarget(this);\n\tif (owner !== this) return owner.prompt(text, options);\n\tif (this._isEmittingAgentSettled) {\n\t\t// A run started by an agent_settled handler waits until every settled handler completes.\n\t\tthis._deferredSettledActions.push(async () => await this.prompt(text, options));\n\t\treturn;\n\t}\n\treturn trackSessionWork(this, () => admittedPrompt.call(this, text, options));\n}\n\nasync function admittedPrompt(this: AgentSession, text: string, options?: PromptOptions): Promise<void> {\n\tif (this._activePromptCount === 0 && !this.isStreaming) this._agentRunAbortRequested = false;\n\tthis._activePromptCount += 1;\n\ttry {\n\t\tawait promptInternal.call(this, text, options);\n\t\tconst boundary = this._subagentMessageAdmission ?? this._workflowStageAdmission;\n\t\tif (\n\t\t\t!this._disposed &&\n\t\t\t!sessionGenerationClosing.has(this) &&\n\t\t\tthis._activePromptCount === 1 &&\n\t\t\t!this.isStreaming &&\n\t\t\t!this._queuedMessagesPaused &&\n\t\t\t(this._priorityInterruptPending || boundary?.hasMessageDeliveries())\n\t\t) {\n\t\t\t// A command/input hook may consume the original prompt during preflight.\n\t\t\t// Its owner still owes independently admitted priority input a reply; drain\n\t\t\t// that input without replaying preflight or starting another task prompt.\n\t\t\tawait this._continueQueuedAgentMessages();\n\t\t\tif (this._subagentMessageAdmission) await settleSubagentMessages(this);\n\t\t}\n\t} finally {\n\t\tthis._activePromptCount -= 1;\n\t}\n}\n\nasync function promptInternal(this: AgentSession, text: string, options?: PromptOptions): Promise<void> {\n\tconst lifetime = sessionLifetime(this);\n\tconst assertCurrent = () => {\n\t\tif (this._disposed || lifetime.aborted || sessionGenerationClosing.has(this))\n\t\t\tthrow Object.assign(new Error(\"Session is closed\"), { code: \"SessionClosed\" });\n\t};\n\tconst owner = resolveWorkflowStageDeliveryTarget(this);\n\tif (owner !== this) return owner.prompt(text, options);\n\tconst expandPromptTemplates = options?.expandPromptTemplates ?? true;\n\tconst preflightResult = options?.preflightResult;\n\tconst workflowDelivery = (options as PromptOptionsWithWorkflowDelivery | undefined)?.__workflowDelivery;\n\tlet messages: AgentMessage[] | undefined;\n\n\ttry {\n\t\t// Authorize workflow delivery before commands or input extensions can perform side effects.\n\t\t// A later terminal transition cannot retroactively reject input accepted at this boundary.\n\t\tworkflowDelivery?.beforeDelivery?.();\n\t\t// Registered slash commands execute without releasing ordinary queued work.\n\t\t// Unknown slash input continues through the normal paused admission path.\n\t\tif (expandPromptTemplates && (await tryExecuteSessionSlashCommand(this, text))) {\n\t\t\tworkflowDelivery?.delivered?.(\"handled\");\n\t\t\tpreflightResult?.(true, \"handled\");\n\t\t\treturn;\n\t\t}\n\t\tassertCurrent();\n\t\t// Real user input is on its way in, so a summary describing the previous turn is about\n\t\t// to be stale; stop paying for it. Deliberately after the authorization boundary and\n\t\t// the slash-command path, both of which must observe an untouched session. The\n\t\t// generation discards itself via its token/anchor checks either way.\n\t\tthis.abortSessionSummary();\n\t\t// A controlled pause is an admission gate, including the idle gap after\n\t\t// abort settles. Preserve the raw user payload without running input hooks,\n\t\t// compaction, or a provider turn; explicit resume makes it eligible again.\n\t\tif (this._queuedMessagesPaused) {\n\t\t\tconst delivery = options?.streamingBehavior === \"followUp\" ? \"followUp\" : \"steer\";\n\t\t\tif (delivery === \"followUp\") await this._queueFollowUp(text, options?.images);\n\t\t\telse await this._queueSteer(text, options?.images);\n\t\t\tworkflowDelivery?.delivered?.(delivery);\n\t\t\tpreflightResult?.(true, \"queued\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Emit input event for extension interception (before skill/template expansion)\n\t\tlet currentText = text;\n\t\tlet currentImages = options?.images;\n\t\tif (this._extensionRunner.hasHandlers(\"input\")) {\n\t\t\tconst inputResult = await this._extensionRunner.emitInput(\n\t\t\t\tcurrentText,\n\t\t\t\tcurrentImages,\n\t\t\t\toptions?.source ?? \"interactive\",\n\t\t\t\tthis.isStreaming ? options?.streamingBehavior : undefined,\n\t\t\t);\n\t\t\tassertCurrent();\n\t\t\tif (inputResult.action === \"handled\") {\n\t\t\t\tworkflowDelivery?.delivered?.(\"handled\");\n\t\t\t\tpreflightResult?.(true, \"handled\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (inputResult.action === \"transform\") {\n\t\t\t\tcurrentText = inputResult.text;\n\t\t\t\tcurrentImages = inputResult.images ?? currentImages;\n\t\t\t}\n\t\t}\n\n\t\t// Expand skill commands (/skill:name args) and prompt templates (/template args)\n\t\tlet expandedText = currentText;\n\t\tif (expandPromptTemplates) {\n\t\t\texpandedText = this._expandSkillCommand(expandedText);\n\t\t\texpandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);\n\t\t}\n\n\t\t// If streaming, queue via steer() or followUp() based on option. The run is still\n\t\t// open while agent_before_settle handlers decide on its continuation, so input sent\n\t\t// from that boundary queues for the continuation instead of starting a second run.\n\t\tif (this.isStreaming || this._isBeforeSettle) {\n\t\t\tif (!options?.streamingBehavior) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (options.streamingBehavior === \"followUp\") {\n\t\t\t\tawait this._queueFollowUp(expandedText, currentImages);\n\t\t\t} else {\n\t\t\t\tawait this._queueSteer(expandedText, currentImages);\n\t\t\t}\n\t\t\tworkflowDelivery?.delivered?.(options.streamingBehavior);\n\t\t\tpreflightResult?.(true, \"queued\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Close the completed fallback lifecycle before validating credentials for\n\t\t// the next idle prompt. The selected fallback remains the session model.\n\t\tif (typeof this._settleFallbackModelScope === \"function\") await this._settleFallbackModelScope();\n\t\tassertCurrent();\n\t\t// Flush context-only messages deferred until the previous turn's tool results were appended.\n\t\tthis._flushPendingBashMessages();\n\t\tthis._flushPendingCustomMessages();\n\n\t\t// Validate model\n\t\tif (!this.model) {\n\t\t\tthrow new Error(formatNoModelSelectedMessage());\n\t\t}\n\n\t\t// Defensive guard: a model that never resolved to a real provider\n\t\t// (for example an unknown/unresolved model id that reached this path\n\t\t// as a bare string) has no `provider`, which would otherwise fail deep\n\t\t// in auth resolution as the confusing \"No API key found for undefined\".\n\t\t// Surface a clear, accurate \"unknown model\" error instead.\n\t\tconst resolvedProvider = (this.model as { provider?: unknown }).provider;\n\t\tif (typeof resolvedProvider !== \"string\" || resolvedProvider.length === 0) {\n\t\t\tthrow new Error(formatUnresolvedModelMessage(this.model));\n\t\t}\n\n\t\tif (!this._modelRuntime.hasConfiguredAuth(this.model.provider)) {\n\t\t\t// A failed credential-store load (for example auth.json briefly locked\n\t\t\t// by a concurrent process, or invalid JSON) leaves an empty in-memory\n\t\t\t// credential set. That would otherwise be misreported here as\n\t\t\t// \"No API key found\" even though the credentials exist on disk. Surface\n\t\t\t// the real load failure instead so configured providers are not falsely\n\t\t\t// reported as unauthenticated (issue #1431).\n\t\t\tconst isOAuth = this._modelRuntime.isUsingOAuth(this.model.provider);\n\t\t\tif (isOAuth) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Authentication failed for \"${this.model.provider}\". ` +\n\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t`Run '/login ${this.model.provider}' to re-authenticate.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(formatNoApiKeyFoundMessage(this.model.provider));\n\t\t}\n\n\t\t// Check if we need to compact before sending (catches aborted responses)\n\t\tconst lastAssistant = this._findLastAssistantMessage();\n\t\tif (lastAssistant) {\n\t\t\tawait this._checkCompaction(lastAssistant, false);\n\t\t\tassertCurrent();\n\t\t}\n\n\t\t// Emit before_agent_start before normalizing images so extension-driven model\n\t\t// selection determines the resize profile used for the request and history.\n\t\tconst selectedToolsBefore = this._baseSystemPromptOptions.selectedTools ?? [];\n\t\tconst emitted = await this._extensionRunner.emitBeforeAgentStart(\n\t\t\texpandedText,\n\t\t\tcurrentImages,\n\t\t\tthis._baseSystemPromptOptions,\n\t\t);\n\t\tconst result = emitted ?? { systemPromptOptions: this._baseSystemPromptOptions };\n\t\tassertCurrent();\n\t\tconst nextTools = result.systemPromptOptions.selectedTools ?? selectedToolsBefore;\n\t\tconst handlerEditedTools =\n\t\t\tnextTools.length !== selectedToolsBefore.length ||\n\t\t\tnextTools.some((name, index) => name !== selectedToolsBefore[index]);\n\t\tif (!handlerEditedTools && typeof this.getActiveToolNames === \"function\") {\n\t\t\tresult.systemPromptOptions.selectedTools = this.getActiveToolNames();\n\t\t}\n\n\t\tconst normalized = await _normalizePromptImages.call(this, currentImages);\n\t\tassertCurrent();\n\t\tconst userText = normalized.hints.length > 0 ? `${expandedText}\\n\\n${normalized.hints.join(\"\\n\")}` : expandedText;\n\n\t\t// Build messages only after hooks and image normalization have completed.\n\t\tmessages = [];\n\t\tconst userContent: (TextContent | ImageContent)[] = [{ type: \"text\", text: userText }];\n\t\tuserContent.push(...normalized.images);\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tcontent: userContent,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\n\t\t// Inject any pending \"nextTurn\" messages as context alongside the user message\n\t\tfor (const msg of this._pendingNextTurnMessages) {\n\t\t\tmessages.push(msg);\n\t\t}\n\t\tthis._pendingNextTurnMessages = [];\n\n\t\t// Add all custom messages from extensions\n\t\tif (result?.messages) {\n\t\t\tfor (const msg of result.messages) {\n\t\t\t\tmessages.push({\n\t\t\t\t\trole: \"custom\",\n\t\t\t\t\tcustomType: msg.customType,\n\t\t\t\t\tcontent: msg.content ?? [],\n\t\t\t\t\tdisplay: msg.display,\n\t\t\t\t\tdetails: msg.details,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tconst updateMessage = this._preparePromptAndToolLoadout(result.systemPromptOptions);\n\t\tthis._runSystemPromptOptions = result.systemPromptOptions;\n\t\tif (updateMessage) messages.unshift(updateMessage);\n\t} catch (error) {\n\t\tpreflightResult?.(false);\n\t\tthrow error;\n\t}\n\n\tassertCurrent();\n\tlet dispatched = false;\n\tconst reportDispatch = (disposition: PromptDisposition) => {\n\t\tif (dispatched) return;\n\t\tdispatched = true;\n\t\tpreflightResult?.(true, disposition);\n\t};\n\tconst turn = this._runAgentPrompt(messages, workflowDelivery?.promptStarted, reportDispatch);\n\tworkflowDelivery?.delivered?.(\"prompt\");\n\ttry {\n\t\tawait turn;\n\t} catch (error) {\n\t\tif (!dispatched) {\n\t\t\tdispatched = true;\n\t\t\tpreflightResult?.(false);\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nexport async function _runAgentPrompt(\n\tthis: AgentSession,\n\tmessages: AgentMessage | AgentMessage[],\n\tpromptStarted?: () => void,\n\treportDispatch?: (disposition: PromptDisposition) => void,\n): Promise<void> {\n\tconst lifetime = sessionLifetime(this);\n\tconst owner = resolveWorkflowStageDeliveryTarget(this);\n\tif (owner !== this) {\n\t\tif (owner._queuedMessagesPaused) {\n\t\t\tconst items = Array.isArray(messages) ? messages : [messages];\n\t\t\tfor (const message of items) owner._queueAgentMessage(message, \"steer\");\n\t\t\treportDispatch?.(\"queued\");\n\t\t\treturn;\n\t\t}\n\t\treturn owner._runAgentPrompt(messages, promptStarted, reportDispatch);\n\t}\n\tif (this._isEmittingAgentSettled) {\n\t\tthis._deferredSettledActions.push(\n\t\t\tasync () => await this._runAgentPrompt(messages, promptStarted, reportDispatch),\n\t\t);\n\t\treturn;\n\t}\n\tif (this._activePromptCount === 0 && !this.isStreaming) this._agentRunAbortRequested = false;\n\tthis._activePromptCount += 1;\n\ttry {\n\t\tif (this._subagentMessageAdmission) {\n\t\t\tawait this._subagentMessageAdmission.waitForPendingDeliveries();\n\t\t\tif (!this._subagentMessageAdmission.isOpen()) {\n\t\t\t\treportDispatch?.(\"handled\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tconst pendingPriority = preparePriorityContinuation(this);\n\t\tif (pendingPriority) await pendingPriority;\n\t\tif (this._agentRunAbortRequested) {\n\t\t\tif (this.isStreaming || this._queuedMessagesPaused) {\n\t\t\t\treportDispatch?.(\"handled\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._agentRunAbortRequested = false;\n\t\t}\n\t\t// An explicit stop may win during input preflight or priority preparation.\n\t\t// Preserve the prepared input without opening a native turn past that gate.\n\t\tif (this._queuedMessagesPaused) {\n\t\t\tconst items = Array.isArray(messages) ? messages : [messages];\n\t\t\tfor (const message of items) this._queueAgentMessage(message, \"steer\");\n\t\t\treportDispatch?.(\"queued\");\n\t\t\treturn;\n\t\t}\n\t\tif (this._disposed || lifetime.aborted || sessionGenerationClosing.has(this))\n\t\t\tthrow Object.assign(new Error(\"Session is closed\"), { code: \"SessionClosed\" });\n\t\tthis._pendingToolNames.clear();\n\t\treportDispatch?.(\"started\");\n\t\tconst turn = this.agent.prompt(messages);\n\t\tif (this.isStreaming) promptStarted?.();\n\t\tawait turn;\n\t\tawait this.waitForRetry();\n\t\tif (lifetime.aborted || sessionGenerationClosing.has(this)) return;\n\t\tif (\n\t\t\tthis._agentRunAbortRequested &&\n\t\t\t!this._queuedMessagesPaused &&\n\t\t\tthis._protectedStreamingCustomMessages?.some((entry) => entry.phase === \"queued\")\n\t\t) {\n\t\t\tthis._agentRunAbortRequested = false;\n\t\t}\n\t\t// Abort still has to answer a queued message already in the transcript.\n\t\t// `_continueQueuedAgentMessages` skips remaining queue drains while abort\n\t\t// is requested; skipping it entirely reintroduces issue #2362.\n\t\tawait this._continueQueuedAgentMessages();\n\t\tif (this._agentRunAbortRequested) return;\n\t\tawait this._awaitPendingPostCompactionContinuation();\n\t\tawait runBeforeSettleContinuations(this);\n\t} finally {\n\t\tthis._runSystemPromptOptions = undefined;\n\t\tthis._cacheWarmer?.onAgentSettled();\n\t\tawait this._agentEventQueue;\n\t\tthis._flushPendingCustomMessages();\n\t\tthis._isEmittingAgentSettled = true;\n\t\ttry {\n\t\t\tconst aborted = this._agentRunAbortRequested === true;\n\t\t\tif (typeof this._extensionRunner?.emit === \"function\") {\n\t\t\t\tawait this._extensionRunner.emit({ type: \"agent_settled\", aborted });\n\t\t\t}\n\t\t\tthis._emit?.({ type: \"agent_settled\", aborted });\n\t\t} finally {\n\t\t\tthis._isEmittingAgentSettled = false;\n\t\t}\n\t\tif (this._subagentMessageAdmission) await settleSubagentMessages(this);\n\t\tthis._activePromptCount -= 1;\n\t\t// Runs deferred by agent_settled handlers start only after every settled handler completed.\n\t\t// Guarded because prompt-handshake suites drive this function on a synthetic session.\n\t\tconst deferred = this._deferredSettledActions?.splice(0) ?? [];\n\t\tfor (const action of deferred) await action();\n\t}\n}\n\n/**\n * Give `agent_before_settle` handlers a chance to append entries and request one explicit\n * continuation before the run settles. Each continuation is followed by the same queued\n * and post-compaction drains as the initial run, then the boundary is offered again.\n */\nasync function runBeforeSettleContinuations(session: AgentSession): Promise<void> {\n\t// Guarded because prompt-handshake suites drive this function on a synthetic session.\n\tif (typeof session._extensionRunner?.hasHandlers !== \"function\") return;\n\tif (typeof session._runBeforeSettleBoundary !== \"function\") return;\n\twhile (!session._agentRunAbortRequested) {\n\t\tawait session._agentEventQueue?.catch(() => {});\n\t\tif (!(await session._runBeforeSettleBoundary())) return;\n\t\t// An explicit stop or a paused queue keeps the requested continuation pending.\n\t\tif (session._agentRunAbortRequested || session._queuedMessagesPaused || session._stopAfterTurnBlockedContinuation)\n\t\t\treturn;\n\t\tawait session._runAgentContinue();\n\t\tif (session._agentRunAbortRequested) return;\n\t\tawait session._awaitPendingPostCompactionContinuation();\n\t}\n}\n\nasync function settleSubagentMessages(session: AgentSession): Promise<void> {\n\tconst admission = session._subagentMessageAdmission!;\n\t// A host-requested stop is terminal for a child, like cancellation. Retain\n\t// protected input for persistence without restarting work or spinning on it.\n\tif (session._stopAfterTurnBlockedContinuation) session.pauseQueuedMessages();\n\t// Keep receiving while admitted input is answered. Seal synchronously only\n\t// after both producer commits and native continuations have drained.\n\tdo {\n\t\tawait admission.waitForPendingDeliveries();\n\t\tawait session._continueQueuedAgentMessages();\n\t\tif (session._stopAfterTurnBlockedContinuation) session.pauseQueuedMessages();\n\t} while (admission.hasPendingDeliveries() || (!session._queuedMessagesPaused && session.agent.hasQueuedMessages()));\n\tadmission.seal();\n}\n\nexport async function _runAgentContinue(this: AgentSession): Promise<void> {\n\tif (this._agentRunAbortRequested || sessionGenerationClosing.has(this) || sessionLifetime(this).aborted) return;\n\tawait this.agent.continue();\n\tawait this.waitForRetry();\n\tawait this._continueQueuedAgentMessages();\n}\n\n/** Restore priority input the moment the native loop can poll it again. */\nfunction preparePriorityContinuation(session: AgentSession): Promise<void> | undefined {\n\tconst boundary = session._subagentMessageAdmission ?? session._workflowStageAdmission;\n\t// Explicit SDK interrupts own a native turn and the shared hold. An admitted\n\t// receiver's task must join that owner before checking its priority input;\n\t// otherwise it can settle before the interrupt finalizer restores the queue.\n\tif (boundary && session._pendingInterruptDeliveries > 0) {\n\t\treturn session._interruptDeliveryQueue.then(() => preparePriorityContinuation(session));\n\t}\n\tconst restore = (): void => {\n\t\tif (!session._priorityInterruptPending) return;\n\t\tsession._priorityInterruptPending = false;\n\t\tsession._restoreAndClearActiveInterruptQueueHold();\n\t};\n\t// Keep the idle prompt start synchronous unless a producer commit is still in flight.\n\tif (!boundary?.hasMessageDeliveries()) {\n\t\trestore();\n\t\treturn undefined;\n\t}\n\t// A producer can enqueue an explicit SDK interrupt while this await yields.\n\t// Recheck its ownership before restoring the shared hold.\n\treturn boundary.waitForMessageDeliveries().then(() => preparePriorityContinuation(session));\n}\n\nexport async function _continueQueuedAgentMessages(this: AgentSession): Promise<void> {\n\tconst lifetime = sessionLifetime(this);\n\tconst closing = () => this._disposed || lifetime.aborted || sessionGenerationClosing.has(this);\n\tif (closing()) return;\n\tawait this._agentEventQueue;\n\tif (closing()) return;\n\tawait preparePriorityContinuation(this);\n\tif (closing()) return;\n\n\tif (\n\t\t!this._agentRunAbortRequested &&\n\t\t!this._stopAfterTurnBlockedContinuation &&\n\t\t!this._queuedMessagesPaused &&\n\t\tthis.agent.hasQueuedMessages()\n\t) {\n\t\twhile (\n\t\t\t!this._agentRunAbortRequested &&\n\t\t\t!closing() &&\n\t\t\t!this._stopAfterTurnBlockedContinuation &&\n\t\t\t!this._queuedMessagesPaused &&\n\t\t\tthis.agent.hasQueuedMessages()\n\t\t) {\n\t\t\tawait this.agent.continue();\n\t\t\tawait this.waitForRetry();\n\t\t\tawait this._agentEventQueue;\n\t\t\tawait preparePriorityContinuation(this);\n\t\t}\n\t}\n\tif (this._stopAfterTurnBlockedContinuation) return;\n\tif (closing()) return;\n\n\tawait answerAdmittedQueuedMessage(this);\n}\n\n/**\n * Answer a queued message the agent loop already admitted into the transcript but\n * never replied to.\n *\n * `pauseQueuedMessages()` can only hold entries still sitting in the agent's own\n * steering/follow-up queues. Once the loop has polled a message it lives inside the\n * loop, is pushed into the transcript on the next iteration, and an interrupt at that\n * moment leaves it with a contentless aborted assistant reply. The message is no\n * longer queued and no longer held, so neither the pause release nor the queued\n * continuation above schedules the turn it is waiting for (issue #2362).\n *\n * This is deliberately disjoint from the paused-hold contract: a *held* message is\n * still released without starting a turn, while an *admitted* one gets its reply.\n */\nasync function answerAdmittedQueuedMessage(session: AgentSession): Promise<void> {\n\tconst admitted = session._admittedQueuedMessageAwaitingReply;\n\t// One attempt per admission: clear before continuing so an interrupt of the\n\t// recovery turn ends the sequence instead of restarting it.\n\tsession._admittedQueuedMessageAwaitingReply = undefined;\n\tif (admitted === undefined || session._disposed) return;\n\t// An interrupt delivery already in flight aborts this reply and then starts its\n\t// own turn, so continuing concurrently would reject the caller's prompt() with\n\t// \"Agent is already processing.\" Wait for it on the same boundary the resume\n\t// path uses, then let the checks below re-read the transcript: a delivery that\n\t// started its own turn changes the tail so they decline, while one that only\n\t// joined a paused hold leaves the admitted message still waiting for its reply.\n\tif (session._pendingInterruptDeliveries > 0) {\n\t\tawait session._interruptDeliveryQueue;\n\t\tif (session._disposed) return;\n\t}\n\n\tconst messages = session.agent.state.messages;\n\tlet replyIndex = messages.length - 1;\n\twhile (replyIndex >= 0 && messages[replyIndex]?.role === \"system\") replyIndex--;\n\tconst reply = messages[replyIndex];\n\t// Only an interrupt that produced nothing is recoverable. A partially streamed\n\t// reply already answered the message; restarting it would duplicate output.\n\tif (reply?.role !== \"assistant\" || reply.stopReason !== \"aborted\" || assistantHasRecoverableOutput(reply)) return;\n\tconst message = messages[replyIndex - 1];\n\tif (message?.role !== \"user\" || session._getUserMessageText(message) !== admitted) return;\n\n\t// Omit the empty aborted reply from the model projection so `continue()` resumes\n\t// from the admitted user message. Raw session history keeps it, as the retry paths do.\n\tsession._omitRecoveryAttempt(reply);\n\t// Publish this turn before it starts. It begins after the pause abort boundary\n\t// resolves, so a submission that only waited for that boundary would race it\n\t// and be rejected by the streaming guard while the queue is still paused.\n\tconst recovery = (async () => {\n\t\tawait session.agent.continue();\n\t\tawait session.waitForRetry();\n\t\tawait session._agentEventQueue;\n\t})();\n\tconst settled = recovery.catch(() => undefined);\n\tsession._admittedRecoveryTurn = settled;\n\ttry {\n\t\tawait recovery;\n\t} finally {\n\t\tif (session._admittedRecoveryTurn === settled) session._admittedRecoveryTurn = undefined;\n\t}\n}\n\n/**\n * Try to execute an extension command. Returns true if command was found and executed.\n */\n\nexport async function _tryExecuteExtensionCommand(this: AgentSession, text: string): Promise<boolean> {\n\t// Parse command name and args\n\tconst spaceIndex = text.indexOf(\" \");\n\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\tconst args = spaceIndex === -1 ? \"\" : text.slice(spaceIndex + 1);\n\n\tconst quitSignal = sessionQuitSignal(this);\n\tconst command = this._extensionRunner.getCommand(commandName, quitSignal);\n\tif (!command) return false;\n\n\t// Get command context from extension runner (includes session control methods)\n\tconst ctx = this._extensionRunner.createCommandContext();\n\n\ttry {\n\t\tawait runCallback(\n\t\t\t{ kind: \"extension.hook\", name: `command:${commandName}`, sourcePath: command.sourceInfo.path },\n\t\t\t() => command.handler(args, ctx),\n\t\t);\n\t\treturn true;\n\t} catch (err) {\n\t\tif (quitSignal.aborted) return true;\n\t\t// Emit error via extension runner\n\t\tthis._extensionRunner.emitError({\n\t\t\textensionPath: `command:${commandName}`,\n\t\t\tevent: \"command\",\n\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t});\n\t\treturn true;\n\t}\n}\n\n/**\n * Expand skill commands (/skill:name args) to their full content.\n * Returns the expanded text, or the original text if not a skill command or skill not found.\n * Emits errors via extension runner if file read fails.\n */\n\nexport function _expandSkillCommand(this: AgentSession, text: string): string {\n\tif (!text.startsWith(\"/skill:\")) return text;\n\n\tconst spaceIndex = text.indexOf(\" \");\n\tconst selector = spaceIndex === -1 ? text.slice(7) : text.slice(7, spaceIndex);\n\tconst args = spaceIndex === -1 ? \"\" : text.slice(spaceIndex + 1).trim();\n\tconst resolution = getSkillCatalog(this.resourceLoader).resolve(selector);\n\tif (!resolution.ok) {\n\t\tif (selector.includes(\"@\")) {\n\t\t\tthis._extensionRunner.emitError({\n\t\t\t\textensionPath: `skill:${selector}`,\n\t\t\t\tevent: \"skill_expansion\",\n\t\t\t\terror: resolution.message,\n\t\t\t});\n\t\t}\n\t\treturn text;\n\t}\n\tconst { skill, id } = resolution.candidate;\n\n\ttry {\n\t\tconst content = readFileSync(skill.filePath, \"utf-8\");\n\t\tconst body = stripFrontmatter(content).trim();\n\t\tconst skillBlock = `<skill name=\"${selector}\" location=\"${skill.filePath}\" candidate=\"${id}\">\\nReferences are relative to ${skill.baseDir}.\\n\\n${body}\\n</skill>`;\n\t\treturn args ? `${skillBlock}\\n\\n${args}` : skillBlock;\n\t} catch (err) {\n\t\t// Emit error like extension commands do\n\t\tthis._extensionRunner.emitError({\n\t\t\textensionPath: skill.filePath,\n\t\t\tevent: \"skill_expansion\",\n\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t});\n\t\treturn text; // Return original on error\n\t}\n}\n\nasync function queueUserInput(\n\tsession: AgentSession,\n\ttext: string,\n\timages: ImageContent[] | undefined,\n\tbehavior: \"steer\" | \"followUp\",\n\tsource: NonNullable<PromptOptions[\"source\"]>,\n): Promise<QueuedInputDisposition> {\n\tassertSessionOpen(session);\n\tconst owner = resolveWorkflowStageDeliveryTarget(session);\n\tif (owner !== session) return queueUserInput(owner, text, images, behavior, source);\n\treturn trackSessionWork(session, () => admittedQueueUserInput(session, text, images, behavior, source));\n}\n\nasync function admittedQueueUserInput(\n\tsession: AgentSession,\n\ttext: string,\n\timages: ImageContent[] | undefined,\n\tbehavior: \"steer\" | \"followUp\",\n\tsource: NonNullable<PromptOptions[\"source\"]>,\n): Promise<QueuedInputDisposition> {\n\tconst lifetime = sessionLifetime(session);\n\tif (text.startsWith(\"/\")) session._throwIfExtensionCommand(text);\n\tif (session._extensionRunner?.hasHandlers(\"input\")) {\n\t\tconst result = await session._extensionRunner.emitInput(\n\t\t\ttext,\n\t\t\timages,\n\t\t\tsource,\n\t\t\tsession.isStreaming ? behavior : undefined,\n\t\t);\n\t\tassertSessionOpen(session);\n\t\tif (lifetime.aborted) throw Object.assign(new Error(\"Session is closed\"), { code: \"SessionClosed\" });\n\t\tif (result.action === \"handled\") return \"handled\";\n\t\tif (result.action === \"transform\") {\n\t\t\ttext = result.text;\n\t\t\timages = result.images ?? images;\n\t\t}\n\t}\n\tconst expandedText = expandPromptTemplate(session._expandSkillCommand(text), [...session.promptTemplates]);\n\tif (behavior === \"steer\") await session._queueSteer(expandedText, images);\n\telse await session._queueFollowUp(expandedText, images);\n\treturn \"queued\";\n}\n\n/**\n * Queue a steering message while the agent is running.\n * Delivered after the current assistant turn finishes executing its tool calls,\n * before the next LLM call.\n * Expands skill commands and prompt templates. Errors on extension commands.\n * @param images Optional image attachments to include with the message\n * @throws Error if text is an extension command\n */\n\nexport async function steer(\n\tthis: AgentSession,\n\ttext: string,\n\timages?: ImageContent[],\n\toptions?: Pick<PromptOptions, \"source\">,\n): Promise<QueuedInputDisposition> {\n\treturn queueUserInput(this, text, images, \"steer\", options?.source ?? \"interactive\");\n}\n\n/**\n * Queue a follow-up message to be processed after the agent finishes.\n * Delivered only when agent has no more tool calls or steering messages.\n * Expands skill commands and prompt templates. Errors on extension commands.\n * @param images Optional image attachments to include with the message\n * @throws Error if text is an extension command\n */\n\nexport async function followUp(\n\tthis: AgentSession,\n\ttext: string,\n\timages?: ImageContent[],\n\toptions?: Pick<PromptOptions, \"source\">,\n): Promise<QueuedInputDisposition> {\n\treturn queueUserInput(this, text, images, \"followUp\", options?.source ?? \"interactive\");\n}\n\n/**\n * Send a user message and trigger a turn.\n *\n * By default the text is delivered literally: extension commands are not\n * dispatched and skill commands / prompt templates are not expanded. Set\n * `expandPromptTemplates: true` to dispatch a registered extension or skill\n * command (or expand a prompt template) instead of sending the raw text —\n * with that option the message may DISPATCH a command rather than be sent.\n *\n * @param content User message content (string or content array)\n * @param options.deliverAs Delivery mode when streaming: \"steer\" or \"followUp\"\n * @param options.expandPromptTemplates Whether to dispatch extension commands and expand skill commands and prompt templates. Default: false.\n */\nexport async function sendUserMessage(\n\tthis: AgentSession,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: {\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\texpandPromptTemplates?: boolean;\n\t\t__workflowDelivery?: PromptOptionsWithWorkflowDelivery[\"__workflowDelivery\"];\n\t},\n): Promise<void> {\n\t// Normalize content to text string + optional images\n\tlet text: string;\n\tlet images: ImageContent[] | undefined;\n\n\tif (typeof content === \"string\") {\n\t\ttext = content;\n\t} else {\n\t\tconst textParts: string[] = [];\n\t\timages = [];\n\t\tfor (const part of content) {\n\t\t\tif (part.type === \"text\") {\n\t\t\t\ttextParts.push(part.text);\n\t\t\t} else {\n\t\t\t\timages.push(part);\n\t\t\t}\n\t\t}\n\t\ttext = textParts.join(\"\\n\");\n\t\tif (images.length === 0) images = undefined;\n\t}\n\n\t// prompt() owns command dispatch and template expansion; the default (false)\n\t// keeps every pre-existing caller sending literally. The private delivery hook\n\t// lets workflow routing report and gate the branch selected after asynchronous\n\t// input/compaction extension preflight.\n\tawait this.prompt(text, {\n\t\texpandPromptTemplates: options?.expandPromptTemplates ?? false,\n\t\tstreamingBehavior: options?.deliverAs,\n\t\timages,\n\t\tsource: \"extension\",\n\t\t__workflowDelivery: options?.__workflowDelivery,\n\t} as PromptOptionsWithWorkflowDelivery);\n}\n\n/**\n * Clear all queued messages and return them.\n * Useful for restoring to editor when user aborts.\n * @returns Object with steering and followUp arrays\n */\n\nexport const agentSessionPromptMethods = {\n\tprompt,\n\t_runAgentPrompt,\n\t_runAgentContinue,\n\t_continueQueuedAgentMessages,\n\t_tryExecuteExtensionCommand,\n\t_expandSkillCommand,\n\tsteer,\n\tfollowUp,\n\tsendUserMessage,\n};\n"]}
1
+ {"version":3,"file":"agent-session-prompt.js","sourceRoot":"","sources":["../../src/core/agent-session-prompt.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { ImageContent, TextContent } from \"@bastani/pi-ai/compat\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { stripFrontmatter } from \"../utils/frontmatter.ts\";\nimport { processImage } from \"../utils/image-process.ts\";\nimport { resolveWorkflowStageDeliveryTarget } from \"./agent-session-delivery-forwarding.ts\";\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport type { PromptDisposition, PromptOptions, QueuedInputDisposition } from \"./agent-session-types.js\";\nimport {\n\tformatNoApiKeyFoundMessage,\n\tformatNoModelSelectedMessage,\n\tformatUnresolvedModelMessage,\n} from \"./auth-guidance.ts\";\nimport { runCallback } from \"./callback-activity.ts\";\nimport type { CustomMessage } from \"./messages.ts\";\nimport { expandPromptTemplate } from \"./prompt-templates.ts\";\nimport {\n\tassertSessionOpen,\n\tsessionGenerationClosing,\n\tsessionLifetime,\n\tsessionQuitSignal,\n\ttrackSessionWork,\n} from \"./session-lifecycle-work.ts\";\nimport { getSkillCatalog } from \"./skill-catalog.ts\";\n\nconst customPreparations = new WeakMap<AgentSession, Promise<void>>();\n\nexport async function waitForCustomMessagePreparation(session: AgentSession): Promise<void> {\n\tawait customPreparations.get(session);\n}\n\ntype UserMessageDeliveryAction = \"prompt\" | \"steer\" | \"followUp\" | \"handled\";\n\nfunction assistantHasRecoverableOutput(message: AgentMessage): boolean {\n\tif (message.role !== \"assistant\") return false;\n\treturn message.content.some((block) => {\n\t\tif (block.type === \"text\") return block.text.length > 0;\n\t\tif (block.type === \"thinking\") return block.thinking.length > 0;\n\t\treturn true;\n\t});\n}\n\ntype PromptOptionsWithWorkflowDelivery = PromptOptions & {\n\treadonly __workflowDelivery?: {\n\t\treadonly beforeDelivery?: () => void;\n\t\t/** Called only after an idle prompt has synchronously entered the agent turn. */\n\t\treadonly promptStarted?: () => void;\n\t\treadonly delivered?: (action: UserMessageDeliveryAction) => void;\n\t};\n};\n\n/** Dispatch registered extension slash commands without changing the raw queue pause gate. */\nexport async function tryExecuteSessionSlashCommand(\n\tsession: Pick<AgentSession, \"_tryExecuteExtensionCommand\">,\n\ttext: string,\n): Promise<boolean> {\n\tif (!text.startsWith(\"/\")) return false;\n\treturn session._tryExecuteExtensionCommand(text);\n}\n\nasync function _normalizePromptImages(\n\tthis: AgentSession,\n\timages: ImageContent[] | undefined,\n): Promise<{ images: ImageContent[]; hints: string[] }> {\n\tif (!images) return { images: [], hints: [] };\n\n\tconst normalizedImages: ImageContent[] = [];\n\tconst hints: string[] = [];\n\tfor (const image of images) {\n\t\tconst processed = await processImage(Buffer.from(image.data, \"base64\"), image.mimeType, {\n\t\t\tautoResizeImages: this.settingsManager.getImageAutoResize(),\n\t\t\tresizeOptions: this.model?.inputLimits?.images?.resize,\n\t\t});\n\t\tif (!processed.ok) {\n\t\t\thints.push(processed.message);\n\t\t\tcontinue;\n\t\t}\n\t\tnormalizedImages.push({ type: \"image\", data: processed.data, mimeType: processed.mimeType });\n\t\thints.push(...processed.hints);\n\t}\n\treturn { images: normalizedImages, hints };\n}\n\nexport async function prompt(this: AgentSession, text: string, options?: PromptOptions): Promise<void> {\n\tif (this._disposed || sessionGenerationClosing.has(this))\n\t\tthrow Object.assign(new Error(\"Session is closed\"), { code: \"SessionClosed\" });\n\tconst owner = resolveWorkflowStageDeliveryTarget(this);\n\tif (owner !== this) return owner.prompt(text, options);\n\tif (this._isEmittingAgentSettled) {\n\t\t// A run started by an agent_settled handler waits until every settled handler completes.\n\t\tthis._deferredSettledActions.push(async () => await this.prompt(text, options));\n\t\treturn;\n\t}\n\treturn trackSessionWork(this, () => admittedPrompt.call(this, text, options));\n}\n\nasync function admittedPrompt(this: AgentSession, text: string, options?: PromptOptions): Promise<void> {\n\tif (this._activePromptCount === 0 && !this.isStreaming) this._agentRunAbortRequested = false;\n\tthis._activePromptCount += 1;\n\ttry {\n\t\tawait promptInternal.call(this, text, options);\n\t\tconst boundary = this._subagentMessageAdmission ?? this._workflowStageAdmission;\n\t\tif (\n\t\t\t!this._disposed &&\n\t\t\t!sessionGenerationClosing.has(this) &&\n\t\t\tthis._activePromptCount === 1 &&\n\t\t\t!this.isStreaming &&\n\t\t\t!this._queuedMessagesPaused &&\n\t\t\t(this._priorityInterruptPending || boundary?.hasMessageDeliveries())\n\t\t) {\n\t\t\t// A command/input hook may consume the original prompt during preflight.\n\t\t\t// Its owner still owes independently admitted priority input a reply; drain\n\t\t\t// that input without replaying preflight or starting another task prompt.\n\t\t\tawait this._continueQueuedAgentMessages();\n\t\t\tif (this._subagentMessageAdmission) await settleSubagentMessages(this);\n\t\t}\n\t} finally {\n\t\tthis._activePromptCount -= 1;\n\t}\n}\n\nasync function promptInternal(this: AgentSession, text: string, options?: PromptOptions): Promise<void> {\n\tconst lifetime = sessionLifetime(this);\n\tconst assertCurrent = () => {\n\t\tif (this._disposed || lifetime.aborted || sessionGenerationClosing.has(this))\n\t\t\tthrow Object.assign(new Error(\"Session is closed\"), { code: \"SessionClosed\" });\n\t};\n\tconst owner = resolveWorkflowStageDeliveryTarget(this);\n\tif (owner !== this) return owner.prompt(text, options);\n\tconst expandPromptTemplates = options?.expandPromptTemplates ?? true;\n\tconst preflightResult = options?.preflightResult;\n\tconst workflowDelivery = (options as PromptOptionsWithWorkflowDelivery | undefined)?.__workflowDelivery;\n\tlet messages: AgentMessage[] | undefined;\n\tlet preparingRun = false;\n\n\ttry {\n\t\t// Authorize workflow delivery before commands or input extensions can perform side effects.\n\t\t// A later terminal transition cannot retroactively reject input accepted at this boundary.\n\t\tworkflowDelivery?.beforeDelivery?.();\n\t\t// Registered slash commands execute without releasing ordinary queued work.\n\t\t// Unknown slash input continues through the normal paused admission path.\n\t\tif (expandPromptTemplates && (await tryExecuteSessionSlashCommand(this, text))) {\n\t\t\tworkflowDelivery?.delivered?.(\"handled\");\n\t\t\tpreflightResult?.(true, \"handled\");\n\t\t\treturn;\n\t\t}\n\t\tassertCurrent();\n\t\t// Real user input is on its way in, so a summary describing the previous turn is about\n\t\t// to be stale; stop paying for it. Deliberately after the authorization boundary and\n\t\t// the slash-command path, both of which must observe an untouched session. The\n\t\t// generation discards itself via its token/anchor checks either way.\n\t\tthis.abortSessionSummary();\n\t\t// A controlled pause is an admission gate, including the idle gap after\n\t\t// abort settles. Preserve the raw user payload without running input hooks,\n\t\t// compaction, or a provider turn; explicit resume makes it eligible again.\n\t\tif (this._queuedMessagesPaused) {\n\t\t\tconst delivery = options?.streamingBehavior === \"followUp\" ? \"followUp\" : \"steer\";\n\t\t\tif (delivery === \"followUp\") await this._queueFollowUp(text, options?.images);\n\t\t\telse await this._queueSteer(text, options?.images);\n\t\t\tworkflowDelivery?.delivered?.(delivery);\n\t\t\tpreflightResult?.(true, \"queued\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Emit input event for extension interception (before skill/template expansion)\n\t\tlet currentText = text;\n\t\tlet currentImages = options?.images;\n\t\tif (this._extensionRunner.hasHandlers(\"input\")) {\n\t\t\tconst inputResult = await this._extensionRunner.emitInput(\n\t\t\t\tcurrentText,\n\t\t\t\tcurrentImages,\n\t\t\t\toptions?.source ?? \"interactive\",\n\t\t\t\tthis.isStreaming ? options?.streamingBehavior : undefined,\n\t\t\t);\n\t\t\tassertCurrent();\n\t\t\tif (inputResult.action === \"handled\") {\n\t\t\t\tworkflowDelivery?.delivered?.(\"handled\");\n\t\t\t\tpreflightResult?.(true, \"handled\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (inputResult.action === \"transform\") {\n\t\t\t\tcurrentText = inputResult.text;\n\t\t\t\tcurrentImages = inputResult.images ?? currentImages;\n\t\t\t}\n\t\t}\n\n\t\t// Expand skill commands (/skill:name args) and prompt templates (/template args)\n\t\tlet expandedText = currentText;\n\t\tif (expandPromptTemplates) {\n\t\t\texpandedText = this._expandSkillCommand(expandedText);\n\t\t\texpandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);\n\t\t}\n\n\t\t// If streaming, queue via steer() or followUp() based on option. The run is still\n\t\t// open while agent_before_settle handlers decide on its continuation, so input sent\n\t\t// from that boundary queues for the continuation instead of starting a second run.\n\t\tif (this.isStreaming || this._isPreparingRun || this._isBeforeSettle) {\n\t\t\tif (!options?.streamingBehavior) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (options.streamingBehavior === \"followUp\") {\n\t\t\t\tawait this._queueFollowUp(expandedText, currentImages);\n\t\t\t} else {\n\t\t\t\tawait this._queueSteer(expandedText, currentImages);\n\t\t\t}\n\t\t\tworkflowDelivery?.delivered?.(options.streamingBehavior);\n\t\t\tpreflightResult?.(true, \"queued\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Close the completed fallback lifecycle before validating credentials for\n\t\t// the next idle prompt. The selected fallback remains the session model.\n\t\tif (typeof this._settleFallbackModelScope === \"function\") await this._settleFallbackModelScope();\n\t\tassertCurrent();\n\t\t// Flush context-only messages deferred until the previous turn's tool results were appended.\n\t\tthis._flushPendingBashMessages();\n\t\tthis._flushPendingCustomMessages();\n\n\t\t// Validate model\n\t\tif (!this.model) {\n\t\t\tthrow new Error(formatNoModelSelectedMessage());\n\t\t}\n\n\t\t// Defensive guard: a model that never resolved to a real provider\n\t\t// (for example an unknown/unresolved model id that reached this path\n\t\t// as a bare string) has no `provider`, which would otherwise fail deep\n\t\t// in auth resolution as the confusing \"No API key found for undefined\".\n\t\t// Surface a clear, accurate \"unknown model\" error instead.\n\t\tconst resolvedProvider = (this.model as { provider?: unknown }).provider;\n\t\tif (typeof resolvedProvider !== \"string\" || resolvedProvider.length === 0) {\n\t\t\tthrow new Error(formatUnresolvedModelMessage(this.model));\n\t\t}\n\n\t\tif (!this._modelRuntime.hasConfiguredAuth(this.model.provider)) {\n\t\t\t// A failed credential-store load (for example auth.json briefly locked\n\t\t\t// by a concurrent process, or invalid JSON) leaves an empty in-memory\n\t\t\t// credential set. That would otherwise be misreported here as\n\t\t\t// \"No API key found\" even though the credentials exist on disk. Surface\n\t\t\t// the real load failure instead so configured providers are not falsely\n\t\t\t// reported as unauthenticated (issue #1431).\n\t\t\tconst isOAuth = this._modelRuntime.isUsingOAuth(this.model.provider);\n\t\t\tif (isOAuth) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Authentication failed for \"${this.model.provider}\". ` +\n\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t`Run '/login ${this.model.provider}' to re-authenticate.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(formatNoApiKeyFoundMessage(this.model.provider));\n\t\t}\n\n\t\tthis._isPreparingRun = \"user\";\n\t\tpreparingRun = true;\n\t\t// Check if we need to compact before sending (catches aborted responses)\n\t\tconst lastAssistant = this._findLastAssistantMessage();\n\t\tif (lastAssistant) {\n\t\t\tawait this._checkCompaction(lastAssistant, false);\n\t\t\tassertCurrent();\n\t\t}\n\n\t\t// Emit before_agent_start before normalizing images so extension-driven model\n\t\t// selection determines the resize profile used for the request and history.\n\t\tconst selectedToolsBefore = this._baseSystemPromptOptions.selectedTools ?? [];\n\t\tconst emitted = await this._extensionRunner.emitBeforeAgentStart(\n\t\t\texpandedText,\n\t\t\tcurrentImages,\n\t\t\tthis._baseSystemPromptOptions,\n\t\t);\n\t\tconst result = emitted ?? { systemPromptOptions: this._baseSystemPromptOptions };\n\t\tassertCurrent();\n\t\tconst nextTools = result.systemPromptOptions.selectedTools ?? selectedToolsBefore;\n\t\tconst handlerEditedTools =\n\t\t\tnextTools.length !== selectedToolsBefore.length ||\n\t\t\tnextTools.some((name, index) => name !== selectedToolsBefore[index]);\n\t\tif (!handlerEditedTools && typeof this.getActiveToolNames === \"function\") {\n\t\t\tresult.systemPromptOptions.selectedTools = this.getActiveToolNames();\n\t\t}\n\n\t\tconst normalized = await _normalizePromptImages.call(this, currentImages);\n\t\tassertCurrent();\n\t\tconst userText = normalized.hints.length > 0 ? `${expandedText}\\n\\n${normalized.hints.join(\"\\n\")}` : expandedText;\n\n\t\t// Build messages only after hooks and image normalization have completed.\n\t\tmessages = [];\n\t\tconst userContent: (TextContent | ImageContent)[] = [{ type: \"text\", text: userText }];\n\t\tuserContent.push(...normalized.images);\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tcontent: userContent,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\n\t\t// Inject any pending \"nextTurn\" messages as context alongside the user message\n\t\tfor (const msg of this._pendingNextTurnMessages) {\n\t\t\tmessages.push(msg);\n\t\t}\n\t\tthis._pendingNextTurnMessages = [];\n\n\t\t// Add all custom messages from extensions\n\t\tif (result?.messages) {\n\t\t\tfor (const msg of result.messages) {\n\t\t\t\tmessages.push({\n\t\t\t\t\trole: \"custom\",\n\t\t\t\t\tcustomType: msg.customType,\n\t\t\t\t\tcontent: msg.content ?? [],\n\t\t\t\t\tdisplay: msg.display,\n\t\t\t\t\tdetails: msg.details,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tconst updateMessage = this._preparePromptAndToolLoadout(result.systemPromptOptions);\n\t\tthis._runSystemPromptOptions = result.systemPromptOptions;\n\t\tif (updateMessage) messages.unshift(updateMessage);\n\t} catch (error) {\n\t\tif (preparingRun) this._isPreparingRun = false;\n\t\tpreflightResult?.(false);\n\t\tthrow error;\n\t}\n\n\tassertCurrent();\n\tlet dispatched = false;\n\tconst reportDispatch = (disposition: PromptDisposition) => {\n\t\tif (dispatched) return;\n\t\tdispatched = true;\n\t\tpreflightResult?.(true, disposition);\n\t};\n\tconst turn = this._runAgentPrompt(messages, workflowDelivery?.promptStarted, reportDispatch, true);\n\tworkflowDelivery?.delivered?.(\"prompt\");\n\ttry {\n\t\tawait turn;\n\t} catch (error) {\n\t\tif (!dispatched) {\n\t\t\tdispatched = true;\n\t\t\tpreflightResult?.(false);\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nexport async function _runAgentPrompt(\n\tthis: AgentSession,\n\tmessages: AgentMessage | AgentMessage[],\n\tpromptStarted?: () => void,\n\treportDispatch?: (disposition: PromptDisposition) => void,\n\tprepared = false,\n\tcustomStarter?: CustomMessage,\n): Promise<void> {\n\tconst lifetime = sessionLifetime(this);\n\tconst owner = resolveWorkflowStageDeliveryTarget(this);\n\tif (owner !== this) {\n\t\tif (owner._queuedMessagesPaused) {\n\t\t\tconst items = Array.isArray(messages) ? messages : [messages];\n\t\t\tfor (const message of items) owner._queueAgentMessage(message, \"steer\");\n\t\t\treportDispatch?.(\"queued\");\n\t\t\treturn;\n\t\t}\n\t\treturn owner._runAgentPrompt(messages, promptStarted, reportDispatch, prepared, customStarter);\n\t}\n\tif (this._isEmittingAgentSettled) {\n\t\tthis._deferredSettledActions.push(\n\t\t\tasync () => await this._runAgentPrompt(messages, promptStarted, reportDispatch, prepared, customStarter),\n\t\t);\n\t\treturn;\n\t}\n\tif (this._activePromptCount === 0 && !this.isStreaming) this._agentRunAbortRequested = false;\n\tconst startingMessages = Array.isArray(messages) ? messages : [messages];\n\tconst customMessage = !prepared\n\t\t? (customStarter ?? startingMessages.find((message) => message.role === \"custom\"))\n\t\t: undefined;\n\tconst ownsPreparation = prepared || customMessage !== undefined;\n\tconst preparation = customMessage ? Promise.withResolvers<void>() : undefined;\n\tif (preparation) {\n\t\tcustomPreparations.set(this, preparation.promise);\n\t\tthis._isPreparingRun = \"custom\";\n\t}\n\tconst releasePreparation = () => {\n\t\tif (preparation && customPreparations.get(this) === preparation.promise) {\n\t\t\tcustomPreparations.delete(this);\n\t\t\tthis._isPreparingRun = false;\n\t\t\tpreparation.resolve();\n\t\t}\n\t};\n\tthis._activePromptCount += 1;\n\ttry {\n\t\tif (this._subagentMessageAdmission) {\n\t\t\tawait this._subagentMessageAdmission.waitForPendingDeliveries();\n\t\t\tif (!this._subagentMessageAdmission.isOpen()) {\n\t\t\t\treportDispatch?.(\"handled\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tconst pendingPriority = preparePriorityContinuation(this);\n\t\tif (pendingPriority) await pendingPriority;\n\t\tif (this._agentRunAbortRequested) {\n\t\t\tif (this.agent.state.isStreaming || this._queuedMessagesPaused) {\n\t\t\t\treportDispatch?.(\"handled\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this._isPreparingRun) this._agentRunAbortRequested = false;\n\t\t}\n\t\t// An explicit stop may win during input preflight or priority preparation.\n\t\t// Preserve the prepared input without opening a native turn past that gate.\n\t\tif (this._queuedMessagesPaused) {\n\t\t\tconst items = Array.isArray(messages) ? messages : [messages];\n\t\t\tfor (const message of items) this._queueAgentMessage(message, \"steer\");\n\t\t\treportDispatch?.(\"queued\");\n\t\t\treturn;\n\t\t}\n\t\tif (customMessage?.role === \"custom\") {\n\t\t\tconst lastAssistant = this._findLastAssistantMessage();\n\t\t\tif (lastAssistant) await this._checkCompaction(lastAssistant, false);\n\t\t\tconst selectedToolsBefore = this._baseSystemPromptOptions.selectedTools ?? [];\n\t\t\tconst result = await this._extensionRunner.emitBeforeAgentStart(\n\t\t\t\t\"\",\n\t\t\t\tundefined,\n\t\t\t\tthis._baseSystemPromptOptions,\n\t\t\t\tcustomMessage,\n\t\t\t);\n\t\t\tconst nextTools = result.systemPromptOptions.selectedTools;\n\t\t\tconst handlerEditedTools =\n\t\t\t\tnextTools.length !== selectedToolsBefore.length ||\n\t\t\t\tnextTools.some((name, index) => name !== selectedToolsBefore[index]);\n\t\t\tif (!handlerEditedTools) result.systemPromptOptions.selectedTools = this.getActiveToolNames();\n\t\t\tmessages = [\n\t\t\t\t...startingMessages,\n\t\t\t\t...this._pendingNextTurnMessages,\n\t\t\t\t...result.messages.map((message) => ({\n\t\t\t\t\t...message,\n\t\t\t\t\trole: \"custom\" as const,\n\t\t\t\t\tcontent: message.content ?? [],\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t})),\n\t\t\t];\n\t\t\tthis._pendingNextTurnMessages = [];\n\t\t\tconst updateMessage = this._preparePromptAndToolLoadout(result.systemPromptOptions);\n\t\t\tthis._runSystemPromptOptions = result.systemPromptOptions;\n\t\t\tif (updateMessage) messages.unshift(updateMessage);\n\t\t}\n\t\tif (this._queuedMessagesPaused) {\n\t\t\tconst items = Array.isArray(messages) ? messages : [messages];\n\t\t\tfor (const message of items) this._queueAgentMessage(message, \"steer\");\n\t\t\treportDispatch?.(\"queued\");\n\t\t\treturn;\n\t\t}\n\t\tif (ownsPreparation) {\n\t\t\tthis._flushPendingBashMessages();\n\t\t\tthis._flushPendingCustomMessages();\n\t\t\tthis._isPreparingRun = false;\n\t\t}\n\t\tif (this._disposed || lifetime.aborted || sessionGenerationClosing.has(this))\n\t\t\tthrow Object.assign(new Error(\"Session is closed\"), { code: \"SessionClosed\" });\n\t\tthis._pendingToolNames.clear();\n\t\treportDispatch?.(\"started\");\n\t\tconst turn = this.agent.prompt(messages);\n\t\treleasePreparation();\n\t\tif (this.isStreaming) promptStarted?.();\n\t\tawait turn;\n\t\tawait this.waitForRetry();\n\t\tif (lifetime.aborted || sessionGenerationClosing.has(this)) return;\n\t\tif (\n\t\t\tthis._agentRunAbortRequested &&\n\t\t\t!this._queuedMessagesPaused &&\n\t\t\tthis._protectedStreamingCustomMessages?.some((entry) => entry.phase === \"queued\")\n\t\t) {\n\t\t\tthis._agentRunAbortRequested = false;\n\t\t}\n\t\t// Abort still has to answer a queued message already in the transcript.\n\t\t// `_continueQueuedAgentMessages` skips remaining queue drains while abort\n\t\t// is requested; skipping it entirely reintroduces issue #2362.\n\t\tawait this._continueQueuedAgentMessages();\n\t\tif (this._agentRunAbortRequested) return;\n\t\tawait this._awaitPendingPostCompactionContinuation();\n\t\tawait runBeforeSettleContinuations(this);\n\t} finally {\n\t\treleasePreparation();\n\t\tif (ownsPreparation && !preparation) this._isPreparingRun = false;\n\t\tthis._runSystemPromptOptions = undefined;\n\t\tthis._cacheWarmer?.onAgentSettled();\n\t\tawait this._agentEventQueue;\n\t\tthis._flushPendingCustomMessages();\n\t\tthis._isEmittingAgentSettled = true;\n\t\ttry {\n\t\t\tconst aborted = this._agentRunAbortRequested === true;\n\t\t\tif (typeof this._extensionRunner?.emit === \"function\") {\n\t\t\t\tawait this._extensionRunner.emit({ type: \"agent_settled\", aborted });\n\t\t\t}\n\t\t\tthis._emit?.({ type: \"agent_settled\", aborted });\n\t\t} finally {\n\t\t\tthis._isEmittingAgentSettled = false;\n\t\t}\n\t\tif (this._subagentMessageAdmission) await settleSubagentMessages(this);\n\t\tthis._activePromptCount -= 1;\n\t\t// Runs deferred by agent_settled handlers start only after every settled handler completed.\n\t\t// Guarded because prompt-handshake suites drive this function on a synthetic session.\n\t\tconst deferred = this._deferredSettledActions?.splice(0) ?? [];\n\t\tfor (const action of deferred) await action();\n\t}\n}\n\n/**\n * Give `agent_before_settle` handlers a chance to append entries and request one explicit\n * continuation before the run settles. Each continuation is followed by the same queued\n * and post-compaction drains as the initial run, then the boundary is offered again.\n */\nasync function runBeforeSettleContinuations(session: AgentSession): Promise<void> {\n\t// Guarded because prompt-handshake suites drive this function on a synthetic session.\n\tif (typeof session._extensionRunner?.hasHandlers !== \"function\") return;\n\tif (typeof session._runBeforeSettleBoundary !== \"function\") return;\n\twhile (!session._agentRunAbortRequested) {\n\t\tawait session._agentEventQueue?.catch(() => {});\n\t\tif (!(await session._runBeforeSettleBoundary())) return;\n\t\t// An explicit stop or a paused queue keeps the requested continuation pending.\n\t\tif (session._agentRunAbortRequested || session._queuedMessagesPaused || session._stopAfterTurnBlockedContinuation)\n\t\t\treturn;\n\t\tawait session._runAgentContinue();\n\t\tif (session._agentRunAbortRequested) return;\n\t\tawait session._awaitPendingPostCompactionContinuation();\n\t}\n}\n\nasync function settleSubagentMessages(session: AgentSession): Promise<void> {\n\tconst admission = session._subagentMessageAdmission!;\n\t// A host-requested stop is terminal for a child, like cancellation. Retain\n\t// protected input for persistence without restarting work or spinning on it.\n\tif (session._stopAfterTurnBlockedContinuation) session.pauseQueuedMessages();\n\t// Keep receiving while admitted input is answered. Seal synchronously only\n\t// after both producer commits and native continuations have drained.\n\tdo {\n\t\tawait admission.waitForPendingDeliveries();\n\t\tawait session._continueQueuedAgentMessages();\n\t\tif (session._stopAfterTurnBlockedContinuation) session.pauseQueuedMessages();\n\t} while (admission.hasPendingDeliveries() || (!session._queuedMessagesPaused && session.agent.hasQueuedMessages()));\n\tadmission.seal();\n}\n\nexport async function _runAgentContinue(this: AgentSession): Promise<void> {\n\tif (this._agentRunAbortRequested || sessionGenerationClosing.has(this) || sessionLifetime(this).aborted) return;\n\tawait this.agent.continue();\n\tawait this.waitForRetry();\n\tawait this._continueQueuedAgentMessages();\n}\n\n/** Restore priority input the moment the native loop can poll it again. */\nfunction preparePriorityContinuation(session: AgentSession): Promise<void> | undefined {\n\tconst boundary = session._subagentMessageAdmission ?? session._workflowStageAdmission;\n\t// Explicit SDK interrupts own a native turn and the shared hold. An admitted\n\t// receiver's task must join that owner before checking its priority input;\n\t// otherwise it can settle before the interrupt finalizer restores the queue.\n\tif (boundary && session._pendingInterruptDeliveries > 0) {\n\t\treturn session._interruptDeliveryQueue.then(() => preparePriorityContinuation(session));\n\t}\n\tconst restore = (): void => {\n\t\tif (!session._priorityInterruptPending) return;\n\t\tsession._priorityInterruptPending = false;\n\t\tsession._restoreAndClearActiveInterruptQueueHold();\n\t};\n\t// Keep the idle prompt start synchronous unless a producer commit is still in flight.\n\tif (!boundary?.hasMessageDeliveries()) {\n\t\trestore();\n\t\treturn undefined;\n\t}\n\t// A producer can enqueue an explicit SDK interrupt while this await yields.\n\t// Recheck its ownership before restoring the shared hold.\n\treturn boundary.waitForMessageDeliveries().then(() => preparePriorityContinuation(session));\n}\n\nexport async function _continueQueuedAgentMessages(this: AgentSession): Promise<void> {\n\tconst lifetime = sessionLifetime(this);\n\tconst closing = () => this._disposed || lifetime.aborted || sessionGenerationClosing.has(this);\n\tif (closing()) return;\n\tawait this._agentEventQueue;\n\tif (closing()) return;\n\tawait preparePriorityContinuation(this);\n\tif (closing()) return;\n\n\tif (\n\t\t!this._agentRunAbortRequested &&\n\t\t!this._stopAfterTurnBlockedContinuation &&\n\t\t!this._queuedMessagesPaused &&\n\t\tthis.agent.hasQueuedMessages()\n\t) {\n\t\twhile (\n\t\t\t!this._agentRunAbortRequested &&\n\t\t\t!closing() &&\n\t\t\t!this._stopAfterTurnBlockedContinuation &&\n\t\t\t!this._queuedMessagesPaused &&\n\t\t\tthis.agent.hasQueuedMessages()\n\t\t) {\n\t\t\tawait this.agent.continue();\n\t\t\tawait this.waitForRetry();\n\t\t\tawait this._agentEventQueue;\n\t\t\tawait preparePriorityContinuation(this);\n\t\t}\n\t}\n\tif (this._stopAfterTurnBlockedContinuation) return;\n\tif (closing()) return;\n\n\tawait answerAdmittedQueuedMessage(this);\n}\n\n/**\n * Answer a queued message the agent loop already admitted into the transcript but\n * never replied to.\n *\n * `pauseQueuedMessages()` can only hold entries still sitting in the agent's own\n * steering/follow-up queues. Once the loop has polled a message it lives inside the\n * loop, is pushed into the transcript on the next iteration, and an interrupt at that\n * moment leaves it with a contentless aborted assistant reply. The message is no\n * longer queued and no longer held, so neither the pause release nor the queued\n * continuation above schedules the turn it is waiting for (issue #2362).\n *\n * This is deliberately disjoint from the paused-hold contract: a *held* message is\n * still released without starting a turn, while an *admitted* one gets its reply.\n */\nasync function answerAdmittedQueuedMessage(session: AgentSession): Promise<void> {\n\tconst admitted = session._admittedQueuedMessageAwaitingReply;\n\t// One attempt per admission: clear before continuing so an interrupt of the\n\t// recovery turn ends the sequence instead of restarting it.\n\tsession._admittedQueuedMessageAwaitingReply = undefined;\n\tif (admitted === undefined || session._disposed) return;\n\t// An interrupt delivery already in flight aborts this reply and then starts its\n\t// own turn, so continuing concurrently would reject the caller's prompt() with\n\t// \"Agent is already processing.\" Wait for it on the same boundary the resume\n\t// path uses, then let the checks below re-read the transcript: a delivery that\n\t// started its own turn changes the tail so they decline, while one that only\n\t// joined a paused hold leaves the admitted message still waiting for its reply.\n\tif (session._pendingInterruptDeliveries > 0) {\n\t\tawait session._interruptDeliveryQueue;\n\t\tif (session._disposed) return;\n\t}\n\n\tconst messages = session.agent.state.messages;\n\tlet replyIndex = messages.length - 1;\n\twhile (replyIndex >= 0 && messages[replyIndex]?.role === \"system\") replyIndex--;\n\tconst reply = messages[replyIndex];\n\t// Only an interrupt that produced nothing is recoverable. A partially streamed\n\t// reply already answered the message; restarting it would duplicate output.\n\tif (reply?.role !== \"assistant\" || reply.stopReason !== \"aborted\" || assistantHasRecoverableOutput(reply)) return;\n\tconst message = messages[replyIndex - 1];\n\tif (message?.role !== \"user\" || session._getUserMessageText(message) !== admitted) return;\n\n\t// Omit the empty aborted reply from the model projection so `continue()` resumes\n\t// from the admitted user message. Raw session history keeps it, as the retry paths do.\n\tsession._omitRecoveryAttempt(reply);\n\t// Publish this turn before it starts. It begins after the pause abort boundary\n\t// resolves, so a submission that only waited for that boundary would race it\n\t// and be rejected by the streaming guard while the queue is still paused.\n\tconst recovery = Promise.resolve().then(async () => {\n\t\tawait session.agent.continue();\n\t\tawait session.waitForRetry();\n\t\tawait session._agentEventQueue;\n\t});\n\tconst settled = recovery.catch(() => undefined);\n\tsession._admittedRecoveryTurn = settled;\n\ttry {\n\t\tawait recovery;\n\t} finally {\n\t\tif (session._admittedRecoveryTurn === settled) session._admittedRecoveryTurn = undefined;\n\t}\n}\n\n/**\n * Try to execute an extension command. Returns true if command was found and executed.\n */\n\nexport async function _tryExecuteExtensionCommand(this: AgentSession, text: string): Promise<boolean> {\n\t// Parse command name and args\n\tconst spaceIndex = text.indexOf(\" \");\n\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\tconst args = spaceIndex === -1 ? \"\" : text.slice(spaceIndex + 1);\n\n\tconst quitSignal = sessionQuitSignal(this);\n\tconst command = this._extensionRunner.getCommand(commandName, quitSignal);\n\tif (!command) return false;\n\n\t// Get command context from extension runner (includes session control methods)\n\tconst ctx = this._extensionRunner.createCommandContext();\n\n\ttry {\n\t\tawait runCallback(\n\t\t\t{ kind: \"extension.hook\", name: `command:${commandName}`, sourcePath: command.sourceInfo.path },\n\t\t\t() => command.handler(args, ctx),\n\t\t);\n\t\treturn true;\n\t} catch (err) {\n\t\tif (quitSignal.aborted) return true;\n\t\t// Emit error via extension runner\n\t\tthis._extensionRunner.emitError({\n\t\t\textensionPath: `command:${commandName}`,\n\t\t\tevent: \"command\",\n\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t});\n\t\treturn true;\n\t}\n}\n\n/**\n * Expand skill commands (/skill:name args) to their full content.\n * Returns the expanded text, or the original text if not a skill command or skill not found.\n * Emits errors via extension runner if file read fails.\n */\n\nexport function _expandSkillCommand(this: AgentSession, text: string): string {\n\tif (!text.startsWith(\"/skill:\")) return text;\n\n\tconst spaceIndex = text.indexOf(\" \");\n\tconst selector = spaceIndex === -1 ? text.slice(7) : text.slice(7, spaceIndex);\n\tconst args = spaceIndex === -1 ? \"\" : text.slice(spaceIndex + 1).trim();\n\tconst resolution = getSkillCatalog(this.resourceLoader).resolve(selector);\n\tif (!resolution.ok) {\n\t\tif (selector.includes(\"@\")) {\n\t\t\tthis._extensionRunner.emitError({\n\t\t\t\textensionPath: `skill:${selector}`,\n\t\t\t\tevent: \"skill_expansion\",\n\t\t\t\terror: resolution.message,\n\t\t\t});\n\t\t}\n\t\treturn text;\n\t}\n\tconst { skill, id } = resolution.candidate;\n\n\ttry {\n\t\tconst content = readFileSync(skill.filePath, \"utf-8\");\n\t\tconst body = stripFrontmatter(content).trim();\n\t\tconst skillBlock = `<skill name=\"${selector}\" location=\"${skill.filePath}\" candidate=\"${id}\">\\nReferences are relative to ${skill.baseDir}.\\n\\n${body}\\n</skill>`;\n\t\treturn args ? `${skillBlock}\\n\\n${args}` : skillBlock;\n\t} catch (err) {\n\t\t// Emit error like extension commands do\n\t\tthis._extensionRunner.emitError({\n\t\t\textensionPath: skill.filePath,\n\t\t\tevent: \"skill_expansion\",\n\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t});\n\t\treturn text; // Return original on error\n\t}\n}\n\nasync function queueUserInput(\n\tsession: AgentSession,\n\ttext: string,\n\timages: ImageContent[] | undefined,\n\tbehavior: \"steer\" | \"followUp\",\n\tsource: NonNullable<PromptOptions[\"source\"]>,\n): Promise<QueuedInputDisposition> {\n\tassertSessionOpen(session);\n\tconst owner = resolveWorkflowStageDeliveryTarget(session);\n\tif (owner !== session) return queueUserInput(owner, text, images, behavior, source);\n\treturn trackSessionWork(session, () => admittedQueueUserInput(session, text, images, behavior, source));\n}\n\nasync function admittedQueueUserInput(\n\tsession: AgentSession,\n\ttext: string,\n\timages: ImageContent[] | undefined,\n\tbehavior: \"steer\" | \"followUp\",\n\tsource: NonNullable<PromptOptions[\"source\"]>,\n): Promise<QueuedInputDisposition> {\n\tconst lifetime = sessionLifetime(session);\n\tif (text.startsWith(\"/\")) session._throwIfExtensionCommand(text);\n\tif (session._extensionRunner?.hasHandlers(\"input\")) {\n\t\tconst result = await session._extensionRunner.emitInput(\n\t\t\ttext,\n\t\t\timages,\n\t\t\tsource,\n\t\t\tsession.isStreaming ? behavior : undefined,\n\t\t);\n\t\tassertSessionOpen(session);\n\t\tif (lifetime.aborted) throw Object.assign(new Error(\"Session is closed\"), { code: \"SessionClosed\" });\n\t\tif (result.action === \"handled\") return \"handled\";\n\t\tif (result.action === \"transform\") {\n\t\t\ttext = result.text;\n\t\t\timages = result.images ?? images;\n\t\t}\n\t}\n\tconst expandedText = expandPromptTemplate(session._expandSkillCommand(text), [...session.promptTemplates]);\n\tif (behavior === \"steer\") await session._queueSteer(expandedText, images);\n\telse await session._queueFollowUp(expandedText, images);\n\treturn \"queued\";\n}\n\n/**\n * Queue a steering message while the agent is running.\n * Delivered after the current assistant turn finishes executing its tool calls,\n * before the next LLM call.\n * Expands skill commands and prompt templates. Errors on extension commands.\n * @param images Optional image attachments to include with the message\n * @throws Error if text is an extension command\n */\n\nexport async function steer(\n\tthis: AgentSession,\n\ttext: string,\n\timages?: ImageContent[],\n\toptions?: Pick<PromptOptions, \"source\">,\n): Promise<QueuedInputDisposition> {\n\treturn queueUserInput(this, text, images, \"steer\", options?.source ?? \"interactive\");\n}\n\n/**\n * Queue a follow-up message to be processed after the agent finishes.\n * Delivered only when agent has no more tool calls or steering messages.\n * Expands skill commands and prompt templates. Errors on extension commands.\n * @param images Optional image attachments to include with the message\n * @throws Error if text is an extension command\n */\n\nexport async function followUp(\n\tthis: AgentSession,\n\ttext: string,\n\timages?: ImageContent[],\n\toptions?: Pick<PromptOptions, \"source\">,\n): Promise<QueuedInputDisposition> {\n\treturn queueUserInput(this, text, images, \"followUp\", options?.source ?? \"interactive\");\n}\n\n/**\n * Send a user message and trigger a turn.\n *\n * By default the text is delivered literally: extension commands are not\n * dispatched and skill commands / prompt templates are not expanded. Set\n * `expandPromptTemplates: true` to dispatch a registered extension or skill\n * command (or expand a prompt template) instead of sending the raw text —\n * with that option the message may DISPATCH a command rather than be sent.\n *\n * @param content User message content (string or content array)\n * @param options.deliverAs Delivery mode when streaming: \"steer\" or \"followUp\"\n * @param options.expandPromptTemplates Whether to dispatch extension commands and expand skill commands and prompt templates. Default: false.\n */\nexport async function sendUserMessage(\n\tthis: AgentSession,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: {\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\texpandPromptTemplates?: boolean;\n\t\t__workflowDelivery?: PromptOptionsWithWorkflowDelivery[\"__workflowDelivery\"];\n\t},\n): Promise<void> {\n\t// Normalize content to text string + optional images\n\tlet text: string;\n\tlet images: ImageContent[] | undefined;\n\n\tif (typeof content === \"string\") {\n\t\ttext = content;\n\t} else {\n\t\tconst textParts: string[] = [];\n\t\timages = [];\n\t\tfor (const part of content) {\n\t\t\tif (part.type === \"text\") {\n\t\t\t\ttextParts.push(part.text);\n\t\t\t} else {\n\t\t\t\timages.push(part);\n\t\t\t}\n\t\t}\n\t\ttext = textParts.join(\"\\n\");\n\t\tif (images.length === 0) images = undefined;\n\t}\n\n\t// prompt() owns command dispatch and template expansion; the default (false)\n\t// keeps every pre-existing caller sending literally. The private delivery hook\n\t// lets workflow routing report and gate the branch selected after asynchronous\n\t// input/compaction extension preflight.\n\tawait this.prompt(text, {\n\t\texpandPromptTemplates: options?.expandPromptTemplates ?? false,\n\t\tstreamingBehavior: options?.deliverAs,\n\t\timages,\n\t\tsource: \"extension\",\n\t\t__workflowDelivery: options?.__workflowDelivery,\n\t} as PromptOptionsWithWorkflowDelivery);\n}\n\n/**\n * Clear all queued messages and return them.\n * Useful for restoring to editor when user aborts.\n * @returns Object with steering and followUp arrays\n */\n\nexport const agentSessionPromptMethods = {\n\tprompt,\n\t_runAgentPrompt,\n\t_runAgentContinue,\n\t_continueQueuedAgentMessages,\n\t_tryExecuteExtensionCommand,\n\t_expandSkillCommand,\n\tsteer,\n\tfollowUp,\n\tsendUserMessage,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-summary.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-summary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,2BAA2B,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAQ9F,gGAAgG;AAChG,MAAM,MAAM,iBAAiB,GAAG;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9E;AAiID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAe5D;AAED,eAAO,MAAM,0BAA0B;;;CAAwD,CAAC"}
1
+ {"version":3,"file":"agent-session-summary.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-summary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,2BAA2B,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAQ9F,gGAAgG;AAChG,MAAM,MAAM,iBAAiB,GAAG;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB9E;AAiID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAe5D;AAED,eAAO,MAAM,0BAA0B;;;CAAwD,CAAC"}
@@ -12,8 +12,23 @@ const MIN_ENTRIES_FOR_SUMMARY = 4;
12
12
  export function _maybeGenerateSessionSummary() {
13
13
  if (this._disposed || sessionGenerationClosing.has(this))
14
14
  return Promise.resolve();
15
- // Keep every launch, including superseded providers, owned until actual settlement.
16
- return trackSessionWork(this, () => generateOwnedSessionSummary.call(this));
15
+ return trackSessionWork(this, async () => {
16
+ const signal = sessionLifetime(this);
17
+ let onAbort;
18
+ const aborted = new Promise((resolve) => {
19
+ onAbort = resolve;
20
+ if (signal.aborted)
21
+ resolve();
22
+ else
23
+ signal.addEventListener("abort", onAbort, { once: true });
24
+ });
25
+ try {
26
+ await Promise.race([generateOwnedSessionSummary.call(this), aborted]);
27
+ }
28
+ finally {
29
+ signal.removeEventListener("abort", onAbort);
30
+ }
31
+ });
17
32
  }
18
33
  async function generateOwnedSessionSummary() {
19
34
  // Held rather than read from the session in `finally`, so an early return can never clear a
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-summary.js","sourceRoot":"","sources":["../../src/core/agent-session-summary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1G,OAAO,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAErG,+EAA+E;AAC/E,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAUlC,MAAM,UAAU,4BAA4B;IAC3C,IAAI,IAAI,CAAC,SAAS,IAAI,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACnF,oFAAoF;IACpF,OAAO,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,KAAK,UAAU,2BAA2B;IACzC,4FAA4F;IAC5F,qDAAqD;IACrD,IAAI,UAAuC,CAAC;IAC5C,IAAI,GAAkC,CAAC;IACvC,IAAI,MAAgC,CAAC;IACrC,IAAI,CAAC;QACJ,mFAAmF;QACnF,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,yBAAyB,EAAE,CAAC,OAAO;YAAE,OAAO;QAEtE,2FAA2F;QAC3F,kEAAkE;QAClE,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO,IAAI,IAAI,CAAC,cAAc,KAAK,MAAM;YAAE,OAAO;QAE9E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,8DAA8D;QAC9D,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,QAAQ;YAAE,OAAO;QAEtD,sFAAsF;QACtF,gBAAgB;QAChB,MAAM,mBAAmB,GAAG,EAAE,IAAI,CAAC,oBAAoB,CAAC;QAExD,0FAA0F;QAC1F,qFAAqF;QACrF,mFAAmF;QACnF,sFAAsF;QACtF,cAAc;QACd,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAE/B,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,IAAI,CAAC,oBAAoB,KAAK,mBAAmB;YAAE,OAAO;QAC9D,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAElD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;QAC/C,IAAI,MAAM,CAAC,MAAM,GAAG,uBAAuB;YAAE,OAAO;QAEpD,MAAM,SAAS,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,wFAAwF;QACxF,wFAAwF;QACxF,mBAAmB;QACnB,MAAM,cAAc,GACnB,IAAI,CAAC,wBAAwB;YAC7B,uBAAuB,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC,EAAE,mBAAmB,CAAC;QAChF,IAAI,SAAS,KAAK,cAAc;YAAE,OAAO;QAEzC,2FAA2F;QAC3F,oFAAoF;QACpF,qFAAqF;QACrF,kEAAkE;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChE,MAAM,QAAQ,CAAC,IAAI,CAAC;YACpB,OAAO;QACR,CAAC;QAED,0FAA0F;QAC1F,2FAA2F;QAC3F,yFAAyF;QACzF,2EAA2E;QAC3E,IAAI,CAAC,8BAA8B,EAAE,KAAK,EAAE,CAAC;QAC7C,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,8BAA8B,GAAG,UAAU,CAAC;QACjD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3E,wFAAwF;QACxF,2FAA2F;QAC3F,yEAAyE;QACzE,2FAA2F;QAC3F,4FAA4F;QAC5F,gGAAgG;QAChG,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC1C,MAAM,GAAG,OAAO,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,GAAG,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC;QAE9B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAE/E,uFAAuF;QACvF,6BAA6B;QAC7B,IAAI,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO;QAC7C,IAAI,IAAI,CAAC,kBAAkB,KAAK,GAAG;YAAE,OAAO;QAE5C,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE;YACnD,KAAK;YACL,MAAM;YACN,OAAO;YACP,OAAO;YACP,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;YACnC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE;SAC9C,CAAC,CAAC;QACH,mFAAmF;QACnF,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAE9D,0FAA0F;QAC1F,uFAAuF;QACvF,qEAAqE;QACrE,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO;QAC3B,IAAI,IAAI,CAAC,kBAAkB,KAAK,GAAG;YAAE,OAAO;QAC5C,IAAI,4BAA4B,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,KAAK,SAAS;YAAE,OAAO;QAExF,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAClF,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACR,mFAAmF;QACnF,yFAAyF;QACzF,kFAAkF;IACnF,CAAC;YAAS,CAAC;QACV,IAAI,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,8BAA8B,KAAK,UAAU,EAAE,CAAC;YACpF,IAAI,CAAC,8BAA8B,GAAG,SAAS,CAAC;QACjD,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,kBAAkB,KAAK,GAAG,EAAE,CAAC;YAC1D,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACrC,CAAC;QACD,yFAAyF;QACzF,kCAAkC;QAClC,MAAM,EAAE,EAAE,CAAC;IACZ,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB;IAClC,8FAA8F;IAC9F,wEAAwE;IACxE,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC5B,IAAI,CAAC,8BAA8B,EAAE,KAAK,EAAE,CAAC;IAC7C,IAAI,CAAC,8BAA8B,GAAG,SAAS,CAAC;IAChD,8FAA8F;IAC9F,2FAA2F;IAC3F,oDAAoD;IACpD,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;IACpC,wFAAwF;IACxF,yFAAyF;IACzF,2FAA2F;IAC3F,oFAAoF;IACpF,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,CAAC","sourcesContent":["/**\n * Session summary generation for the resume picker.\n *\n * Runs once the agent goes idle, decides whether a fresh summary is worth generating, and\n * persists the result. Generation itself lives in core/compaction/session-summarization.ts.\n */\n\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport { generateSessionSummary } from \"./compaction/index.ts\";\nimport { sessionGenerationClosing, sessionLifetime, trackSessionWork } from \"./session-lifecycle-work.ts\";\nimport { getLastConversationMessageId, getLatestSessionSummary } from \"./session-manager-entries.ts\";\n\n/** Sessions shorter than this are already legible from their first message. */\nconst MIN_ENTRIES_FOR_SUMMARY = 4;\n\n/** A summary request in flight, published so a launch describing the same state can join it. */\nexport type SessionSummaryRun = {\n\t/** The conversation state this request describes. */\n\treadonly throughId: string;\n\t/** Settles when the request finishes, whatever the outcome. */\n\treadonly done: Promise<void>;\n};\n\nexport function _maybeGenerateSessionSummary(this: AgentSession): Promise<void> {\n\tif (this._disposed || sessionGenerationClosing.has(this)) return Promise.resolve();\n\t// Keep every launch, including superseded providers, owned until actual settlement.\n\treturn trackSessionWork(this, () => generateOwnedSessionSummary.call(this));\n}\n\nasync function generateOwnedSessionSummary(this: AgentSession): Promise<void> {\n\t// Held rather than read from the session in `finally`, so an early return can never clear a\n\t// controller or run belonging to a different launch.\n\tlet controller: AbortController | undefined;\n\tlet run: SessionSummaryRun | undefined;\n\tlet finish: (() => void) | undefined;\n\ttry {\n\t\t// --- Bail-outs that cannot change while we wait ---------------------------------\n\t\tif (this._disposed) return;\n\t\tif (!this.settingsManager.getSessionSummarySettings().enabled) return;\n\n\t\t// One-shot scripted runs should not pay for a background call; the process may exit before\n\t\t// it lands. \"tui\" and \"rpc\" are the resumable, interactive modes.\n\t\tif (this._extensionMode === \"print\" || this._extensionMode === \"json\") return;\n\n\t\tconst model = this.model;\n\t\tif (!model) return;\n\n\t\t// Workflow-stage sessions are excluded from /resume entirely.\n\t\tif (this.sessionManager.getHeader()?.internal) return;\n\n\t\t// Claim the launch before waiting, so a later turn supersedes this one while both are\n\t\t// parked below.\n\t\tconst sessionSummaryToken = ++this._sessionSummaryToken;\n\n\t\t// `agent_end` fires while the agent still reports isStreaming, and that flag survives the\n\t\t// entire microtask queue — it only clears a macrotask later. Testing it here without\n\t\t// waiting made generation depend on whether `_checkCompaction` happened to cross a\n\t\t// macrotask boundary: green under test, silently skipped in the real TUI, and nothing\n\t\t// retries it.\n\t\tawait this.agent.waitForIdle();\n\n\t\tif (this._disposed) return;\n\t\tif (this._sessionSummaryToken !== sessionSummaryToken) return;\n\t\tif (this.isStreaming || this.isCompacting) return;\n\n\t\tconst branch = this.sessionManager.getBranch();\n\t\tif (branch.length < MIN_ENTRIES_FOR_SUMMARY) return;\n\n\t\tconst throughId = getLastConversationMessageId(branch);\n\t\tif (!throughId) return;\n\n\t\t// On a resumed session the in-memory anchor starts empty, so fall back to the persisted\n\t\t// summary. Without this the first idle after every resume regenerates a summary that is\n\t\t// already current.\n\t\tconst lastSummarized =\n\t\t\tthis._lastSummarizedMessageId ??\n\t\t\tgetLatestSessionSummary(this.sessionManager.getEntries())?.summarizedThroughId;\n\t\tif (throughId === lastSummarized) return;\n\n\t\t// A request already covering this exact conversation state will store the line this launch\n\t\t// would ask for, so wait for it instead of aborting it and paying for a second one.\n\t\t// Overlap is routine rather than exceptional: every turn schedules a launch, and the\n\t\t// previous turn's can still be in flight when the next one wakes.\n\t\tconst inFlight = this._sessionSummaryRun;\n\t\tif (inFlight !== undefined && inFlight.throughId === throughId) {\n\t\t\tawait inFlight.done;\n\t\t\treturn;\n\t\t}\n\n\t\t// Anything still running describes an older conversation state, so retire it and take the\n\t\t// controller. Abort the previous one directly rather than via abortSessionSummary(), which\n\t\t// bumps the token and would invalidate the claim made above. The controller lives on the\n\t\t// session so the prompt, tree-navigation, and shutdown paths can reach it.\n\t\tthis._sessionSummaryAbortController?.abort();\n\t\tcontroller = new AbortController();\n\t\tthis._sessionSummaryAbortController = controller;\n\t\tconst signal = AbortSignal.any([controller.signal, sessionLifetime(this)]);\n\n\t\t// Publish this run before the first await that another launch can overlap. From here on\n\t\t// ownership of the slot, not the token, is what licenses a write: a joiner bumps the token\n\t\t// on its way in, and must not invalidate the very run it is waiting for.\n\t\t// Hand-rolled deferred rather than Promise.withResolvers: coding-agent is the one compiled\n\t\t// package and its lib target predates ES2024, the same reason `_retryPromise` is built this\n\t\t// way. The executor runs synchronously, so `finish` is assigned before the constructor returns.\n\t\tconst done = new Promise<void>((resolve) => {\n\t\t\tfinish = resolve;\n\t\t});\n\t\trun = { throughId, done };\n\t\tthis._sessionSummaryRun = run;\n\n\t\tconst { apiKey, headers, baseUrl } = await this._getRequiredRequestAuth(model);\n\n\t\t// Disposal or a newer turn can land while credentials resolve; nothing past this point\n\t\t// should reach the provider.\n\t\tif (this._disposed || signal.aborted) return;\n\t\tif (this._sessionSummaryRun !== run) return;\n\n\t\tconst result = await generateSessionSummary(branch, {\n\t\t\tmodel,\n\t\t\tapiKey,\n\t\t\theaders,\n\t\t\tbaseUrl,\n\t\t\tsignal,\n\t\t\tstreamFn: this.agent.streamFunction,\n\t\t\tretry: this.settingsManager.getRetrySettings(),\n\t\t});\n\t\t// Failures stay silent: nothing awaits this, and the picker falls back on its own.\n\t\tif (result.aborted || result.error || !result.summary) return;\n\n\t\t// Disposal, cancellation, a newer run, or a newer message all mean this summary no longer\n\t\t// describes the session. The signal is checked directly as well as the token because a\n\t\t// provider that ignores the signal still returns an ordinary result.\n\t\tif (this._disposed) return;\n\t\tif (signal.aborted) return;\n\t\tif (this._sessionSummaryRun !== run) return;\n\t\tif (getLastConversationMessageId(this.sessionManager.getBranch()) !== throughId) return;\n\n\t\tthis.sessionManager.appendSessionSummary(result.summary, throughId, result.usage);\n\t\tthis._lastSummarizedMessageId = throughId;\n\t} catch {\n\t\t// Nothing awaits this call, so an escaping rejection would surface as an unhandled\n\t\t// rejection and can take the process down. Credential resolution throws outright when no\n\t\t// key is configured, which is an ordinary state for a session that never prompts.\n\t} finally {\n\t\tif (controller !== undefined && this._sessionSummaryAbortController === controller) {\n\t\t\tthis._sessionSummaryAbortController = undefined;\n\t\t}\n\t\tif (run !== undefined && this._sessionSummaryRun === run) {\n\t\t\tthis._sessionSummaryRun = undefined;\n\t\t}\n\t\t// Settled on every path, including a throw and every early return above: a joiner parked\n\t\t// on `done` has no other way out.\n\t\tfinish?.();\n\t}\n}\n\nexport function abortSessionSummary(this: AgentSession): void {\n\t// Bump the token as well as aborting: a launch parked on waitForIdle() has no controller yet,\n\t// and would otherwise survive a prompt, a tree navigation, or disposal.\n\tthis._sessionSummaryToken++;\n\tthis._sessionSummaryAbortController?.abort();\n\tthis._sessionSummaryAbortController = undefined;\n\t// Retire the published run too. It is what licenses a write once a request is in flight, so a\n\t// provider that ignores its signal must still fail the ownership check, and a later launch\n\t// must not join a run that has just been cancelled.\n\tthis._sessionSummaryRun = undefined;\n\t// Drop the in-memory anchor as well. It is only a cache of the persisted state, and the\n\t// persisted lookup is retirement-aware where the cache is not: after branchWithSummary()\n\t// retires the stored summary, a cached anchor that still matches the last message id would\n\t// skip regeneration and leave the picker on fallback text until the next real turn.\n\tthis._lastSummarizedMessageId = undefined;\n}\n\nexport const agentSessionSummaryMethods = { _maybeGenerateSessionSummary, abortSessionSummary };\n"]}
1
+ {"version":3,"file":"agent-session-summary.js","sourceRoot":"","sources":["../../src/core/agent-session-summary.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session summary generation for the resume picker.\n *\n * Runs once the agent goes idle, decides whether a fresh summary is worth generating, and\n * persists the result. Generation itself lives in core/compaction/session-summarization.ts.\n */\n\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport { generateSessionSummary } from \"./compaction/index.ts\";\nimport { sessionGenerationClosing, sessionLifetime, trackSessionWork } from \"./session-lifecycle-work.ts\";\nimport { getLastConversationMessageId, getLatestSessionSummary } from \"./session-manager-entries.ts\";\n\n/** Sessions shorter than this are already legible from their first message. */\nconst MIN_ENTRIES_FOR_SUMMARY = 4;\n\n/** A summary request in flight, published so a launch describing the same state can join it. */\nexport type SessionSummaryRun = {\n\t/** The conversation state this request describes. */\n\treadonly throughId: string;\n\t/** Settles when the request finishes, whatever the outcome. */\n\treadonly done: Promise<void>;\n};\n\nexport function _maybeGenerateSessionSummary(this: AgentSession): Promise<void> {\n\tif (this._disposed || sessionGenerationClosing.has(this)) return Promise.resolve();\n\treturn trackSessionWork(this, async () => {\n\t\tconst signal = sessionLifetime(this);\n\t\tlet onAbort!: () => void;\n\t\tconst aborted = new Promise<void>((resolve) => {\n\t\t\tonAbort = resolve;\n\t\t\tif (signal.aborted) resolve();\n\t\t\telse signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t});\n\t\ttry {\n\t\t\tawait Promise.race([generateOwnedSessionSummary.call(this), aborted]);\n\t\t} finally {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t});\n}\n\nasync function generateOwnedSessionSummary(this: AgentSession): Promise<void> {\n\t// Held rather than read from the session in `finally`, so an early return can never clear a\n\t// controller or run belonging to a different launch.\n\tlet controller: AbortController | undefined;\n\tlet run: SessionSummaryRun | undefined;\n\tlet finish: (() => void) | undefined;\n\ttry {\n\t\t// --- Bail-outs that cannot change while we wait ---------------------------------\n\t\tif (this._disposed) return;\n\t\tif (!this.settingsManager.getSessionSummarySettings().enabled) return;\n\n\t\t// One-shot scripted runs should not pay for a background call; the process may exit before\n\t\t// it lands. \"tui\" and \"rpc\" are the resumable, interactive modes.\n\t\tif (this._extensionMode === \"print\" || this._extensionMode === \"json\") return;\n\n\t\tconst model = this.model;\n\t\tif (!model) return;\n\n\t\t// Workflow-stage sessions are excluded from /resume entirely.\n\t\tif (this.sessionManager.getHeader()?.internal) return;\n\n\t\t// Claim the launch before waiting, so a later turn supersedes this one while both are\n\t\t// parked below.\n\t\tconst sessionSummaryToken = ++this._sessionSummaryToken;\n\n\t\t// `agent_end` fires while the agent still reports isStreaming, and that flag survives the\n\t\t// entire microtask queue — it only clears a macrotask later. Testing it here without\n\t\t// waiting made generation depend on whether `_checkCompaction` happened to cross a\n\t\t// macrotask boundary: green under test, silently skipped in the real TUI, and nothing\n\t\t// retries it.\n\t\tawait this.agent.waitForIdle();\n\n\t\tif (this._disposed) return;\n\t\tif (this._sessionSummaryToken !== sessionSummaryToken) return;\n\t\tif (this.isStreaming || this.isCompacting) return;\n\n\t\tconst branch = this.sessionManager.getBranch();\n\t\tif (branch.length < MIN_ENTRIES_FOR_SUMMARY) return;\n\n\t\tconst throughId = getLastConversationMessageId(branch);\n\t\tif (!throughId) return;\n\n\t\t// On a resumed session the in-memory anchor starts empty, so fall back to the persisted\n\t\t// summary. Without this the first idle after every resume regenerates a summary that is\n\t\t// already current.\n\t\tconst lastSummarized =\n\t\t\tthis._lastSummarizedMessageId ??\n\t\t\tgetLatestSessionSummary(this.sessionManager.getEntries())?.summarizedThroughId;\n\t\tif (throughId === lastSummarized) return;\n\n\t\t// A request already covering this exact conversation state will store the line this launch\n\t\t// would ask for, so wait for it instead of aborting it and paying for a second one.\n\t\t// Overlap is routine rather than exceptional: every turn schedules a launch, and the\n\t\t// previous turn's can still be in flight when the next one wakes.\n\t\tconst inFlight = this._sessionSummaryRun;\n\t\tif (inFlight !== undefined && inFlight.throughId === throughId) {\n\t\t\tawait inFlight.done;\n\t\t\treturn;\n\t\t}\n\n\t\t// Anything still running describes an older conversation state, so retire it and take the\n\t\t// controller. Abort the previous one directly rather than via abortSessionSummary(), which\n\t\t// bumps the token and would invalidate the claim made above. The controller lives on the\n\t\t// session so the prompt, tree-navigation, and shutdown paths can reach it.\n\t\tthis._sessionSummaryAbortController?.abort();\n\t\tcontroller = new AbortController();\n\t\tthis._sessionSummaryAbortController = controller;\n\t\tconst signal = AbortSignal.any([controller.signal, sessionLifetime(this)]);\n\n\t\t// Publish this run before the first await that another launch can overlap. From here on\n\t\t// ownership of the slot, not the token, is what licenses a write: a joiner bumps the token\n\t\t// on its way in, and must not invalidate the very run it is waiting for.\n\t\t// Hand-rolled deferred rather than Promise.withResolvers: coding-agent is the one compiled\n\t\t// package and its lib target predates ES2024, the same reason `_retryPromise` is built this\n\t\t// way. The executor runs synchronously, so `finish` is assigned before the constructor returns.\n\t\tconst done = new Promise<void>((resolve) => {\n\t\t\tfinish = resolve;\n\t\t});\n\t\trun = { throughId, done };\n\t\tthis._sessionSummaryRun = run;\n\n\t\tconst { apiKey, headers, baseUrl } = await this._getRequiredRequestAuth(model);\n\n\t\t// Disposal or a newer turn can land while credentials resolve; nothing past this point\n\t\t// should reach the provider.\n\t\tif (this._disposed || signal.aborted) return;\n\t\tif (this._sessionSummaryRun !== run) return;\n\n\t\tconst result = await generateSessionSummary(branch, {\n\t\t\tmodel,\n\t\t\tapiKey,\n\t\t\theaders,\n\t\t\tbaseUrl,\n\t\t\tsignal,\n\t\t\tstreamFn: this.agent.streamFunction,\n\t\t\tretry: this.settingsManager.getRetrySettings(),\n\t\t});\n\t\t// Failures stay silent: nothing awaits this, and the picker falls back on its own.\n\t\tif (result.aborted || result.error || !result.summary) return;\n\n\t\t// Disposal, cancellation, a newer run, or a newer message all mean this summary no longer\n\t\t// describes the session. The signal is checked directly as well as the token because a\n\t\t// provider that ignores the signal still returns an ordinary result.\n\t\tif (this._disposed) return;\n\t\tif (signal.aborted) return;\n\t\tif (this._sessionSummaryRun !== run) return;\n\t\tif (getLastConversationMessageId(this.sessionManager.getBranch()) !== throughId) return;\n\n\t\tthis.sessionManager.appendSessionSummary(result.summary, throughId, result.usage);\n\t\tthis._lastSummarizedMessageId = throughId;\n\t} catch {\n\t\t// Nothing awaits this call, so an escaping rejection would surface as an unhandled\n\t\t// rejection and can take the process down. Credential resolution throws outright when no\n\t\t// key is configured, which is an ordinary state for a session that never prompts.\n\t} finally {\n\t\tif (controller !== undefined && this._sessionSummaryAbortController === controller) {\n\t\t\tthis._sessionSummaryAbortController = undefined;\n\t\t}\n\t\tif (run !== undefined && this._sessionSummaryRun === run) {\n\t\t\tthis._sessionSummaryRun = undefined;\n\t\t}\n\t\t// Settled on every path, including a throw and every early return above: a joiner parked\n\t\t// on `done` has no other way out.\n\t\tfinish?.();\n\t}\n}\n\nexport function abortSessionSummary(this: AgentSession): void {\n\t// Bump the token as well as aborting: a launch parked on waitForIdle() has no controller yet,\n\t// and would otherwise survive a prompt, a tree navigation, or disposal.\n\tthis._sessionSummaryToken++;\n\tthis._sessionSummaryAbortController?.abort();\n\tthis._sessionSummaryAbortController = undefined;\n\t// Retire the published run too. It is what licenses a write once a request is in flight, so a\n\t// provider that ignores its signal must still fail the ownership check, and a later launch\n\t// must not join a run that has just been cancelled.\n\tthis._sessionSummaryRun = undefined;\n\t// Drop the in-memory anchor as well. It is only a cache of the persisted state, and the\n\t// persisted lookup is retirement-aware where the cache is not: after branchWithSummary()\n\t// retires the stored summary, a cached anchor that still matches the last message id would\n\t// skip regeneration and leave the picker on fallback text until the next real turn.\n\tthis._lastSummarizedMessageId = undefined;\n}\n\nexport const agentSessionSummaryMethods = { _maybeGenerateSessionSummary, abortSessionSummary };\n"]}
@@ -25,7 +25,7 @@ export async function navigateTree(targetId, options = {}) {
25
25
  assertSessionOpen(this);
26
26
  // Navigating away mid-response would strand the in-flight turn's tool calls on
27
27
  // the abandoned branch. Callers abort first, then navigate.
28
- if (this.isStreaming) {
28
+ if (this.isStreaming || this._isPreparingRun === "user") {
29
29
  throw new Error("Wait for the current response to finish before navigating the session tree.");
30
30
  }
31
31
  if (this.isCompacting) {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-tree.js","sourceRoot":"","sources":["../../src/core/agent-session-tree.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport { collectEntriesForBranchSummary, generateBranchSummary } from \"./compaction/index.ts\";\nimport type { SessionBeforeTreeResult, TreePreparation } from \"./extensions/index.js\";\nimport { assertSessionOpen } from \"./session-lifecycle-work.ts\";\nimport type { BranchSummaryEntry } from \"./session-manager.ts\";\nimport { createSummarizationRetryCallbacks } from \"./summarization-retry.ts\";\n\nexport function setSessionName(this: AgentSession, name: string): void {\n\tthis.sessionManager.appendSessionInfo(name);\n\tconst event = { type: \"session_info_changed\", name: this.sessionManager.getSessionName() } as const;\n\tthis._emit(event);\n\tvoid this._extensionRunner.emit(event);\n}\n\n// =========================================================================\n// Tree Navigation\n// =========================================================================\n\n/**\n * Navigate to a different node in the session tree.\n * Unlike fork() which creates a new session file, this stays in the same file.\n *\n * @param targetId The entry ID to navigate to\n * @param options.summarize Whether user wants to summarize abandoned branch\n * @param options.customInstructions Custom instructions for summarizer\n * @param options.replaceInstructions If true, customInstructions replaces the default prompt\n * @param options.label Label to attach to the branch summary entry\n * @returns Result with editorText (if user message) and cancelled status\n */\n\nexport async function navigateTree(\n\tthis: AgentSession,\n\ttargetId: string,\n\toptions: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string } = {},\n): Promise<{ editorText?: string; cancelled: boolean; aborted?: boolean; summaryEntry?: BranchSummaryEntry }> {\n\tassertSessionOpen(this);\n\t// Navigating away mid-response would strand the in-flight turn's tool calls on\n\t// the abandoned branch. Callers abort first, then navigate.\n\tif (this.isStreaming) {\n\t\tthrow new Error(\"Wait for the current response to finish before navigating the session tree.\");\n\t}\n\tif (this.isCompacting) {\n\t\tthrow new Error(\n\t\t\t\"Wait for the current compaction or tree navigation to finish before navigating the session tree.\",\n\t\t);\n\t}\n\n\tconst oldLeafId = this.sessionManager.getLeafId();\n\n\t// No-op if already at target\n\tif (targetId === oldLeafId) {\n\t\treturn { cancelled: false };\n\t}\n\n\t// Model required for summarization\n\tif (options.summarize && !this.model) {\n\t\tthrow new Error(\"No model available for summarization\");\n\t}\n\n\tconst targetEntry = this.sessionManager.getEntry(targetId);\n\tif (!targetEntry) {\n\t\tthrow new Error(`Entry ${targetId} not found`);\n\t}\n\n\t// Collect entries to summarize (from old leaf to common ancestor)\n\tconst { entries: entriesToSummarize, commonAncestorId } = collectEntriesForBranchSummary(\n\t\tthis.sessionManager,\n\t\toldLeafId,\n\t\ttargetId,\n\t);\n\n\t// Prepare event data - mutable so extensions can override\n\tlet customInstructions = options.customInstructions;\n\tlet replaceInstructions = options.replaceInstructions;\n\tlet label = options.label;\n\n\tconst preparation: TreePreparation = {\n\t\ttargetId,\n\t\toldLeafId,\n\t\tcommonAncestorId,\n\t\tentriesToSummarize,\n\t\tuserWantsSummary: options.summarize ?? false,\n\t\tcustomInstructions,\n\t\treplaceInstructions,\n\t\tlabel,\n\t};\n\n\t// Moving the leaf invalidates any session summary still in flight: it was generated from the\n\t// branch we are leaving. Its anchor can survive the move — a `branch_summary` is not a\n\t// conversation message, and navigating to an existing assistant message leaves the last\n\t// message id unchanged — so the anchor check alone would let it persist against the new\n\t// branch. Cancelling here is what the signal check before persistence keys off.\n\tthis.abortSessionSummary();\n\n\t// Set up abort controller for summarization\n\tthis._branchSummaryAbortController = new AbortController();\n\tif (this._compactionReason === undefined) this._compactionReason = \"branchSummary\";\n\tlet finishBranchSummary = (): void => {};\n\tconst branchSummaryCompletion = new Promise<void>((resolve) => {\n\t\tfinishBranchSummary = resolve;\n\t});\n\tthis._branchSummaryCompletion = branchSummaryCompletion;\n\n\ttry {\n\t\tlet extensionSummary: { summary: string; details?: unknown } | undefined;\n\t\tlet fromExtension = false;\n\n\t\t// Emit session_before_tree event\n\t\tif (this._extensionRunner.hasHandlers(\"session_before_tree\")) {\n\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_tree\",\n\t\t\t\tpreparation,\n\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t})) as SessionBeforeTreeResult | undefined;\n\n\t\t\tassertSessionOpen(this);\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn { cancelled: true };\n\t\t\t}\n\n\t\t\tif (result?.summary && options.summarize) {\n\t\t\t\textensionSummary = result.summary;\n\t\t\t\tfromExtension = true;\n\t\t\t}\n\n\t\t\t// Allow extensions to override instructions and label\n\t\t\tif (result?.customInstructions !== undefined) {\n\t\t\t\tcustomInstructions = result.customInstructions;\n\t\t\t}\n\t\t\tif (result?.replaceInstructions !== undefined) {\n\t\t\t\treplaceInstructions = result.replaceInstructions;\n\t\t\t}\n\t\t\tif (result?.label !== undefined) {\n\t\t\t\tlabel = result.label;\n\t\t\t}\n\t\t}\n\n\t\t// Run default summarizer if needed\n\t\tlet summaryText: string | undefined;\n\t\tlet summaryDetails: unknown;\n\t\tlet summaryUsage: import(\"@bastani/pi-ai/compat\").Usage | undefined;\n\t\tif (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {\n\t\t\tconst model = this.model!;\n\t\t\tconst { apiKey, headers, baseUrl } = await this._getRequiredRequestAuth(model);\n\t\t\tassertSessionOpen(this);\n\t\t\tconst branchSummarySettings = this.settingsManager.getBranchSummarySettings();\n\t\t\tconst result = await generateBranchSummary(entriesToSummarize, {\n\t\t\t\tmodel,\n\t\t\t\tapiKey,\n\t\t\t\theaders,\n\t\t\t\tbaseUrl,\n\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t\tcustomInstructions,\n\t\t\t\treplaceInstructions,\n\t\t\t\treserveTokens: branchSummarySettings.reserveTokens,\n\t\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\t\tstreamFn: this.agent.streamFunction,\n\t\t\t\tretry: this.settingsManager.getRetrySettings(),\n\t\t\t\tcallbacks: createSummarizationRetryCallbacks(this, { source: \"branchSummary\" }),\n\t\t\t});\n\t\t\tif (result.aborted) {\n\t\t\t\treturn { cancelled: true, aborted: true };\n\t\t\t}\n\t\t\tif (result.error) {\n\t\t\t\tthrow new Error(result.error);\n\t\t\t}\n\t\t\tsummaryText = result.summary;\n\t\t\tsummaryUsage = result.usage;\n\t\t\tsummaryDetails = {\n\t\t\t\treadFiles: result.readFiles || [],\n\t\t\t\tmodifiedFiles: result.modifiedFiles || [],\n\t\t\t};\n\t\t} else if (extensionSummary) {\n\t\t\tsummaryText = extensionSummary.summary;\n\t\t\tsummaryDetails = extensionSummary.details;\n\t\t}\n\n\t\tassertSessionOpen(this);\n\t\t// Determine the new leaf position based on target type\n\t\tlet newLeafId: string | null;\n\t\tlet editorText: string | undefined;\n\n\t\tif (targetEntry.type === \"message\" && targetEntry.message.role === \"user\") {\n\t\t\t// User message: leaf = parent (null if root), text goes to editor\n\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\teditorText = this._extractUserMessageText(targetEntry.message.content);\n\t\t} else if (targetEntry.type === \"custom_message\") {\n\t\t\t// Custom message: leaf = parent (null if root), text goes to editor\n\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\teditorText =\n\t\t\t\ttypeof targetEntry.content === \"string\"\n\t\t\t\t\t? targetEntry.content\n\t\t\t\t\t: targetEntry.content\n\t\t\t\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t\t\t\t.map((c) => c.text)\n\t\t\t\t\t\t\t.join(\"\");\n\t\t} else {\n\t\t\t// Non-user message: leaf = selected node\n\t\t\tnewLeafId = targetId;\n\t\t}\n\n\t\t// Switch leaf (with or without summary)\n\t\t// Summary is attached at the navigation target position (newLeafId), not the old branch\n\t\tlet summaryEntry: BranchSummaryEntry | undefined;\n\t\tif (summaryText) {\n\t\t\t// Create summary at target position (can be null for root)\n\t\t\tconst summaryId = this.sessionManager.branchWithSummary(\n\t\t\t\tnewLeafId,\n\t\t\t\tsummaryText,\n\t\t\t\tsummaryDetails,\n\t\t\t\tfromExtension,\n\t\t\t\tsummaryUsage,\n\t\t\t\toldLeafId ?? \"root\",\n\t\t\t);\n\t\t\tsummaryEntry = this.sessionManager.getEntry(summaryId) as BranchSummaryEntry;\n\n\t\t\t// Attach label to the summary entry\n\t\t\tif (label) {\n\t\t\t\tthis.sessionManager.appendLabelChange(summaryId, label);\n\t\t\t}\n\t\t} else if (newLeafId === null) {\n\t\t\t// No summary, navigating to root - reset leaf\n\t\t\tthis.sessionManager.resetLeaf();\n\t\t} else {\n\t\t\t// No summary, navigating to non-root\n\t\t\tthis.sessionManager.branch(newLeafId);\n\t\t}\n\n\t\t// Attach label to target entry when not summarizing (no summary entry to label)\n\t\tif (label && !summaryText) {\n\t\t\tthis.sessionManager.appendLabelChange(targetId, label);\n\t\t}\n\n\t\t// Update finalized context from the canonical session projection.\n\t\tthis._refreshFinalizedContext();\n\t\tthis._restoreToolsFromTranscript();\n\n\t\t// Emit session_tree event\n\t\tawait this._extensionRunner.emit({\n\t\t\ttype: \"session_tree\",\n\t\t\tnewLeafId: this.sessionManager.getLeafId(),\n\t\t\toldLeafId,\n\t\t\tsummaryEntry,\n\t\t\tfromExtension: summaryText ? fromExtension : undefined,\n\t\t});\n\n\t\t// Emit to custom tools\n\n\t\treturn { editorText, cancelled: false, summaryEntry };\n\t} finally {\n\t\tthis._branchSummaryAbortController = undefined;\n\t\tif (this._compactionReason === \"branchSummary\") this._compactionReason = undefined;\n\t\tfinishBranchSummary();\n\t\tif (this._branchSummaryCompletion === branchSummaryCompletion) this._branchSummaryCompletion = undefined;\n\t}\n}\n\n/**\n * Get all user messages from session for fork selector.\n */\n\nexport function getUserMessagesForForking(this: AgentSession): Array<{ entryId: string; text: string }> {\n\tconst entries = this.sessionManager.getEntries();\n\tconst result: Array<{ entryId: string; text: string }> = [];\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tif (entry.message.role !== \"user\") continue;\n\n\t\tconst text = this._extractUserMessageText(entry.message.content);\n\t\tif (text) {\n\t\t\tresult.push({ entryId: entry.id, text });\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function _extractUserMessageText(\n\tthis: AgentSession,\n\tcontent: string | Array<{ type: string; text?: string }>,\n): string {\n\tif (typeof content === \"string\") return content;\n\tif (Array.isArray(content)) {\n\t\treturn content\n\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t.map((c) => c.text)\n\t\t\t.join(\"\");\n\t}\n\treturn \"\";\n}\n\n/**\n * Get session statistics.\n */\n\nexport const agentSessionTreeMethods = {\n\tsetSessionName,\n\tnavigateTree,\n\tgetUserMessagesForForking,\n\t_extractUserMessageText,\n};\n"]}
1
+ {"version":3,"file":"agent-session-tree.js","sourceRoot":"","sources":["../../src/core/agent-session-tree.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport { collectEntriesForBranchSummary, generateBranchSummary } from \"./compaction/index.ts\";\nimport type { SessionBeforeTreeResult, TreePreparation } from \"./extensions/index.js\";\nimport { assertSessionOpen } from \"./session-lifecycle-work.ts\";\nimport type { BranchSummaryEntry } from \"./session-manager.ts\";\nimport { createSummarizationRetryCallbacks } from \"./summarization-retry.ts\";\n\nexport function setSessionName(this: AgentSession, name: string): void {\n\tthis.sessionManager.appendSessionInfo(name);\n\tconst event = { type: \"session_info_changed\", name: this.sessionManager.getSessionName() } as const;\n\tthis._emit(event);\n\tvoid this._extensionRunner.emit(event);\n}\n\n// =========================================================================\n// Tree Navigation\n// =========================================================================\n\n/**\n * Navigate to a different node in the session tree.\n * Unlike fork() which creates a new session file, this stays in the same file.\n *\n * @param targetId The entry ID to navigate to\n * @param options.summarize Whether user wants to summarize abandoned branch\n * @param options.customInstructions Custom instructions for summarizer\n * @param options.replaceInstructions If true, customInstructions replaces the default prompt\n * @param options.label Label to attach to the branch summary entry\n * @returns Result with editorText (if user message) and cancelled status\n */\n\nexport async function navigateTree(\n\tthis: AgentSession,\n\ttargetId: string,\n\toptions: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string } = {},\n): Promise<{ editorText?: string; cancelled: boolean; aborted?: boolean; summaryEntry?: BranchSummaryEntry }> {\n\tassertSessionOpen(this);\n\t// Navigating away mid-response would strand the in-flight turn's tool calls on\n\t// the abandoned branch. Callers abort first, then navigate.\n\tif (this.isStreaming || this._isPreparingRun === \"user\") {\n\t\tthrow new Error(\"Wait for the current response to finish before navigating the session tree.\");\n\t}\n\tif (this.isCompacting) {\n\t\tthrow new Error(\n\t\t\t\"Wait for the current compaction or tree navigation to finish before navigating the session tree.\",\n\t\t);\n\t}\n\n\tconst oldLeafId = this.sessionManager.getLeafId();\n\n\t// No-op if already at target\n\tif (targetId === oldLeafId) {\n\t\treturn { cancelled: false };\n\t}\n\n\t// Model required for summarization\n\tif (options.summarize && !this.model) {\n\t\tthrow new Error(\"No model available for summarization\");\n\t}\n\n\tconst targetEntry = this.sessionManager.getEntry(targetId);\n\tif (!targetEntry) {\n\t\tthrow new Error(`Entry ${targetId} not found`);\n\t}\n\n\t// Collect entries to summarize (from old leaf to common ancestor)\n\tconst { entries: entriesToSummarize, commonAncestorId } = collectEntriesForBranchSummary(\n\t\tthis.sessionManager,\n\t\toldLeafId,\n\t\ttargetId,\n\t);\n\n\t// Prepare event data - mutable so extensions can override\n\tlet customInstructions = options.customInstructions;\n\tlet replaceInstructions = options.replaceInstructions;\n\tlet label = options.label;\n\n\tconst preparation: TreePreparation = {\n\t\ttargetId,\n\t\toldLeafId,\n\t\tcommonAncestorId,\n\t\tentriesToSummarize,\n\t\tuserWantsSummary: options.summarize ?? false,\n\t\tcustomInstructions,\n\t\treplaceInstructions,\n\t\tlabel,\n\t};\n\n\t// Moving the leaf invalidates any session summary still in flight: it was generated from the\n\t// branch we are leaving. Its anchor can survive the move — a `branch_summary` is not a\n\t// conversation message, and navigating to an existing assistant message leaves the last\n\t// message id unchanged — so the anchor check alone would let it persist against the new\n\t// branch. Cancelling here is what the signal check before persistence keys off.\n\tthis.abortSessionSummary();\n\n\t// Set up abort controller for summarization\n\tthis._branchSummaryAbortController = new AbortController();\n\tif (this._compactionReason === undefined) this._compactionReason = \"branchSummary\";\n\tlet finishBranchSummary = (): void => {};\n\tconst branchSummaryCompletion = new Promise<void>((resolve) => {\n\t\tfinishBranchSummary = resolve;\n\t});\n\tthis._branchSummaryCompletion = branchSummaryCompletion;\n\n\ttry {\n\t\tlet extensionSummary: { summary: string; details?: unknown } | undefined;\n\t\tlet fromExtension = false;\n\n\t\t// Emit session_before_tree event\n\t\tif (this._extensionRunner.hasHandlers(\"session_before_tree\")) {\n\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_tree\",\n\t\t\t\tpreparation,\n\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t})) as SessionBeforeTreeResult | undefined;\n\n\t\t\tassertSessionOpen(this);\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn { cancelled: true };\n\t\t\t}\n\n\t\t\tif (result?.summary && options.summarize) {\n\t\t\t\textensionSummary = result.summary;\n\t\t\t\tfromExtension = true;\n\t\t\t}\n\n\t\t\t// Allow extensions to override instructions and label\n\t\t\tif (result?.customInstructions !== undefined) {\n\t\t\t\tcustomInstructions = result.customInstructions;\n\t\t\t}\n\t\t\tif (result?.replaceInstructions !== undefined) {\n\t\t\t\treplaceInstructions = result.replaceInstructions;\n\t\t\t}\n\t\t\tif (result?.label !== undefined) {\n\t\t\t\tlabel = result.label;\n\t\t\t}\n\t\t}\n\n\t\t// Run default summarizer if needed\n\t\tlet summaryText: string | undefined;\n\t\tlet summaryDetails: unknown;\n\t\tlet summaryUsage: import(\"@bastani/pi-ai/compat\").Usage | undefined;\n\t\tif (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {\n\t\t\tconst model = this.model!;\n\t\t\tconst { apiKey, headers, baseUrl } = await this._getRequiredRequestAuth(model);\n\t\t\tassertSessionOpen(this);\n\t\t\tconst branchSummarySettings = this.settingsManager.getBranchSummarySettings();\n\t\t\tconst result = await generateBranchSummary(entriesToSummarize, {\n\t\t\t\tmodel,\n\t\t\t\tapiKey,\n\t\t\t\theaders,\n\t\t\t\tbaseUrl,\n\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t\tcustomInstructions,\n\t\t\t\treplaceInstructions,\n\t\t\t\treserveTokens: branchSummarySettings.reserveTokens,\n\t\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\t\tstreamFn: this.agent.streamFunction,\n\t\t\t\tretry: this.settingsManager.getRetrySettings(),\n\t\t\t\tcallbacks: createSummarizationRetryCallbacks(this, { source: \"branchSummary\" }),\n\t\t\t});\n\t\t\tif (result.aborted) {\n\t\t\t\treturn { cancelled: true, aborted: true };\n\t\t\t}\n\t\t\tif (result.error) {\n\t\t\t\tthrow new Error(result.error);\n\t\t\t}\n\t\t\tsummaryText = result.summary;\n\t\t\tsummaryUsage = result.usage;\n\t\t\tsummaryDetails = {\n\t\t\t\treadFiles: result.readFiles || [],\n\t\t\t\tmodifiedFiles: result.modifiedFiles || [],\n\t\t\t};\n\t\t} else if (extensionSummary) {\n\t\t\tsummaryText = extensionSummary.summary;\n\t\t\tsummaryDetails = extensionSummary.details;\n\t\t}\n\n\t\tassertSessionOpen(this);\n\t\t// Determine the new leaf position based on target type\n\t\tlet newLeafId: string | null;\n\t\tlet editorText: string | undefined;\n\n\t\tif (targetEntry.type === \"message\" && targetEntry.message.role === \"user\") {\n\t\t\t// User message: leaf = parent (null if root), text goes to editor\n\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\teditorText = this._extractUserMessageText(targetEntry.message.content);\n\t\t} else if (targetEntry.type === \"custom_message\") {\n\t\t\t// Custom message: leaf = parent (null if root), text goes to editor\n\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\teditorText =\n\t\t\t\ttypeof targetEntry.content === \"string\"\n\t\t\t\t\t? targetEntry.content\n\t\t\t\t\t: targetEntry.content\n\t\t\t\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t\t\t\t.map((c) => c.text)\n\t\t\t\t\t\t\t.join(\"\");\n\t\t} else {\n\t\t\t// Non-user message: leaf = selected node\n\t\t\tnewLeafId = targetId;\n\t\t}\n\n\t\t// Switch leaf (with or without summary)\n\t\t// Summary is attached at the navigation target position (newLeafId), not the old branch\n\t\tlet summaryEntry: BranchSummaryEntry | undefined;\n\t\tif (summaryText) {\n\t\t\t// Create summary at target position (can be null for root)\n\t\t\tconst summaryId = this.sessionManager.branchWithSummary(\n\t\t\t\tnewLeafId,\n\t\t\t\tsummaryText,\n\t\t\t\tsummaryDetails,\n\t\t\t\tfromExtension,\n\t\t\t\tsummaryUsage,\n\t\t\t\toldLeafId ?? \"root\",\n\t\t\t);\n\t\t\tsummaryEntry = this.sessionManager.getEntry(summaryId) as BranchSummaryEntry;\n\n\t\t\t// Attach label to the summary entry\n\t\t\tif (label) {\n\t\t\t\tthis.sessionManager.appendLabelChange(summaryId, label);\n\t\t\t}\n\t\t} else if (newLeafId === null) {\n\t\t\t// No summary, navigating to root - reset leaf\n\t\t\tthis.sessionManager.resetLeaf();\n\t\t} else {\n\t\t\t// No summary, navigating to non-root\n\t\t\tthis.sessionManager.branch(newLeafId);\n\t\t}\n\n\t\t// Attach label to target entry when not summarizing (no summary entry to label)\n\t\tif (label && !summaryText) {\n\t\t\tthis.sessionManager.appendLabelChange(targetId, label);\n\t\t}\n\n\t\t// Update finalized context from the canonical session projection.\n\t\tthis._refreshFinalizedContext();\n\t\tthis._restoreToolsFromTranscript();\n\n\t\t// Emit session_tree event\n\t\tawait this._extensionRunner.emit({\n\t\t\ttype: \"session_tree\",\n\t\t\tnewLeafId: this.sessionManager.getLeafId(),\n\t\t\toldLeafId,\n\t\t\tsummaryEntry,\n\t\t\tfromExtension: summaryText ? fromExtension : undefined,\n\t\t});\n\n\t\t// Emit to custom tools\n\n\t\treturn { editorText, cancelled: false, summaryEntry };\n\t} finally {\n\t\tthis._branchSummaryAbortController = undefined;\n\t\tif (this._compactionReason === \"branchSummary\") this._compactionReason = undefined;\n\t\tfinishBranchSummary();\n\t\tif (this._branchSummaryCompletion === branchSummaryCompletion) this._branchSummaryCompletion = undefined;\n\t}\n}\n\n/**\n * Get all user messages from session for fork selector.\n */\n\nexport function getUserMessagesForForking(this: AgentSession): Array<{ entryId: string; text: string }> {\n\tconst entries = this.sessionManager.getEntries();\n\tconst result: Array<{ entryId: string; text: string }> = [];\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tif (entry.message.role !== \"user\") continue;\n\n\t\tconst text = this._extractUserMessageText(entry.message.content);\n\t\tif (text) {\n\t\t\tresult.push({ entryId: entry.id, text });\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function _extractUserMessageText(\n\tthis: AgentSession,\n\tcontent: string | Array<{ type: string; text?: string }>,\n): string {\n\tif (typeof content === \"string\") return content;\n\tif (Array.isArray(content)) {\n\t\treturn content\n\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t.map((c) => c.text)\n\t\t\t.join(\"\");\n\t}\n\treturn \"\";\n}\n\n/**\n * Get session statistics.\n */\n\nexport const agentSessionTreeMethods = {\n\tsetSessionName,\n\tnavigateTree,\n\tgetUserMessagesForForking,\n\t_extractUserMessageText,\n};\n"]}
@@ -74,6 +74,7 @@ declare class AgentSessionBase {
74
74
  /** Priority input cancels the native operation, not the host-owned task. */
75
75
  protected _priorityInterruptPending: boolean;
76
76
  protected _activePromptCount: number;
77
+ protected _isPreparingRun: false | "user" | "custom";
77
78
  protected _agentRunAbortRequested: boolean;
78
79
  protected _pendingNextTurnMessages: CustomMessage[];
79
80
  /** Context-only custom messages queued during a run, flushed after the current turn's tool results. */
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAWnG,OAAO,KAAK,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAEzG,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAK9F,OAAO,EAA8B,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAKhG,OAAO,KAAK,EACX,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EACX,oBAAoB,EACpB,8BAA8B,EAC9B,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAIhE,OAAO,EAAyB,KAAK,kBAAkB,EAA0B,MAAM,6BAA6B,CAAC;AACrH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAE/E,YAAY,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,YAAY,EACX,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,YAAY,GACZ,MAAM,0BAA0B,CAAC;AAElC,cAAM,gBAAgB;IACrB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAE1C,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IACrF,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IACpC,SAAS,CAAC,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC;IAC/F,SAAS,CAAC,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAC1D,+EAA+E;IAC/E,SAAS,CAAC,sBAAsB,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM;IACzD,SAAS,CAAC,oBAAoB,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACvD,SAAS,CAAC,4BAA4B,EAAE,aAAa,GAAG,SAAS,CAAC;IAClE,SAAS,CAAC,wBAAwB,SAAK;IACvC,SAAS,CAAC,yBAAyB,EAAE,MAAM,GAAG,SAAS,CAAC;IACxD,SAAS,CAAC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IACpD,SAAS,CAAC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IACzC,SAAS,CAAC,eAAe,EAAE,yBAAyB,EAAE,CAAM;IAC5D,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAqB;IAC9D,SAAS,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAM;IAC3C,SAAS,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAM;IAC3C,SAAS,CAAC,uBAAuB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAqB;IACrE,SAAS,CAAC,2BAA2B,SAAK;IAC1C,SAAS,CAAC,yBAAyB,EAAE,kBAAkB,GAAG,SAAS,CAAa;IAChF,SAAS,CAAC,qBAAqB,UAAS;IACxC,SAAS,CAAC,iCAAiC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAa;IACnF;;;;;OAKG;IACH,SAAS,CAAC,mCAAmC,EAAE,MAAM,GAAG,SAAS,CAAa;IAC9E;;;;;OAKG;IACH,SAAS,CAAC,qBAAqB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAa;IACvE,SAAS,CAAC,mCAAmC,EAAE,2BAA2B,GAAG,SAAS,CAAa;IACnG,SAAS,CAAC,4BAA4B,EAAE,MAAM,GAAG,SAAS,CAAa;IACvE,4EAA4E;IAC5E,SAAS,CAAC,yBAAyB,UAAS;IAC5C,SAAS,CAAC,kBAAkB,SAAK;IACjC,SAAS,CAAC,uBAAuB,UAAS;IAC1C,SAAS,CAAC,wBAAwB,EAAE,aAAa,EAAE,CAAM;IACzD,uGAAuG;IACvG,SAAS,CAAC,sBAAsB,EAAE,aAAa,EAAE,CAAM;IACvD,SAAS,CAAC,iCAAiC,EAAE,KAAK,CAAC;QAClD,OAAO,EAAE,aAAa,CAAC;QACvB,QAAQ,EAAE,OAAO,GAAG,UAAU,CAAC;QAC/B,KAAK,EAAE,QAAQ,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;KAChE,CAAC,CAAM;IACR,SAAS,CAAC,0BAA0B,EAAE,eAAe,GAAG,SAAS,CAAa;IAC9E,SAAS,CAAC,iBAAiB,EAAE,OAAO,0BAA0B,EAAE,gBAAgB,GAAG,SAAS,CAAa;IACzG,SAAS,CAAC,wBAAwB,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,SAAS,CAAa;IAC9F,SAAS,CAAC,8BAA8B,EAAE,eAAe,GAAG,SAAS,CAAa;IAClF,kEAAkE;IAClE,SAAS,CAAC,yBAAyB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAa;IAC3E,SAAS,CAAC,0BAA0B,UAAS;IAC7C,SAAS,CAAC,mCAAmC,UAAS;IACtD,kFAAkF;IAClF,SAAS,CAAC,0BAA0B,UAAS;IAC7C,SAAS,CAAC,kCAAkC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAa;IACpF,SAAS,CAAC,gCAAgC,SAAK;IAC/C,SAAS,CAAC,2BAA2B,SAAK;IAC1C,SAAS,CAAC,sCAAsC,SAAK;IACrD,SAAS,CAAC,iCAAiC,EAAE,MAAM,GAAG,SAAS,CAAa;IAC5E,SAAS,CAAC,+BAA+B,EAAE,8BAA8B,GAAG,SAAS,CAAa;IAClG,SAAS,CAAC,uBAAuB,cAAqB;IACtD,oFAAoF;IACpF,SAAS,CAAC,iCAAiC,UAAS;IACpD,SAAS,CAAC,SAAS,UAAS;IAC5B,SAAS,CAAC,6BAA6B,EAAE,eAAe,GAAG,SAAS,CAAa;IACjF,qFAAqF;IACrF,SAAS,CAAC,wBAAwB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAa;IAC1E,SAAS,CAAC,8BAA8B,EAAE,eAAe,GAAG,SAAS,CAAa;IAClF,SAAS,CAAC,oBAAoB,SAAK;IACnC,wFAAwF;IACxF,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,GAAG,SAAS,CAAa;IACxE,SAAS,CAAC,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAa;IACnE,SAAS,CAAC,qBAAqB,EAAE,eAAe,GAAG,SAAS,CAAa;IACzE,SAAS,CAAC,aAAa,SAAK;IAC5B,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAa;IAC/D,SAAS,CAAC,aAAa,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAa;IAC9D,SAAS,CAAC,qBAAqB,6CAAoD;IACnF,SAAS,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,CAAM;IAC5D,SAAS,CAAC,gBAAgB,EAAG,eAAe,CAAC;IAC7C,SAAS,CAAC,UAAU,SAAK;IACzB,+FAA+F;IAC/F,SAAS,CAAC,QAAQ,CAAC,kBAAkB,0BAAiC;IACtE,gFAAgF;IAChF,SAAS,CAAC,QAAQ,CAAC,2BAA2B,kBAAyB;IACvE,SAAS,CAAC,QAAQ,CAAC,4BAA4B,kBAAyB;IACxE,SAAS,CAAC,yBAAyB,EAAE,YAAY,EAAE,CAAM;IACzD,SAAS,CAAC,oBAAoB,EAAE,oBAAoB,CAAe;IACnE,SAAS,CAAC,eAAe,UAAS;IAClC,SAAS,CAAC,wBAAwB,UAAS;IAC3C,SAAS,CAAC,uBAAuB,UAAS;IAC1C,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM;IAC5E,0FAA0F;IAC1F,SAAS,CAAC,iCAAiC,UAAS;IACpD,SAAS,CAAC,eAAe,EAAE,cAAc,CAAC;IAC1C,SAAS,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC;IACzC,SAAS,CAAC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAa;IACxE,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,mBAAmB,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,eAAe,CAAA;KAAE,CAAC;IAC9D,SAAS,CAAC,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7C,SAAS,CAAC,iBAAiB,cAAqB;IAChD,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACrC,SAAS,CAAC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAC1C,uFAAuF;IACvF,SAAS,CAAC,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5C,SAAS,CAAC,eAAe,CAAC,EAAE,mBAAmB,CAAC;IAChD,SAAS,CAAC,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACpD,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACrD,SAAS,CAAC,oBAAoB,CAAC,EAAE,OAAO,4BAA4B,EAAE,2BAA2B,CAAC;IAClG,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzD,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;IAChD,SAAS,CAAC,qBAAqB,CAAC,EAAE,oBAAoB,CAAC;IACvD,SAAS,CAAC,mBAAmB,CAAC,EAAE,kBAAkB,CAAC;IACnD,SAAS,CAAC,oBAAoB,CAAC,EAAE,OAAO,4BAA4B,EAAE,SAAS,GAAG,IAAI,CAAC;IACvF,SAAS,CAAC,4BAA4B,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,4BAA4B,EAAE,cAAc,KAAK,IAAI,CAAC;IACnH,SAAS,CAAC,cAAc,EAAE,aAAa,CAAW;IAClD,SAAS,CAAC,+BAA+B,CAAC,EAAE,8BAA8B,CAAC;IAC3E,SAAS,CAAC,yBAAyB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjD,SAAS,CAAC,uBAAuB,CAAC,EAAE,sBAAsB,CAAC;IAC3D,SAAS,CAAC,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;IACnD,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC;IACtC,SAAS,CAAC,qBAAqB,cAAqB;IACpD,SAAS,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAa;IAC5D,SAAS,CAAC,QAAQ,CAAC,uBAAuB,yBAAgC;IAC1E,SAAS,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAa;IACzE,SAAS,CAAC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IAC/D,SAAS,CAAC,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAa;IACnE,SAAS,CAAC,wBAAwB,EAAG,kCAAkC,CAAC;IACxE,SAAS,CAAC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9D,SAAS,CAAC,2BAA2B,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,CAAC;IACrF,SAAS,CAAC,uBAAuB,CAAC,EAAE,kCAAkC,CAAC;IACvE,SAAS,CAAC,qBAAqB,EAAE,gBAAgB,GAAG,SAAS,CAAa;IAC1E,+EAA+E;IAC/E,SAAS,CAAC,iBAAiB,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC5D,SAAS,CAAC,uBAAuB,EAAE,8BAA8B,GAAG,SAAS,CAAC;IAC9E,SAAS,CAAC,yBAAyB,EAAE,8BAA8B,GAAG,SAAS,CAAC;IAChF,SAAS,CAAC,cAAc,EAAE,OAAO,0BAA0B,EAAE,aAAa,GAAG,SAAS,CAAC;IACvF,SAAS,CAAC,uBAAuB,EAAE,OAAO,gCAAgC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC9G,SAAS,CAAC,eAAe,iBAAwB;IACjD,SAAS,CAAC,qBAAqB,EAAE,OAAO,uBAAuB,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAClG,SAAS,CAAC,cAAc,EAAE,8BAA8B,GAAG,SAAS,CAAC;IACrE,SAAS,CAAC,YAAY,CAAC,EAAE,OAAO,mBAAmB,EAAE,WAAW,CAAC;IACjE,IAAI,kBAAkB,IAAI,OAAO,mBAAmB,EAAE,kBAAkB,GAAG,SAAS,CAEnF;IACD,mBAAmB,CAAC,IAAI,EAAE,OAAO,uBAAuB,EAAE,gBAAgB,GAAG,IAAI,CAGhF;IAED,YAAY,MAAM,EAAE,kBAAkB,EAwJrC;CACD;AAED,MAAM,WAAW,YAAa,SAAQ,gBAAgB,EAAE,yBAAyB;CAAG;AAEpF,eAAO,MAAM,YAAY,EAAkC;IAC1D,KAAK,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAAC;IAC/C,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;CACjC,CAAC"}
1
+ {"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"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"}
@@ -80,6 +80,7 @@ class AgentSessionBase {
80
80
  /** Priority input cancels the native operation, not the host-owned task. */
81
81
  _priorityInterruptPending = false;
82
82
  _activePromptCount = 0;
83
+ _isPreparingRun = false;
83
84
  _agentRunAbortRequested = false;
84
85
  _pendingNextTurnMessages = [];
85
86
  /** Context-only custom messages queued during a run, flushed after the current turn's tool results. */