@code-yeongyu/senpi 2026.8.13 → 2026.8.16
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 +142 -0
- package/README.md +1 -0
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +14 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js +5 -4
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/core/agent-session.d.ts +80 -8
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +206 -31
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +19 -8
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/experimental.d.ts +4 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +4 -0
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/export-html/template.js +31 -9
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.d.ts +4 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.js +30 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts +2 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js +13 -47
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts +18 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js +64 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.d.ts +3 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.js +27 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts +15 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js +45 -11
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +3 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +17 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +225 -75
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +2 -3
- package/dist/core/extensions/builtin/compaction/lane-policy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.js +2 -3
- package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.js +2 -0
- package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/overflow-retry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/overflow-retry.js +38 -4
- package/dist/core/extensions/builtin/compaction/overflow-retry.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +2 -1
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/summarization-turn-order.d.ts +33 -0
- package/dist/core/extensions/builtin/compaction/summarization-turn-order.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/summarization-turn-order.js +67 -0
- package/dist/core/extensions/builtin/compaction/summarization-turn-order.js.map +1 -0
- package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.js +31 -8
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.js +11 -12
- package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js +16 -0
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +4 -0
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/process-tree.js +6 -1
- package/dist/core/extensions/builtin/mcp/process-tree.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.js +14 -0
- package/dist/core/extensions/builtin/prompt-preset/glm-5-3.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.js +91 -0
- package/dist/core/extensions/builtin/prompt-preset/grok-4.6.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/index.js +22 -2
- package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js +25 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.js +2 -0
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/extensions/builtin/reasoning/index.d.ts +3 -0
- package/dist/core/extensions/builtin/reasoning/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/reasoning/index.js +211 -0
- package/dist/core/extensions/builtin/reasoning/index.js.map +1 -0
- package/dist/core/extensions/builtin/service-tier.d.ts +44 -1
- package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
- package/dist/core/extensions/builtin/service-tier.js +176 -24
- package/dist/core/extensions/builtin/service-tier.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +4 -4
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +13 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +24 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/lockfile-policy.d.ts +15 -0
- package/dist/core/lockfile-policy.d.ts.map +1 -0
- package/dist/core/lockfile-policy.js +15 -0
- package/dist/core/lockfile-policy.js.map +1 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +1 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts +34 -7
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +115 -27
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +5 -3
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-api-key-auth.d.ts.map +1 -1
- package/dist/core/provider-api-key-auth.js +45 -2
- package/dist/core/provider-api-key-auth.js.map +1 -1
- package/dist/core/provider-composer.d.ts +12 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts +13 -0
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +15 -0
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts +1 -1
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +5 -3
- package/dist/core/retry-fallback/controller.js.map +1 -1
- package/dist/core/retry-fallback/settings.d.ts.map +1 -1
- package/dist/core/retry-fallback/settings.js +4 -1
- package/dist/core/retry-fallback/settings.js.map +1 -1
- package/dist/core/sdk.d.ts +5 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +14 -8
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +20 -4
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +50 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +258 -15
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/thinking-levels.d.ts +22 -0
- package/dist/core/thinking-levels.d.ts.map +1 -1
- package/dist/core/thinking-levels.js +29 -0
- package/dist/core/thinking-levels.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +2 -0
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +2 -0
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +2 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +2 -0
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +18 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +2 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +17 -1
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/model-favorites.d.ts +2 -1
- package/dist/modes/interactive/components/model-favorites.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-favorites.js +72 -6
- package/dist/modes/interactive/components/model-favorites.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +5 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +10 -6
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +10 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +22 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +14 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +109 -50
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
- package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
- package/dist/modes/interactive/model-catalog-refresh.js +36 -0
- package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +2 -0
- package/dist/modes/interactive/theme/grok-day.json +2 -0
- package/dist/modes/interactive/theme/grok-night.json +2 -0
- package/dist/modes/interactive/theme/light.json +2 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +23 -10
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +9 -1
- package/dist/modes/interactive/theme/theme.d.ts +5 -3
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +12 -2
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +4 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +5 -2
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts +10 -0
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +87 -19
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +3 -3
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +26 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +25 -2
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +60 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +2 -14
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-writer.d.ts +29 -10
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +229 -50
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/server/create-harness.d.ts.map +1 -1
- package/dist/server/create-harness.js +2 -0
- package/dist/server/create-harness.js.map +1 -1
- package/dist/utils/shell.d.ts +27 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +79 -13
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +10 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +14 -19
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/compaction.md +3 -3
- package/docs/custom-provider.md +1 -1
- package/docs/environment-variables.md +8 -2
- package/docs/extensions.md +13 -1
- package/docs/json.md +9 -5
- package/docs/keybindings.md +8 -2
- package/docs/providers.md +9 -1
- package/docs/rpc.md +128 -6
- package/docs/sdk.md +9 -0
- package/docs/settings.md +93 -1
- package/docs/terminal-setup.md +23 -2
- package/docs/themes.md +24 -3
- package/docs/tui.md +2 -2
- package/docs/usage.md +24 -4
- package/examples/extensions/subagent/agents.ts +40 -9
- package/examples/extensions/subagent/index.ts +26 -3
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +38 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +5 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +5 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +14 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/call-capture.ts +64 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +45 -61
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +6 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-execution-event.ts +201 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +22 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts +25 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +77 -12
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.d.ts +43 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.js +67 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.d.ts +4 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.js +127 -88
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.d.ts +5 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.js +9 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.d.ts +12 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.js +88 -45
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.js +28 -19
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/types.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts +6 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +7 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js +19 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts +18 -5
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts +4 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/search/index.d.ts +21 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/index.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/index.js +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/index.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.d.ts +29 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.js +103 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/README.md +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +40 -14
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +16 -4
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.d.ts +69 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.js +159 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js +125 -5
- package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +13 -9
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js +208 -42
- package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +13 -4
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +10 -7
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +31 -7
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +8 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.d.ts +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.js +234 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.js +6 -3
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +44 -9
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts +15 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js +32 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/deepseek.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/google-vertex.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +14 -3
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.js +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js +34 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/README.md +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.d.ts +26 -0
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.js +121 -0
- package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.js.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.d.ts +6 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js +23 -7
- package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +4 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js +7 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts +30 -0
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.js +24 -0
- package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/layout.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/layout.js +9 -2
- package/node_modules/@earendil-works/pi-tui/dist/layout.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts +8 -2
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js +6 -2
- package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +6 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +18 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts +21 -0
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js +243 -5
- package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +2 -0
- package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.js +33 -8
- package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.d.ts +0 -19
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.js +0 -41
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createWarmAnchorSnapshot, isWarmSummaryAnchorValid } from "../../../compaction/warm-anchor.js";
|
|
2
3
|
import { convertToLlm } from "../../../messages.js";
|
|
3
4
|
import * as checkpointState from "./checkpoint-state.js";
|
|
4
5
|
import * as breaker from "./circuit-breaker.js";
|
|
@@ -68,9 +69,19 @@ function recentCheckpoint(ctx) {
|
|
|
68
69
|
function shouldEndFeedback(result) {
|
|
69
70
|
return !result.applied && result.reason !== "rejected";
|
|
70
71
|
}
|
|
71
|
-
function endCompactionFeedback(ctx, signal, result) {
|
|
72
|
+
function endCompactionFeedback(ctx, signal, result, remoteFallbackReason) {
|
|
72
73
|
if (shouldEndFeedback(result)) {
|
|
73
|
-
|
|
74
|
+
// Surface the concrete failure instead of the generic "Compaction did not
|
|
75
|
+
// apply": the remote stage's reason (e.g. remote-compaction-timeout) and the
|
|
76
|
+
// terminal local reason (unavailable / stale), so the decision log and TUI
|
|
77
|
+
// show what actually happened. An aborted compaction renders "Compaction
|
|
78
|
+
// cancelled" downstream and must not carry a failure message.
|
|
79
|
+
const localReason = result.applied ? undefined : result.reason;
|
|
80
|
+
const parts = [remoteFallbackReason, localReason].filter((part) => Boolean(part));
|
|
81
|
+
const errorMessage = signal?.aborted || parts.length === 0
|
|
82
|
+
? undefined
|
|
83
|
+
: `Compaction did not apply: ${parts.join("; local fallback ")}`;
|
|
84
|
+
ctx.endCompaction?.({ reason: "extension", signal, aborted: signal?.aborted, errorMessage });
|
|
74
85
|
}
|
|
75
86
|
}
|
|
76
87
|
function linkAbortSignal(source, target) {
|
|
@@ -131,8 +142,28 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
131
142
|
clearTimeout(idleWarmupTimer);
|
|
132
143
|
idleWarmupTimer = undefined;
|
|
133
144
|
}
|
|
134
|
-
//
|
|
135
|
-
//
|
|
145
|
+
// A session reload retires this extension generation while the warm-up
|
|
146
|
+
// watcher below is still armed: `AgentSession.reload()` invalidates the old
|
|
147
|
+
// runner, after which every `ExtensionContext` getter throws
|
|
148
|
+
// "stale extension generation after reload". The watcher outlives that
|
|
149
|
+
// invalidation in two places — the `job.failure` continuation and the armed
|
|
150
|
+
// retry timer — and neither had a caller left to receive the throw: the
|
|
151
|
+
// continuation is spawned with `void` (unhandled rejection) and the timer
|
|
152
|
+
// callback throws straight into the timer queue, which terminates the
|
|
153
|
+
// process. The context carries no liveness flag, so a retired generation is
|
|
154
|
+
// only observable by reading a getter and catching the assertion.
|
|
155
|
+
function isContextRetired(ctx) {
|
|
156
|
+
try {
|
|
157
|
+
ctx.isIdle();
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Fenced on the observed job: a prompt, invalidation, a reload, or a newer
|
|
165
|
+
// warm-up stands this watcher down before it can start a duplicate
|
|
166
|
+
// summarization.
|
|
136
167
|
function armIdleWarmupRetry(ctx) {
|
|
137
168
|
const job = speculativeJob;
|
|
138
169
|
if (!job)
|
|
@@ -144,6 +175,11 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
144
175
|
}
|
|
145
176
|
if (speculativeJob !== job)
|
|
146
177
|
return;
|
|
178
|
+
// A reload between arming and this continuation retires the context.
|
|
179
|
+
if (isContextRetired(ctx)) {
|
|
180
|
+
cancelIdleWarmupRetry();
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
147
183
|
const usage = ctx.getContextUsage();
|
|
148
184
|
const contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;
|
|
149
185
|
const retryDecision = {
|
|
@@ -161,6 +197,10 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
161
197
|
idleWarmupTimer = undefined;
|
|
162
198
|
if (speculativeJob !== job)
|
|
163
199
|
return;
|
|
200
|
+
// The reload may land after the timer was armed; a throw here would
|
|
201
|
+
// escape into the timer queue as an uncaughtException.
|
|
202
|
+
if (isContextRetired(ctx))
|
|
203
|
+
return;
|
|
164
204
|
if (!ctx.isIdle())
|
|
165
205
|
return;
|
|
166
206
|
idleWarmupAttempt += 1;
|
|
@@ -175,6 +215,39 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
175
215
|
}, idleRetry.IDLE_WARMUP_RETRY_DELAY_MS);
|
|
176
216
|
});
|
|
177
217
|
}
|
|
218
|
+
function isSameModelIdentity(left, right) {
|
|
219
|
+
return (right !== undefined &&
|
|
220
|
+
left.api === right.api &&
|
|
221
|
+
left.provider === right.provider &&
|
|
222
|
+
left.id === right.id &&
|
|
223
|
+
left.baseUrl === right.baseUrl &&
|
|
224
|
+
left.contextWindow === right.contextWindow);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Detach the warm job for the core route before any `await`, so exactly one
|
|
228
|
+
* claimant can own it. The controller is deliberately NOT aborted: the whole
|
|
229
|
+
* point is to keep the already-paid summarization alive and hand its result to
|
|
230
|
+
* core, and clearing the reference is what stands the idle-retry watcher down.
|
|
231
|
+
*/
|
|
232
|
+
function claimWarmSummaryForCoreRoute(event, ctx) {
|
|
233
|
+
const job = speculativeJob;
|
|
234
|
+
if (!job)
|
|
235
|
+
return undefined;
|
|
236
|
+
if (event.customInstructions !== undefined)
|
|
237
|
+
return undefined;
|
|
238
|
+
if (job.snapshot.origin !== "speculative")
|
|
239
|
+
return undefined;
|
|
240
|
+
if (job.snapshot.preparation.firstKeptEntryId !== event.preparation.firstKeptEntryId)
|
|
241
|
+
return undefined;
|
|
242
|
+
if (!isSameModelIdentity(job.snapshot.model, ctx.model))
|
|
243
|
+
return undefined;
|
|
244
|
+
const anchor = createWarmAnchorSnapshot(job.snapshot.preparation.firstKeptEntryId, job.snapshot.branchEntries ?? []);
|
|
245
|
+
if (!anchor || !isWarmSummaryAnchorValid(anchor, event.branchEntries ?? ctx.sessionManager.getBranch())) {
|
|
246
|
+
return undefined;
|
|
247
|
+
}
|
|
248
|
+
speculativeJob = undefined;
|
|
249
|
+
return job;
|
|
250
|
+
}
|
|
178
251
|
function invalidateSpeculativeCompaction(ctx) {
|
|
179
252
|
const previousGeneration = speculativeGeneration;
|
|
180
253
|
speculativeGeneration++;
|
|
@@ -232,6 +305,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
232
305
|
}
|
|
233
306
|
let feedbackSignal = ctx.beginCompaction?.({ reason: "extension" });
|
|
234
307
|
try {
|
|
308
|
+
let remoteFallbackReason;
|
|
235
309
|
if (isOpenAiRemoteCompactionModel(ctx.model)) {
|
|
236
310
|
const remoteGeneration = speculativeGeneration + 1;
|
|
237
311
|
const remoteSnapshot = createSpeculativeCompactionSnapshot(ctx, {
|
|
@@ -242,7 +316,12 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
242
316
|
getLogger(ctx).debug("blocking_started", { generation: remoteGeneration, origin: "blocking" });
|
|
243
317
|
if (remoteSnapshot) {
|
|
244
318
|
const remoteSignal = feedbackSignal ?? new AbortController().signal;
|
|
245
|
-
const remoteCompaction = await runOpenAiRemoteCompaction(ctx, createBlockingRemoteCompactionEvent(ctx, remoteSnapshot, customInstructions, remoteSignal), (data) =>
|
|
319
|
+
const remoteCompaction = await runOpenAiRemoteCompaction(ctx, createBlockingRemoteCompactionEvent(ctx, remoteSnapshot, customInstructions, remoteSignal), (data) => {
|
|
320
|
+
if (data?.action === "remote_fallback" && typeof data.reason === "string") {
|
|
321
|
+
remoteFallbackReason = data.reason;
|
|
322
|
+
}
|
|
323
|
+
pi.events.emit(SENPI_COMPACTION_EVENT, data);
|
|
324
|
+
}, remoteCompactionDependencies);
|
|
246
325
|
if (remoteCompaction) {
|
|
247
326
|
if (speculativeGeneration !== remoteGeneration - 1) {
|
|
248
327
|
const result = { applied: false, reason: "stale" };
|
|
@@ -315,7 +394,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
315
394
|
if (!snapshot) {
|
|
316
395
|
const result = { applied: false, reason: "unavailable" };
|
|
317
396
|
getLogger(ctx).debug("summary_failed", { reason: "unavailable" });
|
|
318
|
-
endCompactionFeedback(ctx, feedbackSignal, result);
|
|
397
|
+
endCompactionFeedback(ctx, feedbackSignal, result, remoteFallbackReason);
|
|
319
398
|
return result;
|
|
320
399
|
}
|
|
321
400
|
let compaction;
|
|
@@ -332,10 +411,19 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
332
411
|
getLogger(ctx).debug("summary_failed", { reason: error.kind });
|
|
333
412
|
}
|
|
334
413
|
const result = await applyGeneratedCompaction(ctx, snapshot, () => speculativeGeneration, compaction, feedbackSignal);
|
|
335
|
-
endCompactionFeedback(ctx, feedbackSignal, result);
|
|
414
|
+
endCompactionFeedback(ctx, feedbackSignal, result, remoteFallbackReason);
|
|
336
415
|
return result;
|
|
337
416
|
}
|
|
338
417
|
catch (error) {
|
|
418
|
+
if (feedbackSignal?.aborted) {
|
|
419
|
+
// An aborted blocking compaction is a cancellation, not a failure: no
|
|
420
|
+
// red "Compaction failed" line, no breaker debit, no rethrow through
|
|
421
|
+
// the before_agent_start handler (issue #886). The faux-route flavor
|
|
422
|
+
// of this contract is pinned by blocking-compaction-review-hardening.
|
|
423
|
+
getLogger(ctx).debug("blocking_aborted", { route: "blocking" });
|
|
424
|
+
ctx.endCompaction?.({ reason: "extension", signal: feedbackSignal, aborted: true });
|
|
425
|
+
return { applied: false, reason: "rejected" };
|
|
426
|
+
}
|
|
339
427
|
const message = error instanceof Error ? error.message : String(error);
|
|
340
428
|
ctx.endCompaction?.({
|
|
341
429
|
reason: "extension",
|
|
@@ -352,83 +440,135 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
352
440
|
}
|
|
353
441
|
}
|
|
354
442
|
pi.on("session_before_compact", async (event, ctx) => {
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
if (cap.shouldRejectByCap(state).cancel) {
|
|
360
|
-
getLogger(ctx).debug("skip_cap", { reason: event.reason, count: state.acceptedAbsolute });
|
|
361
|
-
return {
|
|
362
|
-
cancel: true,
|
|
363
|
-
rejectionCause: "per-turn-cap",
|
|
364
|
-
reason: "absolute compaction cap reached for this session",
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
const now = Date.now();
|
|
368
|
-
if (breaker.isTripped(state, now) && !breaker.shouldBypass(state, { reason: event.reason })) {
|
|
369
|
-
const remainingMs = state.trippedAt !== null ? Math.max(0, state.trippedAt + breaker.COOLDOWN_MS - now) : 0;
|
|
370
|
-
getLogger(ctx).debug("skip_breaker", { reason: event.reason, remainingSec: Math.ceil(remainingMs / 1000) });
|
|
371
|
-
return {
|
|
372
|
-
cancel: true,
|
|
373
|
-
rejectionCause: "circuit-breaker",
|
|
374
|
-
reason: `compaction circuit breaker cooling down (${Math.ceil(remainingMs / 1000)}s left)`,
|
|
375
|
-
};
|
|
376
|
-
}
|
|
377
|
-
capturePendingMetadata(event.requestId, ctx);
|
|
378
|
-
const model = ctx.model;
|
|
379
|
-
if (!model)
|
|
443
|
+
// A pre-aborted request (superseded admission or user cancel) must stand
|
|
444
|
+
// down before touching warm-job ownership: core's own post-emit abort
|
|
445
|
+
// checks turn it into a clean cancellation (issue #886).
|
|
446
|
+
if (event.signal.aborted)
|
|
380
447
|
return undefined;
|
|
381
|
-
const
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
generation: ++speculativeGeneration,
|
|
388
|
-
expectedRevision: ctx.getMessageRevision(),
|
|
389
|
-
model,
|
|
390
|
-
contextWindow: ctx.getContextUsage()?.contextWindow ?? model.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
|
|
391
|
-
preparation: event.preparation,
|
|
392
|
-
branchEntries: event.branchEntries,
|
|
393
|
-
promptVariant: getPromptVariant(event),
|
|
394
|
-
origin: "core-route",
|
|
395
|
-
customInstructions: event.customInstructions,
|
|
396
|
-
systemPrompt: ctx.getSystemPrompt(),
|
|
397
|
-
tools: getSummarizationTools(),
|
|
398
|
-
};
|
|
399
|
-
let compaction;
|
|
448
|
+
const claimedWarmJob = claimWarmSummaryForCoreRoute(event, ctx);
|
|
449
|
+
// The claim detaches the job without aborting it, so ownership must survive every
|
|
450
|
+
// exit from this handler - including a throw - or the request it already paid for
|
|
451
|
+
// keeps streaming for a result nobody will read.
|
|
452
|
+
let warmJobConsumed = false;
|
|
453
|
+
invalidateSpeculativeCompaction(ctx);
|
|
400
454
|
try {
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
pendingMetadata.delete(event.requestId);
|
|
455
|
+
if (lanePolicy.disablesSenpiCompaction(ctx)) {
|
|
456
|
+
return {
|
|
457
|
+
cancel: true,
|
|
458
|
+
rejectionCause: "external-owner",
|
|
459
|
+
reason: SDK_NATIVE_LANE_REJECTION_REASON,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
if (cap.shouldRejectByCap(state).cancel) {
|
|
463
|
+
getLogger(ctx).debug("skip_cap", { reason: event.reason, count: state.acceptedAbsolute });
|
|
411
464
|
return {
|
|
412
465
|
cancel: true,
|
|
413
|
-
|
|
466
|
+
rejectionCause: "per-turn-cap",
|
|
467
|
+
reason: "absolute compaction cap reached for this session",
|
|
414
468
|
};
|
|
415
469
|
}
|
|
416
|
-
|
|
417
|
-
if (
|
|
418
|
-
|
|
470
|
+
const now = Date.now();
|
|
471
|
+
if (breaker.isTripped(state, now) && !breaker.shouldBypass(state, { reason: event.reason })) {
|
|
472
|
+
const remainingMs = state.trippedAt !== null ? Math.max(0, state.trippedAt + breaker.COOLDOWN_MS - now) : 0;
|
|
473
|
+
getLogger(ctx).debug("skip_breaker", { reason: event.reason, remainingSec: Math.ceil(remainingMs / 1000) });
|
|
474
|
+
return {
|
|
475
|
+
cancel: true,
|
|
476
|
+
rejectionCause: "circuit-breaker",
|
|
477
|
+
reason: `compaction circuit breaker cooling down (${Math.ceil(remainingMs / 1000)}s left)`,
|
|
478
|
+
};
|
|
419
479
|
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
480
|
+
capturePendingMetadata(event.requestId, ctx);
|
|
481
|
+
const model = ctx.model;
|
|
482
|
+
if (!model) {
|
|
483
|
+
return undefined;
|
|
484
|
+
}
|
|
485
|
+
let remoteCompaction;
|
|
486
|
+
try {
|
|
487
|
+
remoteCompaction = await runOpenAiRemoteCompaction(ctx, event, (data) => pi.events.emit(SENPI_COMPACTION_EVENT, data), remoteCompactionDependencies);
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
// The remote route deliberately rethrows once its signal aborts; the
|
|
491
|
+
// handler converts that into a silent stand-down so the abort is not
|
|
492
|
+
// reported as an extension error with a stack (issue #886).
|
|
493
|
+
if (!event.signal.aborted)
|
|
494
|
+
throw error;
|
|
495
|
+
getLogger(ctx).debug("remote_aborted", { route: "core-route", requestId: event.requestId });
|
|
496
|
+
return undefined;
|
|
426
497
|
}
|
|
427
|
-
|
|
498
|
+
if (remoteCompaction) {
|
|
499
|
+
getLogger(ctx).debug("core_route_generated", { route: "core-route", requestId: event.requestId });
|
|
500
|
+
return { compaction: remoteCompaction };
|
|
501
|
+
}
|
|
502
|
+
if (claimedWarmJob) {
|
|
503
|
+
const unlinkAbort = linkAbortSignal(event.signal, claimedWarmJob.controller);
|
|
504
|
+
let warmCompaction;
|
|
505
|
+
let warmFailure;
|
|
506
|
+
try {
|
|
507
|
+
warmCompaction = await claimedWarmJob.promise;
|
|
508
|
+
warmFailure = await claimedWarmJob.failure;
|
|
509
|
+
}
|
|
510
|
+
finally {
|
|
511
|
+
unlinkAbort();
|
|
512
|
+
}
|
|
513
|
+
if (warmFailure === undefined && warmCompaction && !event.signal.aborted) {
|
|
514
|
+
getLogger(ctx).debug("warm_consumed", { generation: claimedWarmJob.generation, route: "core-route" });
|
|
515
|
+
warmJobConsumed = true;
|
|
516
|
+
return { compaction: warmCompaction };
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
const snapshot = {
|
|
520
|
+
generation: ++speculativeGeneration,
|
|
521
|
+
expectedRevision: ctx.getMessageRevision(),
|
|
522
|
+
model,
|
|
523
|
+
contextWindow: ctx.getContextUsage()?.contextWindow ?? model.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
|
|
524
|
+
preparation: event.preparation,
|
|
525
|
+
branchEntries: event.branchEntries,
|
|
526
|
+
promptVariant: getPromptVariant(event),
|
|
527
|
+
origin: "core-route",
|
|
528
|
+
customInstructions: event.customInstructions,
|
|
529
|
+
systemPrompt: ctx.getSystemPrompt(),
|
|
530
|
+
tools: getSummarizationTools(),
|
|
531
|
+
};
|
|
532
|
+
let compaction;
|
|
533
|
+
try {
|
|
534
|
+
compaction = await runExtensionCompaction(ctx, snapshot, event.signal, (delta) => ctx.updateCompaction?.({ reason: event.reason, signal: event.signal, delta }));
|
|
535
|
+
}
|
|
536
|
+
catch (error) {
|
|
537
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
538
|
+
const failureKind = classifyRequiredCompactionFallbackFailure(error);
|
|
539
|
+
if (isRequiredCompactionFallbackReason(event.reason) &&
|
|
540
|
+
failureKind !== undefined &&
|
|
541
|
+
!event.signal.aborted) {
|
|
542
|
+
const fallback = createRequiredCompactionFallback(snapshot.preparation, snapshot.contextWindow, failureKind, { taskIntent: resolveInheritedTaskIntent(event.branchEntries) }, event.branchEntries);
|
|
543
|
+
if (fallback)
|
|
544
|
+
return { compaction: fallback };
|
|
545
|
+
pendingMetadata.delete(event.requestId);
|
|
546
|
+
return {
|
|
547
|
+
cancel: true,
|
|
548
|
+
reason: "deterministic compaction fallback cannot retain the prepared suffix",
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
pendingMetadata.delete(event.requestId);
|
|
552
|
+
if (error instanceof SummaryGenerationError) {
|
|
553
|
+
return { cancel: true, reason: error.message };
|
|
554
|
+
}
|
|
555
|
+
return { cancel: true, reason: `compaction generator failed: ${message}` };
|
|
556
|
+
}
|
|
557
|
+
if (!compaction) {
|
|
558
|
+
pendingMetadata.delete(event.requestId);
|
|
559
|
+
if (event.signal.aborted) {
|
|
560
|
+
return { cancel: true };
|
|
561
|
+
}
|
|
562
|
+
return { cancel: true, reason: "compaction generator returned no summary" };
|
|
563
|
+
}
|
|
564
|
+
return {
|
|
565
|
+
compaction,
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
finally {
|
|
569
|
+
if (!warmJobConsumed)
|
|
570
|
+
claimedWarmJob?.controller.abort();
|
|
428
571
|
}
|
|
429
|
-
return {
|
|
430
|
-
compaction,
|
|
431
|
-
};
|
|
432
572
|
});
|
|
433
573
|
pi.on("model_select", (event, ctx) => {
|
|
434
574
|
if (lanePolicy.disablesSenpiCompaction(ctx)) {
|
|
@@ -659,5 +799,15 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
659
799
|
pi.on("tool_call", (event) => {
|
|
660
800
|
restoration.trackToolCall(restorationState, event);
|
|
661
801
|
});
|
|
802
|
+
// The reload path retires this extension generation right after this event
|
|
803
|
+
// (`AgentSession.reload()` invalidates the old runner), so stand the idle
|
|
804
|
+
// warm-up watcher down here rather than leaving a timer armed against a
|
|
805
|
+
// context that is about to start throwing on every read.
|
|
806
|
+
pi.on("session_shutdown", () => {
|
|
807
|
+
cancelIdleWarmupRetry();
|
|
808
|
+
idleWarmupAttempt = 0;
|
|
809
|
+
speculativeJob?.controller.abort();
|
|
810
|
+
speculativeJob = undefined;
|
|
811
|
+
});
|
|
662
812
|
}
|
|
663
813
|
//# sourceMappingURL=index.js.map
|