@ai-agent-forge/agent-forge 0.88.2 → 0.88.4
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 +33 -0
- package/README.md +1 -1
- package/bundled-plugins/agent-loop-policy/agent-forge.json +1 -1
- package/bundled-plugins/agent-loop-policy/plugin.json +1 -1
- package/bundled-plugins/coding-tools/agent-forge.json +1 -1
- package/bundled-plugins/coding-tools/plugin.json +1 -1
- package/bundled-plugins/compaction-policy/agent-forge.json +1 -1
- package/bundled-plugins/compaction-policy/plugin.json +1 -1
- package/bundled-plugins/overflow-policy/agent-forge.json +1 -1
- package/bundled-plugins/overflow-policy/plugin.json +1 -1
- package/bundled-plugins/provider-failover/agent-forge.json +1 -1
- package/bundled-plugins/provider-failover/plugin.json +1 -1
- package/bundled-plugins/retry-policy/agent-forge.json +1 -1
- package/bundled-plugins/retry-policy/plugin.json +1 -1
- package/dist/artifacts/paged-read.d.ts +6 -1
- package/dist/artifacts/paged-read.d.ts.map +1 -1
- package/dist/artifacts/paged-read.js.map +1 -1
- package/dist/bundle/.build-manifest.json +244 -234
- package/dist/bundle/chunks/{anthropic-messages-PLAKXR73.js → anthropic-messages-3FJHRAJL.js} +2 -2
- package/dist/bundle/chunks/anthropic.js +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-OUWQ2AZD.js → azure-openai-responses-GCL47IDS.js} +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
- package/dist/bundle/chunks/{chunk-6F5JWGKE.js → chunk-32YDZI4J.js} +1 -1
- package/dist/bundle/chunks/{chunk-LSP24WNH.js → chunk-755VNWIF.js} +12 -12
- package/dist/bundle/chunks/{chunk-DRQDKNXA.js → chunk-BVVSHK6W.js} +1 -1
- package/dist/bundle/chunks/{chunk-HTC5K5SM.js → chunk-HEL6TAWE.js} +95 -90
- package/dist/bundle/chunks/{chunk-6R7UI4IY.js → chunk-QDLOMKF6.js} +1 -1
- package/dist/bundle/chunks/{chunk-44I47ACN.js → chunk-V3ACW7VD.js} +1 -1
- package/dist/bundle/chunks/{google-generative-ai-DLII6DAT.js → google-generative-ai-6BMXWA44.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-G7BZL7GM.js → google-vertex-6H7NLRTK.js} +1 -1
- package/dist/bundle/chunks/image-resize-worker.js +1 -1
- package/dist/bundle/chunks/{mistral-conversations-JXUK24ID.js → mistral-conversations-IXUHSFSJ.js} +1 -1
- package/dist/bundle/chunks/{openai-codex-responses-5GSGFIPG.js → openai-codex-responses-YHUAEVCM.js} +1 -1
- package/dist/bundle/chunks/openai-codex.js +1 -1
- package/dist/bundle/chunks/{openai-completions-EI2I6DTG.js → openai-completions-ULQCFC72.js} +1 -1
- package/dist/bundle/chunks/openai-responses-NLLAJDPS.js +2 -0
- package/dist/bundle/chunks/{openrouter-images-G4GQRUSG.js → openrouter-images-GZZQZXMS.js} +1 -1
- package/dist/bundle/chunks/openrouter.js +1 -1
- package/dist/bundle/chunks/{pi-messages-PWU2VJMR.js → pi-messages-EJTI2EJ3.js} +1 -1
- package/dist/bundle/chunks/virtual-modules-TQWEGNNZ.js +5 -0
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/client.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts +0 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -4
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/experimental/cli.d.ts +3 -3
- package/dist/cli/experimental/cli.d.ts.map +1 -1
- package/dist/cli/experimental/cli.js +2 -2
- package/dist/cli/experimental/cli.js.map +1 -1
- package/dist/cli/experimental/commands/agent-forge.d.ts +15 -0
- package/dist/cli/experimental/commands/agent-forge.d.ts.map +1 -0
- package/dist/cli/experimental/commands/{pi.js → agent-forge.js} +4 -4
- package/dist/cli/experimental/commands/agent-forge.js.map +1 -0
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +1 -1
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/config.d.ts +4 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -7
- package/dist/config.js.map +1 -1
- package/dist/core/agent-forge-manifest.d.ts +7 -0
- package/dist/core/agent-forge-manifest.d.ts.map +1 -0
- package/dist/core/{pi-manifest.js → agent-forge-manifest.js} +4 -4
- package/dist/core/agent-forge-manifest.js.map +1 -0
- package/dist/core/agent-session-compaction.d.ts +1 -1
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +3 -3
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-lifecycle.d.ts.map +1 -1
- package/dist/core/agent-session-lifecycle.js +12 -1
- package/dist/core/agent-session-lifecycle.js.map +1 -1
- package/dist/core/agent-session-projection.d.ts.map +1 -1
- package/dist/core/agent-session-projection.js +3 -3
- package/dist/core/agent-session-projection.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +1 -3
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/extensions/capability-plugin.d.ts.map +1 -1
- package/dist/core/extensions/capability-plugin.js +15 -8
- package/dist/core/extensions/capability-plugin.js.map +1 -1
- package/dist/core/extensions/capability-runtime-store.d.ts +20 -1
- package/dist/core/extensions/capability-runtime-store.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-store.js +67 -0
- package/dist/core/extensions/capability-runtime-store.js.map +1 -1
- package/dist/core/extensions/capability-runtime-types.d.ts +14 -0
- package/dist/core/extensions/capability-runtime-types.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-types.js +7 -1
- package/dist/core/extensions/capability-runtime-types.js.map +1 -1
- package/dist/core/extensions/capability-runtime.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime.js +144 -42
- package/dist/core/extensions/capability-runtime.js.map +1 -1
- package/dist/core/extensions/virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/virtual-modules.js +12 -4
- package/dist/core/extensions/virtual-modules.js.map +1 -1
- package/dist/core/facade/coding-agent-facade.d.ts +1 -1
- package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
- package/dist/core/facade/coding-agent-facade.js +1 -1
- package/dist/core/facade/coding-agent-facade.js.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts +1 -1
- package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-contract-final.js +3 -3
- package/dist/core/i18n/locales/zh-cn/core-contract-final.js.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js +1 -1
- package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-errors.d.ts.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-errors.js +1 -1
- package/dist/core/i18n/locales/zh-cn/core-errors.js.map +1 -1
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts.map +1 -1
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.js +2 -0
- package/dist/core/i18n/locales/zh-cn/tui-components-misc.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -0
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +4 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-resource-collection.d.ts.map +1 -1
- package/dist/core/package-resource-collection.js +5 -5
- package/dist/core/package-resource-collection.js.map +1 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +3 -3
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +1 -1
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +6 -7
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +4 -4
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +5 -10
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +1 -3
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/tool-definition.d.ts +1 -1
- package/dist/core/tools/tool-definition.d.ts.map +1 -1
- package/dist/core/tools/tool-definition.js.map +1 -1
- package/dist/core/trace-retention.d.ts +16 -1
- package/dist/core/trace-retention.d.ts.map +1 -1
- package/dist/core/trace-retention.js +43 -20
- package/dist/core/trace-retention.js.map +1 -1
- package/dist/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/export-html/ansi-to-html.js.map +1 -0
- package/dist/{core/export-html → export-html}/index.d.ts +1 -1
- package/dist/export-html/index.d.ts.map +1 -0
- package/dist/{core/export-html → export-html}/index.js +5 -5
- package/dist/export-html/index.js.map +1 -0
- package/dist/{core/export-html → export-html}/tool-renderer.d.ts +2 -2
- package/dist/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/export-html/tool-renderer.js.map +1 -0
- package/dist/{modes/interactive → host}/model-catalog-refresh.d.ts +1 -1
- package/dist/host/model-catalog-refresh.d.ts.map +1 -0
- package/dist/{modes/interactive → host}/model-catalog-refresh.js +1 -1
- package/dist/host/model-catalog-refresh.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +25 -14
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/agents-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/agents-view.js +1 -1
- package/dist/modes/interactive/components/agents-view.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js +1 -1
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +3 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +83 -24
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +1 -1
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +1 -1
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +1 -1
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js +1 -1
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/dialog-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/dialog-editor.js +1 -1
- package/dist/modes/interactive/components/dialog-editor.js.map +1 -1
- package/dist/modes/interactive/components/dialog-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/dialog-input.js +1 -1
- package/dist/modes/interactive/components/dialog-input.js.map +1 -1
- package/dist/modes/interactive/components/dialog-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/dialog-selector.js +1 -1
- package/dist/modes/interactive/components/dialog-selector.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js +1 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js +1 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +1 -1
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +1 -1
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/mermaid.d.ts +1 -1
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
- package/dist/modes/interactive/components/mermaid.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +2 -2
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +1 -1
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/plugin-manager-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/plugin-manager-entry.js +1 -1
- package/dist/modes/interactive/components/plugin-manager-entry.js.map +1 -1
- package/dist/modes/interactive/components/plugin-selection-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/plugin-selection-entry.js +1 -1
- package/dist/modes/interactive/components/plugin-selection-entry.js.map +1 -1
- package/dist/modes/interactive/components/queue-manager-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/queue-manager-selector.js +1 -1
- package/dist/modes/interactive/components/queue-manager-selector.js.map +1 -1
- package/dist/modes/interactive/components/render-types.d.ts +1 -1
- package/dist/modes/interactive/components/render-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/render-types.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +2 -2
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +1 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.js +1 -1
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +1 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +1 -1
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +1 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +1 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +2 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +96 -4
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-run-group.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-run-group.js +1 -1
- package/dist/modes/interactive/components/tool-run-group.js.map +1 -1
- package/dist/modes/interactive/components/tree-list.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-list.js +1 -1
- package/dist/modes/interactive/components/tree-list.js.map +1 -1
- package/dist/modes/interactive/components/tree-render.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-render.js +1 -1
- package/dist/modes/interactive/components/tree-render.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +1 -1
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +1 -1
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +1 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/workflow-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/workflow-view.js +1 -1
- package/dist/modes/interactive/components/workflow-view.js.map +1 -1
- package/dist/modes/interactive/interactive-auth.d.ts +1 -1
- package/dist/modes/interactive/interactive-auth.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-auth.js +1 -1
- package/dist/modes/interactive/interactive-auth.js.map +1 -1
- package/dist/modes/interactive/interactive-commands.d.ts +123 -6
- package/dist/modes/interactive/interactive-commands.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-commands.js +691 -4
- package/dist/modes/interactive/interactive-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-events.d.ts +174 -0
- package/dist/modes/interactive/interactive-events.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-events.js +704 -0
- package/dist/modes/interactive/interactive-events.js.map +1 -0
- package/dist/modes/interactive/interactive-format.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-format.js +1 -1
- package/dist/modes/interactive/interactive-format.js.map +1 -1
- package/dist/modes/interactive/interactive-lifecycle.d.ts +94 -0
- package/dist/modes/interactive/interactive-lifecycle.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-lifecycle.js +177 -0
- package/dist/modes/interactive/interactive-lifecycle.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +240 -133
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +251 -2159
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/interactive-queues.d.ts +96 -0
- package/dist/modes/interactive/interactive-queues.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-queues.js +183 -0
- package/dist/modes/interactive/interactive-queues.js.map +1 -0
- package/dist/modes/interactive/interactive-selectors.d.ts +95 -5
- package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +517 -6
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/startup-services.d.ts +31 -0
- package/dist/modes/interactive/startup-services.d.ts.map +1 -0
- package/dist/modes/interactive/startup-services.js +123 -0
- package/dist/modes/interactive/startup-services.js.map +1 -0
- package/dist/modes/memory-preheat.d.ts +11 -0
- package/dist/modes/memory-preheat.d.ts.map +1 -0
- package/dist/modes/memory-preheat.js +20 -0
- package/dist/modes/memory-preheat.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +3 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-host.d.ts +9 -1
- package/dist/plugins/ecosystem/node-package-install-host.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-host.js +79 -0
- package/dist/plugins/ecosystem/node-package-install-host.js.map +1 -1
- package/dist/remote/server-assembly.d.ts.map +1 -1
- package/dist/remote/server-assembly.js +7 -2
- package/dist/remote/server-assembly.js.map +1 -1
- package/dist/suites/builtin-suites.d.ts.map +1 -0
- package/dist/suites/builtin-suites.js.map +1 -0
- package/dist/suites/resolved-agent-profile.d.ts.map +1 -0
- package/dist/suites/resolved-agent-profile.js.map +1 -0
- package/dist/suites/suite-lifecycle.d.ts.map +1 -0
- package/dist/suites/suite-lifecycle.js.map +1 -0
- package/dist/suites/suite-loader.d.ts.map +1 -0
- package/dist/suites/suite-loader.js.map +1 -0
- package/dist/{modes/interactive/theme → theme}/dark.json +1 -1
- package/dist/{modes/interactive/theme → theme}/light.json +1 -1
- package/dist/{modes/interactive/theme → theme}/theme-controller.d.ts +1 -1
- package/dist/theme/theme-controller.d.ts.map +1 -0
- package/dist/{modes/interactive/theme → theme}/theme-controller.js +1 -1
- package/dist/theme/theme-controller.js.map +1 -0
- package/dist/{modes/interactive/theme → theme}/theme.d.ts +1 -1
- package/dist/theme/theme.d.ts.map +1 -0
- package/dist/{modes/interactive/theme → theme}/theme.js +5 -5
- package/dist/theme/theme.js.map +1 -0
- package/docs/compaction.md +7 -7
- package/docs/environment-variables.md +10 -4
- package/docs/keybindings.md +3 -3
- package/docs/models.md +17 -17
- package/docs/packages.md +1 -1
- package/docs/prompt-templates.md +1 -1
- package/docs/rpc.md +2 -2
- package/docs/sdk.md +5 -5
- package/docs/session-format.md +3 -3
- package/docs/settings.md +15 -1
- package/docs/shell-aliases.md +1 -1
- package/docs/skills.md +1 -1
- package/docs/terminal-setup.md +17 -17
- package/docs/themes.md +5 -5
- package/docs/tmux.md +4 -4
- package/docs/tui.md +1 -1
- package/docs/usage.md +292 -292
- package/docs/windows.md +1 -1
- package/examples/extensions/bash-spawn-hook/index.ts +1 -1
- package/examples/extensions/dynamic-resources/dynamic.json +1 -1
- package/examples/extensions/mcp-stdio/index.d.ts +64 -0
- package/examples/extensions/mcp-stdio/index.d.ts.map +1 -0
- package/examples/extensions/mcp-stdio/index.js +292 -0
- package/examples/extensions/mcp-stdio/index.js.map +1 -0
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -6
- package/examples/extensions/with-deps/plugin.json +1 -1
- package/package.json +2 -2
- package/dist/bundle/chunks/openai-responses-AUJQ3NWT.js +0 -2
- package/dist/bundle/chunks/virtual-modules-MRXD3RWG.js +0 -5
- package/dist/cli/experimental/commands/pi.d.ts +0 -15
- package/dist/cli/experimental/commands/pi.d.ts.map +0 -1
- package/dist/cli/experimental/commands/pi.js.map +0 -1
- package/dist/core/export-html/ansi-to-html.d.ts.map +0 -1
- package/dist/core/export-html/ansi-to-html.js.map +0 -1
- package/dist/core/export-html/index.d.ts.map +0 -1
- package/dist/core/export-html/index.js.map +0 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +0 -1
- package/dist/core/export-html/tool-renderer.js.map +0 -1
- package/dist/core/pi-manifest.d.ts +0 -7
- package/dist/core/pi-manifest.d.ts.map +0 -1
- package/dist/core/pi-manifest.js.map +0 -1
- package/dist/modes/interactive/model-catalog-refresh.d.ts.map +0 -1
- package/dist/modes/interactive/model-catalog-refresh.js.map +0 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +0 -1
- package/dist/modes/interactive/theme/theme-controller.js.map +0 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +0 -1
- package/dist/modes/interactive/theme/theme.js.map +0 -1
- package/dist/profiles/builtin-suites.d.ts.map +0 -1
- package/dist/profiles/builtin-suites.js.map +0 -1
- package/dist/profiles/resolved-agent-profile.d.ts.map +0 -1
- package/dist/profiles/resolved-agent-profile.js.map +0 -1
- package/dist/profiles/suite-lifecycle.d.ts.map +0 -1
- package/dist/profiles/suite-lifecycle.js.map +0 -1
- package/dist/profiles/suite-loader.d.ts.map +0 -1
- package/dist/profiles/suite-loader.js.map +0 -1
- package/dist/utils/deprecation.d.ts +0 -4
- package/dist/utils/deprecation.d.ts.map +0 -1
- package/dist/utils/deprecation.js +0 -13
- package/dist/utils/deprecation.js.map +0 -1
- /package/dist/{core/export-html → export-html}/ansi-to-html.d.ts +0 -0
- /package/dist/{core/export-html → export-html}/ansi-to-html.js +0 -0
- /package/dist/{core/export-html → export-html}/template.css +0 -0
- /package/dist/{core/export-html → export-html}/template.html +0 -0
- /package/dist/{core/export-html → export-html}/template.js +0 -0
- /package/dist/{core/export-html → export-html}/tool-renderer.js +0 -0
- /package/dist/{core/export-html → export-html}/vendor/highlight.min.js +0 -0
- /package/dist/{core/export-html → export-html}/vendor/marked.min.js +0 -0
- /package/dist/{profiles → suites}/builtin-suites.d.ts +0 -0
- /package/dist/{profiles → suites}/builtin-suites.js +0 -0
- /package/dist/{profiles → suites}/resolved-agent-profile.d.ts +0 -0
- /package/dist/{profiles → suites}/resolved-agent-profile.js +0 -0
- /package/dist/{profiles → suites}/suite-lifecycle.d.ts +0 -0
- /package/dist/{profiles → suites}/suite-lifecycle.js +0 -0
- /package/dist/{profiles → suites}/suite-loader.d.ts +0 -0
- /package/dist/{profiles → suites}/suite-loader.js +0 -0
- /package/dist/{modes/interactive/theme → theme}/theme-schema.json +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Capability lifecycle dispatch and the legacy tool-call gate for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls go through the session\n * parameter (not direct function calls) to preserve that dispatch.\n */\n\nimport type { AgentMessage } from \"@agent-forge/agent-core\";\nimport type { AssistantMessage, ToolResultMessage } from \"@agent-forge/ai/compat\";\nimport {\n\ttype AgentSessionInternals,\n\tdetachedSessionSnapshot,\n\tjsonSafeSessionSnapshot,\n} from \"./agent-session-internal.ts\";\nimport {\n\tAGENT_TASK_SETTLED_EVENT_ID,\n\tAGENT_TASK_SETTLED_EVENT_VERSION,\n\ttype AgentTaskSettledEventDataV1,\n\tINPUT_GATE_BLOCKED_EVENT_ID,\n\tINPUT_GATE_BLOCKED_EVENT_VERSION,\n\ttype InputGateBlockedEventDataV1,\n\tSESSION_AUTO_RETRY_EVENT_ID,\n\tSESSION_AUTO_RETRY_EVENT_VERSION,\n\tSESSION_COMPACTION_DECISION_EVENT_ID,\n\tSESSION_COMPACTION_DECISION_EVENT_VERSION,\n\tSESSION_COMPACTION_FAILED_EVENT_ID,\n\tSESSION_COMPACTION_FAILED_EVENT_VERSION,\n\tSESSION_END_EVENT_ID,\n\tSESSION_END_EVENT_VERSION,\n\ttype SessionAutoRetryEventDataV1,\n\ttype SessionCompactionDecisionEventDataV1,\n\ttype SessionCompactionFailedEventDataV1,\n\ttype SessionEndEventDataV1,\n\tTOOL_GATE_BLOCKED_EVENT_ID,\n\tTOOL_GATE_BLOCKED_EVENT_VERSION,\n\ttype ToolGateBlockedEventDataV1,\n} from \"./extensions/bootstrap-lifecycle.ts\";\nimport {\n\tAGENT_END_EVENT_ID,\n\tAGENT_END_EVENT_VERSION,\n\tAGENT_SETTLED_EVENT_ID,\n\tAGENT_SETTLED_EVENT_VERSION,\n\tAGENT_START_EVENT_ID,\n\tAGENT_START_EVENT_VERSION,\n\ttype AgentEndEventDataV1,\n\ttype AgentLifecycleEventDataV1,\n\tBEFORE_AGENT_START_EVENT_ID,\n\tBEFORE_AGENT_START_EVENT_VERSION,\n\tBEFORE_AGENT_START_EVENT_VERSION_V2,\n\ttype BeforeAgentStartEventDataV1,\n\ttype BeforeAgentStartEventDataV2,\n\tCONTEXT_ASSEMBLED_EVENT_ID,\n\tCONTEXT_ASSEMBLED_EVENT_VERSION,\n\ttype ContextOperationOptions,\n\tINPUT_RECEIVED_EVENT_ID,\n\tINPUT_RECEIVED_EVENT_VERSION,\n\tMESSAGE_END_EVENT_ID,\n\tMESSAGE_END_EVENT_VERSION,\n\tMESSAGE_START_EVENT_ID,\n\tMESSAGE_START_EVENT_VERSION,\n\ttype MessageBoundaryEventDataV1,\n\tMODEL_RESPONSE_EVENT_ID,\n\tMODEL_RESPONSE_EVENT_VERSION,\n\tMODEL_SELECT_EVENT_ID,\n\tMODEL_SELECT_EVENT_VERSION,\n\tMODEL_STREAM_EVENT_ID,\n\tMODEL_STREAM_EVENT_VERSION,\n\ttype ModelResponseEventDataV1,\n\ttype ModelSelectEventDataV1,\n\ttype ModelStreamEventDataV1,\n\tRESOURCES_DISCOVER_EVENT_ID,\n\tRESOURCES_DISCOVER_EVENT_VERSION,\n\tRESOURCES_DISCOVER_EVENT_VERSION_V2,\n\ttype ResourcesDiscoverEventDataV2,\n\tSESSION_CONTEXT_REPLACED_EVENT_ID,\n\tSESSION_CONTEXT_REPLACED_EVENT_VERSION,\n\tSESSION_ENTRY_APPENDED_EVENT_ID,\n\tSESSION_ENTRY_APPENDED_EVENT_VERSION,\n\tSESSION_INFO_CHANGED_EVENT_ID,\n\tSESSION_INFO_CHANGED_EVENT_VERSION,\n\tSESSION_RELOAD_EVENT_ID,\n\tSESSION_RELOAD_EVENT_VERSION,\n\tSESSION_START_EVENT_ID,\n\tSESSION_START_EVENT_VERSION,\n\ttype SessionEntryAppendedEventDataV1,\n\ttype SessionInfoChangedEventDataV1,\n\ttype SessionReloadEventDataV1,\n\ttype SessionStartEventDataV1,\n\tTHINKING_LEVEL_SELECT_EVENT_ID,\n\tTHINKING_LEVEL_SELECT_EVENT_VERSION,\n\ttype ThinkingLevelSelectEventDataV1,\n\tTOOL_COMMIT_EVENT_ID,\n\tTOOL_COMMIT_EVENT_VERSION,\n\tTOOL_EXECUTION_START_EVENT_ID,\n\tTOOL_EXECUTION_START_EVENT_VERSION,\n\tTOOL_RESULT_EVENT_ID,\n\tTOOL_RESULT_EVENT_VERSION,\n\ttype ToolCommitEventDataV1,\n\ttype ToolExecutionStartEventDataV1,\n\ttype ToolResultEventDataV1,\n\tTURN_END_EVENT_ID,\n\tTURN_END_EVENT_VERSION,\n\tTURN_START_EVENT_ID,\n\tTURN_START_EVENT_VERSION,\n\ttype TurnEndEventDataV1,\n\ttype TurnStartEventDataV1,\n\tUSER_BASH_EVENT_ID,\n\tUSER_BASH_EVENT_VERSION,\n} from \"./extensions/index.ts\";\nimport type { BuildSystemPromptOptions } from \"./system-prompt.ts\";\n\nexport async function dispatchModelStreamLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: AgentMessage,\n\teventName: ModelStreamEventDataV1[\"event\"],\n\tphase: ModelStreamEventDataV1[\"phase\"],\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\tconst state = session._modelStreamState;\n\tif (!runtime || !state || !runtime.hasLifecycleEvent(MODEL_STREAM_EVENT_ID, MODEL_STREAM_EVENT_VERSION)) return;\n\tif (message.role !== \"assistant\") return;\n\tstate.sequence += 1;\n\tconst terminal = eventName === \"done\" || eventName === \"error\";\n\tlet partial: unknown | null = null;\n\ttry {\n\t\tpartial = jsonSafeSessionSnapshot(message);\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${MODEL_STREAM_EVENT_ID}@${MODEL_STREAM_EVENT_VERSION}/snapshot`,\n\t\t);\n\t}\n\tconst data: ModelStreamEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tstreamId: state.streamId,\n\t\tsequence: state.sequence,\n\t\tphase,\n\t\tevent: eventName,\n\t\tpartial,\n\t\tterminal,\n\t\terror:\n\t\t\teventName === \"error\"\n\t\t\t\t? {\n\t\t\t\t\t\tcode: message.stopReason === \"aborted\" ? \"aborted\" : \"provider_error\",\n\t\t\t\t\t\tmessage: message.errorMessage ?? \"Model stream failed\",\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t};\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: MODEL_STREAM_EVENT_ID,\n\t\t\tversion: MODEL_STREAM_EVENT_VERSION,\n\t\t\tphase,\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${MODEL_STREAM_EVENT_ID}@${MODEL_STREAM_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${MODEL_STREAM_EVENT_ID}@${MODEL_STREAM_EVENT_VERSION}`,\n\t\t);\n\t}\n}\n\n/**\n * Deliver the agent.start lifecycle event to the capability runtime.\n * The turn correlation id is usually absent at the run start boundary; the\n * dispatch is untraced in that case, matching the idle-time replace semantics.\n */\nexport async function dispatchAgentStartLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回仅在 runtime 缺席时可达\n\tif (!runtime?.hasLifecycleEvent(AGENT_START_EVENT_ID, AGENT_START_EVENT_VERSION)) {\n\t\treturn;\n\t}\n\tconst data: AgentLifecycleEventDataV1 = { version: 1, sessionId: session.sessionId };\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: AGENT_START_EVENT_ID,\n\t\t\tversion: AGENT_START_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${AGENT_START_EVENT_ID}@${AGENT_START_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${AGENT_START_EVENT_ID}@${AGENT_START_EVENT_VERSION}`,\n\t\t);\n\t}\n}\n\n/**\n * Deliver one committed lifecycle event with host-assembled facts.\n * Used by the host channels whose facts live outside the dedicated dispatchers\n * (user.bash / input.received / context.assembled / resources.discover@1): the\n * producer knows the facts, the session assembles the envelope (version,\n * sessionId) and owns the guard, the delivery trace, and the failure\n * observation.\n */\nexport async function dispatchCommittedLifecycleEvent(\n\tsession: AgentSessionInternals,\n\teventId: string,\n\tversion: number,\n\tfacts: Record<string, unknown>,\n): Promise<void> {\n\tawait dispatchCommittedSessionLifecycle(session, eventId, version, {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\t...facts,\n\t});\n}\n\n/** Deliver the user.bash lifecycle event (facts only; the command text never enters the envelope). */\nexport function dispatchUserBashLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { cwd: string; excludeFromContext: boolean },\n): void {\n\tvoid dispatchCommittedLifecycleEvent(session, USER_BASH_EVENT_ID, USER_BASH_EVENT_VERSION, facts);\n}\n\n/** Deliver the input.received lifecycle event (facts only; the input text never enters the envelope). */\nexport function dispatchInputReceivedLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { source: string; textLength: number },\n): void {\n\tvoid dispatchCommittedLifecycleEvent(session, INPUT_RECEIVED_EVENT_ID, INPUT_RECEIVED_EVENT_VERSION, facts);\n}\n\n/** Deliver the context.assembled lifecycle event (facts only; the messages never enter the envelope). */\nexport function dispatchContextAssembledLifecycle(session: AgentSessionInternals, messageCount: number): void {\n\tvoid dispatchCommittedLifecycleEvent(session, CONTEXT_ASSEMBLED_EVENT_ID, CONTEXT_ASSEMBLED_EVENT_VERSION, {\n\t\tmessageCount,\n\t});\n}\n\n/** Deliver the resources.discover@1 committed observe event (facts only). */\nexport function dispatchResourcesDiscoverV1Lifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { cwd: string; reason: \"startup\" | \"reload\" },\n): void {\n\tvoid dispatchCommittedLifecycleEvent(session, RESOURCES_DISCOVER_EVENT_ID, RESOURCES_DISCOVER_EVENT_VERSION, facts);\n}\n\n/** Shared committed dispatch for the turn/message boundary lifecycle events. */\nasync function dispatchCommittedSessionLifecycle(\n\tsession: AgentSessionInternals,\n\teventId: string,\n\tversion: number,\n\tdata: unknown,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime?.hasLifecycleEvent(eventId, version)) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: eventId,\n\t\t\tversion,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${eventId}@${version}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(error, \"<capability-lifecycle>\", `${eventId}@${version}`);\n\t}\n}\n\n/**\n * Deliver the session.start lifecycle event to the capability runtime.\n */\nexport async function dispatchSessionStartLifecycle(\n\tsession: AgentSessionInternals,\n\treason: \"startup\" | \"reload\" | \"new\" | \"resume\" | \"fork\",\n\tpreviousSessionFile?: string,\n): Promise<void> {\n\tconst data: SessionStartEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\treason,\n\t\t...(previousSessionFile === undefined ? {} : { previousSessionFile }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, SESSION_START_EVENT_ID, SESSION_START_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the session.info.changed lifecycle event to the capability runtime.\n */\nexport async function dispatchSessionInfoChangedLifecycle(\n\tsession: AgentSessionInternals,\n\tname: string | undefined,\n): Promise<void> {\n\tconst data: SessionInfoChangedEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\t...(name === undefined ? {} : { name }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_INFO_CHANGED_EVENT_ID,\n\t\tSESSION_INFO_CHANGED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the session.entry.appended lifecycle event to the capability runtime.\n * Entry data is deliberately excluded from the envelope: it can be arbitrarily\n * large; entryId/entryType are the minimal facts.\n */\nexport async function dispatchSessionEntryAppendedLifecycle(\n\tsession: AgentSessionInternals,\n\tentryId: string,\n\tentryType: string,\n): Promise<void> {\n\tconst data: SessionEntryAppendedEventDataV1 = { version: 1, sessionId: session.sessionId, entryId, entryType };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_ENTRY_APPENDED_EVENT_ID,\n\t\tSESSION_ENTRY_APPENDED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the agent.end lifecycle event to the capability runtime.\n */\nexport async function dispatchAgentEndLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst data: AgentEndEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tmessageCount: session.agent.state.messages.length,\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, AGENT_END_EVENT_ID, AGENT_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the before.agent.start lifecycle event to the capability runtime.\n * The prompt text and assembled system prompt are deliberately excluded from\n * the envelope: arbitrarily large and potentially sensitive; hasImages is the\n * minimal fact.\n */\nexport async function dispatchBeforeAgentStartLifecycle(\n\tsession: AgentSessionInternals,\n\thasImages: boolean,\n): Promise<void> {\n\tconst data: BeforeAgentStartEventDataV1 = { version: 1, sessionId: session.sessionId, hasImages };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tBEFORE_AGENT_START_EVENT_ID,\n\t\tBEFORE_AGENT_START_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\ninterface LifecycleFailureReport {\n\treport?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] };\n}\n\n/**\n * Deliver the before.agent.start@2 candidate event and report whether a\n * capability transform replaced the system prompt.\n *\n * Precedence contract: the legacy before_agent_start channel runs first and\n * applies its own override; this dispatch runs after it, so a transform that\n * yields a different systemPrompt is the later writer and wins. A missing\n * registration, a transform returning the input verbatim (\"no replacement\"),\n * or a failed delivery leaves the legacy outcome untouched; delivery errors\n * go through the same non-fatal observation sink as the committed dispatches.\n */\nexport async function dispatchBeforeAgentStartV2Lifecycle(\n\tsession: AgentSessionInternals,\n\tsystemPrompt: string,\n\tsystemPromptOptions: BuildSystemPromptOptions,\n): Promise<string | undefined> {\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime?.hasLifecycleEvent(BEFORE_AGENT_START_EVENT_ID, BEFORE_AGENT_START_EVENT_VERSION_V2)) {\n\t\treturn undefined;\n\t}\n\tconst data: BeforeAgentStartEventDataV2 = {\n\t\tversion: 2,\n\t\tsessionId: session.sessionId,\n\t\tsystemPrompt,\n\t\tsystemPromptOptions: detachedSessionSnapshot(systemPromptOptions),\n\t};\n\tconst eventLabel = `${BEFORE_AGENT_START_EVENT_ID}@${BEFORE_AGENT_START_EVENT_VERSION_V2}`;\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: BEFORE_AGENT_START_EVENT_ID,\n\t\t\tversion: BEFORE_AGENT_START_EVENT_VERSION_V2,\n\t\t\tphase: \"candidate\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t}\n\t\treturn delivery.data.systemPrompt === systemPrompt ? undefined : delivery.data.systemPrompt;\n\t} catch (error) {\n\t\tconst report = (error as LifecycleFailureReport).report;\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(error, \"<capability-lifecycle>\", eventLabel);\n\t\t}\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Deliver the resources.discover@2 candidate event and return the transform\n * contributions. The legacy resources_discover collection (and the v1\n * committed observe dispatch inside it) runs first; the v2 contribution is\n * the later writer and is appended to the legacy result. Delivery errors are\n * observed through the same non-fatal sink and yield an empty contribution.\n */\nexport async function dispatchResourcesDiscoverV2Lifecycle(\n\tsession: AgentSessionInternals,\n\treason: \"startup\" | \"reload\",\n): Promise<{\n\tskillPaths: Array<{ path: string; extensionPath: string }>;\n\tpromptPaths: Array<{ path: string; extensionPath: string }>;\n\tthemePaths: Array<{ path: string; extensionPath: string }>;\n}> {\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime?.hasLifecycleEvent(RESOURCES_DISCOVER_EVENT_ID, RESOURCES_DISCOVER_EVENT_VERSION_V2)) {\n\t\treturn { skillPaths: [], promptPaths: [], themePaths: [] };\n\t}\n\tconst data: ResourcesDiscoverEventDataV2 = {\n\t\tversion: 2,\n\t\tsessionId: session.sessionId,\n\t\tcwd: session._cwd,\n\t\treason,\n\t};\n\tconst eventLabel = `${RESOURCES_DISCOVER_EVENT_ID}@${RESOURCES_DISCOVER_EVENT_VERSION_V2}`;\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: RESOURCES_DISCOVER_EVENT_ID,\n\t\t\tversion: RESOURCES_DISCOVER_EVENT_VERSION_V2,\n\t\t\tphase: \"candidate\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t}\n\t\treturn {\n\t\t\tskillPaths: delivery.data.skillPaths ?? [],\n\t\t\tpromptPaths: delivery.data.promptPaths ?? [],\n\t\t\tthemePaths: delivery.data.themePaths ?? [],\n\t\t};\n\t} catch (error) {\n\t\tconst report = (error as LifecycleFailureReport).report;\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(error, \"<capability-lifecycle>\", eventLabel);\n\t\t}\n\t\treturn { skillPaths: [], promptPaths: [], themePaths: [] };\n\t}\n}\n\n/**\n * Deliver the model.select lifecycle event to the capability runtime.\n * Only model facts (provider/id) enter the envelope — the full Model object\n * carries api instances, headers, and cost, which stay internal (same ruling\n * as the R3-4 SessionAPI facts views).\n */\nexport async function dispatchModelSelectLifecycle(\n\tsession: AgentSessionInternals,\n\tnextModel: { provider: string; id: string },\n\tsource: \"set\" | \"cycle\" | \"restore\",\n): Promise<void> {\n\tconst data: ModelSelectEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tprovider: nextModel.provider,\n\t\tid: nextModel.id,\n\t\tsource,\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, MODEL_SELECT_EVENT_ID, MODEL_SELECT_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the thinking_level.select lifecycle event to the capability runtime.\n */\nexport async function dispatchThinkingLevelSelectLifecycle(\n\tsession: AgentSessionInternals,\n\tlevel: string,\n\tpreviousLevel: string,\n): Promise<void> {\n\tconst data: ThinkingLevelSelectEventDataV1 = { version: 1, sessionId: session.sessionId, level, previousLevel };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tTHINKING_LEVEL_SELECT_EVENT_ID,\n\t\tTHINKING_LEVEL_SELECT_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the tool.execution.start lifecycle event to the capability runtime.\n * Tool arguments are deliberately excluded from the envelope: they can be\n * arbitrarily large and may carry sensitive values.\n */\nexport async function dispatchToolExecutionStartLifecycle(\n\tsession: AgentSessionInternals,\n\ttoolCallId: string,\n\ttoolName: string,\n): Promise<void> {\n\tconst data: ToolExecutionStartEventDataV1 = { version: 1, sessionId: session.sessionId, toolCallId, toolName };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tTOOL_EXECUTION_START_EVENT_ID,\n\t\tTOOL_EXECUTION_START_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the tool.gate.blocked lifecycle event (one beforeToolCall chain link\n * returned a block short-circuit) to the capability runtime. The blocking\n * plugin's identity is deliberately absent: the hook chain has no identity\n * surface. After dispose the revoked runtime makes hasLifecycleEvent false, so\n * the helper no-ops safely.\n */\nexport async function dispatchToolGateBlockedLifecycle(\n\tsession: AgentSessionInternals,\n\ttoolCallId: string,\n\ttoolName: string,\n\treason?: string,\n): Promise<void> {\n\tconst data: ToolGateBlockedEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\ttoolCallId,\n\t\ttoolName,\n\t\t...(reason === undefined ? {} : { reason }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, TOOL_GATE_BLOCKED_EVENT_ID, TOOL_GATE_BLOCKED_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the input.gate.blocked lifecycle event (one beforeInput chain link\n * returned a block short-circuit, 输入 gate A3) to the capability runtime.\n * Facts only — the rejected input's text never enters the envelope. The\n * blocking plugin's identity is deliberately absent: the hook chain has no\n * identity surface. After dispose the revoked runtime makes\n * hasLifecycleEvent false, so the helper no-ops safely.\n */\nexport async function dispatchInputGateBlockedLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { source: string; textLength: number; reason?: string },\n): Promise<void> {\n\tconst data: InputGateBlockedEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tsource: facts.source,\n\t\ttextLength: facts.textLength,\n\t\t...(facts.reason === undefined ? {} : { reason: facts.reason }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tINPUT_GATE_BLOCKED_EVENT_ID,\n\t\tINPUT_GATE_BLOCKED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the turn.start lifecycle event to the capability runtime.\n */\nexport async function dispatchTurnStartLifecycle(session: AgentSessionInternals, turnIndex: number): Promise<void> {\n\tconst data: TurnStartEventDataV1 = { version: 1, sessionId: session.sessionId, turnIndex };\n\tawait dispatchCommittedSessionLifecycle(session, TURN_START_EVENT_ID, TURN_START_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the turn.end lifecycle event to the capability runtime. The\n * turn-level `outcome` is present only when the turn ended in a deviation\n * (\"aborted\"/\"error\", judged from the turn's own assistant message);\n * completed turns omit the key.\n */\nexport async function dispatchTurnEndLifecycle(\n\tsession: AgentSessionInternals,\n\tturnIndex: number,\n\tmessageCount: number,\n\toutcome?: TurnEndEventDataV1[\"outcome\"],\n): Promise<void> {\n\tconst data: TurnEndEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tturnIndex,\n\t\tmessageCount,\n\t\t...(outcome === undefined ? {} : { outcome }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, TURN_END_EVENT_ID, TURN_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the message.start lifecycle event to the capability runtime.\n */\nexport async function dispatchMessageStartLifecycle(session: AgentSessionInternals, role: string): Promise<void> {\n\tconst data: MessageBoundaryEventDataV1 = { version: 1, sessionId: session.sessionId, role };\n\tawait dispatchCommittedSessionLifecycle(session, MESSAGE_START_EVENT_ID, MESSAGE_START_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the message.end lifecycle event to the capability runtime.\n */\nexport async function dispatchMessageEndLifecycle(session: AgentSessionInternals, role: string): Promise<void> {\n\tconst data: MessageBoundaryEventDataV1 = { version: 1, sessionId: session.sessionId, role };\n\tawait dispatchCommittedSessionLifecycle(session, MESSAGE_END_EVENT_ID, MESSAGE_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the agent.settled lifecycle event to the capability runtime.\n * agent_settled is the prompt run's settlement boundary, so it joins the\n * prompt run's trace via the turn correlation id.\n */\nexport async function dispatchAgentSettledLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回仅在 runtime 缺席时可达\n\tif (!runtime?.hasLifecycleEvent(AGENT_SETTLED_EVENT_ID, AGENT_SETTLED_EVENT_VERSION)) {\n\t\treturn;\n\t}\n\tconst data: AgentLifecycleEventDataV1 = { version: 1, sessionId: session.sessionId };\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: AGENT_SETTLED_EVENT_ID,\n\t\t\tversion: AGENT_SETTLED_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${AGENT_SETTLED_EVENT_ID}@${AGENT_SETTLED_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${AGENT_SETTLED_EVENT_ID}@${AGENT_SETTLED_EVENT_VERSION}`,\n\t\t);\n\t}\n}\n\n/** Notify observers only after the runtime context projection has been committed. */\nexport async function dispatchContextReplacedLifecycle(\n\tsession: AgentSessionInternals,\n\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\tstrategyName?: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(SESSION_CONTEXT_REPLACED_EVENT_ID, SESSION_CONTEXT_REPLACED_EVENT_VERSION)) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: SESSION_CONTEXT_REPLACED_EVENT_ID,\n\t\t\tversion: SESSION_CONTEXT_REPLACED_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata: {\n\t\t\t\tversion: 1,\n\t\t\t\tsessionId: session.sessionId,\n\t\t\t\treason,\n\t\t\t\tmessageCount: session.agent.state.messages.length,\n\t\t\t\t...(strategyName === undefined ? {} : { strategyName }),\n\t\t\t},\n\t\t\tsource: \"agent-session\",\n\t\t\t// In-turn transitions (retry, overflow recovery, auto compaction)\n\t\t\t// join the prompt run's trace; idle-time replaces stay untraced.\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${SESSION_CONTEXT_REPLACED_EVENT_ID}@${SESSION_CONTEXT_REPLACED_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${SESSION_CONTEXT_REPLACED_EVENT_ID}@${SESSION_CONTEXT_REPLACED_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${SESSION_CONTEXT_REPLACED_EVENT_ID}@${SESSION_CONTEXT_REPLACED_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Deliver the finalized assistant response only after its session entry is committed. */\nexport async function dispatchModelResponseLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\tentryId: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(MODEL_RESPONSE_EVENT_ID, MODEL_RESPONSE_EVENT_VERSION)) return;\n\tconst data: ModelResponseEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tentryId,\n\t\trevision: detachedSessionSnapshot(session.sessionManager.getRevision()),\n\t\tprovider: message.provider,\n\t\tmodel: message.model,\n\t\tstopReason: message.stopReason,\n\t\tmessage: detachedSessionSnapshot(message),\n\t\t...(message.errorMessage === undefined ? {} : { errorMessage: message.errorMessage }),\n\t};\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: MODEL_RESPONSE_EVENT_ID,\n\t\t\tversion: MODEL_RESPONSE_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${MODEL_RESPONSE_EVENT_ID}@${MODEL_RESPONSE_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${MODEL_RESPONSE_EVENT_ID}@${MODEL_RESPONSE_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${MODEL_RESPONSE_EVENT_ID}@${MODEL_RESPONSE_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Deliver the finalized tool result only after its session entry is committed. */\nexport async function dispatchToolCommitLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: ToolResultMessage,\n\tentryId: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(TOOL_COMMIT_EVENT_ID, TOOL_COMMIT_EVENT_VERSION)) return;\n\ttry {\n\t\tconst data: ToolCommitEventDataV1 = {\n\t\t\tversion: 1,\n\t\t\tsessionId: session.sessionId,\n\t\t\tentryId,\n\t\t\trevision: detachedSessionSnapshot(session.sessionManager.getRevision()),\n\t\t\ttoolCallId: message.toolCallId,\n\t\t\ttoolName: message.toolName,\n\t\t\tisError: message.isError,\n\t\t};\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: TOOL_COMMIT_EVENT_ID,\n\t\t\tversion: TOOL_COMMIT_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${TOOL_COMMIT_EVENT_ID}@${TOOL_COMMIT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${TOOL_COMMIT_EVENT_ID}@${TOOL_COMMIT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${TOOL_COMMIT_EVENT_ID}@${TOOL_COMMIT_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Deliver the finalized tool result only after its session entry is committed. */\nexport async function dispatchToolResultLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: ToolResultMessage,\n\tentryId: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(TOOL_RESULT_EVENT_ID, TOOL_RESULT_EVENT_VERSION)) return;\n\ttry {\n\t\tconst data: ToolResultEventDataV1 = {\n\t\t\tversion: 1,\n\t\t\tsessionId: session.sessionId,\n\t\t\tentryId,\n\t\t\trevision: detachedSessionSnapshot(session.sessionManager.getRevision()),\n\t\t\ttoolCallId: message.toolCallId,\n\t\t\ttoolName: message.toolName,\n\t\t\tisError: message.isError,\n\t\t\tmessage: detachedSessionSnapshot(message),\n\t\t};\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: TOOL_RESULT_EVENT_ID,\n\t\t\tversion: TOOL_RESULT_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${TOOL_RESULT_EVENT_ID}@${TOOL_RESULT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${TOOL_RESULT_EVENT_ID}@${TOOL_RESULT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${TOOL_RESULT_EVENT_ID}@${TOOL_RESULT_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Notify the rebuilt runtime only after all reload work has committed. */\nexport async function dispatchSessionReloadLifecycle(\n\tsession: AgentSessionInternals,\n\tgeneration: number,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(SESSION_RELOAD_EVENT_ID, SESSION_RELOAD_EVENT_VERSION)) return;\n\tconst data: SessionReloadEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tgeneration,\n\t\treason: \"reload\",\n\t};\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: SESSION_RELOAD_EVENT_ID,\n\t\t\tversion: SESSION_RELOAD_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${SESSION_RELOAD_EVENT_ID}@${SESSION_RELOAD_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${SESSION_RELOAD_EVENT_ID}@${SESSION_RELOAD_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${SESSION_RELOAD_EVENT_ID}@${SESSION_RELOAD_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Deliver the session.auto.retry lifecycle event to the capability runtime.\n * Only the actual retry path dispatches: a \"decided not to retry\" outcome has\n * no event. Facts mirror the same-turn `auto_retry_start` session event.\n */\nexport async function dispatchAutoRetryLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { attempt: number; maxAttempts: number; delayMs: number; errorMessage: string },\n): Promise<void> {\n\tconst data: SessionAutoRetryEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_AUTO_RETRY_EVENT_ID,\n\t\tSESSION_AUTO_RETRY_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver one compaction policy decision (including negative verdicts) to the\n * capability runtime. The threshold triplet is attached only when the caller\n * measured it; the overflow path omits it rather than fabricating values.\n */\nexport async function dispatchCompactionDecisionLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: {\n\t\treason: SessionCompactionDecisionEventDataV1[\"reason\"];\n\t\tcompact: boolean;\n\t\twillRetry: boolean;\n\t\tcontextTokens?: number;\n\t\tcontextWindow?: number;\n\t\treserveTokens?: number;\n\t\tfailureMessage?: string;\n\t},\n): Promise<void> {\n\tconst data: SessionCompactionDecisionEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_COMPACTION_DECISION_EVENT_ID,\n\t\tSESSION_COMPACTION_DECISION_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the session.compaction.failed lifecycle event to the capability\n * runtime. Callers dispatch only on genuine failures; cancellation paths\n * (extension cancel, abort) stay unreported.\n */\nexport async function dispatchCompactionFailedLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { reason: SessionCompactionFailedEventDataV1[\"reason\"]; errorMessage: string },\n): Promise<void> {\n\tconst data: SessionCompactionFailedEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_COMPACTION_FAILED_EVENT_ID,\n\t\tSESSION_COMPACTION_FAILED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the session.end lifecycle event to the capability runtime.\n * Dispatched exactly once from dispose() while the capability runtime is still\n * alive (before capability-plugin disposal, so the observability plugin can\n * still write the final trace record); dispose re-entry returns the same\n * dispose promise, so no second dispatch happens. A reload never reaches this\n * dispatcher — session.start(reason:\"reload\") plus session.reload@1 cover a\n * reload. The turn correlation id is normally absent at dispose time; the\n * delivery is untraced then (the shared dispatch tolerates the absence).\n */\nexport async function dispatchSessionEndLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst data: SessionEndEventDataV1 = { version: 1, sessionId: session.sessionId };\n\tawait dispatchCommittedSessionLifecycle(session, SESSION_END_EVENT_ID, SESSION_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the agent.task.settled lifecycle event (one settled background\n * delegation task, dispatched from the host digest sink) to the capability\n * runtime. `facts.taskSessionId` is the child session the task ran in; the\n * parent sessionId is filled here. After dispose the revoked runtime makes\n * hasLifecycleEvent false, so the helper no-ops safely.\n */\nexport async function dispatchAgentTaskSettledLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: {\n\t\ttaskSessionId: string;\n\t\ttaskId: string;\n\t\tstatus: AgentTaskSettledEventDataV1[\"status\"];\n\t\treasonCode?: string;\n\t},\n): Promise<void> {\n\tconst data: AgentTaskSettledEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tAGENT_TASK_SETTLED_EVENT_ID,\n\t\tAGENT_TASK_SETTLED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\nexport function observeLifecycleDeliveryError(\n\tsession: AgentSessionInternals,\n\terror: unknown,\n\tsource: string,\n\tevent: string,\n): void {\n\t// Non-fatal delivery sink: the original lifecycle failure has already been\n\t// isolated from the canonical commit, so a delivery failure only lands in\n\t// the host process log (no-op when no hostLogger was configured).\n\tsession._hostLogger?.error(\"session\", \"capability lifecycle delivery failed\", {\n\t\t...(session.sessionId === undefined ? {} : { sessionId: session.sessionId }),\n\t\tfields: { event, source },\n\t\tcause: error,\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Capability lifecycle dispatch and the legacy tool-call gate for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls go through the session\n * parameter (not direct function calls) to preserve that dispatch.\n */\n\nimport type { AgentMessage } from \"@agent-forge/agent-core\";\nimport type { AssistantMessage, ToolResultMessage } from \"@agent-forge/ai/compat\";\nimport {\n\ttype AgentSessionInternals,\n\tdetachedSessionSnapshot,\n\tjsonSafeSessionSnapshot,\n} from \"./agent-session-internal.ts\";\nimport {\n\tAGENT_TASK_SETTLED_EVENT_ID,\n\tAGENT_TASK_SETTLED_EVENT_VERSION,\n\ttype AgentTaskSettledEventDataV1,\n\tINPUT_GATE_BLOCKED_EVENT_ID,\n\tINPUT_GATE_BLOCKED_EVENT_VERSION,\n\ttype InputGateBlockedEventDataV1,\n\tSESSION_AUTO_RETRY_EVENT_ID,\n\tSESSION_AUTO_RETRY_EVENT_VERSION,\n\tSESSION_COMPACTION_DECISION_EVENT_ID,\n\tSESSION_COMPACTION_DECISION_EVENT_VERSION,\n\tSESSION_COMPACTION_FAILED_EVENT_ID,\n\tSESSION_COMPACTION_FAILED_EVENT_VERSION,\n\tSESSION_END_EVENT_ID,\n\tSESSION_END_EVENT_VERSION,\n\ttype SessionAutoRetryEventDataV1,\n\ttype SessionCompactionDecisionEventDataV1,\n\ttype SessionCompactionFailedEventDataV1,\n\ttype SessionEndEventDataV1,\n\tTOOL_GATE_BLOCKED_EVENT_ID,\n\tTOOL_GATE_BLOCKED_EVENT_VERSION,\n\ttype ToolGateBlockedEventDataV1,\n} from \"./extensions/bootstrap-lifecycle.ts\";\nimport {\n\tAGENT_END_EVENT_ID,\n\tAGENT_END_EVENT_VERSION,\n\tAGENT_SETTLED_EVENT_ID,\n\tAGENT_SETTLED_EVENT_VERSION,\n\tAGENT_START_EVENT_ID,\n\tAGENT_START_EVENT_VERSION,\n\ttype AgentEndEventDataV1,\n\ttype AgentLifecycleEventDataV1,\n\tBEFORE_AGENT_START_EVENT_ID,\n\tBEFORE_AGENT_START_EVENT_VERSION,\n\tBEFORE_AGENT_START_EVENT_VERSION_V2,\n\ttype BeforeAgentStartEventDataV1,\n\ttype BeforeAgentStartEventDataV2,\n\tCONTEXT_ASSEMBLED_EVENT_ID,\n\tCONTEXT_ASSEMBLED_EVENT_VERSION,\n\ttype ContextOperationOptions,\n\tINPUT_RECEIVED_EVENT_ID,\n\tINPUT_RECEIVED_EVENT_VERSION,\n\tMESSAGE_END_EVENT_ID,\n\tMESSAGE_END_EVENT_VERSION,\n\tMESSAGE_START_EVENT_ID,\n\tMESSAGE_START_EVENT_VERSION,\n\ttype MessageBoundaryEventDataV1,\n\tMODEL_RESPONSE_EVENT_ID,\n\tMODEL_RESPONSE_EVENT_VERSION,\n\tMODEL_SELECT_EVENT_ID,\n\tMODEL_SELECT_EVENT_VERSION,\n\tMODEL_STREAM_EVENT_ID,\n\tMODEL_STREAM_EVENT_VERSION,\n\ttype ModelResponseEventDataV1,\n\ttype ModelSelectEventDataV1,\n\ttype ModelStreamEventDataV1,\n\tRESOURCES_DISCOVER_EVENT_ID,\n\tRESOURCES_DISCOVER_EVENT_VERSION,\n\tRESOURCES_DISCOVER_EVENT_VERSION_V2,\n\ttype ResourcesDiscoverEventDataV2,\n\tSESSION_CONTEXT_REPLACED_EVENT_ID,\n\tSESSION_CONTEXT_REPLACED_EVENT_VERSION,\n\tSESSION_ENTRY_APPENDED_EVENT_ID,\n\tSESSION_ENTRY_APPENDED_EVENT_VERSION,\n\tSESSION_INFO_CHANGED_EVENT_ID,\n\tSESSION_INFO_CHANGED_EVENT_VERSION,\n\tSESSION_RELOAD_EVENT_ID,\n\tSESSION_RELOAD_EVENT_VERSION,\n\tSESSION_START_EVENT_ID,\n\tSESSION_START_EVENT_VERSION,\n\ttype SessionEntryAppendedEventDataV1,\n\ttype SessionInfoChangedEventDataV1,\n\ttype SessionReloadEventDataV1,\n\ttype SessionStartEventDataV1,\n\tTHINKING_LEVEL_SELECT_EVENT_ID,\n\tTHINKING_LEVEL_SELECT_EVENT_VERSION,\n\ttype ThinkingLevelSelectEventDataV1,\n\tTOOL_COMMIT_EVENT_ID,\n\tTOOL_COMMIT_EVENT_VERSION,\n\tTOOL_EXECUTION_START_EVENT_ID,\n\tTOOL_EXECUTION_START_EVENT_VERSION,\n\tTOOL_RESULT_EVENT_ID,\n\tTOOL_RESULT_EVENT_VERSION,\n\ttype ToolCommitEventDataV1,\n\ttype ToolExecutionStartEventDataV1,\n\ttype ToolResultEventDataV1,\n\tTURN_END_EVENT_ID,\n\tTURN_END_EVENT_VERSION,\n\tTURN_START_EVENT_ID,\n\tTURN_START_EVENT_VERSION,\n\ttype TurnEndEventDataV1,\n\ttype TurnStartEventDataV1,\n\tUSER_BASH_EVENT_ID,\n\tUSER_BASH_EVENT_VERSION,\n} from \"./extensions/index.ts\";\nimport type { BuildSystemPromptOptions } from \"./system-prompt.ts\";\n\nexport async function dispatchModelStreamLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: AgentMessage,\n\teventName: ModelStreamEventDataV1[\"event\"],\n\tphase: ModelStreamEventDataV1[\"phase\"],\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\tconst state = session._modelStreamState;\n\t// Subscriber gate sits BEFORE the sequence increment on purpose: the\n\t// model.stream@1 contract pins per-streamId sequence to start at 1 and stay\n\t// strictly contiguous (docs/design/插件基础能力设计.md §model.stream;跳号是\n\t// 协议错误), which is an observer-facing guarantee. Undelivered deltas must\n\t// not consume sequence numbers, so a late subscriber still observes a\n\t// contiguous stream from 1. Skipping the increment when nobody observes also\n\t// skips the per-delta O(L) JSON snapshot and the dispatch-path clones.\n\tif (\n\t\t!runtime ||\n\t\t!state ||\n\t\t!runtime.hasLifecycleEvent(MODEL_STREAM_EVENT_ID, MODEL_STREAM_EVENT_VERSION) ||\n\t\t!runtime.hasLifecycleSubscribers(MODEL_STREAM_EVENT_ID, MODEL_STREAM_EVENT_VERSION)\n\t) {\n\t\treturn;\n\t}\n\tif (message.role !== \"assistant\") return;\n\tstate.sequence += 1;\n\tconst terminal = eventName === \"done\" || eventName === \"error\";\n\tlet partial: unknown | null = null;\n\ttry {\n\t\tpartial = jsonSafeSessionSnapshot(message);\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${MODEL_STREAM_EVENT_ID}@${MODEL_STREAM_EVENT_VERSION}/snapshot`,\n\t\t);\n\t}\n\tconst data: ModelStreamEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tstreamId: state.streamId,\n\t\tsequence: state.sequence,\n\t\tphase,\n\t\tevent: eventName,\n\t\tpartial,\n\t\tterminal,\n\t\terror:\n\t\t\teventName === \"error\"\n\t\t\t\t? {\n\t\t\t\t\t\tcode: message.stopReason === \"aborted\" ? \"aborted\" : \"provider_error\",\n\t\t\t\t\t\tmessage: message.errorMessage ?? \"Model stream failed\",\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t};\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: MODEL_STREAM_EVENT_ID,\n\t\t\tversion: MODEL_STREAM_EVENT_VERSION,\n\t\t\tphase,\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${MODEL_STREAM_EVENT_ID}@${MODEL_STREAM_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${MODEL_STREAM_EVENT_ID}@${MODEL_STREAM_EVENT_VERSION}`,\n\t\t);\n\t}\n}\n\n/**\n * Deliver the agent.start lifecycle event to the capability runtime.\n * The turn correlation id is usually absent at the run start boundary; the\n * dispatch is untraced in that case, matching the idle-time replace semantics.\n */\nexport async function dispatchAgentStartLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回仅在 runtime 缺席时可达\n\tif (!runtime?.hasLifecycleEvent(AGENT_START_EVENT_ID, AGENT_START_EVENT_VERSION)) {\n\t\treturn;\n\t}\n\tconst data: AgentLifecycleEventDataV1 = { version: 1, sessionId: session.sessionId };\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: AGENT_START_EVENT_ID,\n\t\t\tversion: AGENT_START_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${AGENT_START_EVENT_ID}@${AGENT_START_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${AGENT_START_EVENT_ID}@${AGENT_START_EVENT_VERSION}`,\n\t\t);\n\t}\n}\n\n/**\n * Deliver one committed lifecycle event with host-assembled facts.\n * Used by the host channels whose facts live outside the dedicated dispatchers\n * (user.bash / input.received / context.assembled / resources.discover@1): the\n * producer knows the facts, the session assembles the envelope (version,\n * sessionId) and owns the guard, the delivery trace, and the failure\n * observation.\n */\nexport async function dispatchCommittedLifecycleEvent(\n\tsession: AgentSessionInternals,\n\teventId: string,\n\tversion: number,\n\tfacts: Record<string, unknown>,\n): Promise<void> {\n\tawait dispatchCommittedSessionLifecycle(session, eventId, version, {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\t...facts,\n\t});\n}\n\n/** Deliver the user.bash lifecycle event (facts only; the command text never enters the envelope). */\nexport function dispatchUserBashLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { cwd: string; excludeFromContext: boolean },\n): void {\n\tvoid dispatchCommittedLifecycleEvent(session, USER_BASH_EVENT_ID, USER_BASH_EVENT_VERSION, facts);\n}\n\n/** Deliver the input.received lifecycle event (facts only; the input text never enters the envelope). */\nexport function dispatchInputReceivedLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { source: string; textLength: number },\n): void {\n\tvoid dispatchCommittedLifecycleEvent(session, INPUT_RECEIVED_EVENT_ID, INPUT_RECEIVED_EVENT_VERSION, facts);\n}\n\n/** Deliver the context.assembled lifecycle event (facts only; the messages never enter the envelope). */\nexport function dispatchContextAssembledLifecycle(session: AgentSessionInternals, messageCount: number): void {\n\tvoid dispatchCommittedLifecycleEvent(session, CONTEXT_ASSEMBLED_EVENT_ID, CONTEXT_ASSEMBLED_EVENT_VERSION, {\n\t\tmessageCount,\n\t});\n}\n\n/** Deliver the resources.discover@1 committed observe event (facts only). */\nexport function dispatchResourcesDiscoverV1Lifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { cwd: string; reason: \"startup\" | \"reload\" },\n): void {\n\tvoid dispatchCommittedLifecycleEvent(session, RESOURCES_DISCOVER_EVENT_ID, RESOURCES_DISCOVER_EVENT_VERSION, facts);\n}\n\n/** Shared committed dispatch for the turn/message boundary lifecycle events. */\nasync function dispatchCommittedSessionLifecycle(\n\tsession: AgentSessionInternals,\n\teventId: string,\n\tversion: number,\n\tdata: unknown,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime?.hasLifecycleEvent(eventId, version)) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: eventId,\n\t\t\tversion,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${eventId}@${version}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(error, \"<capability-lifecycle>\", `${eventId}@${version}`);\n\t}\n}\n\n/**\n * Deliver the session.start lifecycle event to the capability runtime.\n */\nexport async function dispatchSessionStartLifecycle(\n\tsession: AgentSessionInternals,\n\treason: \"startup\" | \"reload\" | \"new\" | \"resume\" | \"fork\",\n\tpreviousSessionFile?: string,\n): Promise<void> {\n\tconst data: SessionStartEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\treason,\n\t\t...(previousSessionFile === undefined ? {} : { previousSessionFile }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, SESSION_START_EVENT_ID, SESSION_START_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the session.info.changed lifecycle event to the capability runtime.\n */\nexport async function dispatchSessionInfoChangedLifecycle(\n\tsession: AgentSessionInternals,\n\tname: string | undefined,\n): Promise<void> {\n\tconst data: SessionInfoChangedEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\t...(name === undefined ? {} : { name }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_INFO_CHANGED_EVENT_ID,\n\t\tSESSION_INFO_CHANGED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the session.entry.appended lifecycle event to the capability runtime.\n * Entry data is deliberately excluded from the envelope: it can be arbitrarily\n * large; entryId/entryType are the minimal facts.\n */\nexport async function dispatchSessionEntryAppendedLifecycle(\n\tsession: AgentSessionInternals,\n\tentryId: string,\n\tentryType: string,\n): Promise<void> {\n\tconst data: SessionEntryAppendedEventDataV1 = { version: 1, sessionId: session.sessionId, entryId, entryType };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_ENTRY_APPENDED_EVENT_ID,\n\t\tSESSION_ENTRY_APPENDED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the agent.end lifecycle event to the capability runtime.\n */\nexport async function dispatchAgentEndLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst data: AgentEndEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tmessageCount: session.agent.state.messages.length,\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, AGENT_END_EVENT_ID, AGENT_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the before.agent.start lifecycle event to the capability runtime.\n * The prompt text and assembled system prompt are deliberately excluded from\n * the envelope: arbitrarily large and potentially sensitive; hasImages is the\n * minimal fact.\n */\nexport async function dispatchBeforeAgentStartLifecycle(\n\tsession: AgentSessionInternals,\n\thasImages: boolean,\n): Promise<void> {\n\tconst data: BeforeAgentStartEventDataV1 = { version: 1, sessionId: session.sessionId, hasImages };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tBEFORE_AGENT_START_EVENT_ID,\n\t\tBEFORE_AGENT_START_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\ninterface LifecycleFailureReport {\n\treport?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] };\n}\n\n/**\n * Deliver the before.agent.start@2 candidate event and report whether a\n * capability transform replaced the system prompt.\n *\n * Precedence contract: the legacy before_agent_start channel runs first and\n * applies its own override; this dispatch runs after it, so a transform that\n * yields a different systemPrompt is the later writer and wins. A missing\n * registration, a transform returning the input verbatim (\"no replacement\"),\n * or a failed delivery leaves the legacy outcome untouched; delivery errors\n * go through the same non-fatal observation sink as the committed dispatches.\n */\nexport async function dispatchBeforeAgentStartV2Lifecycle(\n\tsession: AgentSessionInternals,\n\tsystemPrompt: string,\n\tsystemPromptOptions: BuildSystemPromptOptions,\n): Promise<string | undefined> {\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime?.hasLifecycleEvent(BEFORE_AGENT_START_EVENT_ID, BEFORE_AGENT_START_EVENT_VERSION_V2)) {\n\t\treturn undefined;\n\t}\n\tconst data: BeforeAgentStartEventDataV2 = {\n\t\tversion: 2,\n\t\tsessionId: session.sessionId,\n\t\tsystemPrompt,\n\t\tsystemPromptOptions: detachedSessionSnapshot(systemPromptOptions),\n\t};\n\tconst eventLabel = `${BEFORE_AGENT_START_EVENT_ID}@${BEFORE_AGENT_START_EVENT_VERSION_V2}`;\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: BEFORE_AGENT_START_EVENT_ID,\n\t\t\tversion: BEFORE_AGENT_START_EVENT_VERSION_V2,\n\t\t\tphase: \"candidate\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t}\n\t\treturn delivery.data.systemPrompt === systemPrompt ? undefined : delivery.data.systemPrompt;\n\t} catch (error) {\n\t\tconst report = (error as LifecycleFailureReport).report;\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(error, \"<capability-lifecycle>\", eventLabel);\n\t\t}\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Deliver the resources.discover@2 candidate event and return the transform\n * contributions. The legacy resources_discover collection (and the v1\n * committed observe dispatch inside it) runs first; the v2 contribution is\n * the later writer and is appended to the legacy result. Delivery errors are\n * observed through the same non-fatal sink and yield an empty contribution.\n */\nexport async function dispatchResourcesDiscoverV2Lifecycle(\n\tsession: AgentSessionInternals,\n\treason: \"startup\" | \"reload\",\n): Promise<{\n\tskillPaths: Array<{ path: string; extensionPath: string }>;\n\tpromptPaths: Array<{ path: string; extensionPath: string }>;\n\tthemePaths: Array<{ path: string; extensionPath: string }>;\n}> {\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime?.hasLifecycleEvent(RESOURCES_DISCOVER_EVENT_ID, RESOURCES_DISCOVER_EVENT_VERSION_V2)) {\n\t\treturn { skillPaths: [], promptPaths: [], themePaths: [] };\n\t}\n\tconst data: ResourcesDiscoverEventDataV2 = {\n\t\tversion: 2,\n\t\tsessionId: session.sessionId,\n\t\tcwd: session._cwd,\n\t\treason,\n\t};\n\tconst eventLabel = `${RESOURCES_DISCOVER_EVENT_ID}@${RESOURCES_DISCOVER_EVENT_VERSION_V2}`;\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: RESOURCES_DISCOVER_EVENT_ID,\n\t\t\tversion: RESOURCES_DISCOVER_EVENT_VERSION_V2,\n\t\t\tphase: \"candidate\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t}\n\t\treturn {\n\t\t\tskillPaths: delivery.data.skillPaths ?? [],\n\t\t\tpromptPaths: delivery.data.promptPaths ?? [],\n\t\t\tthemePaths: delivery.data.themePaths ?? [],\n\t\t};\n\t} catch (error) {\n\t\tconst report = (error as LifecycleFailureReport).report;\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(error, \"<capability-lifecycle>\", eventLabel);\n\t\t}\n\t\treturn { skillPaths: [], promptPaths: [], themePaths: [] };\n\t}\n}\n\n/**\n * Deliver the model.select lifecycle event to the capability runtime.\n * Only model facts (provider/id) enter the envelope — the full Model object\n * carries api instances, headers, and cost, which stay internal (same ruling\n * as the R3-4 SessionAPI facts views).\n */\nexport async function dispatchModelSelectLifecycle(\n\tsession: AgentSessionInternals,\n\tnextModel: { provider: string; id: string },\n\tsource: \"set\" | \"cycle\" | \"restore\",\n): Promise<void> {\n\tconst data: ModelSelectEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tprovider: nextModel.provider,\n\t\tid: nextModel.id,\n\t\tsource,\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, MODEL_SELECT_EVENT_ID, MODEL_SELECT_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the thinking_level.select lifecycle event to the capability runtime.\n */\nexport async function dispatchThinkingLevelSelectLifecycle(\n\tsession: AgentSessionInternals,\n\tlevel: string,\n\tpreviousLevel: string,\n): Promise<void> {\n\tconst data: ThinkingLevelSelectEventDataV1 = { version: 1, sessionId: session.sessionId, level, previousLevel };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tTHINKING_LEVEL_SELECT_EVENT_ID,\n\t\tTHINKING_LEVEL_SELECT_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the tool.execution.start lifecycle event to the capability runtime.\n * Tool arguments are deliberately excluded from the envelope: they can be\n * arbitrarily large and may carry sensitive values.\n */\nexport async function dispatchToolExecutionStartLifecycle(\n\tsession: AgentSessionInternals,\n\ttoolCallId: string,\n\ttoolName: string,\n): Promise<void> {\n\tconst data: ToolExecutionStartEventDataV1 = { version: 1, sessionId: session.sessionId, toolCallId, toolName };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tTOOL_EXECUTION_START_EVENT_ID,\n\t\tTOOL_EXECUTION_START_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the tool.gate.blocked lifecycle event (one beforeToolCall chain link\n * returned a block short-circuit) to the capability runtime. The blocking\n * plugin's identity is deliberately absent: the hook chain has no identity\n * surface. After dispose the revoked runtime makes hasLifecycleEvent false, so\n * the helper no-ops safely.\n */\nexport async function dispatchToolGateBlockedLifecycle(\n\tsession: AgentSessionInternals,\n\ttoolCallId: string,\n\ttoolName: string,\n\treason?: string,\n): Promise<void> {\n\tconst data: ToolGateBlockedEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\ttoolCallId,\n\t\ttoolName,\n\t\t...(reason === undefined ? {} : { reason }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, TOOL_GATE_BLOCKED_EVENT_ID, TOOL_GATE_BLOCKED_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the input.gate.blocked lifecycle event (one beforeInput chain link\n * returned a block short-circuit, 输入 gate A3) to the capability runtime.\n * Facts only — the rejected input's text never enters the envelope. The\n * blocking plugin's identity is deliberately absent: the hook chain has no\n * identity surface. After dispose the revoked runtime makes\n * hasLifecycleEvent false, so the helper no-ops safely.\n */\nexport async function dispatchInputGateBlockedLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { source: string; textLength: number; reason?: string },\n): Promise<void> {\n\tconst data: InputGateBlockedEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tsource: facts.source,\n\t\ttextLength: facts.textLength,\n\t\t...(facts.reason === undefined ? {} : { reason: facts.reason }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tINPUT_GATE_BLOCKED_EVENT_ID,\n\t\tINPUT_GATE_BLOCKED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the turn.start lifecycle event to the capability runtime.\n */\nexport async function dispatchTurnStartLifecycle(session: AgentSessionInternals, turnIndex: number): Promise<void> {\n\tconst data: TurnStartEventDataV1 = { version: 1, sessionId: session.sessionId, turnIndex };\n\tawait dispatchCommittedSessionLifecycle(session, TURN_START_EVENT_ID, TURN_START_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the turn.end lifecycle event to the capability runtime. The\n * turn-level `outcome` is present only when the turn ended in a deviation\n * (\"aborted\"/\"error\", judged from the turn's own assistant message);\n * completed turns omit the key.\n */\nexport async function dispatchTurnEndLifecycle(\n\tsession: AgentSessionInternals,\n\tturnIndex: number,\n\tmessageCount: number,\n\toutcome?: TurnEndEventDataV1[\"outcome\"],\n): Promise<void> {\n\tconst data: TurnEndEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tturnIndex,\n\t\tmessageCount,\n\t\t...(outcome === undefined ? {} : { outcome }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, TURN_END_EVENT_ID, TURN_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the message.start lifecycle event to the capability runtime.\n */\nexport async function dispatchMessageStartLifecycle(session: AgentSessionInternals, role: string): Promise<void> {\n\tconst data: MessageBoundaryEventDataV1 = { version: 1, sessionId: session.sessionId, role };\n\tawait dispatchCommittedSessionLifecycle(session, MESSAGE_START_EVENT_ID, MESSAGE_START_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the message.end lifecycle event to the capability runtime.\n */\nexport async function dispatchMessageEndLifecycle(session: AgentSessionInternals, role: string): Promise<void> {\n\tconst data: MessageBoundaryEventDataV1 = { version: 1, sessionId: session.sessionId, role };\n\tawait dispatchCommittedSessionLifecycle(session, MESSAGE_END_EVENT_ID, MESSAGE_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the agent.settled lifecycle event to the capability runtime.\n * agent_settled is the prompt run's settlement boundary, so it joins the\n * prompt run's trace via the turn correlation id.\n */\nexport async function dispatchAgentSettledLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回仅在 runtime 缺席时可达\n\tif (!runtime?.hasLifecycleEvent(AGENT_SETTLED_EVENT_ID, AGENT_SETTLED_EVENT_VERSION)) {\n\t\treturn;\n\t}\n\tconst data: AgentLifecycleEventDataV1 = { version: 1, sessionId: session.sessionId };\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: AGENT_SETTLED_EVENT_ID,\n\t\t\tversion: AGENT_SETTLED_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${AGENT_SETTLED_EVENT_ID}@${AGENT_SETTLED_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${AGENT_SETTLED_EVENT_ID}@${AGENT_SETTLED_EVENT_VERSION}`,\n\t\t);\n\t}\n}\n\n/** Notify observers only after the runtime context projection has been committed. */\nexport async function dispatchContextReplacedLifecycle(\n\tsession: AgentSessionInternals,\n\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\tstrategyName?: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(SESSION_CONTEXT_REPLACED_EVENT_ID, SESSION_CONTEXT_REPLACED_EVENT_VERSION)) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: SESSION_CONTEXT_REPLACED_EVENT_ID,\n\t\t\tversion: SESSION_CONTEXT_REPLACED_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata: {\n\t\t\t\tversion: 1,\n\t\t\t\tsessionId: session.sessionId,\n\t\t\t\treason,\n\t\t\t\tmessageCount: session.agent.state.messages.length,\n\t\t\t\t...(strategyName === undefined ? {} : { strategyName }),\n\t\t\t},\n\t\t\tsource: \"agent-session\",\n\t\t\t// In-turn transitions (retry, overflow recovery, auto compaction)\n\t\t\t// join the prompt run's trace; idle-time replaces stay untraced.\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${SESSION_CONTEXT_REPLACED_EVENT_ID}@${SESSION_CONTEXT_REPLACED_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${SESSION_CONTEXT_REPLACED_EVENT_ID}@${SESSION_CONTEXT_REPLACED_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${SESSION_CONTEXT_REPLACED_EVENT_ID}@${SESSION_CONTEXT_REPLACED_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Deliver the finalized assistant response only after its session entry is committed. */\nexport async function dispatchModelResponseLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\tentryId: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(MODEL_RESPONSE_EVENT_ID, MODEL_RESPONSE_EVENT_VERSION)) return;\n\tconst data: ModelResponseEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tentryId,\n\t\trevision: detachedSessionSnapshot(session.sessionManager.getRevision()),\n\t\tprovider: message.provider,\n\t\tmodel: message.model,\n\t\tstopReason: message.stopReason,\n\t\tmessage: detachedSessionSnapshot(message),\n\t\t...(message.errorMessage === undefined ? {} : { errorMessage: message.errorMessage }),\n\t};\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: MODEL_RESPONSE_EVENT_ID,\n\t\t\tversion: MODEL_RESPONSE_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${MODEL_RESPONSE_EVENT_ID}@${MODEL_RESPONSE_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${MODEL_RESPONSE_EVENT_ID}@${MODEL_RESPONSE_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${MODEL_RESPONSE_EVENT_ID}@${MODEL_RESPONSE_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Deliver the finalized tool result only after its session entry is committed. */\nexport async function dispatchToolCommitLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: ToolResultMessage,\n\tentryId: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(TOOL_COMMIT_EVENT_ID, TOOL_COMMIT_EVENT_VERSION)) return;\n\ttry {\n\t\tconst data: ToolCommitEventDataV1 = {\n\t\t\tversion: 1,\n\t\t\tsessionId: session.sessionId,\n\t\t\tentryId,\n\t\t\trevision: detachedSessionSnapshot(session.sessionManager.getRevision()),\n\t\t\ttoolCallId: message.toolCallId,\n\t\t\ttoolName: message.toolName,\n\t\t\tisError: message.isError,\n\t\t};\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: TOOL_COMMIT_EVENT_ID,\n\t\t\tversion: TOOL_COMMIT_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${TOOL_COMMIT_EVENT_ID}@${TOOL_COMMIT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${TOOL_COMMIT_EVENT_ID}@${TOOL_COMMIT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${TOOL_COMMIT_EVENT_ID}@${TOOL_COMMIT_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Deliver the finalized tool result only after its session entry is committed. */\nexport async function dispatchToolResultLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: ToolResultMessage,\n\tentryId: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(TOOL_RESULT_EVENT_ID, TOOL_RESULT_EVENT_VERSION)) return;\n\ttry {\n\t\tconst data: ToolResultEventDataV1 = {\n\t\t\tversion: 1,\n\t\t\tsessionId: session.sessionId,\n\t\t\tentryId,\n\t\t\trevision: detachedSessionSnapshot(session.sessionManager.getRevision()),\n\t\t\ttoolCallId: message.toolCallId,\n\t\t\ttoolName: message.toolName,\n\t\t\tisError: message.isError,\n\t\t\tmessage: detachedSessionSnapshot(message),\n\t\t};\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: TOOL_RESULT_EVENT_ID,\n\t\t\tversion: TOOL_RESULT_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${TOOL_RESULT_EVENT_ID}@${TOOL_RESULT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${TOOL_RESULT_EVENT_ID}@${TOOL_RESULT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${TOOL_RESULT_EVENT_ID}@${TOOL_RESULT_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Notify the rebuilt runtime only after all reload work has committed. */\nexport async function dispatchSessionReloadLifecycle(\n\tsession: AgentSessionInternals,\n\tgeneration: number,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(SESSION_RELOAD_EVENT_ID, SESSION_RELOAD_EVENT_VERSION)) return;\n\tconst data: SessionReloadEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tgeneration,\n\t\treason: \"reload\",\n\t};\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: SESSION_RELOAD_EVENT_ID,\n\t\t\tversion: SESSION_RELOAD_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${SESSION_RELOAD_EVENT_ID}@${SESSION_RELOAD_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${SESSION_RELOAD_EVENT_ID}@${SESSION_RELOAD_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${SESSION_RELOAD_EVENT_ID}@${SESSION_RELOAD_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Deliver the session.auto.retry lifecycle event to the capability runtime.\n * Only the actual retry path dispatches: a \"decided not to retry\" outcome has\n * no event. Facts mirror the same-turn `auto_retry_start` session event.\n */\nexport async function dispatchAutoRetryLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { attempt: number; maxAttempts: number; delayMs: number; errorMessage: string },\n): Promise<void> {\n\tconst data: SessionAutoRetryEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_AUTO_RETRY_EVENT_ID,\n\t\tSESSION_AUTO_RETRY_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver one compaction policy decision (including negative verdicts) to the\n * capability runtime. The threshold triplet is attached only when the caller\n * measured it; the overflow path omits it rather than fabricating values.\n */\nexport async function dispatchCompactionDecisionLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: {\n\t\treason: SessionCompactionDecisionEventDataV1[\"reason\"];\n\t\tcompact: boolean;\n\t\twillRetry: boolean;\n\t\tcontextTokens?: number;\n\t\tcontextWindow?: number;\n\t\treserveTokens?: number;\n\t\tfailureMessage?: string;\n\t},\n): Promise<void> {\n\tconst data: SessionCompactionDecisionEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_COMPACTION_DECISION_EVENT_ID,\n\t\tSESSION_COMPACTION_DECISION_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the session.compaction.failed lifecycle event to the capability\n * runtime. Callers dispatch only on genuine failures; cancellation paths\n * (extension cancel, abort) stay unreported.\n */\nexport async function dispatchCompactionFailedLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { reason: SessionCompactionFailedEventDataV1[\"reason\"]; errorMessage: string },\n): Promise<void> {\n\tconst data: SessionCompactionFailedEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_COMPACTION_FAILED_EVENT_ID,\n\t\tSESSION_COMPACTION_FAILED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the session.end lifecycle event to the capability runtime.\n * Dispatched exactly once from dispose() while the capability runtime is still\n * alive (before capability-plugin disposal, so the observability plugin can\n * still write the final trace record); dispose re-entry returns the same\n * dispose promise, so no second dispatch happens. A reload never reaches this\n * dispatcher — session.start(reason:\"reload\") plus session.reload@1 cover a\n * reload. The turn correlation id is normally absent at dispose time; the\n * delivery is untraced then (the shared dispatch tolerates the absence).\n */\nexport async function dispatchSessionEndLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst data: SessionEndEventDataV1 = { version: 1, sessionId: session.sessionId };\n\tawait dispatchCommittedSessionLifecycle(session, SESSION_END_EVENT_ID, SESSION_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the agent.task.settled lifecycle event (one settled background\n * delegation task, dispatched from the host digest sink) to the capability\n * runtime. `facts.taskSessionId` is the child session the task ran in; the\n * parent sessionId is filled here. After dispose the revoked runtime makes\n * hasLifecycleEvent false, so the helper no-ops safely.\n */\nexport async function dispatchAgentTaskSettledLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: {\n\t\ttaskSessionId: string;\n\t\ttaskId: string;\n\t\tstatus: AgentTaskSettledEventDataV1[\"status\"];\n\t\treasonCode?: string;\n\t},\n): Promise<void> {\n\tconst data: AgentTaskSettledEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tAGENT_TASK_SETTLED_EVENT_ID,\n\t\tAGENT_TASK_SETTLED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\nexport function observeLifecycleDeliveryError(\n\tsession: AgentSessionInternals,\n\terror: unknown,\n\tsource: string,\n\tevent: string,\n): void {\n\t// Non-fatal delivery sink: the original lifecycle failure has already been\n\t// isolated from the canonical commit, so a delivery failure only lands in\n\t// the host process log (no-op when no hostLogger was configured).\n\tsession._hostLogger?.error(\"session\", \"capability lifecycle delivery failed\", {\n\t\t...(session.sessionId === undefined ? {} : { sessionId: session.sessionId }),\n\t\tfields: { event, source },\n\t\tcause: error,\n\t});\n}\n"]}
|
|
@@ -13,8 +13,19 @@ import { AGENT_END_EVENT_ID, AGENT_END_EVENT_VERSION, AGENT_SETTLED_EVENT_ID, AG
|
|
|
13
13
|
export async function dispatchModelStreamLifecycle(session, message, eventName, phase) {
|
|
14
14
|
const runtime = session._capabilityRuntime;
|
|
15
15
|
const state = session._modelStreamState;
|
|
16
|
-
|
|
16
|
+
// Subscriber gate sits BEFORE the sequence increment on purpose: the
|
|
17
|
+
// model.stream@1 contract pins per-streamId sequence to start at 1 and stay
|
|
18
|
+
// strictly contiguous (docs/design/插件基础能力设计.md §model.stream;跳号是
|
|
19
|
+
// 协议错误), which is an observer-facing guarantee. Undelivered deltas must
|
|
20
|
+
// not consume sequence numbers, so a late subscriber still observes a
|
|
21
|
+
// contiguous stream from 1. Skipping the increment when nobody observes also
|
|
22
|
+
// skips the per-delta O(L) JSON snapshot and the dispatch-path clones.
|
|
23
|
+
if (!runtime ||
|
|
24
|
+
!state ||
|
|
25
|
+
!runtime.hasLifecycleEvent(MODEL_STREAM_EVENT_ID, MODEL_STREAM_EVENT_VERSION) ||
|
|
26
|
+
!runtime.hasLifecycleSubscribers(MODEL_STREAM_EVENT_ID, MODEL_STREAM_EVENT_VERSION)) {
|
|
17
27
|
return;
|
|
28
|
+
}
|
|
18
29
|
if (message.role !== "assistant")
|
|
19
30
|
return;
|
|
20
31
|
state.sequence += 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-lifecycle.js","sourceRoot":"","sources":["../../src/core/agent-session-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Capability lifecycle dispatch and the legacy tool-call gate for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls go through the session\n * parameter (not direct function calls) to preserve that dispatch.\n */\n\nimport type { AgentMessage } from \"@agent-forge/agent-core\";\nimport type { AssistantMessage, ToolResultMessage } from \"@agent-forge/ai/compat\";\nimport {\n\ttype AgentSessionInternals,\n\tdetachedSessionSnapshot,\n\tjsonSafeSessionSnapshot,\n} from \"./agent-session-internal.ts\";\nimport {\n\tAGENT_TASK_SETTLED_EVENT_ID,\n\tAGENT_TASK_SETTLED_EVENT_VERSION,\n\ttype AgentTaskSettledEventDataV1,\n\tINPUT_GATE_BLOCKED_EVENT_ID,\n\tINPUT_GATE_BLOCKED_EVENT_VERSION,\n\ttype InputGateBlockedEventDataV1,\n\tSESSION_AUTO_RETRY_EVENT_ID,\n\tSESSION_AUTO_RETRY_EVENT_VERSION,\n\tSESSION_COMPACTION_DECISION_EVENT_ID,\n\tSESSION_COMPACTION_DECISION_EVENT_VERSION,\n\tSESSION_COMPACTION_FAILED_EVENT_ID,\n\tSESSION_COMPACTION_FAILED_EVENT_VERSION,\n\tSESSION_END_EVENT_ID,\n\tSESSION_END_EVENT_VERSION,\n\ttype SessionAutoRetryEventDataV1,\n\ttype SessionCompactionDecisionEventDataV1,\n\ttype SessionCompactionFailedEventDataV1,\n\ttype SessionEndEventDataV1,\n\tTOOL_GATE_BLOCKED_EVENT_ID,\n\tTOOL_GATE_BLOCKED_EVENT_VERSION,\n\ttype ToolGateBlockedEventDataV1,\n} from \"./extensions/bootstrap-lifecycle.ts\";\nimport {\n\tAGENT_END_EVENT_ID,\n\tAGENT_END_EVENT_VERSION,\n\tAGENT_SETTLED_EVENT_ID,\n\tAGENT_SETTLED_EVENT_VERSION,\n\tAGENT_START_EVENT_ID,\n\tAGENT_START_EVENT_VERSION,\n\ttype AgentEndEventDataV1,\n\ttype AgentLifecycleEventDataV1,\n\tBEFORE_AGENT_START_EVENT_ID,\n\tBEFORE_AGENT_START_EVENT_VERSION,\n\tBEFORE_AGENT_START_EVENT_VERSION_V2,\n\ttype BeforeAgentStartEventDataV1,\n\ttype BeforeAgentStartEventDataV2,\n\tCONTEXT_ASSEMBLED_EVENT_ID,\n\tCONTEXT_ASSEMBLED_EVENT_VERSION,\n\ttype ContextOperationOptions,\n\tINPUT_RECEIVED_EVENT_ID,\n\tINPUT_RECEIVED_EVENT_VERSION,\n\tMESSAGE_END_EVENT_ID,\n\tMESSAGE_END_EVENT_VERSION,\n\tMESSAGE_START_EVENT_ID,\n\tMESSAGE_START_EVENT_VERSION,\n\ttype MessageBoundaryEventDataV1,\n\tMODEL_RESPONSE_EVENT_ID,\n\tMODEL_RESPONSE_EVENT_VERSION,\n\tMODEL_SELECT_EVENT_ID,\n\tMODEL_SELECT_EVENT_VERSION,\n\tMODEL_STREAM_EVENT_ID,\n\tMODEL_STREAM_EVENT_VERSION,\n\ttype ModelResponseEventDataV1,\n\ttype ModelSelectEventDataV1,\n\ttype ModelStreamEventDataV1,\n\tRESOURCES_DISCOVER_EVENT_ID,\n\tRESOURCES_DISCOVER_EVENT_VERSION,\n\tRESOURCES_DISCOVER_EVENT_VERSION_V2,\n\ttype ResourcesDiscoverEventDataV2,\n\tSESSION_CONTEXT_REPLACED_EVENT_ID,\n\tSESSION_CONTEXT_REPLACED_EVENT_VERSION,\n\tSESSION_ENTRY_APPENDED_EVENT_ID,\n\tSESSION_ENTRY_APPENDED_EVENT_VERSION,\n\tSESSION_INFO_CHANGED_EVENT_ID,\n\tSESSION_INFO_CHANGED_EVENT_VERSION,\n\tSESSION_RELOAD_EVENT_ID,\n\tSESSION_RELOAD_EVENT_VERSION,\n\tSESSION_START_EVENT_ID,\n\tSESSION_START_EVENT_VERSION,\n\ttype SessionEntryAppendedEventDataV1,\n\ttype SessionInfoChangedEventDataV1,\n\ttype SessionReloadEventDataV1,\n\ttype SessionStartEventDataV1,\n\tTHINKING_LEVEL_SELECT_EVENT_ID,\n\tTHINKING_LEVEL_SELECT_EVENT_VERSION,\n\ttype ThinkingLevelSelectEventDataV1,\n\tTOOL_COMMIT_EVENT_ID,\n\tTOOL_COMMIT_EVENT_VERSION,\n\tTOOL_EXECUTION_START_EVENT_ID,\n\tTOOL_EXECUTION_START_EVENT_VERSION,\n\tTOOL_RESULT_EVENT_ID,\n\tTOOL_RESULT_EVENT_VERSION,\n\ttype ToolCommitEventDataV1,\n\ttype ToolExecutionStartEventDataV1,\n\ttype ToolResultEventDataV1,\n\tTURN_END_EVENT_ID,\n\tTURN_END_EVENT_VERSION,\n\tTURN_START_EVENT_ID,\n\tTURN_START_EVENT_VERSION,\n\ttype TurnEndEventDataV1,\n\ttype TurnStartEventDataV1,\n\tUSER_BASH_EVENT_ID,\n\tUSER_BASH_EVENT_VERSION,\n} from \"./extensions/index.ts\";\nimport type { BuildSystemPromptOptions } from \"./system-prompt.ts\";\n\nexport async function dispatchModelStreamLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: AgentMessage,\n\teventName: ModelStreamEventDataV1[\"event\"],\n\tphase: ModelStreamEventDataV1[\"phase\"],\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\tconst state = session._modelStreamState;\n\tif (!runtime || !state || !runtime.hasLifecycleEvent(MODEL_STREAM_EVENT_ID, MODEL_STREAM_EVENT_VERSION)) return;\n\tif (message.role !== \"assistant\") return;\n\tstate.sequence += 1;\n\tconst terminal = eventName === \"done\" || eventName === \"error\";\n\tlet partial: unknown | null = null;\n\ttry {\n\t\tpartial = jsonSafeSessionSnapshot(message);\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${MODEL_STREAM_EVENT_ID}@${MODEL_STREAM_EVENT_VERSION}/snapshot`,\n\t\t);\n\t}\n\tconst data: ModelStreamEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tstreamId: state.streamId,\n\t\tsequence: state.sequence,\n\t\tphase,\n\t\tevent: eventName,\n\t\tpartial,\n\t\tterminal,\n\t\terror:\n\t\t\teventName === \"error\"\n\t\t\t\t? {\n\t\t\t\t\t\tcode: message.stopReason === \"aborted\" ? \"aborted\" : \"provider_error\",\n\t\t\t\t\t\tmessage: message.errorMessage ?? \"Model stream failed\",\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t};\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: MODEL_STREAM_EVENT_ID,\n\t\t\tversion: MODEL_STREAM_EVENT_VERSION,\n\t\t\tphase,\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${MODEL_STREAM_EVENT_ID}@${MODEL_STREAM_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${MODEL_STREAM_EVENT_ID}@${MODEL_STREAM_EVENT_VERSION}`,\n\t\t);\n\t}\n}\n\n/**\n * Deliver the agent.start lifecycle event to the capability runtime.\n * The turn correlation id is usually absent at the run start boundary; the\n * dispatch is untraced in that case, matching the idle-time replace semantics.\n */\nexport async function dispatchAgentStartLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回仅在 runtime 缺席时可达\n\tif (!runtime?.hasLifecycleEvent(AGENT_START_EVENT_ID, AGENT_START_EVENT_VERSION)) {\n\t\treturn;\n\t}\n\tconst data: AgentLifecycleEventDataV1 = { version: 1, sessionId: session.sessionId };\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: AGENT_START_EVENT_ID,\n\t\t\tversion: AGENT_START_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${AGENT_START_EVENT_ID}@${AGENT_START_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${AGENT_START_EVENT_ID}@${AGENT_START_EVENT_VERSION}`,\n\t\t);\n\t}\n}\n\n/**\n * Deliver one committed lifecycle event with host-assembled facts.\n * Used by the host channels whose facts live outside the dedicated dispatchers\n * (user.bash / input.received / context.assembled / resources.discover@1): the\n * producer knows the facts, the session assembles the envelope (version,\n * sessionId) and owns the guard, the delivery trace, and the failure\n * observation.\n */\nexport async function dispatchCommittedLifecycleEvent(\n\tsession: AgentSessionInternals,\n\teventId: string,\n\tversion: number,\n\tfacts: Record<string, unknown>,\n): Promise<void> {\n\tawait dispatchCommittedSessionLifecycle(session, eventId, version, {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\t...facts,\n\t});\n}\n\n/** Deliver the user.bash lifecycle event (facts only; the command text never enters the envelope). */\nexport function dispatchUserBashLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { cwd: string; excludeFromContext: boolean },\n): void {\n\tvoid dispatchCommittedLifecycleEvent(session, USER_BASH_EVENT_ID, USER_BASH_EVENT_VERSION, facts);\n}\n\n/** Deliver the input.received lifecycle event (facts only; the input text never enters the envelope). */\nexport function dispatchInputReceivedLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { source: string; textLength: number },\n): void {\n\tvoid dispatchCommittedLifecycleEvent(session, INPUT_RECEIVED_EVENT_ID, INPUT_RECEIVED_EVENT_VERSION, facts);\n}\n\n/** Deliver the context.assembled lifecycle event (facts only; the messages never enter the envelope). */\nexport function dispatchContextAssembledLifecycle(session: AgentSessionInternals, messageCount: number): void {\n\tvoid dispatchCommittedLifecycleEvent(session, CONTEXT_ASSEMBLED_EVENT_ID, CONTEXT_ASSEMBLED_EVENT_VERSION, {\n\t\tmessageCount,\n\t});\n}\n\n/** Deliver the resources.discover@1 committed observe event (facts only). */\nexport function dispatchResourcesDiscoverV1Lifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { cwd: string; reason: \"startup\" | \"reload\" },\n): void {\n\tvoid dispatchCommittedLifecycleEvent(session, RESOURCES_DISCOVER_EVENT_ID, RESOURCES_DISCOVER_EVENT_VERSION, facts);\n}\n\n/** Shared committed dispatch for the turn/message boundary lifecycle events. */\nasync function dispatchCommittedSessionLifecycle(\n\tsession: AgentSessionInternals,\n\teventId: string,\n\tversion: number,\n\tdata: unknown,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime?.hasLifecycleEvent(eventId, version)) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: eventId,\n\t\t\tversion,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${eventId}@${version}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(error, \"<capability-lifecycle>\", `${eventId}@${version}`);\n\t}\n}\n\n/**\n * Deliver the session.start lifecycle event to the capability runtime.\n */\nexport async function dispatchSessionStartLifecycle(\n\tsession: AgentSessionInternals,\n\treason: \"startup\" | \"reload\" | \"new\" | \"resume\" | \"fork\",\n\tpreviousSessionFile?: string,\n): Promise<void> {\n\tconst data: SessionStartEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\treason,\n\t\t...(previousSessionFile === undefined ? {} : { previousSessionFile }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, SESSION_START_EVENT_ID, SESSION_START_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the session.info.changed lifecycle event to the capability runtime.\n */\nexport async function dispatchSessionInfoChangedLifecycle(\n\tsession: AgentSessionInternals,\n\tname: string | undefined,\n): Promise<void> {\n\tconst data: SessionInfoChangedEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\t...(name === undefined ? {} : { name }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_INFO_CHANGED_EVENT_ID,\n\t\tSESSION_INFO_CHANGED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the session.entry.appended lifecycle event to the capability runtime.\n * Entry data is deliberately excluded from the envelope: it can be arbitrarily\n * large; entryId/entryType are the minimal facts.\n */\nexport async function dispatchSessionEntryAppendedLifecycle(\n\tsession: AgentSessionInternals,\n\tentryId: string,\n\tentryType: string,\n): Promise<void> {\n\tconst data: SessionEntryAppendedEventDataV1 = { version: 1, sessionId: session.sessionId, entryId, entryType };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_ENTRY_APPENDED_EVENT_ID,\n\t\tSESSION_ENTRY_APPENDED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the agent.end lifecycle event to the capability runtime.\n */\nexport async function dispatchAgentEndLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst data: AgentEndEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tmessageCount: session.agent.state.messages.length,\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, AGENT_END_EVENT_ID, AGENT_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the before.agent.start lifecycle event to the capability runtime.\n * The prompt text and assembled system prompt are deliberately excluded from\n * the envelope: arbitrarily large and potentially sensitive; hasImages is the\n * minimal fact.\n */\nexport async function dispatchBeforeAgentStartLifecycle(\n\tsession: AgentSessionInternals,\n\thasImages: boolean,\n): Promise<void> {\n\tconst data: BeforeAgentStartEventDataV1 = { version: 1, sessionId: session.sessionId, hasImages };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tBEFORE_AGENT_START_EVENT_ID,\n\t\tBEFORE_AGENT_START_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\ninterface LifecycleFailureReport {\n\treport?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] };\n}\n\n/**\n * Deliver the before.agent.start@2 candidate event and report whether a\n * capability transform replaced the system prompt.\n *\n * Precedence contract: the legacy before_agent_start channel runs first and\n * applies its own override; this dispatch runs after it, so a transform that\n * yields a different systemPrompt is the later writer and wins. A missing\n * registration, a transform returning the input verbatim (\"no replacement\"),\n * or a failed delivery leaves the legacy outcome untouched; delivery errors\n * go through the same non-fatal observation sink as the committed dispatches.\n */\nexport async function dispatchBeforeAgentStartV2Lifecycle(\n\tsession: AgentSessionInternals,\n\tsystemPrompt: string,\n\tsystemPromptOptions: BuildSystemPromptOptions,\n): Promise<string | undefined> {\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime?.hasLifecycleEvent(BEFORE_AGENT_START_EVENT_ID, BEFORE_AGENT_START_EVENT_VERSION_V2)) {\n\t\treturn undefined;\n\t}\n\tconst data: BeforeAgentStartEventDataV2 = {\n\t\tversion: 2,\n\t\tsessionId: session.sessionId,\n\t\tsystemPrompt,\n\t\tsystemPromptOptions: detachedSessionSnapshot(systemPromptOptions),\n\t};\n\tconst eventLabel = `${BEFORE_AGENT_START_EVENT_ID}@${BEFORE_AGENT_START_EVENT_VERSION_V2}`;\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: BEFORE_AGENT_START_EVENT_ID,\n\t\t\tversion: BEFORE_AGENT_START_EVENT_VERSION_V2,\n\t\t\tphase: \"candidate\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t}\n\t\treturn delivery.data.systemPrompt === systemPrompt ? undefined : delivery.data.systemPrompt;\n\t} catch (error) {\n\t\tconst report = (error as LifecycleFailureReport).report;\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(error, \"<capability-lifecycle>\", eventLabel);\n\t\t}\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Deliver the resources.discover@2 candidate event and return the transform\n * contributions. The legacy resources_discover collection (and the v1\n * committed observe dispatch inside it) runs first; the v2 contribution is\n * the later writer and is appended to the legacy result. Delivery errors are\n * observed through the same non-fatal sink and yield an empty contribution.\n */\nexport async function dispatchResourcesDiscoverV2Lifecycle(\n\tsession: AgentSessionInternals,\n\treason: \"startup\" | \"reload\",\n): Promise<{\n\tskillPaths: Array<{ path: string; extensionPath: string }>;\n\tpromptPaths: Array<{ path: string; extensionPath: string }>;\n\tthemePaths: Array<{ path: string; extensionPath: string }>;\n}> {\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime?.hasLifecycleEvent(RESOURCES_DISCOVER_EVENT_ID, RESOURCES_DISCOVER_EVENT_VERSION_V2)) {\n\t\treturn { skillPaths: [], promptPaths: [], themePaths: [] };\n\t}\n\tconst data: ResourcesDiscoverEventDataV2 = {\n\t\tversion: 2,\n\t\tsessionId: session.sessionId,\n\t\tcwd: session._cwd,\n\t\treason,\n\t};\n\tconst eventLabel = `${RESOURCES_DISCOVER_EVENT_ID}@${RESOURCES_DISCOVER_EVENT_VERSION_V2}`;\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: RESOURCES_DISCOVER_EVENT_ID,\n\t\t\tversion: RESOURCES_DISCOVER_EVENT_VERSION_V2,\n\t\t\tphase: \"candidate\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t}\n\t\treturn {\n\t\t\tskillPaths: delivery.data.skillPaths ?? [],\n\t\t\tpromptPaths: delivery.data.promptPaths ?? [],\n\t\t\tthemePaths: delivery.data.themePaths ?? [],\n\t\t};\n\t} catch (error) {\n\t\tconst report = (error as LifecycleFailureReport).report;\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(error, \"<capability-lifecycle>\", eventLabel);\n\t\t}\n\t\treturn { skillPaths: [], promptPaths: [], themePaths: [] };\n\t}\n}\n\n/**\n * Deliver the model.select lifecycle event to the capability runtime.\n * Only model facts (provider/id) enter the envelope — the full Model object\n * carries api instances, headers, and cost, which stay internal (same ruling\n * as the R3-4 SessionAPI facts views).\n */\nexport async function dispatchModelSelectLifecycle(\n\tsession: AgentSessionInternals,\n\tnextModel: { provider: string; id: string },\n\tsource: \"set\" | \"cycle\" | \"restore\",\n): Promise<void> {\n\tconst data: ModelSelectEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tprovider: nextModel.provider,\n\t\tid: nextModel.id,\n\t\tsource,\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, MODEL_SELECT_EVENT_ID, MODEL_SELECT_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the thinking_level.select lifecycle event to the capability runtime.\n */\nexport async function dispatchThinkingLevelSelectLifecycle(\n\tsession: AgentSessionInternals,\n\tlevel: string,\n\tpreviousLevel: string,\n): Promise<void> {\n\tconst data: ThinkingLevelSelectEventDataV1 = { version: 1, sessionId: session.sessionId, level, previousLevel };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tTHINKING_LEVEL_SELECT_EVENT_ID,\n\t\tTHINKING_LEVEL_SELECT_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the tool.execution.start lifecycle event to the capability runtime.\n * Tool arguments are deliberately excluded from the envelope: they can be\n * arbitrarily large and may carry sensitive values.\n */\nexport async function dispatchToolExecutionStartLifecycle(\n\tsession: AgentSessionInternals,\n\ttoolCallId: string,\n\ttoolName: string,\n): Promise<void> {\n\tconst data: ToolExecutionStartEventDataV1 = { version: 1, sessionId: session.sessionId, toolCallId, toolName };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tTOOL_EXECUTION_START_EVENT_ID,\n\t\tTOOL_EXECUTION_START_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the tool.gate.blocked lifecycle event (one beforeToolCall chain link\n * returned a block short-circuit) to the capability runtime. The blocking\n * plugin's identity is deliberately absent: the hook chain has no identity\n * surface. After dispose the revoked runtime makes hasLifecycleEvent false, so\n * the helper no-ops safely.\n */\nexport async function dispatchToolGateBlockedLifecycle(\n\tsession: AgentSessionInternals,\n\ttoolCallId: string,\n\ttoolName: string,\n\treason?: string,\n): Promise<void> {\n\tconst data: ToolGateBlockedEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\ttoolCallId,\n\t\ttoolName,\n\t\t...(reason === undefined ? {} : { reason }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, TOOL_GATE_BLOCKED_EVENT_ID, TOOL_GATE_BLOCKED_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the input.gate.blocked lifecycle event (one beforeInput chain link\n * returned a block short-circuit, 输入 gate A3) to the capability runtime.\n * Facts only — the rejected input's text never enters the envelope. The\n * blocking plugin's identity is deliberately absent: the hook chain has no\n * identity surface. After dispose the revoked runtime makes\n * hasLifecycleEvent false, so the helper no-ops safely.\n */\nexport async function dispatchInputGateBlockedLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { source: string; textLength: number; reason?: string },\n): Promise<void> {\n\tconst data: InputGateBlockedEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tsource: facts.source,\n\t\ttextLength: facts.textLength,\n\t\t...(facts.reason === undefined ? {} : { reason: facts.reason }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tINPUT_GATE_BLOCKED_EVENT_ID,\n\t\tINPUT_GATE_BLOCKED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the turn.start lifecycle event to the capability runtime.\n */\nexport async function dispatchTurnStartLifecycle(session: AgentSessionInternals, turnIndex: number): Promise<void> {\n\tconst data: TurnStartEventDataV1 = { version: 1, sessionId: session.sessionId, turnIndex };\n\tawait dispatchCommittedSessionLifecycle(session, TURN_START_EVENT_ID, TURN_START_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the turn.end lifecycle event to the capability runtime. The\n * turn-level `outcome` is present only when the turn ended in a deviation\n * (\"aborted\"/\"error\", judged from the turn's own assistant message);\n * completed turns omit the key.\n */\nexport async function dispatchTurnEndLifecycle(\n\tsession: AgentSessionInternals,\n\tturnIndex: number,\n\tmessageCount: number,\n\toutcome?: TurnEndEventDataV1[\"outcome\"],\n): Promise<void> {\n\tconst data: TurnEndEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tturnIndex,\n\t\tmessageCount,\n\t\t...(outcome === undefined ? {} : { outcome }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, TURN_END_EVENT_ID, TURN_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the message.start lifecycle event to the capability runtime.\n */\nexport async function dispatchMessageStartLifecycle(session: AgentSessionInternals, role: string): Promise<void> {\n\tconst data: MessageBoundaryEventDataV1 = { version: 1, sessionId: session.sessionId, role };\n\tawait dispatchCommittedSessionLifecycle(session, MESSAGE_START_EVENT_ID, MESSAGE_START_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the message.end lifecycle event to the capability runtime.\n */\nexport async function dispatchMessageEndLifecycle(session: AgentSessionInternals, role: string): Promise<void> {\n\tconst data: MessageBoundaryEventDataV1 = { version: 1, sessionId: session.sessionId, role };\n\tawait dispatchCommittedSessionLifecycle(session, MESSAGE_END_EVENT_ID, MESSAGE_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the agent.settled lifecycle event to the capability runtime.\n * agent_settled is the prompt run's settlement boundary, so it joins the\n * prompt run's trace via the turn correlation id.\n */\nexport async function dispatchAgentSettledLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回仅在 runtime 缺席时可达\n\tif (!runtime?.hasLifecycleEvent(AGENT_SETTLED_EVENT_ID, AGENT_SETTLED_EVENT_VERSION)) {\n\t\treturn;\n\t}\n\tconst data: AgentLifecycleEventDataV1 = { version: 1, sessionId: session.sessionId };\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: AGENT_SETTLED_EVENT_ID,\n\t\t\tversion: AGENT_SETTLED_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${AGENT_SETTLED_EVENT_ID}@${AGENT_SETTLED_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${AGENT_SETTLED_EVENT_ID}@${AGENT_SETTLED_EVENT_VERSION}`,\n\t\t);\n\t}\n}\n\n/** Notify observers only after the runtime context projection has been committed. */\nexport async function dispatchContextReplacedLifecycle(\n\tsession: AgentSessionInternals,\n\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\tstrategyName?: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(SESSION_CONTEXT_REPLACED_EVENT_ID, SESSION_CONTEXT_REPLACED_EVENT_VERSION)) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: SESSION_CONTEXT_REPLACED_EVENT_ID,\n\t\t\tversion: SESSION_CONTEXT_REPLACED_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata: {\n\t\t\t\tversion: 1,\n\t\t\t\tsessionId: session.sessionId,\n\t\t\t\treason,\n\t\t\t\tmessageCount: session.agent.state.messages.length,\n\t\t\t\t...(strategyName === undefined ? {} : { strategyName }),\n\t\t\t},\n\t\t\tsource: \"agent-session\",\n\t\t\t// In-turn transitions (retry, overflow recovery, auto compaction)\n\t\t\t// join the prompt run's trace; idle-time replaces stay untraced.\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${SESSION_CONTEXT_REPLACED_EVENT_ID}@${SESSION_CONTEXT_REPLACED_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${SESSION_CONTEXT_REPLACED_EVENT_ID}@${SESSION_CONTEXT_REPLACED_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${SESSION_CONTEXT_REPLACED_EVENT_ID}@${SESSION_CONTEXT_REPLACED_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Deliver the finalized assistant response only after its session entry is committed. */\nexport async function dispatchModelResponseLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\tentryId: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(MODEL_RESPONSE_EVENT_ID, MODEL_RESPONSE_EVENT_VERSION)) return;\n\tconst data: ModelResponseEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tentryId,\n\t\trevision: detachedSessionSnapshot(session.sessionManager.getRevision()),\n\t\tprovider: message.provider,\n\t\tmodel: message.model,\n\t\tstopReason: message.stopReason,\n\t\tmessage: detachedSessionSnapshot(message),\n\t\t...(message.errorMessage === undefined ? {} : { errorMessage: message.errorMessage }),\n\t};\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: MODEL_RESPONSE_EVENT_ID,\n\t\t\tversion: MODEL_RESPONSE_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${MODEL_RESPONSE_EVENT_ID}@${MODEL_RESPONSE_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${MODEL_RESPONSE_EVENT_ID}@${MODEL_RESPONSE_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${MODEL_RESPONSE_EVENT_ID}@${MODEL_RESPONSE_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Deliver the finalized tool result only after its session entry is committed. */\nexport async function dispatchToolCommitLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: ToolResultMessage,\n\tentryId: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(TOOL_COMMIT_EVENT_ID, TOOL_COMMIT_EVENT_VERSION)) return;\n\ttry {\n\t\tconst data: ToolCommitEventDataV1 = {\n\t\t\tversion: 1,\n\t\t\tsessionId: session.sessionId,\n\t\t\tentryId,\n\t\t\trevision: detachedSessionSnapshot(session.sessionManager.getRevision()),\n\t\t\ttoolCallId: message.toolCallId,\n\t\t\ttoolName: message.toolName,\n\t\t\tisError: message.isError,\n\t\t};\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: TOOL_COMMIT_EVENT_ID,\n\t\t\tversion: TOOL_COMMIT_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${TOOL_COMMIT_EVENT_ID}@${TOOL_COMMIT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${TOOL_COMMIT_EVENT_ID}@${TOOL_COMMIT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${TOOL_COMMIT_EVENT_ID}@${TOOL_COMMIT_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Deliver the finalized tool result only after its session entry is committed. */\nexport async function dispatchToolResultLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: ToolResultMessage,\n\tentryId: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(TOOL_RESULT_EVENT_ID, TOOL_RESULT_EVENT_VERSION)) return;\n\ttry {\n\t\tconst data: ToolResultEventDataV1 = {\n\t\t\tversion: 1,\n\t\t\tsessionId: session.sessionId,\n\t\t\tentryId,\n\t\t\trevision: detachedSessionSnapshot(session.sessionManager.getRevision()),\n\t\t\ttoolCallId: message.toolCallId,\n\t\t\ttoolName: message.toolName,\n\t\t\tisError: message.isError,\n\t\t\tmessage: detachedSessionSnapshot(message),\n\t\t};\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: TOOL_RESULT_EVENT_ID,\n\t\t\tversion: TOOL_RESULT_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${TOOL_RESULT_EVENT_ID}@${TOOL_RESULT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${TOOL_RESULT_EVENT_ID}@${TOOL_RESULT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${TOOL_RESULT_EVENT_ID}@${TOOL_RESULT_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Notify the rebuilt runtime only after all reload work has committed. */\nexport async function dispatchSessionReloadLifecycle(\n\tsession: AgentSessionInternals,\n\tgeneration: number,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(SESSION_RELOAD_EVENT_ID, SESSION_RELOAD_EVENT_VERSION)) return;\n\tconst data: SessionReloadEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tgeneration,\n\t\treason: \"reload\",\n\t};\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: SESSION_RELOAD_EVENT_ID,\n\t\t\tversion: SESSION_RELOAD_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${SESSION_RELOAD_EVENT_ID}@${SESSION_RELOAD_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${SESSION_RELOAD_EVENT_ID}@${SESSION_RELOAD_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${SESSION_RELOAD_EVENT_ID}@${SESSION_RELOAD_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Deliver the session.auto.retry lifecycle event to the capability runtime.\n * Only the actual retry path dispatches: a \"decided not to retry\" outcome has\n * no event. Facts mirror the same-turn `auto_retry_start` session event.\n */\nexport async function dispatchAutoRetryLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { attempt: number; maxAttempts: number; delayMs: number; errorMessage: string },\n): Promise<void> {\n\tconst data: SessionAutoRetryEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_AUTO_RETRY_EVENT_ID,\n\t\tSESSION_AUTO_RETRY_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver one compaction policy decision (including negative verdicts) to the\n * capability runtime. The threshold triplet is attached only when the caller\n * measured it; the overflow path omits it rather than fabricating values.\n */\nexport async function dispatchCompactionDecisionLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: {\n\t\treason: SessionCompactionDecisionEventDataV1[\"reason\"];\n\t\tcompact: boolean;\n\t\twillRetry: boolean;\n\t\tcontextTokens?: number;\n\t\tcontextWindow?: number;\n\t\treserveTokens?: number;\n\t\tfailureMessage?: string;\n\t},\n): Promise<void> {\n\tconst data: SessionCompactionDecisionEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_COMPACTION_DECISION_EVENT_ID,\n\t\tSESSION_COMPACTION_DECISION_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the session.compaction.failed lifecycle event to the capability\n * runtime. Callers dispatch only on genuine failures; cancellation paths\n * (extension cancel, abort) stay unreported.\n */\nexport async function dispatchCompactionFailedLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { reason: SessionCompactionFailedEventDataV1[\"reason\"]; errorMessage: string },\n): Promise<void> {\n\tconst data: SessionCompactionFailedEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_COMPACTION_FAILED_EVENT_ID,\n\t\tSESSION_COMPACTION_FAILED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the session.end lifecycle event to the capability runtime.\n * Dispatched exactly once from dispose() while the capability runtime is still\n * alive (before capability-plugin disposal, so the observability plugin can\n * still write the final trace record); dispose re-entry returns the same\n * dispose promise, so no second dispatch happens. A reload never reaches this\n * dispatcher — session.start(reason:\"reload\") plus session.reload@1 cover a\n * reload. The turn correlation id is normally absent at dispose time; the\n * delivery is untraced then (the shared dispatch tolerates the absence).\n */\nexport async function dispatchSessionEndLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst data: SessionEndEventDataV1 = { version: 1, sessionId: session.sessionId };\n\tawait dispatchCommittedSessionLifecycle(session, SESSION_END_EVENT_ID, SESSION_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the agent.task.settled lifecycle event (one settled background\n * delegation task, dispatched from the host digest sink) to the capability\n * runtime. `facts.taskSessionId` is the child session the task ran in; the\n * parent sessionId is filled here. After dispose the revoked runtime makes\n * hasLifecycleEvent false, so the helper no-ops safely.\n */\nexport async function dispatchAgentTaskSettledLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: {\n\t\ttaskSessionId: string;\n\t\ttaskId: string;\n\t\tstatus: AgentTaskSettledEventDataV1[\"status\"];\n\t\treasonCode?: string;\n\t},\n): Promise<void> {\n\tconst data: AgentTaskSettledEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tAGENT_TASK_SETTLED_EVENT_ID,\n\t\tAGENT_TASK_SETTLED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\nexport function observeLifecycleDeliveryError(\n\tsession: AgentSessionInternals,\n\terror: unknown,\n\tsource: string,\n\tevent: string,\n): void {\n\t// Non-fatal delivery sink: the original lifecycle failure has already been\n\t// isolated from the canonical commit, so a delivery failure only lands in\n\t// the host process log (no-op when no hostLogger was configured).\n\tsession._hostLogger?.error(\"session\", \"capability lifecycle delivery failed\", {\n\t\t...(session.sessionId === undefined ? {} : { sessionId: session.sessionId }),\n\t\tfields: { event, source },\n\t\tcause: error,\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-lifecycle.js","sourceRoot":"","sources":["../../src/core/agent-session-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Capability lifecycle dispatch and the legacy tool-call gate for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls go through the session\n * parameter (not direct function calls) to preserve that dispatch.\n */\n\nimport type { AgentMessage } from \"@agent-forge/agent-core\";\nimport type { AssistantMessage, ToolResultMessage } from \"@agent-forge/ai/compat\";\nimport {\n\ttype AgentSessionInternals,\n\tdetachedSessionSnapshot,\n\tjsonSafeSessionSnapshot,\n} from \"./agent-session-internal.ts\";\nimport {\n\tAGENT_TASK_SETTLED_EVENT_ID,\n\tAGENT_TASK_SETTLED_EVENT_VERSION,\n\ttype AgentTaskSettledEventDataV1,\n\tINPUT_GATE_BLOCKED_EVENT_ID,\n\tINPUT_GATE_BLOCKED_EVENT_VERSION,\n\ttype InputGateBlockedEventDataV1,\n\tSESSION_AUTO_RETRY_EVENT_ID,\n\tSESSION_AUTO_RETRY_EVENT_VERSION,\n\tSESSION_COMPACTION_DECISION_EVENT_ID,\n\tSESSION_COMPACTION_DECISION_EVENT_VERSION,\n\tSESSION_COMPACTION_FAILED_EVENT_ID,\n\tSESSION_COMPACTION_FAILED_EVENT_VERSION,\n\tSESSION_END_EVENT_ID,\n\tSESSION_END_EVENT_VERSION,\n\ttype SessionAutoRetryEventDataV1,\n\ttype SessionCompactionDecisionEventDataV1,\n\ttype SessionCompactionFailedEventDataV1,\n\ttype SessionEndEventDataV1,\n\tTOOL_GATE_BLOCKED_EVENT_ID,\n\tTOOL_GATE_BLOCKED_EVENT_VERSION,\n\ttype ToolGateBlockedEventDataV1,\n} from \"./extensions/bootstrap-lifecycle.ts\";\nimport {\n\tAGENT_END_EVENT_ID,\n\tAGENT_END_EVENT_VERSION,\n\tAGENT_SETTLED_EVENT_ID,\n\tAGENT_SETTLED_EVENT_VERSION,\n\tAGENT_START_EVENT_ID,\n\tAGENT_START_EVENT_VERSION,\n\ttype AgentEndEventDataV1,\n\ttype AgentLifecycleEventDataV1,\n\tBEFORE_AGENT_START_EVENT_ID,\n\tBEFORE_AGENT_START_EVENT_VERSION,\n\tBEFORE_AGENT_START_EVENT_VERSION_V2,\n\ttype BeforeAgentStartEventDataV1,\n\ttype BeforeAgentStartEventDataV2,\n\tCONTEXT_ASSEMBLED_EVENT_ID,\n\tCONTEXT_ASSEMBLED_EVENT_VERSION,\n\ttype ContextOperationOptions,\n\tINPUT_RECEIVED_EVENT_ID,\n\tINPUT_RECEIVED_EVENT_VERSION,\n\tMESSAGE_END_EVENT_ID,\n\tMESSAGE_END_EVENT_VERSION,\n\tMESSAGE_START_EVENT_ID,\n\tMESSAGE_START_EVENT_VERSION,\n\ttype MessageBoundaryEventDataV1,\n\tMODEL_RESPONSE_EVENT_ID,\n\tMODEL_RESPONSE_EVENT_VERSION,\n\tMODEL_SELECT_EVENT_ID,\n\tMODEL_SELECT_EVENT_VERSION,\n\tMODEL_STREAM_EVENT_ID,\n\tMODEL_STREAM_EVENT_VERSION,\n\ttype ModelResponseEventDataV1,\n\ttype ModelSelectEventDataV1,\n\ttype ModelStreamEventDataV1,\n\tRESOURCES_DISCOVER_EVENT_ID,\n\tRESOURCES_DISCOVER_EVENT_VERSION,\n\tRESOURCES_DISCOVER_EVENT_VERSION_V2,\n\ttype ResourcesDiscoverEventDataV2,\n\tSESSION_CONTEXT_REPLACED_EVENT_ID,\n\tSESSION_CONTEXT_REPLACED_EVENT_VERSION,\n\tSESSION_ENTRY_APPENDED_EVENT_ID,\n\tSESSION_ENTRY_APPENDED_EVENT_VERSION,\n\tSESSION_INFO_CHANGED_EVENT_ID,\n\tSESSION_INFO_CHANGED_EVENT_VERSION,\n\tSESSION_RELOAD_EVENT_ID,\n\tSESSION_RELOAD_EVENT_VERSION,\n\tSESSION_START_EVENT_ID,\n\tSESSION_START_EVENT_VERSION,\n\ttype SessionEntryAppendedEventDataV1,\n\ttype SessionInfoChangedEventDataV1,\n\ttype SessionReloadEventDataV1,\n\ttype SessionStartEventDataV1,\n\tTHINKING_LEVEL_SELECT_EVENT_ID,\n\tTHINKING_LEVEL_SELECT_EVENT_VERSION,\n\ttype ThinkingLevelSelectEventDataV1,\n\tTOOL_COMMIT_EVENT_ID,\n\tTOOL_COMMIT_EVENT_VERSION,\n\tTOOL_EXECUTION_START_EVENT_ID,\n\tTOOL_EXECUTION_START_EVENT_VERSION,\n\tTOOL_RESULT_EVENT_ID,\n\tTOOL_RESULT_EVENT_VERSION,\n\ttype ToolCommitEventDataV1,\n\ttype ToolExecutionStartEventDataV1,\n\ttype ToolResultEventDataV1,\n\tTURN_END_EVENT_ID,\n\tTURN_END_EVENT_VERSION,\n\tTURN_START_EVENT_ID,\n\tTURN_START_EVENT_VERSION,\n\ttype TurnEndEventDataV1,\n\ttype TurnStartEventDataV1,\n\tUSER_BASH_EVENT_ID,\n\tUSER_BASH_EVENT_VERSION,\n} from \"./extensions/index.ts\";\nimport type { BuildSystemPromptOptions } from \"./system-prompt.ts\";\n\nexport async function dispatchModelStreamLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: AgentMessage,\n\teventName: ModelStreamEventDataV1[\"event\"],\n\tphase: ModelStreamEventDataV1[\"phase\"],\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\tconst state = session._modelStreamState;\n\t// Subscriber gate sits BEFORE the sequence increment on purpose: the\n\t// model.stream@1 contract pins per-streamId sequence to start at 1 and stay\n\t// strictly contiguous (docs/design/插件基础能力设计.md §model.stream;跳号是\n\t// 协议错误), which is an observer-facing guarantee. Undelivered deltas must\n\t// not consume sequence numbers, so a late subscriber still observes a\n\t// contiguous stream from 1. Skipping the increment when nobody observes also\n\t// skips the per-delta O(L) JSON snapshot and the dispatch-path clones.\n\tif (\n\t\t!runtime ||\n\t\t!state ||\n\t\t!runtime.hasLifecycleEvent(MODEL_STREAM_EVENT_ID, MODEL_STREAM_EVENT_VERSION) ||\n\t\t!runtime.hasLifecycleSubscribers(MODEL_STREAM_EVENT_ID, MODEL_STREAM_EVENT_VERSION)\n\t) {\n\t\treturn;\n\t}\n\tif (message.role !== \"assistant\") return;\n\tstate.sequence += 1;\n\tconst terminal = eventName === \"done\" || eventName === \"error\";\n\tlet partial: unknown | null = null;\n\ttry {\n\t\tpartial = jsonSafeSessionSnapshot(message);\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${MODEL_STREAM_EVENT_ID}@${MODEL_STREAM_EVENT_VERSION}/snapshot`,\n\t\t);\n\t}\n\tconst data: ModelStreamEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tstreamId: state.streamId,\n\t\tsequence: state.sequence,\n\t\tphase,\n\t\tevent: eventName,\n\t\tpartial,\n\t\tterminal,\n\t\terror:\n\t\t\teventName === \"error\"\n\t\t\t\t? {\n\t\t\t\t\t\tcode: message.stopReason === \"aborted\" ? \"aborted\" : \"provider_error\",\n\t\t\t\t\t\tmessage: message.errorMessage ?? \"Model stream failed\",\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t};\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: MODEL_STREAM_EVENT_ID,\n\t\t\tversion: MODEL_STREAM_EVENT_VERSION,\n\t\t\tphase,\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${MODEL_STREAM_EVENT_ID}@${MODEL_STREAM_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${MODEL_STREAM_EVENT_ID}@${MODEL_STREAM_EVENT_VERSION}`,\n\t\t);\n\t}\n}\n\n/**\n * Deliver the agent.start lifecycle event to the capability runtime.\n * The turn correlation id is usually absent at the run start boundary; the\n * dispatch is untraced in that case, matching the idle-time replace semantics.\n */\nexport async function dispatchAgentStartLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回仅在 runtime 缺席时可达\n\tif (!runtime?.hasLifecycleEvent(AGENT_START_EVENT_ID, AGENT_START_EVENT_VERSION)) {\n\t\treturn;\n\t}\n\tconst data: AgentLifecycleEventDataV1 = { version: 1, sessionId: session.sessionId };\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: AGENT_START_EVENT_ID,\n\t\t\tversion: AGENT_START_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${AGENT_START_EVENT_ID}@${AGENT_START_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${AGENT_START_EVENT_ID}@${AGENT_START_EVENT_VERSION}`,\n\t\t);\n\t}\n}\n\n/**\n * Deliver one committed lifecycle event with host-assembled facts.\n * Used by the host channels whose facts live outside the dedicated dispatchers\n * (user.bash / input.received / context.assembled / resources.discover@1): the\n * producer knows the facts, the session assembles the envelope (version,\n * sessionId) and owns the guard, the delivery trace, and the failure\n * observation.\n */\nexport async function dispatchCommittedLifecycleEvent(\n\tsession: AgentSessionInternals,\n\teventId: string,\n\tversion: number,\n\tfacts: Record<string, unknown>,\n): Promise<void> {\n\tawait dispatchCommittedSessionLifecycle(session, eventId, version, {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\t...facts,\n\t});\n}\n\n/** Deliver the user.bash lifecycle event (facts only; the command text never enters the envelope). */\nexport function dispatchUserBashLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { cwd: string; excludeFromContext: boolean },\n): void {\n\tvoid dispatchCommittedLifecycleEvent(session, USER_BASH_EVENT_ID, USER_BASH_EVENT_VERSION, facts);\n}\n\n/** Deliver the input.received lifecycle event (facts only; the input text never enters the envelope). */\nexport function dispatchInputReceivedLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { source: string; textLength: number },\n): void {\n\tvoid dispatchCommittedLifecycleEvent(session, INPUT_RECEIVED_EVENT_ID, INPUT_RECEIVED_EVENT_VERSION, facts);\n}\n\n/** Deliver the context.assembled lifecycle event (facts only; the messages never enter the envelope). */\nexport function dispatchContextAssembledLifecycle(session: AgentSessionInternals, messageCount: number): void {\n\tvoid dispatchCommittedLifecycleEvent(session, CONTEXT_ASSEMBLED_EVENT_ID, CONTEXT_ASSEMBLED_EVENT_VERSION, {\n\t\tmessageCount,\n\t});\n}\n\n/** Deliver the resources.discover@1 committed observe event (facts only). */\nexport function dispatchResourcesDiscoverV1Lifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { cwd: string; reason: \"startup\" | \"reload\" },\n): void {\n\tvoid dispatchCommittedLifecycleEvent(session, RESOURCES_DISCOVER_EVENT_ID, RESOURCES_DISCOVER_EVENT_VERSION, facts);\n}\n\n/** Shared committed dispatch for the turn/message boundary lifecycle events. */\nasync function dispatchCommittedSessionLifecycle(\n\tsession: AgentSessionInternals,\n\teventId: string,\n\tversion: number,\n\tdata: unknown,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime?.hasLifecycleEvent(eventId, version)) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: eventId,\n\t\t\tversion,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${eventId}@${version}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(error, \"<capability-lifecycle>\", `${eventId}@${version}`);\n\t}\n}\n\n/**\n * Deliver the session.start lifecycle event to the capability runtime.\n */\nexport async function dispatchSessionStartLifecycle(\n\tsession: AgentSessionInternals,\n\treason: \"startup\" | \"reload\" | \"new\" | \"resume\" | \"fork\",\n\tpreviousSessionFile?: string,\n): Promise<void> {\n\tconst data: SessionStartEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\treason,\n\t\t...(previousSessionFile === undefined ? {} : { previousSessionFile }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, SESSION_START_EVENT_ID, SESSION_START_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the session.info.changed lifecycle event to the capability runtime.\n */\nexport async function dispatchSessionInfoChangedLifecycle(\n\tsession: AgentSessionInternals,\n\tname: string | undefined,\n): Promise<void> {\n\tconst data: SessionInfoChangedEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\t...(name === undefined ? {} : { name }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_INFO_CHANGED_EVENT_ID,\n\t\tSESSION_INFO_CHANGED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the session.entry.appended lifecycle event to the capability runtime.\n * Entry data is deliberately excluded from the envelope: it can be arbitrarily\n * large; entryId/entryType are the minimal facts.\n */\nexport async function dispatchSessionEntryAppendedLifecycle(\n\tsession: AgentSessionInternals,\n\tentryId: string,\n\tentryType: string,\n): Promise<void> {\n\tconst data: SessionEntryAppendedEventDataV1 = { version: 1, sessionId: session.sessionId, entryId, entryType };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_ENTRY_APPENDED_EVENT_ID,\n\t\tSESSION_ENTRY_APPENDED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the agent.end lifecycle event to the capability runtime.\n */\nexport async function dispatchAgentEndLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst data: AgentEndEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tmessageCount: session.agent.state.messages.length,\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, AGENT_END_EVENT_ID, AGENT_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the before.agent.start lifecycle event to the capability runtime.\n * The prompt text and assembled system prompt are deliberately excluded from\n * the envelope: arbitrarily large and potentially sensitive; hasImages is the\n * minimal fact.\n */\nexport async function dispatchBeforeAgentStartLifecycle(\n\tsession: AgentSessionInternals,\n\thasImages: boolean,\n): Promise<void> {\n\tconst data: BeforeAgentStartEventDataV1 = { version: 1, sessionId: session.sessionId, hasImages };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tBEFORE_AGENT_START_EVENT_ID,\n\t\tBEFORE_AGENT_START_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\ninterface LifecycleFailureReport {\n\treport?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] };\n}\n\n/**\n * Deliver the before.agent.start@2 candidate event and report whether a\n * capability transform replaced the system prompt.\n *\n * Precedence contract: the legacy before_agent_start channel runs first and\n * applies its own override; this dispatch runs after it, so a transform that\n * yields a different systemPrompt is the later writer and wins. A missing\n * registration, a transform returning the input verbatim (\"no replacement\"),\n * or a failed delivery leaves the legacy outcome untouched; delivery errors\n * go through the same non-fatal observation sink as the committed dispatches.\n */\nexport async function dispatchBeforeAgentStartV2Lifecycle(\n\tsession: AgentSessionInternals,\n\tsystemPrompt: string,\n\tsystemPromptOptions: BuildSystemPromptOptions,\n): Promise<string | undefined> {\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime?.hasLifecycleEvent(BEFORE_AGENT_START_EVENT_ID, BEFORE_AGENT_START_EVENT_VERSION_V2)) {\n\t\treturn undefined;\n\t}\n\tconst data: BeforeAgentStartEventDataV2 = {\n\t\tversion: 2,\n\t\tsessionId: session.sessionId,\n\t\tsystemPrompt,\n\t\tsystemPromptOptions: detachedSessionSnapshot(systemPromptOptions),\n\t};\n\tconst eventLabel = `${BEFORE_AGENT_START_EVENT_ID}@${BEFORE_AGENT_START_EVENT_VERSION_V2}`;\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: BEFORE_AGENT_START_EVENT_ID,\n\t\t\tversion: BEFORE_AGENT_START_EVENT_VERSION_V2,\n\t\t\tphase: \"candidate\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t}\n\t\treturn delivery.data.systemPrompt === systemPrompt ? undefined : delivery.data.systemPrompt;\n\t} catch (error) {\n\t\tconst report = (error as LifecycleFailureReport).report;\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(error, \"<capability-lifecycle>\", eventLabel);\n\t\t}\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Deliver the resources.discover@2 candidate event and return the transform\n * contributions. The legacy resources_discover collection (and the v1\n * committed observe dispatch inside it) runs first; the v2 contribution is\n * the later writer and is appended to the legacy result. Delivery errors are\n * observed through the same non-fatal sink and yield an empty contribution.\n */\nexport async function dispatchResourcesDiscoverV2Lifecycle(\n\tsession: AgentSessionInternals,\n\treason: \"startup\" | \"reload\",\n): Promise<{\n\tskillPaths: Array<{ path: string; extensionPath: string }>;\n\tpromptPaths: Array<{ path: string; extensionPath: string }>;\n\tthemePaths: Array<{ path: string; extensionPath: string }>;\n}> {\n\tconst runtime = session._capabilityRuntime;\n\tif (!runtime?.hasLifecycleEvent(RESOURCES_DISCOVER_EVENT_ID, RESOURCES_DISCOVER_EVENT_VERSION_V2)) {\n\t\treturn { skillPaths: [], promptPaths: [], themePaths: [] };\n\t}\n\tconst data: ResourcesDiscoverEventDataV2 = {\n\t\tversion: 2,\n\t\tsessionId: session.sessionId,\n\t\tcwd: session._cwd,\n\t\treason,\n\t};\n\tconst eventLabel = `${RESOURCES_DISCOVER_EVENT_ID}@${RESOURCES_DISCOVER_EVENT_VERSION_V2}`;\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: RESOURCES_DISCOVER_EVENT_ID,\n\t\t\tversion: RESOURCES_DISCOVER_EVENT_VERSION_V2,\n\t\t\tphase: \"candidate\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t}\n\t\treturn {\n\t\t\tskillPaths: delivery.data.skillPaths ?? [],\n\t\t\tpromptPaths: delivery.data.promptPaths ?? [],\n\t\t\tthemePaths: delivery.data.themePaths ?? [],\n\t\t};\n\t} catch (error) {\n\t\tconst report = (error as LifecycleFailureReport).report;\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(failure.error, failure.pluginId, `${eventLabel}/${failure.kind}`);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(error, \"<capability-lifecycle>\", eventLabel);\n\t\t}\n\t\treturn { skillPaths: [], promptPaths: [], themePaths: [] };\n\t}\n}\n\n/**\n * Deliver the model.select lifecycle event to the capability runtime.\n * Only model facts (provider/id) enter the envelope — the full Model object\n * carries api instances, headers, and cost, which stay internal (same ruling\n * as the R3-4 SessionAPI facts views).\n */\nexport async function dispatchModelSelectLifecycle(\n\tsession: AgentSessionInternals,\n\tnextModel: { provider: string; id: string },\n\tsource: \"set\" | \"cycle\" | \"restore\",\n): Promise<void> {\n\tconst data: ModelSelectEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tprovider: nextModel.provider,\n\t\tid: nextModel.id,\n\t\tsource,\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, MODEL_SELECT_EVENT_ID, MODEL_SELECT_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the thinking_level.select lifecycle event to the capability runtime.\n */\nexport async function dispatchThinkingLevelSelectLifecycle(\n\tsession: AgentSessionInternals,\n\tlevel: string,\n\tpreviousLevel: string,\n): Promise<void> {\n\tconst data: ThinkingLevelSelectEventDataV1 = { version: 1, sessionId: session.sessionId, level, previousLevel };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tTHINKING_LEVEL_SELECT_EVENT_ID,\n\t\tTHINKING_LEVEL_SELECT_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the tool.execution.start lifecycle event to the capability runtime.\n * Tool arguments are deliberately excluded from the envelope: they can be\n * arbitrarily large and may carry sensitive values.\n */\nexport async function dispatchToolExecutionStartLifecycle(\n\tsession: AgentSessionInternals,\n\ttoolCallId: string,\n\ttoolName: string,\n): Promise<void> {\n\tconst data: ToolExecutionStartEventDataV1 = { version: 1, sessionId: session.sessionId, toolCallId, toolName };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tTOOL_EXECUTION_START_EVENT_ID,\n\t\tTOOL_EXECUTION_START_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the tool.gate.blocked lifecycle event (one beforeToolCall chain link\n * returned a block short-circuit) to the capability runtime. The blocking\n * plugin's identity is deliberately absent: the hook chain has no identity\n * surface. After dispose the revoked runtime makes hasLifecycleEvent false, so\n * the helper no-ops safely.\n */\nexport async function dispatchToolGateBlockedLifecycle(\n\tsession: AgentSessionInternals,\n\ttoolCallId: string,\n\ttoolName: string,\n\treason?: string,\n): Promise<void> {\n\tconst data: ToolGateBlockedEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\ttoolCallId,\n\t\ttoolName,\n\t\t...(reason === undefined ? {} : { reason }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, TOOL_GATE_BLOCKED_EVENT_ID, TOOL_GATE_BLOCKED_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the input.gate.blocked lifecycle event (one beforeInput chain link\n * returned a block short-circuit, 输入 gate A3) to the capability runtime.\n * Facts only — the rejected input's text never enters the envelope. The\n * blocking plugin's identity is deliberately absent: the hook chain has no\n * identity surface. After dispose the revoked runtime makes\n * hasLifecycleEvent false, so the helper no-ops safely.\n */\nexport async function dispatchInputGateBlockedLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { source: string; textLength: number; reason?: string },\n): Promise<void> {\n\tconst data: InputGateBlockedEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tsource: facts.source,\n\t\ttextLength: facts.textLength,\n\t\t...(facts.reason === undefined ? {} : { reason: facts.reason }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tINPUT_GATE_BLOCKED_EVENT_ID,\n\t\tINPUT_GATE_BLOCKED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the turn.start lifecycle event to the capability runtime.\n */\nexport async function dispatchTurnStartLifecycle(session: AgentSessionInternals, turnIndex: number): Promise<void> {\n\tconst data: TurnStartEventDataV1 = { version: 1, sessionId: session.sessionId, turnIndex };\n\tawait dispatchCommittedSessionLifecycle(session, TURN_START_EVENT_ID, TURN_START_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the turn.end lifecycle event to the capability runtime. The\n * turn-level `outcome` is present only when the turn ended in a deviation\n * (\"aborted\"/\"error\", judged from the turn's own assistant message);\n * completed turns omit the key.\n */\nexport async function dispatchTurnEndLifecycle(\n\tsession: AgentSessionInternals,\n\tturnIndex: number,\n\tmessageCount: number,\n\toutcome?: TurnEndEventDataV1[\"outcome\"],\n): Promise<void> {\n\tconst data: TurnEndEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tturnIndex,\n\t\tmessageCount,\n\t\t...(outcome === undefined ? {} : { outcome }),\n\t};\n\tawait dispatchCommittedSessionLifecycle(session, TURN_END_EVENT_ID, TURN_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the message.start lifecycle event to the capability runtime.\n */\nexport async function dispatchMessageStartLifecycle(session: AgentSessionInternals, role: string): Promise<void> {\n\tconst data: MessageBoundaryEventDataV1 = { version: 1, sessionId: session.sessionId, role };\n\tawait dispatchCommittedSessionLifecycle(session, MESSAGE_START_EVENT_ID, MESSAGE_START_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the message.end lifecycle event to the capability runtime.\n */\nexport async function dispatchMessageEndLifecycle(session: AgentSessionInternals, role: string): Promise<void> {\n\tconst data: MessageBoundaryEventDataV1 = { version: 1, sessionId: session.sessionId, role };\n\tawait dispatchCommittedSessionLifecycle(session, MESSAGE_END_EVENT_ID, MESSAGE_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the agent.settled lifecycle event to the capability runtime.\n * agent_settled is the prompt run's settlement boundary, so it joins the\n * prompt run's trace via the turn correlation id.\n */\nexport async function dispatchAgentSettledLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回仅在 runtime 缺席时可达\n\tif (!runtime?.hasLifecycleEvent(AGENT_SETTLED_EVENT_ID, AGENT_SETTLED_EVENT_VERSION)) {\n\t\treturn;\n\t}\n\tconst data: AgentLifecycleEventDataV1 = { version: 1, sessionId: session.sessionId };\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: AGENT_SETTLED_EVENT_ID,\n\t\t\tversion: AGENT_SETTLED_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${AGENT_SETTLED_EVENT_ID}@${AGENT_SETTLED_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tsession._observeLifecycleDeliveryError(\n\t\t\terror,\n\t\t\t\"<capability-lifecycle>\",\n\t\t\t`${AGENT_SETTLED_EVENT_ID}@${AGENT_SETTLED_EVENT_VERSION}`,\n\t\t);\n\t}\n}\n\n/** Notify observers only after the runtime context projection has been committed. */\nexport async function dispatchContextReplacedLifecycle(\n\tsession: AgentSessionInternals,\n\treason: NonNullable<ContextOperationOptions[\"reason\"]>,\n\tstrategyName?: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(SESSION_CONTEXT_REPLACED_EVENT_ID, SESSION_CONTEXT_REPLACED_EVENT_VERSION)) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: SESSION_CONTEXT_REPLACED_EVENT_ID,\n\t\t\tversion: SESSION_CONTEXT_REPLACED_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata: {\n\t\t\t\tversion: 1,\n\t\t\t\tsessionId: session.sessionId,\n\t\t\t\treason,\n\t\t\t\tmessageCount: session.agent.state.messages.length,\n\t\t\t\t...(strategyName === undefined ? {} : { strategyName }),\n\t\t\t},\n\t\t\tsource: \"agent-session\",\n\t\t\t// In-turn transitions (retry, overflow recovery, auto compaction)\n\t\t\t// join the prompt run's trace; idle-time replaces stay untraced.\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${SESSION_CONTEXT_REPLACED_EVENT_ID}@${SESSION_CONTEXT_REPLACED_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${SESSION_CONTEXT_REPLACED_EVENT_ID}@${SESSION_CONTEXT_REPLACED_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${SESSION_CONTEXT_REPLACED_EVENT_ID}@${SESSION_CONTEXT_REPLACED_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Deliver the finalized assistant response only after its session entry is committed. */\nexport async function dispatchModelResponseLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\tentryId: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(MODEL_RESPONSE_EVENT_ID, MODEL_RESPONSE_EVENT_VERSION)) return;\n\tconst data: ModelResponseEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tentryId,\n\t\trevision: detachedSessionSnapshot(session.sessionManager.getRevision()),\n\t\tprovider: message.provider,\n\t\tmodel: message.model,\n\t\tstopReason: message.stopReason,\n\t\tmessage: detachedSessionSnapshot(message),\n\t\t...(message.errorMessage === undefined ? {} : { errorMessage: message.errorMessage }),\n\t};\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: MODEL_RESPONSE_EVENT_ID,\n\t\t\tversion: MODEL_RESPONSE_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${MODEL_RESPONSE_EVENT_ID}@${MODEL_RESPONSE_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${MODEL_RESPONSE_EVENT_ID}@${MODEL_RESPONSE_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${MODEL_RESPONSE_EVENT_ID}@${MODEL_RESPONSE_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Deliver the finalized tool result only after its session entry is committed. */\nexport async function dispatchToolCommitLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: ToolResultMessage,\n\tentryId: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(TOOL_COMMIT_EVENT_ID, TOOL_COMMIT_EVENT_VERSION)) return;\n\ttry {\n\t\tconst data: ToolCommitEventDataV1 = {\n\t\t\tversion: 1,\n\t\t\tsessionId: session.sessionId,\n\t\t\tentryId,\n\t\t\trevision: detachedSessionSnapshot(session.sessionManager.getRevision()),\n\t\t\ttoolCallId: message.toolCallId,\n\t\t\ttoolName: message.toolName,\n\t\t\tisError: message.isError,\n\t\t};\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: TOOL_COMMIT_EVENT_ID,\n\t\t\tversion: TOOL_COMMIT_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${TOOL_COMMIT_EVENT_ID}@${TOOL_COMMIT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${TOOL_COMMIT_EVENT_ID}@${TOOL_COMMIT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${TOOL_COMMIT_EVENT_ID}@${TOOL_COMMIT_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Deliver the finalized tool result only after its session entry is committed. */\nexport async function dispatchToolResultLifecycle(\n\tsession: AgentSessionInternals,\n\tmessage: ToolResultMessage,\n\tentryId: string,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(TOOL_RESULT_EVENT_ID, TOOL_RESULT_EVENT_VERSION)) return;\n\ttry {\n\t\tconst data: ToolResultEventDataV1 = {\n\t\t\tversion: 1,\n\t\t\tsessionId: session.sessionId,\n\t\t\tentryId,\n\t\t\trevision: detachedSessionSnapshot(session.sessionManager.getRevision()),\n\t\t\ttoolCallId: message.toolCallId,\n\t\t\ttoolName: message.toolName,\n\t\t\tisError: message.isError,\n\t\t\tmessage: detachedSessionSnapshot(message),\n\t\t};\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: TOOL_RESULT_EVENT_ID,\n\t\t\tversion: TOOL_RESULT_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t\tcorrelationId: session._turnCorrelationId,\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${TOOL_RESULT_EVENT_ID}@${TOOL_RESULT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${TOOL_RESULT_EVENT_ID}@${TOOL_RESULT_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${TOOL_RESULT_EVENT_ID}@${TOOL_RESULT_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/** Notify the rebuilt runtime only after all reload work has committed. */\nexport async function dispatchSessionReloadLifecycle(\n\tsession: AgentSessionInternals,\n\tgeneration: number,\n): Promise<void> {\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- bootstrap lifecycle 恒定义全部生命周期事件,其 token 在 dispose 前恒活跃,提前返回不可达\n\tif (!runtime?.hasLifecycleEvent(SESSION_RELOAD_EVENT_ID, SESSION_RELOAD_EVENT_VERSION)) return;\n\tconst data: SessionReloadEventDataV1 = {\n\t\tversion: 1,\n\t\tsessionId: session.sessionId,\n\t\tgeneration,\n\t\treason: \"reload\",\n\t};\n\ttry {\n\t\tconst delivery = await runtime.dispatchLifecycle({\n\t\t\ttype: SESSION_RELOAD_EVENT_ID,\n\t\t\tversion: SESSION_RELOAD_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tdata,\n\t\t\tsource: \"agent-session\",\n\t\t});\n\t\tfor (const failure of delivery.report.failures) {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\tfailure.error,\n\t\t\t\tfailure.pluginId,\n\t\t\t\t`${SESSION_RELOAD_EVENT_ID}@${SESSION_RELOAD_EVENT_VERSION}/${failure.kind}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconst report = (\n\t\t\terror as { report?: { failures?: readonly { error: unknown; pluginId: string; kind: string }[] } }\n\t\t).report;\n\t\t// v8 ignore next -- phase 常量合法且未传 signal,dispatchLifecycle 仅在 transform/execute 被禁止注册时拒绝,report 形态拒绝不可达\n\t\tif (report?.failures) {\n\t\t\tfor (const failure of report.failures) {\n\t\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\t\tfailure.error,\n\t\t\t\t\tfailure.pluginId,\n\t\t\t\t\t`${SESSION_RELOAD_EVENT_ID}@${SESSION_RELOAD_EVENT_VERSION}/${failure.kind}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tsession._observeLifecycleDeliveryError(\n\t\t\t\terror,\n\t\t\t\t\"<capability-lifecycle>\",\n\t\t\t\t`${SESSION_RELOAD_EVENT_ID}@${SESSION_RELOAD_EVENT_VERSION}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Deliver the session.auto.retry lifecycle event to the capability runtime.\n * Only the actual retry path dispatches: a \"decided not to retry\" outcome has\n * no event. Facts mirror the same-turn `auto_retry_start` session event.\n */\nexport async function dispatchAutoRetryLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { attempt: number; maxAttempts: number; delayMs: number; errorMessage: string },\n): Promise<void> {\n\tconst data: SessionAutoRetryEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_AUTO_RETRY_EVENT_ID,\n\t\tSESSION_AUTO_RETRY_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver one compaction policy decision (including negative verdicts) to the\n * capability runtime. The threshold triplet is attached only when the caller\n * measured it; the overflow path omits it rather than fabricating values.\n */\nexport async function dispatchCompactionDecisionLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: {\n\t\treason: SessionCompactionDecisionEventDataV1[\"reason\"];\n\t\tcompact: boolean;\n\t\twillRetry: boolean;\n\t\tcontextTokens?: number;\n\t\tcontextWindow?: number;\n\t\treserveTokens?: number;\n\t\tfailureMessage?: string;\n\t},\n): Promise<void> {\n\tconst data: SessionCompactionDecisionEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_COMPACTION_DECISION_EVENT_ID,\n\t\tSESSION_COMPACTION_DECISION_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the session.compaction.failed lifecycle event to the capability\n * runtime. Callers dispatch only on genuine failures; cancellation paths\n * (extension cancel, abort) stay unreported.\n */\nexport async function dispatchCompactionFailedLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: { reason: SessionCompactionFailedEventDataV1[\"reason\"]; errorMessage: string },\n): Promise<void> {\n\tconst data: SessionCompactionFailedEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tSESSION_COMPACTION_FAILED_EVENT_ID,\n\t\tSESSION_COMPACTION_FAILED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\n/**\n * Deliver the session.end lifecycle event to the capability runtime.\n * Dispatched exactly once from dispose() while the capability runtime is still\n * alive (before capability-plugin disposal, so the observability plugin can\n * still write the final trace record); dispose re-entry returns the same\n * dispose promise, so no second dispatch happens. A reload never reaches this\n * dispatcher — session.start(reason:\"reload\") plus session.reload@1 cover a\n * reload. The turn correlation id is normally absent at dispose time; the\n * delivery is untraced then (the shared dispatch tolerates the absence).\n */\nexport async function dispatchSessionEndLifecycle(session: AgentSessionInternals): Promise<void> {\n\tconst data: SessionEndEventDataV1 = { version: 1, sessionId: session.sessionId };\n\tawait dispatchCommittedSessionLifecycle(session, SESSION_END_EVENT_ID, SESSION_END_EVENT_VERSION, data);\n}\n\n/**\n * Deliver the agent.task.settled lifecycle event (one settled background\n * delegation task, dispatched from the host digest sink) to the capability\n * runtime. `facts.taskSessionId` is the child session the task ran in; the\n * parent sessionId is filled here. After dispose the revoked runtime makes\n * hasLifecycleEvent false, so the helper no-ops safely.\n */\nexport async function dispatchAgentTaskSettledLifecycle(\n\tsession: AgentSessionInternals,\n\tfacts: {\n\t\ttaskSessionId: string;\n\t\ttaskId: string;\n\t\tstatus: AgentTaskSettledEventDataV1[\"status\"];\n\t\treasonCode?: string;\n\t},\n): Promise<void> {\n\tconst data: AgentTaskSettledEventDataV1 = { version: 1, sessionId: session.sessionId, ...facts };\n\tawait dispatchCommittedSessionLifecycle(\n\t\tsession,\n\t\tAGENT_TASK_SETTLED_EVENT_ID,\n\t\tAGENT_TASK_SETTLED_EVENT_VERSION,\n\t\tdata,\n\t);\n}\n\nexport function observeLifecycleDeliveryError(\n\tsession: AgentSessionInternals,\n\terror: unknown,\n\tsource: string,\n\tevent: string,\n): void {\n\t// Non-fatal delivery sink: the original lifecycle failure has already been\n\t// isolated from the canonical commit, so a delivery failure only lands in\n\t// the host process log (no-op when no hostLogger was configured).\n\tsession._hostLogger?.error(\"session\", \"capability lifecycle delivery failed\", {\n\t\t...(session.sessionId === undefined ? {} : { sessionId: session.sessionId }),\n\t\tfields: { event, source },\n\t\tcause: error,\n\t});\n}\n"]}
|