@code-yeongyu/senpi 2026.8.28 → 2026.8.30-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 +196 -0
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +4 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +2 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +50 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +330 -29
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -0
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -0
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +155 -37
- package/dist/core/bash-executor.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/credential-accounts.d.ts.map +1 -1
- package/dist/core/credential-accounts.js +45 -21
- package/dist/core/credential-accounts.js.map +1 -1
- package/dist/core/credential-pool/classify.d.ts +6 -1
- package/dist/core/credential-pool/classify.d.ts.map +1 -1
- package/dist/core/credential-pool/classify.js +22 -5
- package/dist/core/credential-pool/classify.js.map +1 -1
- package/dist/core/credential-pool/env-slots.d.ts.map +1 -1
- package/dist/core/credential-pool/env-slots.js +2 -0
- package/dist/core/credential-pool/env-slots.js.map +1 -1
- package/dist/core/credential-pool/failover.d.ts +8 -0
- package/dist/core/credential-pool/failover.d.ts.map +1 -1
- package/dist/core/credential-pool/failover.js +24 -6
- package/dist/core/credential-pool/failover.js.map +1 -1
- package/dist/core/credential-pool/rotation-stream.d.ts +13 -2
- package/dist/core/credential-pool/rotation-stream.d.ts.map +1 -1
- package/dist/core/credential-pool/rotation-stream.js +97 -10
- package/dist/core/credential-pool/rotation-stream.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts +17 -0
- package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/context-pipeline.js +28 -0
- package/dist/core/extensions/builtin/compaction/context-pipeline.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +8 -2
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +163 -48
- 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.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 +121 -147
- 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/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 +56 -0
- package/dist/core/extensions/builtin/compaction/orchestration.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/orchestration.js +136 -0
- package/dist/core/extensions/builtin/compaction/orchestration.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/policy.d.ts +5 -2
- package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/policy.js +43 -26
- package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/retained-message-safety.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/retained-message-safety.js +31 -8
- package/dist/core/extensions/builtin/compaction/retained-message-safety.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 +22 -0
- package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/speculative-summary.js +131 -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 +7 -196
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts +18 -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 +18 -0
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/tool-admission.d.ts +36 -0
- package/dist/core/extensions/builtin/compaction/tool-admission.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/tool-admission.js +92 -0
- package/dist/core/extensions/builtin/compaction/tool-admission.js.map +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js +8 -28
- package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +7 -0
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/external-dir.js +15 -5
- package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.js +16 -1
- package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
- package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
- package/dist/core/extensions/builtin/service-tier.js +13 -0
- package/dist/core/extensions/builtin/service-tier.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js +4 -2
- package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/manager.d.ts +5 -0
- package/dist/core/extensions/builtin/terminal/manager.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/manager.js +31 -3
- package/dist/core/extensions/builtin/terminal/manager.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-permission.d.ts +8 -0
- package/dist/core/extensions/builtin/terminal/monitor-permission.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-permission.js +16 -0
- package/dist/core/extensions/builtin/terminal/monitor-permission.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +13 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.js +403 -3
- package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/session-bundle.js +1 -0
- package/dist/core/extensions/builtin/terminal/session-bundle.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/kill-bash.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/kill-bash.js +5 -2
- package/dist/core/extensions/builtin/terminal/tools/kill-bash.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +4 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.js +40 -2
- package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
- package/dist/core/model-config-schema.d.ts +4 -4
- package/dist/core/model-resolver.js +2 -2
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +2 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +74 -37
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/retry-fallback/chains.d.ts +23 -1
- package/dist/core/retry-fallback/chains.d.ts.map +1 -1
- package/dist/core/retry-fallback/chains.js +59 -3
- package/dist/core/retry-fallback/chains.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +9 -2
- 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 +9 -0
- package/dist/core/retry-fallback/settings.js.map +1 -1
- package/dist/core/retry-fallback/validate.js +1 -1
- package/dist/core/retry-fallback/validate.js.map +1 -1
- package/dist/core/sdk.js +1 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +9 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +40 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +15 -85
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +15 -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/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +97 -15
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +8 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +76 -34
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/main.d.ts +7 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +27 -6
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/favorite-models-selector.js +2 -2
- package/dist/modes/interactive/components/favorite-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +7 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +34 -8
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/grok/chrome.d.ts +2 -0
- package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
- package/dist/modes/interactive/grok/chrome.js.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts +121 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.js +606 -45
- package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +7 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +390 -239
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts +8 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +268 -63
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/host-ensure.d.ts +19 -0
- package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
- package/dist/modes/rpc/host-ensure.js +79 -15
- package/dist/modes/rpc/host-ensure.js.map +1 -1
- package/dist/modes/rpc/host-lifecycle.d.ts +29 -0
- package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
- package/dist/modes/rpc/host-lifecycle.js +96 -25
- package/dist/modes/rpc/host-lifecycle.js.map +1 -1
- package/dist/modes/rpc/host-watchdog.d.ts +2 -0
- package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
- package/dist/modes/rpc/host-watchdog.js +23 -12
- package/dist/modes/rpc/host-watchdog.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +20 -8
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +91 -16
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +131 -37
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-input-validation.d.ts +1 -0
- package/dist/modes/rpc/rpc-input-validation.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-input-validation.js +66 -0
- package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +3 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +3 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +248 -3
- 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-binding.d.ts +1 -0
- package/dist/modes/rpc/session-binding.d.ts.map +1 -1
- package/dist/modes/rpc/session-binding.js +21 -1
- package/dist/modes/rpc/session-binding.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts +22 -0
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +148 -16
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-writer.d.ts +4 -0
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +58 -7
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/modes/rpc/session-extension-ui-requests.d.ts +1 -0
- package/dist/modes/rpc/session-extension-ui-requests.d.ts.map +1 -1
- package/dist/modes/rpc/session-extension-ui-requests.js +5 -0
- package/dist/modes/rpc/session-extension-ui-requests.js.map +1 -1
- package/dist/modes/rpc/session-registry.d.ts +17 -2
- package/dist/modes/rpc/session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.js +67 -4
- package/dist/modes/rpc/session-registry.js.map +1 -1
- package/dist/modes/rpc/socket-event-fanout.d.ts +22 -0
- package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -0
- package/dist/modes/rpc/socket-event-fanout.js +84 -0
- package/dist/modes/rpc/socket-event-fanout.js.map +1 -0
- package/docs/rpc.md +55 -2
- package/docs/settings.md +34 -0
- package/docs/windows.md +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +74 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-indirect-eval.js +139 -90
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +4 -4
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +6 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- 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 +40 -20
- 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/types.d.ts +3 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js +28 -9
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -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 +67 -38
- 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/measure.d.ts +20 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js +443 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +2 -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 +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.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/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/fireworks.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/nvidia.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/together.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/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/dist/components/editor.d.ts +7 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +5 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/mux.d.ts +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/mux.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/mux.js +2 -2
- package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +1 -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 +19 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash-executor.js","sourceRoot":"","sources":["../../src/core/bash-executor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bash command execution with streaming support and cancellation.\n *\n * This module provides a unified bash execution implementation used by:\n * - AgentSession.executeBash() for interactive and RPC modes\n * - Direct calls from modes that need bash execution\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { createWriteStream, type WriteStream } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { stripAnsi } from \"../utils/ansi.ts\";\nimport { sanitizeBinaryOutput } from \"../utils/shell.ts\";\nimport type { BashOperations } from \"./tools/bash.ts\";\nimport { DEFAULT_MAX_BYTES, truncateTail } from \"./tools/truncate.ts\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface BashExecutorOptions {\n\t/** Callback for streaming output chunks (already sanitized) */\n\tonChunk?: (chunk: string) => void;\n\t/** AbortSignal for cancellation */\n\tsignal?: AbortSignal;\n}\n\nexport interface BashResult {\n\t/** Combined stdout + stderr output (sanitized, possibly truncated) */\n\toutput: string;\n\t/** Process exit code (undefined if killed/cancelled) */\n\texitCode: number | undefined;\n\t/** Whether the command was cancelled via signal */\n\tcancelled: boolean;\n\t/** Whether the output was truncated */\n\ttruncated: boolean;\n\t/** Path to temp file containing full output (if output exceeded truncation threshold) */\n\tfullOutputPath?: string;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Execute a bash command using custom BashOperations.\n * Used for remote execution (SSH, containers, etc.).\n */\nexport async function executeBashWithOperations(\n\tcommand: string,\n\tcwd: string,\n\toperations: BashOperations,\n\toptions?: BashExecutorOptions,\n): Promise<BashResult> {\n\tconst outputChunks: string[] = [];\n\tlet outputChunkStart = 0;\n\tlet outputBytes = 0;\n\tconst maxOutputBytes = DEFAULT_MAX_BYTES * 2;\n\n\tlet tempFilePath: string | undefined;\n\tlet tempFileStream: WriteStream | undefined;\n\tlet tempFileError: Error | undefined;\n\tlet tempFileErrorListener: ((error: Error) => void) | undefined;\n\tlet totalBytes = 0;\n\n\tconst compactOutputChunks = () => {\n\t\tif (outputChunkStart < 64) {\n\t\t\treturn;\n\t\t}\n\t\toutputChunks.splice(0, outputChunkStart);\n\t\toutputChunkStart = 0;\n\t};\n\n\tconst outputText = () => outputChunks.slice(outputChunkStart).join(\"\");\n\n\tconst ensureTempFile = () => {\n\t\tif (tempFilePath) {\n\t\t\treturn;\n\t\t}\n\t\tconst id = randomBytes(8).toString(\"hex\");\n\t\ttempFilePath = join(tmpdir(), `pi-bash-${id}.log`);\n\t\ttempFileStream = createWriteStream(tempFilePath);\n\t\ttempFileErrorListener = (error) => {\n\t\t\ttempFileError ??= error;\n\t\t};\n\t\ttempFileStream.on(\"error\", tempFileErrorListener);\n\t\tfor (let i = outputChunkStart; i < outputChunks.length; i++) {\n\t\t\tconst chunk = outputChunks[i];\n\t\t\tif (chunk !== undefined) {\n\t\t\t\ttempFileStream.write(chunk);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst closeTempFileStream = async () => {\n\t\tconst stream = tempFileStream;\n\t\ttempFileStream = undefined;\n\t\tif (!stream) {\n\t\t\treturn;\n\t\t}\n\t\tif (tempFileError) {\n\t\t\tif (tempFileErrorListener) stream.off(\"error\", tempFileErrorListener);\n\t\t\tstream.destroy();\n\t\t\tthrow tempFileError;\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tlet settled = false;\n\t\t\tconst cleanup = () => {\n\t\t\t\tstream.off(\"error\", onError);\n\t\t\t\tif (tempFileErrorListener) stream.off(\"error\", tempFileErrorListener);\n\t\t\t\tstream.off(\"close\", onClose);\n\t\t\t};\n\t\t\tconst settle = (error?: Error) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tcleanup();\n\t\t\t\tif (error) reject(error);\n\t\t\t\telse resolve();\n\t\t\t};\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\ttempFileError ??= error;\n\t\t\t};\n\t\t\tconst onClose = () => {\n\t\t\t\tsettle(tempFileError);\n\t\t\t};\n\t\t\tstream.on(\"error\", onError);\n\t\t\tstream.once(\"close\", onClose);\n\t\t\tstream.end();\n\t\t});\n\t};\n\n\tconst decoder = new TextDecoder();\n\n\tconst onData = (data: Buffer) => {\n\t\ttotalBytes += data.length;\n\n\t\t// Sanitize: strip ANSI, replace binary garbage, normalize newlines\n\t\tconst text = sanitizeBinaryOutput(stripAnsi(decoder.decode(data, { stream: true }))).replace(/\\r/g, \"\");\n\n\t\t// Start writing to temp file if exceeds threshold\n\t\tif (totalBytes > DEFAULT_MAX_BYTES) {\n\t\t\tensureTempFile();\n\t\t}\n\n\t\tif (tempFileStream) {\n\t\t\ttempFileStream.write(text);\n\t\t}\n\n\t\toutputChunks.push(text);\n\t\toutputBytes += text.length;\n\t\twhile (outputBytes > maxOutputBytes && outputChunkStart < outputChunks.length - 1) {\n\t\t\tconst removed = outputChunks[outputChunkStart];\n\t\t\tif (removed === undefined) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\toutputBytes -= removed.length;\n\t\t\toutputChunkStart++;\n\t\t}\n\t\tcompactOutputChunks();\n\n\t\t// Stream to callback\n\t\tif (options?.onChunk) {\n\t\t\toptions.onChunk(text);\n\t\t}\n\t};\n\n\tconst finishDecoder = () => {\n\t\tconst finalText = sanitizeBinaryOutput(stripAnsi(decoder.decode())).replace(/\\r/g, \"\");\n\t\tif (finalText.length > 0) {\n\t\t\tonData(Buffer.from(finalText, \"utf-8\"));\n\t\t}\n\t};\n\n\tconst prepareFinalOutput = async () => {\n\t\ttry {\n\t\t\tfinishDecoder();\n\t\t\tconst fullOutput = outputText();\n\t\t\tconst truncationResult = truncateTail(fullOutput);\n\t\t\tif (truncationResult.truncated) {\n\t\t\t\tensureTempFile();\n\t\t\t}\n\t\t\treturn { fullOutput, truncationResult };\n\t\t} catch (error) {\n\t\t\ttry {\n\t\t\t\tawait closeTempFileStream();\n\t\t\t} catch (closeError) {\n\t\t\t\tthrow new AggregateError([error, closeError], \"Bash output finalization and spill cleanup failed\");\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\tlet result: Awaited<ReturnType<BashOperations[\"exec\"]>>;\n\ttry {\n\t\tresult = await operations.exec(command, cwd, {\n\t\t\tonData,\n\t\t\tsignal: options?.signal,\n\t\t});\n\t} catch (err) {\n\t\t// Check if it was an abort\n\t\tif (options?.signal?.aborted) {\n\t\t\tconst { fullOutput, truncationResult } = await prepareFinalOutput();\n\t\t\tawait closeTempFileStream();\n\t\t\treturn {\n\t\t\t\toutput: truncationResult.truncated ? truncationResult.content : fullOutput,\n\t\t\t\texitCode: undefined,\n\t\t\t\tcancelled: true,\n\t\t\t\ttruncated: truncationResult.truncated,\n\t\t\t\tfullOutputPath: tempFilePath,\n\t\t\t};\n\t\t}\n\n\t\tawait closeTempFileStream();\n\n\t\tthrow err;\n\t}\n\n\tconst { fullOutput, truncationResult } = await prepareFinalOutput();\n\tawait closeTempFileStream();\n\tconst cancelled = options?.signal?.aborted ?? false;\n\n\treturn {\n\t\toutput: truncationResult.truncated ? truncationResult.content : fullOutput,\n\t\texitCode: cancelled ? undefined : (result.exitCode ?? undefined),\n\t\tcancelled,\n\t\ttruncated: truncationResult.truncated,\n\t\tfullOutputPath: tempFilePath,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bash-executor.js","sourceRoot":"","sources":["../../src/core/bash-executor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bash command execution with streaming support and cancellation.\n *\n * This module provides a unified bash execution implementation used by:\n * - AgentSession.executeBash() for interactive and RPC modes\n * - Direct calls from modes that need bash execution\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { createWriteStream, type WriteStream } from \"node:fs\";\nimport { rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { stripAnsi } from \"../utils/ansi.ts\";\nimport { sanitizeBinaryOutput } from \"../utils/shell.ts\";\nimport type { BashOperations } from \"./tools/bash.ts\";\nimport { DEFAULT_MAX_BYTES, truncateTail } from \"./tools/truncate.ts\";\n\nconst NORMAL_CALLBACK_SETTLEMENT_TIMEOUT_MS = 5_000;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface BashExecutorOptions {\n\t/** Callback for streaming output chunks (already sanitized) */\n\tonChunk?: (chunk: string) => void;\n\t/** AbortSignal for cancellation */\n\tsignal?: AbortSignal;\n}\n\nexport interface BashResult {\n\t/** Combined stdout + stderr output (sanitized, possibly truncated) */\n\toutput: string;\n\t/** Process exit code (undefined if killed/cancelled) */\n\texitCode: number | undefined;\n\t/** Whether the command was cancelled via signal */\n\tcancelled: boolean;\n\t/** Whether the output was truncated */\n\ttruncated: boolean;\n\t/** Path to temp file containing full output (if output exceeded truncation threshold) */\n\tfullOutputPath?: string;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Execute a bash command using custom BashOperations.\n * Used for remote execution (SSH, containers, etc.).\n */\nexport async function executeBashWithOperations(\n\tcommand: string,\n\tcwd: string,\n\toperations: BashOperations,\n\toptions?: BashExecutorOptions,\n): Promise<BashResult> {\n\tconst outputChunks: string[] = [];\n\tconst callbackAbortController = new AbortController();\n\tconst executionSignal = options?.signal\n\t\t? AbortSignal.any([options.signal, callbackAbortController.signal])\n\t\t: callbackAbortController.signal;\n\tlet callbackError: unknown;\n\tlet hasCallbackError = false;\n\tlet callbacksAbandoned = false;\n\tconst callbackPromises = new Set<Promise<void>>();\n\tconst waitForCallbacks = async (allowAbandonment: boolean): Promise<boolean> => {\n\t\tif (callbackPromises.size === 0) return true;\n\t\tconst settled = Promise.allSettled([...callbackPromises]).then(() => true);\n\t\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\t\tconst bounded = new Promise<false>((resolve) => {\n\t\t\ttimeout = setTimeout(resolve, allowAbandonment ? 100 : NORMAL_CALLBACK_SETTLEMENT_TIMEOUT_MS, false);\n\t\t\ttimeout.unref?.();\n\t\t});\n\t\ttry {\n\t\t\treturn await Promise.race([settled, bounded]);\n\t\t} finally {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t}\n\t};\n\tlet outputChunkStart = 0;\n\tlet outputBytes = 0;\n\tconst maxOutputBytes = DEFAULT_MAX_BYTES * 2;\n\n\tlet tempFilePath: string | undefined;\n\tlet tempFileStream: WriteStream | undefined;\n\tlet tempFileError: Error | undefined;\n\tlet totalBytes = 0;\n\n\tconst compactOutputChunks = () => {\n\t\tif (outputChunkStart < 64) {\n\t\t\treturn;\n\t\t}\n\t\toutputChunks.splice(0, outputChunkStart);\n\t\toutputChunkStart = 0;\n\t};\n\n\tconst outputText = () => outputChunks.slice(outputChunkStart).join(\"\");\n\n\tconst ensureTempFile = () => {\n\t\tif (tempFilePath) {\n\t\t\treturn;\n\t\t}\n\t\tconst id = randomBytes(8).toString(\"hex\");\n\t\ttempFilePath = join(tmpdir(), `pi-bash-${id}.log`);\n\t\ttempFileStream = createWriteStream(tempFilePath);\n\t\ttempFileStream.on(\"error\", (error) => {\n\t\t\ttempFileError ??= error;\n\t\t});\n\t\tfor (let i = outputChunkStart; i < outputChunks.length; i++) {\n\t\t\tconst chunk = outputChunks[i];\n\t\t\tif (chunk !== undefined) {\n\t\t\t\ttempFileStream.write(chunk);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst closeTempFileStream = async () => {\n\t\tconst stream = tempFileStream;\n\t\ttempFileStream = undefined;\n\t\tif (!stream) {\n\t\t\treturn;\n\t\t}\n\t\tif (tempFileError) {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tif (stream.closed) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstream.once(\"close\", resolve);\n\t\t\t\tstream.destroy();\n\t\t\t});\n\t\t\tthrow tempFileError;\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tlet finished = false;\n\t\t\tlet closed = false;\n\t\t\tlet streamError: Error | undefined;\n\t\t\tconst settle = () => {\n\t\t\t\tif (!closed) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstream.off(\"finish\", onFinish);\n\t\t\t\tstream.off(\"error\", onError);\n\t\t\t\tstream.off(\"close\", onClose);\n\t\t\t\tif (streamError) {\n\t\t\t\t\treject(streamError);\n\t\t\t\t} else if (finished) {\n\t\t\t\t\tresolve();\n\t\t\t\t} else {\n\t\t\t\t\treject(new Error(\"Bash spill stream closed before finish\"));\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\tstreamError ??= error;\n\t\t\t};\n\t\t\tconst onFinish = () => {\n\t\t\t\tfinished = true;\n\t\t\t};\n\t\t\tconst onClose = () => {\n\t\t\t\tclosed = true;\n\t\t\t\tif (!finished && !stream.destroyed) {\n\t\t\t\t\tstream.destroy();\n\t\t\t\t}\n\t\t\t\tsettle();\n\t\t\t};\n\t\t\tstream.once(\"error\", onError);\n\t\t\tstream.once(\"finish\", onFinish);\n\t\t\tstream.once(\"close\", onClose);\n\t\t\tstream.end();\n\t\t});\n\t};\n\n\tconst removeTempFile = async (): Promise<void> => {\n\t\tif (!tempFilePath) {\n\t\t\treturn;\n\t\t}\n\t\tconst path = tempFilePath;\n\t\tawait rm(path, { force: true });\n\t\ttempFilePath = undefined;\n\t};\n\n\tconst closeTempFileAndCleanup = async (primaryError: unknown): Promise<never> => {\n\t\tlet finalError = primaryError;\n\t\ttry {\n\t\t\tawait closeTempFileStream();\n\t\t} catch (closeError) {\n\t\t\tfinalError = new AggregateError([primaryError, closeError], \"Bash output cleanup failed\");\n\t\t}\n\t\ttry {\n\t\t\tawait removeTempFile();\n\t\t} catch (unlinkError) {\n\t\t\tfinalError = new AggregateError([finalError, unlinkError], \"Bash output cleanup failed\");\n\t\t}\n\t\tthrow finalError;\n\t};\n\n\tconst decoder = new TextDecoder();\n\n\tconst onData = (data: Buffer) => {\n\t\tif (callbackAbortController.signal.aborted) return;\n\t\ttotalBytes += data.length;\n\n\t\t// Sanitize: strip ANSI, replace binary garbage, normalize newlines\n\t\tconst text = sanitizeBinaryOutput(stripAnsi(decoder.decode(data, { stream: true }))).replace(/\\r/g, \"\");\n\n\t\t// Start writing to temp file if exceeds threshold\n\t\tif (totalBytes > DEFAULT_MAX_BYTES) {\n\t\t\tensureTempFile();\n\t\t}\n\n\t\tif (tempFileStream) {\n\t\t\ttempFileStream.write(text);\n\t\t}\n\n\t\toutputChunks.push(text);\n\t\toutputBytes += text.length;\n\t\twhile (outputBytes > maxOutputBytes && outputChunkStart < outputChunks.length - 1) {\n\t\t\tconst removed = outputChunks[outputChunkStart];\n\t\t\tif (removed === undefined) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\toutputBytes -= removed.length;\n\t\t\toutputChunkStart++;\n\t\t}\n\t\tcompactOutputChunks();\n\n\t\t// Stream to callback\n\t\tif (options?.onChunk) {\n\t\t\ttry {\n\t\t\t\tconst callbackResult = (options.onChunk as (chunk: string) => unknown)(text);\n\t\t\t\tif (callbackResult && typeof (callbackResult as { then?: unknown }).then === \"function\") {\n\t\t\t\t\tconst callbackPromise = Promise.resolve(callbackResult).then(\n\t\t\t\t\t\t() => undefined,\n\t\t\t\t\t\t(error) => {\n\t\t\t\t\t\t\tif (!hasCallbackError) {\n\t\t\t\t\t\t\t\tcallbackError = error;\n\t\t\t\t\t\t\t\thasCallbackError = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (callbacksAbandoned) {\n\t\t\t\t\t\t\t\tprocess.emitWarning(\n\t\t\t\t\t\t\t\t\t`Bash output callback rejected after the command timeout: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t\t\t\t{ code: \"BASH_CALLBACK_ERROR\" },\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcallbackAbortController.abort();\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tcallbackPromises.add(callbackPromise);\n\t\t\t\t\tvoid callbackPromise.catch(() => {}).finally(() => callbackPromises.delete(callbackPromise));\n\t\t\t\t\treturn callbackPromise;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (!hasCallbackError) {\n\t\t\t\t\tcallbackError = error;\n\t\t\t\t\thasCallbackError = true;\n\t\t\t\t}\n\t\t\t\tcallbackAbortController.abort();\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t};\n\n\tconst finishDecoder = () => {\n\t\tconst finalText = sanitizeBinaryOutput(stripAnsi(decoder.decode())).replace(/\\r/g, \"\");\n\t\tif (finalText.length > 0) {\n\t\t\tonData(Buffer.from(finalText, \"utf-8\"));\n\t\t}\n\t};\n\n\tconst prepareFinalOutput = async () => {\n\t\ttry {\n\t\t\tfinishDecoder();\n\t\t\tconst fullOutput = outputText();\n\t\t\tconst truncationResult = truncateTail(fullOutput);\n\t\t\tif (truncationResult.truncated) {\n\t\t\t\tensureTempFile();\n\t\t\t}\n\t\t\treturn { fullOutput, truncationResult };\n\t\t} catch (error) {\n\t\t\treturn await closeTempFileAndCleanup(error);\n\t\t}\n\t};\n\n\tlet result: Awaited<ReturnType<BashOperations[\"exec\"]>>;\n\ttry {\n\t\tresult = await operations.exec(command, cwd, {\n\t\t\tonData,\n\t\t\tsignal: executionSignal,\n\t\t});\n\t} catch (err) {\n\t\tawait waitForCallbacks(options?.signal?.aborted === true);\n\t\t// Check if it was an abort\n\t\tif (hasCallbackError) {\n\t\t\treturn await closeTempFileAndCleanup(callbackError);\n\t\t}\n\t\tif (options?.signal?.aborted) {\n\t\t\tconst { fullOutput, truncationResult } = await prepareFinalOutput();\n\t\t\ttry {\n\t\t\t\tawait closeTempFileStream();\n\t\t\t} catch (error) {\n\t\t\t\treturn await closeTempFileAndCleanup(error);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait removeTempFile();\n\t\t\t} catch (cleanupError) {\n\t\t\t\tthrow new AggregateError([cleanupError], \"Bash output cleanup failed\");\n\t\t\t}\n\t\t\treturn {\n\t\t\t\toutput: truncationResult.truncated ? truncationResult.content : fullOutput,\n\t\t\t\texitCode: undefined,\n\t\t\t\tcancelled: true,\n\t\t\t\ttruncated: truncationResult.truncated,\n\t\t\t};\n\t\t}\n\n\t\treturn await closeTempFileAndCleanup(err);\n\t}\n\n\t// Normal completion has a generous bound for observer callbacks: unlike the\n\t// cancellation path, it must not hang forever on an observer that never\n\t// settles, while still allowing legitimately slow callbacks to finish. A\n\t// callback that exceeds the public bound is an execution failure, not silent\n\t// abandonment, so its spill is cleaned before the caller is released.\n\tconst callbacksSettled = await waitForCallbacks(false);\n\tif (!callbacksSettled) {\n\t\tcallbacksAbandoned = true;\n\t\treturn await closeTempFileAndCleanup(\n\t\t\tnew Error(`Bash output callback did not settle within ${NORMAL_CALLBACK_SETTLEMENT_TIMEOUT_MS}ms`),\n\t\t);\n\t}\n\tif (hasCallbackError) {\n\t\treturn await closeTempFileAndCleanup(callbackError);\n\t}\n\tconst { fullOutput, truncationResult } = await prepareFinalOutput();\n\ttry {\n\t\tawait closeTempFileStream();\n\t} catch (error) {\n\t\treturn await closeTempFileAndCleanup(error);\n\t}\n\tconst cancelled = options?.signal?.aborted ?? false;\n\n\treturn {\n\t\toutput: truncationResult.truncated ? truncationResult.content : fullOutput,\n\t\texitCode: cancelled ? undefined : (result.exitCode ?? undefined),\n\t\tcancelled,\n\t\ttruncated: truncationResult.truncated,\n\t\tfullOutputPath: tempFilePath,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AgentMessage, StreamFn, ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { RetryCallbacks, RetryPolicy } from "@earendil-works/pi-ai";
|
|
3
|
+
import type { Model } from "@earendil-works/pi-ai/compat";
|
|
4
|
+
import { type CacheFriendlySummaryOptions, type CompactionPreparation, type CompactionResult } from "./compaction.ts";
|
|
5
|
+
/**
|
|
6
|
+
* Generate summaries for compaction using prepared data.
|
|
7
|
+
* Returns CompactionResult - SessionManager adds uuid/parentUuid when saving.
|
|
8
|
+
*
|
|
9
|
+
* @param preparation - Pre-calculated preparation from prepareCompaction()
|
|
10
|
+
* @param customInstructions - Optional custom focus for the summary
|
|
11
|
+
* @param cacheFriendly - Active provider contexts and request settings for cache-friendly summarization
|
|
12
|
+
*/
|
|
13
|
+
export declare function compact(preparation: CompactionPreparation, model: Model<any>, apiKey: string | undefined, headers?: Record<string, string>, customInstructions?: string, signal?: AbortSignal, extraBody?: Record<string, unknown>, thinkingLevel?: ThinkingLevel, streamFn?: StreamFn, env?: Record<string, string>, transformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>, retry?: RetryPolicy, callbacks?: RetryCallbacks, sessionId?: string, cacheFriendly?: CacheFriendlySummaryOptions): Promise<CompactionResult>;
|
|
14
|
+
//# sourceMappingURL=compaction-execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-execution.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compaction-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAS,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EAEN,KAAK,2BAA2B,EAEhC,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EAQrB,MAAM,iBAAiB,CAAC;AAmCzB;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAC5B,WAAW,EAAE,qBAAqB,EAClC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,kBAAkB,CAAC,EAAE,MAAM,EAC3B,MAAM,CAAC,EAAE,WAAW,EACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,aAAa,CAAC,EAAE,aAAa,EAC7B,QAAQ,CAAC,EAAE,QAAQ,EACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,EAC9F,KAAK,CAAC,EAAE,WAAW,EACnB,SAAS,CAAC,EAAE,cAAc,EAC1B,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,2BAA2B,GACzC,OAAO,CAAC,gBAAgB,CAAC,CA+G3B"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { convertToLlm } from "../messages.js";
|
|
2
|
+
import { buildSummarizationContext, cacheFriendlyContextFits, combineUsage, completeSummarization, createSummarizationOptions, generateSummaryWithUsage, getSummarizationFailure, } from "./compaction.js";
|
|
3
|
+
import { computeFileLists, contentTextForSummary, formatFileOperations, serializeConversation } from "./utils.js";
|
|
4
|
+
const TURN_PREFIX_SUMMARIZATION_PROMPT = `This is the PREFIX of a turn that was too large to keep. The SUFFIX (recent work) is retained.
|
|
5
|
+
|
|
6
|
+
Summarize the prefix to provide context for the retained suffix:
|
|
7
|
+
|
|
8
|
+
## Original Request
|
|
9
|
+
[What did the user ask for in this turn?]
|
|
10
|
+
|
|
11
|
+
## Early Progress
|
|
12
|
+
- [Key decisions and work done in the prefix]
|
|
13
|
+
|
|
14
|
+
## Context for Suffix
|
|
15
|
+
- [Information needed to understand the retained recent work]
|
|
16
|
+
|
|
17
|
+
Be concise. Focus on what's needed to understand the kept suffix.`;
|
|
18
|
+
const SOURCE_CONTEXT_TURN_PREFIX_SUMMARIZATION_PROMPT = `The final turn in the source conversation was too large to keep in full. Its SUFFIX (recent work) is retained.
|
|
19
|
+
|
|
20
|
+
The source conversation may also contain complete earlier turns for background. Summarize only the final, incomplete turn. It begins with the last user-role request before this instruction. Do not summarize earlier turns except for details needed to understand this final turn's prefix.
|
|
21
|
+
|
|
22
|
+
Summarize the prefix to provide context for the retained suffix:
|
|
23
|
+
|
|
24
|
+
## Original Request
|
|
25
|
+
[What did the user ask for in this turn?]
|
|
26
|
+
|
|
27
|
+
## Early Progress
|
|
28
|
+
- [Key decisions and work done in the prefix]
|
|
29
|
+
|
|
30
|
+
## Context for Suffix
|
|
31
|
+
- [Information needed to understand the retained recent work]
|
|
32
|
+
|
|
33
|
+
Be concise. Focus on what's needed to understand the kept suffix.`;
|
|
34
|
+
/**
|
|
35
|
+
* Generate summaries for compaction using prepared data.
|
|
36
|
+
* Returns CompactionResult - SessionManager adds uuid/parentUuid when saving.
|
|
37
|
+
*
|
|
38
|
+
* @param preparation - Pre-calculated preparation from prepareCompaction()
|
|
39
|
+
* @param customInstructions - Optional custom focus for the summary
|
|
40
|
+
* @param cacheFriendly - Active provider contexts and request settings for cache-friendly summarization
|
|
41
|
+
*/
|
|
42
|
+
export async function compact(preparation, model, apiKey, headers, customInstructions, signal, extraBody, thinkingLevel, streamFn, env, transformContext, retry, callbacks, sessionId, cacheFriendly) {
|
|
43
|
+
const { firstKeptEntryId, messagesToSummarize, turnPrefixMessages, isSplitTurn, tokensBefore, previousSummary, fileOps, settings, } = preparation;
|
|
44
|
+
// Generate summaries and merge into one
|
|
45
|
+
let summary;
|
|
46
|
+
let summaryUsage;
|
|
47
|
+
if (isSplitTurn && turnPrefixMessages.length > 0) {
|
|
48
|
+
let historyText = "No prior history.";
|
|
49
|
+
let historyUsage;
|
|
50
|
+
if (messagesToSummarize.length > 0) {
|
|
51
|
+
const historyResult = await generateSummaryWithUsage(messagesToSummarize, model, settings.reserveTokens, apiKey, headers, signal, customInstructions, previousSummary, extraBody, thinkingLevel, streamFn, env, transformContext, retry, callbacks, sessionId, {
|
|
52
|
+
sourceContext: cacheFriendly?.sourceContext,
|
|
53
|
+
requestOptions: cacheFriendly?.requestOptions,
|
|
54
|
+
});
|
|
55
|
+
historyText = historyResult.text;
|
|
56
|
+
historyUsage = historyResult.usage;
|
|
57
|
+
}
|
|
58
|
+
const turnPrefixResult = await generateTurnPrefixSummary(turnPrefixMessages, model, settings.reserveTokens, apiKey, headers, env, signal, extraBody, thinkingLevel, streamFn, transformContext, retry, callbacks, sessionId, {
|
|
59
|
+
sourceContext: cacheFriendly?.turnPrefixSourceContext,
|
|
60
|
+
requestOptions: cacheFriendly?.requestOptions,
|
|
61
|
+
});
|
|
62
|
+
// Merge into single summary
|
|
63
|
+
summary = `${historyText}\n\n---\n\n**Turn Context (split turn):**\n\n${turnPrefixResult.text}`;
|
|
64
|
+
summaryUsage = historyUsage ? combineUsage(historyUsage, turnPrefixResult.usage) : turnPrefixResult.usage;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Just generate history summary
|
|
68
|
+
const result = await generateSummaryWithUsage(messagesToSummarize, model, settings.reserveTokens, apiKey, headers, signal, customInstructions, previousSummary, extraBody, thinkingLevel, streamFn, env, transformContext, retry, callbacks, sessionId, {
|
|
69
|
+
sourceContext: cacheFriendly?.sourceContext,
|
|
70
|
+
requestOptions: cacheFriendly?.requestOptions,
|
|
71
|
+
});
|
|
72
|
+
summary = result.text;
|
|
73
|
+
summaryUsage = result.usage;
|
|
74
|
+
}
|
|
75
|
+
// Compute file lists and append to summary
|
|
76
|
+
const { readFiles, modifiedFiles } = computeFileLists(fileOps);
|
|
77
|
+
summary += formatFileOperations(readFiles, modifiedFiles);
|
|
78
|
+
if (!firstKeptEntryId) {
|
|
79
|
+
throw new Error("First kept entry has no UUID - session may need migration");
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
summary,
|
|
83
|
+
firstKeptEntryId,
|
|
84
|
+
tokensBefore,
|
|
85
|
+
usage: summaryUsage,
|
|
86
|
+
details: { readFiles, modifiedFiles },
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Generate a summary for a turn prefix (when splitting a turn).
|
|
91
|
+
*/
|
|
92
|
+
async function generateTurnPrefixSummary(messages, model, reserveTokens, apiKey, headers, env, signal, extraBody, thinkingLevel, streamFn, transformContext, retry, callbacks, sessionId, cacheFriendly) {
|
|
93
|
+
const maxTokens = Math.min(Math.floor(0.5 * reserveTokens), model.maxTokens > 0 ? model.maxTokens : Number.POSITIVE_INFINITY);
|
|
94
|
+
let sourceContext = cacheFriendly?.sourceContext;
|
|
95
|
+
if (sourceContext &&
|
|
96
|
+
!cacheFriendlyContextFits(model, buildSummarizationContext(SOURCE_CONTEXT_TURN_PREFIX_SUMMARIZATION_PROMPT, sourceContext), maxTokens)) {
|
|
97
|
+
sourceContext = undefined;
|
|
98
|
+
}
|
|
99
|
+
let promptText;
|
|
100
|
+
if (sourceContext) {
|
|
101
|
+
promptText = SOURCE_CONTEXT_TURN_PREFIX_SUMMARIZATION_PROMPT;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const providerMessages = transformContext ? await transformContext(messages, signal) : messages;
|
|
105
|
+
const llmMessages = convertToLlm(providerMessages);
|
|
106
|
+
const conversationText = serializeConversation(llmMessages);
|
|
107
|
+
promptText = `<conversation>\n${conversationText}\n</conversation>\n\n${TURN_PREFIX_SUMMARIZATION_PROMPT}`;
|
|
108
|
+
}
|
|
109
|
+
const response = await completeSummarization(model, buildSummarizationContext(promptText, sourceContext), createSummarizationOptions(model, maxTokens, apiKey, headers, env, signal, thinkingLevel, extraBody, sessionId, sourceContext ? cacheFriendly?.requestOptions : undefined, sourceContext ? "short" : undefined), streamFn, retry, callbacks);
|
|
110
|
+
const failure = getSummarizationFailure(response, "Turn prefix summarization");
|
|
111
|
+
if (failure)
|
|
112
|
+
throw new Error(failure);
|
|
113
|
+
if (response.content.some((block) => block.type === "toolCall")) {
|
|
114
|
+
throw new Error("Turn prefix summarization attempted to call a tool");
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
text: contentTextForSummary(response.content),
|
|
118
|
+
usage: response.usage,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=compaction-execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-execution.js","sourceRoot":"","sources":["../../../src/core/compaction/compaction-execution.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, StreamFn, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { RetryCallbacks, RetryPolicy } from \"@earendil-works/pi-ai\";\nimport type { Model, Usage } from \"@earendil-works/pi-ai/compat\";\nimport { convertToLlm } from \"../messages.ts\";\nimport {\n\tbuildSummarizationContext,\n\ttype CacheFriendlySummaryOptions,\n\ttype CompactionDetails,\n\ttype CompactionPreparation,\n\ttype CompactionResult,\n\tcacheFriendlyContextFits,\n\tcombineUsage,\n\tcompleteSummarization,\n\tcreateSummarizationOptions,\n\tgenerateSummaryWithUsage,\n\tgetSummarizationFailure,\n\ttype SummarizationStreamFn,\n} from \"./compaction.ts\";\nimport { computeFileLists, contentTextForSummary, formatFileOperations, serializeConversation } from \"./utils.ts\";\n\nconst TURN_PREFIX_SUMMARIZATION_PROMPT = `This is the PREFIX of a turn that was too large to keep. The SUFFIX (recent work) is retained.\n\nSummarize the prefix to provide context for the retained suffix:\n\n## Original Request\n[What did the user ask for in this turn?]\n\n## Early Progress\n- [Key decisions and work done in the prefix]\n\n## Context for Suffix\n- [Information needed to understand the retained recent work]\n\nBe concise. Focus on what's needed to understand the kept suffix.`;\n\nconst SOURCE_CONTEXT_TURN_PREFIX_SUMMARIZATION_PROMPT = `The final turn in the source conversation was too large to keep in full. Its SUFFIX (recent work) is retained.\n\nThe source conversation may also contain complete earlier turns for background. Summarize only the final, incomplete turn. It begins with the last user-role request before this instruction. Do not summarize earlier turns except for details needed to understand this final turn's prefix.\n\nSummarize the prefix to provide context for the retained suffix:\n\n## Original Request\n[What did the user ask for in this turn?]\n\n## Early Progress\n- [Key decisions and work done in the prefix]\n\n## Context for Suffix\n- [Information needed to understand the retained recent work]\n\nBe concise. Focus on what's needed to understand the kept suffix.`;\n\n/**\n * Generate summaries for compaction using prepared data.\n * Returns CompactionResult - SessionManager adds uuid/parentUuid when saving.\n *\n * @param preparation - Pre-calculated preparation from prepareCompaction()\n * @param customInstructions - Optional custom focus for the summary\n * @param cacheFriendly - Active provider contexts and request settings for cache-friendly summarization\n */\nexport async function compact(\n\tpreparation: CompactionPreparation,\n\tmodel: Model<any>,\n\tapiKey: string | undefined,\n\theaders?: Record<string, string>,\n\tcustomInstructions?: string,\n\tsignal?: AbortSignal,\n\textraBody?: Record<string, unknown>,\n\tthinkingLevel?: ThinkingLevel,\n\tstreamFn?: StreamFn,\n\tenv?: Record<string, string>,\n\ttransformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>,\n\tretry?: RetryPolicy,\n\tcallbacks?: RetryCallbacks,\n\tsessionId?: string,\n\tcacheFriendly?: CacheFriendlySummaryOptions,\n): Promise<CompactionResult> {\n\tconst {\n\t\tfirstKeptEntryId,\n\t\tmessagesToSummarize,\n\t\tturnPrefixMessages,\n\t\tisSplitTurn,\n\t\ttokensBefore,\n\t\tpreviousSummary,\n\t\tfileOps,\n\t\tsettings,\n\t} = preparation;\n\n\t// Generate summaries and merge into one\n\tlet summary: string;\n\tlet summaryUsage: Usage;\n\n\tif (isSplitTurn && turnPrefixMessages.length > 0) {\n\t\tlet historyText = \"No prior history.\";\n\t\tlet historyUsage: Usage | undefined;\n\t\tif (messagesToSummarize.length > 0) {\n\t\t\tconst historyResult = await generateSummaryWithUsage(\n\t\t\t\tmessagesToSummarize,\n\t\t\t\tmodel,\n\t\t\t\tsettings.reserveTokens,\n\t\t\t\tapiKey,\n\t\t\t\theaders,\n\t\t\t\tsignal,\n\t\t\t\tcustomInstructions,\n\t\t\t\tpreviousSummary,\n\t\t\t\textraBody,\n\t\t\t\tthinkingLevel,\n\t\t\t\tstreamFn,\n\t\t\t\tenv,\n\t\t\t\ttransformContext,\n\t\t\t\tretry,\n\t\t\t\tcallbacks,\n\t\t\t\tsessionId,\n\t\t\t\t{\n\t\t\t\t\tsourceContext: cacheFriendly?.sourceContext,\n\t\t\t\t\trequestOptions: cacheFriendly?.requestOptions,\n\t\t\t\t},\n\t\t\t);\n\t\t\thistoryText = historyResult.text;\n\t\t\thistoryUsage = historyResult.usage;\n\t\t}\n\t\tconst turnPrefixResult = await generateTurnPrefixSummary(\n\t\t\tturnPrefixMessages,\n\t\t\tmodel,\n\t\t\tsettings.reserveTokens,\n\t\t\tapiKey,\n\t\t\theaders,\n\t\t\tenv,\n\t\t\tsignal,\n\t\t\textraBody,\n\t\t\tthinkingLevel,\n\t\t\tstreamFn,\n\t\t\ttransformContext,\n\t\t\tretry,\n\t\t\tcallbacks,\n\t\t\tsessionId,\n\t\t\t{\n\t\t\t\tsourceContext: cacheFriendly?.turnPrefixSourceContext,\n\t\t\t\trequestOptions: cacheFriendly?.requestOptions,\n\t\t\t},\n\t\t);\n\t\t// Merge into single summary\n\t\tsummary = `${historyText}\\n\\n---\\n\\n**Turn Context (split turn):**\\n\\n${turnPrefixResult.text}`;\n\t\tsummaryUsage = historyUsage ? combineUsage(historyUsage, turnPrefixResult.usage) : turnPrefixResult.usage;\n\t} else {\n\t\t// Just generate history summary\n\t\tconst result = await generateSummaryWithUsage(\n\t\t\tmessagesToSummarize,\n\t\t\tmodel,\n\t\t\tsettings.reserveTokens,\n\t\t\tapiKey,\n\t\t\theaders,\n\t\t\tsignal,\n\t\t\tcustomInstructions,\n\t\t\tpreviousSummary,\n\t\t\textraBody,\n\t\t\tthinkingLevel,\n\t\t\tstreamFn,\n\t\t\tenv,\n\t\t\ttransformContext,\n\t\t\tretry,\n\t\t\tcallbacks,\n\t\t\tsessionId,\n\t\t\t{\n\t\t\t\tsourceContext: cacheFriendly?.sourceContext,\n\t\t\t\trequestOptions: cacheFriendly?.requestOptions,\n\t\t\t},\n\t\t);\n\t\tsummary = result.text;\n\t\tsummaryUsage = result.usage;\n\t}\n\n\t// Compute file lists and append to summary\n\tconst { readFiles, modifiedFiles } = computeFileLists(fileOps);\n\tsummary += formatFileOperations(readFiles, modifiedFiles);\n\n\tif (!firstKeptEntryId) {\n\t\tthrow new Error(\"First kept entry has no UUID - session may need migration\");\n\t}\n\n\treturn {\n\t\tsummary,\n\t\tfirstKeptEntryId,\n\t\ttokensBefore,\n\t\tusage: summaryUsage,\n\t\tdetails: { readFiles, modifiedFiles } as CompactionDetails,\n\t};\n}\n\n/**\n * Generate a summary for a turn prefix (when splitting a turn).\n */\nasync function generateTurnPrefixSummary(\n\tmessages: AgentMessage[],\n\tmodel: Model<any>,\n\treserveTokens: number,\n\tapiKey: string | undefined,\n\theaders?: Record<string, string>,\n\tenv?: Record<string, string>,\n\tsignal?: AbortSignal,\n\textraBody?: Record<string, unknown>,\n\tthinkingLevel?: ThinkingLevel,\n\tstreamFn?: SummarizationStreamFn,\n\ttransformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>,\n\tretry?: RetryPolicy,\n\tcallbacks?: RetryCallbacks,\n\tsessionId?: string,\n\tcacheFriendly?: Pick<CacheFriendlySummaryOptions, \"sourceContext\" | \"requestOptions\">,\n): Promise<{ text: string; usage: Usage }> {\n\tconst maxTokens = Math.min(\n\t\tMath.floor(0.5 * reserveTokens),\n\t\tmodel.maxTokens > 0 ? model.maxTokens : Number.POSITIVE_INFINITY,\n\t);\n\tlet sourceContext = cacheFriendly?.sourceContext;\n\tif (\n\t\tsourceContext &&\n\t\t!cacheFriendlyContextFits(\n\t\t\tmodel,\n\t\t\tbuildSummarizationContext(SOURCE_CONTEXT_TURN_PREFIX_SUMMARIZATION_PROMPT, sourceContext),\n\t\t\tmaxTokens,\n\t\t)\n\t) {\n\t\tsourceContext = undefined;\n\t}\n\tlet promptText: string;\n\tif (sourceContext) {\n\t\tpromptText = SOURCE_CONTEXT_TURN_PREFIX_SUMMARIZATION_PROMPT;\n\t} else {\n\t\tconst providerMessages = transformContext ? await transformContext(messages, signal) : messages;\n\t\tconst llmMessages = convertToLlm(providerMessages);\n\t\tconst conversationText = serializeConversation(llmMessages);\n\t\tpromptText = `<conversation>\\n${conversationText}\\n</conversation>\\n\\n${TURN_PREFIX_SUMMARIZATION_PROMPT}`;\n\t}\n\n\tconst response = await completeSummarization(\n\t\tmodel,\n\t\tbuildSummarizationContext(promptText, sourceContext),\n\t\tcreateSummarizationOptions(\n\t\t\tmodel,\n\t\t\tmaxTokens,\n\t\t\tapiKey,\n\t\t\theaders,\n\t\t\tenv,\n\t\t\tsignal,\n\t\t\tthinkingLevel,\n\t\t\textraBody,\n\t\t\tsessionId,\n\t\t\tsourceContext ? cacheFriendly?.requestOptions : undefined,\n\t\t\tsourceContext ? \"short\" : undefined,\n\t\t),\n\t\tstreamFn,\n\t\tretry,\n\t\tcallbacks,\n\t);\n\n\tconst failure = getSummarizationFailure(response, \"Turn prefix summarization\");\n\tif (failure) throw new Error(failure);\n\tif (response.content.some((block) => block.type === \"toolCall\")) {\n\t\tthrow new Error(\"Turn prefix summarization attempted to call a tool\");\n\t}\n\n\treturn {\n\t\ttext: contentTextForSummary(response.content),\n\t\tusage: response.usage,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type IdealCompactionSettings } from "./ideal-compaction-settings.ts";
|
|
2
|
+
export interface CompactionSettings extends IdealCompactionSettings {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
reserveTokens: number;
|
|
5
|
+
keepRecentTokens: number;
|
|
6
|
+
speculativeEnabled?: boolean;
|
|
7
|
+
speculativeFraction?: number;
|
|
8
|
+
speculativeCooldownMs?: number;
|
|
9
|
+
restorationEnabled?: boolean;
|
|
10
|
+
restorationMaxItems?: number;
|
|
11
|
+
restorationMaxTokensPerItem?: number;
|
|
12
|
+
restorationMaxTotalTokens?: number;
|
|
13
|
+
restorationContextRatio?: number;
|
|
14
|
+
idleCompactionEnabled?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare const DEFAULT_COMPACTION_SETTINGS: CompactionSettings;
|
|
17
|
+
//# sourceMappingURL=compaction-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-settings.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compaction-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEjH,MAAM,WAAW,kBAAmB,SAAQ,uBAAuB;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,eAAO,MAAM,2BAA2B,EAAE,kBAczC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DEFAULT_IDEAL_COMPACTION_SETTINGS } from "./ideal-compaction-settings.js";
|
|
2
|
+
export const DEFAULT_COMPACTION_SETTINGS = {
|
|
3
|
+
enabled: true,
|
|
4
|
+
reserveTokens: 16384,
|
|
5
|
+
keepRecentTokens: 20000,
|
|
6
|
+
speculativeEnabled: true,
|
|
7
|
+
speculativeFraction: 0.75,
|
|
8
|
+
speculativeCooldownMs: 30000,
|
|
9
|
+
restorationEnabled: true,
|
|
10
|
+
restorationMaxItems: 10,
|
|
11
|
+
restorationMaxTokensPerItem: 5000,
|
|
12
|
+
restorationMaxTotalTokens: 50_000,
|
|
13
|
+
restorationContextRatio: 0.15,
|
|
14
|
+
idleCompactionEnabled: true,
|
|
15
|
+
...DEFAULT_IDEAL_COMPACTION_SETTINGS,
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=compaction-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-settings.js","sourceRoot":"","sources":["../../../src/core/compaction/compaction-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAgC,MAAM,gCAAgC,CAAC;AAiBjH,MAAM,CAAC,MAAM,2BAA2B,GAAuB;IAC9D,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,KAAK;IACpB,gBAAgB,EAAE,KAAK;IACvB,kBAAkB,EAAE,IAAI;IACxB,mBAAmB,EAAE,IAAI;IACzB,qBAAqB,EAAE,KAAK;IAC5B,kBAAkB,EAAE,IAAI;IACxB,mBAAmB,EAAE,EAAE;IACvB,2BAA2B,EAAE,IAAI;IACjC,yBAAyB,EAAE,MAAM;IACjC,uBAAuB,EAAE,IAAI;IAC7B,qBAAqB,EAAE,IAAI;IAC3B,GAAG,iCAAiC;CACpC,CAAC","sourcesContent":["import { DEFAULT_IDEAL_COMPACTION_SETTINGS, type IdealCompactionSettings } from \"./ideal-compaction-settings.ts\";\n\nexport interface CompactionSettings extends IdealCompactionSettings {\n\tenabled: boolean;\n\treserveTokens: number;\n\tkeepRecentTokens: number;\n\tspeculativeEnabled?: boolean;\n\tspeculativeFraction?: number;\n\tspeculativeCooldownMs?: number;\n\trestorationEnabled?: boolean;\n\trestorationMaxItems?: number;\n\trestorationMaxTokensPerItem?: number;\n\trestorationMaxTotalTokens?: number;\n\trestorationContextRatio?: number;\n\tidleCompactionEnabled?: boolean;\n}\n\nexport const DEFAULT_COMPACTION_SETTINGS: CompactionSettings = {\n\tenabled: true,\n\treserveTokens: 16384,\n\tkeepRecentTokens: 20000,\n\tspeculativeEnabled: true,\n\tspeculativeFraction: 0.75,\n\tspeculativeCooldownMs: 30000,\n\trestorationEnabled: true,\n\trestorationMaxItems: 10,\n\trestorationMaxTokensPerItem: 5000,\n\trestorationMaxTotalTokens: 50_000,\n\trestorationContextRatio: 0.15,\n\tidleCompactionEnabled: true,\n\t...DEFAULT_IDEAL_COMPACTION_SETTINGS,\n};\n"]}
|
|
@@ -8,8 +8,13 @@ import type { AgentMessage, StreamFn, ThinkingLevel } from "@earendil-works/pi-a
|
|
|
8
8
|
import { type RetryCallbacks, type RetryPolicy } from "@earendil-works/pi-ai";
|
|
9
9
|
import type { AssistantMessage, Context, Model, SimpleStreamOptions, Usage } from "@earendil-works/pi-ai/compat";
|
|
10
10
|
import { type SessionEntry } from "../session-manager.ts";
|
|
11
|
+
import type { CompactionSettings } from "./compaction-settings.ts";
|
|
12
|
+
export { type CompactionSettings, DEFAULT_COMPACTION_SETTINGS } from "./compaction-settings.ts";
|
|
11
13
|
import { type FileOperations } from "./utils.ts";
|
|
12
|
-
type SummarizationStreamFn = StreamFn;
|
|
14
|
+
export type SummarizationStreamFn = StreamFn;
|
|
15
|
+
type SummarizationOptions = SimpleStreamOptions & {
|
|
16
|
+
readonly env?: Record<string, string>;
|
|
17
|
+
};
|
|
13
18
|
/** Details stored in CompactionEntry.details for file tracking */
|
|
14
19
|
export interface CompactionDetails {
|
|
15
20
|
readFiles: string[];
|
|
@@ -26,20 +31,7 @@ export interface CompactionResult<T = unknown> {
|
|
|
26
31
|
/** Extension-specific data (e.g., ArtifactIndex, version markers for structured compaction) */
|
|
27
32
|
details?: T;
|
|
28
33
|
}
|
|
29
|
-
export
|
|
30
|
-
enabled: boolean;
|
|
31
|
-
reserveTokens: number;
|
|
32
|
-
keepRecentTokens: number;
|
|
33
|
-
speculativeEnabled?: boolean;
|
|
34
|
-
speculativeFraction?: number;
|
|
35
|
-
speculativeCooldownMs?: number;
|
|
36
|
-
restorationEnabled?: boolean;
|
|
37
|
-
restorationMaxItems?: number;
|
|
38
|
-
restorationMaxTokensPerItem?: number;
|
|
39
|
-
restorationMaxTotalTokens?: number;
|
|
40
|
-
restorationContextRatio?: number;
|
|
41
|
-
idleCompactionEnabled?: boolean;
|
|
42
|
-
}
|
|
34
|
+
export declare function combineUsage(first: Usage, second: Usage): Usage;
|
|
43
35
|
/** Active provider contexts and request settings used to preserve cacheable compaction prefixes. */
|
|
44
36
|
export interface CacheFriendlySummaryOptions {
|
|
45
37
|
/** Exact provider context prefix containing the history to summarize. */
|
|
@@ -49,7 +41,6 @@ export interface CacheFriendlySummaryOptions {
|
|
|
49
41
|
/** Provider request settings copied from the active agent request path. */
|
|
50
42
|
requestOptions?: Pick<SimpleStreamOptions, "sessionId" | "onPayload" | "onResponse" | "transport" | "thinkingBudgets" | "maxRetryDelayMs">;
|
|
51
43
|
}
|
|
52
|
-
export declare const DEFAULT_COMPACTION_SETTINGS: CompactionSettings;
|
|
53
44
|
/**
|
|
54
45
|
* Calculate total context tokens from usage.
|
|
55
46
|
* Uses the native totalTokens field when available, falls back to computing from components.
|
|
@@ -116,6 +107,7 @@ export interface CutPointResult {
|
|
|
116
107
|
*/
|
|
117
108
|
export declare function findCutPoint(entries: SessionEntry[], startIndex: number, endIndex: number, keepRecentTokens: number): CutPointResult;
|
|
118
109
|
export declare function getSummarizationFailure(response: AssistantMessage, label: string): string | undefined;
|
|
110
|
+
export declare function createSummarizationOptions(model: Model<any>, maxTokens: number, apiKey: string | undefined, headers: Record<string, string> | undefined, env: Record<string, string> | undefined, signal: AbortSignal | undefined, thinkingLevel: ThinkingLevel | undefined, extraBody?: Record<string, unknown>, sessionId?: string, requestOptions?: CacheFriendlySummaryOptions["requestOptions"], cacheRetention?: SimpleStreamOptions["cacheRetention"]): SummarizationOptions;
|
|
119
111
|
/**
|
|
120
112
|
* Shared choke point for every compaction/branch-summary summarization call. Wraps the
|
|
121
113
|
* single LLM call in {@link retryAssistantCall} so transient stream drops (e.g.
|
|
@@ -129,6 +121,10 @@ export declare function completeSummarization(model: Model<any>, context: Contex
|
|
|
129
121
|
* If previousSummary is provided, uses the update prompt to merge.
|
|
130
122
|
*/
|
|
131
123
|
export declare function generateSummary(currentMessages: AgentMessage[], model: Model<any>, reserveTokens: number, apiKey: string | undefined, headers?: Record<string, string>, signal?: AbortSignal, customInstructions?: string, previousSummary?: string, extraBody?: Record<string, unknown>, thinkingLevel?: ThinkingLevel, streamFn?: StreamFn, env?: Record<string, string>, transformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>, retry?: RetryPolicy, callbacks?: RetryCallbacks, sessionId?: string, cacheFriendly?: Pick<CacheFriendlySummaryOptions, "sourceContext" | "requestOptions">): Promise<string>;
|
|
124
|
+
/** Build a standalone summary request or append its instruction to an existing provider context. */
|
|
125
|
+
export declare function buildSummarizationContext(promptText: string, sourceContext?: Context): Context;
|
|
126
|
+
/** Whether the source context leaves room for the requested summary output and provider safety margin. */
|
|
127
|
+
export declare function cacheFriendlyContextFits(model: Model<any>, context: Context, maxTokens: number): boolean;
|
|
132
128
|
/** Generate or update a conversation summary and return its provider usage. */
|
|
133
129
|
export declare function generateSummaryWithUsage(currentMessages: AgentMessage[], model: Model<any>, reserveTokens: number, apiKey: string | undefined, headers?: Record<string, string>, signal?: AbortSignal, customInstructions?: string, previousSummary?: string, extraBody?: Record<string, unknown>, thinkingLevel?: ThinkingLevel, streamFn?: StreamFn, env?: Record<string, string>, transformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>, retry?: RetryPolicy, callbacks?: RetryCallbacks, sessionId?: string, cacheFriendly?: Pick<CacheFriendlySummaryOptions, "sourceContext" | "requestOptions">): Promise<{
|
|
134
130
|
text: string;
|
|
@@ -159,14 +155,5 @@ export interface CompactionPreparation {
|
|
|
159
155
|
settings: CompactionSettings;
|
|
160
156
|
}
|
|
161
157
|
export declare function prepareCompaction(pathEntries: SessionEntry[], settings: CompactionSettings, forceProgress?: boolean, allowSummaryOnly?: boolean): CompactionPreparation | undefined;
|
|
162
|
-
|
|
163
|
-
* Generate summaries for compaction using prepared data.
|
|
164
|
-
* Returns CompactionResult - SessionManager adds uuid/parentUuid when saving.
|
|
165
|
-
*
|
|
166
|
-
* @param preparation - Pre-calculated preparation from prepareCompaction()
|
|
167
|
-
* @param customInstructions - Optional custom focus for the summary
|
|
168
|
-
* @param cacheFriendly - Active provider contexts and request settings for cache-friendly summarization
|
|
169
|
-
*/
|
|
170
|
-
export declare function compact(preparation: CompactionPreparation, model: Model<any>, apiKey: string | undefined, headers?: Record<string, string>, customInstructions?: string, signal?: AbortSignal, extraBody?: Record<string, unknown>, thinkingLevel?: ThinkingLevel, streamFn?: StreamFn, env?: Record<string, string>, transformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>, retry?: RetryPolicy, callbacks?: RetryCallbacks, sessionId?: string, cacheFriendly?: CacheFriendlySummaryOptions): Promise<CompactionResult>;
|
|
171
|
-
export {};
|
|
158
|
+
export { compact } from "./compaction-execution.ts";
|
|
172
159
|
//# sourceMappingURL=compaction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compaction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAA8B,MAAM,uBAAuB,CAAC;AAC1G,OAAO,KAAK,EACX,gBAAgB,EAChB,OAAO,EAEP,KAAK,EACL,mBAAmB,EAEnB,KAAK,EACL,MAAM,8BAA8B,CAAC;AAItC,OAAO,EAGN,KAAK,YAAY,EAEjB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,9 @@ import { streamSimple } from "@earendil-works/pi-ai/compat";
|
|
|
9
9
|
import { estimateContextTokens as estimateProviderContextTokens } from "@earendil-works/pi-ai/utils/estimate";
|
|
10
10
|
import { convertToLlm, filterContextExcludedMessages, isContextExcludedCustomMessage } from "../messages.js";
|
|
11
11
|
import { buildSessionContext, sessionEntryToContextMessages, } from "../session-manager.js";
|
|
12
|
+
export { DEFAULT_COMPACTION_SETTINGS } from "./compaction-settings.js";
|
|
12
13
|
import { consumeStreamWithIdleTimeout, DEFAULT_SUMMARIZATION_IDLE_TIMEOUT_MS, DEFAULT_SUMMARIZATION_MAX_DURATION_MS, } from "./stream-watchdog.js";
|
|
13
|
-
import {
|
|
14
|
+
import { contentTextForSummary, createFileOps, extractFileOpsFromMessage, SUMMARIZATION_SYSTEM_PROMPT, serializeConversation, } from "./utils.js";
|
|
14
15
|
function getAnthropicSummarizationFallback(model) {
|
|
15
16
|
if (model.provider !== "anthropic" || model.api !== "anthropic-messages") {
|
|
16
17
|
return undefined;
|
|
@@ -84,7 +85,7 @@ function collectSourceMessages(entries, startIndex, endIndex, previousCompaction
|
|
|
84
85
|
}
|
|
85
86
|
return messages;
|
|
86
87
|
}
|
|
87
|
-
function combineUsage(first, second) {
|
|
88
|
+
export function combineUsage(first, second) {
|
|
88
89
|
return {
|
|
89
90
|
input: first.input + second.input,
|
|
90
91
|
output: first.output + second.output,
|
|
@@ -106,20 +107,6 @@ function combineUsage(first, second) {
|
|
|
106
107
|
},
|
|
107
108
|
};
|
|
108
109
|
}
|
|
109
|
-
export const DEFAULT_COMPACTION_SETTINGS = {
|
|
110
|
-
enabled: true,
|
|
111
|
-
reserveTokens: 16384,
|
|
112
|
-
keepRecentTokens: 20000,
|
|
113
|
-
speculativeEnabled: true,
|
|
114
|
-
speculativeFraction: 0.75,
|
|
115
|
-
speculativeCooldownMs: 30000,
|
|
116
|
-
restorationEnabled: true,
|
|
117
|
-
restorationMaxItems: 10,
|
|
118
|
-
restorationMaxTokensPerItem: 5000,
|
|
119
|
-
restorationMaxTotalTokens: 50_000,
|
|
120
|
-
restorationContextRatio: 0.15,
|
|
121
|
-
idleCompactionEnabled: true,
|
|
122
|
-
};
|
|
123
110
|
// ============================================================================
|
|
124
111
|
// Token calculation
|
|
125
112
|
// ============================================================================
|
|
@@ -518,7 +505,7 @@ ${UPDATE_SUMMARIZATION_INSTRUCTIONS}`;
|
|
|
518
505
|
const SOURCE_CONTEXT_UPDATE_SUMMARIZATION_PROMPT = `The messages above contain an existing structured summary of earlier conversation history followed by NEW conversation messages.
|
|
519
506
|
|
|
520
507
|
${UPDATE_SUMMARIZATION_INSTRUCTIONS}`;
|
|
521
|
-
function createSummarizationOptions(model, maxTokens, apiKey, headers, env, signal, thinkingLevel, extraBody, sessionId, requestOptions, cacheRetention) {
|
|
508
|
+
export function createSummarizationOptions(model, maxTokens, apiKey, headers, env, signal, thinkingLevel, extraBody, sessionId, requestOptions, cacheRetention) {
|
|
522
509
|
const options = {
|
|
523
510
|
...requestOptions,
|
|
524
511
|
maxTokens,
|
|
@@ -626,7 +613,7 @@ export async function generateSummary(currentMessages, model, reserveTokens, api
|
|
|
626
613
|
return (await generateSummaryWithUsage(currentMessages, model, reserveTokens, apiKey, headers, signal, customInstructions, previousSummary, extraBody, thinkingLevel, streamFn, env, transformContext, retry, callbacks, sessionId, cacheFriendly)).text;
|
|
627
614
|
}
|
|
628
615
|
/** Build a standalone summary request or append its instruction to an existing provider context. */
|
|
629
|
-
function buildSummarizationContext(promptText, sourceContext) {
|
|
616
|
+
export function buildSummarizationContext(promptText, sourceContext) {
|
|
630
617
|
const instructionMessage = {
|
|
631
618
|
role: "user",
|
|
632
619
|
content: [{ type: "text", text: promptText }],
|
|
@@ -649,7 +636,7 @@ function buildSummarizationContext(promptText, sourceContext) {
|
|
|
649
636
|
*/
|
|
650
637
|
const CACHE_FRIENDLY_CONTEXT_SAFETY_TOKENS = 4096;
|
|
651
638
|
/** Whether the source context leaves room for the requested summary output and provider safety margin. */
|
|
652
|
-
function cacheFriendlyContextFits(model, context, maxTokens) {
|
|
639
|
+
export function cacheFriendlyContextFits(model, context, maxTokens) {
|
|
653
640
|
return (model.contextWindow <= 0 ||
|
|
654
641
|
estimateProviderContextTokens(context).tokens + maxTokens + CACHE_FRIENDLY_CONTEXT_SAFETY_TOKENS <=
|
|
655
642
|
model.contextWindow);
|
|
@@ -790,121 +777,5 @@ export function prepareCompaction(pathEntries, settings, forceProgress = false,
|
|
|
790
777
|
// ============================================================================
|
|
791
778
|
// Main compaction function
|
|
792
779
|
// ============================================================================
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
Summarize the prefix to provide context for the retained suffix:
|
|
796
|
-
|
|
797
|
-
## Original Request
|
|
798
|
-
[What did the user ask for in this turn?]
|
|
799
|
-
|
|
800
|
-
## Early Progress
|
|
801
|
-
- [Key decisions and work done in the prefix]
|
|
802
|
-
|
|
803
|
-
## Context for Suffix
|
|
804
|
-
- [Information needed to understand the retained recent work]
|
|
805
|
-
|
|
806
|
-
Be concise. Focus on what's needed to understand the kept suffix.`;
|
|
807
|
-
const SOURCE_CONTEXT_TURN_PREFIX_SUMMARIZATION_PROMPT = `The final turn in the source conversation was too large to keep in full. Its SUFFIX (recent work) is retained.
|
|
808
|
-
|
|
809
|
-
The source conversation may also contain complete earlier turns for background. Summarize only the final, incomplete turn. It begins with the last user-role request before this instruction. Do not summarize earlier turns except for details needed to understand this final turn's prefix.
|
|
810
|
-
|
|
811
|
-
Summarize the prefix to provide context for the retained suffix:
|
|
812
|
-
|
|
813
|
-
## Original Request
|
|
814
|
-
[What did the user ask for in this turn?]
|
|
815
|
-
|
|
816
|
-
## Early Progress
|
|
817
|
-
- [Key decisions and work done in the prefix]
|
|
818
|
-
|
|
819
|
-
## Context for Suffix
|
|
820
|
-
- [Information needed to understand the retained recent work]
|
|
821
|
-
|
|
822
|
-
Be concise. Focus on what's needed to understand the kept suffix.`;
|
|
823
|
-
/**
|
|
824
|
-
* Generate summaries for compaction using prepared data.
|
|
825
|
-
* Returns CompactionResult - SessionManager adds uuid/parentUuid when saving.
|
|
826
|
-
*
|
|
827
|
-
* @param preparation - Pre-calculated preparation from prepareCompaction()
|
|
828
|
-
* @param customInstructions - Optional custom focus for the summary
|
|
829
|
-
* @param cacheFriendly - Active provider contexts and request settings for cache-friendly summarization
|
|
830
|
-
*/
|
|
831
|
-
export async function compact(preparation, model, apiKey, headers, customInstructions, signal, extraBody, thinkingLevel, streamFn, env, transformContext, retry, callbacks, sessionId, cacheFriendly) {
|
|
832
|
-
const { firstKeptEntryId, messagesToSummarize, turnPrefixMessages, isSplitTurn, tokensBefore, previousSummary, fileOps, settings, } = preparation;
|
|
833
|
-
// Generate summaries and merge into one
|
|
834
|
-
let summary;
|
|
835
|
-
let summaryUsage;
|
|
836
|
-
if (isSplitTurn && turnPrefixMessages.length > 0) {
|
|
837
|
-
let historyText = "No prior history.";
|
|
838
|
-
let historyUsage;
|
|
839
|
-
if (messagesToSummarize.length > 0) {
|
|
840
|
-
const historyResult = await generateSummaryWithUsage(messagesToSummarize, model, settings.reserveTokens, apiKey, headers, signal, customInstructions, previousSummary, extraBody, thinkingLevel, streamFn, env, transformContext, retry, callbacks, sessionId, {
|
|
841
|
-
sourceContext: cacheFriendly?.sourceContext,
|
|
842
|
-
requestOptions: cacheFriendly?.requestOptions,
|
|
843
|
-
});
|
|
844
|
-
historyText = historyResult.text;
|
|
845
|
-
historyUsage = historyResult.usage;
|
|
846
|
-
}
|
|
847
|
-
const turnPrefixResult = await generateTurnPrefixSummary(turnPrefixMessages, model, settings.reserveTokens, apiKey, headers, env, signal, extraBody, thinkingLevel, streamFn, transformContext, retry, callbacks, sessionId, {
|
|
848
|
-
sourceContext: cacheFriendly?.turnPrefixSourceContext,
|
|
849
|
-
requestOptions: cacheFriendly?.requestOptions,
|
|
850
|
-
});
|
|
851
|
-
// Merge into single summary
|
|
852
|
-
summary = `${historyText}\n\n---\n\n**Turn Context (split turn):**\n\n${turnPrefixResult.text}`;
|
|
853
|
-
summaryUsage = historyUsage ? combineUsage(historyUsage, turnPrefixResult.usage) : turnPrefixResult.usage;
|
|
854
|
-
}
|
|
855
|
-
else {
|
|
856
|
-
// Just generate history summary
|
|
857
|
-
const result = await generateSummaryWithUsage(messagesToSummarize, model, settings.reserveTokens, apiKey, headers, signal, customInstructions, previousSummary, extraBody, thinkingLevel, streamFn, env, transformContext, retry, callbacks, sessionId, {
|
|
858
|
-
sourceContext: cacheFriendly?.sourceContext,
|
|
859
|
-
requestOptions: cacheFriendly?.requestOptions,
|
|
860
|
-
});
|
|
861
|
-
summary = result.text;
|
|
862
|
-
summaryUsage = result.usage;
|
|
863
|
-
}
|
|
864
|
-
// Compute file lists and append to summary
|
|
865
|
-
const { readFiles, modifiedFiles } = computeFileLists(fileOps);
|
|
866
|
-
summary += formatFileOperations(readFiles, modifiedFiles);
|
|
867
|
-
if (!firstKeptEntryId) {
|
|
868
|
-
throw new Error("First kept entry has no UUID - session may need migration");
|
|
869
|
-
}
|
|
870
|
-
return {
|
|
871
|
-
summary,
|
|
872
|
-
firstKeptEntryId,
|
|
873
|
-
tokensBefore,
|
|
874
|
-
usage: summaryUsage,
|
|
875
|
-
details: { readFiles, modifiedFiles },
|
|
876
|
-
};
|
|
877
|
-
}
|
|
878
|
-
/**
|
|
879
|
-
* Generate a summary for a turn prefix (when splitting a turn).
|
|
880
|
-
*/
|
|
881
|
-
async function generateTurnPrefixSummary(messages, model, reserveTokens, apiKey, headers, env, signal, extraBody, thinkingLevel, streamFn, transformContext, retry, callbacks, sessionId, cacheFriendly) {
|
|
882
|
-
const maxTokens = Math.min(Math.floor(0.5 * reserveTokens), model.maxTokens > 0 ? model.maxTokens : Number.POSITIVE_INFINITY);
|
|
883
|
-
let sourceContext = cacheFriendly?.sourceContext;
|
|
884
|
-
if (sourceContext &&
|
|
885
|
-
!cacheFriendlyContextFits(model, buildSummarizationContext(SOURCE_CONTEXT_TURN_PREFIX_SUMMARIZATION_PROMPT, sourceContext), maxTokens)) {
|
|
886
|
-
sourceContext = undefined;
|
|
887
|
-
}
|
|
888
|
-
let promptText;
|
|
889
|
-
if (sourceContext) {
|
|
890
|
-
promptText = SOURCE_CONTEXT_TURN_PREFIX_SUMMARIZATION_PROMPT;
|
|
891
|
-
}
|
|
892
|
-
else {
|
|
893
|
-
const providerMessages = transformContext ? await transformContext(messages, signal) : messages;
|
|
894
|
-
const llmMessages = convertToLlm(providerMessages);
|
|
895
|
-
const conversationText = serializeConversation(llmMessages);
|
|
896
|
-
promptText = `<conversation>\n${conversationText}\n</conversation>\n\n${TURN_PREFIX_SUMMARIZATION_PROMPT}`;
|
|
897
|
-
}
|
|
898
|
-
const response = await completeSummarization(model, buildSummarizationContext(promptText, sourceContext), createSummarizationOptions(model, maxTokens, apiKey, headers, env, signal, thinkingLevel, extraBody, sessionId, sourceContext ? cacheFriendly?.requestOptions : undefined, sourceContext ? "short" : undefined), streamFn, retry, callbacks);
|
|
899
|
-
const failure = getSummarizationFailure(response, "Turn prefix summarization");
|
|
900
|
-
if (failure)
|
|
901
|
-
throw new Error(failure);
|
|
902
|
-
if (response.content.some((block) => block.type === "toolCall")) {
|
|
903
|
-
throw new Error("Turn prefix summarization attempted to call a tool");
|
|
904
|
-
}
|
|
905
|
-
return {
|
|
906
|
-
text: contentTextForSummary(response.content),
|
|
907
|
-
usage: response.usage,
|
|
908
|
-
};
|
|
909
|
-
}
|
|
780
|
+
export { compact } from "./compaction-execution.js";
|
|
910
781
|
//# sourceMappingURL=compaction.js.map
|