@bastani/atomic 0.9.59 → 0.9.60-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/CHANGELOG.md +10 -0
- package/dist/builtin/subagents/README.md +1 -1
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/subagents/src/extension/index.bundle.mjs +53 -27
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/core/agent-session-message-queue.d.ts.map +1 -1
- package/dist/core/agent-session-message-queue.js +10 -2
- package/dist/core/agent-session-message-queue.js.map +1 -1
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +17 -6
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/resource-admission-scope.d.ts +5 -0
- package/dist/core/resource-admission-scope.d.ts.map +1 -1
- package/dist/core/resource-admission-scope.js +7 -0
- package/dist/core/resource-admission-scope.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +5 -4
- package/dist/utils/clipboard.js.map +1 -1
- package/docs/getting-started/installation.md +1 -1
- package/docs/keybindings.md +1 -1
- package/docs/sdk.md +2 -0
- package/npm-shrinkwrap.json +32 -32
- 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 type { CustomMessage } from \"./messages.ts\";\nimport { expandPromptTemplate } from \"./prompt-templates.ts\";\nimport {\n\ttype QueuedInputAdmission,\n\treserveQueuedInputAdmission,\n\trunInputHook,\n\tUNORDERED_ADMISSION,\n} from \"./queued-input-admission.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>>();\nconst openRuns = new WeakMap<AgentSession, number>();\n\nfunction openRun(session: AgentSession): void {\n\topenRuns.set(session, (openRuns.get(session) ?? 0) + 1);\n}\n\nfunction closeRun(session: AgentSession): void {\n\tconst open = openRuns.get(session) ?? 0;\n\tif (open > 1) openRuns.set(session, open - 1);\n\telse openRuns.delete(session);\n}\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 && !queuesDuringAgentSettled(this, options)) {\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\nfunction queuesDuringAgentSettled(session: AgentSession, options: PromptOptions | undefined): boolean {\n\treturn session._isEmittingAgentSettled && options?.streamingBehavior !== undefined && options.source !== \"extension\";\n}\n\nfunction queuesBehindOpenRun(session: AgentSession, options: PromptOptions | undefined): boolean {\n\treturn openRuns.has(session) && options?.streamingBehavior !== undefined && options.source !== \"extension\";\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 ||\n\t\t\t\tboundary?.hasMessageDeliveries() ||\n\t\t\t\t// #3919: input queued behind a stage prompt that its input hook consumed still needs its turn.\n\t\t\t\t(this._workflowStageAwaitingFirstPrompt && this.agent.hasQueuedMessages()))\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\nfunction isExtensionCommand(session: AgentSession, text: string): boolean {\n\tif (!text.startsWith(\"/\")) return false;\n\tconst spaceIndex = text.indexOf(\" \");\n\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\treturn session._extensionRunner?.getCommand(commandName) !== undefined;\n}\n\n/** Extension commands and extension-delivered messages run immediately rather than in submission order. */\nfunction reserveAdmissionForQueuedPrompt(\n\tsession: AgentSession,\n\ttext: string,\n\toptions: PromptOptions | undefined,\n): QueuedInputAdmission {\n\tconst lane = options?.streamingBehavior;\n\tif (lane === undefined || options?.source === \"extension\") return UNORDERED_ADMISSION;\n\tif ((options?.expandPromptTemplates ?? true) && isExtensionCommand(session, text)) return UNORDERED_ADMISSION;\n\treturn reserveQueuedInputAdmission(session, lane, sessionLifetime(session));\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\tconst admission = reserveAdmissionForQueuedPrompt(this, text, options);\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\tconst earlierAdmissions = admission.waitForTurn();\n\t\t\tif (earlierAdmissions) await earlierAdmissions;\n\t\t\tassertCurrent();\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 runInputHook(() =>\n\t\t\t\tthis._extensionRunner.emitInput(\n\t\t\t\t\tcurrentText,\n\t\t\t\t\tcurrentImages,\n\t\t\t\t\toptions?.source ?? \"interactive\",\n\t\t\t\t\tthis.isStreaming ? options?.streamingBehavior : undefined,\n\t\t\t\t),\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\tconst earlierAdmissions = admission.waitForTurn();\n\t\tif (earlierAdmissions) await earlierAdmissions;\n\t\tassertCurrent();\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\tconst busy = this.isStreaming || this._isPreparingRun || this._isBeforeSettle;\n\t\tconst settling = queuesDuringAgentSettled(this, options) || (!busy && queuesBehindOpenRun(this, options));\n\t\tif (busy || settling) {\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\tconst queued =\n\t\t\t\toptions.streamingBehavior === \"followUp\"\n\t\t\t\t\t? this._queueFollowUp(expandedText, currentImages)\n\t\t\t\t\t: this._queueSteer(expandedText, currentImages);\n\t\t\tif (settling) deliverQueuedInputIfIdle(this, { userSubmission: true });\n\t\t\tawait queued;\n\t\t\tworkflowDelivery?.delivered?.(options.streamingBehavior);\n\t\t\tpreflightResult?.(true, \"queued\");\n\t\t\treturn;\n\t\t}\n\t\tadmission.release();\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\tawait this._flushPendingBashMessages();\n\t\tawait this._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\t// From here, input arriving during preparation queues behind this run (#3919).\n\t\tthis._workflowStageAwaitingFirstPrompt = false;\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\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} finally {\n\t\tadmission.release();\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\t// Any run that starts ends the gap before a fresh stage's first prompt (#3919).\n\tthis._workflowStageAwaitingFirstPrompt = false;\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\topenRun(this);\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\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\tawait this._flushPendingBashMessages();\n\t\t\tawait this._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\tawait settleAgentRun(this);\n\t}\n}\n\nasync function settleAgentRun(session: AgentSession): Promise<void> {\n\tsession._cacheWarmer?.onAgentSettled();\n\ttry {\n\t\tawait session._agentEventQueue;\n\t\tawait session._flushPendingCustomMessages();\n\t} finally {\n\t\t// A failed event or flush must still close and settle the run; otherwise the open-run\n\t\t// marker and active prompt count leak and later interactive messages stay queued forever.\n\t\tawait finishAgentRun(session);\n\t}\n}\n\nasync function finishAgentRun(session: AgentSession): Promise<void> {\n\tcloseRun(session);\n\ttry {\n\t\tsession._isEmittingAgentSettled = true;\n\t\ttry {\n\t\t\tconst aborted = session._agentRunAbortRequested === true;\n\t\t\tif (typeof session._extensionRunner?.emit === \"function\") {\n\t\t\t\tawait session._extensionRunner.emit({ type: \"agent_settled\", aborted });\n\t\t\t}\n\t\t\tsession._emit?.({ type: \"agent_settled\", aborted });\n\t\t} finally {\n\t\t\tsession._isEmittingAgentSettled = false;\n\t\t}\n\t\tif (session._subagentMessageAdmission) await settleSubagentMessages(session);\n\t} finally {\n\t\tsession._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 = session._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\tawait session._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\texpandPromptTemplates = true,\n): Promise<QueuedInputDisposition> {\n\tassertSessionOpen(session);\n\tconst owner = resolveWorkflowStageDeliveryTarget(session);\n\tif (owner !== session) return queueUserInput(owner, text, images, behavior, source, expandPromptTemplates);\n\treturn trackSessionWork(session, () =>\n\t\tadmittedQueueUserInput(session, text, images, behavior, source, expandPromptTemplates),\n\t);\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\texpandPromptTemplates: boolean,\n): Promise<QueuedInputDisposition> {\n\tconst lifetime = sessionLifetime(session);\n\t// Literal text is never a command, so it is never refused for looking like one.\n\tif (expandPromptTemplates && text.startsWith(\"/\")) session._throwIfExtensionCommand(text);\n\tconst admission =\n\t\tsource === \"extension\" ? UNORDERED_ADMISSION : reserveQueuedInputAdmission(session, behavior, lifetime);\n\ttry {\n\t\tif (session._extensionRunner?.hasHandlers(\"input\")) {\n\t\t\tconst result = await runInputHook(() =>\n\t\t\t\tsession._extensionRunner.emitInput(text, images, source, session.isStreaming ? behavior : undefined),\n\t\t\t);\n\t\t\tassertSessionOpen(session);\n\t\t\tif (lifetime.aborted) throw Object.assign(new Error(\"Session is closed\"), { code: \"SessionClosed\" });\n\t\t\tif (result.action === \"handled\") return \"handled\";\n\t\t\tif (result.action === \"transform\") {\n\t\t\t\ttext = result.text;\n\t\t\t\timages = result.images ?? images;\n\t\t\t}\n\t\t}\n\t\tconst expandedText = expandPromptTemplates\n\t\t\t? expandPromptTemplate(session._expandSkillCommand(text), [...session.promptTemplates])\n\t\t\t: text;\n\t\tconst earlierAdmissions = admission.waitForTurn();\n\t\tif (earlierAdmissions) await earlierAdmissions;\n\t\tassertSessionOpen(session);\n\t\tif (lifetime.aborted) throw Object.assign(new Error(\"Session is closed\"), { code: \"SessionClosed\" });\n\t\tif (behavior === \"steer\") await session._queueSteer(expandedText, images);\n\t\telse await session._queueFollowUp(expandedText, images);\n\t\tif (!session.isStreaming) deliverQueuedInputIfIdle(session);\n\t\treturn \"queued\";\n\t} finally {\n\t\tadmission.release();\n\t}\n}\n\nfunction canContinueQueuedInput(session: AgentSession): boolean {\n\treturn !(\n\t\tsession.isStreaming ||\n\t\tsession.isCompacting ||\n\t\tsession._isPreparingRun ||\n\t\tsession._isBeforeSettle ||\n\t\tsession._isEmittingAgentSettled ||\n\t\tsession._queuedMessagesPaused ||\n\t\tsession._pendingInterruptDeliveries > 0 ||\n\t\tsession._subagentMessageAdmission !== undefined ||\n\t\tsession._workflowStageAdmission !== undefined\n\t);\n}\n\nfunction canStartQueuedInputRun(session: AgentSession): boolean {\n\treturn (\n\t\tcanContinueQueuedInput(session) &&\n\t\t!session._agentRunAbortRequested &&\n\t\t!session._stopAfterTurnBlockedContinuation &&\n\t\tsession.agent.hasQueuedMessages() &&\n\t\tsession.agent.state.messages.some((message) => message.role !== \"system\")\n\t);\n}\n\nasync function runQueuedInput(session: AgentSession): Promise<void> {\n\t// A failed event was already reported by the run that produced it; it must not drop this delivery.\n\tawait session._agentEventQueue.catch(() => {});\n\tawait preparePriorityContinuation(session);\n\tif (!canStartQueuedInputRun(session)) return;\n\tconst run = session.agent.continue();\n\tif (!session.agent.state.isStreaming) return run;\n\tsession._activePromptCount += 1;\n\topenRun(session);\n\ttry {\n\t\tawait run;\n\t\tawait session.waitForRetry();\n\t\tawait session._continueQueuedAgentMessages();\n\t\tif (session._agentRunAbortRequested) return;\n\t\tawait session._awaitPendingPostCompactionContinuation();\n\t\tawait runBeforeSettleContinuations(session);\n\t} finally {\n\t\tawait settleAgentRun(session);\n\t}\n}\n\n/** Drain input queued after the run's last drain, deferring until an open run settles. */\nexport function deliverQueuedInputIfIdle(session: AgentSession, options?: { userSubmission?: boolean }): void {\n\tconst deliver = async (): Promise<void> => {\n\t\tif (options?.userSubmission && !session.isStreaming && !session._queuedMessagesPaused) {\n\t\t\tsession._agentRunAbortRequested = false;\n\t\t}\n\t\tawait runQueuedInput(session).catch(() => {});\n\t};\n\tif (session._isEmittingAgentSettled || openRuns.has(session)) session._deferredSettledActions.push(deliver);\n\telse if (session._activePromptCount === 0) void deliver();\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 * With `expandPromptTemplates: false` the text is queued literally and never refused as a command.\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\" | \"expandPromptTemplates\">,\n): Promise<QueuedInputDisposition> {\n\treturn queueUserInput(\n\t\tthis,\n\t\ttext,\n\t\timages,\n\t\t\"steer\",\n\t\toptions?.source ?? \"interactive\",\n\t\toptions?.expandPromptTemplates ?? true,\n\t);\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 * With `expandPromptTemplates: false` the text is queued literally and never refused as a command.\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\" | \"expandPromptTemplates\">,\n): Promise<QueuedInputDisposition> {\n\treturn queueUserInput(\n\t\tthis,\n\t\ttext,\n\t\timages,\n\t\t\"followUp\",\n\t\toptions?.source ?? \"interactive\",\n\t\toptions?.expandPromptTemplates ?? true,\n\t);\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\ttype QueuedInputAdmission,\n\treserveQueuedInputAdmission,\n\trunInputHook,\n\tUNORDERED_ADMISSION,\n} from \"./queued-input-admission.ts\";\nimport { currentResourceAdmission, withOwnResourceAdmission } from \"./resource-admission-scope.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>>();\nconst openRuns = new WeakMap<AgentSession, number>();\n\nfunction openRun(session: AgentSession): void {\n\topenRuns.set(session, (openRuns.get(session) ?? 0) + 1);\n}\n\nfunction closeRun(session: AgentSession): void {\n\tconst open = openRuns.get(session) ?? 0;\n\tif (open > 1) openRuns.set(session, open - 1);\n\telse openRuns.delete(session);\n}\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 && !queuesDuringAgentSettled(this, options)) {\n\t\t// A run started by an agent_settled handler waits until every settled handler completes.\n\t\tdeferSettledAction(this, async () => await this.prompt(text, options));\n\t\treturn;\n\t}\n\treturn trackSessionWork(this, () => admittedPrompt.call(this, text, options));\n}\n\n/**\n * Defer `action` until the settling run has settled. It runs under the resource admission its requester ran under,\n * not the settling run's: a turn a delivered message requests keeps the receiving session's own admission.\n */\nfunction deferSettledAction(session: AgentSession, action: () => Promise<void>): void {\n\tconst admission = currentResourceAdmission();\n\tsession._deferredSettledActions.push(() => withOwnResourceAdmission(admission, action));\n}\n\nfunction queuesDuringAgentSettled(session: AgentSession, options: PromptOptions | undefined): boolean {\n\treturn session._isEmittingAgentSettled && options?.streamingBehavior !== undefined && options.source !== \"extension\";\n}\n\nfunction queuesBehindOpenRun(session: AgentSession, options: PromptOptions | undefined): boolean {\n\treturn openRuns.has(session) && options?.streamingBehavior !== undefined && options.source !== \"extension\";\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 ||\n\t\t\t\tboundary?.hasMessageDeliveries() ||\n\t\t\t\t// #3919: input queued behind a stage prompt that its input hook consumed still needs its turn.\n\t\t\t\t(this._workflowStageAwaitingFirstPrompt && this.agent.hasQueuedMessages()))\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\nfunction isExtensionCommand(session: AgentSession, text: string): boolean {\n\tif (!text.startsWith(\"/\")) return false;\n\tconst spaceIndex = text.indexOf(\" \");\n\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\treturn session._extensionRunner?.getCommand(commandName) !== undefined;\n}\n\n/** Extension commands and extension-delivered messages run immediately rather than in submission order. */\nfunction reserveAdmissionForQueuedPrompt(\n\tsession: AgentSession,\n\ttext: string,\n\toptions: PromptOptions | undefined,\n): QueuedInputAdmission {\n\tconst lane = options?.streamingBehavior;\n\tif (lane === undefined || options?.source === \"extension\") return UNORDERED_ADMISSION;\n\tif ((options?.expandPromptTemplates ?? true) && isExtensionCommand(session, text)) return UNORDERED_ADMISSION;\n\treturn reserveQueuedInputAdmission(session, lane, sessionLifetime(session));\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\tconst admission = reserveAdmissionForQueuedPrompt(this, text, options);\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\tconst earlierAdmissions = admission.waitForTurn();\n\t\t\tif (earlierAdmissions) await earlierAdmissions;\n\t\t\tassertCurrent();\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 runInputHook(() =>\n\t\t\t\tthis._extensionRunner.emitInput(\n\t\t\t\t\tcurrentText,\n\t\t\t\t\tcurrentImages,\n\t\t\t\t\toptions?.source ?? \"interactive\",\n\t\t\t\t\tthis.isStreaming ? options?.streamingBehavior : undefined,\n\t\t\t\t),\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\tconst earlierAdmissions = admission.waitForTurn();\n\t\tif (earlierAdmissions) await earlierAdmissions;\n\t\tassertCurrent();\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\tconst busy = this.isStreaming || this._isPreparingRun || this._isBeforeSettle;\n\t\tconst settling = queuesDuringAgentSettled(this, options) || (!busy && queuesBehindOpenRun(this, options));\n\t\tif (busy || settling) {\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\tconst queued =\n\t\t\t\toptions.streamingBehavior === \"followUp\"\n\t\t\t\t\t? this._queueFollowUp(expandedText, currentImages)\n\t\t\t\t\t: this._queueSteer(expandedText, currentImages);\n\t\t\tif (settling) deliverQueuedInputIfIdle(this, { userSubmission: true });\n\t\t\tawait queued;\n\t\t\tworkflowDelivery?.delivered?.(options.streamingBehavior);\n\t\t\tpreflightResult?.(true, \"queued\");\n\t\t\treturn;\n\t\t}\n\t\tadmission.release();\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\tawait this._flushPendingBashMessages();\n\t\tawait this._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\t// From here, input arriving during preparation queues behind this run (#3919).\n\t\tthis._workflowStageAwaitingFirstPrompt = false;\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\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} finally {\n\t\tadmission.release();\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\tdeferSettledAction(this, () =>\n\t\t\tthis._runAgentPrompt(messages, promptStarted, reportDispatch, prepared, customStarter),\n\t\t);\n\t\treturn;\n\t}\n\t// Any run that starts ends the gap before a fresh stage's first prompt (#3919).\n\tthis._workflowStageAwaitingFirstPrompt = false;\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\topenRun(this);\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\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\tawait this._flushPendingBashMessages();\n\t\t\tawait this._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\tawait settleAgentRun(this);\n\t}\n}\n\nasync function settleAgentRun(session: AgentSession): Promise<void> {\n\tsession._cacheWarmer?.onAgentSettled();\n\ttry {\n\t\tawait session._agentEventQueue;\n\t\tawait session._flushPendingCustomMessages();\n\t} finally {\n\t\t// A failed event or flush must still close and settle the run; otherwise the open-run\n\t\t// marker and active prompt count leak and later interactive messages stay queued forever.\n\t\tawait finishAgentRun(session);\n\t}\n}\n\nasync function finishAgentRun(session: AgentSession): Promise<void> {\n\tcloseRun(session);\n\ttry {\n\t\tsession._isEmittingAgentSettled = true;\n\t\ttry {\n\t\t\tconst aborted = session._agentRunAbortRequested === true;\n\t\t\tif (typeof session._extensionRunner?.emit === \"function\") {\n\t\t\t\tawait session._extensionRunner.emit({ type: \"agent_settled\", aborted });\n\t\t\t}\n\t\t\tsession._emit?.({ type: \"agent_settled\", aborted });\n\t\t} finally {\n\t\t\tsession._isEmittingAgentSettled = false;\n\t\t}\n\t\tif (session._subagentMessageAdmission) await settleSubagentMessages(session);\n\t} finally {\n\t\tsession._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 = session._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\tawait session._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\texpandPromptTemplates = true,\n): Promise<QueuedInputDisposition> {\n\tassertSessionOpen(session);\n\tconst owner = resolveWorkflowStageDeliveryTarget(session);\n\tif (owner !== session) return queueUserInput(owner, text, images, behavior, source, expandPromptTemplates);\n\treturn trackSessionWork(session, () =>\n\t\tadmittedQueueUserInput(session, text, images, behavior, source, expandPromptTemplates),\n\t);\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\texpandPromptTemplates: boolean,\n): Promise<QueuedInputDisposition> {\n\tconst lifetime = sessionLifetime(session);\n\t// Literal text is never a command, so it is never refused for looking like one.\n\tif (expandPromptTemplates && text.startsWith(\"/\")) session._throwIfExtensionCommand(text);\n\tconst admission =\n\t\tsource === \"extension\" ? UNORDERED_ADMISSION : reserveQueuedInputAdmission(session, behavior, lifetime);\n\ttry {\n\t\tif (session._extensionRunner?.hasHandlers(\"input\")) {\n\t\t\tconst result = await runInputHook(() =>\n\t\t\t\tsession._extensionRunner.emitInput(text, images, source, session.isStreaming ? behavior : undefined),\n\t\t\t);\n\t\t\tassertSessionOpen(session);\n\t\t\tif (lifetime.aborted) throw Object.assign(new Error(\"Session is closed\"), { code: \"SessionClosed\" });\n\t\t\tif (result.action === \"handled\") return \"handled\";\n\t\t\tif (result.action === \"transform\") {\n\t\t\t\ttext = result.text;\n\t\t\t\timages = result.images ?? images;\n\t\t\t}\n\t\t}\n\t\tconst expandedText = expandPromptTemplates\n\t\t\t? expandPromptTemplate(session._expandSkillCommand(text), [...session.promptTemplates])\n\t\t\t: text;\n\t\tconst earlierAdmissions = admission.waitForTurn();\n\t\tif (earlierAdmissions) await earlierAdmissions;\n\t\tassertSessionOpen(session);\n\t\tif (lifetime.aborted) throw Object.assign(new Error(\"Session is closed\"), { code: \"SessionClosed\" });\n\t\tif (behavior === \"steer\") await session._queueSteer(expandedText, images);\n\t\telse await session._queueFollowUp(expandedText, images);\n\t\tif (!session.isStreaming) deliverQueuedInputIfIdle(session);\n\t\treturn \"queued\";\n\t} finally {\n\t\tadmission.release();\n\t}\n}\n\nfunction canContinueQueuedInput(session: AgentSession): boolean {\n\treturn !(\n\t\tsession.isStreaming ||\n\t\tsession.isCompacting ||\n\t\tsession._isPreparingRun ||\n\t\tsession._isBeforeSettle ||\n\t\tsession._isEmittingAgentSettled ||\n\t\tsession._queuedMessagesPaused ||\n\t\tsession._pendingInterruptDeliveries > 0 ||\n\t\tsession._subagentMessageAdmission !== undefined ||\n\t\tsession._workflowStageAdmission !== undefined\n\t);\n}\n\nfunction canStartQueuedInputRun(session: AgentSession): boolean {\n\treturn (\n\t\tcanContinueQueuedInput(session) &&\n\t\t!session._agentRunAbortRequested &&\n\t\t!session._stopAfterTurnBlockedContinuation &&\n\t\tsession.agent.hasQueuedMessages() &&\n\t\tsession.agent.state.messages.some((message) => message.role !== \"system\")\n\t);\n}\n\nasync function runQueuedInput(session: AgentSession): Promise<void> {\n\t// A failed event was already reported by the run that produced it; it must not drop this delivery.\n\tawait session._agentEventQueue.catch(() => {});\n\tawait preparePriorityContinuation(session);\n\tif (!canStartQueuedInputRun(session)) return;\n\tconst run = session.agent.continue();\n\tif (!session.agent.state.isStreaming) return run;\n\tsession._activePromptCount += 1;\n\topenRun(session);\n\ttry {\n\t\tawait run;\n\t\tawait session.waitForRetry();\n\t\tawait session._continueQueuedAgentMessages();\n\t\tif (session._agentRunAbortRequested) return;\n\t\tawait session._awaitPendingPostCompactionContinuation();\n\t\tawait runBeforeSettleContinuations(session);\n\t} finally {\n\t\tawait settleAgentRun(session);\n\t}\n}\n\n/** Drain input queued after the run's last drain, deferring until an open run settles. */\nexport function deliverQueuedInputIfIdle(session: AgentSession, options?: { userSubmission?: boolean }): void {\n\tconst deliver = async (): Promise<void> => {\n\t\tif (options?.userSubmission && !session.isStreaming && !session._queuedMessagesPaused) {\n\t\t\tsession._agentRunAbortRequested = false;\n\t\t}\n\t\tawait runQueuedInput(session).catch(() => {});\n\t};\n\tif (session._isEmittingAgentSettled || openRuns.has(session)) deferSettledAction(session, deliver);\n\telse if (session._activePromptCount === 0) void deliver();\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 * With `expandPromptTemplates: false` the text is queued literally and never refused as a command.\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\" | \"expandPromptTemplates\">,\n): Promise<QueuedInputDisposition> {\n\treturn queueUserInput(\n\t\tthis,\n\t\ttext,\n\t\timages,\n\t\t\"steer\",\n\t\toptions?.source ?? \"interactive\",\n\t\toptions?.expandPromptTemplates ?? true,\n\t);\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 * With `expandPromptTemplates: false` the text is queued literally and never refused as a command.\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\" | \"expandPromptTemplates\">,\n): Promise<QueuedInputDisposition> {\n\treturn queueUserInput(\n\t\tthis,\n\t\ttext,\n\t\timages,\n\t\t\"followUp\",\n\t\toptions?.source ?? \"interactive\",\n\t\toptions?.expandPromptTemplates ?? true,\n\t);\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. A delivered message starts this session's\n\t// turn, so the turn runs under this session's own resource admission, never under\n\t// the scope its sender runs in, such as a workflow run's.\n\tawait withOwnResourceAdmission(this._resourceAdmission, () =>\n\t\tthis.prompt(text, {\n\t\t\texpandPromptTemplates: options?.expandPromptTemplates ?? false,\n\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\timages,\n\t\t\tsource: \"extension\",\n\t\t\t__workflowDelivery: options?.__workflowDelivery,\n\t\t} as PromptOptionsWithWorkflowDelivery),\n\t);\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,4 +1,9 @@
|
|
|
1
1
|
import type { ResourceAdmission } from "./sdk-types.ts";
|
|
2
2
|
export declare function withResourceAdmission<T>(admission: ResourceAdmission, callback: () => Promise<T>): Promise<T>;
|
|
3
|
+
/**
|
|
4
|
+
* Runs `callback` under `admission` alone, or under none when it is undefined: an enclosing scope no longer applies.
|
|
5
|
+
* A turn that a message delivered to a session starts runs under that session's own admission this way.
|
|
6
|
+
*/
|
|
7
|
+
export declare function withOwnResourceAdmission<T>(admission: ResourceAdmission | undefined, callback: () => T): T;
|
|
3
8
|
export declare function currentResourceAdmission(): ResourceAdmission | undefined;
|
|
4
9
|
//# sourceMappingURL=resource-admission-scope.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-admission-scope.d.ts","sourceRoot":"","sources":["../../src/core/resource-admission-scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE7G;AAED,wBAAgB,wBAAwB,IAAI,iBAAiB,GAAG,SAAS,CAExE"}
|
|
1
|
+
{"version":3,"file":"resource-admission-scope.d.ts","sourceRoot":"","sources":["../../src/core/resource-admission-scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE7G;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAE1G;AAED,wBAAgB,wBAAwB,IAAI,iBAAiB,GAAG,SAAS,CAExE"}
|
|
@@ -3,6 +3,13 @@ const scope = new AsyncLocalStorage();
|
|
|
3
3
|
export function withResourceAdmission(admission, callback) {
|
|
4
4
|
return scope.run(admission, callback);
|
|
5
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* Runs `callback` under `admission` alone, or under none when it is undefined: an enclosing scope no longer applies.
|
|
8
|
+
* A turn that a message delivered to a session starts runs under that session's own admission this way.
|
|
9
|
+
*/
|
|
10
|
+
export function withOwnResourceAdmission(admission, callback) {
|
|
11
|
+
return scope.run(admission, callback);
|
|
12
|
+
}
|
|
6
13
|
export function currentResourceAdmission() {
|
|
7
14
|
return scope.getStore();
|
|
8
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-admission-scope.js","sourceRoot":"","sources":["../../src/core/resource-admission-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,KAAK,GAAG,IAAI,iBAAiB,
|
|
1
|
+
{"version":3,"file":"resource-admission-scope.js","sourceRoot":"","sources":["../../src/core/resource-admission-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,KAAK,GAAG,IAAI,iBAAiB,EAAiC,CAAC;AAErE,MAAM,UAAU,qBAAqB,CAAI,SAA4B,EAAE,QAA0B;IAChG,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAI,SAAwC,EAAE,QAAiB;IACtG,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,wBAAwB;IACvC,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AACzB,CAAC","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { ResourceAdmission } from \"./sdk-types.ts\";\n\nconst scope = new AsyncLocalStorage<ResourceAdmission | undefined>();\n\nexport function withResourceAdmission<T>(admission: ResourceAdmission, callback: () => Promise<T>): Promise<T> {\n\treturn scope.run(admission, callback);\n}\n\n/**\n * Runs `callback` under `admission` alone, or under none when it is undefined: an enclosing scope no longer applies.\n * A turn that a message delivered to a session starts runs under that session's own admission this way.\n */\nexport function withOwnResourceAdmission<T>(admission: ResourceAdmission | undefined, callback: () => T): T {\n\treturn scope.run(admission, callback);\n}\n\nexport function currentResourceAdmission(): ResourceAdmission | undefined {\n\treturn scope.getStore();\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/utils/clipboard.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,eAAe,EAAa,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/utils/clipboard.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,eAAe,EAAa,MAAM,uBAAuB,CAAC;AAiGxE,wBAAsB,iBAAiB,CACtC,MAAM,GAAE;IAAE,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,IAAgB,GACvD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB;AAeD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC3C,MAAM,GAAE,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,IAAgB,EACpE,eAAe,GAAE,MAAM,CAAC,QAA2B,GACjD,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAqB1B;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+IjE"}
|
package/dist/utils/clipboard.js
CHANGED
|
@@ -24,15 +24,16 @@ function copyToX11Clipboard(options) {
|
|
|
24
24
|
}
|
|
25
25
|
const MAX_OSC52_ENCODED_LENGTH = 100_000;
|
|
26
26
|
/**
|
|
27
|
-
* Remote sessions also emit OSC 52 so the client terminal receives the copy.
|
|
28
|
-
*
|
|
29
|
-
*
|
|
27
|
+
* Remote sessions also emit OSC 52 so the client terminal receives the copy. Rex terminals count as
|
|
28
|
+
* remote: a Rex server spawns shells without SSH markers, and its client may be another machine.
|
|
29
|
+
* ATOMIC_CLIPBOARD_OSC52=1 (or its PI_CLIPBOARD_OSC52 alias) covers remote clients that leave no
|
|
30
|
+
* markers, such as multiplexer attaches or remote IDE daemons.
|
|
30
31
|
*/
|
|
31
32
|
function isRemoteSession(env) {
|
|
32
33
|
const forceOsc52 = getEnvNames(ENV_CLIPBOARD_OSC52)
|
|
33
34
|
.map((name) => env[name])
|
|
34
35
|
.find((value) => value !== undefined);
|
|
35
|
-
return Boolean(env.SSH_CONNECTION || env.SSH_CLIENT || env.MOSH_CONNECTION || forceOsc52 === "1");
|
|
36
|
+
return Boolean(env.SSH_CONNECTION || env.SSH_CLIENT || env.MOSH_CONNECTION || env.REX_SESSION || forceOsc52 === "1");
|
|
36
37
|
}
|
|
37
38
|
function emitOsc52(text) {
|
|
38
39
|
const encoded = Buffer.from(text).toString("base64");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/utils/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile, execFileSync, execSync, spawn } from \"child_process\";\nimport { randomUUID } from \"crypto\";\nimport { unlinkSync, writeFileSync } from \"fs\";\nimport { platform, tmpdir } from \"os\";\nimport { join } from \"path\";\nimport { ENV_CLIPBOARD_OSC52, getEnvNames } from \"../config.js\";\nimport { createChildProcessEnvironment } from \"./child-process.ts\";\nimport { isWaylandSession } from \"./clipboard-image.ts\";\nimport { type ClipboardModule, clipboard } from \"./clipboard-native.ts\";\nimport { isWSL } from \"./wsl.ts\";\n\ntype NativeClipboardExecOptions = {\n\tinput: string;\n\ttimeout: number;\n\tstdio: [\"pipe\", \"ignore\", \"ignore\"];\n\tenv: NodeJS.ProcessEnv;\n\tdetached: boolean;\n\tcwd: string;\n};\n\n/**\n * Clipboard tools ignore the working directory, and WSL cannot start Windows executables (powershell.exe)\n * when the cwd's \\\\wsl.localhost\\... path exceeds MAX_PATH (pi#11592). Running them from / (the current\n * drive root on Windows) also keeps a daemonizing clipboard owner from pinning the cwd.\n */\nconst CLIPBOARD_CWD = \"/\";\n\nfunction copyToX11Clipboard(options: NativeClipboardExecOptions): void {\n\ttry {\n\t\texecSync(\"xclip -selection clipboard\", options);\n\t} catch {\n\t\texecSync(\"xsel --clipboard --input\", options);\n\t}\n}\n\nconst MAX_OSC52_ENCODED_LENGTH = 100_000;\n\n/**\n * Remote sessions also emit OSC 52 so the client terminal receives the copy. ATOMIC_CLIPBOARD_OSC52=1\n * (or its PI_CLIPBOARD_OSC52 alias) covers remote clients that leave no SSH markers, such as\n * multiplexer attaches or remote IDE daemons.\n */\nfunction isRemoteSession(env: NodeJS.ProcessEnv): boolean {\n\tconst forceOsc52 = getEnvNames(ENV_CLIPBOARD_OSC52)\n\t\t.map((name) => env[name])\n\t\t.find((value) => value !== undefined);\n\treturn Boolean(env.SSH_CONNECTION || env.SSH_CLIENT || env.MOSH_CONNECTION || forceOsc52 === \"1\");\n}\n\nfunction emitOsc52(text: string): boolean {\n\tconst encoded = Buffer.from(text).toString(\"base64\");\n\tif (encoded.length > MAX_OSC52_ENCODED_LENGTH) {\n\t\treturn false;\n\t}\n\tprocess.stdout.write(`\\x1b]52;c;${encoded}\\x07`);\n\treturn true;\n}\n\n/**\n * WSL without WSLg has no Linux display, so the Windows clipboard is written through\n * interop. PowerShell reads the text from a file because `clip.exe` and PowerShell stdin\n * decode piped bytes with the console code page, which mangles non-ASCII UTF-8.\n */\nfunction copyViaWindowsClipboard(text: string): boolean {\n\tconst tmpFile = join(tmpdir(), `pi-wsl-clip-${randomUUID()}.txt`);\n\tconst env = createChildProcessEnvironment();\n\ttry {\n\t\twriteFileSync(tmpFile, text, { encoding: \"utf8\", mode: 0o600 });\n\t\tconst winPath = execFileSync(\"wslpath\", [\"-w\", tmpFile], {\n\t\t\ttimeout: 1000,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t\tenv,\n\t\t\tcwd: CLIPBOARD_CWD,\n\t\t})\n\t\t\t.toString(\"utf8\")\n\t\t\t.trim();\n\t\tif (!winPath) return false;\n\t\tconst script = `Set-Clipboard -Value ([System.IO.File]::ReadAllText('${winPath.replaceAll(\"'\", \"''\")}', [System.Text.Encoding]::UTF8))`;\n\t\texecFileSync(\"powershell.exe\", [\"-NoProfile\", \"-Command\", script], {\n\t\t\ttimeout: 5000,\n\t\t\tstdio: [\"ignore\", \"ignore\", \"ignore\"],\n\t\t\tenv,\n\t\t\tcwd: CLIPBOARD_CWD,\n\t\t});\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t} finally {\n\t\ttry {\n\t\t\tunlinkSync(tmpFile);\n\t\t} catch {\n\t\t\t// The file may not have been created.\n\t\t}\n\t}\n}\n\nfunction readTermuxClipboardText(): Promise<string | undefined> {\n\treturn new Promise((resolve) => {\n\t\texecFile(\"termux-clipboard-get\", [], { timeout: 5000, env: createChildProcessEnvironment() }, (error, stdout) =>\n\t\t\tresolve(error ? undefined : stdout),\n\t\t);\n\t});\n}\n\nexport async function readClipboardText(\n\tsource: { getText(): Promise<string> } | null = clipboard,\n): Promise<string | null> {\n\tif (process.env.TERMUX_VERSION) {\n\t\tconst text = await readTermuxClipboardText();\n\t\tif (text !== undefined) return text || null;\n\t}\n\ttry {\n\t\tif (!source) return null;\n\t\treturn await source.getText();\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Pasteboard type that Finder and other macOS apps publish for copied files. */\nconst FILE_URL_PASTEBOARD_TYPE = \"public.file-url\";\n\n/** Prints the POSIX paths of the file URLs on the general pasteboard as a JSON array. */\nconst READ_FILE_URLS_SCRIPT = `ObjC.import(\"AppKit\");\nconst urls = $.NSPasteboard.generalPasteboard.readObjectsForClassesOptions(\n\t$.NSArray.arrayWithObject($.NSURL),\n\t$.NSDictionary.dictionaryWithObjectForKey($.NSNumber.numberWithBool(true), $.NSPasteboardURLReadingFileURLsOnlyKey)\n);\nconst paths = [];\nfor (let i = 0; i < urls.count; i++) paths.push(ObjC.unwrap(urls.objectAtIndex(i).path));\nJSON.stringify(paths);`;\n\n/**\n * Read file paths, such as Finder file copies, from the macOS clipboard. The native clipboard\n * module reports whether file URLs are present; AppKit is read through JavaScript for Automation\n * only then, because the module cannot read file URLs itself.\n */\nexport async function readClipboardFilePaths(\n\tsource: Pick<ClipboardModule, \"availableFormats\"> | null = clipboard,\n\tcurrentPlatform: NodeJS.Platform = process.platform,\n): Promise<string[] | null> {\n\tif (currentPlatform !== \"darwin\" || !source?.availableFormats?.().includes(FILE_URL_PASTEBOARD_TYPE)) return null;\n\tconst stdout = await new Promise<string>((resolve, reject) => {\n\t\texecFile(\n\t\t\t\"osascript\",\n\t\t\t[\"-l\", \"JavaScript\", \"-e\", READ_FILE_URLS_SCRIPT],\n\t\t\t{ timeout: 5000, env: createChildProcessEnvironment() },\n\t\t\t(error, output, stderr) => {\n\t\t\t\tif (error) {\n\t\t\t\t\t// The default error message repeats the whole script; report what osascript printed instead.\n\t\t\t\t\tconst detail = stderr.trim();\n\t\t\t\t\treject(new Error(`osascript could not read the copied files${detail ? `: ${detail}` : \"\"}`));\n\t\t\t\t} else resolve(output);\n\t\t\t},\n\t\t);\n\t});\n\tconst paths = JSON.parse(stdout) as string[] | null;\n\tif (!Array.isArray(paths) || paths.some((path) => typeof path !== \"string\")) {\n\t\tthrow new Error(\"Unexpected clipboard file path output\");\n\t}\n\treturn paths.length > 0 ? paths : null;\n}\n\nexport async function copyToClipboard(text: string): Promise<void> {\n\tlet copied = false;\n\n\tconst p = platform();\n\tconst env = process.env;\n\t// Prefer direct clipboard writes. Emitting OSC 52 first can make terminals\n\t// write the same native clipboard concurrently with the addon, and very large\n\t// OSC 52 payloads can desynchronize terminal rendering.\n\t//\n\t// On Linux, skip the native addon. The underlying `clipboard-rs` crate is\n\t// X11-only and does not retain selection ownership after `set_text`\n\t// resolves, so on Wayland-only compositors (Hyprland, Niri, ...) and even\n\t// some X11 sessions the call resolves successfully without populating the\n\t// clipboard. The platform tools below (wl-copy, xclip, xsel) properly\n\t// daemonize and keep ownership.\n\ttry {\n\t\tif (clipboard && p !== \"linux\") {\n\t\t\tawait clipboard.setText(text);\n\t\t\tcopied = true;\n\t\t}\n\t} catch {\n\t\t// Fall through to platform-specific clipboard tools.\n\t}\n\n\tconst remote = isRemoteSession(env);\n\tif (copied && !remote) {\n\t\treturn;\n\t}\n\n\tconst options: NativeClipboardExecOptions = {\n\t\tinput: text,\n\t\ttimeout: 5000,\n\t\tstdio: [\"pipe\", \"ignore\", \"ignore\"],\n\t\tenv: createChildProcessEnvironment(),\n\t\t// Clipboard writers can daemonize. Detach on POSIX so the daemon leaves Atomic's process group\n\t\t// and Ctrl+Z suspend (SIGTSTP to the group) does not stop the clipboard owner (earendil-works/pi#11179).\n\t\tdetached: p !== \"win32\",\n\t\tcwd: CLIPBOARD_CWD,\n\t};\n\n\tif (!copied) {\n\t\ttry {\n\t\t\tif (p === \"darwin\") {\n\t\t\t\texecSync(\"pbcopy\", options);\n\t\t\t\tcopied = true;\n\t\t\t} else if (p === \"win32\") {\n\t\t\t\texecSync(\"clip\", options);\n\t\t\t\tcopied = true;\n\t\t\t} else {\n\t\t\t\t// Linux. Try Termux, Wayland, or X11 clipboard tools.\n\t\t\t\tif (env.TERMUX_VERSION) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\texecSync(\"termux-clipboard-set\", options);\n\t\t\t\t\t\tcopied = true;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Fall back to Wayland or X11 tools.\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!copied) {\n\t\t\t\t\tconst hasWaylandDisplay = Boolean(env.WAYLAND_DISPLAY);\n\t\t\t\t\tconst hasX11Display = Boolean(env.DISPLAY);\n\t\t\t\t\tconst isWayland = isWaylandSession();\n\t\t\t\t\tif (isWayland && hasWaylandDisplay) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Verify wl-copy exists (spawn errors are async and won't be caught)\n\t\t\t\t\t\t\texecSync(\"which wl-copy\", { stdio: \"ignore\", env: createChildProcessEnvironment() });\n\t\t\t\t\t\t\t// wl-copy with execSync hangs due to fork behavior; use spawn instead.\n\t\t\t\t\t\t\t// Await its terminal event so failures can fall through to X11 or OSC 52.\n\t\t\t\t\t\t\tconst exitCode = await new Promise<number>((resolve) => {\n\t\t\t\t\t\t\t\tconst proc = spawn(\"wl-copy\", [], {\n\t\t\t\t\t\t\t\t\tstdio: [\"pipe\", \"ignore\", \"ignore\"],\n\t\t\t\t\t\t\t\t\tenv: createChildProcessEnvironment(),\n\t\t\t\t\t\t\t\t\tdetached: options.detached,\n\t\t\t\t\t\t\t\t\tcwd: options.cwd,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tlet settled = false;\n\t\t\t\t\t\t\t\tconst finish = (code: number) => {\n\t\t\t\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\t\t\t\tresolve(code);\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tproc.once(\"error\", () => finish(1));\n\t\t\t\t\t\t\t\tproc.once(\"close\", (code) => finish(code ?? 1));\n\t\t\t\t\t\t\t\tproc.stdin.on(\"error\", () => {});\n\t\t\t\t\t\t\t\tproc.stdin.end(text);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (exitCode === 0) copied = true;\n\t\t\t\t\t\t\telse if (hasX11Display) {\n\t\t\t\t\t\t\t\tcopyToX11Clipboard(options);\n\t\t\t\t\t\t\t\tcopied = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tif (hasX11Display) {\n\t\t\t\t\t\t\t\tcopyToX11Clipboard(options);\n\t\t\t\t\t\t\t\tcopied = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (hasX11Display) {\n\t\t\t\t\t\tcopyToX11Clipboard(options);\n\t\t\t\t\t\tcopied = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Fall through to OSC 52 fallback.\n\t\t}\n\t}\n\n\tlet osc52Emitted = false;\n\t// A remote session skips the Windows clipboard: the copied text belongs on the connected\n\t// client, which the OSC 52 fallback below reaches, not on the remote host.\n\tif (!copied && !remote && p === \"linux\" && isWSL(env)) {\n\t\t// Windows Terminal supports OSC 52; prefer it over the slower PowerShell round trip.\n\t\tif (env.WT_SESSION) osc52Emitted = emitOsc52(text);\n\t\tcopied = osc52Emitted || copyViaWindowsClipboard(text);\n\t}\n\t// OSC 52 cannot be verified, so a desktop session with a display reports the failure\n\t// instead. Without a display the terminal is the only clipboard route (containers,\n\t// WSL without WSLg). A remote session emits it even after a successful local write:\n\t// that write reached the remote host's display clipboard, while the user is at the\n\t// client, which only the terminal can reach. The Windows interop fallback above is\n\t// different because it is a last resort that a remote session gains nothing from.\n\tconst headless = p === \"linux\" && !env.DISPLAY && !env.WAYLAND_DISPLAY && !env.TERMUX_VERSION;\n\tlet oversized = false;\n\tif (!osc52Emitted && (remote || (!copied && headless))) {\n\t\tif (emitOsc52(text)) copied = true;\n\t\telse oversized = true;\n\t}\n\tif (copied) return;\n\tif (oversized) throw new Error(\"Clipboard unavailable: text exceeds the OSC 52 size limit\");\n\tif (env.TERMUX_VERSION) {\n\t\tthrow new Error(\"Clipboard unavailable: install the Termux:API app and `termux-api` package\");\n\t}\n\tif (p === \"linux\") {\n\t\tif (env.WAYLAND_DISPLAY) {\n\t\t\tthrow new Error(\"Clipboard unavailable: install `wl-clipboard` (`wl-copy`) or check Wayland access\");\n\t\t}\n\t\tif (env.DISPLAY) {\n\t\t\tthrow new Error(\"Clipboard unavailable: install `xclip` or `xsel`, or check X11 access\");\n\t\t}\n\t}\n\tthrow new Error(\"Clipboard unavailable\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/utils/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile, execFileSync, execSync, spawn } from \"child_process\";\nimport { randomUUID } from \"crypto\";\nimport { unlinkSync, writeFileSync } from \"fs\";\nimport { platform, tmpdir } from \"os\";\nimport { join } from \"path\";\nimport { ENV_CLIPBOARD_OSC52, getEnvNames } from \"../config.js\";\nimport { createChildProcessEnvironment } from \"./child-process.ts\";\nimport { isWaylandSession } from \"./clipboard-image.ts\";\nimport { type ClipboardModule, clipboard } from \"./clipboard-native.ts\";\nimport { isWSL } from \"./wsl.ts\";\n\ntype NativeClipboardExecOptions = {\n\tinput: string;\n\ttimeout: number;\n\tstdio: [\"pipe\", \"ignore\", \"ignore\"];\n\tenv: NodeJS.ProcessEnv;\n\tdetached: boolean;\n\tcwd: string;\n};\n\n/**\n * Clipboard tools ignore the working directory, and WSL cannot start Windows executables (powershell.exe)\n * when the cwd's \\\\wsl.localhost\\... path exceeds MAX_PATH (pi#11592). Running them from / (the current\n * drive root on Windows) also keeps a daemonizing clipboard owner from pinning the cwd.\n */\nconst CLIPBOARD_CWD = \"/\";\n\nfunction copyToX11Clipboard(options: NativeClipboardExecOptions): void {\n\ttry {\n\t\texecSync(\"xclip -selection clipboard\", options);\n\t} catch {\n\t\texecSync(\"xsel --clipboard --input\", options);\n\t}\n}\n\nconst MAX_OSC52_ENCODED_LENGTH = 100_000;\n\n/**\n * Remote sessions also emit OSC 52 so the client terminal receives the copy. Rex terminals count as\n * remote: a Rex server spawns shells without SSH markers, and its client may be another machine.\n * ATOMIC_CLIPBOARD_OSC52=1 (or its PI_CLIPBOARD_OSC52 alias) covers remote clients that leave no\n * markers, such as multiplexer attaches or remote IDE daemons.\n */\nfunction isRemoteSession(env: NodeJS.ProcessEnv): boolean {\n\tconst forceOsc52 = getEnvNames(ENV_CLIPBOARD_OSC52)\n\t\t.map((name) => env[name])\n\t\t.find((value) => value !== undefined);\n\treturn Boolean(env.SSH_CONNECTION || env.SSH_CLIENT || env.MOSH_CONNECTION || env.REX_SESSION || forceOsc52 === \"1\");\n}\n\nfunction emitOsc52(text: string): boolean {\n\tconst encoded = Buffer.from(text).toString(\"base64\");\n\tif (encoded.length > MAX_OSC52_ENCODED_LENGTH) {\n\t\treturn false;\n\t}\n\tprocess.stdout.write(`\\x1b]52;c;${encoded}\\x07`);\n\treturn true;\n}\n\n/**\n * WSL without WSLg has no Linux display, so the Windows clipboard is written through\n * interop. PowerShell reads the text from a file because `clip.exe` and PowerShell stdin\n * decode piped bytes with the console code page, which mangles non-ASCII UTF-8.\n */\nfunction copyViaWindowsClipboard(text: string): boolean {\n\tconst tmpFile = join(tmpdir(), `pi-wsl-clip-${randomUUID()}.txt`);\n\tconst env = createChildProcessEnvironment();\n\ttry {\n\t\twriteFileSync(tmpFile, text, { encoding: \"utf8\", mode: 0o600 });\n\t\tconst winPath = execFileSync(\"wslpath\", [\"-w\", tmpFile], {\n\t\t\ttimeout: 1000,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t\tenv,\n\t\t\tcwd: CLIPBOARD_CWD,\n\t\t})\n\t\t\t.toString(\"utf8\")\n\t\t\t.trim();\n\t\tif (!winPath) return false;\n\t\tconst script = `Set-Clipboard -Value ([System.IO.File]::ReadAllText('${winPath.replaceAll(\"'\", \"''\")}', [System.Text.Encoding]::UTF8))`;\n\t\texecFileSync(\"powershell.exe\", [\"-NoProfile\", \"-Command\", script], {\n\t\t\ttimeout: 5000,\n\t\t\tstdio: [\"ignore\", \"ignore\", \"ignore\"],\n\t\t\tenv,\n\t\t\tcwd: CLIPBOARD_CWD,\n\t\t});\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t} finally {\n\t\ttry {\n\t\t\tunlinkSync(tmpFile);\n\t\t} catch {\n\t\t\t// The file may not have been created.\n\t\t}\n\t}\n}\n\nfunction readTermuxClipboardText(): Promise<string | undefined> {\n\treturn new Promise((resolve) => {\n\t\texecFile(\"termux-clipboard-get\", [], { timeout: 5000, env: createChildProcessEnvironment() }, (error, stdout) =>\n\t\t\tresolve(error ? undefined : stdout),\n\t\t);\n\t});\n}\n\nexport async function readClipboardText(\n\tsource: { getText(): Promise<string> } | null = clipboard,\n): Promise<string | null> {\n\tif (process.env.TERMUX_VERSION) {\n\t\tconst text = await readTermuxClipboardText();\n\t\tif (text !== undefined) return text || null;\n\t}\n\ttry {\n\t\tif (!source) return null;\n\t\treturn await source.getText();\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Pasteboard type that Finder and other macOS apps publish for copied files. */\nconst FILE_URL_PASTEBOARD_TYPE = \"public.file-url\";\n\n/** Prints the POSIX paths of the file URLs on the general pasteboard as a JSON array. */\nconst READ_FILE_URLS_SCRIPT = `ObjC.import(\"AppKit\");\nconst urls = $.NSPasteboard.generalPasteboard.readObjectsForClassesOptions(\n\t$.NSArray.arrayWithObject($.NSURL),\n\t$.NSDictionary.dictionaryWithObjectForKey($.NSNumber.numberWithBool(true), $.NSPasteboardURLReadingFileURLsOnlyKey)\n);\nconst paths = [];\nfor (let i = 0; i < urls.count; i++) paths.push(ObjC.unwrap(urls.objectAtIndex(i).path));\nJSON.stringify(paths);`;\n\n/**\n * Read file paths, such as Finder file copies, from the macOS clipboard. The native clipboard\n * module reports whether file URLs are present; AppKit is read through JavaScript for Automation\n * only then, because the module cannot read file URLs itself.\n */\nexport async function readClipboardFilePaths(\n\tsource: Pick<ClipboardModule, \"availableFormats\"> | null = clipboard,\n\tcurrentPlatform: NodeJS.Platform = process.platform,\n): Promise<string[] | null> {\n\tif (currentPlatform !== \"darwin\" || !source?.availableFormats?.().includes(FILE_URL_PASTEBOARD_TYPE)) return null;\n\tconst stdout = await new Promise<string>((resolve, reject) => {\n\t\texecFile(\n\t\t\t\"osascript\",\n\t\t\t[\"-l\", \"JavaScript\", \"-e\", READ_FILE_URLS_SCRIPT],\n\t\t\t{ timeout: 5000, env: createChildProcessEnvironment() },\n\t\t\t(error, output, stderr) => {\n\t\t\t\tif (error) {\n\t\t\t\t\t// The default error message repeats the whole script; report what osascript printed instead.\n\t\t\t\t\tconst detail = stderr.trim();\n\t\t\t\t\treject(new Error(`osascript could not read the copied files${detail ? `: ${detail}` : \"\"}`));\n\t\t\t\t} else resolve(output);\n\t\t\t},\n\t\t);\n\t});\n\tconst paths = JSON.parse(stdout) as string[] | null;\n\tif (!Array.isArray(paths) || paths.some((path) => typeof path !== \"string\")) {\n\t\tthrow new Error(\"Unexpected clipboard file path output\");\n\t}\n\treturn paths.length > 0 ? paths : null;\n}\n\nexport async function copyToClipboard(text: string): Promise<void> {\n\tlet copied = false;\n\n\tconst p = platform();\n\tconst env = process.env;\n\t// Prefer direct clipboard writes. Emitting OSC 52 first can make terminals\n\t// write the same native clipboard concurrently with the addon, and very large\n\t// OSC 52 payloads can desynchronize terminal rendering.\n\t//\n\t// On Linux, skip the native addon. The underlying `clipboard-rs` crate is\n\t// X11-only and does not retain selection ownership after `set_text`\n\t// resolves, so on Wayland-only compositors (Hyprland, Niri, ...) and even\n\t// some X11 sessions the call resolves successfully without populating the\n\t// clipboard. The platform tools below (wl-copy, xclip, xsel) properly\n\t// daemonize and keep ownership.\n\ttry {\n\t\tif (clipboard && p !== \"linux\") {\n\t\t\tawait clipboard.setText(text);\n\t\t\tcopied = true;\n\t\t}\n\t} catch {\n\t\t// Fall through to platform-specific clipboard tools.\n\t}\n\n\tconst remote = isRemoteSession(env);\n\tif (copied && !remote) {\n\t\treturn;\n\t}\n\n\tconst options: NativeClipboardExecOptions = {\n\t\tinput: text,\n\t\ttimeout: 5000,\n\t\tstdio: [\"pipe\", \"ignore\", \"ignore\"],\n\t\tenv: createChildProcessEnvironment(),\n\t\t// Clipboard writers can daemonize. Detach on POSIX so the daemon leaves Atomic's process group\n\t\t// and Ctrl+Z suspend (SIGTSTP to the group) does not stop the clipboard owner (earendil-works/pi#11179).\n\t\tdetached: p !== \"win32\",\n\t\tcwd: CLIPBOARD_CWD,\n\t};\n\n\tif (!copied) {\n\t\ttry {\n\t\t\tif (p === \"darwin\") {\n\t\t\t\texecSync(\"pbcopy\", options);\n\t\t\t\tcopied = true;\n\t\t\t} else if (p === \"win32\") {\n\t\t\t\texecSync(\"clip\", options);\n\t\t\t\tcopied = true;\n\t\t\t} else {\n\t\t\t\t// Linux. Try Termux, Wayland, or X11 clipboard tools.\n\t\t\t\tif (env.TERMUX_VERSION) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\texecSync(\"termux-clipboard-set\", options);\n\t\t\t\t\t\tcopied = true;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Fall back to Wayland or X11 tools.\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!copied) {\n\t\t\t\t\tconst hasWaylandDisplay = Boolean(env.WAYLAND_DISPLAY);\n\t\t\t\t\tconst hasX11Display = Boolean(env.DISPLAY);\n\t\t\t\t\tconst isWayland = isWaylandSession();\n\t\t\t\t\tif (isWayland && hasWaylandDisplay) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Verify wl-copy exists (spawn errors are async and won't be caught)\n\t\t\t\t\t\t\texecSync(\"which wl-copy\", { stdio: \"ignore\", env: createChildProcessEnvironment() });\n\t\t\t\t\t\t\t// wl-copy with execSync hangs due to fork behavior; use spawn instead.\n\t\t\t\t\t\t\t// Await its terminal event so failures can fall through to X11 or OSC 52.\n\t\t\t\t\t\t\tconst exitCode = await new Promise<number>((resolve) => {\n\t\t\t\t\t\t\t\tconst proc = spawn(\"wl-copy\", [], {\n\t\t\t\t\t\t\t\t\tstdio: [\"pipe\", \"ignore\", \"ignore\"],\n\t\t\t\t\t\t\t\t\tenv: createChildProcessEnvironment(),\n\t\t\t\t\t\t\t\t\tdetached: options.detached,\n\t\t\t\t\t\t\t\t\tcwd: options.cwd,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tlet settled = false;\n\t\t\t\t\t\t\t\tconst finish = (code: number) => {\n\t\t\t\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\t\t\t\tresolve(code);\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tproc.once(\"error\", () => finish(1));\n\t\t\t\t\t\t\t\tproc.once(\"close\", (code) => finish(code ?? 1));\n\t\t\t\t\t\t\t\tproc.stdin.on(\"error\", () => {});\n\t\t\t\t\t\t\t\tproc.stdin.end(text);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (exitCode === 0) copied = true;\n\t\t\t\t\t\t\telse if (hasX11Display) {\n\t\t\t\t\t\t\t\tcopyToX11Clipboard(options);\n\t\t\t\t\t\t\t\tcopied = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tif (hasX11Display) {\n\t\t\t\t\t\t\t\tcopyToX11Clipboard(options);\n\t\t\t\t\t\t\t\tcopied = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (hasX11Display) {\n\t\t\t\t\t\tcopyToX11Clipboard(options);\n\t\t\t\t\t\tcopied = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Fall through to OSC 52 fallback.\n\t\t}\n\t}\n\n\tlet osc52Emitted = false;\n\t// A remote session skips the Windows clipboard: the copied text belongs on the connected\n\t// client, which the OSC 52 fallback below reaches, not on the remote host.\n\tif (!copied && !remote && p === \"linux\" && isWSL(env)) {\n\t\t// Windows Terminal supports OSC 52; prefer it over the slower PowerShell round trip.\n\t\tif (env.WT_SESSION) osc52Emitted = emitOsc52(text);\n\t\tcopied = osc52Emitted || copyViaWindowsClipboard(text);\n\t}\n\t// OSC 52 cannot be verified, so a desktop session with a display reports the failure\n\t// instead. Without a display the terminal is the only clipboard route (containers,\n\t// WSL without WSLg). A remote session emits it even after a successful local write:\n\t// that write reached the remote host's display clipboard, while the user is at the\n\t// client, which only the terminal can reach. The Windows interop fallback above is\n\t// different because it is a last resort that a remote session gains nothing from.\n\tconst headless = p === \"linux\" && !env.DISPLAY && !env.WAYLAND_DISPLAY && !env.TERMUX_VERSION;\n\tlet oversized = false;\n\tif (!osc52Emitted && (remote || (!copied && headless))) {\n\t\tif (emitOsc52(text)) copied = true;\n\t\telse oversized = true;\n\t}\n\tif (copied) return;\n\tif (oversized) throw new Error(\"Clipboard unavailable: text exceeds the OSC 52 size limit\");\n\tif (env.TERMUX_VERSION) {\n\t\tthrow new Error(\"Clipboard unavailable: install the Termux:API app and `termux-api` package\");\n\t}\n\tif (p === \"linux\") {\n\t\tif (env.WAYLAND_DISPLAY) {\n\t\t\tthrow new Error(\"Clipboard unavailable: install `wl-clipboard` (`wl-copy`) or check Wayland access\");\n\t\t}\n\t\tif (env.DISPLAY) {\n\t\t\tthrow new Error(\"Clipboard unavailable: install `xclip` or `xsel`, or check X11 access\");\n\t\t}\n\t}\n\tthrow new Error(\"Clipboard unavailable\");\n}\n"]}
|
|
@@ -122,7 +122,7 @@ The shell installer detects Alpine and selects `atomic-linux-x64-musl.tar.gz` or
|
|
|
122
122
|
|
|
123
123
|
Clipboard setup depends on your environment:
|
|
124
124
|
|
|
125
|
-
- **Clipboard:** install `wl-clipboard` on Wayland, `xclip` or `xsel` on X11, or the Termux:API app and `termux-api` package on Termux. OSC 52 forwards copies over SSH or
|
|
125
|
+
- **Clipboard:** install `wl-clipboard` on Wayland, `xclip` or `xsel` on X11, or the Termux:API app and `termux-api` package on Termux. OSC 52 forwards copies over SSH, Mosh, or Rex and is a fallback on headless Linux. Set `ATOMIC_CLIPBOARD_OSC52=1`, or the legacy `PI_CLIPBOARD_OSC52=1`, to force terminal forwarding. Your terminal must support it; forwarding does not confirm a successful local clipboard write.
|
|
126
126
|
|
|
127
127
|
Then start Atomic in the project directory you want it to work on:
|
|
128
128
|
|
package/docs/keybindings.md
CHANGED
|
@@ -101,7 +101,7 @@ The dedicated history actions always change history entries, regardless of the c
|
|
|
101
101
|
| `tui.select.confirm` | `enter` | Confirm selection |
|
|
102
102
|
| `tui.select.cancel` | `escape`, `ctrl+c` | Cancel selection |
|
|
103
103
|
|
|
104
|
-
Local copy operations require a working native clipboard or platform command. On Linux, install `wl-clipboard` for Wayland, `xclip` or `xsel` for X11, or the Termux:API app and `termux-api` package for Termux. Fullscreen selection shows a backend-specific failure message for five seconds. Atomic forwards copies through OSC 52 in SSH
|
|
104
|
+
Local copy operations require a working native clipboard or platform command. On Linux, install `wl-clipboard` for Wayland, `xclip` or `xsel` for X11, or the Termux:API app and `termux-api` package for Termux. Fullscreen selection shows a backend-specific failure message for five seconds. Atomic forwards copies through OSC 52 in SSH, Mosh, and Rex sessions and uses it as a fallback on headless Linux. Set `ATOMIC_CLIPBOARD_OSC52=1`, or its legacy alias `PI_CLIPBOARD_OSC52=1`, to force forwarding after the local clipboard attempt. The terminal must support clipboard forwarding; an OSC 52 write does not confirm a successful local copy.
|
|
105
105
|
|
|
106
106
|
### TUI Fullscreen Viewport
|
|
107
107
|
|
package/docs/sdk.md
CHANGED
|
@@ -197,6 +197,8 @@ Use `withResourceAdmission(resourceAdmission, async () => { ... })` to apply a s
|
|
|
197
197
|
|
|
198
198
|
A child session built from `getChildSessionOptions()` uses only its parent's service, or none when its parent holds none: a scope the parent's turn happens to run in never applies to the parent's children.
|
|
199
199
|
|
|
200
|
+
A turn that a delivered message starts (an extension's `sendMessage`, `sendMessages` or `sendUserMessage`, or the session's `sendCustomMessage`, `sendCustomMessages` or `sendUserMessage`) runs under the receiving session's own service, or none when it holds none, wherever the message was sent from. A session's commands therefore never wait on the service of a scope that only sent it a message. `prompt()` still runs in its caller's scope.
|
|
201
|
+
|
|
200
202
|
### Session storage
|
|
201
203
|
|
|
202
204
|
`createAgentSession()` persists sessions in `~/.atomic/workflows/journal.sqlite` by default, sharing the file with workflow runs under separate `session_` and `wf_` table prefixes. Pass `sessionStore` to choose storage explicitly:
|