@code-yeongyu/senpi 2026.7.10 → 2026.7.11
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 +62 -0
- package/README.md +4 -2
- package/dist/core/extensions/builtin/bash-timeout/timeout.js +2 -2
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +10 -1
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/store.js +88 -3
- package/dist/core/extensions/builtin/goal/store.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +83 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.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 +6 -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/terminal/notify.d.ts +3 -3
- package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.js +7 -4
- package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +5 -3
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.js +32 -16
- package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js +10 -4
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todowrite.js +5 -8
- package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +5 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +5 -8
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +22 -3
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/keybindings.d.ts +8 -3
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +7 -3
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -6
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +19 -6
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -3
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +2 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +1 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +4 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +9 -2
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +1 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +1 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution-fallback.d.ts +6 -0
- package/dist/modes/interactive/components/tool-execution-fallback.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution-fallback.js +40 -0
- package/dist/modes/interactive/components/tool-execution-fallback.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution-images.d.ts +23 -0
- package/dist/modes/interactive/components/tool-execution-images.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution-images.js +104 -0
- package/dist/modes/interactive/components/tool-execution-images.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution-renderer.d.ts +28 -0
- package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution-renderer.js +135 -0
- package/dist/modes/interactive/components/tool-execution-renderer.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution-types.d.ts +23 -0
- package/dist/modes/interactive/components/tool-execution-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution-types.js +2 -0
- package/dist/modes/interactive/components/tool-execution-types.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +13 -39
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +51 -294
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-renderer-boundary.d.ts +17 -0
- package/dist/modes/interactive/components/tool-renderer-boundary.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-renderer-boundary.js +75 -0
- package/dist/modes/interactive/components/tool-renderer-boundary.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +5 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +50 -17
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +44 -40
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +1 -0
- package/dist/modes/interactive/theme/light.json +1 -0
- package/dist/modes/interactive/theme/theme-schema.json +6 -2
- package/dist/modes/interactive/theme/theme.d.ts +3 -2
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +11 -4
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts +1 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +13 -0
- package/dist/utils/clipboard.js.map +1 -1
- package/docs/custom-provider.md +4 -3
- package/docs/extensions.md +140 -1
- package/docs/keybindings.md +1 -0
- package/docs/models.md +45 -4
- package/docs/providers.md +3 -0
- package/docs/quickstart.md +1 -1
- package/docs/rpc.md +2 -2
- package/docs/sdk.md +1 -1
- package/docs/settings.md +3 -3
- package/docs/themes.md +5 -3
- package/docs/tui.md +1 -1
- package/docs/usage.md +2 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +3 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +7 -7
- package/node_modules/@code-yeongyu/senpi-codemode/src/completion/tool-bridge.ts +3 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +69 -8
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +39 -13
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +191 -148
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker-entry.js +23 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker.ts +4 -175
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +38 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/run-queue.ts +82 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +7 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-host.ts +117 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +32 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +231 -199
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/process.ts +119 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +237 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-contract.ts +22 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +214 -189
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-process.ts +174 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-queue.ts +100 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-run.ts +98 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +205 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +208 -203
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +215 -25
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +1 -0
- package/node_modules/@earendil-works/pi-agent-core/README.md +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +4 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/README.md +4 -2
- 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 +89 -40
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +7 -7
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +10 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +3 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +35 -4
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +8 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +4 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +483 -61
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +13 -4
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts +62 -5
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js +32 -20
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts +11 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js +6 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts +7 -8
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js +20 -21
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts +11 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js +6 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js +9 -6
- package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +100 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +64 -5
- package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts +56 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js +20 -9
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts +77 -8
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js +37 -24
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +80 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +64 -8
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +25 -22
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +64 -79
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +45 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +43 -7
- package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +30 -7
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js +36 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/deferred-tools.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.d.ts +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js +35 -14
- package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.js +2 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +2 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js +2 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/keys.js +6 -5
- package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts +0 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +0 -9
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-text.d.ts +4 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal-text.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal-text.js +18 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal-text.js.map +1 -0
- package/node_modules/@earendil-works/pi-tui/package.json +2 -2
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,67 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2026.7.11] - 2026-07-11
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Added cache-friendly dynamic tool loading for extension tools activated by tool results. Supported Anthropic and OpenAI Responses models load definitions where they become available, preserving the cached prompt prefix. See [Dynamic Tool Loading](docs/extensions.md#dynamic-tool-loading) ([#6474](https://github.com/earendil-works/pi-mono/pull/6474)).
|
|
8
|
+
- Added inherited native `xhigh` and `max` thinking levels for Claude Fable 5 across all generated provider catalogs ([#6490](https://github.com/earendil-works/pi-mono/pull/6490) by [@davidbrai](https://github.com/davidbrai)).
|
|
9
|
+
- Added `Ctrl+X` to copy the last assistant message, or the selected message in `/tree`.
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- Fixed inherited OpenRouter model context windows to use the top provider's actual context length ([#6481](https://github.com/earendil-works/pi-mono/pull/6481) by [@davidbrai](https://github.com/davidbrai)).
|
|
16
|
+
- Fixed `Ctrl+V` to paste clipboard text when the pasteboard does not contain an image.
|
|
17
|
+
- Fixed `/login amazon-bedrock` to prompt for and save a Bedrock API key instead of only displaying ambient AWS credential setup instructions.
|
|
18
|
+
|
|
19
|
+
### Removed
|
|
20
|
+
|
|
21
|
+
## [0.80.6] - 2026-07-09
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- Added a `gpt-5.6` system prompt preset covering the whole GPT-5.6 series (`gpt-5.6`, `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`), tuned per the GPT-5.6 prompting guide: a shorter outcome-first full-core rewrite with prioritization-based style, a compact authorization policy, and tool-loop stopping conditions.
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- Exposed the active terminal image protocol to extension tool renderers so custom renderers can avoid duplicate image fallbacks.
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- Prevented untrusted image MIME labels from injecting terminal control sequences through custom renderer fallbacks.
|
|
34
|
+
- Fixed goal persistence to use atomic file replacement and narrowly recover the observed stale closing-brace
|
|
35
|
+
corruption, preventing session resume crashes without accepting other malformed JSON.
|
|
36
|
+
|
|
37
|
+
- Fixed `bash_output` waits ignoring turn cancellation and accepting unbounded model-supplied timeouts; waits now release without killing the background terminal and individual polls are capped at five minutes.
|
|
38
|
+
- Fixed `bash_output` waiting on `wait_for` even when the pattern had already arrived in unread output before the waiter was registered.
|
|
39
|
+
- Fixed emergency context pruning to reserve a model-aware output allowance without collapsing the usable prompt budget, preventing oversized tool results from exceeding new-model input limits.
|
|
40
|
+
- Fixed invalid extension tool renderers displaying `[render error: Box]` instead of fallback rendering.
|
|
41
|
+
|
|
42
|
+
### Removed
|
|
43
|
+
|
|
44
|
+
## [2026.7.10-2] - 2026-07-10
|
|
45
|
+
|
|
46
|
+
### Added
|
|
47
|
+
|
|
48
|
+
- Added the opt-in `max` thinking level across CLI, SDK, RPC, model selection, settings, and themes.
|
|
49
|
+
- Added request-wide input-token pricing tiers to custom model costs in `models.json`, `modelOverrides`, and extension-registered providers.
|
|
50
|
+
- Added `~` expansion for the `shellPath` setting ([#6470](https://github.com/earendil-works/pi/pull/6470) by [@aaronkyriesenbach](https://github.com/aaronkyriesenbach)).
|
|
51
|
+
|
|
52
|
+
### Changed
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
|
|
56
|
+
- Fixed inherited post-compaction output-token budgeting to ignore stale assistant usage from before the compaction boundary.
|
|
57
|
+
- Fixed inherited GPT-5.4, GPT-5.5, and GPT-5.6 long-context pricing metadata, while excluding the nonexistent bare `gpt-5.6` OpenAI/Azure alias.
|
|
58
|
+
- Fixed inherited Anthropic message conversion to preserve thinking blocks with empty thinking text but a valid signature instead of dropping them ([#6457](https://github.com/earendil-works/pi/pull/6457) by [@davidbrai](https://github.com/davidbrai)).
|
|
59
|
+
- Fixed inherited Anthropic replay to send the normalized thinking signature value after signature narrowing.
|
|
60
|
+
- Fixed inherited OpenAI-compatible simple streams to preserve provider-specific `max` reasoning mappings instead of clamping them.
|
|
61
|
+
- Fixed inherited same-model signed thinking replay to keep non-empty signed blocks only when provider state must be replayed, while preserving empty opaque signed blocks.
|
|
62
|
+
|
|
63
|
+
### Removed
|
|
64
|
+
|
|
3
65
|
## [2026.7.10] - 2026-07-10
|
|
4
66
|
|
|
5
67
|
### Added
|
package/README.md
CHANGED
|
@@ -162,7 +162,7 @@ The editor can be temporarily replaced by other UI, like built-in `/settings` or
|
|
|
162
162
|
| Path completion | Tab to complete paths |
|
|
163
163
|
| Multi-line | Shift+Enter (or Ctrl+Enter on Windows Terminal) |
|
|
164
164
|
| External editor | Ctrl+G opens `externalEditor`, `$VISUAL`, `$EDITOR`, Notepad on Windows, or `nano` elsewhere |
|
|
165
|
-
|
|
|
165
|
+
| Clipboard | Ctrl+V to paste an image or text (Alt+V on Windows), or drag images onto terminal |
|
|
166
166
|
| Bash commands | `!command` runs and sends output to LLM, `!!command` runs without sending |
|
|
167
167
|
|
|
168
168
|
Standard editing keybindings for delete word, undo, etc. See [docs/keybindings.md](docs/keybindings.md).
|
|
@@ -212,6 +212,7 @@ See `/hotkeys` for the full list. Customize via `~/.pi/agent/keybindings.json`.
|
|
|
212
212
|
| Shift+Tab | Cycle thinking level |
|
|
213
213
|
| Ctrl+O | Collapse/expand tool output |
|
|
214
214
|
| Ctrl+T | Collapse/expand thinking blocks |
|
|
215
|
+
| Ctrl+X | Copy the last assistant message |
|
|
215
216
|
|
|
216
217
|
### Message Queue
|
|
217
218
|
|
|
@@ -255,6 +256,7 @@ Use `/session` in interactive mode to see the current session ID before reusing
|
|
|
255
256
|
|
|
256
257
|
- Search by typing, fold/unfold and jump between branches with Ctrl+←/Ctrl+→ or Alt+←/Alt+→, page with ←/→
|
|
257
258
|
- Filter modes (Ctrl+O): default → no-tools → user-only → labeled-only → all
|
|
259
|
+
- Press Ctrl+X to copy the selected message
|
|
258
260
|
- Press Shift+L to label entries as bookmarks and Shift+T to toggle label timestamps
|
|
259
261
|
|
|
260
262
|
**`/fork`** - Create a new session file from a previous user message on the active branch. Opens a selector, copies the active path up to that point, and places the selected prompt in the editor for modification.
|
|
@@ -594,7 +596,7 @@ cat README.md | pi -p "Summarize this text"
|
|
|
594
596
|
| `--provider <name>` | Provider (anthropic, openai, google, etc.) |
|
|
595
597
|
| `--model <pattern>` | Model pattern or ID (supports `provider/id` and optional `:<thinking>`) |
|
|
596
598
|
| `--api-key <key>` | API key (overrides env vars) |
|
|
597
|
-
| `--thinking <level>` | `off`, `minimal`, `low`, `medium`, `high`, `xhigh` |
|
|
599
|
+
| `--thinking <level>` | `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max` |
|
|
598
600
|
| `--models <patterns>` | Comma-separated patterns for Ctrl+P cycling |
|
|
599
601
|
| `--list-models [search]` | List available models |
|
|
600
602
|
|
|
@@ -9,8 +9,8 @@ function parsePositiveInt(value) {
|
|
|
9
9
|
return parsed;
|
|
10
10
|
}
|
|
11
11
|
export function resolveBashTimeoutDefaults(env) {
|
|
12
|
-
const defaultSeconds = parsePositiveInt(env
|
|
13
|
-
const rawMax = parsePositiveInt(env
|
|
12
|
+
const defaultSeconds = parsePositiveInt(env["PI_BASH_DEFAULT_TIMEOUT_SECONDS"]) ?? BASH_DEFAULT_TIMEOUT_SECONDS;
|
|
13
|
+
const rawMax = parsePositiveInt(env["PI_BASH_MAX_TIMEOUT_SECONDS"]) ?? BASH_MAX_TIMEOUT_SECONDS;
|
|
14
14
|
const maxSeconds = Math.max(rawMax, defaultSeconds);
|
|
15
15
|
return { defaultSeconds, maxSeconds };
|
|
16
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/bash-timeout/timeout.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAChD,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAS5C,SAAS,gBAAgB,CAAC,KAAyB;IAClD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9D,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAY;IACtD,MAAM,cAAc,GAAG,gBAAgB,CAAC,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/bash-timeout/timeout.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAChD,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAS5C,SAAS,gBAAgB,CAAC,KAAyB;IAClD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9D,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAY;IACtD,MAAM,cAAc,GAAG,gBAAgB,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,IAAI,4BAA4B,CAAC;IAChH,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,IAAI,wBAAwB,CAAC;IAChG,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACpD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAC/B,KAAa,EACb,QAA6B;IAE7B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA6B;IACnE,MAAM,OAAO,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,CAAC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;IAC1G,OAAO,4IAA4I,QAAQ,CAAC,cAAc,MAAM,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,6FAA6F,QAAQ,CAAC,UAAU,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,4aAA4a,CAAC;AAChxB,CAAC","sourcesContent":["export const BASH_DEFAULT_TIMEOUT_SECONDS = 120;\nexport const BASH_MAX_TIMEOUT_SECONDS = 600;\n\nexport interface BashTimeoutDefaults {\n\tdefaultSeconds: number;\n\tmaxSeconds: number;\n}\n\ntype EnvLike = Record<string, string | undefined>;\n\nfunction parsePositiveInt(value: string | undefined): number | undefined {\n\tif (!value) return undefined;\n\tconst parsed = Number.parseInt(value, 10);\n\tif (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n\treturn parsed;\n}\n\nexport function resolveBashTimeoutDefaults(env: EnvLike): BashTimeoutDefaults {\n\tconst defaultSeconds = parsePositiveInt(env[\"PI_BASH_DEFAULT_TIMEOUT_SECONDS\"]) ?? BASH_DEFAULT_TIMEOUT_SECONDS;\n\tconst rawMax = parsePositiveInt(env[\"PI_BASH_MAX_TIMEOUT_SECONDS\"]) ?? BASH_MAX_TIMEOUT_SECONDS;\n\tconst maxSeconds = Math.max(rawMax, defaultSeconds);\n\treturn { defaultSeconds, maxSeconds };\n}\n\nexport interface BashToolInputLike {\n\tcommand: string;\n\ttimeout?: number;\n\t[key: string]: unknown;\n}\n\nexport function applyBashTimeout<TInput extends BashToolInputLike>(\n\tinput: TInput,\n\tdefaults: BashTimeoutDefaults,\n): TInput {\n\tconst current = input.timeout;\n\tif (current === undefined || current <= 0) {\n\t\treturn { ...input, timeout: defaults.defaultSeconds };\n\t}\n\treturn input;\n}\n\nexport function buildBashTimeoutPrompt(defaults: BashTimeoutDefaults): string {\n\tconst minutes = (seconds: number): string => (seconds % 60 === 0 ? `${seconds / 60} min` : `${seconds}s`);\n\treturn `\\n## Bash Tool Timeout Policy\\n\\nThe \\`bash\\` tool enforces timeouts even when you omit the \\`timeout\\` parameter:\\n\\n- Default timeout: ${defaults.defaultSeconds}s (${minutes(defaults.defaultSeconds)}). Applied automatically when you do not set \\`timeout\\`.\\n- Recommended maximum timeout: ${defaults.maxSeconds}s (${minutes(defaults.maxSeconds)}). Explicit \\`timeout\\` values are preserved because different hosts may use different timeout units.\\n- For long-running commands (builds, installs, test suites), set an explicit \\`timeout\\` that fits the workload. Do not assume commands run forever.\\n- For commands that legitimately need to run beyond the recommended maximum, run them in the background via tmux or a similar mechanism instead of relying on bash timeout.\\n`;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAgB,YAAY,EAA+C,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAgB,YAAY,EAA+C,MAAM,gBAAgB,CAAC;AA+I9G,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAmTlE"}
|
|
@@ -17,6 +17,7 @@ const EMERGENCY_COMPACTION_INSTRUCTIONS = "EMERGENCY: hard context limit reached
|
|
|
17
17
|
const PROACTIVE_COMPACTION_INSTRUCTIONS = "Proactively compact before the next agent turn.";
|
|
18
18
|
const MAX_PENDING_METADATA = 8;
|
|
19
19
|
const IMAGE_PROMPT_TOKEN_ESTIMATE = 1_200;
|
|
20
|
+
const MAX_OUTPUT_RESERVE_RATIO = 0.5;
|
|
20
21
|
function approxTokens(text) {
|
|
21
22
|
return Math.ceil(text.length / 4);
|
|
22
23
|
}
|
|
@@ -26,6 +27,13 @@ function isOpenAiResponsesModel(model) {
|
|
|
26
27
|
function estimatePendingPromptTokens(event) {
|
|
27
28
|
return approxTokens(event.prompt ?? "") + (event.images?.length ?? 0) * IMAGE_PROMPT_TOKEN_ESTIMATE;
|
|
28
29
|
}
|
|
30
|
+
function getPromptContextWindow(contextWindow, maxTokens) {
|
|
31
|
+
if (typeof maxTokens !== "number" || !Number.isFinite(maxTokens) || maxTokens <= 0 || contextWindow <= 0) {
|
|
32
|
+
return contextWindow;
|
|
33
|
+
}
|
|
34
|
+
const outputReserve = Math.min(maxTokens, Math.floor(contextWindow * MAX_OUTPUT_RESERVE_RATIO));
|
|
35
|
+
return contextWindow - outputReserve;
|
|
36
|
+
}
|
|
29
37
|
function withAdditionalTokens(usage, additionalTokens) {
|
|
30
38
|
if (usage.tokens === null || additionalTokens <= 0)
|
|
31
39
|
return usage;
|
|
@@ -296,6 +304,7 @@ export default function compactionExtension(pi) {
|
|
|
296
304
|
pi.on("context", (event, ctx) => {
|
|
297
305
|
const usage = ctx.getContextUsage();
|
|
298
306
|
const contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;
|
|
307
|
+
const promptContextWindow = getPromptContextWindow(contextWindow, ctx.model?.maxTokens);
|
|
299
308
|
const sourceMessages = shouldApplyContextReduction({
|
|
300
309
|
usageTokens: usage?.tokens ?? null,
|
|
301
310
|
contextWindow,
|
|
@@ -303,7 +312,7 @@ export default function compactionExtension(pi) {
|
|
|
303
312
|
})
|
|
304
313
|
? reduceContextMessages(event.messages, BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages
|
|
305
314
|
: event.messages;
|
|
306
|
-
const emergency = hardLimitEmergencyPrune(sourceMessages,
|
|
315
|
+
const emergency = hardLimitEmergencyPrune(sourceMessages, promptContextWindow);
|
|
307
316
|
return { messages: repairOrphanedToolResults(convertToLlm(emergency.messages)) };
|
|
308
317
|
});
|
|
309
318
|
pi.on("before_provider_request", (event, ctx) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { CompactionResult } from \"../../../compaction/index.ts\";\nimport { convertToLlm } from \"../../../messages.ts\";\nimport type { CompactionEntry } from \"../../../session-manager.ts\";\nimport type { ContextUsage, ExtensionAPI, ExtensionContext, SessionBeforeCompactEvent } from \"../../types.ts\";\nimport * as checkpointState from \"./checkpoint-state.ts\";\nimport * as breaker from \"./circuit-breaker.ts\";\nimport {\n\tBUILTIN_CONTEXT_REDUCTION_OPTIONS,\n\treduceContextMessages,\n\tshouldApplyContextReduction,\n} from \"./context-reduction.ts\";\nimport {\n\tcreateDegradationMonitorState,\n\thandleMessageEnd,\n\thandleTurnEnd,\n\tRECOVERY_INSTRUCTIONS,\n\tresetOnSessionCompact,\n} from \"./degradation-monitor.ts\";\nimport {\n\trewriteOpenAiPayloadWithRemoteCompaction,\n\trunOpenAiRemoteCompaction,\n\tSENPI_COMPACTION_EVENT,\n} from \"./openai-remote.ts\";\nimport * as cap from \"./per-turn-cap.ts\";\nimport * as policy from \"./policy.ts\";\nimport { repairOrphanedToolResults } from \"./repair-tool-pairs.ts\";\nimport * as restoration from \"./restoration-tracker.ts\";\nimport {\n\tapplyGeneratedCompaction,\n\tcreateSpeculativeCompactionSnapshot,\n\tgetPromptVariant,\n\thardLimitEmergencyPrune,\n\trunExtensionCompaction,\n\ttype SpeculativeCompactionResult,\n\ttype SpeculativeCompactionSnapshot,\n} from \"./speculative.ts\";\nimport { type CompactionExtensionState, createInitialState, resetTurnCounter } from \"./state.ts\";\nimport * as todoBridge from \"./todo-bridge.ts\";\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst EMERGENCY_COMPACTION_INSTRUCTIONS =\n\t\"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.\";\nconst PROACTIVE_COMPACTION_INSTRUCTIONS = \"Proactively compact before the next agent turn.\";\nconst MAX_PENDING_METADATA = 8;\nconst IMAGE_PROMPT_TOKEN_ESTIMATE = 1_200;\n\ninterface PendingCompactionMetadata {\n\tcheckpoint: checkpointState.AgentCheckpoint;\n\ttodoSnapshot: todoBridge.TodoSnapshotPayload;\n}\n\nfunction approxTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\nfunction isOpenAiResponsesModel(model: ExtensionContext[\"model\"]): boolean {\n\treturn model?.provider === \"openai\" && model.api === \"openai-responses\";\n}\n\nfunction estimatePendingPromptTokens(event: { prompt?: string; images?: readonly unknown[] }): number {\n\treturn approxTokens(event.prompt ?? \"\") + (event.images?.length ?? 0) * IMAGE_PROMPT_TOKEN_ESTIMATE;\n}\n\nfunction 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\nfunction isMonitorableMessageEvent(event: { message: AgentMessage }): event is {\n\tmessage: AgentMessage & { content: Array<{ type: string; text?: string }> };\n} {\n\treturn \"content\" in event.message && Array.isArray(event.message.content);\n}\n\nfunction isAbortedAssistantMessage(event: { message: AgentMessage }): boolean {\n\treturn event.message.role === \"assistant\" && \"stopReason\" in event.message && event.message.stopReason === \"aborted\";\n}\n\nfunction updateLastYield(state: CompactionExtensionState, entry: CompactionEntry): CompactionExtensionState {\n\tconst savedTokens = Math.max(0, entry.tokensBefore - approxTokens(entry.summary));\n\treturn { ...state, lastYield: { savedTokens, tokensBefore: entry.tokensBefore } };\n}\n\nfunction 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\nfunction endCompactionFeedback(\n\tctx: ExtensionContext,\n\tsignal: AbortSignal | undefined,\n\tresult: SpeculativeCompactionResult,\n): void {\n\tif (shouldEndFeedback(result)) {\n\t\tctx.endCompaction?.({ reason: \"extension\", aborted: signal?.aborted });\n\t}\n}\n\nfunction 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\nfunction 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\nexport default function compactionExtension(pi: ExtensionAPI): void {\n\tlet state: CompactionExtensionState = createInitialState();\n\tconst degradationState = createDegradationMonitorState();\n\tconst restorationState = state.restoration ?? restoration.createRestorationTrackerState();\n\tstate = { ...state, restoration: restorationState };\n\tlet speculativeGeneration = 0;\n\tlet speculativeJob:\n\t\t| {\n\t\t\t\tgeneration: number;\n\t\t\t\tsnapshot: SpeculativeCompactionSnapshot;\n\t\t\t\tcontroller: AbortController;\n\t\t\t\tpromise: Promise<CompactionResult | undefined>;\n\t\t }\n\t\t| undefined;\n\tconst pendingMetadata = new Map<string, PendingCompactionMetadata>();\n\n\tfunction invalidateSpeculativeCompaction(): void {\n\t\tspeculativeGeneration++;\n\t\tspeculativeJob?.controller.abort();\n\t\tspeculativeJob = undefined;\n\t}\n\n\tfunction startSpeculativeCompaction(ctx: ExtensionContext, customInstructions: string): void {\n\t\tif (speculativeJob) return;\n\t\tconst generation = ++speculativeGeneration;\n\t\tconst snapshot = createSpeculativeCompactionSnapshot(ctx, { generation, customInstructions });\n\t\tif (!snapshot) return;\n\n\t\tconst controller = new AbortController();\n\t\tconst promise = runExtensionCompaction(ctx, snapshot, controller.signal).catch(() => undefined);\n\t\tspeculativeJob = { generation, snapshot, controller, promise };\n\t}\n\n\tfunction capturePendingMetadata(requestId: string, ctx: ExtensionContext): void {\n\t\tpendingMetadata.set(requestId, {\n\t\t\tcheckpoint: checkpointState.captureAgentCheckpoint(pi, ctx),\n\t\t\ttodoSnapshot: todoBridge.createTodoSnapshot(ctx),\n\t\t});\n\t\twhile (pendingMetadata.size > MAX_PENDING_METADATA) {\n\t\t\tconst oldestRequestId = pendingMetadata.keys().next().value;\n\t\t\tif (oldestRequestId === undefined) break;\n\t\t\tpendingMetadata.delete(oldestRequestId);\n\t\t}\n\t}\n\n\tfunction persistAcceptedMetadata(requestId: string): void {\n\t\tconst metadata = pendingMetadata.get(requestId);\n\t\tif (!metadata) return;\n\t\tpendingMetadata.delete(requestId);\n\t\tcheckpointState.persistCheckpoint(pi, metadata.checkpoint);\n\t\ttodoBridge.persistTodoSnapshot(pi, metadata.todoSnapshot);\n\t}\n\n\tasync function applyBlockingCompaction(\n\t\tctx: ExtensionContext,\n\t\tcustomInstructions: string,\n\t): Promise<SpeculativeCompactionResult> {\n\t\tlet feedbackSignal = ctx.beginCompaction?.({ reason: \"extension\" });\n\t\ttry {\n\t\t\tif (isOpenAiResponsesModel(ctx.model)) {\n\t\t\t\tconst remoteGeneration = speculativeGeneration + 1;\n\t\t\t\tconst remoteSnapshot = createSpeculativeCompactionSnapshot(ctx, {\n\t\t\t\t\tgeneration: remoteGeneration,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t});\n\t\t\t\tif (remoteSnapshot) {\n\t\t\t\t\tconst remoteSignal = feedbackSignal ?? new AbortController().signal;\n\t\t\t\t\tconst remoteCompaction = await runOpenAiRemoteCompaction(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tcreateBlockingRemoteCompactionEvent(ctx, remoteSnapshot, customInstructions, remoteSignal),\n\t\t\t\t\t\t(data) => pi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t\t\t\t);\n\t\t\t\t\tif (remoteCompaction) {\n\t\t\t\t\t\tif (speculativeGeneration !== remoteGeneration - 1) {\n\t\t\t\t\t\t\tconst result = { applied: false, reason: \"stale\" } as const;\n\t\t\t\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tspeculativeGeneration = remoteGeneration;\n\t\t\t\t\t\tspeculativeJob?.controller.abort();\n\t\t\t\t\t\tspeculativeJob = undefined;\n\t\t\t\t\t\tconst result = await applyGeneratedCompaction(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tremoteSnapshot,\n\t\t\t\t\t\t\t() => speculativeGeneration,\n\t\t\t\t\t\t\tremoteCompaction,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst pendingJob = speculativeJob;\n\t\t\tif (pendingJob) {\n\t\t\t\tconst unlinkAbort = linkAbortSignal(feedbackSignal, pendingJob.controller);\n\t\t\t\tlet compaction: CompactionResult | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tcompaction = await pendingJob.promise;\n\t\t\t\t} finally {\n\t\t\t\t\tunlinkAbort();\n\t\t\t\t}\n\t\t\t\tconst result = await applyGeneratedCompaction(\n\t\t\t\t\tctx,\n\t\t\t\t\tpendingJob.snapshot,\n\t\t\t\t\t() => speculativeGeneration,\n\t\t\t\t\tcompaction,\n\t\t\t\t);\n\t\t\t\tif (result.applied || result.reason === \"stale\") {\n\t\t\t\t\tspeculativeJob = undefined;\n\t\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tif (result.reason === \"rejected\") {\n\t\t\t\t\tfeedbackSignal = ctx.beginCompaction?.({ reason: \"extension\" });\n\t\t\t\t}\n\t\t\t\tspeculativeJob = undefined;\n\t\t\t}\n\n\t\t\tconst generation = ++speculativeGeneration;\n\t\t\tconst snapshot = createSpeculativeCompactionSnapshot(ctx, { generation, customInstructions });\n\t\t\tif (!snapshot) {\n\t\t\t\tconst result = { applied: false, reason: \"unavailable\" } as const;\n\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tconst compaction = await runExtensionCompaction(ctx, snapshot, feedbackSignal, (delta) =>\n\t\t\t\tctx.updateCompaction?.({ reason: \"extension\", delta }),\n\t\t\t);\n\t\t\tconst result = await applyGeneratedCompaction(ctx, snapshot, () => speculativeGeneration, compaction);\n\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tctx.endCompaction?.({\n\t\t\t\treason: \"extension\",\n\t\t\t\taborted: feedbackSignal?.aborted,\n\t\t\t\terrorMessage: `Compaction failed: ${message}`,\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpi.on(\"session_before_compact\", async (event, ctx) => {\n\t\tinvalidateSpeculativeCompaction();\n\t\tif (cap.shouldRejectByCap(state, { reason: event.reason }).cancel) return { cancel: true };\n\t\tif (breaker.isTripped(state, Date.now()) && !breaker.shouldBypass(state, { reason: event.reason }))\n\t\t\treturn { cancel: true };\n\n\t\tcapturePendingMetadata(event.requestId, ctx);\n\n\t\tconst model = ctx.model;\n\t\tif (!model) return undefined;\n\t\tconst remoteCompaction = await runOpenAiRemoteCompaction(ctx, event, (data) =>\n\t\t\tpi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t);\n\t\tif (remoteCompaction) {\n\t\t\treturn { compaction: remoteCompaction };\n\t\t}\n\n\t\tconst snapshot = {\n\t\t\tgeneration: ++speculativeGeneration,\n\t\t\texpectedRevision: ctx.getMessageRevision(),\n\t\t\tmodel,\n\t\t\tcontextWindow: ctx.getContextUsage()?.contextWindow ?? model.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n\t\t\tpreparation: event.preparation,\n\t\t\tpromptVariant: getPromptVariant(event),\n\t\t\tcustomInstructions: event.customInstructions,\n\t\t};\n\t\tconst compaction = await runExtensionCompaction(ctx, snapshot, event.signal, (delta) =>\n\t\t\tctx.updateCompaction?.({ reason: event.reason, delta }),\n\t\t);\n\t\tif (!compaction) {\n\t\t\tpendingMetadata.delete(event.requestId);\n\t\t\treturn { cancel: true };\n\t\t}\n\n\t\treturn {\n\t\t\tcompaction,\n\t\t};\n\t});\n\n\tpi.on(\"model_select\", () => {\n\t\tinvalidateSpeculativeCompaction();\n\t});\n\n\tpi.on(\"session_compact\", async (event, ctx) => {\n\t\tinvalidateSpeculativeCompaction();\n\t\tif (event.accepted) {\n\t\t\tpersistAcceptedMetadata(event.requestId);\n\t\t\tconst branchEntries = ctx.sessionManager.getBranch();\n\t\t\tconst firstKeptIndex = branchEntries.findIndex((entry) => entry.id === event.compactionEntry.firstKeptEntryId);\n\t\t\tconst keptEntries = firstKeptIndex === -1 ? [] : branchEntries.slice(firstKeptIndex);\n\t\t\tstate = cap.incrementAccepted(state);\n\t\t\tstate = breaker.recordSuccess(state);\n\t\t\tstate = updateLastYield(state, event.compactionEntry);\n\t\t\tresetOnSessionCompact(degradationState);\n\t\t\ttodoBridge.restoreTodosIfMissing(pi, ctx);\n\t\t\tconst usage = ctx.getContextUsage();\n\t\t\tconst settings = ctx.getCompactionSettings();\n\t\t\tif (settings.restorationEnabled ?? true) {\n\t\t\t\trestoration.preparePendingPayload(restorationState, {\n\t\t\t\t\taccepted: true,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t\tcompactionEntryId: event.compactionEntry.id,\n\t\t\t\t\tcontextWindow: usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n\t\t\t\t\tusageTokens: usage?.tokens ?? null,\n\t\t\t\t\treserveTokens: settings.reserveTokens,\n\t\t\t\t\tsettings,\n\t\t\t\t\tkeptMessages: keptEntries.flatMap((entry) => {\n\t\t\t\t\t\tif (entry.type !== \"message\") return [];\n\t\t\t\t\t\treturn [entry.message];\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tstate = breaker.recordFailure(state, Date.now(), { route: event.reason });\n\t\tctx.ui.notify(`Compaction rejected: ${event.rejectionCause ?? \"unknown\"}`, \"warning\");\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tlet systemPrompt = event.systemPrompt;\n\t\tconst message = restoration.consumePendingPayload(restorationState);\n\t\tconst checkpoint = recentCheckpoint(ctx);\n\t\tif (checkpoint) systemPrompt = checkpointState.injectRestorationDirective(systemPrompt, checkpoint);\n\n\t\tconst usage = ctx.getContextUsage();\n\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\t\tconst settings = ctx.getCompactionSettings();\n\t\tconst pendingPromptTokens = estimatePendingPromptTokens(event);\n\t\tconst usageWithPendingPrompt = usage ? withAdditionalTokens(usage, pendingPromptTokens) : undefined;\n\t\tif (usage && policy.isAtHardLimit(usage, contextWindow, settings.reserveTokens, pendingPromptTokens)) {\n\t\t\tawait applyBlockingCompaction(ctx, EMERGENCY_COMPACTION_INSTRUCTIONS);\n\t\t} else if (\n\t\t\tusageWithPendingPrompt &&\n\t\t\tpolicy.shouldTriggerCompaction(usageWithPendingPrompt, contextWindow, settings, state.lastYield ?? undefined)\n\t\t) {\n\t\t\tawait applyBlockingCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);\n\t\t} else if (\n\t\t\tusageWithPendingPrompt &&\n\t\t\tpolicy.shouldStartSpeculativeCompaction(\n\t\t\t\tusageWithPendingPrompt,\n\t\t\t\tcontextWindow,\n\t\t\t\tsettings,\n\t\t\t\tstate.lastYield ?? undefined,\n\t\t\t)\n\t\t) {\n\t\t\tstartSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);\n\t\t}\n\n\t\tif (systemPrompt === event.systemPrompt && !message) return undefined;\n\t\treturn message ? { systemPrompt, message } : { systemPrompt };\n\t});\n\n\tpi.on(\"context\", (event, ctx) => {\n\t\tconst usage = ctx.getContextUsage();\n\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\t\tconst sourceMessages = shouldApplyContextReduction({\n\t\t\tusageTokens: usage?.tokens ?? null,\n\t\t\tcontextWindow,\n\t\t\tisProviderNativeCompactionPath: isOpenAiResponsesModel(ctx.model),\n\t\t})\n\t\t\t? reduceContextMessages(event.messages, BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages\n\t\t\t: event.messages;\n\t\tconst emergency = hardLimitEmergencyPrune(sourceMessages, contextWindow);\n\t\treturn { messages: repairOrphanedToolResults(convertToLlm(emergency.messages)) };\n\t});\n\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\treturn rewriteOpenAiPayloadWithRemoteCompaction(\n\t\t\tevent.payload,\n\t\t\t{ model: ctx.model, branchEntries: ctx.sessionManager.getBranch() },\n\t\t\t(data) => pi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t);\n\t});\n\n\tpi.on(\"turn_end\", async (_event, ctx) => {\n\t\thandleTurnEnd(degradationState);\n\t\tif (degradationState.recoveryTriggeredThisCycle) return;\n\t\tif (state.lastYield && state.lastYield.savedTokens <= 0) {\n\t\t\tvoid applyBlockingCompaction(ctx, RECOVERY_INSTRUCTIONS);\n\t\t}\n\t});\n\n\tpi.on(\"agent_end\", () => {\n\t\tstate = resetTurnCounter(state, \"\");\n\t});\n\n\tpi.on(\"message_end\", async (event, ctx) => {\n\t\tif (isAbortedAssistantMessage(event)) {\n\t\t\tinvalidateSpeculativeCompaction();\n\t\t}\n\t\tif (isMonitorableMessageEvent(event)) {\n\t\t\tawait handleMessageEnd(degradationState, event, {\n\t\t\t\tapplyCompaction: async (options) => {\n\t\t\t\t\treturn await applyBlockingCompaction(ctx, options.customInstructions);\n\t\t\t\t},\n\t\t\t\tnotify: (message) => ctx.ui.notify(message, \"warning\"),\n\t\t\t});\n\t\t}\n\t});\n\n\tpi.on(\"tool_call\", (event) => {\n\t\trestoration.trackToolCall(restorationState, event);\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { CompactionResult } from \"../../../compaction/index.ts\";\nimport { convertToLlm } from \"../../../messages.ts\";\nimport type { CompactionEntry } from \"../../../session-manager.ts\";\nimport type { ContextUsage, ExtensionAPI, ExtensionContext, SessionBeforeCompactEvent } from \"../../types.ts\";\nimport * as checkpointState from \"./checkpoint-state.ts\";\nimport * as breaker from \"./circuit-breaker.ts\";\nimport {\n\tBUILTIN_CONTEXT_REDUCTION_OPTIONS,\n\treduceContextMessages,\n\tshouldApplyContextReduction,\n} from \"./context-reduction.ts\";\nimport {\n\tcreateDegradationMonitorState,\n\thandleMessageEnd,\n\thandleTurnEnd,\n\tRECOVERY_INSTRUCTIONS,\n\tresetOnSessionCompact,\n} from \"./degradation-monitor.ts\";\nimport {\n\trewriteOpenAiPayloadWithRemoteCompaction,\n\trunOpenAiRemoteCompaction,\n\tSENPI_COMPACTION_EVENT,\n} from \"./openai-remote.ts\";\nimport * as cap from \"./per-turn-cap.ts\";\nimport * as policy from \"./policy.ts\";\nimport { repairOrphanedToolResults } from \"./repair-tool-pairs.ts\";\nimport * as restoration from \"./restoration-tracker.ts\";\nimport {\n\tapplyGeneratedCompaction,\n\tcreateSpeculativeCompactionSnapshot,\n\tgetPromptVariant,\n\thardLimitEmergencyPrune,\n\trunExtensionCompaction,\n\ttype SpeculativeCompactionResult,\n\ttype SpeculativeCompactionSnapshot,\n} from \"./speculative.ts\";\nimport { type CompactionExtensionState, createInitialState, resetTurnCounter } from \"./state.ts\";\nimport * as todoBridge from \"./todo-bridge.ts\";\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst EMERGENCY_COMPACTION_INSTRUCTIONS =\n\t\"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.\";\nconst PROACTIVE_COMPACTION_INSTRUCTIONS = \"Proactively compact before the next agent turn.\";\nconst MAX_PENDING_METADATA = 8;\nconst IMAGE_PROMPT_TOKEN_ESTIMATE = 1_200;\nconst MAX_OUTPUT_RESERVE_RATIO = 0.5;\n\ninterface PendingCompactionMetadata {\n\tcheckpoint: checkpointState.AgentCheckpoint;\n\ttodoSnapshot: todoBridge.TodoSnapshotPayload;\n}\n\nfunction approxTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\nfunction isOpenAiResponsesModel(model: ExtensionContext[\"model\"]): boolean {\n\treturn model?.provider === \"openai\" && model.api === \"openai-responses\";\n}\n\nfunction estimatePendingPromptTokens(event: { prompt?: string; images?: readonly unknown[] }): number {\n\treturn approxTokens(event.prompt ?? \"\") + (event.images?.length ?? 0) * IMAGE_PROMPT_TOKEN_ESTIMATE;\n}\n\nfunction 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\nfunction 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\nfunction isMonitorableMessageEvent(event: { message: AgentMessage }): event is {\n\tmessage: AgentMessage & { content: Array<{ type: string; text?: string }> };\n} {\n\treturn \"content\" in event.message && Array.isArray(event.message.content);\n}\n\nfunction isAbortedAssistantMessage(event: { message: AgentMessage }): boolean {\n\treturn event.message.role === \"assistant\" && \"stopReason\" in event.message && event.message.stopReason === \"aborted\";\n}\n\nfunction updateLastYield(state: CompactionExtensionState, entry: CompactionEntry): CompactionExtensionState {\n\tconst savedTokens = Math.max(0, entry.tokensBefore - approxTokens(entry.summary));\n\treturn { ...state, lastYield: { savedTokens, tokensBefore: entry.tokensBefore } };\n}\n\nfunction 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\nfunction endCompactionFeedback(\n\tctx: ExtensionContext,\n\tsignal: AbortSignal | undefined,\n\tresult: SpeculativeCompactionResult,\n): void {\n\tif (shouldEndFeedback(result)) {\n\t\tctx.endCompaction?.({ reason: \"extension\", aborted: signal?.aborted });\n\t}\n}\n\nfunction 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\nfunction 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\nexport default function compactionExtension(pi: ExtensionAPI): void {\n\tlet state: CompactionExtensionState = createInitialState();\n\tconst degradationState = createDegradationMonitorState();\n\tconst restorationState = state.restoration ?? restoration.createRestorationTrackerState();\n\tstate = { ...state, restoration: restorationState };\n\tlet speculativeGeneration = 0;\n\tlet speculativeJob:\n\t\t| {\n\t\t\t\tgeneration: number;\n\t\t\t\tsnapshot: SpeculativeCompactionSnapshot;\n\t\t\t\tcontroller: AbortController;\n\t\t\t\tpromise: Promise<CompactionResult | undefined>;\n\t\t }\n\t\t| undefined;\n\tconst pendingMetadata = new Map<string, PendingCompactionMetadata>();\n\n\tfunction invalidateSpeculativeCompaction(): void {\n\t\tspeculativeGeneration++;\n\t\tspeculativeJob?.controller.abort();\n\t\tspeculativeJob = undefined;\n\t}\n\n\tfunction startSpeculativeCompaction(ctx: ExtensionContext, customInstructions: string): void {\n\t\tif (speculativeJob) return;\n\t\tconst generation = ++speculativeGeneration;\n\t\tconst snapshot = createSpeculativeCompactionSnapshot(ctx, { generation, customInstructions });\n\t\tif (!snapshot) return;\n\n\t\tconst controller = new AbortController();\n\t\tconst promise = runExtensionCompaction(ctx, snapshot, controller.signal).catch(() => undefined);\n\t\tspeculativeJob = { generation, snapshot, controller, promise };\n\t}\n\n\tfunction capturePendingMetadata(requestId: string, ctx: ExtensionContext): void {\n\t\tpendingMetadata.set(requestId, {\n\t\t\tcheckpoint: checkpointState.captureAgentCheckpoint(pi, ctx),\n\t\t\ttodoSnapshot: todoBridge.createTodoSnapshot(ctx),\n\t\t});\n\t\twhile (pendingMetadata.size > MAX_PENDING_METADATA) {\n\t\t\tconst oldestRequestId = pendingMetadata.keys().next().value;\n\t\t\tif (oldestRequestId === undefined) break;\n\t\t\tpendingMetadata.delete(oldestRequestId);\n\t\t}\n\t}\n\n\tfunction persistAcceptedMetadata(requestId: string): void {\n\t\tconst metadata = pendingMetadata.get(requestId);\n\t\tif (!metadata) return;\n\t\tpendingMetadata.delete(requestId);\n\t\tcheckpointState.persistCheckpoint(pi, metadata.checkpoint);\n\t\ttodoBridge.persistTodoSnapshot(pi, metadata.todoSnapshot);\n\t}\n\n\tasync function applyBlockingCompaction(\n\t\tctx: ExtensionContext,\n\t\tcustomInstructions: string,\n\t): Promise<SpeculativeCompactionResult> {\n\t\tlet feedbackSignal = ctx.beginCompaction?.({ reason: \"extension\" });\n\t\ttry {\n\t\t\tif (isOpenAiResponsesModel(ctx.model)) {\n\t\t\t\tconst remoteGeneration = speculativeGeneration + 1;\n\t\t\t\tconst remoteSnapshot = createSpeculativeCompactionSnapshot(ctx, {\n\t\t\t\t\tgeneration: remoteGeneration,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t});\n\t\t\t\tif (remoteSnapshot) {\n\t\t\t\t\tconst remoteSignal = feedbackSignal ?? new AbortController().signal;\n\t\t\t\t\tconst remoteCompaction = await runOpenAiRemoteCompaction(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tcreateBlockingRemoteCompactionEvent(ctx, remoteSnapshot, customInstructions, remoteSignal),\n\t\t\t\t\t\t(data) => pi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t\t\t\t);\n\t\t\t\t\tif (remoteCompaction) {\n\t\t\t\t\t\tif (speculativeGeneration !== remoteGeneration - 1) {\n\t\t\t\t\t\t\tconst result = { applied: false, reason: \"stale\" } as const;\n\t\t\t\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tspeculativeGeneration = remoteGeneration;\n\t\t\t\t\t\tspeculativeJob?.controller.abort();\n\t\t\t\t\t\tspeculativeJob = undefined;\n\t\t\t\t\t\tconst result = await applyGeneratedCompaction(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tremoteSnapshot,\n\t\t\t\t\t\t\t() => speculativeGeneration,\n\t\t\t\t\t\t\tremoteCompaction,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst pendingJob = speculativeJob;\n\t\t\tif (pendingJob) {\n\t\t\t\tconst unlinkAbort = linkAbortSignal(feedbackSignal, pendingJob.controller);\n\t\t\t\tlet compaction: CompactionResult | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tcompaction = await pendingJob.promise;\n\t\t\t\t} finally {\n\t\t\t\t\tunlinkAbort();\n\t\t\t\t}\n\t\t\t\tconst result = await applyGeneratedCompaction(\n\t\t\t\t\tctx,\n\t\t\t\t\tpendingJob.snapshot,\n\t\t\t\t\t() => speculativeGeneration,\n\t\t\t\t\tcompaction,\n\t\t\t\t);\n\t\t\t\tif (result.applied || result.reason === \"stale\") {\n\t\t\t\t\tspeculativeJob = undefined;\n\t\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tif (result.reason === \"rejected\") {\n\t\t\t\t\tfeedbackSignal = ctx.beginCompaction?.({ reason: \"extension\" });\n\t\t\t\t}\n\t\t\t\tspeculativeJob = undefined;\n\t\t\t}\n\n\t\t\tconst generation = ++speculativeGeneration;\n\t\t\tconst snapshot = createSpeculativeCompactionSnapshot(ctx, { generation, customInstructions });\n\t\t\tif (!snapshot) {\n\t\t\t\tconst result = { applied: false, reason: \"unavailable\" } as const;\n\t\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tconst compaction = await runExtensionCompaction(ctx, snapshot, feedbackSignal, (delta) =>\n\t\t\t\tctx.updateCompaction?.({ reason: \"extension\", delta }),\n\t\t\t);\n\t\t\tconst result = await applyGeneratedCompaction(ctx, snapshot, () => speculativeGeneration, compaction);\n\t\t\tendCompactionFeedback(ctx, feedbackSignal, result);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tctx.endCompaction?.({\n\t\t\t\treason: \"extension\",\n\t\t\t\taborted: feedbackSignal?.aborted,\n\t\t\t\terrorMessage: `Compaction failed: ${message}`,\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpi.on(\"session_before_compact\", async (event, ctx) => {\n\t\tinvalidateSpeculativeCompaction();\n\t\tif (cap.shouldRejectByCap(state, { reason: event.reason }).cancel) return { cancel: true };\n\t\tif (breaker.isTripped(state, Date.now()) && !breaker.shouldBypass(state, { reason: event.reason }))\n\t\t\treturn { cancel: true };\n\n\t\tcapturePendingMetadata(event.requestId, ctx);\n\n\t\tconst model = ctx.model;\n\t\tif (!model) return undefined;\n\t\tconst remoteCompaction = await runOpenAiRemoteCompaction(ctx, event, (data) =>\n\t\t\tpi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t);\n\t\tif (remoteCompaction) {\n\t\t\treturn { compaction: remoteCompaction };\n\t\t}\n\n\t\tconst snapshot = {\n\t\t\tgeneration: ++speculativeGeneration,\n\t\t\texpectedRevision: ctx.getMessageRevision(),\n\t\t\tmodel,\n\t\t\tcontextWindow: ctx.getContextUsage()?.contextWindow ?? model.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n\t\t\tpreparation: event.preparation,\n\t\t\tpromptVariant: getPromptVariant(event),\n\t\t\tcustomInstructions: event.customInstructions,\n\t\t};\n\t\tconst compaction = await runExtensionCompaction(ctx, snapshot, event.signal, (delta) =>\n\t\t\tctx.updateCompaction?.({ reason: event.reason, delta }),\n\t\t);\n\t\tif (!compaction) {\n\t\t\tpendingMetadata.delete(event.requestId);\n\t\t\treturn { cancel: true };\n\t\t}\n\n\t\treturn {\n\t\t\tcompaction,\n\t\t};\n\t});\n\n\tpi.on(\"model_select\", () => {\n\t\tinvalidateSpeculativeCompaction();\n\t});\n\n\tpi.on(\"session_compact\", async (event, ctx) => {\n\t\tinvalidateSpeculativeCompaction();\n\t\tif (event.accepted) {\n\t\t\tpersistAcceptedMetadata(event.requestId);\n\t\t\tconst branchEntries = ctx.sessionManager.getBranch();\n\t\t\tconst firstKeptIndex = branchEntries.findIndex((entry) => entry.id === event.compactionEntry.firstKeptEntryId);\n\t\t\tconst keptEntries = firstKeptIndex === -1 ? [] : branchEntries.slice(firstKeptIndex);\n\t\t\tstate = cap.incrementAccepted(state);\n\t\t\tstate = breaker.recordSuccess(state);\n\t\t\tstate = updateLastYield(state, event.compactionEntry);\n\t\t\tresetOnSessionCompact(degradationState);\n\t\t\ttodoBridge.restoreTodosIfMissing(pi, ctx);\n\t\t\tconst usage = ctx.getContextUsage();\n\t\t\tconst settings = ctx.getCompactionSettings();\n\t\t\tif (settings.restorationEnabled ?? true) {\n\t\t\t\trestoration.preparePendingPayload(restorationState, {\n\t\t\t\t\taccepted: true,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t\tcompactionEntryId: event.compactionEntry.id,\n\t\t\t\t\tcontextWindow: usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n\t\t\t\t\tusageTokens: usage?.tokens ?? null,\n\t\t\t\t\treserveTokens: settings.reserveTokens,\n\t\t\t\t\tsettings,\n\t\t\t\t\tkeptMessages: keptEntries.flatMap((entry) => {\n\t\t\t\t\t\tif (entry.type !== \"message\") return [];\n\t\t\t\t\t\treturn [entry.message];\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tstate = breaker.recordFailure(state, Date.now(), { route: event.reason });\n\t\tctx.ui.notify(`Compaction rejected: ${event.rejectionCause ?? \"unknown\"}`, \"warning\");\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tlet systemPrompt = event.systemPrompt;\n\t\tconst message = restoration.consumePendingPayload(restorationState);\n\t\tconst checkpoint = recentCheckpoint(ctx);\n\t\tif (checkpoint) systemPrompt = checkpointState.injectRestorationDirective(systemPrompt, checkpoint);\n\n\t\tconst usage = ctx.getContextUsage();\n\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\t\tconst settings = ctx.getCompactionSettings();\n\t\tconst pendingPromptTokens = estimatePendingPromptTokens(event);\n\t\tconst usageWithPendingPrompt = usage ? withAdditionalTokens(usage, pendingPromptTokens) : undefined;\n\t\tif (usage && policy.isAtHardLimit(usage, contextWindow, settings.reserveTokens, pendingPromptTokens)) {\n\t\t\tawait applyBlockingCompaction(ctx, EMERGENCY_COMPACTION_INSTRUCTIONS);\n\t\t} else if (\n\t\t\tusageWithPendingPrompt &&\n\t\t\tpolicy.shouldTriggerCompaction(usageWithPendingPrompt, contextWindow, settings, state.lastYield ?? undefined)\n\t\t) {\n\t\t\tawait applyBlockingCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);\n\t\t} else if (\n\t\t\tusageWithPendingPrompt &&\n\t\t\tpolicy.shouldStartSpeculativeCompaction(\n\t\t\t\tusageWithPendingPrompt,\n\t\t\t\tcontextWindow,\n\t\t\t\tsettings,\n\t\t\t\tstate.lastYield ?? undefined,\n\t\t\t)\n\t\t) {\n\t\t\tstartSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);\n\t\t}\n\n\t\tif (systemPrompt === event.systemPrompt && !message) return undefined;\n\t\treturn message ? { systemPrompt, message } : { systemPrompt };\n\t});\n\n\tpi.on(\"context\", (event, ctx) => {\n\t\tconst usage = ctx.getContextUsage();\n\t\tconst contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\t\tconst promptContextWindow = getPromptContextWindow(contextWindow, ctx.model?.maxTokens);\n\t\tconst sourceMessages = shouldApplyContextReduction({\n\t\t\tusageTokens: usage?.tokens ?? null,\n\t\t\tcontextWindow,\n\t\t\tisProviderNativeCompactionPath: isOpenAiResponsesModel(ctx.model),\n\t\t})\n\t\t\t? reduceContextMessages(event.messages, BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages\n\t\t\t: event.messages;\n\t\tconst emergency = hardLimitEmergencyPrune(sourceMessages, promptContextWindow);\n\t\treturn { messages: repairOrphanedToolResults(convertToLlm(emergency.messages)) };\n\t});\n\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\treturn rewriteOpenAiPayloadWithRemoteCompaction(\n\t\t\tevent.payload,\n\t\t\t{ model: ctx.model, branchEntries: ctx.sessionManager.getBranch() },\n\t\t\t(data) => pi.events.emit(SENPI_COMPACTION_EVENT, data),\n\t\t);\n\t});\n\n\tpi.on(\"turn_end\", async (_event, ctx) => {\n\t\thandleTurnEnd(degradationState);\n\t\tif (degradationState.recoveryTriggeredThisCycle) return;\n\t\tif (state.lastYield && state.lastYield.savedTokens <= 0) {\n\t\t\tvoid applyBlockingCompaction(ctx, RECOVERY_INSTRUCTIONS);\n\t\t}\n\t});\n\n\tpi.on(\"agent_end\", () => {\n\t\tstate = resetTurnCounter(state, \"\");\n\t});\n\n\tpi.on(\"message_end\", async (event, ctx) => {\n\t\tif (isAbortedAssistantMessage(event)) {\n\t\t\tinvalidateSpeculativeCompaction();\n\t\t}\n\t\tif (isMonitorableMessageEvent(event)) {\n\t\t\tawait handleMessageEnd(degradationState, event, {\n\t\t\t\tapplyCompaction: async (options) => {\n\t\t\t\t\treturn await applyBlockingCompaction(ctx, options.customInstructions);\n\t\t\t\t},\n\t\t\t\tnotify: (message) => ctx.ui.notify(message, \"warning\"),\n\t\t\t});\n\t\t}\n\t});\n\n\tpi.on(\"tool_call\", (event) => {\n\t\trestoration.trackToolCall(restorationState, event);\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/store.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAY,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMnH,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAEtD;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAStE;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnF;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/store.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAY,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMnH,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAEtD;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAStE;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnF;AAoBD,wBAAsB,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBpF;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDrF;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAInE;AAED,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,kBAAkB,EACzB,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,kBAA6B,EACnC,cAAc,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAetB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
4
|
import { GoalAlreadyExistsError, GoalNotFoundError, InvalidGoalStoreError, UnsupportedGoalStoreVersionError, } from "./errors.js";
|
|
5
5
|
import { isRecord } from "./types.js";
|
|
@@ -24,7 +24,23 @@ export async function writeGoal(ref, goal) {
|
|
|
24
24
|
const filePath = goalFilePath(ref);
|
|
25
25
|
await mkdir(dirname(filePath), { recursive: true });
|
|
26
26
|
const file = { version: STORE_VERSION, goal };
|
|
27
|
-
await
|
|
27
|
+
await writeGoalFileAtomic(filePath, `${JSON.stringify(file, null, 2)}\n`);
|
|
28
|
+
}
|
|
29
|
+
async function writeGoalFileAtomic(filePath, contents) {
|
|
30
|
+
const tempPath = join(dirname(filePath), `.goal-${randomUUID()}.tmp`);
|
|
31
|
+
try {
|
|
32
|
+
await writeFile(tempPath, contents, { encoding: "utf8", mode: 0o600 });
|
|
33
|
+
await rename(tempPath, filePath);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
try {
|
|
37
|
+
await rm(tempPath, { force: true });
|
|
38
|
+
}
|
|
39
|
+
catch (cleanupError) {
|
|
40
|
+
throw new AggregateError([error, cleanupError], "goal store write failed and its temporary file could not be removed");
|
|
41
|
+
}
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
28
44
|
}
|
|
29
45
|
export async function createGoal(ref, objective) {
|
|
30
46
|
if ((await readGoal(ref)) !== null) {
|
|
@@ -131,7 +147,23 @@ function goalTokenDeltaForUsage(usage) {
|
|
|
131
147
|
return Math.max(0, usage.input) + Math.max(0, usage.output);
|
|
132
148
|
}
|
|
133
149
|
function parseGoalFile(raw) {
|
|
134
|
-
|
|
150
|
+
let parsed;
|
|
151
|
+
try {
|
|
152
|
+
parsed = JSON.parse(raw);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (!(error instanceof SyntaxError))
|
|
156
|
+
throw error;
|
|
157
|
+
const recovered = recoverGoalFileWithStaleClosingBraces(raw);
|
|
158
|
+
if (recovered === undefined)
|
|
159
|
+
throw error;
|
|
160
|
+
try {
|
|
161
|
+
parsed = JSON.parse(recovered);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
135
167
|
if (!isRecord(parsed))
|
|
136
168
|
throw new InvalidGoalStoreError("goal store must be a JSON object");
|
|
137
169
|
if (parsed.version !== STORE_VERSION)
|
|
@@ -144,6 +176,59 @@ function parseGoalFile(raw) {
|
|
|
144
176
|
goal,
|
|
145
177
|
};
|
|
146
178
|
}
|
|
179
|
+
function recoverGoalFileWithStaleClosingBraces(raw) {
|
|
180
|
+
let rootStart = 0;
|
|
181
|
+
while (rootStart < raw.length && /[\t\n\r ]/.test(raw[rootStart] ?? ""))
|
|
182
|
+
rootStart += 1;
|
|
183
|
+
if (raw[rootStart] !== "{")
|
|
184
|
+
return undefined;
|
|
185
|
+
let depth = 0;
|
|
186
|
+
let inString = false;
|
|
187
|
+
let escaped = false;
|
|
188
|
+
for (let index = rootStart; index < raw.length; index += 1) {
|
|
189
|
+
const character = raw[index];
|
|
190
|
+
if (inString) {
|
|
191
|
+
if (escaped) {
|
|
192
|
+
escaped = false;
|
|
193
|
+
}
|
|
194
|
+
else if (character === "\\") {
|
|
195
|
+
escaped = true;
|
|
196
|
+
}
|
|
197
|
+
else if (character === '"') {
|
|
198
|
+
inString = false;
|
|
199
|
+
}
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (character === '"') {
|
|
203
|
+
inString = true;
|
|
204
|
+
}
|
|
205
|
+
else if (character === "{" || character === "[") {
|
|
206
|
+
depth += 1;
|
|
207
|
+
}
|
|
208
|
+
else if (character === "}" || character === "]") {
|
|
209
|
+
depth -= 1;
|
|
210
|
+
if (depth < 0)
|
|
211
|
+
return undefined;
|
|
212
|
+
if (depth === 0) {
|
|
213
|
+
let hasStaleClosingBrace = false;
|
|
214
|
+
for (let suffixIndex = index + 1; suffixIndex < raw.length; suffixIndex += 1) {
|
|
215
|
+
const suffixCharacter = raw[suffixIndex];
|
|
216
|
+
if (suffixCharacter === "}") {
|
|
217
|
+
hasStaleClosingBrace = true;
|
|
218
|
+
}
|
|
219
|
+
else if (suffixCharacter !== " " &&
|
|
220
|
+
suffixCharacter !== "\t" &&
|
|
221
|
+
suffixCharacter !== "\n" &&
|
|
222
|
+
suffixCharacter !== "\r") {
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return hasStaleClosingBrace ? raw.slice(0, index + 1) : undefined;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
147
232
|
function isMissingFile(error) {
|
|
148
233
|
return error instanceof Error && "code" in error && error.code === "ENOENT";
|
|
149
234
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n\tGoalAlreadyExistsError,\n\tGoalNotFoundError,\n\tInvalidGoalStoreError,\n\tUnsupportedGoalStoreVersionError,\n} from \"./errors.ts\";\nimport type { Goal, GoalAccountingMode, GoalFile, GoalStoreRef, GoalUpdate, TokenUsageSnapshot } from \"./types.ts\";\nimport { isRecord } from \"./types.ts\";\nimport { validateObjective } from \"./validation.ts\";\n\nconst STORE_VERSION = 1;\n\nexport function goalFilePath(ref: GoalStoreRef): string {\n\treturn join(ref.baseDir, `${encodeURIComponent(ref.threadId)}.json`);\n}\n\nexport async function readGoal(ref: GoalStoreRef): Promise<Goal | null> {\n\tconst filePath = goalFilePath(ref);\n\ttry {\n\t\tconst raw = await readFile(filePath, \"utf8\");\n\t\treturn parseGoalFile(raw).goal;\n\t} catch (error) {\n\t\tif (isMissingFile(error)) return null;\n\t\tthrow error;\n\t}\n}\n\nexport async function writeGoal(ref: GoalStoreRef, goal: Goal | null): Promise<void> {\n\tconst filePath = goalFilePath(ref);\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tconst file: GoalFile = { version: STORE_VERSION, goal };\n\tawait writeFile(filePath, `${JSON.stringify(file, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function createGoal(ref: GoalStoreRef, objective: string): Promise<Goal> {\n\tif ((await readGoal(ref)) !== null) {\n\t\tthrow new GoalAlreadyExistsError(\"cannot create a new goal because this thread already has a goal\");\n\t}\n\n\tconst normalizedObjective = validateObjective(objective);\n\tconst now = nowSeconds();\n\tconst goal: Goal = {\n\t\tid: randomUUID(),\n\t\tthreadId: ref.threadId,\n\t\tobjective: normalizedObjective,\n\t\tstatus: \"active\",\n\t\ttokensUsed: 0,\n\t\ttimeUsedSeconds: 0,\n\t\tcreatedAt: now,\n\t\tupdatedAt: now,\n\t\tlastStartedAt: now,\n\t};\n\tawait writeGoal(ref, goal);\n\treturn goal;\n}\n\nexport async function updateGoal(ref: GoalStoreRef, update: GoalUpdate): Promise<Goal> {\n\tconst current = await readGoal(ref);\n\tif (!current) throw new GoalNotFoundError(\"cannot update goal: no goal exists\");\n\n\tconst objective = update.objective === undefined ? current.objective : validateObjective(update.objective);\n\tconst now = nowSeconds();\n\tconst hasObjectiveUpdate = update.objective !== undefined;\n\tconst replacesGoal = hasObjectiveUpdate && (objective !== current.objective || current.status === \"complete\");\n\tconst requestedStatus = update.status ?? (hasObjectiveUpdate ? \"active\" : undefined);\n\n\tif (replacesGoal) {\n\t\tconst status = requestedStatus ?? \"active\";\n\t\tconst next: Goal = {\n\t\t\tid: randomUUID(),\n\t\t\tthreadId: ref.threadId,\n\t\t\tobjective,\n\t\t\tstatus,\n\t\t\ttokensUsed: 0,\n\t\t\ttimeUsedSeconds: 0,\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t};\n\t\tif (status === \"active\") next.lastStartedAt = now;\n\t\tif (status === \"complete\") next.completedAt = now;\n\t\tawait writeGoal(ref, next);\n\t\treturn next;\n\t}\n\n\tconst status = requestedStatus ?? current.status;\n\tconst next: Goal = {\n\t\t...current,\n\t\tobjective,\n\t\tstatus,\n\t\tupdatedAt: now,\n\t};\n\n\tif (status === \"active\" && current.status !== \"active\") {\n\t\tnext.lastStartedAt = now;\n\t} else if (status !== \"active\") {\n\t\tdelete next.lastStartedAt;\n\t}\n\n\tif (status === \"complete\") {\n\t\tnext.completedAt = current.completedAt ?? now;\n\t} else {\n\t\tdelete next.completedAt;\n\t}\n\n\tawait writeGoal(ref, next);\n\treturn next;\n}\n\nexport async function clearGoal(ref: GoalStoreRef): Promise<boolean> {\n\tconst hadGoal = (await readGoal(ref)) !== null;\n\tawait writeGoal(ref, null);\n\treturn hadGoal;\n}\n\nexport async function accountGoalUsage(\n\tref: GoalStoreRef,\n\tusage: TokenUsageSnapshot,\n\telapsedSeconds: number,\n\tmode: GoalAccountingMode = \"active\",\n\texpectedGoalId?: string,\n): Promise<Goal | null> {\n\tconst goal = await readGoal(ref);\n\tif (!goal) return goal;\n\tif (expectedGoalId !== undefined && goal.id !== expectedGoalId) return goal;\n\tif (!canAccountGoalUsage(goal, mode)) return goal;\n\n\tconst now = nowSeconds();\n\tconst next: Goal = {\n\t\t...goal,\n\t\ttokensUsed: goal.tokensUsed + goalTokenDeltaForUsage(usage),\n\t\ttimeUsedSeconds: goal.timeUsedSeconds + Math.max(0, Math.trunc(elapsedSeconds)),\n\t\tupdatedAt: now,\n\t};\n\tawait writeGoal(ref, next);\n\treturn next;\n}\n\nfunction canAccountGoalUsage(goal: Goal, mode: GoalAccountingMode): boolean {\n\tswitch (mode) {\n\t\tcase \"active\":\n\t\t\treturn goal.status === \"active\";\n\t\tcase \"activeOrComplete\":\n\t\t\treturn goal.status === \"active\" || goal.status === \"complete\";\n\t}\n}\n\nfunction goalTokenDeltaForUsage(usage: TokenUsageSnapshot): number {\n\treturn Math.max(0, usage.input) + Math.max(0, usage.output);\n}\n\nfunction parseGoalFile(raw: string): GoalFile {\n\tconst parsed: unknown = JSON.parse(raw);\n\tif (!isRecord(parsed)) throw new InvalidGoalStoreError(\"goal store must be a JSON object\");\n\tif (parsed.version !== STORE_VERSION) throw new UnsupportedGoalStoreVersionError(\"unsupported goal store version\");\n\tconst goal = parsed.goal;\n\tif (goal !== null && !isGoal(goal)) throw new InvalidGoalStoreError(\"goal store contains an invalid goal\");\n\treturn {\n\t\tversion: STORE_VERSION,\n\t\tgoal,\n\t};\n}\n\nfunction isMissingFile(error: unknown): boolean {\n\treturn error instanceof Error && \"code\" in error && (error as { code: unknown }).code === \"ENOENT\";\n}\n\nfunction isGoal(value: unknown): value is Goal {\n\tif (!isRecord(value)) return false;\n\treturn (\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.threadId === \"string\" &&\n\t\ttypeof value.objective === \"string\" &&\n\t\tisGoalStatus(value.status) &&\n\t\tisNonNegativeSafeInteger(value.tokensUsed) &&\n\t\tisNonNegativeSafeInteger(value.timeUsedSeconds) &&\n\t\tisNonNegativeSafeInteger(value.createdAt) &&\n\t\tisNonNegativeSafeInteger(value.updatedAt) &&\n\t\t(value.lastStartedAt === undefined || isNonNegativeSafeInteger(value.lastStartedAt)) &&\n\t\t(value.completedAt === undefined || isNonNegativeSafeInteger(value.completedAt))\n\t);\n}\n\nfunction isGoalStatus(value: unknown): value is Goal[\"status\"] {\n\treturn value === \"active\" || value === \"paused\" || value === \"complete\";\n}\n\nfunction isNonNegativeSafeInteger(value: unknown): value is number {\n\treturn Number.isSafeInteger(value) && (value as number) >= 0;\n}\n\nfunction nowSeconds(): number {\n\treturn Math.trunc(Date.now() / 1000);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n\tGoalAlreadyExistsError,\n\tGoalNotFoundError,\n\tInvalidGoalStoreError,\n\tUnsupportedGoalStoreVersionError,\n} from \"./errors.ts\";\nimport type { Goal, GoalAccountingMode, GoalFile, GoalStoreRef, GoalUpdate, TokenUsageSnapshot } from \"./types.ts\";\nimport { isRecord } from \"./types.ts\";\nimport { validateObjective } from \"./validation.ts\";\n\nconst STORE_VERSION = 1;\n\nexport function goalFilePath(ref: GoalStoreRef): string {\n\treturn join(ref.baseDir, `${encodeURIComponent(ref.threadId)}.json`);\n}\n\nexport async function readGoal(ref: GoalStoreRef): Promise<Goal | null> {\n\tconst filePath = goalFilePath(ref);\n\ttry {\n\t\tconst raw = await readFile(filePath, \"utf8\");\n\t\treturn parseGoalFile(raw).goal;\n\t} catch (error) {\n\t\tif (isMissingFile(error)) return null;\n\t\tthrow error;\n\t}\n}\n\nexport async function writeGoal(ref: GoalStoreRef, goal: Goal | null): Promise<void> {\n\tconst filePath = goalFilePath(ref);\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tconst file: GoalFile = { version: STORE_VERSION, goal };\n\tawait writeGoalFileAtomic(filePath, `${JSON.stringify(file, null, 2)}\\n`);\n}\n\nasync function writeGoalFileAtomic(filePath: string, contents: string): Promise<void> {\n\tconst tempPath = join(dirname(filePath), `.goal-${randomUUID()}.tmp`);\n\ttry {\n\t\tawait writeFile(tempPath, contents, { encoding: \"utf8\", mode: 0o600 });\n\t\tawait rename(tempPath, filePath);\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait rm(tempPath, { force: true });\n\t\t} catch (cleanupError) {\n\t\t\tthrow new AggregateError(\n\t\t\t\t[error, cleanupError],\n\t\t\t\t\"goal store write failed and its temporary file could not be removed\",\n\t\t\t);\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nexport async function createGoal(ref: GoalStoreRef, objective: string): Promise<Goal> {\n\tif ((await readGoal(ref)) !== null) {\n\t\tthrow new GoalAlreadyExistsError(\"cannot create a new goal because this thread already has a goal\");\n\t}\n\n\tconst normalizedObjective = validateObjective(objective);\n\tconst now = nowSeconds();\n\tconst goal: Goal = {\n\t\tid: randomUUID(),\n\t\tthreadId: ref.threadId,\n\t\tobjective: normalizedObjective,\n\t\tstatus: \"active\",\n\t\ttokensUsed: 0,\n\t\ttimeUsedSeconds: 0,\n\t\tcreatedAt: now,\n\t\tupdatedAt: now,\n\t\tlastStartedAt: now,\n\t};\n\tawait writeGoal(ref, goal);\n\treturn goal;\n}\n\nexport async function updateGoal(ref: GoalStoreRef, update: GoalUpdate): Promise<Goal> {\n\tconst current = await readGoal(ref);\n\tif (!current) throw new GoalNotFoundError(\"cannot update goal: no goal exists\");\n\n\tconst objective = update.objective === undefined ? current.objective : validateObjective(update.objective);\n\tconst now = nowSeconds();\n\tconst hasObjectiveUpdate = update.objective !== undefined;\n\tconst replacesGoal = hasObjectiveUpdate && (objective !== current.objective || current.status === \"complete\");\n\tconst requestedStatus = update.status ?? (hasObjectiveUpdate ? \"active\" : undefined);\n\n\tif (replacesGoal) {\n\t\tconst status = requestedStatus ?? \"active\";\n\t\tconst next: Goal = {\n\t\t\tid: randomUUID(),\n\t\t\tthreadId: ref.threadId,\n\t\t\tobjective,\n\t\t\tstatus,\n\t\t\ttokensUsed: 0,\n\t\t\ttimeUsedSeconds: 0,\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t};\n\t\tif (status === \"active\") next.lastStartedAt = now;\n\t\tif (status === \"complete\") next.completedAt = now;\n\t\tawait writeGoal(ref, next);\n\t\treturn next;\n\t}\n\n\tconst status = requestedStatus ?? current.status;\n\tconst next: Goal = {\n\t\t...current,\n\t\tobjective,\n\t\tstatus,\n\t\tupdatedAt: now,\n\t};\n\n\tif (status === \"active\" && current.status !== \"active\") {\n\t\tnext.lastStartedAt = now;\n\t} else if (status !== \"active\") {\n\t\tdelete next.lastStartedAt;\n\t}\n\n\tif (status === \"complete\") {\n\t\tnext.completedAt = current.completedAt ?? now;\n\t} else {\n\t\tdelete next.completedAt;\n\t}\n\n\tawait writeGoal(ref, next);\n\treturn next;\n}\n\nexport async function clearGoal(ref: GoalStoreRef): Promise<boolean> {\n\tconst hadGoal = (await readGoal(ref)) !== null;\n\tawait writeGoal(ref, null);\n\treturn hadGoal;\n}\n\nexport async function accountGoalUsage(\n\tref: GoalStoreRef,\n\tusage: TokenUsageSnapshot,\n\telapsedSeconds: number,\n\tmode: GoalAccountingMode = \"active\",\n\texpectedGoalId?: string,\n): Promise<Goal | null> {\n\tconst goal = await readGoal(ref);\n\tif (!goal) return goal;\n\tif (expectedGoalId !== undefined && goal.id !== expectedGoalId) return goal;\n\tif (!canAccountGoalUsage(goal, mode)) return goal;\n\n\tconst now = nowSeconds();\n\tconst next: Goal = {\n\t\t...goal,\n\t\ttokensUsed: goal.tokensUsed + goalTokenDeltaForUsage(usage),\n\t\ttimeUsedSeconds: goal.timeUsedSeconds + Math.max(0, Math.trunc(elapsedSeconds)),\n\t\tupdatedAt: now,\n\t};\n\tawait writeGoal(ref, next);\n\treturn next;\n}\n\nfunction canAccountGoalUsage(goal: Goal, mode: GoalAccountingMode): boolean {\n\tswitch (mode) {\n\t\tcase \"active\":\n\t\t\treturn goal.status === \"active\";\n\t\tcase \"activeOrComplete\":\n\t\t\treturn goal.status === \"active\" || goal.status === \"complete\";\n\t}\n}\n\nfunction goalTokenDeltaForUsage(usage: TokenUsageSnapshot): number {\n\treturn Math.max(0, usage.input) + Math.max(0, usage.output);\n}\n\nfunction parseGoalFile(raw: string): GoalFile {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (error) {\n\t\tif (!(error instanceof SyntaxError)) throw error;\n\t\tconst recovered = recoverGoalFileWithStaleClosingBraces(raw);\n\t\tif (recovered === undefined) throw error;\n\t\ttry {\n\t\t\tparsed = JSON.parse(recovered);\n\t\t} catch {\n\t\t\tthrow error;\n\t\t}\n\t}\n\tif (!isRecord(parsed)) throw new InvalidGoalStoreError(\"goal store must be a JSON object\");\n\tif (parsed.version !== STORE_VERSION) throw new UnsupportedGoalStoreVersionError(\"unsupported goal store version\");\n\tconst goal = parsed.goal;\n\tif (goal !== null && !isGoal(goal)) throw new InvalidGoalStoreError(\"goal store contains an invalid goal\");\n\treturn {\n\t\tversion: STORE_VERSION,\n\t\tgoal,\n\t};\n}\n\nfunction recoverGoalFileWithStaleClosingBraces(raw: string): string | undefined {\n\tlet rootStart = 0;\n\twhile (rootStart < raw.length && /[\\t\\n\\r ]/.test(raw[rootStart] ?? \"\")) rootStart += 1;\n\tif (raw[rootStart] !== \"{\") return undefined;\n\n\tlet depth = 0;\n\tlet inString = false;\n\tlet escaped = false;\n\tfor (let index = rootStart; index < raw.length; index += 1) {\n\t\tconst character = raw[index];\n\t\tif (inString) {\n\t\t\tif (escaped) {\n\t\t\t\tescaped = false;\n\t\t\t} else if (character === \"\\\\\") {\n\t\t\t\tescaped = true;\n\t\t\t} else if (character === '\"') {\n\t\t\t\tinString = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (character === '\"') {\n\t\t\tinString = true;\n\t\t} else if (character === \"{\" || character === \"[\") {\n\t\t\tdepth += 1;\n\t\t} else if (character === \"}\" || character === \"]\") {\n\t\t\tdepth -= 1;\n\t\t\tif (depth < 0) return undefined;\n\t\t\tif (depth === 0) {\n\t\t\t\tlet hasStaleClosingBrace = false;\n\t\t\t\tfor (let suffixIndex = index + 1; suffixIndex < raw.length; suffixIndex += 1) {\n\t\t\t\t\tconst suffixCharacter = raw[suffixIndex];\n\t\t\t\t\tif (suffixCharacter === \"}\") {\n\t\t\t\t\t\thasStaleClosingBrace = true;\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tsuffixCharacter !== \" \" &&\n\t\t\t\t\t\tsuffixCharacter !== \"\\t\" &&\n\t\t\t\t\t\tsuffixCharacter !== \"\\n\" &&\n\t\t\t\t\t\tsuffixCharacter !== \"\\r\"\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn hasStaleClosingBrace ? raw.slice(0, index + 1) : undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nfunction isMissingFile(error: unknown): boolean {\n\treturn error instanceof Error && \"code\" in error && (error as { code: unknown }).code === \"ENOENT\";\n}\n\nfunction isGoal(value: unknown): value is Goal {\n\tif (!isRecord(value)) return false;\n\treturn (\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.threadId === \"string\" &&\n\t\ttypeof value.objective === \"string\" &&\n\t\tisGoalStatus(value.status) &&\n\t\tisNonNegativeSafeInteger(value.tokensUsed) &&\n\t\tisNonNegativeSafeInteger(value.timeUsedSeconds) &&\n\t\tisNonNegativeSafeInteger(value.createdAt) &&\n\t\tisNonNegativeSafeInteger(value.updatedAt) &&\n\t\t(value.lastStartedAt === undefined || isNonNegativeSafeInteger(value.lastStartedAt)) &&\n\t\t(value.completedAt === undefined || isNonNegativeSafeInteger(value.completedAt))\n\t);\n}\n\nfunction isGoalStatus(value: unknown): value is Goal[\"status\"] {\n\treturn value === \"active\" || value === \"paused\" || value === \"complete\";\n}\n\nfunction isNonNegativeSafeInteger(value: unknown): value is number {\n\treturn Number.isSafeInteger(value) && (value as number) >= 0;\n}\n\nfunction nowSeconds(): number {\n\treturn Math.trunc(Date.now() / 1000);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpt-5.6.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/prompt-preset/gpt-5.6.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,KAAK,+BAA+B,EAA4B,MAAM,kCAAkC,CAAC;AA8DlH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,+BAA+B,GAAG,MAAM,CAEjF"}
|