@bastani/atomic 0.9.53 → 0.9.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.js +2 -1
- package/dist/core/agent-session-auto-compaction.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +2 -1
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +2 -1
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-models.d.ts +17 -1
- package/dist/core/agent-session-models.d.ts.map +1 -1
- package/dist/core/agent-session-models.js +19 -0
- package/dist/core/agent-session-models.js.map +1 -1
- package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-post-tool-compaction.js +2 -1
- package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
- package/dist/core/agent-session-summary.d.ts.map +1 -1
- package/dist/core/agent-session-summary.js +2 -1
- package/dist/core/agent-session-summary.js.map +1 -1
- package/dist/core/agent-session-tree.d.ts.map +1 -1
- package/dist/core/agent-session-tree.js +2 -1
- package/dist/core/agent-session-tree.js.map +1 -1
- package/dist/core/exec.d.ts +9 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +109 -74
- package/dist/core/exec.js.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +2 -2
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/model-resolver-patterns.d.ts.map +1 -1
- package/dist/core/model-resolver-patterns.js +15 -9
- package/dist/core/model-resolver-patterns.js.map +1 -1
- package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
- package/dist/core/package-manager-auto-resources.js +3 -2
- package/dist/core/package-manager-auto-resources.js.map +1 -1
- package/dist/core/package-manager-git.d.ts +1 -1
- package/dist/core/package-manager-git.d.ts.map +1 -1
- package/dist/core/package-manager-git.js +12 -1
- package/dist/core/package-manager-git.js.map +1 -1
- package/dist/core/package-manager-npm.d.ts +1 -1
- package/dist/core/package-manager-npm.d.ts.map +1 -1
- package/dist/core/package-manager-npm.js +8 -4
- package/dist/core/package-manager-npm.js.map +1 -1
- package/dist/core/package-manager-operations.d.ts.map +1 -1
- package/dist/core/package-manager-operations.js +33 -8
- package/dist/core/package-manager-operations.js.map +1 -1
- package/dist/core/package-manager-resolver.d.ts.map +1 -1
- package/dist/core/package-manager-resolver.js +22 -4
- package/dist/core/package-manager-resolver.js.map +1 -1
- package/dist/core/package-manager-resource-accumulator.d.ts.map +1 -1
- package/dist/core/package-manager-resource-accumulator.js +4 -4
- package/dist/core/package-manager-resource-accumulator.js.map +1 -1
- package/dist/core/package-manager-source.js +5 -5
- package/dist/core/package-manager-source.js.map +1 -1
- package/dist/core/package-manager-types.d.ts +5 -1
- package/dist/core/package-manager-types.d.ts.map +1 -1
- package/dist/core/package-manager-types.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +3 -3
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js +2 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/prompt-templates-async.d.ts.map +1 -1
- package/dist/core/prompt-templates-async.js +4 -9
- package/dist/core/prompt-templates-async.js.map +1 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +4 -12
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/resource-loader-extensions.d.ts.map +1 -1
- package/dist/core/resource-loader-extensions.js +8 -7
- package/dist/core/resource-loader-extensions.js.map +1 -1
- package/dist/core/resource-loader-paths.js +5 -5
- package/dist/core/resource-loader-paths.js.map +1 -1
- package/dist/core/resource-loader-source-info.d.ts +0 -1
- package/dist/core/resource-loader-source-info.d.ts.map +1 -1
- package/dist/core/resource-loader-source-info.js +6 -17
- package/dist/core/resource-loader-source-info.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-core.js +2 -2
- package/dist/core/session-manager-core.js.map +1 -1
- package/dist/core/session-manager-list.js +2 -2
- package/dist/core/session-manager-list.js.map +1 -1
- package/dist/core/skills-async.d.ts.map +1 -1
- package/dist/core/skills-async.js +5 -10
- package/dist/core/skills-async.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +5 -13
- package/dist/core/skills.js.map +1 -1
- package/dist/core/source-info.d.ts +2 -0
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js +5 -0
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/tool-loadout.d.ts +4 -0
- package/dist/core/tool-loadout.d.ts.map +1 -1
- package/dist/core/tool-loadout.js +7 -1
- package/dist/core/tool-loadout.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +2 -7
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +15 -9
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/extensions/codemode/tool.d.ts.map +1 -1
- package/dist/extensions/codemode/tool.js +33 -8
- package/dist/extensions/codemode/tool.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +20 -3
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector-list.js +2 -13
- package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-list.js +2 -2
- package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-tree.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-tree.js +4 -6
- package/dist/modes/interactive/components/session-selector-tree.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-utils.d.ts +2 -1
- package/dist/modes/interactive/components/session-selector-utils.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-utils.js +5 -13
- package/dist/modes/interactive/components/session-selector-utils.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector-content.js +2 -6
- package/dist/modes/interactive/components/tree-selector-content.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +2 -0
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +4 -0
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +1 -0
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-types.d.ts +6 -0
- package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
- package/dist/modes/interactive/interactive-resource-rendering.js +1 -1
- package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +15 -8
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-tui.d.ts +1 -0
- package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-tui.js +1 -1
- package/dist/modes/interactive/interactive-tui.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +3 -0
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js +5 -2
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/git.d.ts +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js +5 -3
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/paths.d.ts +14 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +39 -1
- package/dist/utils/paths.js.map +1 -1
- package/docs/extensions/api-reference.md +4 -2
- package/docs/packages.md +2 -0
- package/npm-shrinkwrap.json +32 -32
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-models.js","sourceRoot":"","sources":["../../src/core/agent-session-models.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProviderHeaders } from \"@bastani/pi-ai\";\nimport type { Api, Model } from \"@bastani/pi-ai/compat\";\nimport { clampThinkingLevel, getSupportedThinkingLevels, modelsAreEqual } from \"@bastani/pi-ai/compat\";\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport { type ModelCycleResult, type ModelMutationOptions, THINKING_LEVELS } from \"./agent-session-types.js\";\nimport { formatNoApiKeyFoundMessage } from \"./auth-guidance.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport { assertSessionOpen, trackSessionWork } from \"./session-lifecycle-work.ts\";\nimport { serializeSessionMutation } from \"./session-mutation-queue.ts\";\nimport { settingsWriteOwner } from \"./settings-write-ownership.ts\";\n\nexport async function _getRequiredRequestAuth(\n\tthis: AgentSession,\n\tmodel: Model<Api>,\n\tsignal?: AbortSignal,\n): Promise<{\n\tapiKey?: string;\n\theaders?: ProviderHeaders;\n\tbaseUrl?: string;\n\tenv?: Record<string, string>;\n}> {\n\tlet result: Awaited<ReturnType<AgentSession[\"_modelRuntime\"][\"getRequestAuth\"]>>;\n\ttry {\n\t\tresult = await this._modelRuntime.getRequestAuth(model, { signal });\n\t} catch (error) {\n\t\tconst cause = error instanceof Error ? error.cause : undefined;\n\t\tif (cause instanceof Error && cause.message === \"authHeader requires a resolved API key\") {\n\t\t\tthrow new Error(formatNoApiKeyFoundMessage(model.provider));\n\t\t}\n\t\tthrow error;\n\t}\n\tif (result && (result.auth.apiKey || result.auth.headers)) {\n\t\t// `ProviderHeaders` is `Record<string, string | null>` and a null value\n\t\t// suppresses the provider/API default header of the same name. Callers of\n\t\t// this function issue real outbound requests (branch summarization and the\n\t\t// compaction planner), so both markers and the credential-specific endpoint\n\t\t// must reach the request layer intact.\n\t\treturn {\n\t\t\tapiKey: result.auth.apiKey,\n\t\t\theaders: result.auth.headers,\n\t\t\t...(result.auth.baseUrl === undefined ? {} : { baseUrl: result.auth.baseUrl }),\n\t\t\tenv: result.env,\n\t\t};\n\t}\n\tif (this._modelRuntime.isUsingOAuth(model.provider)) {\n\t\tthrow new Error(\n\t\t\t`Authentication failed for \"${model.provider}\". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`,\n\t\t);\n\t}\n\tthrow new Error(formatNoApiKeyFoundMessage(model.provider));\n}\n\n/**\n * Install tool hooks once on the Agent instance.\n *\n * The callbacks read `this._extensionRunner` at execution time, so extension reload swaps in the\n * new runner without reinstalling hooks. Extension-specific tool wrappers are still used to adapt\n * registered tool execution to the extension context. Tool call and tool result interception now\n * happens here instead of in wrappers.\n */\n\nexport function _emitModelChanged(\n\tthis: AgentSession,\n\tnextModel: Model<Api>,\n\tpreviousModel: Model<Api> | undefined,\n\tsource: \"set\" | \"cycle\" | \"restore\" | \"fallback\",\n): void {\n\tif (modelsAreEqual(previousModel, nextModel)) return;\n\tthis._emit({\n\t\ttype: \"model_changed\",\n\t\tmodel: nextModel,\n\t\tpreviousModel,\n\t\tsource,\n\t});\n}\n\nexport async function _emitModelSelect(\n\tthis: AgentSession,\n\tnextModel: Model<Api>,\n\tpreviousModel: Model<Api> | undefined,\n\tsource: \"set\" | \"cycle\" | \"restore\" | \"fallback\",\n): Promise<void> {\n\tif (modelsAreEqual(previousModel, nextModel)) return;\n\tawait this._extensionRunner.emit({\n\t\ttype: \"model_select\",\n\t\tmodel: nextModel,\n\t\tpreviousModel,\n\t\tsource,\n\t});\n}\n\nfunction addPersistedDefaultToNonEmptyScope(session: AgentSession, model: Model<Api>): void {\n\tif (session._scopedModels.length === 0) return;\n\tif (session._scopedModels.some((scoped) => modelsAreEqual(scoped.model, model))) return;\n\n\tsession._scopedModels = [...session._scopedModels, { model }];\n\tconst enabledModels = session.settingsManager.getEnabledModels();\n\tif (!enabledModels?.length) return;\n\n\tconst modelReference = `${model.provider}/${model.id}`;\n\tif (enabledModels.some((pattern) => pattern.toLowerCase() === modelReference.toLowerCase())) return;\n\tsettingsWriteOwner.run(session, () => session.settingsManager.setEnabledModels([...enabledModels, modelReference]));\n}\n\n/**\n * Set model directly.\n * Validates that auth is configured, saves to session and settings.\n * @throws Error if no auth is configured for the model\n */\n\nexport async function setModel(\n\tthis: AgentSession,\n\tmodel: Model<Api>,\n\toptions: ModelMutationOptions = {},\n): Promise<void> {\n\tassertSessionOpen(this);\n\treturn trackSessionWork(this, async () => {\n\t\tconst previousModel = await serializeSessionMutation(this, async () => {\n\t\t\tif (!this._modelRuntime.hasConfiguredAuth(model.provider)) {\n\t\t\t\tthrow new Error(`No API key for ${model.provider}/${model.id}`);\n\t\t\t}\n\t\t\tconst previousModel = this.model;\n\t\t\tconst thinkingLevel = this._getThinkingLevelForModelSwitch(model);\n\t\t\tconst nextModel = model;\n\t\t\tawait this.sessionManager.appendModelChange(nextModel.provider, nextModel.id);\n\t\t\tthis._clearFallbackModelScope?.();\n\t\t\tthis.agent.state.model = nextModel;\n\t\t\tif (options.persist) {\n\t\t\t\tsettingsWriteOwner.run(this, () =>\n\t\t\t\t\tthis.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id),\n\t\t\t\t);\n\t\t\t\taddPersistedDefaultToNonEmptyScope(this, nextModel);\n\t\t\t}\n\n\t\t\t// Re-clamp thinking level for new model's capabilities\n\t\t\tawait applyThinkingLevel.call(this, thinkingLevel, options);\n\t\t\tthis._refreshBaseSystemPromptFromActiveTools();\n\n\t\t\tthis._emitModelChanged(nextModel, previousModel, \"set\");\n\t\t\treturn previousModel;\n\t\t});\n\t\t// Extension callbacks may themselves request a model change; never hold the queue across them.\n\t\tawait this._emitModelSelect(model, previousModel, \"set\");\n\t});\n}\n\n/**\n * Cycle to next/previous model.\n * Uses scoped models (from --models flag) if available, otherwise all available models.\n * @param direction - \"forward\" (default) or \"backward\"\n * @returns The new model info, or undefined if only one model available\n */\n\nexport async function cycleModel(\n\tthis: AgentSession,\n\tdirection: \"forward\" | \"backward\" = \"forward\",\n\toptions: ModelMutationOptions = {},\n): Promise<ModelCycleResult | undefined> {\n\tassertSessionOpen(this);\n\treturn trackSessionWork(this, async () => {\n\t\tconst { previousModel, result } = await serializeSessionMutation(this, async () => {\n\t\t\tconst previousModel = this.model;\n\t\t\tconst result =\n\t\t\t\tthis._scopedModels.length > 0\n\t\t\t\t\t? await this._cycleScopedModel(direction, options)\n\t\t\t\t\t: await this._cycleAvailableModel(direction, options);\n\t\t\treturn { previousModel, result };\n\t\t});\n\t\tif (result) await this._emitModelSelect(result.model, previousModel, \"cycle\");\n\t\treturn result;\n\t});\n}\n\nexport async function _cycleScopedModel(\n\tthis: AgentSession,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst scopedModels = this._scopedModels.filter((scoped) =>\n\t\tthis._modelRuntime.hasConfiguredAuth(scoped.model.provider),\n\t);\n\tif (scopedModels.length <= 1) return undefined;\n\n\tconst currentModel = this.model;\n\tlet currentIndex = scopedModels.findIndex((sm) => modelsAreEqual(sm.model, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = scopedModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst next = scopedModels[nextIndex];\n\tconst thinkingLevel = this._getThinkingLevelForModelSwitch(next.model, next.thinkingLevel);\n\tconst nextModel = next.model;\n\n\t// An explicit cycle finishes any active fallback lifecycle before switching.\n\tawait this.sessionManager.appendModelChange(nextModel.provider, nextModel.id);\n\tthis._clearFallbackModelScope?.();\n\tthis.agent.state.model = nextModel;\n\tif (options.persist) {\n\t\tsettingsWriteOwner.run(this, () =>\n\t\t\tthis.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id),\n\t\t);\n\t\taddPersistedDefaultToNonEmptyScope(this, nextModel);\n\t}\n\n\t// Apply thinking level.\n\t// - Explicit scoped model thinking level overrides current session level\n\t// - Undefined scoped model thinking level inherits the current session preference\n\t// setThinkingLevel clamps to model capabilities.\n\tawait applyThinkingLevel.call(this, thinkingLevel, options);\n\tthis._refreshBaseSystemPromptFromActiveTools();\n\n\tthis._emitModelChanged(nextModel, currentModel, \"cycle\");\n\n\treturn { model: nextModel, thinkingLevel: this.thinkingLevel, isScoped: true };\n}\n\nexport async function _cycleAvailableModel(\n\tthis: AgentSession,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableModels = await this._modelRuntime.getAvailableSnapshot();\n\tassertSessionOpen(this);\n\tif (availableModels.length <= 1) return undefined;\n\n\tconst currentModel = this.model;\n\tlet currentIndex = availableModels.findIndex((m) => modelsAreEqual(m, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = availableModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst selectedModel = availableModels[nextIndex];\n\n\tconst thinkingLevel = this._getThinkingLevelForModelSwitch(selectedModel);\n\t// An explicit cycle finishes any active fallback lifecycle before switching.\n\tawait this.sessionManager.appendModelChange(selectedModel.provider, selectedModel.id);\n\tthis._clearFallbackModelScope?.();\n\tthis.agent.state.model = selectedModel;\n\tif (options.persist) {\n\t\tsettingsWriteOwner.run(this, () =>\n\t\t\tthis.settingsManager.setDefaultModelAndProvider(selectedModel.provider, selectedModel.id),\n\t\t);\n\t\taddPersistedDefaultToNonEmptyScope(this, selectedModel);\n\t}\n\n\t// Re-clamp thinking level for new model's capabilities\n\tawait applyThinkingLevel.call(this, thinkingLevel, options);\n\tthis._refreshBaseSystemPromptFromActiveTools();\n\n\tthis._emitModelChanged(selectedModel, currentModel, \"cycle\");\n\n\treturn { model: selectedModel, thinkingLevel: this.thinkingLevel, isScoped: false };\n}\n\n// =========================================================================\n// Thinking Level Management\n// =========================================================================\n\n/**\n * Set thinking level.\n * Clamps to model capabilities based on available thinking levels.\n * Saves to session and settings only if the level actually changes.\n */\n\nfunction persistThinkingLevel(session: AgentSession, level: ThinkingLevel): void {\n\tif (session.model) {\n\t\tsettingsWriteOwner.run(session, () =>\n\t\t\tsession.settingsManager.setModelThinkingLevel(session.model!.provider, session.model!.id, level),\n\t\t);\n\t}\n\tsettingsWriteOwner.run(session, () => session.settingsManager.setDefaultThinkingLevel(level));\n}\n\nexport async function setThinkingLevel(\n\tthis: AgentSession,\n\tlevel: ThinkingLevel,\n\toptions: ModelMutationOptions = {},\n): Promise<void> {\n\treturn trackSessionWork(this, () =>\n\t\tserializeSessionMutation(this, () => applyThinkingLevel.call(this, level, options)),\n\t);\n}\n\nasync function applyThinkingLevel(\n\tthis: AgentSession,\n\tlevel: ThinkingLevel,\n\toptions: ModelMutationOptions,\n): Promise<void> {\n\tconst availableLevels = this.getAvailableThinkingLevels();\n\tconst effectiveLevel = availableLevels.includes(level) ? level : this._clampThinkingLevel(level, availableLevels);\n\n\t// Only persist if actually changing\n\tconst previousLevel = this.agent.state.thinkingLevel;\n\tconst isChanging = effectiveLevel !== previousLevel;\n\n\tif (isChanging) {\n\t\t// A reasoning choice is not a model choice, so it leaves the selected\n\t\t// fallback model in place. Keep the active lifecycle open until the turn\n\t\t// settles. (A no-op assignment from a registry refresh changes nothing.)\n\t\tawait this.sessionManager.appendThinkingLevelChange(effectiveLevel);\n\t\tthis.agent.state.thinkingLevel = effectiveLevel;\n\t\tif (options.persist) persistThinkingLevel(this, effectiveLevel);\n\t\tif (this._fallbackOriginModel !== undefined) this._fallbackOriginThinkingLevel = effectiveLevel;\n\t\tthis._refreshBaseSystemPromptFromActiveTools();\n\t\tthis._emit({ type: \"thinking_level_changed\", level: effectiveLevel });\n\t\tvoid this._extensionRunner.emit({\n\t\t\ttype: \"thinking_level_select\",\n\t\t\tlevel: effectiveLevel,\n\t\t\tpreviousLevel,\n\t\t});\n\t} else if (options.persist) {\n\t\tpersistThinkingLevel(this, effectiveLevel);\n\t}\n}\n\n/**\n * Cycle to next thinking level.\n * @returns New level, or undefined if model doesn't support thinking\n */\n\nexport async function cycleThinkingLevel(\n\tthis: AgentSession,\n\toptions: ModelMutationOptions = {},\n): Promise<ThinkingLevel | undefined> {\n\treturn trackSessionWork(this, () =>\n\t\tserializeSessionMutation(this, async () => {\n\t\t\tif (!this.supportsThinking()) return undefined;\n\n\t\t\tconst levels = this.getAvailableThinkingLevels();\n\t\t\tconst currentIndex = levels.indexOf(this.thinkingLevel);\n\t\t\tconst nextIndex = (currentIndex + 1) % levels.length;\n\t\t\tconst nextLevel = levels[nextIndex];\n\n\t\t\tawait applyThinkingLevel.call(this, nextLevel, options);\n\t\t\treturn nextLevel;\n\t\t}),\n\t);\n}\n\n/**\n * Get available thinking levels for current model.\n * The provider will clamp to what the specific model supports internally.\n */\n\nexport function getAvailableThinkingLevels(this: AgentSession): ThinkingLevel[] {\n\tif (!this.model) return THINKING_LEVELS;\n\treturn getSupportedThinkingLevels(this.model) as ThinkingLevel[];\n}\n\n/**\n * Check if current model supports thinking/reasoning.\n */\n\nexport function supportsThinking(this: AgentSession): boolean {\n\treturn !!this.model?.reasoning;\n}\n\nexport function _getThinkingLevelForModelSwitch(\n\tthis: AgentSession,\n\ttargetModel?: Model<Api>,\n\texplicitLevel?: ThinkingLevel,\n): ThinkingLevel {\n\tif (explicitLevel !== undefined) {\n\t\treturn explicitLevel;\n\t}\n\tif (targetModel) {\n\t\tconst perModel = this.settingsManager.getModelThinkingLevel(targetModel.provider, targetModel.id);\n\t\tif (perModel !== undefined) return perModel;\n\t}\n\tif (!this.supportsThinking()) {\n\t\treturn this.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\treturn this.thinkingLevel;\n}\n\nexport function _clampThinkingLevel(\n\tthis: AgentSession,\n\tlevel: ThinkingLevel,\n\t_availableLevels: ThinkingLevel[],\n): ThinkingLevel {\n\treturn this.model ? (clampThinkingLevel(this.model, level) as ThinkingLevel) : \"off\";\n}\n\n// =========================================================================\n// Queue Mode Management\n// =========================================================================\n\n/**\n * Set steering message mode.\n * Saves to settings.\n */\n\nexport const agentSessionModelsMethods = {\n\t_getRequiredRequestAuth,\n\t_emitModelChanged,\n\t_emitModelSelect,\n\tsetModel,\n\tcycleModel,\n\t_cycleScopedModel,\n\t_cycleAvailableModel,\n\tsetThinkingLevel,\n\tcycleThinkingLevel,\n\tgetAvailableThinkingLevels,\n\tsupportsThinking,\n\t_getThinkingLevelForModelSwitch,\n\t_clampThinkingLevel,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-models.js","sourceRoot":"","sources":["../../src/core/agent-session-models.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProviderHeaders } from \"@bastani/pi-ai\";\nimport type { Api, Model } from \"@bastani/pi-ai/compat\";\nimport { clampThinkingLevel, getSupportedThinkingLevels, modelsAreEqual } from \"@bastani/pi-ai/compat\";\nimport type { StreamFn, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport { type ModelCycleResult, type ModelMutationOptions, THINKING_LEVELS } from \"./agent-session-types.js\";\nimport { formatNoApiKeyFoundMessage } from \"./auth-guidance.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport { assertSessionOpen, trackSessionWork } from \"./session-lifecycle-work.ts\";\nimport { serializeSessionMutation } from \"./session-mutation-queue.ts\";\nimport { settingsWriteOwner } from \"./settings-write-ownership.ts\";\n\n/**\n * Stream functions that resolve auth through a given ModelRuntime themselves, such as the one\n * createAgentSession installs. Summaries sent through them must not pass pre-resolved credentials:\n * the runtime would take them as an explicit API key instead of the stored OAuth login (upstream #11520).\n */\nconst runtimeStreamFunctions = new WeakMap<StreamFn, AgentSession[\"_modelRuntime\"]>();\n\n/** Mark `streamFn` as resolving auth through `modelRuntime` on its own. */\nexport function markRuntimeStreamFunction(streamFn: StreamFn, modelRuntime: AgentSession[\"_modelRuntime\"]): void {\n\truntimeStreamFunctions.set(streamFn, modelRuntime);\n}\n\ntype RequestAuth = { apiKey?: string; headers?: ProviderHeaders; baseUrl?: string; env?: Record<string, string> };\n\n/**\n * The request auth to hand the session's stream function for a summary or compaction request. Auth\n * is resolved first, so a missing or expired login still fails early with its actionable message.\n * A stream function that resolves auth through the session's own runtime gets none of it, and\n * resolves the stored login itself.\n */\nexport function authForStream<A extends RequestAuth>(session: AgentSession, auth: A): A {\n\treturn runtimeStreamFunctions.get(session.agent.streamFunction) === session._modelRuntime ? ({} as A) : auth;\n}\n\nexport async function _getRequiredRequestAuth(\n\tthis: AgentSession,\n\tmodel: Model<Api>,\n\tsignal?: AbortSignal,\n): Promise<{\n\tapiKey?: string;\n\theaders?: ProviderHeaders;\n\tbaseUrl?: string;\n\tenv?: Record<string, string>;\n}> {\n\tlet result: Awaited<ReturnType<AgentSession[\"_modelRuntime\"][\"getRequestAuth\"]>>;\n\ttry {\n\t\tresult = await this._modelRuntime.getRequestAuth(model, { signal });\n\t} catch (error) {\n\t\tconst cause = error instanceof Error ? error.cause : undefined;\n\t\tif (cause instanceof Error && cause.message === \"authHeader requires a resolved API key\") {\n\t\t\tthrow new Error(formatNoApiKeyFoundMessage(model.provider));\n\t\t}\n\t\tthrow error;\n\t}\n\tif (result && (result.auth.apiKey || result.auth.headers)) {\n\t\t// `ProviderHeaders` is `Record<string, string | null>` and a null value\n\t\t// suppresses the provider/API default header of the same name. Callers of\n\t\t// this function issue real outbound requests (branch summarization and the\n\t\t// compaction planner), so both markers and the credential-specific endpoint\n\t\t// must reach the request layer intact.\n\t\treturn {\n\t\t\tapiKey: result.auth.apiKey,\n\t\t\theaders: result.auth.headers,\n\t\t\t...(result.auth.baseUrl === undefined ? {} : { baseUrl: result.auth.baseUrl }),\n\t\t\tenv: result.env,\n\t\t};\n\t}\n\tif (this._modelRuntime.isUsingOAuth(model.provider)) {\n\t\tthrow new Error(\n\t\t\t`Authentication failed for \"${model.provider}\". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`,\n\t\t);\n\t}\n\tthrow new Error(formatNoApiKeyFoundMessage(model.provider));\n}\n\n/**\n * Install tool hooks once on the Agent instance.\n *\n * The callbacks read `this._extensionRunner` at execution time, so extension reload swaps in the\n * new runner without reinstalling hooks. Extension-specific tool wrappers are still used to adapt\n * registered tool execution to the extension context. Tool call and tool result interception now\n * happens here instead of in wrappers.\n */\n\nexport function _emitModelChanged(\n\tthis: AgentSession,\n\tnextModel: Model<Api>,\n\tpreviousModel: Model<Api> | undefined,\n\tsource: \"set\" | \"cycle\" | \"restore\" | \"fallback\",\n): void {\n\tif (modelsAreEqual(previousModel, nextModel)) return;\n\tthis._emit({\n\t\ttype: \"model_changed\",\n\t\tmodel: nextModel,\n\t\tpreviousModel,\n\t\tsource,\n\t});\n}\n\nexport async function _emitModelSelect(\n\tthis: AgentSession,\n\tnextModel: Model<Api>,\n\tpreviousModel: Model<Api> | undefined,\n\tsource: \"set\" | \"cycle\" | \"restore\" | \"fallback\",\n): Promise<void> {\n\tif (modelsAreEqual(previousModel, nextModel)) return;\n\tawait this._extensionRunner.emit({\n\t\ttype: \"model_select\",\n\t\tmodel: nextModel,\n\t\tpreviousModel,\n\t\tsource,\n\t});\n}\n\nfunction addPersistedDefaultToNonEmptyScope(session: AgentSession, model: Model<Api>): void {\n\tif (session._scopedModels.length === 0) return;\n\tif (session._scopedModels.some((scoped) => modelsAreEqual(scoped.model, model))) return;\n\n\tsession._scopedModels = [...session._scopedModels, { model }];\n\tconst enabledModels = session.settingsManager.getEnabledModels();\n\tif (!enabledModels?.length) return;\n\n\tconst modelReference = `${model.provider}/${model.id}`;\n\tif (enabledModels.some((pattern) => pattern.toLowerCase() === modelReference.toLowerCase())) return;\n\tsettingsWriteOwner.run(session, () => session.settingsManager.setEnabledModels([...enabledModels, modelReference]));\n}\n\n/**\n * Set model directly.\n * Validates that auth is configured, saves to session and settings.\n * @throws Error if no auth is configured for the model\n */\n\nexport async function setModel(\n\tthis: AgentSession,\n\tmodel: Model<Api>,\n\toptions: ModelMutationOptions = {},\n): Promise<void> {\n\tassertSessionOpen(this);\n\treturn trackSessionWork(this, async () => {\n\t\tconst previousModel = await serializeSessionMutation(this, async () => {\n\t\t\tif (!this._modelRuntime.hasConfiguredAuth(model.provider)) {\n\t\t\t\tthrow new Error(`No API key for ${model.provider}/${model.id}`);\n\t\t\t}\n\t\t\tconst previousModel = this.model;\n\t\t\tconst thinkingLevel = this._getThinkingLevelForModelSwitch(model);\n\t\t\tconst nextModel = model;\n\t\t\tawait this.sessionManager.appendModelChange(nextModel.provider, nextModel.id);\n\t\t\tthis._clearFallbackModelScope?.();\n\t\t\tthis.agent.state.model = nextModel;\n\t\t\tif (options.persist) {\n\t\t\t\tsettingsWriteOwner.run(this, () =>\n\t\t\t\t\tthis.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id),\n\t\t\t\t);\n\t\t\t\taddPersistedDefaultToNonEmptyScope(this, nextModel);\n\t\t\t}\n\n\t\t\t// Re-clamp thinking level for new model's capabilities\n\t\t\tawait applyThinkingLevel.call(this, thinkingLevel, options);\n\t\t\tthis._refreshBaseSystemPromptFromActiveTools();\n\n\t\t\tthis._emitModelChanged(nextModel, previousModel, \"set\");\n\t\t\treturn previousModel;\n\t\t});\n\t\t// Extension callbacks may themselves request a model change; never hold the queue across them.\n\t\tawait this._emitModelSelect(model, previousModel, \"set\");\n\t});\n}\n\n/**\n * Cycle to next/previous model.\n * Uses scoped models (from --models flag) if available, otherwise all available models.\n * @param direction - \"forward\" (default) or \"backward\"\n * @returns The new model info, or undefined if only one model available\n */\n\nexport async function cycleModel(\n\tthis: AgentSession,\n\tdirection: \"forward\" | \"backward\" = \"forward\",\n\toptions: ModelMutationOptions = {},\n): Promise<ModelCycleResult | undefined> {\n\tassertSessionOpen(this);\n\treturn trackSessionWork(this, async () => {\n\t\tconst { previousModel, result } = await serializeSessionMutation(this, async () => {\n\t\t\tconst previousModel = this.model;\n\t\t\tconst result =\n\t\t\t\tthis._scopedModels.length > 0\n\t\t\t\t\t? await this._cycleScopedModel(direction, options)\n\t\t\t\t\t: await this._cycleAvailableModel(direction, options);\n\t\t\treturn { previousModel, result };\n\t\t});\n\t\tif (result) await this._emitModelSelect(result.model, previousModel, \"cycle\");\n\t\treturn result;\n\t});\n}\n\nexport async function _cycleScopedModel(\n\tthis: AgentSession,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst scopedModels = this._scopedModels.filter((scoped) =>\n\t\tthis._modelRuntime.hasConfiguredAuth(scoped.model.provider),\n\t);\n\tif (scopedModels.length <= 1) return undefined;\n\n\tconst currentModel = this.model;\n\tlet currentIndex = scopedModels.findIndex((sm) => modelsAreEqual(sm.model, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = scopedModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst next = scopedModels[nextIndex];\n\tconst thinkingLevel = this._getThinkingLevelForModelSwitch(next.model, next.thinkingLevel);\n\tconst nextModel = next.model;\n\n\t// An explicit cycle finishes any active fallback lifecycle before switching.\n\tawait this.sessionManager.appendModelChange(nextModel.provider, nextModel.id);\n\tthis._clearFallbackModelScope?.();\n\tthis.agent.state.model = nextModel;\n\tif (options.persist) {\n\t\tsettingsWriteOwner.run(this, () =>\n\t\t\tthis.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id),\n\t\t);\n\t\taddPersistedDefaultToNonEmptyScope(this, nextModel);\n\t}\n\n\t// Apply thinking level.\n\t// - Explicit scoped model thinking level overrides current session level\n\t// - Undefined scoped model thinking level inherits the current session preference\n\t// setThinkingLevel clamps to model capabilities.\n\tawait applyThinkingLevel.call(this, thinkingLevel, options);\n\tthis._refreshBaseSystemPromptFromActiveTools();\n\n\tthis._emitModelChanged(nextModel, currentModel, \"cycle\");\n\n\treturn { model: nextModel, thinkingLevel: this.thinkingLevel, isScoped: true };\n}\n\nexport async function _cycleAvailableModel(\n\tthis: AgentSession,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableModels = await this._modelRuntime.getAvailableSnapshot();\n\tassertSessionOpen(this);\n\tif (availableModels.length <= 1) return undefined;\n\n\tconst currentModel = this.model;\n\tlet currentIndex = availableModels.findIndex((m) => modelsAreEqual(m, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = availableModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst selectedModel = availableModels[nextIndex];\n\n\tconst thinkingLevel = this._getThinkingLevelForModelSwitch(selectedModel);\n\t// An explicit cycle finishes any active fallback lifecycle before switching.\n\tawait this.sessionManager.appendModelChange(selectedModel.provider, selectedModel.id);\n\tthis._clearFallbackModelScope?.();\n\tthis.agent.state.model = selectedModel;\n\tif (options.persist) {\n\t\tsettingsWriteOwner.run(this, () =>\n\t\t\tthis.settingsManager.setDefaultModelAndProvider(selectedModel.provider, selectedModel.id),\n\t\t);\n\t\taddPersistedDefaultToNonEmptyScope(this, selectedModel);\n\t}\n\n\t// Re-clamp thinking level for new model's capabilities\n\tawait applyThinkingLevel.call(this, thinkingLevel, options);\n\tthis._refreshBaseSystemPromptFromActiveTools();\n\n\tthis._emitModelChanged(selectedModel, currentModel, \"cycle\");\n\n\treturn { model: selectedModel, thinkingLevel: this.thinkingLevel, isScoped: false };\n}\n\n// =========================================================================\n// Thinking Level Management\n// =========================================================================\n\n/**\n * Set thinking level.\n * Clamps to model capabilities based on available thinking levels.\n * Saves to session and settings only if the level actually changes.\n */\n\nfunction persistThinkingLevel(session: AgentSession, level: ThinkingLevel): void {\n\tif (session.model) {\n\t\tsettingsWriteOwner.run(session, () =>\n\t\t\tsession.settingsManager.setModelThinkingLevel(session.model!.provider, session.model!.id, level),\n\t\t);\n\t}\n\tsettingsWriteOwner.run(session, () => session.settingsManager.setDefaultThinkingLevel(level));\n}\n\nexport async function setThinkingLevel(\n\tthis: AgentSession,\n\tlevel: ThinkingLevel,\n\toptions: ModelMutationOptions = {},\n): Promise<void> {\n\treturn trackSessionWork(this, () =>\n\t\tserializeSessionMutation(this, () => applyThinkingLevel.call(this, level, options)),\n\t);\n}\n\nasync function applyThinkingLevel(\n\tthis: AgentSession,\n\tlevel: ThinkingLevel,\n\toptions: ModelMutationOptions,\n): Promise<void> {\n\tconst availableLevels = this.getAvailableThinkingLevels();\n\tconst effectiveLevel = availableLevels.includes(level) ? level : this._clampThinkingLevel(level, availableLevels);\n\n\t// Only persist if actually changing\n\tconst previousLevel = this.agent.state.thinkingLevel;\n\tconst isChanging = effectiveLevel !== previousLevel;\n\n\tif (isChanging) {\n\t\t// A reasoning choice is not a model choice, so it leaves the selected\n\t\t// fallback model in place. Keep the active lifecycle open until the turn\n\t\t// settles. (A no-op assignment from a registry refresh changes nothing.)\n\t\tawait this.sessionManager.appendThinkingLevelChange(effectiveLevel);\n\t\tthis.agent.state.thinkingLevel = effectiveLevel;\n\t\tif (options.persist) persistThinkingLevel(this, effectiveLevel);\n\t\tif (this._fallbackOriginModel !== undefined) this._fallbackOriginThinkingLevel = effectiveLevel;\n\t\tthis._refreshBaseSystemPromptFromActiveTools();\n\t\tthis._emit({ type: \"thinking_level_changed\", level: effectiveLevel });\n\t\tvoid this._extensionRunner.emit({\n\t\t\ttype: \"thinking_level_select\",\n\t\t\tlevel: effectiveLevel,\n\t\t\tpreviousLevel,\n\t\t});\n\t} else if (options.persist) {\n\t\tpersistThinkingLevel(this, effectiveLevel);\n\t}\n}\n\n/**\n * Cycle to next thinking level.\n * @returns New level, or undefined if model doesn't support thinking\n */\n\nexport async function cycleThinkingLevel(\n\tthis: AgentSession,\n\toptions: ModelMutationOptions = {},\n): Promise<ThinkingLevel | undefined> {\n\treturn trackSessionWork(this, () =>\n\t\tserializeSessionMutation(this, async () => {\n\t\t\tif (!this.supportsThinking()) return undefined;\n\n\t\t\tconst levels = this.getAvailableThinkingLevels();\n\t\t\tconst currentIndex = levels.indexOf(this.thinkingLevel);\n\t\t\tconst nextIndex = (currentIndex + 1) % levels.length;\n\t\t\tconst nextLevel = levels[nextIndex];\n\n\t\t\tawait applyThinkingLevel.call(this, nextLevel, options);\n\t\t\treturn nextLevel;\n\t\t}),\n\t);\n}\n\n/**\n * Get available thinking levels for current model.\n * The provider will clamp to what the specific model supports internally.\n */\n\nexport function getAvailableThinkingLevels(this: AgentSession): ThinkingLevel[] {\n\tif (!this.model) return THINKING_LEVELS;\n\treturn getSupportedThinkingLevels(this.model) as ThinkingLevel[];\n}\n\n/**\n * Check if current model supports thinking/reasoning.\n */\n\nexport function supportsThinking(this: AgentSession): boolean {\n\treturn !!this.model?.reasoning;\n}\n\nexport function _getThinkingLevelForModelSwitch(\n\tthis: AgentSession,\n\ttargetModel?: Model<Api>,\n\texplicitLevel?: ThinkingLevel,\n): ThinkingLevel {\n\tif (explicitLevel !== undefined) {\n\t\treturn explicitLevel;\n\t}\n\tif (targetModel) {\n\t\tconst perModel = this.settingsManager.getModelThinkingLevel(targetModel.provider, targetModel.id);\n\t\tif (perModel !== undefined) return perModel;\n\t}\n\tif (!this.supportsThinking()) {\n\t\treturn this.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\treturn this.thinkingLevel;\n}\n\nexport function _clampThinkingLevel(\n\tthis: AgentSession,\n\tlevel: ThinkingLevel,\n\t_availableLevels: ThinkingLevel[],\n): ThinkingLevel {\n\treturn this.model ? (clampThinkingLevel(this.model, level) as ThinkingLevel) : \"off\";\n}\n\n// =========================================================================\n// Queue Mode Management\n// =========================================================================\n\n/**\n * Set steering message mode.\n * Saves to settings.\n */\n\nexport const agentSessionModelsMethods = {\n\t_getRequiredRequestAuth,\n\t_emitModelChanged,\n\t_emitModelSelect,\n\tsetModel,\n\tcycleModel,\n\t_cycleScopedModel,\n\t_cycleAvailableModel,\n\tsetThinkingLevel,\n\tcycleThinkingLevel,\n\tgetAvailableThinkingLevels,\n\tsupportsThinking,\n\t_getThinkingLevelForModelSwitch,\n\t_clampThinkingLevel,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-post-tool-compaction.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-post-tool-compaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,KAAK,EAAE,2BAA2B,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-session-post-tool-compaction.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-post-tool-compaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,KAAK,EAAE,2BAA2B,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE9F,OAAO,EAAwC,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAY5G,oFAAoF;AACpF,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,YAAY,EAAE,EACxB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CAoHzB;AACD,mFAAmF;AACnF,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAmD/G;AAED,MAAM,WAAW,8BAA8B;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,wBAAwB,CAAC;CACjC;AAED,eAAO,MAAM,qCAAqC;;;CAGjD,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createAutoCompactionCompletion, hasPendingManualCompactionTakeover } from "./agent-session-auto-compaction.js";
|
|
2
2
|
import { emitSessionCompactFailed } from "./agent-session-compaction.js";
|
|
3
|
+
import { authForStream } from "./agent-session-models.js";
|
|
3
4
|
import { estimateContextTokens, shouldCompact } from "./compaction/index.js";
|
|
4
5
|
import { scrubPreCompactionAssistantUsage } from "./provider-context-usage.js";
|
|
5
6
|
function postToolFailureMessage(error) {
|
|
@@ -55,7 +56,7 @@ export async function _preflightPostToolContext(messages, signal) {
|
|
|
55
56
|
const result = await this._applyVerbatimCompaction({
|
|
56
57
|
resolvePlannerAuth: async (candidate) => {
|
|
57
58
|
const auth = await this._getRequiredRequestAuth(candidate);
|
|
58
|
-
return auth.apiKey || auth.headers ? auth : undefined;
|
|
59
|
+
return auth.apiKey || auth.headers ? authForStream(this, auth) : undefined;
|
|
59
60
|
},
|
|
60
61
|
abortController,
|
|
61
62
|
backupLabel: "auto-compact",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-post-tool-compaction.js","sourceRoot":"","sources":["../../src/core/agent-session-post-tool-compaction.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { createAutoCompactionCompletion, hasPendingManualCompactionTakeover } from \"./agent-session-auto-compaction.ts\";\nimport { emitSessionCompactFailed } from \"./agent-session-compaction.ts\";\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport { estimateContextTokens, shouldCompact, type VerbatimCompactionResult } from \"./compaction/index.ts\";\nimport { scrubPreCompactionAssistantUsage } from \"./provider-context-usage.ts\";\n\nfunction postToolFailureMessage(error: unknown): string {\n\tconst detail = error instanceof Error ? error.message : String(error);\n\treturn `Post-tool context compaction failed before the next provider request: ${detail}`;\n}\n\nfunction hardLimitMessage(projectedTokens: number, hardInputLimit: number): string {\n\treturn `Post-tool context remains over the provider hard input limit after compaction (${projectedTokens} > ${hardInputLimit} tokens); the next provider request was not sent.`;\n}\n\n/** Compact tool-expanded context without scheduling a second Agent continuation. */\nexport async function _preflightPostToolContext(\n\tthis: AgentSession,\n\tmessages: AgentMessage[],\n\tsignal?: AbortSignal,\n): Promise<AgentMessage[]> {\n\tconst model = this.model;\n\tconst settings = this.settingsManager.getCompactionSettings(model);\n\tif (!model || !settings.enabled) return messages;\n\n\tconst hardInputLimit = model.contextWindow;\n\tconst projectedTokens = estimateContextTokens(messages).tokens;\n\tif (!shouldCompact(projectedTokens, hardInputLimit, settings)) return messages;\n\t// Only a context that genuinely will not fit may clear a sub-minimum region.\n\t// The threshold sits at `contextWindow - reserveTokens`, well below the hard\n\t// limit, so a crossing alone is no reason to destroy context.\n\tconst overHardLimit = hardInputLimit > 0 && projectedTokens > hardInputLimit;\n\n\t// Tool-result persistence is ordered on AgentSession's event queue, while Pi\n\t// may reach its next-turn hook as soon as its own listener barrier settles.\n\tawait this._agentEventQueue;\n\t// Manual compaction owns the next boundary and aborts the active run before\n\t// planning. Do not append a competing mid-turn boundary in that brief gap.\n\tif (this._compactionAbortController !== undefined || this._manualCompactionPromise !== undefined) {\n\t\treturn messages;\n\t}\n\tif (this._autoCompactionAbortController) {\n\t\tconst message = postToolFailureMessage(\"another automatic compaction is already active\");\n\t\tthis._postToolCompactionPreflightError = message;\n\t\tthrow new Error(message);\n\t}\n\n\tconst abortController = new AbortController();\n\tconst completion = createAutoCompactionCompletion();\n\tlet fromExtension = false;\n\tconst relayAbort = () => abortController.abort();\n\tsignal?.addEventListener(\"abort\", relayAbort, { once: true });\n\tif (signal?.aborted) abortController.abort();\n\t// Ownership publication and the synchronous `compaction_start` emission live\n\t// inside the cleanup scope: `_emit` runs subscribers synchronously, so a\n\t// throwing listener would otherwise leave ownership set with no `finally` to\n\t// clear it. A manual takeover also awaits this settlement before it writes.\n\ttry {\n\t\tthis._autoCompactionAbortController = abortController;\n\t\tthis._autoCompactionCompletion = completion.promise;\n\t\tthis._compactionReason = \"threshold\";\n\t\tthis._emit({ type: \"compaction_start\", reason: \"threshold\", midTurn: true });\n\n\t\tconst result = await this._applyVerbatimCompaction({\n\t\t\tresolvePlannerAuth: async (candidate) => {\n\t\t\t\tconst auth = await this._getRequiredRequestAuth(candidate);\n\t\t\t\treturn auth.apiKey || auth.headers ? auth : undefined;\n\t\t\t},\n\t\t\tabortController,\n\t\t\tbackupLabel: \"auto-compact\",\n\t\t\treason: \"threshold\",\n\t\t\tonCompactionSource: (value) => {\n\t\t\t\tfromExtension = value;\n\t\t\t},\n\t\t\t// A mid-turn planner failure must reach the fresh rung so the active\n\t\t\t// turn can continue. `_applyVerbatimCompaction` still treats a fitting\n\t\t\t// no-preparation threshold crossing as a safe no-op.\n\t\t\turgency: \"load_bearing\",\n\t\t\t...(overHardLimit ? { allowSmallRegion: true } : {}),\n\t\t});\n\t\tif (!result) {\n\t\t\t// Nothing was compactable and the projected context still fits, so the\n\t\t\t// follow-up request can be sent unchanged. That is a successful no-op,\n\t\t\t// not a failure: raising here is what killed the active turn.\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: \"threshold\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\tmidTurn: true,\n\t\t\t\t...(hasPendingManualCompactionTakeover.call(this) ? { manualTakeoverPending: true } : {}),\n\t\t\t});\n\t\t\treturn messages;\n\t\t}\n\n\t\tthis._pendingPostToolCompactionGuard = { hardInputLimit, result };\n\t\t// `AgentState.messages` has an asymmetric accessor pair: the setter copies,\n\t\t// while the getter returns the live internal array. Return a separate array\n\t\t// so the loop and reducer cannot append the next message twice.\n\t\treturn this.agent.state.messages.slice();\n\t} catch (error) {\n\t\tconst detail = error instanceof Error ? error.message : String(error);\n\t\tconst aborted =\n\t\t\tabortController.signal.aborted ||\n\t\t\tdetail === \"Compaction cancelled\" ||\n\t\t\t(error instanceof Error && error.name === \"AbortError\");\n\t\tconst errorMessage = aborted\n\t\t\t? \"Post-tool context compaction was cancelled before the next provider request.\"\n\t\t\t: postToolFailureMessage(error);\n\t\tthis._postToolCompactionPreflightError = errorMessage;\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason: \"threshold\",\n\t\t\tresult: undefined,\n\t\t\taborted,\n\t\t\twillRetry: false,\n\t\t\tmidTurn: true,\n\t\t\t...(hasPendingManualCompactionTakeover.call(this) ? { manualTakeoverPending: true } : {}),\n\t\t\t...(aborted ? {} : { errorMessage }),\n\t\t});\n\t\tawait emitSessionCompactFailed(this, {\n\t\t\treason: \"threshold\",\n\t\t\t...(aborted ? {} : { errorMessage }),\n\t\t\taborted,\n\t\t\twillRetry: false,\n\t\t\tfromExtension,\n\t\t});\n\t\tthrow new Error(errorMessage, { cause: error });\n\t} finally {\n\t\tsignal?.removeEventListener(\"abort\", relayAbort);\n\t\tif (this._autoCompactionAbortController === abortController) this._autoCompactionAbortController = undefined;\n\t\tcompletion.resolve();\n\t\tif (this._autoCompactionCompletion === completion.promise) this._autoCompactionCompletion = undefined;\n\t\tif (this._compactionReason === \"threshold\") this._compactionReason = undefined;\n\t}\n}\n/** Gate the transformed message context immediately before provider conversion. */\nexport function _finishPostToolCompactionPreflight(this: AgentSession, messages: AgentMessage[]): AgentMessage[] {\n\tconst pending = this._pendingPostToolCompactionGuard;\n\tif (!pending) return messages;\n\tthis._pendingPostToolCompactionGuard = undefined;\n\n\tconst providerBoundMessages = scrubPreCompactionAssistantUsage(messages, this.sessionManager.getBranch());\n\t// Mid-turn 0.86 system patches are appended after compaction and before this\n\t// gate. Pre-compaction assistant usage would otherwise keep the old prompt\n\t// size and reject a compacted follow-up that actually fits.\n\tconst projectedTokens = estimateContextTokens(\n\t\tproviderBoundMessages.map((message) => {\n\t\t\tif (message.role !== \"assistant\" || !(\"usage\" in message) || !message.usage) return message;\n\t\t\treturn {\n\t\t\t\t...message,\n\t\t\t\tusage: {\n\t\t\t\t\t...message.usage,\n\t\t\t\t\tinput: 0,\n\t\t\t\t\toutput: 0,\n\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t},\n\t\t\t};\n\t\t}),\n\t).tokens;\n\tif (projectedTokens > pending.hardInputLimit) {\n\t\tconst errorMessage = hardLimitMessage(projectedTokens, pending.hardInputLimit);\n\t\tthis._postToolCompactionPreflightError = errorMessage;\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason: \"threshold\",\n\t\t\tresult: pending.result,\n\t\t\taborted: false,\n\t\t\twillRetry: false,\n\t\t\tmidTurn: true,\n\t\t\terrorMessage,\n\t\t\t...(hasPendingManualCompactionTakeover.call(this) ? { manualTakeoverPending: true } : {}),\n\t\t});\n\t\tthrow new Error(errorMessage);\n\t}\n\n\tthis._emit({\n\t\ttype: \"compaction_end\",\n\t\treason: \"threshold\",\n\t\tresult: pending.result,\n\t\taborted: false,\n\t\twillRetry: false,\n\t\tmidTurn: true,\n\t\t...(hasPendingManualCompactionTakeover.call(this) ? { manualTakeoverPending: true } : {}),\n\t});\n\treturn providerBoundMessages;\n}\n\nexport interface PendingPostToolCompactionGuard {\n\thardInputLimit: number;\n\tresult: VerbatimCompactionResult;\n}\n\nexport const agentSessionPostToolCompactionMethods = {\n\t_preflightPostToolContext,\n\t_finishPostToolCompactionPreflight,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-post-tool-compaction.js","sourceRoot":"","sources":["../../src/core/agent-session-post-tool-compaction.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { createAutoCompactionCompletion, hasPendingManualCompactionTakeover } from \"./agent-session-auto-compaction.ts\";\nimport { emitSessionCompactFailed } from \"./agent-session-compaction.ts\";\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport { authForStream } from \"./agent-session-models.ts\";\nimport { estimateContextTokens, shouldCompact, type VerbatimCompactionResult } from \"./compaction/index.ts\";\nimport { scrubPreCompactionAssistantUsage } from \"./provider-context-usage.ts\";\n\nfunction postToolFailureMessage(error: unknown): string {\n\tconst detail = error instanceof Error ? error.message : String(error);\n\treturn `Post-tool context compaction failed before the next provider request: ${detail}`;\n}\n\nfunction hardLimitMessage(projectedTokens: number, hardInputLimit: number): string {\n\treturn `Post-tool context remains over the provider hard input limit after compaction (${projectedTokens} > ${hardInputLimit} tokens); the next provider request was not sent.`;\n}\n\n/** Compact tool-expanded context without scheduling a second Agent continuation. */\nexport async function _preflightPostToolContext(\n\tthis: AgentSession,\n\tmessages: AgentMessage[],\n\tsignal?: AbortSignal,\n): Promise<AgentMessage[]> {\n\tconst model = this.model;\n\tconst settings = this.settingsManager.getCompactionSettings(model);\n\tif (!model || !settings.enabled) return messages;\n\n\tconst hardInputLimit = model.contextWindow;\n\tconst projectedTokens = estimateContextTokens(messages).tokens;\n\tif (!shouldCompact(projectedTokens, hardInputLimit, settings)) return messages;\n\t// Only a context that genuinely will not fit may clear a sub-minimum region.\n\t// The threshold sits at `contextWindow - reserveTokens`, well below the hard\n\t// limit, so a crossing alone is no reason to destroy context.\n\tconst overHardLimit = hardInputLimit > 0 && projectedTokens > hardInputLimit;\n\n\t// Tool-result persistence is ordered on AgentSession's event queue, while Pi\n\t// may reach its next-turn hook as soon as its own listener barrier settles.\n\tawait this._agentEventQueue;\n\t// Manual compaction owns the next boundary and aborts the active run before\n\t// planning. Do not append a competing mid-turn boundary in that brief gap.\n\tif (this._compactionAbortController !== undefined || this._manualCompactionPromise !== undefined) {\n\t\treturn messages;\n\t}\n\tif (this._autoCompactionAbortController) {\n\t\tconst message = postToolFailureMessage(\"another automatic compaction is already active\");\n\t\tthis._postToolCompactionPreflightError = message;\n\t\tthrow new Error(message);\n\t}\n\n\tconst abortController = new AbortController();\n\tconst completion = createAutoCompactionCompletion();\n\tlet fromExtension = false;\n\tconst relayAbort = () => abortController.abort();\n\tsignal?.addEventListener(\"abort\", relayAbort, { once: true });\n\tif (signal?.aborted) abortController.abort();\n\t// Ownership publication and the synchronous `compaction_start` emission live\n\t// inside the cleanup scope: `_emit` runs subscribers synchronously, so a\n\t// throwing listener would otherwise leave ownership set with no `finally` to\n\t// clear it. A manual takeover also awaits this settlement before it writes.\n\ttry {\n\t\tthis._autoCompactionAbortController = abortController;\n\t\tthis._autoCompactionCompletion = completion.promise;\n\t\tthis._compactionReason = \"threshold\";\n\t\tthis._emit({ type: \"compaction_start\", reason: \"threshold\", midTurn: true });\n\n\t\tconst result = await this._applyVerbatimCompaction({\n\t\t\tresolvePlannerAuth: async (candidate) => {\n\t\t\t\tconst auth = await this._getRequiredRequestAuth(candidate);\n\t\t\t\treturn auth.apiKey || auth.headers ? authForStream(this, auth) : undefined;\n\t\t\t},\n\t\t\tabortController,\n\t\t\tbackupLabel: \"auto-compact\",\n\t\t\treason: \"threshold\",\n\t\t\tonCompactionSource: (value) => {\n\t\t\t\tfromExtension = value;\n\t\t\t},\n\t\t\t// A mid-turn planner failure must reach the fresh rung so the active\n\t\t\t// turn can continue. `_applyVerbatimCompaction` still treats a fitting\n\t\t\t// no-preparation threshold crossing as a safe no-op.\n\t\t\turgency: \"load_bearing\",\n\t\t\t...(overHardLimit ? { allowSmallRegion: true } : {}),\n\t\t});\n\t\tif (!result) {\n\t\t\t// Nothing was compactable and the projected context still fits, so the\n\t\t\t// follow-up request can be sent unchanged. That is a successful no-op,\n\t\t\t// not a failure: raising here is what killed the active turn.\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: \"threshold\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\tmidTurn: true,\n\t\t\t\t...(hasPendingManualCompactionTakeover.call(this) ? { manualTakeoverPending: true } : {}),\n\t\t\t});\n\t\t\treturn messages;\n\t\t}\n\n\t\tthis._pendingPostToolCompactionGuard = { hardInputLimit, result };\n\t\t// `AgentState.messages` has an asymmetric accessor pair: the setter copies,\n\t\t// while the getter returns the live internal array. Return a separate array\n\t\t// so the loop and reducer cannot append the next message twice.\n\t\treturn this.agent.state.messages.slice();\n\t} catch (error) {\n\t\tconst detail = error instanceof Error ? error.message : String(error);\n\t\tconst aborted =\n\t\t\tabortController.signal.aborted ||\n\t\t\tdetail === \"Compaction cancelled\" ||\n\t\t\t(error instanceof Error && error.name === \"AbortError\");\n\t\tconst errorMessage = aborted\n\t\t\t? \"Post-tool context compaction was cancelled before the next provider request.\"\n\t\t\t: postToolFailureMessage(error);\n\t\tthis._postToolCompactionPreflightError = errorMessage;\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason: \"threshold\",\n\t\t\tresult: undefined,\n\t\t\taborted,\n\t\t\twillRetry: false,\n\t\t\tmidTurn: true,\n\t\t\t...(hasPendingManualCompactionTakeover.call(this) ? { manualTakeoverPending: true } : {}),\n\t\t\t...(aborted ? {} : { errorMessage }),\n\t\t});\n\t\tawait emitSessionCompactFailed(this, {\n\t\t\treason: \"threshold\",\n\t\t\t...(aborted ? {} : { errorMessage }),\n\t\t\taborted,\n\t\t\twillRetry: false,\n\t\t\tfromExtension,\n\t\t});\n\t\tthrow new Error(errorMessage, { cause: error });\n\t} finally {\n\t\tsignal?.removeEventListener(\"abort\", relayAbort);\n\t\tif (this._autoCompactionAbortController === abortController) this._autoCompactionAbortController = undefined;\n\t\tcompletion.resolve();\n\t\tif (this._autoCompactionCompletion === completion.promise) this._autoCompactionCompletion = undefined;\n\t\tif (this._compactionReason === \"threshold\") this._compactionReason = undefined;\n\t}\n}\n/** Gate the transformed message context immediately before provider conversion. */\nexport function _finishPostToolCompactionPreflight(this: AgentSession, messages: AgentMessage[]): AgentMessage[] {\n\tconst pending = this._pendingPostToolCompactionGuard;\n\tif (!pending) return messages;\n\tthis._pendingPostToolCompactionGuard = undefined;\n\n\tconst providerBoundMessages = scrubPreCompactionAssistantUsage(messages, this.sessionManager.getBranch());\n\t// Mid-turn 0.86 system patches are appended after compaction and before this\n\t// gate. Pre-compaction assistant usage would otherwise keep the old prompt\n\t// size and reject a compacted follow-up that actually fits.\n\tconst projectedTokens = estimateContextTokens(\n\t\tproviderBoundMessages.map((message) => {\n\t\t\tif (message.role !== \"assistant\" || !(\"usage\" in message) || !message.usage) return message;\n\t\t\treturn {\n\t\t\t\t...message,\n\t\t\t\tusage: {\n\t\t\t\t\t...message.usage,\n\t\t\t\t\tinput: 0,\n\t\t\t\t\toutput: 0,\n\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t},\n\t\t\t};\n\t\t}),\n\t).tokens;\n\tif (projectedTokens > pending.hardInputLimit) {\n\t\tconst errorMessage = hardLimitMessage(projectedTokens, pending.hardInputLimit);\n\t\tthis._postToolCompactionPreflightError = errorMessage;\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason: \"threshold\",\n\t\t\tresult: pending.result,\n\t\t\taborted: false,\n\t\t\twillRetry: false,\n\t\t\tmidTurn: true,\n\t\t\terrorMessage,\n\t\t\t...(hasPendingManualCompactionTakeover.call(this) ? { manualTakeoverPending: true } : {}),\n\t\t});\n\t\tthrow new Error(errorMessage);\n\t}\n\n\tthis._emit({\n\t\ttype: \"compaction_end\",\n\t\treason: \"threshold\",\n\t\tresult: pending.result,\n\t\taborted: false,\n\t\twillRetry: false,\n\t\tmidTurn: true,\n\t\t...(hasPendingManualCompactionTakeover.call(this) ? { manualTakeoverPending: true } : {}),\n\t});\n\treturn providerBoundMessages;\n}\n\nexport interface PendingPostToolCompactionGuard {\n\thardInputLimit: number;\n\tresult: VerbatimCompactionResult;\n}\n\nexport const agentSessionPostToolCompactionMethods = {\n\t_preflightPostToolContext,\n\t_finishPostToolCompactionPreflight,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-summary.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-summary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,2BAA2B,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-session-summary.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-summary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,2BAA2B,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAS9F,gGAAgG;AAChG,MAAM,MAAM,iBAAiB,GAAG;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB9E;AAiID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAe5D;AAED,eAAO,MAAM,0BAA0B;;;CAAwD,CAAC"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Runs once the agent goes idle, decides whether a fresh summary is worth generating, and
|
|
5
5
|
* persists the result. Generation itself lives in core/compaction/session-summarization.ts.
|
|
6
6
|
*/
|
|
7
|
+
import { authForStream } from "./agent-session-models.js";
|
|
7
8
|
import { generateSessionSummary } from "./compaction/index.js";
|
|
8
9
|
import { sessionGenerationClosing, sessionLifetime, trackSessionWork } from "./session-lifecycle-work.js";
|
|
9
10
|
import { getLastConversationMessageId, getLatestSessionSummary } from "./session-manager-entries.js";
|
|
@@ -108,7 +109,7 @@ async function generateOwnedSessionSummary() {
|
|
|
108
109
|
});
|
|
109
110
|
run = { throughId, done };
|
|
110
111
|
this._sessionSummaryRun = run;
|
|
111
|
-
const { apiKey, headers, baseUrl } = await this._getRequiredRequestAuth(model);
|
|
112
|
+
const { apiKey, headers, baseUrl } = authForStream(this, await this._getRequiredRequestAuth(model));
|
|
112
113
|
// Disposal or a newer turn can land while credentials resolve; nothing past this point
|
|
113
114
|
// should reach the provider.
|
|
114
115
|
if (this._disposed || signal.aborted)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-summary.js","sourceRoot":"","sources":["../../src/core/agent-session-summary.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session summary generation for the resume picker.\n *\n * Runs once the agent goes idle, decides whether a fresh summary is worth generating, and\n * persists the result. Generation itself lives in core/compaction/session-summarization.ts.\n */\n\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport { generateSessionSummary } from \"./compaction/index.ts\";\nimport { sessionGenerationClosing, sessionLifetime, trackSessionWork } from \"./session-lifecycle-work.ts\";\nimport { getLastConversationMessageId, getLatestSessionSummary } from \"./session-manager-entries.ts\";\n\n/** Sessions shorter than this are already legible from their first message. */\nconst MIN_ENTRIES_FOR_SUMMARY = 4;\n\n/** A summary request in flight, published so a launch describing the same state can join it. */\nexport type SessionSummaryRun = {\n\t/** The conversation state this request describes. */\n\treadonly throughId: string;\n\t/** Settles when the request finishes, whatever the outcome. */\n\treadonly done: Promise<void>;\n};\n\nexport function _maybeGenerateSessionSummary(this: AgentSession): Promise<void> {\n\tif (this._disposed || sessionGenerationClosing.has(this)) return Promise.resolve();\n\treturn trackSessionWork(this, async () => {\n\t\tconst signal = sessionLifetime(this);\n\t\tlet onAbort!: () => void;\n\t\tconst aborted = new Promise<void>((resolve) => {\n\t\t\tonAbort = resolve;\n\t\t\tif (signal.aborted) resolve();\n\t\t\telse signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t});\n\t\ttry {\n\t\t\tawait Promise.race([generateOwnedSessionSummary.call(this), aborted]);\n\t\t} finally {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t});\n}\n\nasync function generateOwnedSessionSummary(this: AgentSession): Promise<void> {\n\t// Held rather than read from the session in `finally`, so an early return can never clear a\n\t// controller or run belonging to a different launch.\n\tlet controller: AbortController | undefined;\n\tlet run: SessionSummaryRun | undefined;\n\tlet finish: (() => void) | undefined;\n\ttry {\n\t\t// --- Bail-outs that cannot change while we wait ---------------------------------\n\t\tif (this._disposed) return;\n\t\tif (!this.settingsManager.getSessionSummarySettings().enabled) return;\n\n\t\t// One-shot scripted runs should not pay for a background call; the process may exit before\n\t\t// it lands. \"tui\" and \"rpc\" are the resumable, interactive modes.\n\t\tif (this._extensionMode === \"print\" || this._extensionMode === \"json\") return;\n\n\t\tconst model = this.model;\n\t\tif (!model) return;\n\n\t\t// Workflow-stage sessions are excluded from /resume entirely.\n\t\tif (this.sessionManager.getHeader()?.internal) return;\n\n\t\t// Claim the launch before waiting, so a later turn supersedes this one while both are\n\t\t// parked below.\n\t\tconst sessionSummaryToken = ++this._sessionSummaryToken;\n\n\t\t// `agent_end` fires while the agent still reports isStreaming, and that flag survives the\n\t\t// entire microtask queue — it only clears a macrotask later. Testing it here without\n\t\t// waiting made generation depend on whether `_checkCompaction` happened to cross a\n\t\t// macrotask boundary: green under test, silently skipped in the real TUI, and nothing\n\t\t// retries it.\n\t\tawait this.agent.waitForIdle();\n\n\t\tif (this._disposed) return;\n\t\tif (this._sessionSummaryToken !== sessionSummaryToken) return;\n\t\tif (this.isStreaming || this.isCompacting) return;\n\n\t\tconst branch = this.sessionManager.getBranch();\n\t\tif (branch.length < MIN_ENTRIES_FOR_SUMMARY) return;\n\n\t\tconst throughId = getLastConversationMessageId(branch);\n\t\tif (!throughId) return;\n\n\t\t// On a resumed session the in-memory anchor starts empty, so fall back to the persisted\n\t\t// summary. Without this the first idle after every resume regenerates a summary that is\n\t\t// already current.\n\t\tconst lastSummarized =\n\t\t\tthis._lastSummarizedMessageId ??\n\t\t\tgetLatestSessionSummary(this.sessionManager.getEntries())?.summarizedThroughId;\n\t\tif (throughId === lastSummarized) return;\n\n\t\t// A request already covering this exact conversation state will store the line this launch\n\t\t// would ask for, so wait for it instead of aborting it and paying for a second one.\n\t\t// Overlap is routine rather than exceptional: every turn schedules a launch, and the\n\t\t// previous turn's can still be in flight when the next one wakes.\n\t\tconst inFlight = this._sessionSummaryRun;\n\t\tif (inFlight !== undefined && inFlight.throughId === throughId) {\n\t\t\tawait inFlight.done;\n\t\t\treturn;\n\t\t}\n\n\t\t// Anything still running describes an older conversation state, so retire it and take the\n\t\t// controller. Abort the previous one directly rather than via abortSessionSummary(), which\n\t\t// bumps the token and would invalidate the claim made above. The controller lives on the\n\t\t// session so the prompt, tree-navigation, and shutdown paths can reach it.\n\t\tthis._sessionSummaryAbortController?.abort();\n\t\tcontroller = new AbortController();\n\t\tthis._sessionSummaryAbortController = controller;\n\t\tconst signal = AbortSignal.any([controller.signal, sessionLifetime(this)]);\n\n\t\t// Publish this run before the first await that another launch can overlap. From here on\n\t\t// ownership of the slot, not the token, is what licenses a write: a joiner bumps the token\n\t\t// on its way in, and must not invalidate the very run it is waiting for.\n\t\t// Hand-rolled deferred rather than Promise.withResolvers: coding-agent is the one compiled\n\t\t// package and its lib target predates ES2024, the same reason `_retryPromise` is built this\n\t\t// way. The executor runs synchronously, so `finish` is assigned before the constructor returns.\n\t\tconst done = new Promise<void>((resolve) => {\n\t\t\tfinish = resolve;\n\t\t});\n\t\trun = { throughId, done };\n\t\tthis._sessionSummaryRun = run;\n\n\t\tconst { apiKey, headers, baseUrl } = await this._getRequiredRequestAuth(model);\n\n\t\t// Disposal or a newer turn can land while credentials resolve; nothing past this point\n\t\t// should reach the provider.\n\t\tif (this._disposed || signal.aborted) return;\n\t\tif (this._sessionSummaryRun !== run) return;\n\n\t\tconst result = await generateSessionSummary(branch, {\n\t\t\tmodel,\n\t\t\tapiKey,\n\t\t\theaders,\n\t\t\tbaseUrl,\n\t\t\tsignal,\n\t\t\tstreamFn: this.agent.streamFunction,\n\t\t\tretry: this.settingsManager.getRetrySettings(),\n\t\t});\n\t\t// Failures stay silent: nothing awaits this, and the picker falls back on its own.\n\t\tif (result.aborted || result.error || !result.summary) return;\n\n\t\t// Disposal, cancellation, a newer run, or a newer message all mean this summary no longer\n\t\t// describes the session. The signal is checked directly as well as the token because a\n\t\t// provider that ignores the signal still returns an ordinary result.\n\t\tif (this._disposed) return;\n\t\tif (signal.aborted) return;\n\t\tif (this._sessionSummaryRun !== run) return;\n\t\tif (getLastConversationMessageId(this.sessionManager.getBranch()) !== throughId) return;\n\n\t\tawait this.sessionManager.appendSessionSummary(result.summary, throughId, result.usage);\n\t\tthis._lastSummarizedMessageId = throughId;\n\t} catch {\n\t\t// Nothing awaits this call, so an escaping rejection would surface as an unhandled\n\t\t// rejection and can take the process down. Credential resolution throws outright when no\n\t\t// key is configured, which is an ordinary state for a session that never prompts.\n\t} finally {\n\t\tif (controller !== undefined && this._sessionSummaryAbortController === controller) {\n\t\t\tthis._sessionSummaryAbortController = undefined;\n\t\t}\n\t\tif (run !== undefined && this._sessionSummaryRun === run) {\n\t\t\tthis._sessionSummaryRun = undefined;\n\t\t}\n\t\t// Settled on every path, including a throw and every early return above: a joiner parked\n\t\t// on `done` has no other way out.\n\t\tfinish?.();\n\t}\n}\n\nexport function abortSessionSummary(this: AgentSession): void {\n\t// Bump the token as well as aborting: a launch parked on waitForIdle() has no controller yet,\n\t// and would otherwise survive a prompt, a tree navigation, or disposal.\n\tthis._sessionSummaryToken++;\n\tthis._sessionSummaryAbortController?.abort();\n\tthis._sessionSummaryAbortController = undefined;\n\t// Retire the published run too. It is what licenses a write once a request is in flight, so a\n\t// provider that ignores its signal must still fail the ownership check, and a later launch\n\t// must not join a run that has just been cancelled.\n\tthis._sessionSummaryRun = undefined;\n\t// Drop the in-memory anchor as well. It is only a cache of the persisted state, and the\n\t// persisted lookup is retirement-aware where the cache is not: after branchWithSummary()\n\t// retires the stored summary, a cached anchor that still matches the last message id would\n\t// skip regeneration and leave the picker on fallback text until the next real turn.\n\tthis._lastSummarizedMessageId = undefined;\n}\n\nexport const agentSessionSummaryMethods = { _maybeGenerateSessionSummary, abortSessionSummary };\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-summary.js","sourceRoot":"","sources":["../../src/core/agent-session-summary.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session summary generation for the resume picker.\n *\n * Runs once the agent goes idle, decides whether a fresh summary is worth generating, and\n * persists the result. Generation itself lives in core/compaction/session-summarization.ts.\n */\n\nimport type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport { authForStream } from \"./agent-session-models.ts\";\nimport { generateSessionSummary } from \"./compaction/index.ts\";\nimport { sessionGenerationClosing, sessionLifetime, trackSessionWork } from \"./session-lifecycle-work.ts\";\nimport { getLastConversationMessageId, getLatestSessionSummary } from \"./session-manager-entries.ts\";\n\n/** Sessions shorter than this are already legible from their first message. */\nconst MIN_ENTRIES_FOR_SUMMARY = 4;\n\n/** A summary request in flight, published so a launch describing the same state can join it. */\nexport type SessionSummaryRun = {\n\t/** The conversation state this request describes. */\n\treadonly throughId: string;\n\t/** Settles when the request finishes, whatever the outcome. */\n\treadonly done: Promise<void>;\n};\n\nexport function _maybeGenerateSessionSummary(this: AgentSession): Promise<void> {\n\tif (this._disposed || sessionGenerationClosing.has(this)) return Promise.resolve();\n\treturn trackSessionWork(this, async () => {\n\t\tconst signal = sessionLifetime(this);\n\t\tlet onAbort!: () => void;\n\t\tconst aborted = new Promise<void>((resolve) => {\n\t\t\tonAbort = resolve;\n\t\t\tif (signal.aborted) resolve();\n\t\t\telse signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t});\n\t\ttry {\n\t\t\tawait Promise.race([generateOwnedSessionSummary.call(this), aborted]);\n\t\t} finally {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t});\n}\n\nasync function generateOwnedSessionSummary(this: AgentSession): Promise<void> {\n\t// Held rather than read from the session in `finally`, so an early return can never clear a\n\t// controller or run belonging to a different launch.\n\tlet controller: AbortController | undefined;\n\tlet run: SessionSummaryRun | undefined;\n\tlet finish: (() => void) | undefined;\n\ttry {\n\t\t// --- Bail-outs that cannot change while we wait ---------------------------------\n\t\tif (this._disposed) return;\n\t\tif (!this.settingsManager.getSessionSummarySettings().enabled) return;\n\n\t\t// One-shot scripted runs should not pay for a background call; the process may exit before\n\t\t// it lands. \"tui\" and \"rpc\" are the resumable, interactive modes.\n\t\tif (this._extensionMode === \"print\" || this._extensionMode === \"json\") return;\n\n\t\tconst model = this.model;\n\t\tif (!model) return;\n\n\t\t// Workflow-stage sessions are excluded from /resume entirely.\n\t\tif (this.sessionManager.getHeader()?.internal) return;\n\n\t\t// Claim the launch before waiting, so a later turn supersedes this one while both are\n\t\t// parked below.\n\t\tconst sessionSummaryToken = ++this._sessionSummaryToken;\n\n\t\t// `agent_end` fires while the agent still reports isStreaming, and that flag survives the\n\t\t// entire microtask queue — it only clears a macrotask later. Testing it here without\n\t\t// waiting made generation depend on whether `_checkCompaction` happened to cross a\n\t\t// macrotask boundary: green under test, silently skipped in the real TUI, and nothing\n\t\t// retries it.\n\t\tawait this.agent.waitForIdle();\n\n\t\tif (this._disposed) return;\n\t\tif (this._sessionSummaryToken !== sessionSummaryToken) return;\n\t\tif (this.isStreaming || this.isCompacting) return;\n\n\t\tconst branch = this.sessionManager.getBranch();\n\t\tif (branch.length < MIN_ENTRIES_FOR_SUMMARY) return;\n\n\t\tconst throughId = getLastConversationMessageId(branch);\n\t\tif (!throughId) return;\n\n\t\t// On a resumed session the in-memory anchor starts empty, so fall back to the persisted\n\t\t// summary. Without this the first idle after every resume regenerates a summary that is\n\t\t// already current.\n\t\tconst lastSummarized =\n\t\t\tthis._lastSummarizedMessageId ??\n\t\t\tgetLatestSessionSummary(this.sessionManager.getEntries())?.summarizedThroughId;\n\t\tif (throughId === lastSummarized) return;\n\n\t\t// A request already covering this exact conversation state will store the line this launch\n\t\t// would ask for, so wait for it instead of aborting it and paying for a second one.\n\t\t// Overlap is routine rather than exceptional: every turn schedules a launch, and the\n\t\t// previous turn's can still be in flight when the next one wakes.\n\t\tconst inFlight = this._sessionSummaryRun;\n\t\tif (inFlight !== undefined && inFlight.throughId === throughId) {\n\t\t\tawait inFlight.done;\n\t\t\treturn;\n\t\t}\n\n\t\t// Anything still running describes an older conversation state, so retire it and take the\n\t\t// controller. Abort the previous one directly rather than via abortSessionSummary(), which\n\t\t// bumps the token and would invalidate the claim made above. The controller lives on the\n\t\t// session so the prompt, tree-navigation, and shutdown paths can reach it.\n\t\tthis._sessionSummaryAbortController?.abort();\n\t\tcontroller = new AbortController();\n\t\tthis._sessionSummaryAbortController = controller;\n\t\tconst signal = AbortSignal.any([controller.signal, sessionLifetime(this)]);\n\n\t\t// Publish this run before the first await that another launch can overlap. From here on\n\t\t// ownership of the slot, not the token, is what licenses a write: a joiner bumps the token\n\t\t// on its way in, and must not invalidate the very run it is waiting for.\n\t\t// Hand-rolled deferred rather than Promise.withResolvers: coding-agent is the one compiled\n\t\t// package and its lib target predates ES2024, the same reason `_retryPromise` is built this\n\t\t// way. The executor runs synchronously, so `finish` is assigned before the constructor returns.\n\t\tconst done = new Promise<void>((resolve) => {\n\t\t\tfinish = resolve;\n\t\t});\n\t\trun = { throughId, done };\n\t\tthis._sessionSummaryRun = run;\n\n\t\tconst { apiKey, headers, baseUrl } = authForStream(this, await this._getRequiredRequestAuth(model));\n\n\t\t// Disposal or a newer turn can land while credentials resolve; nothing past this point\n\t\t// should reach the provider.\n\t\tif (this._disposed || signal.aborted) return;\n\t\tif (this._sessionSummaryRun !== run) return;\n\n\t\tconst result = await generateSessionSummary(branch, {\n\t\t\tmodel,\n\t\t\tapiKey,\n\t\t\theaders,\n\t\t\tbaseUrl,\n\t\t\tsignal,\n\t\t\tstreamFn: this.agent.streamFunction,\n\t\t\tretry: this.settingsManager.getRetrySettings(),\n\t\t});\n\t\t// Failures stay silent: nothing awaits this, and the picker falls back on its own.\n\t\tif (result.aborted || result.error || !result.summary) return;\n\n\t\t// Disposal, cancellation, a newer run, or a newer message all mean this summary no longer\n\t\t// describes the session. The signal is checked directly as well as the token because a\n\t\t// provider that ignores the signal still returns an ordinary result.\n\t\tif (this._disposed) return;\n\t\tif (signal.aborted) return;\n\t\tif (this._sessionSummaryRun !== run) return;\n\t\tif (getLastConversationMessageId(this.sessionManager.getBranch()) !== throughId) return;\n\n\t\tawait this.sessionManager.appendSessionSummary(result.summary, throughId, result.usage);\n\t\tthis._lastSummarizedMessageId = throughId;\n\t} catch {\n\t\t// Nothing awaits this call, so an escaping rejection would surface as an unhandled\n\t\t// rejection and can take the process down. Credential resolution throws outright when no\n\t\t// key is configured, which is an ordinary state for a session that never prompts.\n\t} finally {\n\t\tif (controller !== undefined && this._sessionSummaryAbortController === controller) {\n\t\t\tthis._sessionSummaryAbortController = undefined;\n\t\t}\n\t\tif (run !== undefined && this._sessionSummaryRun === run) {\n\t\t\tthis._sessionSummaryRun = undefined;\n\t\t}\n\t\t// Settled on every path, including a throw and every early return above: a joiner parked\n\t\t// on `done` has no other way out.\n\t\tfinish?.();\n\t}\n}\n\nexport function abortSessionSummary(this: AgentSession): void {\n\t// Bump the token as well as aborting: a launch parked on waitForIdle() has no controller yet,\n\t// and would otherwise survive a prompt, a tree navigation, or disposal.\n\tthis._sessionSummaryToken++;\n\tthis._sessionSummaryAbortController?.abort();\n\tthis._sessionSummaryAbortController = undefined;\n\t// Retire the published run too. It is what licenses a write once a request is in flight, so a\n\t// provider that ignores its signal must still fail the ownership check, and a later launch\n\t// must not join a run that has just been cancelled.\n\tthis._sessionSummaryRun = undefined;\n\t// Drop the in-memory anchor as well. It is only a cache of the persisted state, and the\n\t// persisted lookup is retirement-aware where the cache is not: after branchWithSummary()\n\t// retires the stored summary, a cached anchor that still matches the last message id would\n\t// skip regeneration and leave the picker on fallback text until the next real turn.\n\tthis._lastSummarizedMessageId = undefined;\n}\n\nexport const agentSessionSummaryMethods = { _maybeGenerateSessionSummary, abortSessionSummary };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-tree.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-session-tree.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAK9F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,wBAAsB,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpF;AAMD;;;;;;;;;;GAUG;AAEH,wBAAsB,YAAY,CACjC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/G,OAAO,CAAC;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,kBAAkB,CAAA;CAAE,CAAC,CA8N5G;AAED;;GAEG;AAEH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY,GAAG,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAetG;AAED,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACtD,MAAM,CASR;AAED;;GAEG;AAEH,eAAO,MAAM,uBAAuB;;;;;CAKnC,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { authForStream } from "./agent-session-models.js";
|
|
1
2
|
import { collectEntriesForBranchSummary, generateBranchSummary } from "./compaction/index.js";
|
|
2
3
|
import { assertSessionOpen } from "./session-lifecycle-work.js";
|
|
3
4
|
import { createSummarizationRetryCallbacks } from "./summarization-retry.js";
|
|
@@ -110,7 +111,7 @@ export async function navigateTree(targetId, options = {}) {
|
|
|
110
111
|
let summaryUsage;
|
|
111
112
|
if (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {
|
|
112
113
|
const model = this.model;
|
|
113
|
-
const { apiKey, headers, baseUrl } = await this._getRequiredRequestAuth(model);
|
|
114
|
+
const { apiKey, headers, baseUrl } = authForStream(this, await this._getRequiredRequestAuth(model));
|
|
114
115
|
assertSessionOpen(this);
|
|
115
116
|
const branchSummarySettings = this.settingsManager.getBranchSummarySettings();
|
|
116
117
|
const result = await generateBranchSummary(entriesToSummarize, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-tree.js","sourceRoot":"","sources":["../../src/core/agent-session-tree.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport { collectEntriesForBranchSummary, generateBranchSummary } from \"./compaction/index.ts\";\nimport type { SessionBeforeTreeResult, TreePreparation } from \"./extensions/index.js\";\nimport { assertSessionOpen } from \"./session-lifecycle-work.ts\";\nimport type { BranchSummaryEntry } from \"./session-manager.ts\";\nimport { createSummarizationRetryCallbacks } from \"./summarization-retry.ts\";\n\nexport async function setSessionName(this: AgentSession, name: string): Promise<void> {\n\tawait this.sessionManager.appendSessionInfo(name);\n\tconst event = { type: \"session_info_changed\", name: this.sessionManager.getSessionName() } as const;\n\tthis._emit(event);\n\tvoid this._extensionRunner.emit(event);\n}\n\n// =========================================================================\n// Tree Navigation\n// =========================================================================\n\n/**\n * Navigate to a different node in the session tree.\n * Unlike fork() which creates a new session file, this stays in the same file.\n *\n * @param targetId The entry ID to navigate to\n * @param options.summarize Whether user wants to summarize abandoned branch\n * @param options.customInstructions Custom instructions for summarizer\n * @param options.replaceInstructions If true, customInstructions replaces the default prompt\n * @param options.label Label to attach to the branch summary entry\n * @returns Result with editorText (if user message) and cancelled status\n */\n\nexport async function navigateTree(\n\tthis: AgentSession,\n\ttargetId: string,\n\toptions: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string } = {},\n): Promise<{ editorText?: string; cancelled: boolean; aborted?: boolean; summaryEntry?: BranchSummaryEntry }> {\n\tassertSessionOpen(this);\n\t// Navigating away mid-response would strand the in-flight turn's tool calls on\n\t// the abandoned branch. Callers abort first, then navigate.\n\tif (this.isStreaming || this._isPreparingRun === \"user\") {\n\t\tthrow new Error(\"Wait for the current response to finish before navigating the session tree.\");\n\t}\n\tif (this.isCompacting) {\n\t\tthrow new Error(\n\t\t\t\"Wait for the current compaction or tree navigation to finish before navigating the session tree.\",\n\t\t);\n\t}\n\n\tconst oldLeafId = this.sessionManager.getLeafId();\n\n\t// No-op if already at target\n\tif (targetId === oldLeafId) {\n\t\treturn { cancelled: false };\n\t}\n\n\t// Model required for summarization\n\tif (options.summarize && !this.model) {\n\t\tthrow new Error(\"No model available for summarization\");\n\t}\n\n\tconst targetEntry = this.sessionManager.getEntry(targetId);\n\tif (!targetEntry) {\n\t\tthrow new Error(`Entry ${targetId} not found`);\n\t}\n\n\t// Collect entries to summarize (from old leaf to common ancestor)\n\tconst { entries: entriesToSummarize, commonAncestorId } = collectEntriesForBranchSummary(\n\t\tthis.sessionManager,\n\t\toldLeafId,\n\t\ttargetId,\n\t);\n\n\t// Prepare event data - mutable so extensions can override\n\tlet customInstructions = options.customInstructions;\n\tlet replaceInstructions = options.replaceInstructions;\n\tlet label = options.label;\n\n\tconst preparation: TreePreparation = {\n\t\ttargetId,\n\t\toldLeafId,\n\t\tcommonAncestorId,\n\t\tentriesToSummarize,\n\t\tuserWantsSummary: options.summarize ?? false,\n\t\tcustomInstructions,\n\t\treplaceInstructions,\n\t\tlabel,\n\t};\n\n\t// Moving the leaf invalidates any session summary still in flight: it was generated from the\n\t// branch we are leaving. Its anchor can survive the move — a `branch_summary` is not a\n\t// conversation message, and navigating to an existing assistant message leaves the last\n\t// message id unchanged — so the anchor check alone would let it persist against the new\n\t// branch. Cancelling here is what the signal check before persistence keys off.\n\tthis.abortSessionSummary();\n\n\t// Set up abort controller for summarization\n\tthis._branchSummaryAbortController = new AbortController();\n\tif (this._compactionReason === undefined) this._compactionReason = \"branchSummary\";\n\tlet finishBranchSummary = (): void => {};\n\tconst branchSummaryCompletion = new Promise<void>((resolve) => {\n\t\tfinishBranchSummary = resolve;\n\t});\n\tthis._branchSummaryCompletion = branchSummaryCompletion;\n\n\ttry {\n\t\tlet extensionSummary: { summary: string; details?: unknown } | undefined;\n\t\tlet fromExtension = false;\n\n\t\t// Emit session_before_tree event\n\t\tif (this._extensionRunner.hasHandlers(\"session_before_tree\")) {\n\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_tree\",\n\t\t\t\tpreparation,\n\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t})) as SessionBeforeTreeResult | undefined;\n\n\t\t\tassertSessionOpen(this);\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn { cancelled: true };\n\t\t\t}\n\n\t\t\tif (result?.summary && options.summarize) {\n\t\t\t\textensionSummary = result.summary;\n\t\t\t\tfromExtension = true;\n\t\t\t}\n\n\t\t\t// Allow extensions to override instructions and label\n\t\t\tif (result?.customInstructions !== undefined) {\n\t\t\t\tcustomInstructions = result.customInstructions;\n\t\t\t}\n\t\t\tif (result?.replaceInstructions !== undefined) {\n\t\t\t\treplaceInstructions = result.replaceInstructions;\n\t\t\t}\n\t\t\tif (result?.label !== undefined) {\n\t\t\t\tlabel = result.label;\n\t\t\t}\n\t\t}\n\n\t\t// Run default summarizer if needed\n\t\tlet summaryText: string | undefined;\n\t\tlet summaryDetails: unknown;\n\t\tlet summaryUsage: import(\"@bastani/pi-ai/compat\").Usage | undefined;\n\t\tif (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {\n\t\t\tconst model = this.model!;\n\t\t\tconst { apiKey, headers, baseUrl } = await this._getRequiredRequestAuth(model);\n\t\t\tassertSessionOpen(this);\n\t\t\tconst branchSummarySettings = this.settingsManager.getBranchSummarySettings();\n\t\t\tconst result = await generateBranchSummary(entriesToSummarize, {\n\t\t\t\tcwd: this._cwd,\n\t\t\t\tmodel,\n\t\t\t\tapiKey,\n\t\t\t\theaders,\n\t\t\t\tbaseUrl,\n\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t\tcustomInstructions,\n\t\t\t\treplaceInstructions,\n\t\t\t\treserveTokens: branchSummarySettings.reserveTokens,\n\t\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\t\tstreamFn: this.agent.streamFunction,\n\t\t\t\tretry: this.settingsManager.getRetrySettings(),\n\t\t\t\tcallbacks: createSummarizationRetryCallbacks(this, { source: \"branchSummary\" }),\n\t\t\t});\n\t\t\tif (result.aborted) {\n\t\t\t\treturn { cancelled: true, aborted: true };\n\t\t\t}\n\t\t\tif (result.error) {\n\t\t\t\tthrow new Error(result.error);\n\t\t\t}\n\t\t\tsummaryText = result.summary;\n\t\t\tsummaryUsage = result.usage;\n\t\t\tsummaryDetails = {\n\t\t\t\treadFiles: result.readFiles || [],\n\t\t\t\tmodifiedFiles: result.modifiedFiles || [],\n\t\t\t};\n\t\t} else if (extensionSummary) {\n\t\t\tsummaryText = extensionSummary.summary;\n\t\t\tsummaryDetails = extensionSummary.details;\n\t\t}\n\n\t\tassertSessionOpen(this);\n\t\t// Determine the new leaf position based on target type\n\t\tlet newLeafId: string | null;\n\t\tlet editorText: string | undefined;\n\n\t\tif (targetEntry.type === \"message\" && targetEntry.message.role === \"user\") {\n\t\t\t// User message: leaf = parent (null if root), text goes to editor\n\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\teditorText = this._extractUserMessageText(targetEntry.message.content);\n\t\t} else if (targetEntry.type === \"custom_message\") {\n\t\t\t// Custom message: leaf = parent (null if root), text goes to editor\n\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\teditorText =\n\t\t\t\ttypeof targetEntry.content === \"string\"\n\t\t\t\t\t? targetEntry.content\n\t\t\t\t\t: targetEntry.content\n\t\t\t\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t\t\t\t.map((c) => c.text)\n\t\t\t\t\t\t\t.join(\"\");\n\t\t} else {\n\t\t\t// Non-user message: leaf = selected node\n\t\t\tnewLeafId = targetId;\n\t\t}\n\n\t\t// Switch leaf (with or without summary)\n\t\t// Summary is attached at the navigation target position (newLeafId), not the old branch\n\t\tlet summaryEntry: BranchSummaryEntry | undefined;\n\t\tif (summaryText) {\n\t\t\t// Create summary at target position (can be null for root)\n\t\t\tconst summaryId = await this.sessionManager.branchWithSummary(\n\t\t\t\tnewLeafId,\n\t\t\t\tsummaryText,\n\t\t\t\tsummaryDetails,\n\t\t\t\tfromExtension,\n\t\t\t\tsummaryUsage,\n\t\t\t\toldLeafId ?? \"root\",\n\t\t\t);\n\t\t\tsummaryEntry = this.sessionManager.getEntry(summaryId) as BranchSummaryEntry;\n\n\t\t\t// Attach label to the summary entry\n\t\t\tif (label) {\n\t\t\t\tawait this.sessionManager.appendLabelChange(summaryId, label);\n\t\t\t}\n\t\t} else if (newLeafId === null) {\n\t\t\t// No summary, navigating to root - reset leaf\n\t\t\tawait this.sessionManager.resetLeaf();\n\t\t} else {\n\t\t\t// No summary, navigating to non-root\n\t\t\tawait this.sessionManager.branch(newLeafId);\n\t\t}\n\n\t\t// Attach label to target entry when not summarizing (no summary entry to label)\n\t\tif (label && !summaryText) {\n\t\t\tawait this.sessionManager.appendLabelChange(targetId, label);\n\t\t}\n\n\t\t// Update finalized context from the canonical session projection.\n\t\tthis._refreshFinalizedContext();\n\t\tthis._restoreToolsFromTranscript();\n\n\t\t// Emit session_tree event\n\t\tawait this._extensionRunner.emit({\n\t\t\ttype: \"session_tree\",\n\t\t\tnewLeafId: this.sessionManager.getLeafId(),\n\t\t\toldLeafId,\n\t\t\tsummaryEntry,\n\t\t\tfromExtension: summaryText ? fromExtension : undefined,\n\t\t});\n\n\t\t// Emit to custom tools\n\n\t\treturn { editorText, cancelled: false, summaryEntry };\n\t} finally {\n\t\tthis._branchSummaryAbortController = undefined;\n\t\tif (this._compactionReason === \"branchSummary\") this._compactionReason = undefined;\n\t\tfinishBranchSummary();\n\t\tif (this._branchSummaryCompletion === branchSummaryCompletion) this._branchSummaryCompletion = undefined;\n\t}\n}\n\n/**\n * Get all user messages from session for fork selector.\n */\n\nexport function getUserMessagesForForking(this: AgentSession): Array<{ entryId: string; text: string }> {\n\tconst entries = this.sessionManager.getEntries();\n\tconst result: Array<{ entryId: string; text: string }> = [];\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tif (entry.message.role !== \"user\") continue;\n\n\t\tconst text = this._extractUserMessageText(entry.message.content);\n\t\tif (text) {\n\t\t\tresult.push({ entryId: entry.id, text });\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function _extractUserMessageText(\n\tthis: AgentSession,\n\tcontent: string | Array<{ type: string; text?: string }>,\n): string {\n\tif (typeof content === \"string\") return content;\n\tif (Array.isArray(content)) {\n\t\treturn content\n\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t.map((c) => c.text)\n\t\t\t.join(\"\");\n\t}\n\treturn \"\";\n}\n\n/**\n * Get session statistics.\n */\n\nexport const agentSessionTreeMethods = {\n\tsetSessionName,\n\tnavigateTree,\n\tgetUserMessagesForForking,\n\t_extractUserMessageText,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-tree.js","sourceRoot":"","sources":["../../src/core/agent-session-tree.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentSessionInternalSurface as AgentSession } from \"./agent-session-methods.ts\";\nimport { authForStream } from \"./agent-session-models.ts\";\nimport { collectEntriesForBranchSummary, generateBranchSummary } from \"./compaction/index.ts\";\nimport type { SessionBeforeTreeResult, TreePreparation } from \"./extensions/index.js\";\nimport { assertSessionOpen } from \"./session-lifecycle-work.ts\";\nimport type { BranchSummaryEntry } from \"./session-manager.ts\";\nimport { createSummarizationRetryCallbacks } from \"./summarization-retry.ts\";\n\nexport async function setSessionName(this: AgentSession, name: string): Promise<void> {\n\tawait this.sessionManager.appendSessionInfo(name);\n\tconst event = { type: \"session_info_changed\", name: this.sessionManager.getSessionName() } as const;\n\tthis._emit(event);\n\tvoid this._extensionRunner.emit(event);\n}\n\n// =========================================================================\n// Tree Navigation\n// =========================================================================\n\n/**\n * Navigate to a different node in the session tree.\n * Unlike fork() which creates a new session file, this stays in the same file.\n *\n * @param targetId The entry ID to navigate to\n * @param options.summarize Whether user wants to summarize abandoned branch\n * @param options.customInstructions Custom instructions for summarizer\n * @param options.replaceInstructions If true, customInstructions replaces the default prompt\n * @param options.label Label to attach to the branch summary entry\n * @returns Result with editorText (if user message) and cancelled status\n */\n\nexport async function navigateTree(\n\tthis: AgentSession,\n\ttargetId: string,\n\toptions: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string } = {},\n): Promise<{ editorText?: string; cancelled: boolean; aborted?: boolean; summaryEntry?: BranchSummaryEntry }> {\n\tassertSessionOpen(this);\n\t// Navigating away mid-response would strand the in-flight turn's tool calls on\n\t// the abandoned branch. Callers abort first, then navigate.\n\tif (this.isStreaming || this._isPreparingRun === \"user\") {\n\t\tthrow new Error(\"Wait for the current response to finish before navigating the session tree.\");\n\t}\n\tif (this.isCompacting) {\n\t\tthrow new Error(\n\t\t\t\"Wait for the current compaction or tree navigation to finish before navigating the session tree.\",\n\t\t);\n\t}\n\n\tconst oldLeafId = this.sessionManager.getLeafId();\n\n\t// No-op if already at target\n\tif (targetId === oldLeafId) {\n\t\treturn { cancelled: false };\n\t}\n\n\t// Model required for summarization\n\tif (options.summarize && !this.model) {\n\t\tthrow new Error(\"No model available for summarization\");\n\t}\n\n\tconst targetEntry = this.sessionManager.getEntry(targetId);\n\tif (!targetEntry) {\n\t\tthrow new Error(`Entry ${targetId} not found`);\n\t}\n\n\t// Collect entries to summarize (from old leaf to common ancestor)\n\tconst { entries: entriesToSummarize, commonAncestorId } = collectEntriesForBranchSummary(\n\t\tthis.sessionManager,\n\t\toldLeafId,\n\t\ttargetId,\n\t);\n\n\t// Prepare event data - mutable so extensions can override\n\tlet customInstructions = options.customInstructions;\n\tlet replaceInstructions = options.replaceInstructions;\n\tlet label = options.label;\n\n\tconst preparation: TreePreparation = {\n\t\ttargetId,\n\t\toldLeafId,\n\t\tcommonAncestorId,\n\t\tentriesToSummarize,\n\t\tuserWantsSummary: options.summarize ?? false,\n\t\tcustomInstructions,\n\t\treplaceInstructions,\n\t\tlabel,\n\t};\n\n\t// Moving the leaf invalidates any session summary still in flight: it was generated from the\n\t// branch we are leaving. Its anchor can survive the move — a `branch_summary` is not a\n\t// conversation message, and navigating to an existing assistant message leaves the last\n\t// message id unchanged — so the anchor check alone would let it persist against the new\n\t// branch. Cancelling here is what the signal check before persistence keys off.\n\tthis.abortSessionSummary();\n\n\t// Set up abort controller for summarization\n\tthis._branchSummaryAbortController = new AbortController();\n\tif (this._compactionReason === undefined) this._compactionReason = \"branchSummary\";\n\tlet finishBranchSummary = (): void => {};\n\tconst branchSummaryCompletion = new Promise<void>((resolve) => {\n\t\tfinishBranchSummary = resolve;\n\t});\n\tthis._branchSummaryCompletion = branchSummaryCompletion;\n\n\ttry {\n\t\tlet extensionSummary: { summary: string; details?: unknown } | undefined;\n\t\tlet fromExtension = false;\n\n\t\t// Emit session_before_tree event\n\t\tif (this._extensionRunner.hasHandlers(\"session_before_tree\")) {\n\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_tree\",\n\t\t\t\tpreparation,\n\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t})) as SessionBeforeTreeResult | undefined;\n\n\t\t\tassertSessionOpen(this);\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn { cancelled: true };\n\t\t\t}\n\n\t\t\tif (result?.summary && options.summarize) {\n\t\t\t\textensionSummary = result.summary;\n\t\t\t\tfromExtension = true;\n\t\t\t}\n\n\t\t\t// Allow extensions to override instructions and label\n\t\t\tif (result?.customInstructions !== undefined) {\n\t\t\t\tcustomInstructions = result.customInstructions;\n\t\t\t}\n\t\t\tif (result?.replaceInstructions !== undefined) {\n\t\t\t\treplaceInstructions = result.replaceInstructions;\n\t\t\t}\n\t\t\tif (result?.label !== undefined) {\n\t\t\t\tlabel = result.label;\n\t\t\t}\n\t\t}\n\n\t\t// Run default summarizer if needed\n\t\tlet summaryText: string | undefined;\n\t\tlet summaryDetails: unknown;\n\t\tlet summaryUsage: import(\"@bastani/pi-ai/compat\").Usage | undefined;\n\t\tif (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {\n\t\t\tconst model = this.model!;\n\t\t\tconst { apiKey, headers, baseUrl } = authForStream(this, await this._getRequiredRequestAuth(model));\n\t\t\tassertSessionOpen(this);\n\t\t\tconst branchSummarySettings = this.settingsManager.getBranchSummarySettings();\n\t\t\tconst result = await generateBranchSummary(entriesToSummarize, {\n\t\t\t\tcwd: this._cwd,\n\t\t\t\tmodel,\n\t\t\t\tapiKey,\n\t\t\t\theaders,\n\t\t\t\tbaseUrl,\n\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t\tcustomInstructions,\n\t\t\t\treplaceInstructions,\n\t\t\t\treserveTokens: branchSummarySettings.reserveTokens,\n\t\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\t\tstreamFn: this.agent.streamFunction,\n\t\t\t\tretry: this.settingsManager.getRetrySettings(),\n\t\t\t\tcallbacks: createSummarizationRetryCallbacks(this, { source: \"branchSummary\" }),\n\t\t\t});\n\t\t\tif (result.aborted) {\n\t\t\t\treturn { cancelled: true, aborted: true };\n\t\t\t}\n\t\t\tif (result.error) {\n\t\t\t\tthrow new Error(result.error);\n\t\t\t}\n\t\t\tsummaryText = result.summary;\n\t\t\tsummaryUsage = result.usage;\n\t\t\tsummaryDetails = {\n\t\t\t\treadFiles: result.readFiles || [],\n\t\t\t\tmodifiedFiles: result.modifiedFiles || [],\n\t\t\t};\n\t\t} else if (extensionSummary) {\n\t\t\tsummaryText = extensionSummary.summary;\n\t\t\tsummaryDetails = extensionSummary.details;\n\t\t}\n\n\t\tassertSessionOpen(this);\n\t\t// Determine the new leaf position based on target type\n\t\tlet newLeafId: string | null;\n\t\tlet editorText: string | undefined;\n\n\t\tif (targetEntry.type === \"message\" && targetEntry.message.role === \"user\") {\n\t\t\t// User message: leaf = parent (null if root), text goes to editor\n\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\teditorText = this._extractUserMessageText(targetEntry.message.content);\n\t\t} else if (targetEntry.type === \"custom_message\") {\n\t\t\t// Custom message: leaf = parent (null if root), text goes to editor\n\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\teditorText =\n\t\t\t\ttypeof targetEntry.content === \"string\"\n\t\t\t\t\t? targetEntry.content\n\t\t\t\t\t: targetEntry.content\n\t\t\t\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t\t\t\t.map((c) => c.text)\n\t\t\t\t\t\t\t.join(\"\");\n\t\t} else {\n\t\t\t// Non-user message: leaf = selected node\n\t\t\tnewLeafId = targetId;\n\t\t}\n\n\t\t// Switch leaf (with or without summary)\n\t\t// Summary is attached at the navigation target position (newLeafId), not the old branch\n\t\tlet summaryEntry: BranchSummaryEntry | undefined;\n\t\tif (summaryText) {\n\t\t\t// Create summary at target position (can be null for root)\n\t\t\tconst summaryId = await this.sessionManager.branchWithSummary(\n\t\t\t\tnewLeafId,\n\t\t\t\tsummaryText,\n\t\t\t\tsummaryDetails,\n\t\t\t\tfromExtension,\n\t\t\t\tsummaryUsage,\n\t\t\t\toldLeafId ?? \"root\",\n\t\t\t);\n\t\t\tsummaryEntry = this.sessionManager.getEntry(summaryId) as BranchSummaryEntry;\n\n\t\t\t// Attach label to the summary entry\n\t\t\tif (label) {\n\t\t\t\tawait this.sessionManager.appendLabelChange(summaryId, label);\n\t\t\t}\n\t\t} else if (newLeafId === null) {\n\t\t\t// No summary, navigating to root - reset leaf\n\t\t\tawait this.sessionManager.resetLeaf();\n\t\t} else {\n\t\t\t// No summary, navigating to non-root\n\t\t\tawait this.sessionManager.branch(newLeafId);\n\t\t}\n\n\t\t// Attach label to target entry when not summarizing (no summary entry to label)\n\t\tif (label && !summaryText) {\n\t\t\tawait this.sessionManager.appendLabelChange(targetId, label);\n\t\t}\n\n\t\t// Update finalized context from the canonical session projection.\n\t\tthis._refreshFinalizedContext();\n\t\tthis._restoreToolsFromTranscript();\n\n\t\t// Emit session_tree event\n\t\tawait this._extensionRunner.emit({\n\t\t\ttype: \"session_tree\",\n\t\t\tnewLeafId: this.sessionManager.getLeafId(),\n\t\t\toldLeafId,\n\t\t\tsummaryEntry,\n\t\t\tfromExtension: summaryText ? fromExtension : undefined,\n\t\t});\n\n\t\t// Emit to custom tools\n\n\t\treturn { editorText, cancelled: false, summaryEntry };\n\t} finally {\n\t\tthis._branchSummaryAbortController = undefined;\n\t\tif (this._compactionReason === \"branchSummary\") this._compactionReason = undefined;\n\t\tfinishBranchSummary();\n\t\tif (this._branchSummaryCompletion === branchSummaryCompletion) this._branchSummaryCompletion = undefined;\n\t}\n}\n\n/**\n * Get all user messages from session for fork selector.\n */\n\nexport function getUserMessagesForForking(this: AgentSession): Array<{ entryId: string; text: string }> {\n\tconst entries = this.sessionManager.getEntries();\n\tconst result: Array<{ entryId: string; text: string }> = [];\n\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") continue;\n\t\tif (entry.message.role !== \"user\") continue;\n\n\t\tconst text = this._extractUserMessageText(entry.message.content);\n\t\tif (text) {\n\t\t\tresult.push({ entryId: entry.id, text });\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function _extractUserMessageText(\n\tthis: AgentSession,\n\tcontent: string | Array<{ type: string; text?: string }>,\n): string {\n\tif (typeof content === \"string\") return content;\n\tif (Array.isArray(content)) {\n\t\treturn content\n\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t.map((c) => c.text)\n\t\t\t.join(\"\");\n\t}\n\treturn \"\";\n}\n\n/**\n * Get session statistics.\n */\n\nexport const agentSessionTreeMethods = {\n\tsetSessionName,\n\tnavigateTree,\n\tgetUserMessagesForForking,\n\t_extractUserMessageText,\n};\n"]}
|
package/dist/core/exec.d.ts
CHANGED
|
@@ -11,6 +11,11 @@ export interface ExecOptions {
|
|
|
11
11
|
timeout?: number;
|
|
12
12
|
/** Working directory */
|
|
13
13
|
cwd?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Combined stdout/stderr byte limit; exceeding it terminates the command with `truncated: true`.
|
|
16
|
+
* Nonnegative integer up to the runtime string limit. Default: 256 MiB, capped by that limit.
|
|
17
|
+
*/
|
|
18
|
+
maxBuffer?: number;
|
|
14
19
|
}
|
|
15
20
|
/**
|
|
16
21
|
* Result of executing a shell command.
|
|
@@ -19,11 +24,14 @@ export interface ExecResult {
|
|
|
19
24
|
stdout: string;
|
|
20
25
|
stderr: string;
|
|
21
26
|
code: number;
|
|
27
|
+
/** The command was terminated by pi: timeout, abort, or output over `maxBuffer`. */
|
|
22
28
|
killed: boolean;
|
|
29
|
+
/** Output exceeded `maxBuffer`; stdout and stderr are incomplete and `code` is nonzero. */
|
|
30
|
+
truncated: boolean;
|
|
23
31
|
}
|
|
24
32
|
/**
|
|
25
33
|
* Execute a shell command and return stdout/stderr/code.
|
|
26
|
-
* Supports timeout and
|
|
34
|
+
* Supports timeout, abort signal, and an output cap (`maxBuffer`).
|
|
27
35
|
*/
|
|
28
36
|
export declare function execCommand(command: string, args: string[], cwd: string, options?: ExecOptions): Promise<ExecResult>;
|
|
29
37
|
//# sourceMappingURL=exec.d.ts.map
|
package/dist/core/exec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,wCAAwC;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,MAAM,EAAE,OAAO,CAAC;IAChB,2FAA2F;IAC3F,SAAS,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAgHrB"}
|