@ai-agent-forge/agent-forge 0.86.1 → 0.86.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/bundle/.build-manifest.json +158 -152
  3. package/dist/bundle/chunks/{anthropic-messages-RJYU4TCY.js → anthropic-messages-EVFQ6MLR.js} +3 -3
  4. package/dist/bundle/chunks/{azure-openai-responses-LESTCUL7.js → azure-openai-responses-WQCZWFAH.js} +1 -1
  5. package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
  6. package/dist/bundle/chunks/{chunk-MDOTREMR.js → chunk-3WE3W52L.js} +2 -2
  7. package/dist/bundle/chunks/chunk-F6SBZUJG.js +141 -0
  8. package/dist/bundle/chunks/{chunk-SER2HCLE.js → chunk-N6BQJSGH.js} +1 -1
  9. package/dist/bundle/chunks/chunk-RK2X2KU2.js +1442 -0
  10. package/dist/bundle/chunks/chunk-TBPTHASB.js +2 -0
  11. package/dist/bundle/chunks/github-copilot.js +1 -1
  12. package/dist/bundle/chunks/{google-generative-ai-NZ66X6K7.js → google-generative-ai-ISTTUZMW.js} +1 -1
  13. package/dist/bundle/chunks/{google-vertex-2ZZOFBNQ.js → google-vertex-NS7ZF7DK.js} +1 -1
  14. package/dist/bundle/chunks/jiti-static-loader-CDSTNEDU.js +2 -0
  15. package/dist/bundle/chunks/{mistral-conversations-B6DZRMEK.js → mistral-conversations-GINO6Z4I.js} +1 -1
  16. package/dist/bundle/chunks/{openai-codex-responses-UFH6O5K6.js → openai-codex-responses-YDJSZOIH.js} +1 -1
  17. package/dist/bundle/chunks/{openai-completions-A55GHA4O.js → openai-completions-UPRWTQPT.js} +3 -3
  18. package/dist/bundle/chunks/openai-responses-O63W6HQ3.js +2 -0
  19. package/dist/bundle/chunks/virtual-modules-O72ICTMQ.js +2 -0
  20. package/dist/bundle/cli.js +1 -1
  21. package/dist/bundle/index.js +1 -1
  22. package/dist/bundle/rpc-entry.js +1 -1
  23. package/dist/cli/args.d.ts.map +1 -1
  24. package/dist/cli/args.js +14 -4
  25. package/dist/cli/args.js.map +1 -1
  26. package/dist/cli/session-picker.d.ts +1 -1
  27. package/dist/cli/session-picker.d.ts.map +1 -1
  28. package/dist/cli/session-picker.js +8 -2
  29. package/dist/cli/session-picker.js.map +1 -1
  30. package/dist/core/agent-session-compaction.d.ts +7 -2
  31. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  32. package/dist/core/agent-session-compaction.js +137 -43
  33. package/dist/core/agent-session-compaction.js.map +1 -1
  34. package/dist/core/agent-session-internal.d.ts +6 -0
  35. package/dist/core/agent-session-internal.d.ts.map +1 -1
  36. package/dist/core/agent-session-internal.js.map +1 -1
  37. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  38. package/dist/core/agent-session-runtime.js +1 -1
  39. package/dist/core/agent-session-runtime.js.map +1 -1
  40. package/dist/core/agent-session.d.ts +21 -4
  41. package/dist/core/agent-session.d.ts.map +1 -1
  42. package/dist/core/agent-session.js +104 -93
  43. package/dist/core/agent-session.js.map +1 -1
  44. package/dist/core/compaction/compaction.d.ts +15 -0
  45. package/dist/core/compaction/compaction.d.ts.map +1 -1
  46. package/dist/core/compaction/compaction.js +20 -1
  47. package/dist/core/compaction/compaction.js.map +1 -1
  48. package/dist/core/export-html/template.css +10 -0
  49. package/dist/core/export-html/template.js +50 -17
  50. package/dist/core/extensions/bootstrap-compaction-policy.d.ts.map +1 -1
  51. package/dist/core/extensions/bootstrap-compaction-policy.js +3 -1
  52. package/dist/core/extensions/bootstrap-compaction-policy.js.map +1 -1
  53. package/dist/core/extensions/capability-plugin.d.ts.map +1 -1
  54. package/dist/core/extensions/capability-plugin.js +25 -30
  55. package/dist/core/extensions/capability-plugin.js.map +1 -1
  56. package/dist/core/extensions/jiti-static-loader.d.ts +2 -0
  57. package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -0
  58. package/dist/core/extensions/jiti-static-loader.js +5 -0
  59. package/dist/core/extensions/jiti-static-loader.js.map +1 -0
  60. package/dist/core/extensions/microcompact.d.ts +3 -2
  61. package/dist/core/extensions/microcompact.d.ts.map +1 -1
  62. package/dist/core/extensions/microcompact.js +14 -5
  63. package/dist/core/extensions/microcompact.js.map +1 -1
  64. package/dist/core/extensions/virtual-modules.d.ts +3 -0
  65. package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
  66. package/dist/core/extensions/virtual-modules.js +32 -0
  67. package/dist/core/extensions/virtual-modules.js.map +1 -0
  68. package/dist/core/facade/coding-agent-facade.d.ts +3 -3
  69. package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
  70. package/dist/core/facade/coding-agent-facade.js.map +1 -1
  71. package/dist/core/facade/coding-agent-runtime-facade.d.ts +2 -2
  72. package/dist/core/facade/coding-agent-runtime-facade.d.ts.map +1 -1
  73. package/dist/core/facade/coding-agent-runtime-facade.js +4 -4
  74. package/dist/core/facade/coding-agent-runtime-facade.js.map +1 -1
  75. package/dist/core/model-resolver.d.ts.map +1 -1
  76. package/dist/core/model-resolver.js +2 -2
  77. package/dist/core/model-resolver.js.map +1 -1
  78. package/dist/core/package-install-host.d.ts +1 -1
  79. package/dist/core/package-install-host.d.ts.map +1 -1
  80. package/dist/core/package-install-host.js +4 -3
  81. package/dist/core/package-install-host.js.map +1 -1
  82. package/dist/core/prompt-templates.d.ts +6 -1
  83. package/dist/core/prompt-templates.d.ts.map +1 -1
  84. package/dist/core/prompt-templates.js +61 -35
  85. package/dist/core/prompt-templates.js.map +1 -1
  86. package/dist/core/resource-loader.d.ts.map +1 -1
  87. package/dist/core/resource-loader.js +6 -2
  88. package/dist/core/resource-loader.js.map +1 -1
  89. package/dist/core/session-manager.d.ts +23 -4
  90. package/dist/core/session-manager.d.ts.map +1 -1
  91. package/dist/core/session-manager.js +146 -108
  92. package/dist/core/session-manager.js.map +1 -1
  93. package/dist/core/settings-manager.d.ts +3 -0
  94. package/dist/core/settings-manager.d.ts.map +1 -1
  95. package/dist/core/settings-manager.js +4 -0
  96. package/dist/core/settings-manager.js.map +1 -1
  97. package/dist/core/tools/bash.d.ts +2 -1
  98. package/dist/core/tools/bash.d.ts.map +1 -1
  99. package/dist/core/tools/bash.js +18 -3
  100. package/dist/core/tools/bash.js.map +1 -1
  101. package/dist/main.d.ts.map +1 -1
  102. package/dist/main.js +6 -7
  103. package/dist/main.js.map +1 -1
  104. package/dist/modes/interactive/components/session-selector.d.ts +5 -5
  105. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  106. package/dist/modes/interactive/components/session-selector.js +74 -50
  107. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  108. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  109. package/dist/modes/interactive/components/tool-execution.js +18 -9
  110. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  111. package/dist/modes/interactive/interactive-mode.d.ts +2 -2
  112. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  113. package/dist/modes/interactive/interactive-mode.js +35 -32
  114. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  115. package/dist/modes/rpc/rpc-client.d.ts +14 -6
  116. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  117. package/dist/modes/rpc/rpc-client.js +47 -10
  118. package/dist/modes/rpc/rpc-client.js.map +1 -1
  119. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  120. package/dist/modes/rpc/rpc-mode.js +9 -10
  121. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  122. package/dist/modes/rpc/rpc-types.d.ts +10 -1
  123. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  124. package/dist/modes/rpc/rpc-types.js.map +1 -1
  125. package/dist/remote/server-assembly.d.ts.map +1 -1
  126. package/dist/remote/server-assembly.js +1 -1
  127. package/dist/remote/server-assembly.js.map +1 -1
  128. package/dist/utils/clipboard-image.d.ts.map +1 -1
  129. package/dist/utils/clipboard-image.js +1 -12
  130. package/dist/utils/clipboard-image.js.map +1 -1
  131. package/dist/utils/clipboard.d.ts.map +1 -1
  132. package/dist/utils/clipboard.js +88 -13
  133. package/dist/utils/clipboard.js.map +1 -1
  134. package/dist/utils/mime.d.ts.map +1 -1
  135. package/dist/utils/mime.js +1 -1
  136. package/dist/utils/mime.js.map +1 -1
  137. package/dist/utils/wsl.d.ts +3 -0
  138. package/dist/utils/wsl.d.ts.map +1 -0
  139. package/dist/utils/wsl.js +15 -0
  140. package/dist/utils/wsl.js.map +1 -0
  141. package/docs/rpc.md +7 -5
  142. package/docs/sdk.md +9 -8
  143. package/package.json +1 -1
  144. package/dist/bundle/chunks/chunk-KQEGUM34.js +0 -2
  145. package/dist/bundle/chunks/chunk-S3YLY4MG.js +0 -1581
  146. package/dist/bundle/chunks/openai-responses-TJLXRAXR.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-internal.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-internal.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared internal contract and snapshot helpers for the agent-session\n * submodules (agent-session-bash.ts, agent-session-compaction.ts,\n * agent-session-context.ts, agent-session-lifecycle.ts, agent-session-loop.ts,\n * agent-session-retry.ts, agent-session-tools.ts, agent-session-model.ts;\n * agent-session-runtime.ts consumes the class directly).\n *\n * `AgentSession` satisfies {@link AgentSessionInternals} structurally through a\n * single internal cast; members mirror the private state and helpers that moved\n * into the submodules. Same-name delegates stay on the class so call sites,\n * dynamic dispatch, and test spies keep working unchanged.\n */\n\nimport type {\n\tAgent,\n\tAgentContext,\n\tAgentEvent,\n\tAgentLoopTurnUpdate,\n\tAgentMessage,\n\tAgentTool,\n\tPrepareNextTurnContext,\n\tThinkingLevel,\n} from \"@agent-forge/agent-core\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tImageContent,\n\tModel,\n\tTextContent,\n\tToolResultMessage,\n} from \"@agent-forge/ai/compat\";\nimport type {\n\tAgentSessionEvent,\n\tModelCycleResult,\n\tModelMutationOptions,\n\tSessionStats,\n\tTurnAbortReason,\n} from \"./agent-session.ts\";\nimport type { CompactionCancelledResult } from \"./agent-session-compaction.ts\";\nimport type { LoopExecutor } from \"./agent-session-loop-runner.ts\";\nimport type { BashResult } from \"./bash-executor.ts\";\nimport type { CompactionResult } from \"./compaction/index.ts\";\nimport type { CapabilityPluginHandle, CapabilityRuntime, ContextOperationOptions } from \"./extensions/index.ts\";\nimport type { ModelStreamEventDataV1 } from \"./extensions/lifecycle-catalog.ts\";\nimport type { ContextUsage, ExecutionFactsV1 } from \"./extensions/public-api.ts\";\nimport type { HostLogger } from \"./logger.ts\";\nimport type { BashExecutionMessage, CustomMessage } from \"./messages.ts\";\nimport type { ModelRuntime } from \"./model-runtime.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport type { ResourceLoader } from \"./resource-loader.ts\";\nimport type { BranchSummaryEntry, SessionManager } from \"./session-manager.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\nimport type { BuildSystemPromptOptions } from \"./system-prompt.ts\";\nimport type { BashOperations } from \"./tools/bash.ts\";\nimport type { ToolDefinition, ToolInfo } from \"./tools/tool-definition.ts\";\n\n/** Registry entry for one tool definition with its source metadata. */\nexport interface ToolDefinitionEntry {\n\tdefinition: ToolDefinition;\n\tsourceInfo: SourceInfo;\n}\n\n/**\n * A session operation was cancelled by user intent (abort, reload barrier) — a\n * normal outcome, never a failure. Host boundaries resolve with structured\n * cancelled results instead of surfacing this as an error.\n */\nexport class SessionCancelledError extends Error {\n\treadonly reason: \"reload\" | \"signal\";\n\n\tconstructor(reason: SessionCancelledError[\"reason\"]) {\n\t\tsuper(`Session operation cancelled: ${reason}`);\n\t\tthis.name = \"SessionCancelledError\";\n\t\tthis.reason = reason;\n\t}\n}\n\n/**\n * Deep-clone a session value and freeze the clone so lifecycle payloads cannot\n * be mutated in place. The implementation lives on the public extension face\n * (`./extensions/public-api.ts`) so first-party and third-party plugins share\n * the same payload-projection contract; re-exported here for the host-internal\n * session submodules.\n */\nexport { detachedSessionSnapshot } from \"./extensions/public-api.ts\";\n\n/** JSON-safe clone for lifecycle payloads that must survive structured clone failures. */\nexport function jsonSafeSessionSnapshot<T>(value: T): T {\n\tconst serialized = JSON.stringify(value);\n\t// v8 ignore next -- 对象消息序列化永远返回字符串,undefined 分支不可达\n\treturn serialized === undefined ? (null as T) : (JSON.parse(serialized) as T);\n}\n\nexport interface AgentSessionInternals {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\treadonly _modelRuntime: ModelRuntime;\n\treadonly model: Model<Api> | undefined;\n\treadonly thinkingLevel: ThinkingLevel;\n\treadonly sessionId: string;\n\treadonly isStreaming: boolean;\n\t/** Idle gate for public context operations (compile-time private getter on AgentSession). */\n\treadonly isIdle: boolean;\n\n\t// Internal session state (compile-time private on AgentSession)\n\t_compactionQueue: Promise<void>;\n\t_compactionAbortController: AbortController | undefined;\n\t_autoCompactionAbortController: AbortController | undefined;\n\t_overflowRecoveryAttempted: boolean;\n\t/** 已完成的溢出裁剪级数(0 = 未裁剪);与 `_overflowRecoveryAttempted` 同点位复位。 */\n\t_overflowTrimStage: number;\n\t_activeCompactionPromise: Promise<unknown> | undefined;\n\t_branchSummaryAbortController: AbortController | undefined;\n\t_branchSummaryPromise: Promise<unknown> | undefined;\n\t_resolveBranchSummaryPromise: (() => void) | undefined;\n\t_reloadInProgress: boolean;\n\t_policyDecisionAbortController: AbortController | undefined;\n\t_retryAbortController: AbortController | undefined;\n\t_retryAttempt: number;\n\t_pendingRetryDecision:\n\t\t| { message: AssistantMessage; decision: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>> }\n\t\t| undefined;\n\t_isAgentRunActive: boolean;\n\t_currentRunAborted: boolean;\n\t_lastAbortReason: TurnAbortReason | undefined;\n\t_lastAssistantMessage: AssistantMessage | undefined;\n\n\t// Lifecycle dispatch state (compile-time private on AgentSession)\n\treadonly _modelStreamState: { streamId: string; sequence: number } | undefined;\n\t/** Correlation id for the active prompt run's lifecycle dispatches; written by the loop-runner via this facade. */\n\t_turnCorrelationId: string | undefined;\n\t_turnCorrelationCounter: number;\n\t/**\n\t * Host-process logger seam (会话轨迹第 2 期,设计 §5.2): one-line process log\n\t * beside lifecycle dispatches that report genuine failures (compaction\n\t * failed). Undefined when no hostLogger was configured; call sites treat it\n\t * as a no-op.\n\t */\n\treadonly _hostLogger?: HostLogger;\n\n\t// Bash execution state (compile-time private on AgentSession)\n\treadonly _bashAbortControllers: Set<AbortController>;\n\treadonly _activeBashPromises: Set<Promise<unknown>>;\n\t_bashEpoch: number;\n\t_pendingBashMessages: BashExecutionMessage[];\n\treadonly isDisposed: boolean;\n\n\t_capabilityRuntime: CapabilityRuntime | undefined;\n\t_compactionPolicyName: string;\n\t_overflowPolicyName: string;\n\t_branchSummaryPolicyName: string;\n\t_retryPolicyName: string;\n\t_runLoopStrategyName: string;\n\t/** Internal loop-executor seam (D-043 G3): set to replace the default prompt/continue drive. No public config; distinct from `_runLoopStrategyName` (a per-continuation veto policy). */\n\t_loopExecutor: LoopExecutor | undefined;\n\n\t// Helpers that remain on AgentSession\n\t_emit(event: AgentSessionEvent): void;\n\t_resolveIdleWaitIfIdle(): void;\n\t_flushPendingCustomMessages(): void;\n\t_emitAgentSettled(): Promise<void>;\n\t_observeLifecycleDeliveryError(error: unknown, extensionPath: string, event: string): void;\n\tabort(): Promise<void>;\n\t_abortInternal(): Promise<void>;\n\n\t// Context-transition state and delegates forwarding to agent-session-context.ts\n\t/** Generation fence for context projections that may outlive a runtime replacement. */\n\t_contextEpoch: number;\n\t_contextTransitionAbortController: AbortController;\n\t/** Serializes context transitions and lets reload/dispose drain them before teardown. */\n\t_activeContextTransition: Promise<unknown> | undefined;\n\t/** Monotonic revision for the public context snapshot/commit facade. */\n\t_contextRevision: number;\n\t/** Serializes public context commits so expectedRevision is a real CAS fence. */\n\t_contextCommitQueue: Promise<void>;\n\t/** Configured external context strategy name, written only by the constructor. */\n\treadonly _contextStrategyName: string | undefined;\n\t_requireContextStrategy(): { runtime: CapabilityRuntime; name: string };\n\t_requireIdleContextOperation(operation: string): void;\n\t_beginContextTransitionFence(): void;\n\t_isContextTransitionCurrent(epoch: number, allowReload: boolean): boolean;\n\t_assertContextTransitionCurrent(epoch: number, allowReload: boolean): void;\n\t_enqueueContextTransition<T>(\n\t\toperation: (epoch: number, signal: AbortSignal) => Promise<T>,\n\t\toptions?: { signal?: AbortSignal; allowReload?: boolean },\n\t): Promise<T>;\n\t_copyContextMessages(value: unknown, strategyName: string, direction: \"input\" | \"result\"): AgentMessage[];\n\t_applyContextTransition(\n\t\tmessages: AgentMessage[],\n\t\treason?: ContextOperationOptions[\"reason\"],\n\t\tsignal?: AbortSignal,\n\t\toptions?: { allowReload?: boolean },\n\t): Promise<AgentMessage[]>;\n\t_restoreContextTransition(\n\t\tsnapshot: unknown,\n\t\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\t\toptions?: { allowReload?: boolean },\n\t): Promise<AgentMessage[]>;\n\tsnapshotContext(): Promise<unknown>;\n\trestoreContext(snapshot: unknown): Promise<AgentMessage[]>;\n\treplaceContext(context: AgentMessage[]): Promise<AgentMessage[]>;\n\n\t// Model-scope state and delegates forwarding to agent-session-model.ts\n\t_scopedModels: Array<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>;\n\t/** Public scoped-models getter (Legacy 迁移 R1): submodules read via this instead of the private field. */\n\treadonly scopedModels: ReadonlyArray<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>;\n\tsetModel(model: Model<Api>, options?: ModelMutationOptions): Promise<void>;\n\tsetThinkingLevel(level: ThinkingLevel, options?: ModelMutationOptions): void;\n\t_emitModelSelect(\n\t\tnextModel: Model<Api>,\n\t\tpreviousModel: Model<Api> | undefined,\n\t\tsource: \"set\" | \"cycle\" | \"restore\",\n\t): Promise<void>;\n\t_addPersistedDefaultToNonEmptyScope(model: Model<Api>): void;\n\t_getThinkingLevelForModelSwitch(targetModel?: Model<Api>, explicitLevel?: ThinkingLevel): ThinkingLevel;\n\t_cycleScopedModel(\n\t\tdirection: \"forward\" | \"backward\",\n\t\toptions: ModelMutationOptions,\n\t): Promise<ModelCycleResult | undefined>;\n\t_cycleAvailableModel(\n\t\tdirection: \"forward\" | \"backward\",\n\t\toptions: ModelMutationOptions,\n\t): Promise<ModelCycleResult | undefined>;\n\n\t// Run-loop wiring state and delegates forwarding to agent-session-loop.ts\n\t/** The agent's construction-time prepare adapter, captured once by the loop wiring install. */\n\t_initialPrepareNextTurn:\n\t\t| ((\n\t\t\t\tcontext: PrepareNextTurnContext,\n\t\t\t\tsignal?: AbortSignal,\n\t\t ) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined)\n\t\t| undefined;\n\n\t// Delegates forwarding to the submodule functions\n\t_compactBeforeNextAssistantResponse(context: AgentContext, signal?: AbortSignal): Promise<AgentContext>;\n\t_enqueueCompaction<T>(operation: () => Promise<T>): Promise<T>;\n\t_compactInternal(customInstructions?: string): Promise<CompactionResult>;\n\t_checkCompaction(\n\t\tassistantMessage: AssistantMessage,\n\t\tskipAbortedCheck?: boolean,\n\t\tsignal?: AbortSignal,\n\t): Promise<boolean>;\n\t_runAutoCompaction(reason: \"overflow\" | \"threshold\", willRetry: boolean): Promise<boolean>;\n\t_willRetryAfterAgentEnd(event: Extract<AgentEvent, { type: \"agent_end\" }>, signal?: AbortSignal): Promise<boolean>;\n\t_isRetryableError(message: AssistantMessage, execution?: ExecutionFactsV1, signal?: AbortSignal): Promise<boolean>;\n\t_prepareRetry(\n\t\tmessage: AssistantMessage,\n\t\tprecomputedDecision?: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>>,\n\t): Promise<boolean>;\n\tnavigateTree(\n\t\ttargetId: string,\n\t\toptions?: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string },\n\t): Promise<{ editorText?: string; cancelled: boolean; aborted?: boolean; summaryEntry?: BranchSummaryEntry }>;\n\n\t// Lifecycle delegates forwarding to agent-session-lifecycle.ts\n\t_dispatchModelStreamLifecycle(\n\t\tmessage: AgentMessage,\n\t\teventName: ModelStreamEventDataV1[\"event\"],\n\t\tphase: ModelStreamEventDataV1[\"phase\"],\n\t): Promise<void>;\n\t_dispatchContextReplacedLifecycle(\n\t\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\t\tstrategyName?: string,\n\t): Promise<void>;\n\t_dispatchModelResponseLifecycle(message: AssistantMessage, entryId: string): Promise<void>;\n\t_dispatchToolCommitLifecycle(message: ToolResultMessage, entryId: string): Promise<void>;\n\t_dispatchToolResultLifecycle(message: ToolResultMessage, entryId: string): Promise<void>;\n\t_dispatchSessionReloadLifecycle(generation: number): Promise<void>;\n\n\t// Bash delegates forwarding to agent-session-bash.ts\n\tcaptureBashEpoch(): number;\n\tisBashEpochCurrent(epoch: number): boolean;\n\temitUserBash(excludeFromContext: boolean): void;\n\texecuteBash(\n\t\tcommand: string,\n\t\tonChunk?: (chunk: string) => void,\n\t\toptions?: { excludeFromContext?: boolean; id?: string; operations?: BashOperations },\n\t): Promise<BashResult>;\n\trecordBashResult(\n\t\tcommand: string,\n\t\tresult: BashResult,\n\t\toptions?: { excludeFromContext?: boolean; epoch?: number },\n\t): void;\n\tabortBash(): void;\n\t_flushPendingBashMessages(): void;\n\n\t// Tool registry state (compile-time private on AgentSession)\n\t_resourceLoader: ResourceLoader;\n\t_customTools: ToolDefinition[];\n\t_deferredToolPluginIds: ReadonlySet<string>;\n\t_baseToolDefinitions: Map<string, ToolDefinition>;\n\t_baseToolSources: Map<string, SourceInfo>;\n\t_toolRegistry: Map<string, AgentTool>;\n\t_toolDefinitions: Map<string, ToolDefinitionEntry>;\n\t_toolPromptSnippets: Map<string, string>;\n\t_toolPromptGuidelines: Map<string, string[]>;\n\t_allowedToolNames: Set<string> | undefined;\n\t_excludedToolNames: Set<string> | undefined;\n\t_baseSystemPrompt: string;\n\t_baseSystemPromptOptions: BuildSystemPromptOptions;\n\t_systemPromptOverride: string | undefined;\n\t_orientationPrompt: string | undefined;\n\t_preferenceCard: string | undefined;\n\t_capabilitySkillsFilter: ((skills: Skill[]) => Skill[]) | undefined;\n\t_bootstrapSkillsHandle: CapabilityPluginHandle | undefined;\n\t_cwd: string;\n\n\tgetActiveToolNames(): string[];\n\n\t// Tool registry delegates forwarding to agent-session-tools.ts\n\tgetAllTools(): ToolInfo[];\n\tgetToolDefinition(name: string): ToolDefinition | undefined;\n\tsetActiveToolsByName(toolNames: string[]): void;\n\t_rebuildSystemPrompt(toolNames: string[]): string;\n\t_refreshToolRegistry(options?: { activeToolNames?: string[]; includeAllExtensionTools?: boolean }): void;\n\t_syncCapabilityTools(): void;\n\t_getCapabilitySkills(): Skill[];\n\t_getAvailableSkills(): Skill[];\n\t_validateCapabilitySkillConflicts(): void;\n\t_refreshBootstrapSkills(): Promise<void>;\n\n\t// Read-only projections and delegates forwarding to agent-session-projection.ts\n\treadonly sessionFile: string | undefined;\n\treadonly messages: AgentMessage[];\n\treadonly systemPrompt: string;\n\treadonly promptTemplates: ReadonlyArray<PromptTemplate>;\n\treadonly pendingMessageCount: number;\n\tgetSessionStats(): SessionStats;\n\tgetContextUsage(): ContextUsage | undefined;\n\tgetUserMessagesForForking(): Array<{ entryId: string; text: string }>;\n\texportToHtml(outputPath?: string, options?: { themeName?: string }): Promise<string>;\n\texportToJsonl(outputPath?: string): string;\n\tgetLastAssistantText(): string | undefined;\n\n\t// Resource-discovery delegates forwarding to agent-session-extensions.ts\n\textendResourcesFromExtensions(reason: \"startup\" | \"reload\"): Promise<void>;\n\tbuildExtensionResourcePaths(entries: Array<{ path: string; extensionPath: string }>): Array<{\n\t\tpath: string;\n\t\tmetadata: { source: string; scope: \"temporary\"; origin: \"top-level\"; baseDir?: string };\n\t}>;\n\tgetExtensionSourceLabel(extensionPath: string): string;\n\n\t// Prompt/queue surface consumed by the extension binding closures\n\tsendCustomMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n\tsetSessionName(name: string): void;\n\tcompact(customInstructions?: string): Promise<CompactionResult | CompactionCancelledResult>;\n}\n"]}
1
+ {"version":3,"file":"agent-session-internal.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-internal.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared internal contract and snapshot helpers for the agent-session\n * submodules (agent-session-bash.ts, agent-session-compaction.ts,\n * agent-session-context.ts, agent-session-lifecycle.ts, agent-session-loop.ts,\n * agent-session-retry.ts, agent-session-tools.ts, agent-session-model.ts;\n * agent-session-runtime.ts consumes the class directly).\n *\n * `AgentSession` satisfies {@link AgentSessionInternals} structurally through a\n * single internal cast; members mirror the private state and helpers that moved\n * into the submodules. Same-name delegates stay on the class so call sites,\n * dynamic dispatch, and test spies keep working unchanged.\n */\n\nimport type {\n\tAgent,\n\tAgentContext,\n\tAgentEvent,\n\tAgentLoopTurnUpdate,\n\tAgentMessage,\n\tAgentTool,\n\tPrepareNextTurnContext,\n\tThinkingLevel,\n} from \"@agent-forge/agent-core\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tImageContent,\n\tModel,\n\tTextContent,\n\tToolResultMessage,\n} from \"@agent-forge/ai/compat\";\nimport type {\n\tAgentSessionEvent,\n\tModelCycleResult,\n\tModelMutationOptions,\n\tSessionStats,\n\tTurnAbortReason,\n} from \"./agent-session.ts\";\nimport type { CompactionCancelledResult } from \"./agent-session-compaction.ts\";\nimport type { LoopExecutor } from \"./agent-session-loop-runner.ts\";\nimport type { BashResult } from \"./bash-executor.ts\";\nimport type { CompactionResult } from \"./compaction/index.ts\";\nimport type { CapabilityPluginHandle, CapabilityRuntime, ContextOperationOptions } from \"./extensions/index.ts\";\nimport type { ModelStreamEventDataV1 } from \"./extensions/lifecycle-catalog.ts\";\nimport type { ContextUsage, ExecutionFactsV1 } from \"./extensions/public-api.ts\";\nimport type { HostLogger } from \"./logger.ts\";\nimport type { BashExecutionMessage, CustomMessage } from \"./messages.ts\";\nimport type { ModelRuntime } from \"./model-runtime.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport type { ResourceLoader } from \"./resource-loader.ts\";\nimport type { BranchSummaryEntry, SessionManager } from \"./session-manager.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\nimport type { BuildSystemPromptOptions } from \"./system-prompt.ts\";\nimport type { BashOperations } from \"./tools/bash.ts\";\nimport type { ToolDefinition, ToolInfo } from \"./tools/tool-definition.ts\";\n\n/** Registry entry for one tool definition with its source metadata. */\nexport interface ToolDefinitionEntry {\n\tdefinition: ToolDefinition;\n\tsourceInfo: SourceInfo;\n}\n\n/**\n * A session operation was cancelled by user intent (abort, reload barrier) — a\n * normal outcome, never a failure. Host boundaries resolve with structured\n * cancelled results instead of surfacing this as an error.\n */\nexport class SessionCancelledError extends Error {\n\treadonly reason: \"reload\" | \"signal\";\n\n\tconstructor(reason: SessionCancelledError[\"reason\"]) {\n\t\tsuper(`Session operation cancelled: ${reason}`);\n\t\tthis.name = \"SessionCancelledError\";\n\t\tthis.reason = reason;\n\t}\n}\n\n/**\n * Deep-clone a session value and freeze the clone so lifecycle payloads cannot\n * be mutated in place. The implementation lives on the public extension face\n * (`./extensions/public-api.ts`) so first-party and third-party plugins share\n * the same payload-projection contract; re-exported here for the host-internal\n * session submodules.\n */\nexport { detachedSessionSnapshot } from \"./extensions/public-api.ts\";\n\n/** JSON-safe clone for lifecycle payloads that must survive structured clone failures. */\nexport function jsonSafeSessionSnapshot<T>(value: T): T {\n\tconst serialized = JSON.stringify(value);\n\t// v8 ignore next -- 对象消息序列化永远返回字符串,undefined 分支不可达\n\treturn serialized === undefined ? (null as T) : (JSON.parse(serialized) as T);\n}\n\nexport interface AgentSessionInternals {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\treadonly _modelRuntime: ModelRuntime;\n\treadonly model: Model<Api> | undefined;\n\treadonly thinkingLevel: ThinkingLevel;\n\treadonly sessionId: string;\n\treadonly isStreaming: boolean;\n\t/** Idle gate for public context operations (compile-time private getter on AgentSession). */\n\treadonly isIdle: boolean;\n\n\t// Internal session state (compile-time private on AgentSession)\n\t_compactionQueue: Promise<void>;\n\t_compactionAbortController: AbortController | undefined;\n\t_autoCompactionAbortController: AbortController | undefined;\n\t_overflowRecoveryAttempted: boolean;\n\t/** 已完成的溢出裁剪级数(0 = 未裁剪);与 `_overflowRecoveryAttempted` 同点位复位。 */\n\t_overflowTrimStage: number;\n\t/**\n\t * microcompact 冷却(按模型请求计数,0 = 不冷却):relief 落地时置满,\n\t * 每次 assistant message_end 减 1(下限 0);冷却期内阈值 decide 以\n\t * `microcompactEnabled: false` 关闭便宜缓解(背景注释见 agent-session.ts)。\n\t */\n\t_microcompactCooldown: number;\n\t_activeCompactionPromise: Promise<unknown> | undefined;\n\t_branchSummaryAbortController: AbortController | undefined;\n\t_branchSummaryPromise: Promise<unknown> | undefined;\n\t_resolveBranchSummaryPromise: (() => void) | undefined;\n\t_reloadInProgress: boolean;\n\t_policyDecisionAbortController: AbortController | undefined;\n\t_retryAbortController: AbortController | undefined;\n\t_retryAttempt: number;\n\t_pendingRetryDecision:\n\t\t| { message: AssistantMessage; decision: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>> }\n\t\t| undefined;\n\t_isAgentRunActive: boolean;\n\t_currentRunAborted: boolean;\n\t_lastAbortReason: TurnAbortReason | undefined;\n\t_lastAssistantMessage: AssistantMessage | undefined;\n\n\t// Lifecycle dispatch state (compile-time private on AgentSession)\n\treadonly _modelStreamState: { streamId: string; sequence: number } | undefined;\n\t/** Correlation id for the active prompt run's lifecycle dispatches; written by the loop-runner via this facade. */\n\t_turnCorrelationId: string | undefined;\n\t_turnCorrelationCounter: number;\n\t/**\n\t * Host-process logger seam (会话轨迹第 2 期,设计 §5.2): one-line process log\n\t * beside lifecycle dispatches that report genuine failures (compaction\n\t * failed). Undefined when no hostLogger was configured; call sites treat it\n\t * as a no-op.\n\t */\n\treadonly _hostLogger?: HostLogger;\n\n\t// Bash execution state (compile-time private on AgentSession)\n\treadonly _bashAbortControllers: Set<AbortController>;\n\treadonly _activeBashPromises: Set<Promise<unknown>>;\n\t_bashEpoch: number;\n\t_pendingBashMessages: BashExecutionMessage[];\n\treadonly isDisposed: boolean;\n\n\t_capabilityRuntime: CapabilityRuntime | undefined;\n\t_compactionPolicyName: string;\n\t_overflowPolicyName: string;\n\t_branchSummaryPolicyName: string;\n\t_retryPolicyName: string;\n\t_runLoopStrategyName: string;\n\t/** Internal loop-executor seam (D-043 G3): set to replace the default prompt/continue drive. No public config; distinct from `_runLoopStrategyName` (a per-continuation veto policy). */\n\t_loopExecutor: LoopExecutor | undefined;\n\n\t// Helpers that remain on AgentSession\n\t_emit(event: AgentSessionEvent): void;\n\t_resolveIdleWaitIfIdle(): void;\n\t_flushPendingCustomMessages(): void;\n\t_emitAgentSettled(): Promise<void>;\n\t_observeLifecycleDeliveryError(error: unknown, extensionPath: string, event: string): void;\n\tabort(): Promise<void>;\n\t_abortInternal(): Promise<void>;\n\n\t// Context-transition state and delegates forwarding to agent-session-context.ts\n\t/** Generation fence for context projections that may outlive a runtime replacement. */\n\t_contextEpoch: number;\n\t_contextTransitionAbortController: AbortController;\n\t/** Serializes context transitions and lets reload/dispose drain them before teardown. */\n\t_activeContextTransition: Promise<unknown> | undefined;\n\t/** Monotonic revision for the public context snapshot/commit facade. */\n\t_contextRevision: number;\n\t/** Serializes public context commits so expectedRevision is a real CAS fence. */\n\t_contextCommitQueue: Promise<void>;\n\t/** Configured external context strategy name, written only by the constructor. */\n\treadonly _contextStrategyName: string | undefined;\n\t_requireContextStrategy(): { runtime: CapabilityRuntime; name: string };\n\t_requireIdleContextOperation(operation: string): void;\n\t_beginContextTransitionFence(): void;\n\t_isContextTransitionCurrent(epoch: number, allowReload: boolean): boolean;\n\t_assertContextTransitionCurrent(epoch: number, allowReload: boolean): void;\n\t_enqueueContextTransition<T>(\n\t\toperation: (epoch: number, signal: AbortSignal) => Promise<T>,\n\t\toptions?: { signal?: AbortSignal; allowReload?: boolean },\n\t): Promise<T>;\n\t_copyContextMessages(value: unknown, strategyName: string, direction: \"input\" | \"result\"): AgentMessage[];\n\t_applyContextTransition(\n\t\tmessages: AgentMessage[],\n\t\treason?: ContextOperationOptions[\"reason\"],\n\t\tsignal?: AbortSignal,\n\t\toptions?: { allowReload?: boolean },\n\t): Promise<AgentMessage[]>;\n\t_restoreContextTransition(\n\t\tsnapshot: unknown,\n\t\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\t\toptions?: { allowReload?: boolean },\n\t): Promise<AgentMessage[]>;\n\tsnapshotContext(): Promise<unknown>;\n\trestoreContext(snapshot: unknown): Promise<AgentMessage[]>;\n\treplaceContext(context: AgentMessage[]): Promise<AgentMessage[]>;\n\n\t// Model-scope state and delegates forwarding to agent-session-model.ts\n\t_scopedModels: Array<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>;\n\t/** Public scoped-models getter (Legacy 迁移 R1): submodules read via this instead of the private field. */\n\treadonly scopedModels: ReadonlyArray<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>;\n\tsetModel(model: Model<Api>, options?: ModelMutationOptions): Promise<void>;\n\tsetThinkingLevel(level: ThinkingLevel, options?: ModelMutationOptions): void;\n\t_emitModelSelect(\n\t\tnextModel: Model<Api>,\n\t\tpreviousModel: Model<Api> | undefined,\n\t\tsource: \"set\" | \"cycle\" | \"restore\",\n\t): Promise<void>;\n\t_addPersistedDefaultToNonEmptyScope(model: Model<Api>): void;\n\t_getThinkingLevelForModelSwitch(targetModel?: Model<Api>, explicitLevel?: ThinkingLevel): ThinkingLevel;\n\t_cycleScopedModel(\n\t\tdirection: \"forward\" | \"backward\",\n\t\toptions: ModelMutationOptions,\n\t): Promise<ModelCycleResult | undefined>;\n\t_cycleAvailableModel(\n\t\tdirection: \"forward\" | \"backward\",\n\t\toptions: ModelMutationOptions,\n\t): Promise<ModelCycleResult | undefined>;\n\n\t// Run-loop wiring state and delegates forwarding to agent-session-loop.ts\n\t/** The agent's construction-time prepare adapter, captured once by the loop wiring install. */\n\t_initialPrepareNextTurn:\n\t\t| ((\n\t\t\t\tcontext: PrepareNextTurnContext,\n\t\t\t\tsignal?: AbortSignal,\n\t\t ) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined)\n\t\t| undefined;\n\n\t// Delegates forwarding to the submodule functions\n\t_compactBeforeNextAssistantResponse(context: AgentContext, signal?: AbortSignal): Promise<AgentContext>;\n\t_enqueueCompaction<T>(operation: () => Promise<T>): Promise<T>;\n\t_compactInternal(customInstructions?: string): Promise<CompactionResult>;\n\t_checkCompaction(\n\t\tassistantMessage: AssistantMessage,\n\t\tskipAbortedCheck?: boolean,\n\t\tsignal?: AbortSignal,\n\t): Promise<boolean>;\n\t_runAutoCompaction(reason: \"overflow\" | \"threshold\", willRetry: boolean): Promise<boolean>;\n\t_willRetryAfterAgentEnd(event: Extract<AgentEvent, { type: \"agent_end\" }>, signal?: AbortSignal): Promise<boolean>;\n\t_isRetryableError(message: AssistantMessage, execution?: ExecutionFactsV1, signal?: AbortSignal): Promise<boolean>;\n\t_prepareRetry(\n\t\tmessage: AssistantMessage,\n\t\tprecomputedDecision?: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>>,\n\t): Promise<boolean>;\n\tnavigateTree(\n\t\ttargetId: string,\n\t\toptions?: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string },\n\t): Promise<{ editorText?: string; cancelled: boolean; aborted?: boolean; summaryEntry?: BranchSummaryEntry }>;\n\n\t// Lifecycle delegates forwarding to agent-session-lifecycle.ts\n\t_dispatchModelStreamLifecycle(\n\t\tmessage: AgentMessage,\n\t\teventName: ModelStreamEventDataV1[\"event\"],\n\t\tphase: ModelStreamEventDataV1[\"phase\"],\n\t): Promise<void>;\n\t_dispatchContextReplacedLifecycle(\n\t\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\t\tstrategyName?: string,\n\t): Promise<void>;\n\t_dispatchModelResponseLifecycle(message: AssistantMessage, entryId: string): Promise<void>;\n\t_dispatchToolCommitLifecycle(message: ToolResultMessage, entryId: string): Promise<void>;\n\t_dispatchToolResultLifecycle(message: ToolResultMessage, entryId: string): Promise<void>;\n\t_dispatchSessionReloadLifecycle(generation: number): Promise<void>;\n\n\t// Bash delegates forwarding to agent-session-bash.ts\n\tcaptureBashEpoch(): number;\n\tisBashEpochCurrent(epoch: number): boolean;\n\temitUserBash(excludeFromContext: boolean): void;\n\texecuteBash(\n\t\tcommand: string,\n\t\tonChunk?: (chunk: string) => void,\n\t\toptions?: { excludeFromContext?: boolean; id?: string; operations?: BashOperations },\n\t): Promise<BashResult>;\n\trecordBashResult(\n\t\tcommand: string,\n\t\tresult: BashResult,\n\t\toptions?: { excludeFromContext?: boolean; epoch?: number },\n\t): void;\n\tabortBash(): void;\n\t_flushPendingBashMessages(): void;\n\n\t// Tool registry state (compile-time private on AgentSession)\n\t_resourceLoader: ResourceLoader;\n\t_customTools: ToolDefinition[];\n\t_deferredToolPluginIds: ReadonlySet<string>;\n\t_baseToolDefinitions: Map<string, ToolDefinition>;\n\t_baseToolSources: Map<string, SourceInfo>;\n\t_toolRegistry: Map<string, AgentTool>;\n\t_toolDefinitions: Map<string, ToolDefinitionEntry>;\n\t_toolPromptSnippets: Map<string, string>;\n\t_toolPromptGuidelines: Map<string, string[]>;\n\t_allowedToolNames: Set<string> | undefined;\n\t_excludedToolNames: Set<string> | undefined;\n\t_baseSystemPrompt: string;\n\t_baseSystemPromptOptions: BuildSystemPromptOptions;\n\t_systemPromptOverride: string | undefined;\n\t_orientationPrompt: string | undefined;\n\t_preferenceCard: string | undefined;\n\t_capabilitySkillsFilter: ((skills: Skill[]) => Skill[]) | undefined;\n\t_bootstrapSkillsHandle: CapabilityPluginHandle | undefined;\n\t_cwd: string;\n\n\tgetActiveToolNames(): string[];\n\n\t// Tool registry delegates forwarding to agent-session-tools.ts\n\tgetAllTools(): ToolInfo[];\n\tgetToolDefinition(name: string): ToolDefinition | undefined;\n\tsetActiveToolsByName(toolNames: string[]): void;\n\t_rebuildSystemPrompt(toolNames: string[]): string;\n\t_refreshToolRegistry(options?: { activeToolNames?: string[]; includeAllExtensionTools?: boolean }): void;\n\t_syncCapabilityTools(): void;\n\t_getCapabilitySkills(): Skill[];\n\t_getAvailableSkills(): Skill[];\n\t_validateCapabilitySkillConflicts(): void;\n\t_refreshBootstrapSkills(): Promise<void>;\n\n\t// Read-only projections and delegates forwarding to agent-session-projection.ts\n\treadonly sessionFile: string | undefined;\n\treadonly messages: AgentMessage[];\n\treadonly systemPrompt: string;\n\treadonly promptTemplates: ReadonlyArray<PromptTemplate>;\n\treadonly pendingMessageCount: number;\n\tgetSessionStats(): SessionStats;\n\tgetContextUsage(): ContextUsage | undefined;\n\tgetUserMessagesForForking(): Array<{ entryId: string; text: string }>;\n\texportToHtml(outputPath?: string, options?: { themeName?: string }): Promise<string>;\n\texportToJsonl(outputPath?: string): string;\n\tgetLastAssistantText(): string | undefined;\n\n\t// Resource-discovery delegates forwarding to agent-session-extensions.ts\n\textendResourcesFromExtensions(reason: \"startup\" | \"reload\"): Promise<void>;\n\tbuildExtensionResourcePaths(entries: Array<{ path: string; extensionPath: string }>): Array<{\n\t\tpath: string;\n\t\tmetadata: { source: string; scope: \"temporary\"; origin: \"top-level\"; baseDir?: string };\n\t}>;\n\tgetExtensionSourceLabel(extensionPath: string): string;\n\n\t// Prompt/queue surface consumed by the extension binding closures\n\tsendCustomMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n\tsetSessionName(name: string): void;\n\tcompact(customInstructions?: string): Promise<CompactionResult | CompactionCancelledResult>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-internal.js","sourceRoot":"","sources":["../../src/core/agent-session-internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAqDH;;;;GAIG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACtC,MAAM,CAAsB;IAErC,YAAY,MAAuC,EAAE;QACpD,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAAA,CACrB;CACD;AAED;;;;;;GAMG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,0FAA0F;AAC1F,MAAM,UAAU,uBAAuB,CAAI,KAAQ,EAAK;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzC,2FAAmD;IACnD,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAE,IAAU,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAO,CAAC;AAAA,CAC9E","sourcesContent":["/**\n * Shared internal contract and snapshot helpers for the agent-session\n * submodules (agent-session-bash.ts, agent-session-compaction.ts,\n * agent-session-context.ts, agent-session-lifecycle.ts, agent-session-loop.ts,\n * agent-session-retry.ts, agent-session-tools.ts, agent-session-model.ts;\n * agent-session-runtime.ts consumes the class directly).\n *\n * `AgentSession` satisfies {@link AgentSessionInternals} structurally through a\n * single internal cast; members mirror the private state and helpers that moved\n * into the submodules. Same-name delegates stay on the class so call sites,\n * dynamic dispatch, and test spies keep working unchanged.\n */\n\nimport type {\n\tAgent,\n\tAgentContext,\n\tAgentEvent,\n\tAgentLoopTurnUpdate,\n\tAgentMessage,\n\tAgentTool,\n\tPrepareNextTurnContext,\n\tThinkingLevel,\n} from \"@agent-forge/agent-core\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tImageContent,\n\tModel,\n\tTextContent,\n\tToolResultMessage,\n} from \"@agent-forge/ai/compat\";\nimport type {\n\tAgentSessionEvent,\n\tModelCycleResult,\n\tModelMutationOptions,\n\tSessionStats,\n\tTurnAbortReason,\n} from \"./agent-session.ts\";\nimport type { CompactionCancelledResult } from \"./agent-session-compaction.ts\";\nimport type { LoopExecutor } from \"./agent-session-loop-runner.ts\";\nimport type { BashResult } from \"./bash-executor.ts\";\nimport type { CompactionResult } from \"./compaction/index.ts\";\nimport type { CapabilityPluginHandle, CapabilityRuntime, ContextOperationOptions } from \"./extensions/index.ts\";\nimport type { ModelStreamEventDataV1 } from \"./extensions/lifecycle-catalog.ts\";\nimport type { ContextUsage, ExecutionFactsV1 } from \"./extensions/public-api.ts\";\nimport type { HostLogger } from \"./logger.ts\";\nimport type { BashExecutionMessage, CustomMessage } from \"./messages.ts\";\nimport type { ModelRuntime } from \"./model-runtime.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport type { ResourceLoader } from \"./resource-loader.ts\";\nimport type { BranchSummaryEntry, SessionManager } from \"./session-manager.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\nimport type { BuildSystemPromptOptions } from \"./system-prompt.ts\";\nimport type { BashOperations } from \"./tools/bash.ts\";\nimport type { ToolDefinition, ToolInfo } from \"./tools/tool-definition.ts\";\n\n/** Registry entry for one tool definition with its source metadata. */\nexport interface ToolDefinitionEntry {\n\tdefinition: ToolDefinition;\n\tsourceInfo: SourceInfo;\n}\n\n/**\n * A session operation was cancelled by user intent (abort, reload barrier) — a\n * normal outcome, never a failure. Host boundaries resolve with structured\n * cancelled results instead of surfacing this as an error.\n */\nexport class SessionCancelledError extends Error {\n\treadonly reason: \"reload\" | \"signal\";\n\n\tconstructor(reason: SessionCancelledError[\"reason\"]) {\n\t\tsuper(`Session operation cancelled: ${reason}`);\n\t\tthis.name = \"SessionCancelledError\";\n\t\tthis.reason = reason;\n\t}\n}\n\n/**\n * Deep-clone a session value and freeze the clone so lifecycle payloads cannot\n * be mutated in place. The implementation lives on the public extension face\n * (`./extensions/public-api.ts`) so first-party and third-party plugins share\n * the same payload-projection contract; re-exported here for the host-internal\n * session submodules.\n */\nexport { detachedSessionSnapshot } from \"./extensions/public-api.ts\";\n\n/** JSON-safe clone for lifecycle payloads that must survive structured clone failures. */\nexport function jsonSafeSessionSnapshot<T>(value: T): T {\n\tconst serialized = JSON.stringify(value);\n\t// v8 ignore next -- 对象消息序列化永远返回字符串,undefined 分支不可达\n\treturn serialized === undefined ? (null as T) : (JSON.parse(serialized) as T);\n}\n\nexport interface AgentSessionInternals {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\treadonly _modelRuntime: ModelRuntime;\n\treadonly model: Model<Api> | undefined;\n\treadonly thinkingLevel: ThinkingLevel;\n\treadonly sessionId: string;\n\treadonly isStreaming: boolean;\n\t/** Idle gate for public context operations (compile-time private getter on AgentSession). */\n\treadonly isIdle: boolean;\n\n\t// Internal session state (compile-time private on AgentSession)\n\t_compactionQueue: Promise<void>;\n\t_compactionAbortController: AbortController | undefined;\n\t_autoCompactionAbortController: AbortController | undefined;\n\t_overflowRecoveryAttempted: boolean;\n\t/** 已完成的溢出裁剪级数(0 = 未裁剪);与 `_overflowRecoveryAttempted` 同点位复位。 */\n\t_overflowTrimStage: number;\n\t_activeCompactionPromise: Promise<unknown> | undefined;\n\t_branchSummaryAbortController: AbortController | undefined;\n\t_branchSummaryPromise: Promise<unknown> | undefined;\n\t_resolveBranchSummaryPromise: (() => void) | undefined;\n\t_reloadInProgress: boolean;\n\t_policyDecisionAbortController: AbortController | undefined;\n\t_retryAbortController: AbortController | undefined;\n\t_retryAttempt: number;\n\t_pendingRetryDecision:\n\t\t| { message: AssistantMessage; decision: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>> }\n\t\t| undefined;\n\t_isAgentRunActive: boolean;\n\t_currentRunAborted: boolean;\n\t_lastAbortReason: TurnAbortReason | undefined;\n\t_lastAssistantMessage: AssistantMessage | undefined;\n\n\t// Lifecycle dispatch state (compile-time private on AgentSession)\n\treadonly _modelStreamState: { streamId: string; sequence: number } | undefined;\n\t/** Correlation id for the active prompt run's lifecycle dispatches; written by the loop-runner via this facade. */\n\t_turnCorrelationId: string | undefined;\n\t_turnCorrelationCounter: number;\n\t/**\n\t * Host-process logger seam (会话轨迹第 2 期,设计 §5.2): one-line process log\n\t * beside lifecycle dispatches that report genuine failures (compaction\n\t * failed). Undefined when no hostLogger was configured; call sites treat it\n\t * as a no-op.\n\t */\n\treadonly _hostLogger?: HostLogger;\n\n\t// Bash execution state (compile-time private on AgentSession)\n\treadonly _bashAbortControllers: Set<AbortController>;\n\treadonly _activeBashPromises: Set<Promise<unknown>>;\n\t_bashEpoch: number;\n\t_pendingBashMessages: BashExecutionMessage[];\n\treadonly isDisposed: boolean;\n\n\t_capabilityRuntime: CapabilityRuntime | undefined;\n\t_compactionPolicyName: string;\n\t_overflowPolicyName: string;\n\t_branchSummaryPolicyName: string;\n\t_retryPolicyName: string;\n\t_runLoopStrategyName: string;\n\t/** Internal loop-executor seam (D-043 G3): set to replace the default prompt/continue drive. No public config; distinct from `_runLoopStrategyName` (a per-continuation veto policy). */\n\t_loopExecutor: LoopExecutor | undefined;\n\n\t// Helpers that remain on AgentSession\n\t_emit(event: AgentSessionEvent): void;\n\t_resolveIdleWaitIfIdle(): void;\n\t_flushPendingCustomMessages(): void;\n\t_emitAgentSettled(): Promise<void>;\n\t_observeLifecycleDeliveryError(error: unknown, extensionPath: string, event: string): void;\n\tabort(): Promise<void>;\n\t_abortInternal(): Promise<void>;\n\n\t// Context-transition state and delegates forwarding to agent-session-context.ts\n\t/** Generation fence for context projections that may outlive a runtime replacement. */\n\t_contextEpoch: number;\n\t_contextTransitionAbortController: AbortController;\n\t/** Serializes context transitions and lets reload/dispose drain them before teardown. */\n\t_activeContextTransition: Promise<unknown> | undefined;\n\t/** Monotonic revision for the public context snapshot/commit facade. */\n\t_contextRevision: number;\n\t/** Serializes public context commits so expectedRevision is a real CAS fence. */\n\t_contextCommitQueue: Promise<void>;\n\t/** Configured external context strategy name, written only by the constructor. */\n\treadonly _contextStrategyName: string | undefined;\n\t_requireContextStrategy(): { runtime: CapabilityRuntime; name: string };\n\t_requireIdleContextOperation(operation: string): void;\n\t_beginContextTransitionFence(): void;\n\t_isContextTransitionCurrent(epoch: number, allowReload: boolean): boolean;\n\t_assertContextTransitionCurrent(epoch: number, allowReload: boolean): void;\n\t_enqueueContextTransition<T>(\n\t\toperation: (epoch: number, signal: AbortSignal) => Promise<T>,\n\t\toptions?: { signal?: AbortSignal; allowReload?: boolean },\n\t): Promise<T>;\n\t_copyContextMessages(value: unknown, strategyName: string, direction: \"input\" | \"result\"): AgentMessage[];\n\t_applyContextTransition(\n\t\tmessages: AgentMessage[],\n\t\treason?: ContextOperationOptions[\"reason\"],\n\t\tsignal?: AbortSignal,\n\t\toptions?: { allowReload?: boolean },\n\t): Promise<AgentMessage[]>;\n\t_restoreContextTransition(\n\t\tsnapshot: unknown,\n\t\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\t\toptions?: { allowReload?: boolean },\n\t): Promise<AgentMessage[]>;\n\tsnapshotContext(): Promise<unknown>;\n\trestoreContext(snapshot: unknown): Promise<AgentMessage[]>;\n\treplaceContext(context: AgentMessage[]): Promise<AgentMessage[]>;\n\n\t// Model-scope state and delegates forwarding to agent-session-model.ts\n\t_scopedModels: Array<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>;\n\t/** Public scoped-models getter (Legacy 迁移 R1): submodules read via this instead of the private field. */\n\treadonly scopedModels: ReadonlyArray<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>;\n\tsetModel(model: Model<Api>, options?: ModelMutationOptions): Promise<void>;\n\tsetThinkingLevel(level: ThinkingLevel, options?: ModelMutationOptions): void;\n\t_emitModelSelect(\n\t\tnextModel: Model<Api>,\n\t\tpreviousModel: Model<Api> | undefined,\n\t\tsource: \"set\" | \"cycle\" | \"restore\",\n\t): Promise<void>;\n\t_addPersistedDefaultToNonEmptyScope(model: Model<Api>): void;\n\t_getThinkingLevelForModelSwitch(targetModel?: Model<Api>, explicitLevel?: ThinkingLevel): ThinkingLevel;\n\t_cycleScopedModel(\n\t\tdirection: \"forward\" | \"backward\",\n\t\toptions: ModelMutationOptions,\n\t): Promise<ModelCycleResult | undefined>;\n\t_cycleAvailableModel(\n\t\tdirection: \"forward\" | \"backward\",\n\t\toptions: ModelMutationOptions,\n\t): Promise<ModelCycleResult | undefined>;\n\n\t// Run-loop wiring state and delegates forwarding to agent-session-loop.ts\n\t/** The agent's construction-time prepare adapter, captured once by the loop wiring install. */\n\t_initialPrepareNextTurn:\n\t\t| ((\n\t\t\t\tcontext: PrepareNextTurnContext,\n\t\t\t\tsignal?: AbortSignal,\n\t\t ) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined)\n\t\t| undefined;\n\n\t// Delegates forwarding to the submodule functions\n\t_compactBeforeNextAssistantResponse(context: AgentContext, signal?: AbortSignal): Promise<AgentContext>;\n\t_enqueueCompaction<T>(operation: () => Promise<T>): Promise<T>;\n\t_compactInternal(customInstructions?: string): Promise<CompactionResult>;\n\t_checkCompaction(\n\t\tassistantMessage: AssistantMessage,\n\t\tskipAbortedCheck?: boolean,\n\t\tsignal?: AbortSignal,\n\t): Promise<boolean>;\n\t_runAutoCompaction(reason: \"overflow\" | \"threshold\", willRetry: boolean): Promise<boolean>;\n\t_willRetryAfterAgentEnd(event: Extract<AgentEvent, { type: \"agent_end\" }>, signal?: AbortSignal): Promise<boolean>;\n\t_isRetryableError(message: AssistantMessage, execution?: ExecutionFactsV1, signal?: AbortSignal): Promise<boolean>;\n\t_prepareRetry(\n\t\tmessage: AssistantMessage,\n\t\tprecomputedDecision?: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>>,\n\t): Promise<boolean>;\n\tnavigateTree(\n\t\ttargetId: string,\n\t\toptions?: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string },\n\t): Promise<{ editorText?: string; cancelled: boolean; aborted?: boolean; summaryEntry?: BranchSummaryEntry }>;\n\n\t// Lifecycle delegates forwarding to agent-session-lifecycle.ts\n\t_dispatchModelStreamLifecycle(\n\t\tmessage: AgentMessage,\n\t\teventName: ModelStreamEventDataV1[\"event\"],\n\t\tphase: ModelStreamEventDataV1[\"phase\"],\n\t): Promise<void>;\n\t_dispatchContextReplacedLifecycle(\n\t\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\t\tstrategyName?: string,\n\t): Promise<void>;\n\t_dispatchModelResponseLifecycle(message: AssistantMessage, entryId: string): Promise<void>;\n\t_dispatchToolCommitLifecycle(message: ToolResultMessage, entryId: string): Promise<void>;\n\t_dispatchToolResultLifecycle(message: ToolResultMessage, entryId: string): Promise<void>;\n\t_dispatchSessionReloadLifecycle(generation: number): Promise<void>;\n\n\t// Bash delegates forwarding to agent-session-bash.ts\n\tcaptureBashEpoch(): number;\n\tisBashEpochCurrent(epoch: number): boolean;\n\temitUserBash(excludeFromContext: boolean): void;\n\texecuteBash(\n\t\tcommand: string,\n\t\tonChunk?: (chunk: string) => void,\n\t\toptions?: { excludeFromContext?: boolean; id?: string; operations?: BashOperations },\n\t): Promise<BashResult>;\n\trecordBashResult(\n\t\tcommand: string,\n\t\tresult: BashResult,\n\t\toptions?: { excludeFromContext?: boolean; epoch?: number },\n\t): void;\n\tabortBash(): void;\n\t_flushPendingBashMessages(): void;\n\n\t// Tool registry state (compile-time private on AgentSession)\n\t_resourceLoader: ResourceLoader;\n\t_customTools: ToolDefinition[];\n\t_deferredToolPluginIds: ReadonlySet<string>;\n\t_baseToolDefinitions: Map<string, ToolDefinition>;\n\t_baseToolSources: Map<string, SourceInfo>;\n\t_toolRegistry: Map<string, AgentTool>;\n\t_toolDefinitions: Map<string, ToolDefinitionEntry>;\n\t_toolPromptSnippets: Map<string, string>;\n\t_toolPromptGuidelines: Map<string, string[]>;\n\t_allowedToolNames: Set<string> | undefined;\n\t_excludedToolNames: Set<string> | undefined;\n\t_baseSystemPrompt: string;\n\t_baseSystemPromptOptions: BuildSystemPromptOptions;\n\t_systemPromptOverride: string | undefined;\n\t_orientationPrompt: string | undefined;\n\t_preferenceCard: string | undefined;\n\t_capabilitySkillsFilter: ((skills: Skill[]) => Skill[]) | undefined;\n\t_bootstrapSkillsHandle: CapabilityPluginHandle | undefined;\n\t_cwd: string;\n\n\tgetActiveToolNames(): string[];\n\n\t// Tool registry delegates forwarding to agent-session-tools.ts\n\tgetAllTools(): ToolInfo[];\n\tgetToolDefinition(name: string): ToolDefinition | undefined;\n\tsetActiveToolsByName(toolNames: string[]): void;\n\t_rebuildSystemPrompt(toolNames: string[]): string;\n\t_refreshToolRegistry(options?: { activeToolNames?: string[]; includeAllExtensionTools?: boolean }): void;\n\t_syncCapabilityTools(): void;\n\t_getCapabilitySkills(): Skill[];\n\t_getAvailableSkills(): Skill[];\n\t_validateCapabilitySkillConflicts(): void;\n\t_refreshBootstrapSkills(): Promise<void>;\n\n\t// Read-only projections and delegates forwarding to agent-session-projection.ts\n\treadonly sessionFile: string | undefined;\n\treadonly messages: AgentMessage[];\n\treadonly systemPrompt: string;\n\treadonly promptTemplates: ReadonlyArray<PromptTemplate>;\n\treadonly pendingMessageCount: number;\n\tgetSessionStats(): SessionStats;\n\tgetContextUsage(): ContextUsage | undefined;\n\tgetUserMessagesForForking(): Array<{ entryId: string; text: string }>;\n\texportToHtml(outputPath?: string, options?: { themeName?: string }): Promise<string>;\n\texportToJsonl(outputPath?: string): string;\n\tgetLastAssistantText(): string | undefined;\n\n\t// Resource-discovery delegates forwarding to agent-session-extensions.ts\n\textendResourcesFromExtensions(reason: \"startup\" | \"reload\"): Promise<void>;\n\tbuildExtensionResourcePaths(entries: Array<{ path: string; extensionPath: string }>): Array<{\n\t\tpath: string;\n\t\tmetadata: { source: string; scope: \"temporary\"; origin: \"top-level\"; baseDir?: string };\n\t}>;\n\tgetExtensionSourceLabel(extensionPath: string): string;\n\n\t// Prompt/queue surface consumed by the extension binding closures\n\tsendCustomMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n\tsetSessionName(name: string): void;\n\tcompact(customInstructions?: string): Promise<CompactionResult | CompactionCancelledResult>;\n}\n"]}
1
+ {"version":3,"file":"agent-session-internal.js","sourceRoot":"","sources":["../../src/core/agent-session-internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAqDH;;;;GAIG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACtC,MAAM,CAAsB;IAErC,YAAY,MAAuC,EAAE;QACpD,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAAA,CACrB;CACD;AAED;;;;;;GAMG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,0FAA0F;AAC1F,MAAM,UAAU,uBAAuB,CAAI,KAAQ,EAAK;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzC,2FAAmD;IACnD,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAE,IAAU,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAO,CAAC;AAAA,CAC9E","sourcesContent":["/**\n * Shared internal contract and snapshot helpers for the agent-session\n * submodules (agent-session-bash.ts, agent-session-compaction.ts,\n * agent-session-context.ts, agent-session-lifecycle.ts, agent-session-loop.ts,\n * agent-session-retry.ts, agent-session-tools.ts, agent-session-model.ts;\n * agent-session-runtime.ts consumes the class directly).\n *\n * `AgentSession` satisfies {@link AgentSessionInternals} structurally through a\n * single internal cast; members mirror the private state and helpers that moved\n * into the submodules. Same-name delegates stay on the class so call sites,\n * dynamic dispatch, and test spies keep working unchanged.\n */\n\nimport type {\n\tAgent,\n\tAgentContext,\n\tAgentEvent,\n\tAgentLoopTurnUpdate,\n\tAgentMessage,\n\tAgentTool,\n\tPrepareNextTurnContext,\n\tThinkingLevel,\n} from \"@agent-forge/agent-core\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tImageContent,\n\tModel,\n\tTextContent,\n\tToolResultMessage,\n} from \"@agent-forge/ai/compat\";\nimport type {\n\tAgentSessionEvent,\n\tModelCycleResult,\n\tModelMutationOptions,\n\tSessionStats,\n\tTurnAbortReason,\n} from \"./agent-session.ts\";\nimport type { CompactionCancelledResult } from \"./agent-session-compaction.ts\";\nimport type { LoopExecutor } from \"./agent-session-loop-runner.ts\";\nimport type { BashResult } from \"./bash-executor.ts\";\nimport type { CompactionResult } from \"./compaction/index.ts\";\nimport type { CapabilityPluginHandle, CapabilityRuntime, ContextOperationOptions } from \"./extensions/index.ts\";\nimport type { ModelStreamEventDataV1 } from \"./extensions/lifecycle-catalog.ts\";\nimport type { ContextUsage, ExecutionFactsV1 } from \"./extensions/public-api.ts\";\nimport type { HostLogger } from \"./logger.ts\";\nimport type { BashExecutionMessage, CustomMessage } from \"./messages.ts\";\nimport type { ModelRuntime } from \"./model-runtime.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport type { ResourceLoader } from \"./resource-loader.ts\";\nimport type { BranchSummaryEntry, SessionManager } from \"./session-manager.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\nimport type { BuildSystemPromptOptions } from \"./system-prompt.ts\";\nimport type { BashOperations } from \"./tools/bash.ts\";\nimport type { ToolDefinition, ToolInfo } from \"./tools/tool-definition.ts\";\n\n/** Registry entry for one tool definition with its source metadata. */\nexport interface ToolDefinitionEntry {\n\tdefinition: ToolDefinition;\n\tsourceInfo: SourceInfo;\n}\n\n/**\n * A session operation was cancelled by user intent (abort, reload barrier) — a\n * normal outcome, never a failure. Host boundaries resolve with structured\n * cancelled results instead of surfacing this as an error.\n */\nexport class SessionCancelledError extends Error {\n\treadonly reason: \"reload\" | \"signal\";\n\n\tconstructor(reason: SessionCancelledError[\"reason\"]) {\n\t\tsuper(`Session operation cancelled: ${reason}`);\n\t\tthis.name = \"SessionCancelledError\";\n\t\tthis.reason = reason;\n\t}\n}\n\n/**\n * Deep-clone a session value and freeze the clone so lifecycle payloads cannot\n * be mutated in place. The implementation lives on the public extension face\n * (`./extensions/public-api.ts`) so first-party and third-party plugins share\n * the same payload-projection contract; re-exported here for the host-internal\n * session submodules.\n */\nexport { detachedSessionSnapshot } from \"./extensions/public-api.ts\";\n\n/** JSON-safe clone for lifecycle payloads that must survive structured clone failures. */\nexport function jsonSafeSessionSnapshot<T>(value: T): T {\n\tconst serialized = JSON.stringify(value);\n\t// v8 ignore next -- 对象消息序列化永远返回字符串,undefined 分支不可达\n\treturn serialized === undefined ? (null as T) : (JSON.parse(serialized) as T);\n}\n\nexport interface AgentSessionInternals {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\treadonly _modelRuntime: ModelRuntime;\n\treadonly model: Model<Api> | undefined;\n\treadonly thinkingLevel: ThinkingLevel;\n\treadonly sessionId: string;\n\treadonly isStreaming: boolean;\n\t/** Idle gate for public context operations (compile-time private getter on AgentSession). */\n\treadonly isIdle: boolean;\n\n\t// Internal session state (compile-time private on AgentSession)\n\t_compactionQueue: Promise<void>;\n\t_compactionAbortController: AbortController | undefined;\n\t_autoCompactionAbortController: AbortController | undefined;\n\t_overflowRecoveryAttempted: boolean;\n\t/** 已完成的溢出裁剪级数(0 = 未裁剪);与 `_overflowRecoveryAttempted` 同点位复位。 */\n\t_overflowTrimStage: number;\n\t/**\n\t * microcompact 冷却(按模型请求计数,0 = 不冷却):relief 落地时置满,\n\t * 每次 assistant message_end 减 1(下限 0);冷却期内阈值 decide 以\n\t * `microcompactEnabled: false` 关闭便宜缓解(背景注释见 agent-session.ts)。\n\t */\n\t_microcompactCooldown: number;\n\t_activeCompactionPromise: Promise<unknown> | undefined;\n\t_branchSummaryAbortController: AbortController | undefined;\n\t_branchSummaryPromise: Promise<unknown> | undefined;\n\t_resolveBranchSummaryPromise: (() => void) | undefined;\n\t_reloadInProgress: boolean;\n\t_policyDecisionAbortController: AbortController | undefined;\n\t_retryAbortController: AbortController | undefined;\n\t_retryAttempt: number;\n\t_pendingRetryDecision:\n\t\t| { message: AssistantMessage; decision: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>> }\n\t\t| undefined;\n\t_isAgentRunActive: boolean;\n\t_currentRunAborted: boolean;\n\t_lastAbortReason: TurnAbortReason | undefined;\n\t_lastAssistantMessage: AssistantMessage | undefined;\n\n\t// Lifecycle dispatch state (compile-time private on AgentSession)\n\treadonly _modelStreamState: { streamId: string; sequence: number } | undefined;\n\t/** Correlation id for the active prompt run's lifecycle dispatches; written by the loop-runner via this facade. */\n\t_turnCorrelationId: string | undefined;\n\t_turnCorrelationCounter: number;\n\t/**\n\t * Host-process logger seam (会话轨迹第 2 期,设计 §5.2): one-line process log\n\t * beside lifecycle dispatches that report genuine failures (compaction\n\t * failed). Undefined when no hostLogger was configured; call sites treat it\n\t * as a no-op.\n\t */\n\treadonly _hostLogger?: HostLogger;\n\n\t// Bash execution state (compile-time private on AgentSession)\n\treadonly _bashAbortControllers: Set<AbortController>;\n\treadonly _activeBashPromises: Set<Promise<unknown>>;\n\t_bashEpoch: number;\n\t_pendingBashMessages: BashExecutionMessage[];\n\treadonly isDisposed: boolean;\n\n\t_capabilityRuntime: CapabilityRuntime | undefined;\n\t_compactionPolicyName: string;\n\t_overflowPolicyName: string;\n\t_branchSummaryPolicyName: string;\n\t_retryPolicyName: string;\n\t_runLoopStrategyName: string;\n\t/** Internal loop-executor seam (D-043 G3): set to replace the default prompt/continue drive. No public config; distinct from `_runLoopStrategyName` (a per-continuation veto policy). */\n\t_loopExecutor: LoopExecutor | undefined;\n\n\t// Helpers that remain on AgentSession\n\t_emit(event: AgentSessionEvent): void;\n\t_resolveIdleWaitIfIdle(): void;\n\t_flushPendingCustomMessages(): void;\n\t_emitAgentSettled(): Promise<void>;\n\t_observeLifecycleDeliveryError(error: unknown, extensionPath: string, event: string): void;\n\tabort(): Promise<void>;\n\t_abortInternal(): Promise<void>;\n\n\t// Context-transition state and delegates forwarding to agent-session-context.ts\n\t/** Generation fence for context projections that may outlive a runtime replacement. */\n\t_contextEpoch: number;\n\t_contextTransitionAbortController: AbortController;\n\t/** Serializes context transitions and lets reload/dispose drain them before teardown. */\n\t_activeContextTransition: Promise<unknown> | undefined;\n\t/** Monotonic revision for the public context snapshot/commit facade. */\n\t_contextRevision: number;\n\t/** Serializes public context commits so expectedRevision is a real CAS fence. */\n\t_contextCommitQueue: Promise<void>;\n\t/** Configured external context strategy name, written only by the constructor. */\n\treadonly _contextStrategyName: string | undefined;\n\t_requireContextStrategy(): { runtime: CapabilityRuntime; name: string };\n\t_requireIdleContextOperation(operation: string): void;\n\t_beginContextTransitionFence(): void;\n\t_isContextTransitionCurrent(epoch: number, allowReload: boolean): boolean;\n\t_assertContextTransitionCurrent(epoch: number, allowReload: boolean): void;\n\t_enqueueContextTransition<T>(\n\t\toperation: (epoch: number, signal: AbortSignal) => Promise<T>,\n\t\toptions?: { signal?: AbortSignal; allowReload?: boolean },\n\t): Promise<T>;\n\t_copyContextMessages(value: unknown, strategyName: string, direction: \"input\" | \"result\"): AgentMessage[];\n\t_applyContextTransition(\n\t\tmessages: AgentMessage[],\n\t\treason?: ContextOperationOptions[\"reason\"],\n\t\tsignal?: AbortSignal,\n\t\toptions?: { allowReload?: boolean },\n\t): Promise<AgentMessage[]>;\n\t_restoreContextTransition(\n\t\tsnapshot: unknown,\n\t\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\t\toptions?: { allowReload?: boolean },\n\t): Promise<AgentMessage[]>;\n\tsnapshotContext(): Promise<unknown>;\n\trestoreContext(snapshot: unknown): Promise<AgentMessage[]>;\n\treplaceContext(context: AgentMessage[]): Promise<AgentMessage[]>;\n\n\t// Model-scope state and delegates forwarding to agent-session-model.ts\n\t_scopedModels: Array<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>;\n\t/** Public scoped-models getter (Legacy 迁移 R1): submodules read via this instead of the private field. */\n\treadonly scopedModels: ReadonlyArray<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>;\n\tsetModel(model: Model<Api>, options?: ModelMutationOptions): Promise<void>;\n\tsetThinkingLevel(level: ThinkingLevel, options?: ModelMutationOptions): void;\n\t_emitModelSelect(\n\t\tnextModel: Model<Api>,\n\t\tpreviousModel: Model<Api> | undefined,\n\t\tsource: \"set\" | \"cycle\" | \"restore\",\n\t): Promise<void>;\n\t_addPersistedDefaultToNonEmptyScope(model: Model<Api>): void;\n\t_getThinkingLevelForModelSwitch(targetModel?: Model<Api>, explicitLevel?: ThinkingLevel): ThinkingLevel;\n\t_cycleScopedModel(\n\t\tdirection: \"forward\" | \"backward\",\n\t\toptions: ModelMutationOptions,\n\t): Promise<ModelCycleResult | undefined>;\n\t_cycleAvailableModel(\n\t\tdirection: \"forward\" | \"backward\",\n\t\toptions: ModelMutationOptions,\n\t): Promise<ModelCycleResult | undefined>;\n\n\t// Run-loop wiring state and delegates forwarding to agent-session-loop.ts\n\t/** The agent's construction-time prepare adapter, captured once by the loop wiring install. */\n\t_initialPrepareNextTurn:\n\t\t| ((\n\t\t\t\tcontext: PrepareNextTurnContext,\n\t\t\t\tsignal?: AbortSignal,\n\t\t ) => Promise<AgentLoopTurnUpdate | undefined> | AgentLoopTurnUpdate | undefined)\n\t\t| undefined;\n\n\t// Delegates forwarding to the submodule functions\n\t_compactBeforeNextAssistantResponse(context: AgentContext, signal?: AbortSignal): Promise<AgentContext>;\n\t_enqueueCompaction<T>(operation: () => Promise<T>): Promise<T>;\n\t_compactInternal(customInstructions?: string): Promise<CompactionResult>;\n\t_checkCompaction(\n\t\tassistantMessage: AssistantMessage,\n\t\tskipAbortedCheck?: boolean,\n\t\tsignal?: AbortSignal,\n\t): Promise<boolean>;\n\t_runAutoCompaction(reason: \"overflow\" | \"threshold\", willRetry: boolean): Promise<boolean>;\n\t_willRetryAfterAgentEnd(event: Extract<AgentEvent, { type: \"agent_end\" }>, signal?: AbortSignal): Promise<boolean>;\n\t_isRetryableError(message: AssistantMessage, execution?: ExecutionFactsV1, signal?: AbortSignal): Promise<boolean>;\n\t_prepareRetry(\n\t\tmessage: AssistantMessage,\n\t\tprecomputedDecision?: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>>,\n\t): Promise<boolean>;\n\tnavigateTree(\n\t\ttargetId: string,\n\t\toptions?: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string },\n\t): Promise<{ editorText?: string; cancelled: boolean; aborted?: boolean; summaryEntry?: BranchSummaryEntry }>;\n\n\t// Lifecycle delegates forwarding to agent-session-lifecycle.ts\n\t_dispatchModelStreamLifecycle(\n\t\tmessage: AgentMessage,\n\t\teventName: ModelStreamEventDataV1[\"event\"],\n\t\tphase: ModelStreamEventDataV1[\"phase\"],\n\t): Promise<void>;\n\t_dispatchContextReplacedLifecycle(\n\t\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\t\tstrategyName?: string,\n\t): Promise<void>;\n\t_dispatchModelResponseLifecycle(message: AssistantMessage, entryId: string): Promise<void>;\n\t_dispatchToolCommitLifecycle(message: ToolResultMessage, entryId: string): Promise<void>;\n\t_dispatchToolResultLifecycle(message: ToolResultMessage, entryId: string): Promise<void>;\n\t_dispatchSessionReloadLifecycle(generation: number): Promise<void>;\n\n\t// Bash delegates forwarding to agent-session-bash.ts\n\tcaptureBashEpoch(): number;\n\tisBashEpochCurrent(epoch: number): boolean;\n\temitUserBash(excludeFromContext: boolean): void;\n\texecuteBash(\n\t\tcommand: string,\n\t\tonChunk?: (chunk: string) => void,\n\t\toptions?: { excludeFromContext?: boolean; id?: string; operations?: BashOperations },\n\t): Promise<BashResult>;\n\trecordBashResult(\n\t\tcommand: string,\n\t\tresult: BashResult,\n\t\toptions?: { excludeFromContext?: boolean; epoch?: number },\n\t): void;\n\tabortBash(): void;\n\t_flushPendingBashMessages(): void;\n\n\t// Tool registry state (compile-time private on AgentSession)\n\t_resourceLoader: ResourceLoader;\n\t_customTools: ToolDefinition[];\n\t_deferredToolPluginIds: ReadonlySet<string>;\n\t_baseToolDefinitions: Map<string, ToolDefinition>;\n\t_baseToolSources: Map<string, SourceInfo>;\n\t_toolRegistry: Map<string, AgentTool>;\n\t_toolDefinitions: Map<string, ToolDefinitionEntry>;\n\t_toolPromptSnippets: Map<string, string>;\n\t_toolPromptGuidelines: Map<string, string[]>;\n\t_allowedToolNames: Set<string> | undefined;\n\t_excludedToolNames: Set<string> | undefined;\n\t_baseSystemPrompt: string;\n\t_baseSystemPromptOptions: BuildSystemPromptOptions;\n\t_systemPromptOverride: string | undefined;\n\t_orientationPrompt: string | undefined;\n\t_preferenceCard: string | undefined;\n\t_capabilitySkillsFilter: ((skills: Skill[]) => Skill[]) | undefined;\n\t_bootstrapSkillsHandle: CapabilityPluginHandle | undefined;\n\t_cwd: string;\n\n\tgetActiveToolNames(): string[];\n\n\t// Tool registry delegates forwarding to agent-session-tools.ts\n\tgetAllTools(): ToolInfo[];\n\tgetToolDefinition(name: string): ToolDefinition | undefined;\n\tsetActiveToolsByName(toolNames: string[]): void;\n\t_rebuildSystemPrompt(toolNames: string[]): string;\n\t_refreshToolRegistry(options?: { activeToolNames?: string[]; includeAllExtensionTools?: boolean }): void;\n\t_syncCapabilityTools(): void;\n\t_getCapabilitySkills(): Skill[];\n\t_getAvailableSkills(): Skill[];\n\t_validateCapabilitySkillConflicts(): void;\n\t_refreshBootstrapSkills(): Promise<void>;\n\n\t// Read-only projections and delegates forwarding to agent-session-projection.ts\n\treadonly sessionFile: string | undefined;\n\treadonly messages: AgentMessage[];\n\treadonly systemPrompt: string;\n\treadonly promptTemplates: ReadonlyArray<PromptTemplate>;\n\treadonly pendingMessageCount: number;\n\tgetSessionStats(): SessionStats;\n\tgetContextUsage(): ContextUsage | undefined;\n\tgetUserMessagesForForking(): Array<{ entryId: string; text: string }>;\n\texportToHtml(outputPath?: string, options?: { themeName?: string }): Promise<string>;\n\texportToJsonl(outputPath?: string): string;\n\tgetLastAssistantText(): string | undefined;\n\n\t// Resource-discovery delegates forwarding to agent-session-extensions.ts\n\textendResourcesFromExtensions(reason: \"startup\" | \"reload\"): Promise<void>;\n\tbuildExtensionResourcePaths(entries: Array<{ path: string; extensionPath: string }>): Array<{\n\t\tpath: string;\n\t\tmetadata: { source: string; scope: \"temporary\"; origin: \"top-level\"; baseDir?: string };\n\t}>;\n\tgetExtensionSourceLabel(extensionPath: string): string;\n\n\t// Prompt/queue surface consumed by the extension binding closures\n\tsendCustomMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n\tsetSessionName(name: string): void;\n\tcompact(customInstructions?: string): Promise<CompactionResult | CompactionCancelledResult>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-runtime.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants, copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join, parse, resolve } from \"node:path\";\nimport type { ImageContent, TextContent } from \"@agent-forge/ai/compat\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { AgentSession } from \"./agent-session.ts\";\nimport type { AgentSessionRuntimeDiagnostic, AgentSessionServices } from \"./agent-session-services.ts\";\nimport type { AgentTaskChildProfileV1 } from \"./extensions/public-api.ts\";\nimport type { CustomMessage } from \"./messages.ts\";\nimport type { CreateAgentSessionResult, PluginRejection } from \"./sdk.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport type { SessionStartMetadata } from \"./session-start.ts\";\n\n/**\n * Result returned by runtime creation.\n *\n * The caller gets the created session, its cwd-bound services, and all\n * diagnostics collected during setup.\n */\n/**\n * Fresh session-bound context passed to `withSession()` callbacks on\n * `newSession()`, `fork()`, and `switchSession()`. It targets the replacement\n * session: every call routes into the session that became current after the\n * replacement committed.\n */\nexport interface ReplacedSessionContext {\n\tsendMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n}\n\nexport interface CreateAgentSessionRuntimeResult extends CreateAgentSessionResult {\n\tservices: AgentSessionServices;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n\t/**\n\t * 仅当工厂收到 `childProfile` 时存在:叶子会话的**可核验事实**(实际生效的工具面、\n\t * 模型、模式)。runner 侧 server 用它与请求档案比对后才允许任务起跑——\"要求了但\n\t * 没人能证明\"与\"没要求\"是同一风险。\n\t */\n\tchildFacts?: {\n\t\treadonly activeTools: readonly string[];\n\t\treadonly model?: {\n\t\t\treadonly provider: string;\n\t\t\treadonly id: string;\n\t\t\treadonly contextWindow: number;\n\t\t\treadonly maxTokens: number;\n\t\t\treadonly reasoning: boolean;\n\t\t};\n\t\treadonly capabilityMode: string;\n\t\t/** 叶子实际思考级别(档案请求了 thinkingLevel 时核验用)。 */\n\t\treadonly thinkingLevel?: string;\n\t\t/** 叶子实际生效的系统提示词追加段(档案请求了 systemPromptAppend 时核验用,已含方案 APPEND_SYSTEM.md 门控结果)。 */\n\t\treadonly systemPromptAppend?: string;\n\t};\n}\n\n/**\n * Creates a full runtime for a target cwd and session manager.\n *\n * The factory closes over process-global fixed inputs, recreates cwd-bound\n * services for the effective cwd, resolves session options against those\n * services, and finally creates the AgentSession.\n */\nexport type CreateAgentSessionRuntimeFactory = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartMetadata;\n\t/**\n\t * 子任务档案(AgentTaskChildProfileV1):pooled runner 的叶子会话按它收窄\n\t * (tools/mode/thinkingLevel)。父会话创建路径不传该字段——档案只服务子任务。\n\t */\n\tchildProfile?: AgentTaskChildProfileV1;\n\t/**\n\t * 子代理通信面的宿主接线(D-060 S5 pooled parity):runner 叶子装配注入\n\t * post/drainInbox 闭包(身份绑定到叶子会话),叶子会话由此获得\n\t * escalate/兄弟消息工具。父会话创建路径不传该字段。\n\t */\n\tsubagentCommunicationWiring?: import(\"./sdk.ts\").CreateAgentSessionOptions[\"subagentCommunicationWiring\"];\n\t/**\n\t * 档案 model 的目标 id(D-060 pooled parity 补口):runner 侧把叶子会话模型\n\t * 解析到**自己的 scoped models**(档案不能把会话带到 runner 未授权的模型上),\n\t * 解析不到即失败并列出可用 id。父会话创建路径不传该字段。\n\t */\n\tchildModelId?: string;\n}) => Promise<CreateAgentSessionRuntimeResult>;\n\n/**\n * Thrown when /import references a JSONL file path that does not exist.\n */\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\n/** Maps suite assembly findings onto the runtime diagnostic channel as info. */\nfunction toSuiteRuntimeDiagnostics(suiteDiagnostics: readonly string[]): AgentSessionRuntimeDiagnostic[] {\n\treturn suiteDiagnostics.map((message) => ({ type: \"info\" as const, message }));\n}\n\n/**\n * Owns the current AgentSession plus its cwd-bound services.\n *\n * Session replacement methods tear down the current runtime first, then create\n * and apply the next runtime. If creation fails, the error is propagated to the\n * caller. The caller is responsible for user-facing error handling.\n */\nexport class AgentSessionRuntime {\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\tprivate _session: AgentSession;\n\tprivate _services: AgentSessionServices;\n\tprivate readonly createRuntime: CreateAgentSessionRuntimeFactory;\n\tprivate _diagnostics: AgentSessionRuntimeDiagnostic[];\n\tprivate _suiteDiagnostics: readonly string[];\n\tprivate _modelFallbackMessage?: string;\n\tprivate _pluginRejections: readonly PluginRejection[];\n\n\tconstructor(\n\t\t_session: AgentSession,\n\t\t_services: AgentSessionServices,\n\t\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\t\t_diagnostics: AgentSessionRuntimeDiagnostic[] = [],\n\t\t_modelFallbackMessage?: string,\n\t\t_pluginRejections: readonly PluginRejection[] = [],\n\t\t_suiteDiagnostics: readonly string[] = [],\n\t) {\n\t\tthis._session = _session;\n\t\tthis._services = _services;\n\t\tthis.createRuntime = createRuntime;\n\t\tthis._diagnostics = _diagnostics;\n\t\tthis._suiteDiagnostics = _suiteDiagnostics;\n\t\tthis._modelFallbackMessage = _modelFallbackMessage;\n\t\tthis._pluginRejections = _pluginRejections;\n\t}\n\n\tget services(): AgentSessionServices {\n\t\treturn this._services;\n\t}\n\n\t/** /metrics 数据源共享 ref(observability 插件门面,空 = 未挂载)。 */\n\tget observabilityGetMetricsRef(): AgentSessionServices[\"observabilityGetMetricsRef\"] {\n\t\treturn this._services.observabilityGetMetricsRef;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this._session;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services.cwd;\n\t}\n\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn [...this._diagnostics, ...toSuiteRuntimeDiagnostics(this._suiteDiagnostics)];\n\t}\n\n\t/**\n\t * Suite assembly findings from the last runtime creation (initial,\n\t * /new, /fork, /switch). Surfaced as info-level entries on the\n\t * `diagnostics` channel.\n\t */\n\tget suiteDiagnostics(): readonly string[] {\n\t\treturn this._suiteDiagnostics;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget pluginRejections(): readonly PluginRejection[] {\n\t\treturn this._pluginRejections;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\t/**\n\t * Set a synchronous callback that runs after `session_shutdown` handlers finish\n\t * but before the current session is invalidated.\n\t *\n\t * This is for host-owned UI teardown that must not yield to the event loop,\n\t * such as detaching extension-provided TUI components before the old extension\n\t * context becomes stale.\n\t */\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async teardownCurrent(_reason: \"new\" | \"resume\" | \"fork\", _targetSessionFile?: string): Promise<void> {\n\t\t// Settle any active response first so the aborted turn (including tool\n\t\t// results) is persisted to the outgoing session before it is replaced.\n\t\t// Internal teardown aborts deliberately skip the interruption marker.\n\t\tawait this.session._abortInternal();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n\n\tprivate apply(result: CreateAgentSessionRuntimeResult): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._suiteDiagnostics = result.suiteDiagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t\tthis._pluginRejections = result.pluginRejections;\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionManager = SessionManager.open(sessionPath, undefined, options?.cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tconst sessionManager = this.session.sessionManager.isPersisted()\n\t\t\t? SessionManager.create(this.cwd, sessionDir)\n\t\t\t: SessionManager.inMemory(this.cwd);\n\t\tif (options?.parentSession) {\n\t\t\tsessionManager.newSession({ parentSession: options.parentSession });\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"new\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.sessionManager);\n\t\t\tconst context = this.session.sessionManager.buildSessionContext().messages;\n\t\t\tif (this.session.contextStrategyName) {\n\t\t\t\tawait this.session.replaceContext(context);\n\t\t\t} else {\n\t\t\t\tthis.session.agent.state.messages = context;\n\t\t\t}\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.sessionManager.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (this.session.sessionManager.isPersisted()) {\n\t\t\tconst currentSessionFile = this.session.sessionFile;\n\t\t\tif (!currentSessionFile) {\n\t\t\t\tthrow new Error(\"Persisted session is missing a session file\");\n\t\t\t}\n\t\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\t\tif (!targetLeafId) {\n\t\t\t\tconst sessionManager = SessionManager.create(this.cwd, sessionDir);\n\t\t\t\tsessionManager.newSession({ parentSession: currentSessionFile });\n\t\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\t\tthis.apply(\n\t\t\t\t\tawait this.createRuntime({\n\t\t\t\t\t\tcwd: this.cwd,\n\t\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\t\tsessionManager,\n\t\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\t\treturn { cancelled: false, selectedText };\n\t\t\t}\n\n\t\t\tif (!existsSync(currentSessionFile)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"This session has not been saved yet. Wait for the first assistant response before cloning or forking it.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst sessionManager = SessionManager.open(currentSessionFile, sessionDir);\n\t\t\tconst forkedSessionPath = sessionManager.createBranchedSession(targetLeafId);\n\t\t\tif (!forkedSessionPath) {\n\t\t\t\tthrow new Error(\"Failed to create forked session\");\n\t\t\t}\n\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\tthis.apply(\n\t\t\t\tawait this.createRuntime({\n\t\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t}),\n\t\t\t);\n\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\treturn { cancelled: false, selectedText };\n\t\t}\n\n\t\tconst sessionManager = this.session.sessionManager;\n\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\tif (!targetLeafId) {\n\t\t\tsessionManager.newSession({ parentSession: previousSessionFile });\n\t\t} else {\n\t\t\tsessionManager.createBranchedSession(targetLeafId);\n\t\t}\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\t/**\n\t * Import a session JSONL file and switch runtime state to the imported session.\n\t *\n\t * @throws {SessionImportFileNotFoundError} When the input path does not exist.\n\t * @throws {MissingSessionCwdError} When the imported session cwd cannot be resolved and no override is provided.\n\t */\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolvePath(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\n\t\tlet destinationPath = join(sessionDir, basename(resolvedPath));\n\t\tconst sourceAlreadyStored = resolve(destinationPath) === resolvedPath;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tconst { name, ext } = parse(destinationPath);\n\t\t\tlet suffix = 1;\n\t\t\twhile (existsSync(destinationPath)) {\n\t\t\t\tdestinationPath = join(sessionDir, `${name}-${suffix++}${ext}`);\n\t\t\t}\n\t\t}\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tcopyFileSync(resolvedPath, destinationPath, constants.COPYFILE_EXCL);\n\t\t}\n\n\t\tconst sessionManager = SessionManager.open(destinationPath, sessionDir, cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n}\n\n/**\n * Create the initial runtime from a runtime factory and initial session target.\n *\n * The same factory is stored on the returned AgentSessionRuntime and reused for\n * later /new, /resume, /fork, and import flows.\n */\nexport async function createAgentSessionRuntime(\n\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\toptions: {\n\t\tcwd: string;\n\t\tagentDir: string;\n\t\tsessionManager: SessionManager;\n\t\tsessionStartEvent?: SessionStartMetadata;\n\t},\n): Promise<AgentSessionRuntime> {\n\tassertSessionCwdExists(options.sessionManager, options.cwd);\n\tconst result = await createRuntime(options);\n\treturn new AgentSessionRuntime(\n\t\tresult.session,\n\t\tresult.services,\n\t\tcreateRuntime,\n\t\tresult.diagnostics,\n\t\tresult.modelFallbackMessage,\n\t\tresult.pluginRejections,\n\t\tresult.suiteDiagnostics,\n\t);\n}\n\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.ts\";\n"]}
1
+ {"version":3,"file":"agent-session-runtime.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants, copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join, parse, resolve } from \"node:path\";\nimport type { ImageContent, TextContent } from \"@agent-forge/ai/compat\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { AgentSession } from \"./agent-session.ts\";\nimport type { AgentSessionRuntimeDiagnostic, AgentSessionServices } from \"./agent-session-services.ts\";\nimport type { AgentTaskChildProfileV1 } from \"./extensions/public-api.ts\";\nimport type { CustomMessage } from \"./messages.ts\";\nimport type { CreateAgentSessionResult, PluginRejection } from \"./sdk.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport type { SessionStartMetadata } from \"./session-start.ts\";\n\n/**\n * Result returned by runtime creation.\n *\n * The caller gets the created session, its cwd-bound services, and all\n * diagnostics collected during setup.\n */\n/**\n * Fresh session-bound context passed to `withSession()` callbacks on\n * `newSession()`, `fork()`, and `switchSession()`. It targets the replacement\n * session: every call routes into the session that became current after the\n * replacement committed.\n */\nexport interface ReplacedSessionContext {\n\tsendMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n}\n\nexport interface CreateAgentSessionRuntimeResult extends CreateAgentSessionResult {\n\tservices: AgentSessionServices;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n\t/**\n\t * 仅当工厂收到 `childProfile` 时存在:叶子会话的**可核验事实**(实际生效的工具面、\n\t * 模型、模式)。runner 侧 server 用它与请求档案比对后才允许任务起跑——\"要求了但\n\t * 没人能证明\"与\"没要求\"是同一风险。\n\t */\n\tchildFacts?: {\n\t\treadonly activeTools: readonly string[];\n\t\treadonly model?: {\n\t\t\treadonly provider: string;\n\t\t\treadonly id: string;\n\t\t\treadonly contextWindow: number;\n\t\t\treadonly maxTokens: number;\n\t\t\treadonly reasoning: boolean;\n\t\t};\n\t\treadonly capabilityMode: string;\n\t\t/** 叶子实际思考级别(档案请求了 thinkingLevel 时核验用)。 */\n\t\treadonly thinkingLevel?: string;\n\t\t/** 叶子实际生效的系统提示词追加段(档案请求了 systemPromptAppend 时核验用,已含方案 APPEND_SYSTEM.md 门控结果)。 */\n\t\treadonly systemPromptAppend?: string;\n\t};\n}\n\n/**\n * Creates a full runtime for a target cwd and session manager.\n *\n * The factory closes over process-global fixed inputs, recreates cwd-bound\n * services for the effective cwd, resolves session options against those\n * services, and finally creates the AgentSession.\n */\nexport type CreateAgentSessionRuntimeFactory = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartMetadata;\n\t/**\n\t * 子任务档案(AgentTaskChildProfileV1):pooled runner 的叶子会话按它收窄\n\t * (tools/mode/thinkingLevel)。父会话创建路径不传该字段——档案只服务子任务。\n\t */\n\tchildProfile?: AgentTaskChildProfileV1;\n\t/**\n\t * 子代理通信面的宿主接线(D-060 S5 pooled parity):runner 叶子装配注入\n\t * post/drainInbox 闭包(身份绑定到叶子会话),叶子会话由此获得\n\t * escalate/兄弟消息工具。父会话创建路径不传该字段。\n\t */\n\tsubagentCommunicationWiring?: import(\"./sdk.ts\").CreateAgentSessionOptions[\"subagentCommunicationWiring\"];\n\t/**\n\t * 档案 model 的目标 id(D-060 pooled parity 补口):runner 侧把叶子会话模型\n\t * 解析到**自己的 scoped models**(档案不能把会话带到 runner 未授权的模型上),\n\t * 解析不到即失败并列出可用 id。父会话创建路径不传该字段。\n\t */\n\tchildModelId?: string;\n}) => Promise<CreateAgentSessionRuntimeResult>;\n\n/**\n * Thrown when /import references a JSONL file path that does not exist.\n */\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\n/** Maps suite assembly findings onto the runtime diagnostic channel as info. */\nfunction toSuiteRuntimeDiagnostics(suiteDiagnostics: readonly string[]): AgentSessionRuntimeDiagnostic[] {\n\treturn suiteDiagnostics.map((message) => ({ type: \"info\" as const, message }));\n}\n\n/**\n * Owns the current AgentSession plus its cwd-bound services.\n *\n * Session replacement methods tear down the current runtime first, then create\n * and apply the next runtime. If creation fails, the error is propagated to the\n * caller. The caller is responsible for user-facing error handling.\n */\nexport class AgentSessionRuntime {\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\tprivate _session: AgentSession;\n\tprivate _services: AgentSessionServices;\n\tprivate readonly createRuntime: CreateAgentSessionRuntimeFactory;\n\tprivate _diagnostics: AgentSessionRuntimeDiagnostic[];\n\tprivate _suiteDiagnostics: readonly string[];\n\tprivate _modelFallbackMessage?: string;\n\tprivate _pluginRejections: readonly PluginRejection[];\n\n\tconstructor(\n\t\t_session: AgentSession,\n\t\t_services: AgentSessionServices,\n\t\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\t\t_diagnostics: AgentSessionRuntimeDiagnostic[] = [],\n\t\t_modelFallbackMessage?: string,\n\t\t_pluginRejections: readonly PluginRejection[] = [],\n\t\t_suiteDiagnostics: readonly string[] = [],\n\t) {\n\t\tthis._session = _session;\n\t\tthis._services = _services;\n\t\tthis.createRuntime = createRuntime;\n\t\tthis._diagnostics = _diagnostics;\n\t\tthis._suiteDiagnostics = _suiteDiagnostics;\n\t\tthis._modelFallbackMessage = _modelFallbackMessage;\n\t\tthis._pluginRejections = _pluginRejections;\n\t}\n\n\tget services(): AgentSessionServices {\n\t\treturn this._services;\n\t}\n\n\t/** /metrics 数据源共享 ref(observability 插件门面,空 = 未挂载)。 */\n\tget observabilityGetMetricsRef(): AgentSessionServices[\"observabilityGetMetricsRef\"] {\n\t\treturn this._services.observabilityGetMetricsRef;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this._session;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services.cwd;\n\t}\n\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn [...this._diagnostics, ...toSuiteRuntimeDiagnostics(this._suiteDiagnostics)];\n\t}\n\n\t/**\n\t * Suite assembly findings from the last runtime creation (initial,\n\t * /new, /fork, /switch). Surfaced as info-level entries on the\n\t * `diagnostics` channel.\n\t */\n\tget suiteDiagnostics(): readonly string[] {\n\t\treturn this._suiteDiagnostics;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget pluginRejections(): readonly PluginRejection[] {\n\t\treturn this._pluginRejections;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\t/**\n\t * Set a synchronous callback that runs after `session_shutdown` handlers finish\n\t * but before the current session is invalidated.\n\t *\n\t * This is for host-owned UI teardown that must not yield to the event loop,\n\t * such as detaching extension-provided TUI components before the old extension\n\t * context becomes stale.\n\t */\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async teardownCurrent(_reason: \"new\" | \"resume\" | \"fork\", _targetSessionFile?: string): Promise<void> {\n\t\t// Settle any active response first so the aborted turn (including tool\n\t\t// results) is persisted to the outgoing session before it is replaced.\n\t\t// Internal teardown aborts deliberately skip the interruption marker.\n\t\tawait this.session._abortInternal();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n\n\tprivate apply(result: CreateAgentSessionRuntimeResult): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._suiteDiagnostics = result.suiteDiagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t\tthis._pluginRejections = result.pluginRejections;\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionManager = SessionManager.open(sessionPath, undefined, options?.cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tconst sessionManager = this.session.sessionManager.isPersisted()\n\t\t\t? SessionManager.create(this.cwd, sessionDir)\n\t\t\t: SessionManager.inMemory(this.cwd);\n\t\tif (options?.parentSession) {\n\t\t\tsessionManager.newSession({ parentSession: options.parentSession });\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"new\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.sessionManager);\n\t\t\tconst context = this.session.sessionManager.buildSessionContext().messages;\n\t\t\tif (this.session.contextStrategyName) {\n\t\t\t\tawait this.session.replaceContext(context);\n\t\t\t} else {\n\t\t\t\tthis.session.agent.state.messages = context;\n\t\t\t}\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.sessionManager.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (this.session.sessionManager.isPersisted()) {\n\t\t\tconst currentSessionFile = this.session.sessionFile;\n\t\t\tif (!currentSessionFile) {\n\t\t\t\tthrow new Error(\"Persisted session is missing a session file\");\n\t\t\t}\n\t\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\t\tif (!targetLeafId) {\n\t\t\t\tconst sessionManager = SessionManager.create(this.cwd, sessionDir);\n\t\t\t\tsessionManager.newSession({ parentSession: currentSessionFile });\n\t\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\t\tthis.apply(\n\t\t\t\t\tawait this.createRuntime({\n\t\t\t\t\t\tcwd: this.cwd,\n\t\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\t\tsessionManager,\n\t\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\t\treturn { cancelled: false, selectedText };\n\t\t\t}\n\n\t\t\tif (!existsSync(currentSessionFile)) {\n\t\t\t\tthrow new Error(\"This session has not been saved yet. Send a message before cloning or forking it.\");\n\t\t\t}\n\t\t\tconst sessionManager = SessionManager.open(currentSessionFile, sessionDir);\n\t\t\tconst forkedSessionPath = sessionManager.createBranchedSession(targetLeafId);\n\t\t\tif (!forkedSessionPath) {\n\t\t\t\tthrow new Error(\"Failed to create forked session\");\n\t\t\t}\n\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\tthis.apply(\n\t\t\t\tawait this.createRuntime({\n\t\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t}),\n\t\t\t);\n\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\treturn { cancelled: false, selectedText };\n\t\t}\n\n\t\tconst sessionManager = this.session.sessionManager;\n\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\tif (!targetLeafId) {\n\t\t\tsessionManager.newSession({ parentSession: previousSessionFile });\n\t\t} else {\n\t\t\tsessionManager.createBranchedSession(targetLeafId);\n\t\t}\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\t/**\n\t * Import a session JSONL file and switch runtime state to the imported session.\n\t *\n\t * @throws {SessionImportFileNotFoundError} When the input path does not exist.\n\t * @throws {MissingSessionCwdError} When the imported session cwd cannot be resolved and no override is provided.\n\t */\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolvePath(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\n\t\tlet destinationPath = join(sessionDir, basename(resolvedPath));\n\t\tconst sourceAlreadyStored = resolve(destinationPath) === resolvedPath;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tconst { name, ext } = parse(destinationPath);\n\t\t\tlet suffix = 1;\n\t\t\twhile (existsSync(destinationPath)) {\n\t\t\t\tdestinationPath = join(sessionDir, `${name}-${suffix++}${ext}`);\n\t\t\t}\n\t\t}\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tcopyFileSync(resolvedPath, destinationPath, constants.COPYFILE_EXCL);\n\t\t}\n\n\t\tconst sessionManager = SessionManager.open(destinationPath, sessionDir, cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n}\n\n/**\n * Create the initial runtime from a runtime factory and initial session target.\n *\n * The same factory is stored on the returned AgentSessionRuntime and reused for\n * later /new, /resume, /fork, and import flows.\n */\nexport async function createAgentSessionRuntime(\n\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\toptions: {\n\t\tcwd: string;\n\t\tagentDir: string;\n\t\tsessionManager: SessionManager;\n\t\tsessionStartEvent?: SessionStartMetadata;\n\t},\n): Promise<AgentSessionRuntime> {\n\tassertSessionCwdExists(options.sessionManager, options.cwd);\n\tconst result = await createRuntime(options);\n\treturn new AgentSessionRuntime(\n\t\tresult.session,\n\t\tresult.services,\n\t\tcreateRuntime,\n\t\tresult.diagnostics,\n\t\tresult.modelFallbackMessage,\n\t\tresult.pluginRejections,\n\t\tresult.suiteDiagnostics,\n\t);\n}\n\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.ts\";\n"]}
@@ -203,7 +203,7 @@ export class AgentSessionRuntime {
203
203
  return { cancelled: false, selectedText };
204
204
  }
205
205
  if (!existsSync(currentSessionFile)) {
206
- throw new Error("This session has not been saved yet. Wait for the first assistant response before cloning or forking it.");
206
+ throw new Error("This session has not been saved yet. Send a message before cloning or forking it.");
207
207
  }
208
208
  const sessionManager = SessionManager.open(currentSessionFile, sessionDir);
209
209
  const forkedSessionPath = sessionManager.createBranchedSession(targetLeafId);
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-runtime.js","sourceRoot":"","sources":["../../src/core/agent-session-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants, copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join, parse, resolve } from \"node:path\";\nimport type { ImageContent, TextContent } from \"@agent-forge/ai/compat\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { AgentSession } from \"./agent-session.ts\";\nimport type { AgentSessionRuntimeDiagnostic, AgentSessionServices } from \"./agent-session-services.ts\";\nimport type { AgentTaskChildProfileV1 } from \"./extensions/public-api.ts\";\nimport type { CustomMessage } from \"./messages.ts\";\nimport type { CreateAgentSessionResult, PluginRejection } from \"./sdk.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport type { SessionStartMetadata } from \"./session-start.ts\";\n\n/**\n * Result returned by runtime creation.\n *\n * The caller gets the created session, its cwd-bound services, and all\n * diagnostics collected during setup.\n */\n/**\n * Fresh session-bound context passed to `withSession()` callbacks on\n * `newSession()`, `fork()`, and `switchSession()`. It targets the replacement\n * session: every call routes into the session that became current after the\n * replacement committed.\n */\nexport interface ReplacedSessionContext {\n\tsendMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n}\n\nexport interface CreateAgentSessionRuntimeResult extends CreateAgentSessionResult {\n\tservices: AgentSessionServices;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n\t/**\n\t * 仅当工厂收到 `childProfile` 时存在:叶子会话的**可核验事实**(实际生效的工具面、\n\t * 模型、模式)。runner 侧 server 用它与请求档案比对后才允许任务起跑——\"要求了但\n\t * 没人能证明\"与\"没要求\"是同一风险。\n\t */\n\tchildFacts?: {\n\t\treadonly activeTools: readonly string[];\n\t\treadonly model?: {\n\t\t\treadonly provider: string;\n\t\t\treadonly id: string;\n\t\t\treadonly contextWindow: number;\n\t\t\treadonly maxTokens: number;\n\t\t\treadonly reasoning: boolean;\n\t\t};\n\t\treadonly capabilityMode: string;\n\t\t/** 叶子实际思考级别(档案请求了 thinkingLevel 时核验用)。 */\n\t\treadonly thinkingLevel?: string;\n\t\t/** 叶子实际生效的系统提示词追加段(档案请求了 systemPromptAppend 时核验用,已含方案 APPEND_SYSTEM.md 门控结果)。 */\n\t\treadonly systemPromptAppend?: string;\n\t};\n}\n\n/**\n * Creates a full runtime for a target cwd and session manager.\n *\n * The factory closes over process-global fixed inputs, recreates cwd-bound\n * services for the effective cwd, resolves session options against those\n * services, and finally creates the AgentSession.\n */\nexport type CreateAgentSessionRuntimeFactory = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartMetadata;\n\t/**\n\t * 子任务档案(AgentTaskChildProfileV1):pooled runner 的叶子会话按它收窄\n\t * (tools/mode/thinkingLevel)。父会话创建路径不传该字段——档案只服务子任务。\n\t */\n\tchildProfile?: AgentTaskChildProfileV1;\n\t/**\n\t * 子代理通信面的宿主接线(D-060 S5 pooled parity):runner 叶子装配注入\n\t * post/drainInbox 闭包(身份绑定到叶子会话),叶子会话由此获得\n\t * escalate/兄弟消息工具。父会话创建路径不传该字段。\n\t */\n\tsubagentCommunicationWiring?: import(\"./sdk.ts\").CreateAgentSessionOptions[\"subagentCommunicationWiring\"];\n\t/**\n\t * 档案 model 的目标 id(D-060 pooled parity 补口):runner 侧把叶子会话模型\n\t * 解析到**自己的 scoped models**(档案不能把会话带到 runner 未授权的模型上),\n\t * 解析不到即失败并列出可用 id。父会话创建路径不传该字段。\n\t */\n\tchildModelId?: string;\n}) => Promise<CreateAgentSessionRuntimeResult>;\n\n/**\n * Thrown when /import references a JSONL file path that does not exist.\n */\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\n/** Maps suite assembly findings onto the runtime diagnostic channel as info. */\nfunction toSuiteRuntimeDiagnostics(suiteDiagnostics: readonly string[]): AgentSessionRuntimeDiagnostic[] {\n\treturn suiteDiagnostics.map((message) => ({ type: \"info\" as const, message }));\n}\n\n/**\n * Owns the current AgentSession plus its cwd-bound services.\n *\n * Session replacement methods tear down the current runtime first, then create\n * and apply the next runtime. If creation fails, the error is propagated to the\n * caller. The caller is responsible for user-facing error handling.\n */\nexport class AgentSessionRuntime {\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\tprivate _session: AgentSession;\n\tprivate _services: AgentSessionServices;\n\tprivate readonly createRuntime: CreateAgentSessionRuntimeFactory;\n\tprivate _diagnostics: AgentSessionRuntimeDiagnostic[];\n\tprivate _suiteDiagnostics: readonly string[];\n\tprivate _modelFallbackMessage?: string;\n\tprivate _pluginRejections: readonly PluginRejection[];\n\n\tconstructor(\n\t\t_session: AgentSession,\n\t\t_services: AgentSessionServices,\n\t\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\t\t_diagnostics: AgentSessionRuntimeDiagnostic[] = [],\n\t\t_modelFallbackMessage?: string,\n\t\t_pluginRejections: readonly PluginRejection[] = [],\n\t\t_suiteDiagnostics: readonly string[] = [],\n\t) {\n\t\tthis._session = _session;\n\t\tthis._services = _services;\n\t\tthis.createRuntime = createRuntime;\n\t\tthis._diagnostics = _diagnostics;\n\t\tthis._suiteDiagnostics = _suiteDiagnostics;\n\t\tthis._modelFallbackMessage = _modelFallbackMessage;\n\t\tthis._pluginRejections = _pluginRejections;\n\t}\n\n\tget services(): AgentSessionServices {\n\t\treturn this._services;\n\t}\n\n\t/** /metrics 数据源共享 ref(observability 插件门面,空 = 未挂载)。 */\n\tget observabilityGetMetricsRef(): AgentSessionServices[\"observabilityGetMetricsRef\"] {\n\t\treturn this._services.observabilityGetMetricsRef;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this._session;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services.cwd;\n\t}\n\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn [...this._diagnostics, ...toSuiteRuntimeDiagnostics(this._suiteDiagnostics)];\n\t}\n\n\t/**\n\t * Suite assembly findings from the last runtime creation (initial,\n\t * /new, /fork, /switch). Surfaced as info-level entries on the\n\t * `diagnostics` channel.\n\t */\n\tget suiteDiagnostics(): readonly string[] {\n\t\treturn this._suiteDiagnostics;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget pluginRejections(): readonly PluginRejection[] {\n\t\treturn this._pluginRejections;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\t/**\n\t * Set a synchronous callback that runs after `session_shutdown` handlers finish\n\t * but before the current session is invalidated.\n\t *\n\t * This is for host-owned UI teardown that must not yield to the event loop,\n\t * such as detaching extension-provided TUI components before the old extension\n\t * context becomes stale.\n\t */\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async teardownCurrent(_reason: \"new\" | \"resume\" | \"fork\", _targetSessionFile?: string): Promise<void> {\n\t\t// Settle any active response first so the aborted turn (including tool\n\t\t// results) is persisted to the outgoing session before it is replaced.\n\t\t// Internal teardown aborts deliberately skip the interruption marker.\n\t\tawait this.session._abortInternal();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n\n\tprivate apply(result: CreateAgentSessionRuntimeResult): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._suiteDiagnostics = result.suiteDiagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t\tthis._pluginRejections = result.pluginRejections;\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionManager = SessionManager.open(sessionPath, undefined, options?.cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tconst sessionManager = this.session.sessionManager.isPersisted()\n\t\t\t? SessionManager.create(this.cwd, sessionDir)\n\t\t\t: SessionManager.inMemory(this.cwd);\n\t\tif (options?.parentSession) {\n\t\t\tsessionManager.newSession({ parentSession: options.parentSession });\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"new\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.sessionManager);\n\t\t\tconst context = this.session.sessionManager.buildSessionContext().messages;\n\t\t\tif (this.session.contextStrategyName) {\n\t\t\t\tawait this.session.replaceContext(context);\n\t\t\t} else {\n\t\t\t\tthis.session.agent.state.messages = context;\n\t\t\t}\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.sessionManager.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (this.session.sessionManager.isPersisted()) {\n\t\t\tconst currentSessionFile = this.session.sessionFile;\n\t\t\tif (!currentSessionFile) {\n\t\t\t\tthrow new Error(\"Persisted session is missing a session file\");\n\t\t\t}\n\t\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\t\tif (!targetLeafId) {\n\t\t\t\tconst sessionManager = SessionManager.create(this.cwd, sessionDir);\n\t\t\t\tsessionManager.newSession({ parentSession: currentSessionFile });\n\t\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\t\tthis.apply(\n\t\t\t\t\tawait this.createRuntime({\n\t\t\t\t\t\tcwd: this.cwd,\n\t\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\t\tsessionManager,\n\t\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\t\treturn { cancelled: false, selectedText };\n\t\t\t}\n\n\t\t\tif (!existsSync(currentSessionFile)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"This session has not been saved yet. Wait for the first assistant response before cloning or forking it.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst sessionManager = SessionManager.open(currentSessionFile, sessionDir);\n\t\t\tconst forkedSessionPath = sessionManager.createBranchedSession(targetLeafId);\n\t\t\tif (!forkedSessionPath) {\n\t\t\t\tthrow new Error(\"Failed to create forked session\");\n\t\t\t}\n\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\tthis.apply(\n\t\t\t\tawait this.createRuntime({\n\t\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t}),\n\t\t\t);\n\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\treturn { cancelled: false, selectedText };\n\t\t}\n\n\t\tconst sessionManager = this.session.sessionManager;\n\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\tif (!targetLeafId) {\n\t\t\tsessionManager.newSession({ parentSession: previousSessionFile });\n\t\t} else {\n\t\t\tsessionManager.createBranchedSession(targetLeafId);\n\t\t}\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\t/**\n\t * Import a session JSONL file and switch runtime state to the imported session.\n\t *\n\t * @throws {SessionImportFileNotFoundError} When the input path does not exist.\n\t * @throws {MissingSessionCwdError} When the imported session cwd cannot be resolved and no override is provided.\n\t */\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolvePath(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\n\t\tlet destinationPath = join(sessionDir, basename(resolvedPath));\n\t\tconst sourceAlreadyStored = resolve(destinationPath) === resolvedPath;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tconst { name, ext } = parse(destinationPath);\n\t\t\tlet suffix = 1;\n\t\t\twhile (existsSync(destinationPath)) {\n\t\t\t\tdestinationPath = join(sessionDir, `${name}-${suffix++}${ext}`);\n\t\t\t}\n\t\t}\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tcopyFileSync(resolvedPath, destinationPath, constants.COPYFILE_EXCL);\n\t\t}\n\n\t\tconst sessionManager = SessionManager.open(destinationPath, sessionDir, cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n}\n\n/**\n * Create the initial runtime from a runtime factory and initial session target.\n *\n * The same factory is stored on the returned AgentSessionRuntime and reused for\n * later /new, /resume, /fork, and import flows.\n */\nexport async function createAgentSessionRuntime(\n\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\toptions: {\n\t\tcwd: string;\n\t\tagentDir: string;\n\t\tsessionManager: SessionManager;\n\t\tsessionStartEvent?: SessionStartMetadata;\n\t},\n): Promise<AgentSessionRuntime> {\n\tassertSessionCwdExists(options.sessionManager, options.cwd);\n\tconst result = await createRuntime(options);\n\treturn new AgentSessionRuntime(\n\t\tresult.session,\n\t\tresult.services,\n\t\tcreateRuntime,\n\t\tresult.diagnostics,\n\t\tresult.modelFallbackMessage,\n\t\tresult.pluginRejections,\n\t\tresult.suiteDiagnostics,\n\t);\n}\n\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.ts\";\n"]}
1
+ {"version":3,"file":"agent-session-runtime.js","sourceRoot":"","sources":["../../src/core/agent-session-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAmFtD;;GAEG;AACH,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IAC/C,QAAQ,CAAS;IAE1B,YAAY,QAAgB,EAAE;QAC7B,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAAA,CACzB;CACD;AAED,SAAS,sBAAsB,CAAC,OAAwD,EAAU;IACjG,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,IAAI,EAA0C,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;SAC/G,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,CACX;AAED,gFAAgF;AAChF,SAAS,yBAAyB,CAAC,gBAAmC,EAAmC;IACxG,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAAA,CAC/E;AAED;;;;;;GAMG;AACH,MAAM,OAAO,mBAAmB;IACvB,aAAa,CAA4C;IACzD,uBAAuB,CAAc;IACrC,QAAQ,CAAe;IACvB,SAAS,CAAuB;IACvB,aAAa,CAAmC;IACzD,YAAY,CAAkC;IAC9C,iBAAiB,CAAoB;IACrC,qBAAqB,CAAU;IAC/B,iBAAiB,CAA6B;IAEtD,YACC,QAAsB,EACtB,SAA+B,EAC/B,aAA+C,EAC/C,YAAY,GAAoC,EAAE,EAClD,qBAA8B,EAC9B,iBAAiB,GAA+B,EAAE,EAClD,iBAAiB,GAAsB,EAAE,EACxC;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;QACnD,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAAA,CAC3C;IAED,IAAI,QAAQ,GAAyB;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC;IAAA,CACtB;IAED,wFAAsD;IACtD,IAAI,0BAA0B,GAAuD;QACpF,OAAO,IAAI,CAAC,SAAS,CAAC,0BAA0B,CAAC;IAAA,CACjD;IAED,IAAI,OAAO,GAAiB;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC;IAAA,CACrB;IAED,IAAI,GAAG,GAAW;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IAAA,CAC1B;IAED,IAAI,WAAW,GAA6C;QAC3D,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,yBAAyB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAAA,CACpF;IAED;;;;OAIG;IACH,IAAI,gBAAgB,GAAsB;QACzC,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAAA,CAC9B;IAED,IAAI,oBAAoB,GAAuB;QAC9C,OAAO,IAAI,CAAC,qBAAqB,CAAC;IAAA,CAClC;IAED,IAAI,gBAAgB,GAA+B;QAClD,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAAA,CAC9B;IAED,gBAAgB,CAAC,aAAwD,EAAQ;QAChF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IAAA,CACnC;IAED;;;;;;;OAOG;IACH,0BAA0B,CAAC,uBAAoC,EAAQ;QACtE,IAAI,CAAC,uBAAuB,GAAG,uBAAuB,CAAC;IAAA,CACvD;IAEO,KAAK,CAAC,eAAe,CAAC,OAAkC,EAAE,kBAA2B,EAAiB;QAC7G,uEAAuE;QACvE,uEAAuE;QACvE,sEAAsE;QACtE,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAAA,CAC7B;IAEO,KAAK,CAAC,MAAuC,EAAQ;QAC5D,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,oBAAoB,CAAC;QACzD,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAAA,CACjD;IAEO,KAAK,CAAC,wBAAwB,CAAC,WAA4D,EAAiB;QACnH,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC,CAAC;QAChE,CAAC;IAAA,CACD;IAED,KAAK,CAAC,aAAa,CAClB,WAAmB,EACnB,OAGC,EACiC;QAClC,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACrD,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACzF,sBAAsB,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,aAAa,CAAC;YACxB,GAAG,EAAE,cAAc,CAAC,MAAM,EAAE;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAChC,cAAc;YACd,iBAAiB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE;SAC5D,CAAC,CACF,CAAC;QACF,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAAA,CAC5B;IAED,KAAK,CAAC,UAAU,CAAC,OAIhB,EAAmC;QACnC,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;QAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE;YAC/D,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC;YAC7C,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YAC5B,cAAc,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,aAAa,CAAC;YACxB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAChC,cAAc;YACd,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE;SACzD,CAAC,CACF,CAAC;QACF,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACpB,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC;YAC3E,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;gBACtC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;YAC7C,CAAC;QACF,CAAC;QACD,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAAA,CAC5B;IAED,KAAK,CAAC,IAAI,CACT,OAAe,EACf,OAAsG,EAC7C;QACzD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,QAAQ,CAAC;QAC/C,IAAI,YAA2B,CAAC;QAChC,IAAI,YAAgC,CAAC;QAErC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpE,IAAI,CAAC,aAAa,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACvB,YAAY,GAAG,aAAa,CAAC,EAAE,CAAC;QACjC,CAAC;aAAM,CAAC;YACP,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/E,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACjD,CAAC;YACD,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC;YACtC,YAAY,GAAG,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACrD,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YACpD,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;YAC/D,IAAI,CAAC,YAAY,EAAE,CAAC;gBACnB,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBACnE,cAAc,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBACjE,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC;gBACpE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,aAAa,CAAC;oBACxB,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;oBAChC,cAAc;oBACd,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE;iBAC1D,CAAC,CACF,CAAC;gBACF,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;YAC3C,CAAC;YAED,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;YACtG,CAAC;YACD,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;YAC3E,MAAM,iBAAiB,GAAG,cAAc,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAC7E,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACpD,CAAC;YACD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC;YACpE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,aAAa,CAAC;gBACxB,GAAG,EAAE,cAAc,CAAC,MAAM,EAAE;gBAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;gBAChC,cAAc;gBACd,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE;aAC1D,CAAC,CACF,CAAC;YACF,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAC3C,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QACnD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,cAAc,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACP,cAAc,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,aAAa,CAAC;YACxB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAChC,cAAc;YACd,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE;SAC1D,CAAC,CACF,CAAC;QACF,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAA,CAC1C;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,WAAoB,EAAmC;QAC/F,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,8BAA8B,CAAC,YAAY,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;QAC/D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QAC/D,MAAM,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,YAAY,CAAC;QACtE,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;YAC7C,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,OAAO,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACpC,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,IAAI,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YACjE,CAAC;QACF,CAAC;QACD,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACrD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC1B,YAAY,CAAC,YAAY,EAAE,eAAe,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACrF,sBAAsB,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,aAAa,CAAC;YACxB,GAAG,EAAE,cAAc,CAAC,MAAM,EAAE;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAChC,cAAc;YACd,iBAAiB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE;SAC5D,CAAC,CACF,CAAC;QACF,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;QACtC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAAA,CAC5B;IAED,KAAK,CAAC,OAAO,GAAkB;QAC9B,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAAA,CAC7B;CACD;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,aAA+C,EAC/C,OAKC,EAC8B;IAC/B,sBAAsB,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,IAAI,mBAAmB,CAC7B,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,QAAQ,EACf,aAAa,EACb,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,oBAAoB,EAC3B,MAAM,CAAC,gBAAgB,EACvB,MAAM,CAAC,gBAAgB,CACvB,CAAC;AAAA,CACF;AAED,OAAO,EAKN,8BAA8B,EAC9B,0BAA0B,GAC1B,MAAM,6BAA6B,CAAC","sourcesContent":["import { constants, copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join, parse, resolve } from \"node:path\";\nimport type { ImageContent, TextContent } from \"@agent-forge/ai/compat\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { AgentSession } from \"./agent-session.ts\";\nimport type { AgentSessionRuntimeDiagnostic, AgentSessionServices } from \"./agent-session-services.ts\";\nimport type { AgentTaskChildProfileV1 } from \"./extensions/public-api.ts\";\nimport type { CustomMessage } from \"./messages.ts\";\nimport type { CreateAgentSessionResult, PluginRejection } from \"./sdk.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport type { SessionStartMetadata } from \"./session-start.ts\";\n\n/**\n * Result returned by runtime creation.\n *\n * The caller gets the created session, its cwd-bound services, and all\n * diagnostics collected during setup.\n */\n/**\n * Fresh session-bound context passed to `withSession()` callbacks on\n * `newSession()`, `fork()`, and `switchSession()`. It targets the replacement\n * session: every call routes into the session that became current after the\n * replacement committed.\n */\nexport interface ReplacedSessionContext {\n\tsendMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n}\n\nexport interface CreateAgentSessionRuntimeResult extends CreateAgentSessionResult {\n\tservices: AgentSessionServices;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n\t/**\n\t * 仅当工厂收到 `childProfile` 时存在:叶子会话的**可核验事实**(实际生效的工具面、\n\t * 模型、模式)。runner 侧 server 用它与请求档案比对后才允许任务起跑——\"要求了但\n\t * 没人能证明\"与\"没要求\"是同一风险。\n\t */\n\tchildFacts?: {\n\t\treadonly activeTools: readonly string[];\n\t\treadonly model?: {\n\t\t\treadonly provider: string;\n\t\t\treadonly id: string;\n\t\t\treadonly contextWindow: number;\n\t\t\treadonly maxTokens: number;\n\t\t\treadonly reasoning: boolean;\n\t\t};\n\t\treadonly capabilityMode: string;\n\t\t/** 叶子实际思考级别(档案请求了 thinkingLevel 时核验用)。 */\n\t\treadonly thinkingLevel?: string;\n\t\t/** 叶子实际生效的系统提示词追加段(档案请求了 systemPromptAppend 时核验用,已含方案 APPEND_SYSTEM.md 门控结果)。 */\n\t\treadonly systemPromptAppend?: string;\n\t};\n}\n\n/**\n * Creates a full runtime for a target cwd and session manager.\n *\n * The factory closes over process-global fixed inputs, recreates cwd-bound\n * services for the effective cwd, resolves session options against those\n * services, and finally creates the AgentSession.\n */\nexport type CreateAgentSessionRuntimeFactory = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartMetadata;\n\t/**\n\t * 子任务档案(AgentTaskChildProfileV1):pooled runner 的叶子会话按它收窄\n\t * (tools/mode/thinkingLevel)。父会话创建路径不传该字段——档案只服务子任务。\n\t */\n\tchildProfile?: AgentTaskChildProfileV1;\n\t/**\n\t * 子代理通信面的宿主接线(D-060 S5 pooled parity):runner 叶子装配注入\n\t * post/drainInbox 闭包(身份绑定到叶子会话),叶子会话由此获得\n\t * escalate/兄弟消息工具。父会话创建路径不传该字段。\n\t */\n\tsubagentCommunicationWiring?: import(\"./sdk.ts\").CreateAgentSessionOptions[\"subagentCommunicationWiring\"];\n\t/**\n\t * 档案 model 的目标 id(D-060 pooled parity 补口):runner 侧把叶子会话模型\n\t * 解析到**自己的 scoped models**(档案不能把会话带到 runner 未授权的模型上),\n\t * 解析不到即失败并列出可用 id。父会话创建路径不传该字段。\n\t */\n\tchildModelId?: string;\n}) => Promise<CreateAgentSessionRuntimeResult>;\n\n/**\n * Thrown when /import references a JSONL file path that does not exist.\n */\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\n/** Maps suite assembly findings onto the runtime diagnostic channel as info. */\nfunction toSuiteRuntimeDiagnostics(suiteDiagnostics: readonly string[]): AgentSessionRuntimeDiagnostic[] {\n\treturn suiteDiagnostics.map((message) => ({ type: \"info\" as const, message }));\n}\n\n/**\n * Owns the current AgentSession plus its cwd-bound services.\n *\n * Session replacement methods tear down the current runtime first, then create\n * and apply the next runtime. If creation fails, the error is propagated to the\n * caller. The caller is responsible for user-facing error handling.\n */\nexport class AgentSessionRuntime {\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\tprivate _session: AgentSession;\n\tprivate _services: AgentSessionServices;\n\tprivate readonly createRuntime: CreateAgentSessionRuntimeFactory;\n\tprivate _diagnostics: AgentSessionRuntimeDiagnostic[];\n\tprivate _suiteDiagnostics: readonly string[];\n\tprivate _modelFallbackMessage?: string;\n\tprivate _pluginRejections: readonly PluginRejection[];\n\n\tconstructor(\n\t\t_session: AgentSession,\n\t\t_services: AgentSessionServices,\n\t\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\t\t_diagnostics: AgentSessionRuntimeDiagnostic[] = [],\n\t\t_modelFallbackMessage?: string,\n\t\t_pluginRejections: readonly PluginRejection[] = [],\n\t\t_suiteDiagnostics: readonly string[] = [],\n\t) {\n\t\tthis._session = _session;\n\t\tthis._services = _services;\n\t\tthis.createRuntime = createRuntime;\n\t\tthis._diagnostics = _diagnostics;\n\t\tthis._suiteDiagnostics = _suiteDiagnostics;\n\t\tthis._modelFallbackMessage = _modelFallbackMessage;\n\t\tthis._pluginRejections = _pluginRejections;\n\t}\n\n\tget services(): AgentSessionServices {\n\t\treturn this._services;\n\t}\n\n\t/** /metrics 数据源共享 ref(observability 插件门面,空 = 未挂载)。 */\n\tget observabilityGetMetricsRef(): AgentSessionServices[\"observabilityGetMetricsRef\"] {\n\t\treturn this._services.observabilityGetMetricsRef;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this._session;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services.cwd;\n\t}\n\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn [...this._diagnostics, ...toSuiteRuntimeDiagnostics(this._suiteDiagnostics)];\n\t}\n\n\t/**\n\t * Suite assembly findings from the last runtime creation (initial,\n\t * /new, /fork, /switch). Surfaced as info-level entries on the\n\t * `diagnostics` channel.\n\t */\n\tget suiteDiagnostics(): readonly string[] {\n\t\treturn this._suiteDiagnostics;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget pluginRejections(): readonly PluginRejection[] {\n\t\treturn this._pluginRejections;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\t/**\n\t * Set a synchronous callback that runs after `session_shutdown` handlers finish\n\t * but before the current session is invalidated.\n\t *\n\t * This is for host-owned UI teardown that must not yield to the event loop,\n\t * such as detaching extension-provided TUI components before the old extension\n\t * context becomes stale.\n\t */\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async teardownCurrent(_reason: \"new\" | \"resume\" | \"fork\", _targetSessionFile?: string): Promise<void> {\n\t\t// Settle any active response first so the aborted turn (including tool\n\t\t// results) is persisted to the outgoing session before it is replaced.\n\t\t// Internal teardown aborts deliberately skip the interruption marker.\n\t\tawait this.session._abortInternal();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n\n\tprivate apply(result: CreateAgentSessionRuntimeResult): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._suiteDiagnostics = result.suiteDiagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t\tthis._pluginRejections = result.pluginRejections;\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionManager = SessionManager.open(sessionPath, undefined, options?.cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tconst sessionManager = this.session.sessionManager.isPersisted()\n\t\t\t? SessionManager.create(this.cwd, sessionDir)\n\t\t\t: SessionManager.inMemory(this.cwd);\n\t\tif (options?.parentSession) {\n\t\t\tsessionManager.newSession({ parentSession: options.parentSession });\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"new\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.sessionManager);\n\t\t\tconst context = this.session.sessionManager.buildSessionContext().messages;\n\t\t\tif (this.session.contextStrategyName) {\n\t\t\t\tawait this.session.replaceContext(context);\n\t\t\t} else {\n\t\t\t\tthis.session.agent.state.messages = context;\n\t\t\t}\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.sessionManager.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (this.session.sessionManager.isPersisted()) {\n\t\t\tconst currentSessionFile = this.session.sessionFile;\n\t\t\tif (!currentSessionFile) {\n\t\t\t\tthrow new Error(\"Persisted session is missing a session file\");\n\t\t\t}\n\t\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\t\tif (!targetLeafId) {\n\t\t\t\tconst sessionManager = SessionManager.create(this.cwd, sessionDir);\n\t\t\t\tsessionManager.newSession({ parentSession: currentSessionFile });\n\t\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\t\tthis.apply(\n\t\t\t\t\tawait this.createRuntime({\n\t\t\t\t\t\tcwd: this.cwd,\n\t\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\t\tsessionManager,\n\t\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\t\treturn { cancelled: false, selectedText };\n\t\t\t}\n\n\t\t\tif (!existsSync(currentSessionFile)) {\n\t\t\t\tthrow new Error(\"This session has not been saved yet. Send a message before cloning or forking it.\");\n\t\t\t}\n\t\t\tconst sessionManager = SessionManager.open(currentSessionFile, sessionDir);\n\t\t\tconst forkedSessionPath = sessionManager.createBranchedSession(targetLeafId);\n\t\t\tif (!forkedSessionPath) {\n\t\t\t\tthrow new Error(\"Failed to create forked session\");\n\t\t\t}\n\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\tthis.apply(\n\t\t\t\tawait this.createRuntime({\n\t\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t}),\n\t\t\t);\n\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\treturn { cancelled: false, selectedText };\n\t\t}\n\n\t\tconst sessionManager = this.session.sessionManager;\n\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\tif (!targetLeafId) {\n\t\t\tsessionManager.newSession({ parentSession: previousSessionFile });\n\t\t} else {\n\t\t\tsessionManager.createBranchedSession(targetLeafId);\n\t\t}\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\t/**\n\t * Import a session JSONL file and switch runtime state to the imported session.\n\t *\n\t * @throws {SessionImportFileNotFoundError} When the input path does not exist.\n\t * @throws {MissingSessionCwdError} When the imported session cwd cannot be resolved and no override is provided.\n\t */\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolvePath(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\n\t\tlet destinationPath = join(sessionDir, basename(resolvedPath));\n\t\tconst sourceAlreadyStored = resolve(destinationPath) === resolvedPath;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tconst { name, ext } = parse(destinationPath);\n\t\t\tlet suffix = 1;\n\t\t\twhile (existsSync(destinationPath)) {\n\t\t\t\tdestinationPath = join(sessionDir, `${name}-${suffix++}${ext}`);\n\t\t\t}\n\t\t}\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tcopyFileSync(resolvedPath, destinationPath, constants.COPYFILE_EXCL);\n\t\t}\n\n\t\tconst sessionManager = SessionManager.open(destinationPath, sessionDir, cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n}\n\n/**\n * Create the initial runtime from a runtime factory and initial session target.\n *\n * The same factory is stored on the returned AgentSessionRuntime and reused for\n * later /new, /resume, /fork, and import flows.\n */\nexport async function createAgentSessionRuntime(\n\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\toptions: {\n\t\tcwd: string;\n\t\tagentDir: string;\n\t\tsessionManager: SessionManager;\n\t\tsessionStartEvent?: SessionStartMetadata;\n\t},\n): Promise<AgentSessionRuntime> {\n\tassertSessionCwdExists(options.sessionManager, options.cwd);\n\tconst result = await createRuntime(options);\n\treturn new AgentSessionRuntime(\n\t\tresult.session,\n\t\tresult.services,\n\t\tcreateRuntime,\n\t\tresult.diagnostics,\n\t\tresult.modelFallbackMessage,\n\t\tresult.pluginRejections,\n\t\tresult.suiteDiagnostics,\n\t);\n}\n\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.ts\";\n"]}
@@ -344,6 +344,10 @@ export interface AgentSessionConfig {
344
344
  */
345
345
  traceService?: TraceServiceV1;
346
346
  }
347
+ /** How a queued steer/follow_up input was dispatched: "handled" (consumed by a handler, not queued) or "queued". */
348
+ export type QueuedInputDisposition = "handled" | "queued";
349
+ /** How an accepted prompt was dispatched: handled (consumed), queued (during a run), or started (run begins). */
350
+ export type PromptDisposition = QueuedInputDisposition | "started";
347
351
  /** Options for AgentSession.prompt() */
348
352
  export interface PromptOptions {
349
353
  /** Whether to dispatch extension commands and expand skill commands and prompt templates (default: true) */
@@ -354,8 +358,11 @@ export interface PromptOptions {
354
358
  streamingBehavior?: "steer" | "followUp";
355
359
  /** Source of the input, reported in the input.received lifecycle facts. Defaults to "interactive". */
356
360
  source?: InputSource;
357
- /** Internal hook used by RPC mode to observe prompt preflight acceptance or rejection. */
358
- preflightResult?: (success: boolean) => void;
361
+ /**
362
+ * Internal hook used by RPC mode to observe how an accepted prompt was dispatched
363
+ * ("handled", "queued", or "started"). Not called if the prompt is rejected.
364
+ */
365
+ preflightResult?: (disposition: PromptDisposition) => void;
359
366
  }
360
367
  /** Options for model/thinking mutations. */
361
368
  export interface ModelMutationOptions {
@@ -423,6 +430,14 @@ export declare class AgentSession {
423
430
  private _autoCompactionAbortController;
424
431
  private _overflowRecoveryAttempted;
425
432
  private _overflowTrimStage;
433
+ /**
434
+ * microcompact 冷却(按模型请求计数,0 = 不冷却):relief 落地时置
435
+ * MICROCOMPACT_COOLDOWN_ASSISTANT_RESPONSES,此后每次 assistant message_end
436
+ * (无论 stopReason)减 1、下限 0;user message_start 不复位。冷却期内阈值
437
+ * decide 以 microcompactEnabled:false 关闭便宜缓解。微观经济动机见
438
+ * agent-session-compaction.ts 的常量注释(中部历史改写 × 不稳定前缀缓存)。
439
+ */
440
+ private _microcompactCooldown;
426
441
  private _branchSummaryAbortController;
427
442
  private _branchSummaryPromise;
428
443
  private _resolveBranchSummaryPromise;
@@ -767,22 +782,24 @@ export declare class AgentSession {
767
782
  * Expands skill commands and prompt templates. Errors on extension commands.
768
783
  * @param images Optional image attachments to include with the message
769
784
  * @param options Input source; defaults to interactive
785
+ * @returns How the input was dispatched ("queued"; "handled" if a handler consumed it)
770
786
  * @throws Error if text is an extension command
771
787
  */
772
788
  steer(text: string, images?: ImageContent[], options?: {
773
789
  source?: InputSource;
774
- }): Promise<void>;
790
+ }): Promise<QueuedInputDisposition>;
775
791
  /**
776
792
  * Queue a follow-up message to be processed after the agent finishes.
777
793
  * Delivered only when agent has no more tool calls or steering messages.
778
794
  * Expands skill commands and prompt templates. Errors on extension commands.
779
795
  * @param images Optional image attachments to include with the message
780
796
  * @param options Input source; defaults to interactive
797
+ * @returns How the input was dispatched ("queued"; "handled" if a handler consumed it)
781
798
  * @throws Error if text is an extension command
782
799
  */
783
800
  followUp(text: string, images?: ImageContent[], options?: {
784
801
  source?: InputSource;
785
- }): Promise<void>;
802
+ }): Promise<QueuedInputDisposition>;
786
803
  private _queueSteer;
787
804
  private _queueFollowUp;
788
805
  /**