@code-yeongyu/senpi 2026.8.30 → 2026.9.2
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 +174 -2
- package/README.md +3 -0
- package/dist/core/agent-session.d.ts +28 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +161 -14
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction-execution.d.ts +14 -0
- package/dist/core/compaction/compaction-execution.d.ts.map +1 -0
- package/dist/core/compaction/compaction-execution.js +121 -0
- package/dist/core/compaction/compaction-execution.js.map +1 -0
- package/dist/core/compaction/compaction-settings.d.ts +17 -0
- package/dist/core/compaction/compaction-settings.d.ts.map +1 -0
- package/dist/core/compaction/compaction-settings.js +17 -0
- package/dist/core/compaction/compaction-settings.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +13 -26
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +7 -136
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/ideal-compaction-settings.d.ts +9 -0
- package/dist/core/compaction/ideal-compaction-settings.d.ts.map +1 -0
- package/dist/core/compaction/ideal-compaction-settings.js +7 -0
- package/dist/core/compaction/ideal-compaction-settings.js.map +1 -0
- package/dist/core/compaction-settings-access.d.ts +19 -0
- package/dist/core/compaction-settings-access.d.ts.map +1 -0
- package/dist/core/compaction-settings-access.js +10 -0
- package/dist/core/compaction-settings-access.js.map +1 -0
- package/dist/core/compaction-settings-resolver.d.ts +22 -0
- package/dist/core/compaction-settings-resolver.d.ts.map +1 -0
- package/dist/core/compaction-settings-resolver.js +46 -0
- package/dist/core/compaction-settings-resolver.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts +9 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js +10 -3
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts +24 -0
- package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/context-pipeline.js +43 -0
- package/dist/core/extensions/builtin/compaction/context-pipeline.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +8 -2
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts +17 -0
- package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/emergency-prune.js +64 -0
- package/dist/core/extensions/builtin/compaction/emergency-prune.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts +27 -0
- package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/extension-wiring.js +84 -0
- package/dist/core/extensions/builtin/compaction/extension-wiring.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/idle-retry.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/idle-retry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/idle-retry.js +1 -1
- package/dist/core/extensions/builtin/compaction/idle-retry.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/idle.d.ts +1 -0
- package/dist/core/extensions/builtin/compaction/idle.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/idle.js +13 -2
- package/dist/core/extensions/builtin/compaction/idle.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +152 -154
- package/dist/core/extensions/builtin/compaction/index.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/model-selection.d.ts +14 -0
- package/dist/core/extensions/builtin/compaction/model-selection.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/model-selection.js +37 -0
- package/dist/core/extensions/builtin/compaction/model-selection.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts +30 -0
- package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/model-usability-budget.js +74 -0
- package/dist/core/extensions/builtin/compaction/model-usability-budget.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts +9 -0
- package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js +2 -0
- package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +3 -6
- package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/orchestration.d.ts +46 -0
- package/dist/core/extensions/builtin/compaction/orchestration.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/orchestration.js +103 -0
- package/dist/core/extensions/builtin/compaction/orchestration.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/policy.d.ts +12 -2
- package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/policy.js +52 -26
- package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts +8 -0
- package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculation-lead.js +17 -0
- package/dist/core/extensions/builtin/compaction/speculation-lead.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative-job.d.ts +22 -0
- package/dist/core/extensions/builtin/compaction/speculative-job.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative-job.js +16 -0
- package/dist/core/extensions/builtin/compaction/speculative-job.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts +23 -0
- package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative-summary.js +132 -0
- package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative.d.ts +8 -13
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +21 -197
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts +24 -0
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.js +25 -0
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/tool-admission.d.ts +27 -0
- package/dist/core/extensions/builtin/compaction/tool-admission.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/tool-admission.js +56 -0
- package/dist/core/extensions/builtin/compaction/tool-admission.js.map +1 -0
- package/dist/core/extensions/builtin/hooks/trust-state-json.d.ts +5 -0
- package/dist/core/extensions/builtin/hooks/trust-state-json.d.ts.map +1 -0
- package/dist/core/extensions/builtin/hooks/trust-state-json.js +76 -0
- package/dist/core/extensions/builtin/hooks/trust-state-json.js.map +1 -0
- package/dist/core/extensions/builtin/hooks/trust-storage.d.ts +7 -1
- package/dist/core/extensions/builtin/hooks/trust-storage.d.ts.map +1 -1
- package/dist/core/extensions/builtin/hooks/trust-storage.js +60 -8
- package/dist/core/extensions/builtin/hooks/trust-storage.js.map +1 -1
- package/dist/core/extensions/builtin/hooks/trust.d.ts +1 -2
- package/dist/core/extensions/builtin/hooks/trust.d.ts.map +1 -1
- package/dist/core/extensions/builtin/hooks/trust.js +1 -72
- package/dist/core/extensions/builtin/hooks/trust.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +108 -0
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js +11 -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 +1 -0
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/extensions/builtin/recommended-models/index.d.ts +1 -1
- package/dist/core/extensions/builtin/recommended-models/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/recommended-models/index.js +1 -1
- package/dist/core/extensions/builtin/recommended-models/index.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +11 -0
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.js +18 -2
- package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/index.js +4 -0
- package/dist/core/extensions/builtin/ttsr/index.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/manager.d.ts +2 -0
- package/dist/core/extensions/builtin/ttsr/manager.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/manager.js +28 -1
- package/dist/core/extensions/builtin/ttsr/manager.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +5 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +7 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts +14 -0
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +33 -3
- package/dist/core/retry-fallback/controller.js.map +1 -1
- package/dist/core/retry-fallback/log.js +1 -1
- package/dist/core/retry-fallback/log.js.map +1 -1
- package/dist/core/retry-fallback/settings.d.ts.map +1 -1
- package/dist/core/retry-fallback/settings.js +1 -0
- package/dist/core/retry-fallback/settings.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +5 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-activity.d.ts +47 -0
- package/dist/core/session-activity.d.ts.map +1 -0
- package/dist/core/session-activity.js +58 -0
- package/dist/core/session-activity.js.map +1 -0
- package/dist/core/session-manager.d.ts +8 -12
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +118 -7
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-resident-store.d.ts +8 -1
- package/dist/core/session-resident-store.d.ts.map +1 -1
- package/dist/core/session-resident-store.js +12 -5
- package/dist/core/session-resident-store.js.map +1 -1
- package/dist/core/settings-manager.d.ts +8 -85
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +9 -17
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-public-types.d.ts +11 -0
- package/dist/core/settings-public-types.d.ts.map +1 -0
- package/dist/core/settings-public-types.js +2 -0
- package/dist/core/settings-public-types.js.map +1 -0
- package/dist/core/settings-shapes.d.ts +36 -0
- package/dist/core/settings-shapes.d.ts.map +1 -0
- package/dist/core/settings-shapes.js +2 -0
- package/dist/core/settings-shapes.js.map +1 -0
- package/dist/core/shared-host-policy.d.ts +6 -0
- package/dist/core/shared-host-policy.d.ts.map +1 -0
- package/dist/core/shared-host-policy.js +7 -0
- package/dist/core/shared-host-policy.js.map +1 -0
- package/dist/core/terminal-settings.d.ts +22 -0
- package/dist/core/terminal-settings.d.ts.map +1 -0
- package/dist/core/terminal-settings.js +2 -0
- package/dist/core/terminal-settings.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +4 -4
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +27 -11
- package/dist/main.js.map +1 -1
- package/dist/modes/app-server/daemon/process.d.ts +13 -2
- package/dist/modes/app-server/daemon/process.d.ts.map +1 -1
- package/dist/modes/app-server/daemon/process.js +58 -12
- package/dist/modes/app-server/daemon/process.js.map +1 -1
- package/dist/modes/app-server/daemon.js +65 -7
- package/dist/modes/app-server/daemon.js.map +1 -1
- package/dist/modes/index.d.ts +1 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +1 -1
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts +84 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.js +435 -112
- package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +11 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +59 -6
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/ethos-tips.js +1 -1
- package/dist/modes/interactive/tips/catalog/ethos-tips.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts +12 -5
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +180 -25
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/custom-capability.d.ts +2 -0
- package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
- package/dist/modes/rpc/custom-capability.js +2 -0
- package/dist/modes/rpc/custom-capability.js.map +1 -1
- package/dist/modes/rpc/host-ensure.d.ts +17 -0
- package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
- package/dist/modes/rpc/host-ensure.js +150 -23
- package/dist/modes/rpc/host-ensure.js.map +1 -1
- package/dist/modes/rpc/host-lifecycle.d.ts +54 -0
- package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
- package/dist/modes/rpc/host-lifecycle.js +259 -69
- package/dist/modes/rpc/host-lifecycle.js.map +1 -1
- package/dist/modes/rpc/host-watchdog.d.ts +2 -2
- package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
- package/dist/modes/rpc/host-watchdog.js +89 -21
- package/dist/modes/rpc/host-watchdog.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.d.ts +38 -0
- package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +149 -61
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/ownership-safe-lock.d.ts +14 -0
- package/dist/modes/rpc/ownership-safe-lock.d.ts.map +1 -0
- package/dist/modes/rpc/ownership-safe-lock.js +87 -0
- package/dist/modes/rpc/ownership-safe-lock.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +13 -2
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +46 -12
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +21 -3
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js +1 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-binding.d.ts +2 -1
- package/dist/modes/rpc/session-binding.d.ts.map +1 -1
- package/dist/modes/rpc/session-binding.js +1 -0
- package/dist/modes/rpc/session-binding.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts +54 -1
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +180 -3
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-writer.d.ts +18 -0
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +88 -8
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/modes/rpc/session-registry.d.ts +11 -1
- package/dist/modes/rpc/session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.js +25 -0
- package/dist/modes/rpc/session-registry.js.map +1 -1
- package/dist/modes/rpc/socket-transport.d.ts +13 -0
- package/dist/modes/rpc/socket-transport.d.ts.map +1 -0
- package/dist/modes/rpc/socket-transport.js +92 -0
- package/dist/modes/rpc/socket-transport.js.map +1 -0
- package/dist/modes/rpc/widget-line-renderer.d.ts +17 -0
- package/dist/modes/rpc/widget-line-renderer.d.ts.map +1 -0
- package/dist/modes/rpc/widget-line-renderer.js +73 -0
- package/dist/modes/rpc/widget-line-renderer.js.map +1 -0
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js +11 -2
- package/dist/utils/fs-watch.js.map +1 -1
- package/docs/app-server.md +2 -2
- package/docs/containerization.md +2 -2
- package/docs/development.md +7 -7
- package/docs/extensions.md +5 -5
- package/docs/grok-neo.md +1 -1
- package/docs/index.md +1 -1
- package/docs/packages.md +2 -2
- package/docs/quickstart.md +4 -4
- package/docs/release-guide.md +21 -21
- package/docs/rpc.md +83 -6
- package/docs/sdk.md +1 -1
- package/docs/settings.md +4 -4
- package/docs/skills.md +2 -2
- package/docs/terminal-tools.md +1 -1
- package/docs/termux.md +1 -1
- package/docs/tui.md +1 -1
- package/examples/AGENTS.md +1 -1
- package/examples/sdk/README.md +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +52 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +2 -2
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/skill-contribution.ts +71 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +3 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/SKILL.md +44 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/breaking-changes.md +75 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/build.md +114 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/dev-tooling.md +34 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/http-networking.md +113 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/install.md +93 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/node-compat-platforms.md +36 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/performance.md +33 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/runtime-apis.md +156 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/security.md +52 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/test.md +103 -0
- package/node_modules/@earendil-works/pi-agent-core/README.md +3 -0
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/README.md +6 -3
- 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 +24 -7
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +7 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +316 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js +23 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts +24 -0
- 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 +20 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.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/google.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/groq.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/opengateway.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/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/dist/screen-operations.d.ts +42 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-operations.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-operations.js +34 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-operations.js.map +1 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-text.d.ts +8 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-text.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-text.js +51 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-text.js.map +1 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts +45 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/screen.js +178 -55
- package/node_modules/@earendil-works/pi-pty/dist/screen.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/README.md +6 -3
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/README.md +5 -4
- package/node_modules/@earendil-works/pi-tui/native/darwin/README.md +2 -2
- package/node_modules/@earendil-works/pi-tui/native/win32/README.md +2 -2
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-wiring.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/extension-wiring.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { ContextUsage, ExtensionContext, MessageEndEvent, SessionBeforeCompactEvent } from \"../../types.ts\";\nimport * as checkpointState from \"./checkpoint-state.ts\";\nimport type { SpeculativeCompactionResult, SpeculativeCompactionSnapshot } from \"./speculative.ts\";\n\nconst IMAGE_PROMPT_TOKEN_ESTIMATE = 1_200;\nconst MAX_OUTPUT_RESERVE_RATIO = 0.5;\n\nfunction approxTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\nexport function estimatePendingPromptTokens(event: { prompt?: string; images?: readonly unknown[] }): number {\n\treturn approxTokens(event.prompt ?? \"\") + (event.images?.length ?? 0) * IMAGE_PROMPT_TOKEN_ESTIMATE;\n}\n\nexport function getPromptContextWindow(contextWindow: number, maxTokens: number | undefined): number {\n\tif (typeof maxTokens !== \"number\" || !Number.isFinite(maxTokens) || maxTokens <= 0 || contextWindow <= 0) {\n\t\treturn contextWindow;\n\t}\n\tconst outputReserve = Math.min(maxTokens, Math.floor(contextWindow * MAX_OUTPUT_RESERVE_RATIO));\n\treturn contextWindow - outputReserve;\n}\n\nexport function withAdditionalTokens(usage: ContextUsage, additionalTokens: number): ContextUsage {\n\tif (usage.tokens === null || additionalTokens <= 0) return usage;\n\tconst tokens = usage.tokens + additionalTokens;\n\treturn {\n\t\t...usage,\n\t\ttokens,\n\t\tpercent: usage.contextWindow > 0 ? (tokens / usage.contextWindow) * 100 : usage.percent,\n\t};\n}\n\nexport function isMonitorableMessageEvent(event: MessageEndEvent): event is MessageEndEvent & {\n\tmessage: AgentMessage & { content: Array<{ type: string; text?: string }> };\n} {\n\treturn \"content\" in event.message && Array.isArray(event.message.content);\n}\n\nexport function isAbortedAssistantMessage(event: { message: AgentMessage }): boolean {\n\treturn event.message.role === \"assistant\" && \"stopReason\" in event.message && event.message.stopReason === \"aborted\";\n}\n\nexport function isRequiredCompactionFallbackReason(reason: SessionBeforeCompactEvent[\"reason\"]): boolean {\n\treturn reason === \"threshold\" || reason === \"overflow\";\n}\n\nexport function recentCheckpoint(ctx: ExtensionContext): checkpointState.AgentCheckpoint | null {\n\tconst checkpoint = checkpointState.getLatestCheckpoint(ctx);\n\tif (!checkpoint?.timestamp) return null;\n\treturn Date.now() - checkpoint.timestamp <= 60_000 ? checkpoint : null;\n}\n\nfunction shouldEndFeedback(result: SpeculativeCompactionResult): boolean {\n\treturn !result.applied && result.reason !== \"rejected\";\n}\n\nexport function endCompactionFeedback(\n\tctx: ExtensionContext,\n\tsignal: AbortSignal | undefined,\n\tresult: SpeculativeCompactionResult,\n\tremoteFallbackReason?: string,\n): void {\n\tif (shouldEndFeedback(result)) {\n\t\t// Surface the concrete failure instead of the generic \"Compaction did not\n\t\t// apply\": the remote stage's reason (e.g. remote-compaction-timeout) and the\n\t\t// terminal local reason (unavailable / stale), so the decision log and TUI\n\t\t// show what actually happened. An aborted compaction renders \"Compaction\n\t\t// cancelled\" downstream and must not carry a failure message.\n\t\tconst localReason = result.applied ? undefined : result.reason;\n\t\tconst parts = [remoteFallbackReason, localReason].filter((part): part is string => Boolean(part));\n\t\tconst errorMessage =\n\t\t\tsignal?.aborted || parts.length === 0\n\t\t\t\t? undefined\n\t\t\t\t: `Compaction did not apply: ${parts.join(\"; local fallback \")}`;\n\t\tctx.endCompaction?.({ reason: \"extension\", signal, aborted: signal?.aborted, errorMessage });\n\t}\n}\n\nexport function linkAbortSignal(source: AbortSignal | undefined, target: AbortController): () => void {\n\tif (!source) return () => {};\n\tif (source.aborted) {\n\t\ttarget.abort();\n\t\treturn () => {};\n\t}\n\tconst abort = () => target.abort();\n\tsource.addEventListener(\"abort\", abort, { once: true });\n\treturn () => source.removeEventListener(\"abort\", abort);\n}\n\nexport function createBlockingRemoteCompactionEvent(\n\tctx: ExtensionContext,\n\tsnapshot: SpeculativeCompactionSnapshot,\n\tcustomInstructions: string,\n\tsignal: AbortSignal,\n): SessionBeforeCompactEvent {\n\treturn {\n\t\ttype: \"session_before_compact\",\n\t\treason: \"extension\",\n\t\twillRetry: false,\n\t\trequestId: randomUUID(),\n\t\tpreparation: snapshot.preparation,\n\t\tbranchEntries: ctx.sessionManager.getBranch(),\n\t\tcustomInstructions,\n\t\tsignal,\n\t};\n}\n"]}
|
|
@@ -15,7 +15,7 @@ export interface IdleWarmupRetryDecision {
|
|
|
15
15
|
readonly transient: boolean;
|
|
16
16
|
readonly isIdle: boolean;
|
|
17
17
|
readonly breakerTripped: boolean;
|
|
18
|
-
readonly
|
|
18
|
+
readonly stillWarmEligible: boolean;
|
|
19
19
|
}
|
|
20
20
|
export declare function shouldRetryIdleWarmup(decision: IdleWarmupRetryDecision): boolean;
|
|
21
21
|
//# sourceMappingURL=idle-retry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idle-retry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"idle-retry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACpC;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAMhF"}
|
|
@@ -17,7 +17,7 @@ export function shouldRetryIdleWarmup(decision) {
|
|
|
17
17
|
return false;
|
|
18
18
|
if (decision.breakerTripped)
|
|
19
19
|
return false;
|
|
20
|
-
if (!decision.
|
|
20
|
+
if (!decision.stillWarmEligible)
|
|
21
21
|
return false;
|
|
22
22
|
return decision.attempt < MAX_IDLE_WARMUP_RETRIES;
|
|
23
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idle-retry.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAUjD,MAAM,UAAU,qBAAqB,CAAC,QAAiC;IACtE,IAAI,CAAC,QAAQ,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,QAAQ,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"idle-retry.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAUjD,MAAM,UAAU,qBAAqB,CAAC,QAAiC;IACtE,IAAI,CAAC,QAAQ,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,QAAQ,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,QAAQ,CAAC,OAAO,GAAG,uBAAuB,CAAC;AACnD,CAAC","sourcesContent":["/**\n * Retry policy for the idle compaction warm-up.\n *\n * The `agent_end` idle trigger only warms a speculative summary (#561 forbids\n * committing a durable boundary at idle). A transient summarization failure\n * used to leave a dead warm job for the whole idle period, forcing a fresh\n * blocking summarization onto the user's critical path at the next prompt.\n * While the session stays idle, a transient failure is retried a bounded\n * number of times with a fresh snapshot instead.\n */\n\nexport const MAX_IDLE_WARMUP_RETRIES = 2;\nexport const IDLE_WARMUP_RETRY_DELAY_MS = 15_000;\n\nexport interface IdleWarmupRetryDecision {\n\treadonly attempt: number;\n\treadonly transient: boolean;\n\treadonly isIdle: boolean;\n\treadonly breakerTripped: boolean;\n\treadonly stillWarmEligible: boolean;\n}\n\nexport function shouldRetryIdleWarmup(decision: IdleWarmupRetryDecision): boolean {\n\tif (!decision.transient) return false;\n\tif (!decision.isIdle) return false;\n\tif (decision.breakerTripped) return false;\n\tif (!decision.stillWarmEligible) return false;\n\treturn decision.attempt < MAX_IDLE_WARMUP_RETRIES;\n}\n"]}
|
|
@@ -13,4 +13,5 @@ export interface IdleCompactionDecision {
|
|
|
13
13
|
mode: ExtensionMode;
|
|
14
14
|
}
|
|
15
15
|
export declare function shouldRunIdleCompaction(decision: IdleCompactionDecision): boolean;
|
|
16
|
+
export declare function shouldWarmAtIdle(decision: IdleCompactionDecision): boolean;
|
|
16
17
|
//# sourceMappingURL=idle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idle.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,KAAK,eAAe,EAA2B,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"idle.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,KAAK,eAAe,EAA2B,MAAM,aAAa,CAAC;AAG5E,eAAO,MAAM,4BAA4B,2FACgD,CAAC;AAI1F,MAAM,WAAW,sBAAsB;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,YAAY,GAAG,SAAS,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,IAAI,EAAE,aAAa,CAAC;CACpB;AAaD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAGjF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAG1E"}
|
|
@@ -1,21 +1,32 @@
|
|
|
1
1
|
import { shouldTriggerCompaction } from "./policy.js";
|
|
2
|
+
import { WARM_GENERATION_FLOOR_RATIO } from "./speculation-lead.js";
|
|
2
3
|
export const IDLE_COMPACTION_INSTRUCTIONS = "Proactively compact at idle before the next agent turn, while the user is not waiting.";
|
|
3
4
|
const PERSISTENT_MODES = new Set(["tui", "rpc", "app-server"]);
|
|
4
|
-
|
|
5
|
+
function isIdleEligible(decision) {
|
|
5
6
|
if (decision.willRetry)
|
|
6
7
|
return false;
|
|
7
8
|
if (decision.aborted)
|
|
8
9
|
return false;
|
|
9
10
|
if (!PERSISTENT_MODES.has(decision.mode))
|
|
10
11
|
return false;
|
|
12
|
+
if (!decision.settings.enabled)
|
|
13
|
+
return false;
|
|
11
14
|
if (decision.settings.idleCompactionEnabled === false)
|
|
12
15
|
return false;
|
|
13
16
|
if (decision.breakerTripped)
|
|
14
17
|
return false;
|
|
15
18
|
if (!decision.usage)
|
|
16
19
|
return false;
|
|
17
|
-
|
|
20
|
+
return decision.usage.tokens !== null;
|
|
21
|
+
}
|
|
22
|
+
export function shouldRunIdleCompaction(decision) {
|
|
23
|
+
if (!isIdleEligible(decision) || !decision.usage)
|
|
18
24
|
return false;
|
|
19
25
|
return shouldTriggerCompaction(decision.usage, decision.contextWindow, decision.settings, decision.lastYield);
|
|
20
26
|
}
|
|
27
|
+
export function shouldWarmAtIdle(decision) {
|
|
28
|
+
if (!isIdleEligible(decision) || !decision.usage || decision.usage.tokens === null)
|
|
29
|
+
return false;
|
|
30
|
+
return decision.usage.tokens >= decision.contextWindow * WARM_GENERATION_FLOOR_RATIO;
|
|
31
|
+
}
|
|
21
32
|
//# sourceMappingURL=idle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idle.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"idle.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,CAAC,MAAM,4BAA4B,GACxC,wFAAwF,CAAC;AAE1F,MAAM,gBAAgB,GAA+B,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;AAa3F,SAAS,cAAc,CAAC,QAAgC;IACvD,IAAI,QAAQ,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,QAAQ,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,QAAQ,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAgC;IACvE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAC/D,OAAO,uBAAuB,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC/G,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgC;IAChE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACjG,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC,aAAa,GAAG,2BAA2B,CAAC;AACtF,CAAC","sourcesContent":["import type { CompactionSettings } from \"../../../compaction/index.ts\";\nimport type { ContextUsage, ExtensionMode } from \"../../types.ts\";\nimport { type CompactionYield, shouldTriggerCompaction } from \"./policy.ts\";\nimport { WARM_GENERATION_FLOOR_RATIO } from \"./speculation-lead.ts\";\n\nexport const IDLE_COMPACTION_INSTRUCTIONS =\n\t\"Proactively compact at idle before the next agent turn, while the user is not waiting.\";\n\nconst PERSISTENT_MODES: ReadonlySet<ExtensionMode> = new Set([\"tui\", \"rpc\", \"app-server\"]);\n\nexport interface IdleCompactionDecision {\n\twillRetry: boolean;\n\taborted: boolean;\n\tsettings: CompactionSettings;\n\tusage: ContextUsage | undefined;\n\tcontextWindow: number;\n\tbreakerTripped: boolean;\n\tlastYield?: CompactionYield;\n\tmode: ExtensionMode;\n}\n\nfunction isIdleEligible(decision: IdleCompactionDecision): boolean {\n\tif (decision.willRetry) return false;\n\tif (decision.aborted) return false;\n\tif (!PERSISTENT_MODES.has(decision.mode)) return false;\n\tif (!decision.settings.enabled) return false;\n\tif (decision.settings.idleCompactionEnabled === false) return false;\n\tif (decision.breakerTripped) return false;\n\tif (!decision.usage) return false;\n\treturn decision.usage.tokens !== null;\n}\n\nexport function shouldRunIdleCompaction(decision: IdleCompactionDecision): boolean {\n\tif (!isIdleEligible(decision) || !decision.usage) return false;\n\treturn shouldTriggerCompaction(decision.usage, decision.contextWindow, decision.settings, decision.lastYield);\n}\n\nexport function shouldWarmAtIdle(decision: IdleCompactionDecision): boolean {\n\tif (!isIdleEligible(decision) || !decision.usage || decision.usage.tokens === null) return false;\n\treturn decision.usage.tokens >= decision.contextWindow * WARM_GENERATION_FLOOR_RATIO;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ExtensionAPI } from "../../types.ts";
|
|
2
2
|
import { type OpenAiRemoteCompactionDependencies } from "./openai-remote.ts";
|
|
3
|
-
export
|
|
3
|
+
export { getPromptContextWindow } from "./extension-wiring.ts";
|
|
4
4
|
export default function compactionExtension(pi: ExtensionAPI, remoteCompactionDependencies?: OpenAiRemoteCompactionDependencies): void;
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAoE,MAAM,gBAAgB,CAAC;AAyBrH,OAAO,EACN,KAAK,kCAAkC,EAIvC,MAAM,oBAAoB,CAAC;AAqC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AA2B/D,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAC1C,EAAE,EAAE,YAAY,EAChB,4BAA4B,GAAE,kCAAuC,GACnE,IAAI,CAo6BN"}
|
|
@@ -1,112 +1,34 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
1
|
import { createWarmAnchorSnapshot, isWarmSummaryAnchorValid } from "../../../compaction/warm-anchor.js";
|
|
3
|
-
import { convertToLlm } from "../../../messages.js";
|
|
4
2
|
import * as checkpointState from "./checkpoint-state.js";
|
|
5
3
|
import * as breaker from "./circuit-breaker.js";
|
|
6
|
-
import {
|
|
4
|
+
import { buildCompactionContext } from "./context-pipeline.js";
|
|
7
5
|
import { createDegradationMonitorState, handleMessageEnd, handleTurnEnd, RECOVERY_INSTRUCTIONS, resetOnSessionCompact, } from "./degradation-monitor.js";
|
|
8
6
|
import { classifyRequiredCompactionFallbackFailure, createRequiredCompactionFallback, } from "./deterministic-fallback.js";
|
|
9
7
|
import * as idle from "./idle.js";
|
|
10
8
|
import * as idleRetry from "./idle-retry.js";
|
|
11
9
|
import { CLAUDE_SDK_OAUTH_COMPACT_ENTRY_TYPE, collectCompactBoundaryEntries, createCompactionLanePolicy, SDK_NATIVE_LANE_REJECTION_REASON, } from "./lane-policy.js";
|
|
12
10
|
import { createCompactionLogger } from "./log.js";
|
|
13
|
-
import {
|
|
11
|
+
import { handleCompactionModelSelect } from "./model-selection.js";
|
|
12
|
+
import { rewriteOpenAiPayloadWithRemoteCompaction, runOpenAiRemoteCompaction, SENPI_COMPACTION_EVENT, } from "./openai-remote.js";
|
|
14
13
|
import { createOpenAiRemoteCompactionHeaders, isOpenAiRemoteCompactionModel, openAiRemoteCompactionOrigin, } from "./openai-remote-model.js";
|
|
14
|
+
import { resolveBeforeAgentStartMessage, resolveCompactionGeometry, resolveIdleWarmAction, resolveReminderSystemPrompt, shouldDeferGraceBand, } from "./orchestration.js";
|
|
15
15
|
import * as cap from "./per-turn-cap.js";
|
|
16
16
|
import * as policy from "./policy.js";
|
|
17
|
-
import { repairOrphanedToolResults } from "./repair-tool-pairs.js";
|
|
18
17
|
import * as restoration from "./restoration-tracker.js";
|
|
19
|
-
import { applyGeneratedCompaction, createEmergencyPruneLatch, createSpeculativeCompactionSnapshot, getPromptVariant,
|
|
18
|
+
import { applyGeneratedCompaction, createEmergencyPruneLatch, createSpeculativeCompactionSnapshot, getPromptVariant, runExtensionCompaction, SummaryGenerationError, } from "./speculative.js";
|
|
19
|
+
import { trackSpeculativeJob } from "./speculative-job.js";
|
|
20
20
|
import { createInitialState, resetTurnCounter } from "./state.js";
|
|
21
21
|
import { resolveInheritedTaskIntent } from "./task-intent.js";
|
|
22
22
|
import * as todoBridge from "./todo-bridge.js";
|
|
23
|
+
import { computeTokenBudgetReminder, createInitialReminderState, } from "./token-budget-reminder.js";
|
|
23
24
|
import { isTransientSummarizationFailure } from "./transient-failure.js";
|
|
25
|
+
export { getPromptContextWindow } from "./extension-wiring.js";
|
|
26
|
+
import { createBlockingRemoteCompactionEvent, endCompactionFeedback, estimatePendingPromptTokens, getPromptContextWindow, isAbortedAssistantMessage, isMonitorableMessageEvent, isRequiredCompactionFallbackReason, linkAbortSignal, recentCheckpoint, withAdditionalTokens, } from "./extension-wiring.js";
|
|
24
27
|
import { isIneffectiveCompaction } from "./yield.js";
|
|
25
28
|
const DEFAULT_CONTEXT_WINDOW = 200_000;
|
|
26
29
|
const EMERGENCY_COMPACTION_INSTRUCTIONS = "EMERGENCY: hard context limit reached. Produce an aggressive recovery summary that preserves current goal, constraints, files touched, tool outcomes, and exact next steps. Prefer concise factual state over transcript detail.";
|
|
27
30
|
const PROACTIVE_COMPACTION_INSTRUCTIONS = "Proactively compact before the next agent turn.";
|
|
28
31
|
const MAX_PENDING_METADATA = 8;
|
|
29
|
-
const IMAGE_PROMPT_TOKEN_ESTIMATE = 1_200;
|
|
30
|
-
const MAX_OUTPUT_RESERVE_RATIO = 0.5;
|
|
31
|
-
function approxTokens(text) {
|
|
32
|
-
return Math.ceil(text.length / 4);
|
|
33
|
-
}
|
|
34
|
-
function estimatePendingPromptTokens(event) {
|
|
35
|
-
return approxTokens(event.prompt ?? "") + (event.images?.length ?? 0) * IMAGE_PROMPT_TOKEN_ESTIMATE;
|
|
36
|
-
}
|
|
37
|
-
export function getPromptContextWindow(contextWindow, maxTokens) {
|
|
38
|
-
if (typeof maxTokens !== "number" || !Number.isFinite(maxTokens) || maxTokens <= 0 || contextWindow <= 0) {
|
|
39
|
-
return contextWindow;
|
|
40
|
-
}
|
|
41
|
-
const outputReserve = Math.min(maxTokens, Math.floor(contextWindow * MAX_OUTPUT_RESERVE_RATIO));
|
|
42
|
-
return contextWindow - outputReserve;
|
|
43
|
-
}
|
|
44
|
-
function withAdditionalTokens(usage, additionalTokens) {
|
|
45
|
-
if (usage.tokens === null || additionalTokens <= 0)
|
|
46
|
-
return usage;
|
|
47
|
-
const tokens = usage.tokens + additionalTokens;
|
|
48
|
-
return {
|
|
49
|
-
...usage,
|
|
50
|
-
tokens,
|
|
51
|
-
percent: usage.contextWindow > 0 ? (tokens / usage.contextWindow) * 100 : usage.percent,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
function isMonitorableMessageEvent(event) {
|
|
55
|
-
return "content" in event.message && Array.isArray(event.message.content);
|
|
56
|
-
}
|
|
57
|
-
function isAbortedAssistantMessage(event) {
|
|
58
|
-
return event.message.role === "assistant" && "stopReason" in event.message && event.message.stopReason === "aborted";
|
|
59
|
-
}
|
|
60
|
-
function isRequiredCompactionFallbackReason(reason) {
|
|
61
|
-
return reason === "threshold" || reason === "overflow";
|
|
62
|
-
}
|
|
63
|
-
function recentCheckpoint(ctx) {
|
|
64
|
-
const checkpoint = checkpointState.getLatestCheckpoint(ctx);
|
|
65
|
-
if (!checkpoint?.timestamp)
|
|
66
|
-
return null;
|
|
67
|
-
return Date.now() - checkpoint.timestamp <= 60_000 ? checkpoint : null;
|
|
68
|
-
}
|
|
69
|
-
function shouldEndFeedback(result) {
|
|
70
|
-
return !result.applied && result.reason !== "rejected";
|
|
71
|
-
}
|
|
72
|
-
function endCompactionFeedback(ctx, signal, result, remoteFallbackReason) {
|
|
73
|
-
if (shouldEndFeedback(result)) {
|
|
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 });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
function linkAbortSignal(source, target) {
|
|
88
|
-
if (!source)
|
|
89
|
-
return () => { };
|
|
90
|
-
if (source.aborted) {
|
|
91
|
-
target.abort();
|
|
92
|
-
return () => { };
|
|
93
|
-
}
|
|
94
|
-
const abort = () => target.abort();
|
|
95
|
-
source.addEventListener("abort", abort, { once: true });
|
|
96
|
-
return () => source.removeEventListener("abort", abort);
|
|
97
|
-
}
|
|
98
|
-
function createBlockingRemoteCompactionEvent(ctx, snapshot, customInstructions, signal) {
|
|
99
|
-
return {
|
|
100
|
-
type: "session_before_compact",
|
|
101
|
-
reason: "extension",
|
|
102
|
-
willRetry: false,
|
|
103
|
-
requestId: randomUUID(),
|
|
104
|
-
preparation: snapshot.preparation,
|
|
105
|
-
branchEntries: ctx.sessionManager.getBranch(),
|
|
106
|
-
customInstructions,
|
|
107
|
-
signal,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
32
|
export default function compactionExtension(pi, remoteCompactionDependencies = {}) {
|
|
111
33
|
let state = createInitialState();
|
|
112
34
|
const lanePolicy = createCompactionLanePolicy();
|
|
@@ -116,6 +38,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
116
38
|
const restorationState = state.restoration ?? restoration.createRestorationTrackerState();
|
|
117
39
|
state = { ...state, restoration: restorationState };
|
|
118
40
|
let speculativeGeneration = 0;
|
|
41
|
+
let reminderState = createInitialReminderState();
|
|
119
42
|
let speculativeJob;
|
|
120
43
|
const pendingMetadata = new Map();
|
|
121
44
|
let logger;
|
|
@@ -188,13 +111,23 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
188
111
|
}
|
|
189
112
|
const usage = ctx.getContextUsage();
|
|
190
113
|
const contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;
|
|
114
|
+
const settings = ctx.getCompactionSettings();
|
|
115
|
+
const breakerTripped = breaker.isTripped(state, Date.now());
|
|
191
116
|
const retryDecision = {
|
|
192
117
|
attempt: idleWarmupAttempt,
|
|
193
118
|
transient: isTransientSummarizationFailure(failure, failure.message),
|
|
194
119
|
isIdle: ctx.isIdle(),
|
|
195
|
-
breakerTripped
|
|
196
|
-
|
|
197
|
-
|
|
120
|
+
breakerTripped,
|
|
121
|
+
stillWarmEligible: idle.shouldWarmAtIdle({
|
|
122
|
+
willRetry: false,
|
|
123
|
+
aborted: false,
|
|
124
|
+
settings,
|
|
125
|
+
usage,
|
|
126
|
+
contextWindow,
|
|
127
|
+
breakerTripped,
|
|
128
|
+
lastYield: state.lastYield ?? undefined,
|
|
129
|
+
mode: ctx.mode,
|
|
130
|
+
}),
|
|
198
131
|
};
|
|
199
132
|
if (!idleRetry.shouldRetryIdleWarmup(retryDecision))
|
|
200
133
|
return;
|
|
@@ -333,9 +266,14 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
333
266
|
getLogger(ctx).debug("speculative_started", { generation, origin: "speculative" });
|
|
334
267
|
const controller = new AbortController();
|
|
335
268
|
const settled = runExtensionCompaction(ctx, snapshot, controller.signal).then((result) => ({ result, error: undefined }), (error) => ({ result: undefined, error: error instanceof Error ? error : new Error(String(error)) }));
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
269
|
+
speculativeJob = trackSpeculativeJob({
|
|
270
|
+
generation,
|
|
271
|
+
snapshot,
|
|
272
|
+
controller,
|
|
273
|
+
settled,
|
|
274
|
+
armedAtTokens: ctx.getContextUsage()?.tokens ?? 0,
|
|
275
|
+
});
|
|
276
|
+
void settled.then(() => remoteCompactionDependencies.onSpeculativeJobSettled?.());
|
|
339
277
|
}
|
|
340
278
|
function capturePendingMetadata(requestId, ctx) {
|
|
341
279
|
pendingMetadata.set(requestId, {
|
|
@@ -638,37 +576,16 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
638
576
|
claimedWarmJob?.controller.abort();
|
|
639
577
|
}
|
|
640
578
|
});
|
|
641
|
-
pi.on("model_select", (event, ctx) => {
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
jobModel.provider === selectedModel.provider &&
|
|
652
|
-
jobModel.id === selectedModel.id &&
|
|
653
|
-
jobModel.baseUrl === selectedModel.baseUrl &&
|
|
654
|
-
jobModel.contextWindow === selectedModel.contextWindow;
|
|
655
|
-
if (!alreadySpeculatingForSelectedModel) {
|
|
656
|
-
invalidateSpeculativeCompaction(ctx);
|
|
657
|
-
}
|
|
658
|
-
const previousWindow = event.previousModel?.contextWindow ?? 0;
|
|
659
|
-
const contextWindow = ctx.model?.contextWindow ?? 0;
|
|
660
|
-
if (previousWindow <= contextWindow)
|
|
661
|
-
return;
|
|
662
|
-
const usage = ctx.getContextUsage();
|
|
663
|
-
if (!usage)
|
|
664
|
-
return;
|
|
665
|
-
if (breaker.isTripped(state, Date.now()))
|
|
666
|
-
return;
|
|
667
|
-
const settings = ctx.getCompactionSettings();
|
|
668
|
-
if (policy.shouldStartSpeculativeCompaction(usage, contextWindow, settings, state.lastYield ?? undefined)) {
|
|
669
|
-
startSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);
|
|
670
|
-
}
|
|
671
|
-
});
|
|
579
|
+
pi.on("model_select", (event, ctx) => handleCompactionModelSelect({
|
|
580
|
+
event,
|
|
581
|
+
ctx,
|
|
582
|
+
state,
|
|
583
|
+
speculativeSnapshot: speculativeJob?.snapshot,
|
|
584
|
+
laneOwnsCompaction: lanePolicy.disablesSenpiCompaction(ctx),
|
|
585
|
+
breakerTripped: breaker.isTripped(state, Date.now()),
|
|
586
|
+
invalidate: () => invalidateSpeculativeCompaction(ctx),
|
|
587
|
+
start: () => startSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS),
|
|
588
|
+
}));
|
|
672
589
|
pi.on("session_compact", async (event, ctx) => {
|
|
673
590
|
const compactEvent = event;
|
|
674
591
|
invalidateSpeculativeCompaction(ctx);
|
|
@@ -679,6 +596,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
679
596
|
const keptEntries = firstKeptIndex === -1 ? [] : branchEntries.slice(firstKeptIndex);
|
|
680
597
|
state = cap.incrementAccepted(state);
|
|
681
598
|
state = breaker.recordSuccess(state);
|
|
599
|
+
reminderState = createInitialReminderState();
|
|
682
600
|
const details = compactEvent.compactionEntry.details;
|
|
683
601
|
const sy = details?.structuralYield;
|
|
684
602
|
if (sy && typeof sy.savedTokens === "number" && typeof sy.savingsRatio === "number") {
|
|
@@ -710,7 +628,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
710
628
|
compactionEntryId: compactEvent.compactionEntry.id,
|
|
711
629
|
contextWindow: usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
|
|
712
630
|
usageTokens: usage?.tokens ?? null,
|
|
713
|
-
reserveTokens:
|
|
631
|
+
reserveTokens: policy.resolveEffectiveReserveTokens(usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW, settings),
|
|
714
632
|
settings,
|
|
715
633
|
keptMessages: keptEntries.flatMap((entry) => {
|
|
716
634
|
if (entry.type !== "message")
|
|
@@ -721,7 +639,11 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
721
639
|
}
|
|
722
640
|
return;
|
|
723
641
|
}
|
|
724
|
-
|
|
642
|
+
if (compactEvent.rejectionCause === "external-owner")
|
|
643
|
+
return;
|
|
644
|
+
if (!lanePolicy.disablesSenpiCompaction(ctx)) {
|
|
645
|
+
state = breaker.recordFailure(state, Date.now(), { route: compactEvent.reason });
|
|
646
|
+
}
|
|
725
647
|
});
|
|
726
648
|
pi.on("before_agent_start", async (event, ctx) => {
|
|
727
649
|
sessionIdleSinceAgentEnd = false;
|
|
@@ -736,9 +658,14 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
736
658
|
// the circuit breaker never blocks that valve for senpi-owned lanes.
|
|
737
659
|
const laneOwnsCompaction = lanePolicy.disablesSenpiCompaction(ctx);
|
|
738
660
|
const breakerCoolingDown = breaker.isTripped(state, Date.now()) || laneOwnsCompaction;
|
|
661
|
+
const { reserveTokens, thresholdTokens, leadTokens } = resolveCompactionGeometry({
|
|
662
|
+
contextWindow,
|
|
663
|
+
settings,
|
|
664
|
+
lastYield: state.lastYield ?? undefined,
|
|
665
|
+
});
|
|
739
666
|
if (!laneOwnsCompaction &&
|
|
740
667
|
usage &&
|
|
741
|
-
policy.isAtHardLimit(usage, contextWindow,
|
|
668
|
+
policy.isAtHardLimit(usage, contextWindow, reserveTokens, pendingPromptTokens)) {
|
|
742
669
|
getLogger(ctx).debug("hard_limit_trigger", {
|
|
743
670
|
contextWindow,
|
|
744
671
|
tokens: usage.tokens ?? 0,
|
|
@@ -754,42 +681,84 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
754
681
|
tokens: usageWithPendingPrompt.tokens ?? 0,
|
|
755
682
|
threshold: settings.reserveTokens,
|
|
756
683
|
});
|
|
757
|
-
|
|
684
|
+
if (!shouldDeferGraceBand({
|
|
685
|
+
tokens: usageWithPendingPrompt.tokens ?? 0,
|
|
686
|
+
thresholdTokens,
|
|
687
|
+
leadTokens,
|
|
688
|
+
contextWindow,
|
|
689
|
+
reserveTokens,
|
|
690
|
+
compactionInFlight: speculativeJob !== undefined && !speculativeJob.completed,
|
|
691
|
+
graceBandEnabled: settings.graceBandEnabled,
|
|
692
|
+
})) {
|
|
693
|
+
await applyBlockingCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);
|
|
694
|
+
}
|
|
695
|
+
else {
|
|
696
|
+
getLogger(ctx).debug("grace_deferred", {
|
|
697
|
+
tokens: usageWithPendingPrompt.tokens ?? 0,
|
|
698
|
+
threshold: thresholdTokens,
|
|
699
|
+
});
|
|
700
|
+
}
|
|
758
701
|
}
|
|
759
702
|
else if (!breakerCoolingDown &&
|
|
703
|
+
!isOpenAiRemoteCompactionModel(ctx.model) &&
|
|
760
704
|
usageWithPendingPrompt &&
|
|
761
|
-
policy.shouldStartSpeculativeCompaction(usageWithPendingPrompt, contextWindow, settings, state.lastYield ?? undefined)) {
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
});
|
|
705
|
+
policy.shouldStartSpeculativeCompaction(usageWithPendingPrompt, contextWindow, settings, state.lastYield ?? undefined, leadTokens)) {
|
|
706
|
+
// The speculative start below logs "speculative_started" itself; logging
|
|
707
|
+
// "emergency_prune" here mislabeled proactive speculation as pruning and
|
|
708
|
+
// corrupted the counter the incident analysis relies on.
|
|
766
709
|
startSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);
|
|
767
710
|
}
|
|
768
|
-
|
|
711
|
+
const reminder = computeTokenBudgetReminder({
|
|
712
|
+
contextTokens: usageWithPendingPrompt?.tokens ?? 0,
|
|
713
|
+
contextWindow,
|
|
714
|
+
thresholdTokens,
|
|
715
|
+
leadTokens,
|
|
716
|
+
compactionEpoch: speculativeGeneration,
|
|
717
|
+
state: reminderState,
|
|
718
|
+
});
|
|
719
|
+
reminderState = reminder.nextState;
|
|
720
|
+
const deliveredMessage = resolveBeforeAgentStartMessage({
|
|
721
|
+
message,
|
|
722
|
+
reminder: reminder.message,
|
|
723
|
+
reminderEnabled: settings.reminderEnabled,
|
|
724
|
+
});
|
|
725
|
+
const reminderSystemPrompt = resolveReminderSystemPrompt({
|
|
726
|
+
systemPrompt: event.systemPrompt,
|
|
727
|
+
reminder: !message ? reminder.message : undefined,
|
|
728
|
+
reminderEnabled: settings.reminderEnabled,
|
|
729
|
+
});
|
|
730
|
+
if (!deliveredMessage && !reminderSystemPrompt)
|
|
731
|
+
return undefined;
|
|
732
|
+
return {
|
|
733
|
+
...(deliveredMessage ? { message: deliveredMessage } : {}),
|
|
734
|
+
...(reminderSystemPrompt ? { systemPrompt: reminderSystemPrompt } : {}),
|
|
735
|
+
};
|
|
769
736
|
});
|
|
770
737
|
pi.on("context", (event, ctx) => {
|
|
771
738
|
const usage = ctx.getContextUsage();
|
|
739
|
+
const settings = ctx.getCompactionSettings();
|
|
772
740
|
const contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;
|
|
773
|
-
const
|
|
774
|
-
const
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
: event.
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
741
|
+
const laneOwnsCompaction = lanePolicy.disablesSenpiCompaction(ctx);
|
|
742
|
+
const breakerFallback = !laneOwnsCompaction &&
|
|
743
|
+
breaker.isTripped(state, Date.now()) &&
|
|
744
|
+
usage?.tokens !== null &&
|
|
745
|
+
usage !== undefined &&
|
|
746
|
+
usage.tokens >= contextWindow * policy.computeEffectiveThreshold(contextWindow, state.lastYield ?? undefined);
|
|
747
|
+
if (breakerFallback)
|
|
748
|
+
getLogger(ctx).debug("breaker_deterministic_fallback", { route: "context-event", tokens: usage.tokens ?? 0 });
|
|
749
|
+
return {
|
|
750
|
+
messages: buildCompactionContext({
|
|
751
|
+
event,
|
|
752
|
+
ctx,
|
|
753
|
+
contextWindow,
|
|
754
|
+
promptContextWindow: getPromptContextWindow(contextWindow, ctx.model?.maxTokens),
|
|
755
|
+
toolAdmissionEnabled: settings.toolAdmissionEnabled !== false,
|
|
756
|
+
breakerFallback,
|
|
757
|
+
laneOwnsCompaction,
|
|
758
|
+
emergencyPruneLatch,
|
|
759
|
+
logEmergencyPrune: (fields) => getLogger(ctx).debug("emergency_prune", fields),
|
|
760
|
+
}),
|
|
761
|
+
};
|
|
793
762
|
});
|
|
794
763
|
pi.on("before_provider_request", async (event, ctx) => {
|
|
795
764
|
const model = event.model ?? ctx.model;
|
|
@@ -850,6 +819,35 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
850
819
|
armIdleWarmupRetry(ctx);
|
|
851
820
|
armIdleApply(ctx);
|
|
852
821
|
}
|
|
822
|
+
else {
|
|
823
|
+
// A sub-threshold OpenAI warm-up cannot be consumed by the remote
|
|
824
|
+
// compaction route. Once threshold admission succeeds remotely, it would
|
|
825
|
+
// only abort and discard this paid local summary. Above threshold we keep
|
|
826
|
+
// the existing local idle apply, which can finish before the next prompt;
|
|
827
|
+
// if remote compaction later falls back, blocking local generation remains
|
|
828
|
+
// unchanged.
|
|
829
|
+
if (isOpenAiRemoteCompactionModel(ctx.model))
|
|
830
|
+
return;
|
|
831
|
+
const warmAction = resolveIdleWarmAction({
|
|
832
|
+
willRetry: event.willRetry ?? false,
|
|
833
|
+
aborted: event.aborted === true,
|
|
834
|
+
settings,
|
|
835
|
+
usage,
|
|
836
|
+
contextWindow,
|
|
837
|
+
breakerTripped: breaker.isTripped(state, Date.now()),
|
|
838
|
+
lastYield: state.lastYield ?? undefined,
|
|
839
|
+
mode: ctx.mode,
|
|
840
|
+
}, speculativeJob);
|
|
841
|
+
if (warmAction === "replace")
|
|
842
|
+
invalidateSpeculativeCompaction(ctx);
|
|
843
|
+
if (warmAction !== "none") {
|
|
844
|
+
idleWarmupAttempt = 0;
|
|
845
|
+
sessionIdleSinceAgentEnd = true;
|
|
846
|
+
startSpeculativeCompaction(ctx, idle.IDLE_COMPACTION_INSTRUCTIONS);
|
|
847
|
+
armIdleWarmupRetry(ctx);
|
|
848
|
+
armIdleApply(ctx);
|
|
849
|
+
}
|
|
850
|
+
}
|
|
853
851
|
});
|
|
854
852
|
pi.on("message_end", async (event, ctx) => {
|
|
855
853
|
for (const entry of collectCompactBoundaryEntries(event.message)) {
|