@bubblebrain-ai/bubble 0.0.63 → 0.0.64
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/README.md +437 -11
- package/dist/agent/abort-errors.d.ts +18 -0
- package/dist/agent/abort-errors.js +51 -0
- package/dist/agent/budget-ledger.d.ts +20 -0
- package/dist/agent/budget-ledger.js +45 -0
- package/dist/agent/categories.d.ts +100 -0
- package/dist/agent/categories.js +203 -0
- package/dist/agent/change-tracker.d.ts +40 -0
- package/dist/agent/change-tracker.js +89 -0
- package/dist/agent/child-runner.d.ts +64 -0
- package/dist/agent/child-runner.js +405 -0
- package/dist/agent/input-controller.d.ts +14 -0
- package/dist/agent/input-controller.js +43 -0
- package/dist/agent/internal-reminder-sanitizer.d.ts +25 -0
- package/dist/agent/internal-reminder-sanitizer.js +297 -0
- package/dist/agent/profiles.d.ts +76 -0
- package/dist/agent/profiles.js +526 -0
- package/dist/agent/provider-fingerprint.d.ts +6 -0
- package/dist/agent/provider-fingerprint.js +89 -0
- package/dist/agent/resident-history.d.ts +7 -0
- package/dist/agent/resident-history.js +61 -0
- package/dist/agent/result-integrator.d.ts +22 -0
- package/dist/agent/result-integrator.js +50 -0
- package/dist/agent/routing-catalog.d.ts +131 -0
- package/dist/agent/routing-catalog.js +260 -0
- package/dist/agent/structured-output.d.ts +37 -0
- package/dist/agent/structured-output.js +193 -0
- package/dist/agent/subagent/router.d.ts +65 -0
- package/dist/agent/subagent/router.js +203 -0
- package/dist/agent/subagent/runtime.d.ts +235 -0
- package/dist/agent/subagent/runtime.js +835 -0
- package/dist/agent/subagent-control.d.ts +100 -0
- package/dist/agent/subagent-control.js +70 -0
- package/dist/agent/subagent-lifecycle-reminder.d.ts +3 -0
- package/dist/agent/subagent-lifecycle-reminder.js +112 -0
- package/dist/agent/subagent-route-format.d.ts +8 -0
- package/dist/agent/subagent-route-format.js +18 -0
- package/dist/agent/subagent-scheduler.d.ts +105 -0
- package/dist/agent/subagent-scheduler.js +287 -0
- package/dist/agent/subagent-store.d.ts +57 -0
- package/dist/agent/subagent-store.js +180 -0
- package/dist/agent/subagent-summary.d.ts +30 -0
- package/dist/agent/subagent-summary.js +74 -0
- package/dist/agent/subagent-wait-guidance.d.ts +2 -0
- package/dist/agent/subagent-wait-guidance.js +8 -0
- package/dist/agent/subtask-policy.d.ts +13 -0
- package/dist/agent/subtask-policy.js +56 -0
- package/dist/agent/task-lifecycle-reminder.d.ts +26 -0
- package/dist/agent/task-lifecycle-reminder.js +59 -0
- package/dist/agent/tool-intent.d.ts +45 -0
- package/dist/agent/tool-intent.js +318 -0
- package/dist/agent/tool-visibility.d.ts +10 -0
- package/dist/agent/tool-visibility.js +6 -0
- package/dist/agent/transcript-helpers.d.ts +20 -0
- package/dist/agent/transcript-helpers.js +63 -0
- package/dist/agent/update-queue.d.ts +13 -0
- package/dist/agent/update-queue.js +69 -0
- package/dist/agent/workflow/control.d.ts +60 -0
- package/dist/agent/workflow/control.js +62 -0
- package/dist/agent/workflow/errors.d.ts +16 -0
- package/dist/agent/workflow/errors.js +24 -0
- package/dist/agent/workflow/runs.d.ts +73 -0
- package/dist/agent/workflow/runs.js +160 -0
- package/dist/agent/workflow/runtime.d.ts +88 -0
- package/dist/agent/workflow/runtime.js +319 -0
- package/dist/agent/worktree.d.ts +29 -0
- package/dist/agent/worktree.js +73 -0
- package/dist/agent.d.ts +460 -0
- package/dist/agent.js +2210 -0
- package/dist/anthropic-thinking.d.ts +4 -0
- package/dist/anthropic-thinking.js +11 -0
- package/dist/approval/controller.d.ts +71 -0
- package/dist/approval/controller.js +286 -0
- package/dist/approval/danger.d.ts +13 -0
- package/dist/approval/danger.js +55 -0
- package/dist/approval/diff-hunks.d.ts +12 -0
- package/dist/approval/diff-hunks.js +32 -0
- package/dist/approval/protected-paths.d.ts +1 -0
- package/dist/approval/protected-paths.js +35 -0
- package/dist/approval/session-cache.d.ts +21 -0
- package/dist/approval/session-cache.js +38 -0
- package/dist/approval/tool-helper.d.ts +14 -0
- package/dist/approval/tool-helper.js +47 -0
- package/dist/approval/types.d.ts +146 -0
- package/dist/approval/types.js +8 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +3 -0
- package/dist/bubble-home.d.ts +8 -0
- package/dist/bubble-home.js +19 -0
- package/dist/checkpoints.d.ts +57 -0
- package/dist/checkpoints.js +0 -0
- package/dist/cli.d.ts +37 -0
- package/dist/cli.js +175 -0
- package/dist/clipboard.d.ts +14 -0
- package/dist/clipboard.js +132 -0
- package/dist/config.d.ts +96 -0
- package/dist/config.js +287 -0
- package/dist/context/budget.d.ts +28 -0
- package/dist/context/budget.js +130 -0
- package/dist/context/checkpoint.d.ts +18 -0
- package/dist/context/checkpoint.js +117 -0
- package/dist/context/compact-llm.d.ts +25 -0
- package/dist/context/compact-llm.js +175 -0
- package/dist/context/compact.d.ts +124 -0
- package/dist/context/compact.js +635 -0
- package/dist/context/compaction-files.d.ts +44 -0
- package/dist/context/compaction-files.js +148 -0
- package/dist/context/llm-compactor.d.ts +53 -0
- package/dist/context/llm-compactor.js +424 -0
- package/dist/context/overflow.d.ts +9 -0
- package/dist/context/overflow.js +50 -0
- package/dist/context/projector.d.ts +34 -0
- package/dist/context/projector.js +251 -0
- package/dist/context/prune.d.ts +26 -0
- package/dist/context/prune.js +171 -0
- package/dist/context/session-write-lock.d.ts +20 -0
- package/dist/context/session-write-lock.js +162 -0
- package/dist/context/token-estimator.d.ts +14 -0
- package/dist/context/token-estimator.js +106 -0
- package/dist/context/tool-images.d.ts +3 -0
- package/dist/context/tool-images.js +35 -0
- package/dist/context/tool-output-truncate.d.ts +24 -0
- package/dist/context/tool-output-truncate.js +181 -0
- package/dist/context/usage.d.ts +34 -0
- package/dist/context/usage.js +230 -0
- package/dist/debug-trace.d.ts +27 -0
- package/dist/debug-trace.js +401 -0
- package/dist/diff-stats.d.ts +5 -0
- package/dist/diff-stats.js +21 -0
- package/dist/external-runtime/grok-acp.d.ts +56 -0
- package/dist/external-runtime/grok-acp.js +386 -0
- package/dist/external-runtime/grok-binary.d.ts +25 -0
- package/dist/external-runtime/grok-binary.js +108 -0
- package/dist/external-runtime/grok-errors.d.ts +7 -0
- package/dist/external-runtime/grok-errors.js +15 -0
- package/dist/external-runtime/grok-input-policy.d.ts +58 -0
- package/dist/external-runtime/grok-input-policy.js +52 -0
- package/dist/external-runtime/grok-ndjson.d.ts +14 -0
- package/dist/external-runtime/grok-ndjson.js +193 -0
- package/dist/external-runtime/grok-network.d.ts +15 -0
- package/dist/external-runtime/grok-network.js +81 -0
- package/dist/external-runtime/grok-preflight.d.ts +28 -0
- package/dist/external-runtime/grok-preflight.js +194 -0
- package/dist/external-runtime/grok-process.d.ts +26 -0
- package/dist/external-runtime/grok-process.js +184 -0
- package/dist/external-runtime/grok-profile.d.ts +32 -0
- package/dist/external-runtime/grok-profile.js +419 -0
- package/dist/external-runtime/grok-provider.d.ts +31 -0
- package/dist/external-runtime/grok-provider.js +41 -0
- package/dist/external-runtime/grok-runtime.d.ts +91 -0
- package/dist/external-runtime/grok-runtime.js +882 -0
- package/dist/external-runtime/index.d.ts +13 -0
- package/dist/external-runtime/index.js +13 -0
- package/dist/external-runtime/session-policy.d.ts +11 -0
- package/dist/external-runtime/session-policy.js +30 -0
- package/dist/external-runtime/types.d.ts +65 -0
- package/dist/external-runtime/types.js +1 -0
- package/dist/feedback/collect.d.ts +7 -0
- package/dist/feedback/collect.js +119 -0
- package/dist/feedback/config.d.ts +14 -0
- package/dist/feedback/config.js +16 -0
- package/dist/feedback/redact.d.ts +1 -0
- package/dist/feedback/redact.js +25 -0
- package/dist/feedback/submit.d.ts +6 -0
- package/dist/feedback/submit.js +43 -0
- package/dist/feedback/types.d.ts +22 -0
- package/dist/feedback/types.js +1 -0
- package/dist/feishu/agent-host/approval-card.d.ts +11 -0
- package/dist/feishu/agent-host/approval-card.js +85 -0
- package/dist/feishu/agent-host/approval-ui.d.ts +59 -0
- package/dist/feishu/agent-host/approval-ui.js +214 -0
- package/dist/feishu/agent-host/run-driver.d.ts +51 -0
- package/dist/feishu/agent-host/run-driver.js +397 -0
- package/dist/feishu/agent-host/runtime-deps.d.ts +33 -0
- package/dist/feishu/agent-host/runtime-deps.js +8 -0
- package/dist/feishu/card/budget.d.ts +40 -0
- package/dist/feishu/card/budget.js +134 -0
- package/dist/feishu/card/renderer.d.ts +29 -0
- package/dist/feishu/card/renderer.js +245 -0
- package/dist/feishu/card/run-state-types.d.ts +49 -0
- package/dist/feishu/card/run-state-types.js +15 -0
- package/dist/feishu/card/run-state.d.ts +21 -0
- package/dist/feishu/card/run-state.js +223 -0
- package/dist/feishu/channel/channel.d.ts +52 -0
- package/dist/feishu/channel/channel.js +74 -0
- package/dist/feishu/config.d.ts +24 -0
- package/dist/feishu/config.js +97 -0
- package/dist/feishu/format.d.ts +6 -0
- package/dist/feishu/format.js +14 -0
- package/dist/feishu/index.d.ts +4 -0
- package/dist/feishu/index.js +4 -0
- package/dist/feishu/logger.d.ts +31 -0
- package/dist/feishu/logger.js +62 -0
- package/dist/feishu/paths.d.ts +12 -0
- package/dist/feishu/paths.js +38 -0
- package/dist/feishu/process-registry.d.ts +29 -0
- package/dist/feishu/process-registry.js +90 -0
- package/dist/feishu/router/commands.d.ts +38 -0
- package/dist/feishu/router/commands.js +286 -0
- package/dist/feishu/router/event-router.d.ts +40 -0
- package/dist/feishu/router/event-router.js +208 -0
- package/dist/feishu/router/whitelist.d.ts +23 -0
- package/dist/feishu/router/whitelist.js +20 -0
- package/dist/feishu/runtime/active-runs.d.ts +32 -0
- package/dist/feishu/runtime/active-runs.js +84 -0
- package/dist/feishu/runtime/pending-queue.d.ts +36 -0
- package/dist/feishu/runtime/pending-queue.js +98 -0
- package/dist/feishu/runtime/process-pool.d.ts +29 -0
- package/dist/feishu/runtime/process-pool.js +49 -0
- package/dist/feishu/schema.d.ts +17 -0
- package/dist/feishu/schema.js +252 -0
- package/dist/feishu/scope/scope-registry.d.ts +39 -0
- package/dist/feishu/scope/scope-registry.js +148 -0
- package/dist/feishu/scope/session-binder.d.ts +44 -0
- package/dist/feishu/scope/session-binder.js +100 -0
- package/dist/feishu/scope/session-store.d.ts +24 -0
- package/dist/feishu/scope/session-store.js +73 -0
- package/dist/feishu/secrets.d.ts +37 -0
- package/dist/feishu/secrets.js +129 -0
- package/dist/feishu/serve.d.ts +12 -0
- package/dist/feishu/serve.js +302 -0
- package/dist/feishu/types.d.ts +75 -0
- package/dist/feishu/types.js +23 -0
- package/dist/feishu/wizard.d.ts +24 -0
- package/dist/feishu/wizard.js +121 -0
- package/dist/goal/command.d.ts +20 -0
- package/dist/goal/command.js +76 -0
- package/dist/goal/engine.d.ts +33 -0
- package/dist/goal/engine.js +65 -0
- package/dist/goal/format.d.ts +18 -0
- package/dist/goal/format.js +112 -0
- package/dist/goal/prompts.d.ts +13 -0
- package/dist/goal/prompts.js +84 -0
- package/dist/goal/store.d.ts +64 -0
- package/dist/goal/store.js +174 -0
- package/dist/goal/tools.d.ts +13 -0
- package/dist/goal/tools.js +67 -0
- package/dist/goal/usage.d.ts +2 -0
- package/dist/goal/usage.js +3 -0
- package/dist/hooks/config.d.ts +9 -0
- package/dist/hooks/config.js +278 -0
- package/dist/hooks/controller.d.ts +24 -0
- package/dist/hooks/controller.js +254 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/log.d.ts +14 -0
- package/dist/hooks/log.js +54 -0
- package/dist/hooks/runner.d.ts +5 -0
- package/dist/hooks/runner.js +225 -0
- package/dist/hooks/trust.d.ts +37 -0
- package/dist/hooks/trust.js +143 -0
- package/dist/hooks/types.d.ts +173 -0
- package/dist/hooks/types.js +46 -0
- package/dist/loop/engine.d.ts +29 -0
- package/dist/loop/engine.js +63 -0
- package/dist/lsp/config.d.ts +18 -0
- package/dist/lsp/config.js +58 -0
- package/dist/lsp/diagnostics.d.ts +24 -0
- package/dist/lsp/diagnostics.js +103 -0
- package/dist/lsp/index.d.ts +3 -0
- package/dist/lsp/index.js +3 -0
- package/dist/lsp/service.d.ts +97 -0
- package/dist/lsp/service.js +815 -0
- package/dist/main.d.ts +5 -0
- package/dist/main.js +984 -0
- package/dist/mcp/client.d.ts +68 -0
- package/dist/mcp/client.js +177 -0
- package/dist/mcp/config.d.ts +30 -0
- package/dist/mcp/config.js +144 -0
- package/dist/mcp/manager.d.ts +67 -0
- package/dist/mcp/manager.js +328 -0
- package/dist/mcp/name.d.ts +26 -0
- package/dist/mcp/name.js +40 -0
- package/dist/mcp/transports.d.ts +54 -0
- package/dist/mcp/transports.js +267 -0
- package/dist/mcp/types.d.ts +111 -0
- package/dist/mcp/types.js +14 -0
- package/dist/memory/db.d.ts +65 -0
- package/dist/memory/db.js +332 -0
- package/dist/memory/index.d.ts +10 -0
- package/dist/memory/index.js +10 -0
- package/dist/memory/paths.d.ts +18 -0
- package/dist/memory/paths.js +38 -0
- package/dist/memory/phase1.d.ts +23 -0
- package/dist/memory/phase1.js +292 -0
- package/dist/memory/phase2.d.ts +19 -0
- package/dist/memory/phase2.js +119 -0
- package/dist/memory/prompts.d.ts +19 -0
- package/dist/memory/prompts.js +104 -0
- package/dist/memory/reset.d.ts +1 -0
- package/dist/memory/reset.js +13 -0
- package/dist/memory/session-policy.d.ts +25 -0
- package/dist/memory/session-policy.js +55 -0
- package/dist/memory/start.d.ts +24 -0
- package/dist/memory/start.js +50 -0
- package/dist/memory/storage.d.ts +11 -0
- package/dist/memory/storage.js +95 -0
- package/dist/memory/store.d.ts +43 -0
- package/dist/memory/store.js +193 -0
- package/dist/memory/usage.d.ts +1 -0
- package/dist/memory/usage.js +38 -0
- package/dist/model-catalog.d.ts +65 -0
- package/dist/model-catalog.js +387 -0
- package/dist/model-config.d.ts +40 -0
- package/dist/model-config.js +74 -0
- package/dist/model-data.generated.d.ts +16 -0
- package/dist/model-data.generated.js +275 -0
- package/dist/model-pricing.d.ts +54 -0
- package/dist/model-pricing.js +244 -0
- package/dist/model-selection.d.ts +7 -0
- package/dist/model-selection.js +18 -0
- package/dist/network/chatgpt-transport.d.ts +16 -0
- package/dist/network/chatgpt-transport.js +232 -0
- package/dist/network/errors.d.ts +47 -0
- package/dist/network/errors.js +48 -0
- package/dist/network/provider-transport-log.d.ts +12 -0
- package/dist/network/provider-transport-log.js +32 -0
- package/dist/network/provider-transport.d.ts +37 -0
- package/dist/network/provider-transport.js +256 -0
- package/dist/network/retry.d.ts +34 -0
- package/dist/network/retry.js +97 -0
- package/dist/network/system-proxy.d.ts +18 -0
- package/dist/network/system-proxy.js +175 -0
- package/dist/oauth/grok.d.ts +26 -0
- package/dist/oauth/grok.js +251 -0
- package/dist/oauth/index.d.ts +4 -0
- package/dist/oauth/index.js +3 -0
- package/dist/oauth/openai-codex.d.ts +15 -0
- package/dist/oauth/openai-codex.js +193 -0
- package/dist/oauth/refresh-control.d.ts +12 -0
- package/dist/oauth/refresh-control.js +42 -0
- package/dist/oauth/storage.d.ts +88 -0
- package/dist/oauth/storage.js +357 -0
- package/dist/oauth/types.d.ts +15 -0
- package/dist/oauth/types.js +1 -0
- package/dist/orchestrator/default-hooks.d.ts +22 -0
- package/dist/orchestrator/default-hooks.js +127 -0
- package/dist/orchestrator/hooks.d.ts +69 -0
- package/dist/orchestrator/hooks.js +52 -0
- package/dist/permission/mode.d.ts +19 -0
- package/dist/permission/mode.js +16 -0
- package/dist/permissions/rule.d.ts +42 -0
- package/dist/permissions/rule.js +293 -0
- package/dist/permissions/settings.d.ts +97 -0
- package/dist/permissions/settings.js +289 -0
- package/dist/permissions/shell-command.d.ts +36 -0
- package/dist/permissions/shell-command.js +226 -0
- package/dist/permissions/trust-prompt.d.ts +10 -0
- package/dist/permissions/trust-prompt.js +34 -0
- package/dist/permissions/trust.d.ts +26 -0
- package/dist/permissions/trust.js +113 -0
- package/dist/permissions/types.d.ts +61 -0
- package/dist/permissions/types.js +14 -0
- package/dist/print-output.d.ts +98 -0
- package/dist/print-output.js +117 -0
- package/dist/prompt/compose.d.ts +19 -0
- package/dist/prompt/compose.js +110 -0
- package/dist/prompt/delegation.d.ts +14 -0
- package/dist/prompt/delegation.js +100 -0
- package/dist/prompt/environment.d.ts +12 -0
- package/dist/prompt/environment.js +55 -0
- package/dist/prompt/provider-prompts/anthropic.d.ts +1 -0
- package/dist/prompt/provider-prompts/anthropic.js +5 -0
- package/dist/prompt/provider-prompts/codex.d.ts +1 -0
- package/dist/prompt/provider-prompts/codex.js +5 -0
- package/dist/prompt/provider-prompts/deepseek.d.ts +1 -0
- package/dist/prompt/provider-prompts/deepseek.js +7 -0
- package/dist/prompt/provider-prompts/default.d.ts +1 -0
- package/dist/prompt/provider-prompts/default.js +6 -0
- package/dist/prompt/provider-prompts/gemini.d.ts +1 -0
- package/dist/prompt/provider-prompts/gemini.js +5 -0
- package/dist/prompt/provider-prompts/glm.d.ts +1 -0
- package/dist/prompt/provider-prompts/glm.js +7 -0
- package/dist/prompt/provider-prompts/gpt.d.ts +1 -0
- package/dist/prompt/provider-prompts/gpt.js +5 -0
- package/dist/prompt/provider-prompts/kimi.d.ts +1 -0
- package/dist/prompt/provider-prompts/kimi.js +8 -0
- package/dist/prompt/reminders.d.ts +33 -0
- package/dist/prompt/reminders.js +135 -0
- package/dist/prompt/routing.d.ts +14 -0
- package/dist/prompt/routing.js +71 -0
- package/dist/prompt/runtime.d.ts +12 -0
- package/dist/prompt/runtime.js +40 -0
- package/dist/prompt/task-reminders.d.ts +12 -0
- package/dist/prompt/task-reminders.js +64 -0
- package/dist/provider-ai-sdk.d.ts +59 -0
- package/dist/provider-ai-sdk.js +541 -0
- package/dist/provider-anthropic.d.ts +126 -0
- package/dist/provider-anthropic.js +940 -0
- package/dist/provider-ark-responses.d.ts +29 -0
- package/dist/provider-ark-responses.js +518 -0
- package/dist/provider-artifacts.d.ts +7 -0
- package/dist/provider-artifacts.js +60 -0
- package/dist/provider-error-record.d.ts +43 -0
- package/dist/provider-error-record.js +213 -0
- package/dist/provider-grok.d.ts +50 -0
- package/dist/provider-grok.js +110 -0
- package/dist/provider-model-policy.d.ts +16 -0
- package/dist/provider-model-policy.js +33 -0
- package/dist/provider-openai-codex.d.ts +66 -0
- package/dist/provider-openai-codex.js +781 -0
- package/dist/provider-registry.d.ts +197 -0
- package/dist/provider-registry.js +1194 -0
- package/dist/provider-transform.d.ts +12 -0
- package/dist/provider-transform.js +293 -0
- package/dist/provider-zen-errors.d.ts +9 -0
- package/dist/provider-zen-errors.js +36 -0
- package/dist/provider.d.ts +85 -0
- package/dist/provider.js +925 -0
- package/dist/question/controller.d.ts +22 -0
- package/dist/question/controller.js +98 -0
- package/dist/question/index.d.ts +2 -0
- package/dist/question/index.js +2 -0
- package/dist/question/normalize.d.ts +6 -0
- package/dist/question/normalize.js +11 -0
- package/dist/question/types.d.ts +42 -0
- package/dist/question/types.js +6 -0
- package/dist/reasoning-debug.d.ts +7 -0
- package/dist/reasoning-debug.js +33 -0
- package/dist/rewind.d.ts +20 -0
- package/dist/rewind.js +29 -0
- package/dist/sdk/index.d.ts +319 -0
- package/dist/sdk/index.js +1068 -0
- package/dist/sdk/replay-event-log.d.ts +26 -0
- package/dist/sdk/replay-event-log.js +122 -0
- package/dist/sdk/session-turn-coordinator.d.ts +45 -0
- package/dist/sdk/session-turn-coordinator.js +227 -0
- package/dist/session-context-fence.d.ts +16 -0
- package/dist/session-context-fence.js +26 -0
- package/dist/session-log.d.ts +25 -0
- package/dist/session-log.js +444 -0
- package/dist/session-title.d.ts +16 -0
- package/dist/session-title.js +131 -0
- package/dist/session-types.d.ts +86 -0
- package/dist/session-types.js +1 -0
- package/dist/session.d.ts +135 -0
- package/dist/session.js +664 -0
- package/dist/skills/discovery.d.ts +12 -0
- package/dist/skills/discovery.js +166 -0
- package/dist/skills/format.d.ts +32 -0
- package/dist/skills/format.js +68 -0
- package/dist/skills/frontmatter.d.ts +5 -0
- package/dist/skills/frontmatter.js +60 -0
- package/dist/skills/invocation.d.ts +8 -0
- package/dist/skills/invocation.js +33 -0
- package/dist/skills/registry.d.ts +28 -0
- package/dist/skills/registry.js +79 -0
- package/dist/skills/types.d.ts +34 -0
- package/dist/skills/types.js +1 -0
- package/dist/slash-commands/commands.d.ts +10 -0
- package/dist/slash-commands/commands.js +1251 -0
- package/dist/slash-commands/feishu.d.ts +17 -0
- package/dist/slash-commands/feishu.js +400 -0
- package/dist/slash-commands/index.d.ts +4 -0
- package/dist/slash-commands/index.js +8 -0
- package/dist/slash-commands/registry.d.ts +32 -0
- package/dist/slash-commands/registry.js +73 -0
- package/dist/slash-commands/types.d.ts +109 -0
- package/dist/slash-commands/types.js +1 -0
- package/dist/slash-commands/unified.d.ts +38 -0
- package/dist/slash-commands/unified.js +38 -0
- package/dist/stats/usage.d.ts +59 -0
- package/dist/stats/usage.js +485 -0
- package/dist/stream-json.d.ts +13 -0
- package/dist/stream-json.js +74 -0
- package/dist/system-prompt.d.ts +40 -0
- package/dist/system-prompt.js +7 -0
- package/dist/tasks/manager.d.ts +145 -0
- package/dist/tasks/manager.js +634 -0
- package/dist/tasks/process-utils.d.ts +10 -0
- package/dist/tasks/process-utils.js +49 -0
- package/dist/tasks/promotion.d.ts +17 -0
- package/dist/tasks/promotion.js +30 -0
- package/dist/tasks/wake.d.ts +53 -0
- package/dist/tasks/wake.js +125 -0
- package/dist/text-display.d.ts +3 -0
- package/dist/text-display.js +25 -0
- package/dist/tools/agent-lifecycle.d.ts +30 -0
- package/dist/tools/agent-lifecycle.js +790 -0
- package/dist/tools/bash.d.ts +23 -0
- package/dist/tools/bash.js +443 -0
- package/dist/tools/child-tools.d.ts +41 -0
- package/dist/tools/child-tools.js +122 -0
- package/dist/tools/edit-apply.d.ts +25 -0
- package/dist/tools/edit-apply.js +274 -0
- package/dist/tools/edit.d.ts +18 -0
- package/dist/tools/edit.js +200 -0
- package/dist/tools/exa-mcp.d.ts +3 -0
- package/dist/tools/exa-mcp.js +74 -0
- package/dist/tools/exit-plan-mode.d.ts +22 -0
- package/dist/tools/exit-plan-mode.js +79 -0
- package/dist/tools/file-mutation-queue.d.ts +2 -0
- package/dist/tools/file-mutation-queue.js +43 -0
- package/dist/tools/file-state.d.ts +48 -0
- package/dist/tools/file-state.js +76 -0
- package/dist/tools/grep.d.ts +9 -0
- package/dist/tools/grep.js +387 -0
- package/dist/tools/index.d.ts +63 -0
- package/dist/tools/index.js +76 -0
- package/dist/tools/ls.d.ts +3 -0
- package/dist/tools/ls.js +85 -0
- package/dist/tools/lsp.d.ts +4 -0
- package/dist/tools/lsp.js +95 -0
- package/dist/tools/memory.d.ts +8 -0
- package/dist/tools/memory.js +77 -0
- package/dist/tools/path-utils.d.ts +8 -0
- package/dist/tools/path-utils.js +53 -0
- package/dist/tools/prompt-metadata.d.ts +3 -0
- package/dist/tools/prompt-metadata.js +17 -0
- package/dist/tools/question.d.ts +3 -0
- package/dist/tools/question.js +177 -0
- package/dist/tools/read.d.ts +8 -0
- package/dist/tools/read.js +309 -0
- package/dist/tools/sensitive-paths.d.ts +11 -0
- package/dist/tools/sensitive-paths.js +106 -0
- package/dist/tools/server-manager.d.ts +6 -0
- package/dist/tools/server-manager.js +6 -0
- package/dist/tools/server.d.ts +6 -0
- package/dist/tools/server.js +249 -0
- package/dist/tools/skill-search.d.ts +10 -0
- package/dist/tools/skill-search.js +134 -0
- package/dist/tools/skill.d.ts +7 -0
- package/dist/tools/skill.js +81 -0
- package/dist/tools/task-tools.d.ts +10 -0
- package/dist/tools/task-tools.js +133 -0
- package/dist/tools/tool-search.d.ts +23 -0
- package/dist/tools/tool-search.js +145 -0
- package/dist/tools/web-fetch.d.ts +6 -0
- package/dist/tools/web-fetch.js +76 -0
- package/dist/tools/web-search.d.ts +5 -0
- package/dist/tools/web-search.js +50 -0
- package/dist/tools/write.d.ts +10 -0
- package/dist/tools/write.js +155 -0
- package/dist/tui/animation-clock.d.ts +14 -0
- package/dist/tui/animation-clock.js +34 -0
- package/dist/tui/app.d.ts +176 -0
- package/dist/tui/app.js +1659 -0
- package/dist/tui/components/approval-dialog.d.ts +43 -0
- package/dist/tui/components/approval-dialog.js +212 -0
- package/dist/tui/components/bottom-sheet.d.ts +9 -0
- package/dist/tui/components/bottom-sheet.js +32 -0
- package/dist/tui/components/context-info.d.ts +54 -0
- package/dist/tui/components/context-info.js +388 -0
- package/dist/tui/components/feedback-dialog.d.ts +56 -0
- package/dist/tui/components/feedback-dialog.js +262 -0
- package/dist/tui/components/feishu-setup-dialog.d.ts +65 -0
- package/dist/tui/components/feishu-setup-dialog.js +332 -0
- package/dist/tui/components/image-preview.d.ts +32 -0
- package/dist/tui/components/image-preview.js +130 -0
- package/dist/tui/components/plan-dialog.d.ts +34 -0
- package/dist/tui/components/plan-dialog.js +196 -0
- package/dist/tui/components/provider-key-input.d.ts +18 -0
- package/dist/tui/components/provider-key-input.js +49 -0
- package/dist/tui/components/question-dialog.d.ts +25 -0
- package/dist/tui/components/question-dialog.js +263 -0
- package/dist/tui/components/responsive-transcript.d.ts +31 -0
- package/dist/tui/components/responsive-transcript.js +77 -0
- package/dist/tui/components/rewind-picker.d.ts +62 -0
- package/dist/tui/components/rewind-picker.js +317 -0
- package/dist/tui/components/session-picker.d.ts +49 -0
- package/dist/tui/components/session-picker.js +303 -0
- package/dist/tui/components/skills-panel.d.ts +63 -0
- package/dist/tui/components/skills-panel.js +582 -0
- package/dist/tui/components/stats-panel.d.ts +40 -0
- package/dist/tui/components/stats-panel.js +301 -0
- package/dist/tui/components/streaming-message.d.ts +69 -0
- package/dist/tui/components/streaming-message.js +398 -0
- package/dist/tui/components/subagent-inspector.d.ts +28 -0
- package/dist/tui/components/subagent-inspector.js +127 -0
- package/dist/tui/components/task-inspector.d.ts +26 -0
- package/dist/tui/components/task-inspector.js +70 -0
- package/dist/tui/components/tasks-pane.d.ts +126 -0
- package/dist/tui/components/tasks-pane.js +566 -0
- package/dist/tui/components/transcript.d.ts +103 -0
- package/dist/tui/components/transcript.js +858 -0
- package/dist/tui/components/welcome.d.ts +20 -0
- package/dist/tui/components/welcome.js +133 -0
- package/dist/tui/components/workflow-inspector.d.ts +30 -0
- package/dist/tui/components/workflow-inspector.js +136 -0
- package/dist/tui/composer-autocomplete.d.ts +76 -0
- package/dist/tui/composer-autocomplete.js +465 -0
- package/dist/tui/composer-style.d.ts +7 -0
- package/dist/tui/composer-style.js +29 -0
- package/dist/tui/controller/agent-event-reducer.d.ts +75 -0
- package/dist/tui/controller/agent-event-reducer.js +239 -0
- package/dist/tui/controller/composer-controller.d.ts +95 -0
- package/dist/tui/controller/composer-controller.js +502 -0
- package/dist/tui/controller/controller.d.ts +199 -0
- package/dist/tui/controller/controller.js +1034 -0
- package/dist/tui/controller/effects.d.ts +71 -0
- package/dist/tui/controller/effects.js +1 -0
- package/dist/tui/controller/goal-runtime-controller.d.ts +47 -0
- package/dist/tui/controller/goal-runtime-controller.js +202 -0
- package/dist/tui/controller/input-queue-machine.d.ts +71 -0
- package/dist/tui/controller/input-queue-machine.js +121 -0
- package/dist/tui/controller/intents.d.ts +56 -0
- package/dist/tui/controller/intents.js +6 -0
- package/dist/tui/controller/overlay-controller.d.ts +64 -0
- package/dist/tui/controller/overlay-controller.js +129 -0
- package/dist/tui/controller/ports.d.ts +57 -0
- package/dist/tui/controller/ports.js +9 -0
- package/dist/tui/controller/session-transition.d.ts +54 -0
- package/dist/tui/controller/session-transition.js +68 -0
- package/dist/tui/controller/state.d.ts +14 -0
- package/dist/tui/controller/state.js +36 -0
- package/dist/tui/controller/task-runtime-controller.d.ts +66 -0
- package/dist/tui/controller/task-runtime-controller.js +158 -0
- package/dist/tui/detect-theme.d.ts +4 -0
- package/dist/tui/detect-theme.js +116 -0
- package/dist/tui/display-history.d.ts +64 -0
- package/dist/tui/display-history.js +283 -0
- package/dist/tui/display-sanitizer.d.ts +3 -0
- package/dist/tui/display-sanitizer.js +38 -0
- package/dist/tui/edit-diff.d.ts +11 -0
- package/dist/tui/edit-diff.js +57 -0
- package/dist/tui/file-mentions.d.ts +29 -0
- package/dist/tui/file-mentions.js +174 -0
- package/dist/tui/footer.d.ts +37 -0
- package/dist/tui/footer.js +80 -0
- package/dist/tui/formatting/edit-diff.d.ts +11 -0
- package/dist/tui/formatting/edit-diff.js +52 -0
- package/dist/tui/formatting/summary.d.ts +43 -0
- package/dist/tui/formatting/summary.js +150 -0
- package/dist/tui/fullscreen.d.ts +48 -0
- package/dist/tui/fullscreen.js +256 -0
- package/dist/tui/image-display.d.ts +23 -0
- package/dist/tui/image-display.js +92 -0
- package/dist/tui/image-paste.d.ts +113 -0
- package/dist/tui/image-paste.js +565 -0
- package/dist/tui/input-history.d.ts +47 -0
- package/dist/tui/input-history.js +250 -0
- package/dist/tui/markdown-style.d.ts +5 -0
- package/dist/tui/markdown-style.js +23 -0
- package/dist/tui/model/composer-buffer.d.ts +55 -0
- package/dist/tui/model/composer-buffer.js +317 -0
- package/dist/tui/model/composer-types.d.ts +17 -0
- package/dist/tui/model/composer-types.js +1 -0
- package/dist/tui/model/display-history.d.ts +78 -0
- package/dist/tui/model/display-history.js +124 -0
- package/dist/tui/model/display-reconstruct.d.ts +3 -0
- package/dist/tui/model/display-reconstruct.js +130 -0
- package/dist/tui/model/file-mentions.d.ts +31 -0
- package/dist/tui/model/file-mentions.js +178 -0
- package/dist/tui/model/image-attachment.d.ts +15 -0
- package/dist/tui/model/image-attachment.js +1 -0
- package/dist/tui/model/image-paste.d.ts +119 -0
- package/dist/tui/model/image-paste.js +610 -0
- package/dist/tui/model/input-history.d.ts +1 -0
- package/dist/tui/model/input-history.js +1 -0
- package/dist/tui/model/input-queue.d.ts +12 -0
- package/dist/tui/model/input-queue.js +17 -0
- package/dist/tui/model/key-events.d.ts +9 -0
- package/dist/tui/model/key-events.js +8 -0
- package/dist/tui/model/paste-operation-tracker.d.ts +13 -0
- package/dist/tui/model/paste-operation-tracker.js +25 -0
- package/dist/tui/model/recent-activity.d.ts +8 -0
- package/dist/tui/model/recent-activity.js +71 -0
- package/dist/tui/model/subagent-view.d.ts +87 -0
- package/dist/tui/model/subagent-view.js +336 -0
- package/dist/tui/model/submit-dedupe.d.ts +5 -0
- package/dist/tui/model/submit-dedupe.js +25 -0
- package/dist/tui/model/sync-output.d.ts +17 -0
- package/dist/tui/model/sync-output.js +35 -0
- package/dist/tui/model/task-lifecycle.d.ts +57 -0
- package/dist/tui/model/task-lifecycle.js +124 -0
- package/dist/tui/model/terminal-env.d.ts +15 -0
- package/dist/tui/model/terminal-env.js +22 -0
- package/dist/tui/model/terminal-mouse.d.ts +28 -0
- package/dist/tui/model/terminal-mouse.js +82 -0
- package/dist/tui/model/theme-style.d.ts +10 -0
- package/dist/tui/model/theme-style.js +79 -0
- package/dist/tui/model/theme.d.ts +72 -0
- package/dist/tui/model/theme.js +121 -0
- package/dist/tui/model/trace-groups.d.ts +45 -0
- package/dist/tui/model/trace-groups.js +558 -0
- package/dist/tui/model/trace-interaction.d.ts +63 -0
- package/dist/tui/model/trace-interaction.js +87 -0
- package/dist/tui/model/width.d.ts +18 -0
- package/dist/tui/model/width.js +130 -0
- package/dist/tui/model-picker-data.d.ts +9 -0
- package/dist/tui/model-picker-data.js +39 -0
- package/dist/tui/model-switch.d.ts +49 -0
- package/dist/tui/model-switch.js +67 -0
- package/dist/tui/paste-placeholder.d.ts +11 -0
- package/dist/tui/paste-placeholder.js +52 -0
- package/dist/tui/recent-activity.d.ts +8 -0
- package/dist/tui/recent-activity.js +71 -0
- package/dist/tui/run-session-picker.d.ts +9 -0
- package/dist/tui/run-session-picker.js +64 -0
- package/dist/tui/run.d.ts +72 -0
- package/dist/tui/run.js +139 -0
- package/dist/tui/session-display.d.ts +6 -0
- package/dist/tui/session-display.js +12 -0
- package/dist/tui/session-picker-data.d.ts +18 -0
- package/dist/tui/session-picker-data.js +21 -0
- package/dist/tui/terminal/multiplexer.d.ts +5 -0
- package/dist/tui/terminal/multiplexer.js +14 -0
- package/dist/tui/testing/fake-agent.d.ts +24 -0
- package/dist/tui/testing/fake-agent.js +22 -0
- package/dist/tui/testing/spy-host.d.ts +21 -0
- package/dist/tui/testing/spy-host.js +55 -0
- package/dist/tui/trace-groups.d.ts +43 -0
- package/dist/tui/trace-groups.js +554 -0
- package/dist/tui/wordmark.d.ts +18 -0
- package/dist/tui/wordmark.js +208 -0
- package/dist/types.d.ts +503 -0
- package/dist/types.js +4 -0
- package/dist/update/index.d.ts +61 -0
- package/dist/update/index.js +267 -0
- package/dist/variant/thinking-level.d.ts +5 -0
- package/dist/variant/thinking-level.js +26 -0
- package/dist/variant/variant-resolver.d.ts +28 -0
- package/dist/variant/variant-resolver.js +62 -0
- package/node_modules/@bubblebrain-ai/pi-tui/LICENSE +21 -0
- package/node_modules/@bubblebrain-ai/pi-tui/README.md +854 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.d.ts +26 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.js +121 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.d.ts +86 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.js +649 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.d.ts +13 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.js +36 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.d.ts +22 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.js +99 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.d.ts +22 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.js +36 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.d.ts +330 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.js +2344 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.d.ts +7 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.js +43 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.d.ts +28 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.js +82 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.d.ts +48 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.js +390 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.d.ts +31 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.js +67 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.d.ts +103 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.js +797 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.d.ts +56 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.js +179 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.d.ts +53 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.js +175 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.d.ts +50 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.js +174 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.d.ts +12 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.js +22 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.d.ts +32 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.js +109 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.d.ts +19 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.js +81 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.d.ts +13 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.js +48 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.d.ts +8 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.js +26 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.d.ts +39 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.js +2 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.d.ts +16 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.js +110 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.d.ts +31 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.js +42 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.d.ts +273 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.js +231 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.d.ts +184 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.js +1174 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.d.ts +28 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.js +46 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.d.ts +10 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.js +1268 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.d.ts +40 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.js +6 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.d.ts +42 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.js +335 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.d.ts +3 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.js +60 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.d.ts +56 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.js +363 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.d.ts +10 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.js +59 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.d.ts +116 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.js +518 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.d.ts +142 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.js +544 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.d.ts +11 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.js +11 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.d.ts +141 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.js +1340 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.d.ts +39 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.js +536 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.d.ts +340 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.js +1020 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.d.ts +17 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.js +27 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.d.ts +96 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.js +1193 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.d.ts +25 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.js +96 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.d.ts +73 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.js +188 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/README.md +20 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/build.sh +62 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/src/darwin-modifiers.c +70 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/README.md +22 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/build.mjs +229 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/src/win32-console-mode.c +119 -0
- package/node_modules/@bubblebrain-ai/pi-tui/package.json +66 -0
- package/node_modules/get-east-asian-width/index.d.ts +60 -0
- package/node_modules/get-east-asian-width/index.js +30 -0
- package/node_modules/get-east-asian-width/license +9 -0
- package/node_modules/get-east-asian-width/lookup-data.js +21 -0
- package/node_modules/get-east-asian-width/lookup.js +138 -0
- package/node_modules/get-east-asian-width/package.json +71 -0
- package/node_modules/get-east-asian-width/readme.md +65 -0
- package/node_modules/get-east-asian-width/utilities.js +24 -0
- package/node_modules/marked/LICENSE +44 -0
- package/node_modules/marked/README.md +115 -0
- package/node_modules/marked/bin/main.js +284 -0
- package/node_modules/marked/bin/marked.js +16 -0
- package/node_modules/marked/lib/marked.d.ts +760 -0
- package/node_modules/marked/lib/marked.esm.js +77 -0
- package/node_modules/marked/lib/marked.esm.js.map +7 -0
- package/node_modules/marked/lib/marked.umd.js +79 -0
- package/node_modules/marked/lib/marked.umd.js.map +7 -0
- package/node_modules/marked/man/marked.1 +113 -0
- package/node_modules/marked/man/marked.1.md +93 -0
- package/node_modules/marked/package.json +103 -0
- package/package.json +96 -17
- package/bin/bubble.js +0 -39
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-level configuration manager.
|
|
3
|
+
*
|
|
4
|
+
* Uses a single JSON file in Bubble home, normally ~/.bubble/config.json.
|
|
5
|
+
*/
|
|
6
|
+
import { type AgentCategoriesConfig } from "./agent/categories.js";
|
|
7
|
+
import { type AgentRoutingConfig } from "./agent/routing-catalog.js";
|
|
8
|
+
import type { ProviderProfile } from "./provider-registry.js";
|
|
9
|
+
import type { ThinkingLevel } from "./types.js";
|
|
10
|
+
export type ThemeMode = "auto" | "light" | "dark";
|
|
11
|
+
export interface ThemeConfig {
|
|
12
|
+
mode: ThemeMode;
|
|
13
|
+
overrides?: Record<string, string>;
|
|
14
|
+
explicit?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface UserConfigData {
|
|
17
|
+
defaultModel?: string;
|
|
18
|
+
defaultThinkingLevel?: ThinkingLevel;
|
|
19
|
+
skillPaths?: string[];
|
|
20
|
+
/** Skill names disabled from invocation/search until re-enabled in /skills. */
|
|
21
|
+
skills?: {
|
|
22
|
+
disabled?: string[];
|
|
23
|
+
catalogChars?: number;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Three shapes are accepted on disk so we can evolve without breaking
|
|
27
|
+
* existing configs:
|
|
28
|
+
* - `"auto" | "light" | "dark"` — mode only
|
|
29
|
+
* - `{ mode, overrides? }` — mode + optional per-key palette overrides
|
|
30
|
+
* - `Record<string, string>` (legacy) — treated as `{ mode: "dark", overrides }`
|
|
31
|
+
* so users who customized colors before light-mode existed keep their
|
|
32
|
+
* palette and stay on dark, which was the only palette at the time.
|
|
33
|
+
*/
|
|
34
|
+
theme?: ThemeMode | ThemeConfig | Record<string, string>;
|
|
35
|
+
recentModels?: string[];
|
|
36
|
+
apiKey?: string;
|
|
37
|
+
providers?: ProviderProfile[];
|
|
38
|
+
defaultProvider?: string;
|
|
39
|
+
agentCategories?: AgentCategoriesConfig;
|
|
40
|
+
/** Subagent model-routing knobs: autoTier (default true), allowCrossProvider (default true). */
|
|
41
|
+
agentRouting?: Partial<AgentRoutingConfig>;
|
|
42
|
+
subagents?: SubagentsUserConfig;
|
|
43
|
+
/** Background tasks: completion wakes and Grok-style foreground demotion. */
|
|
44
|
+
tasks?: {
|
|
45
|
+
/** Auto-resume the Agent when an owned task finishes. Defaults ON. */
|
|
46
|
+
autoResume?: boolean;
|
|
47
|
+
/** Move long foreground Execute calls into Tasks automatically. Defaults ON. */
|
|
48
|
+
autoBackground?: boolean;
|
|
49
|
+
/** Foreground wait budget before automatic demotion. Defaults to 15 seconds. */
|
|
50
|
+
foregroundWaitMs?: number;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export interface SubagentsUserConfig {
|
|
54
|
+
/** Global cap on concurrently running children. Default 8. */
|
|
55
|
+
maxActiveSubagents?: number;
|
|
56
|
+
}
|
|
57
|
+
export declare class UserConfig {
|
|
58
|
+
private data;
|
|
59
|
+
constructor();
|
|
60
|
+
private load;
|
|
61
|
+
private save;
|
|
62
|
+
getDefaultModel(): string | undefined;
|
|
63
|
+
setDefaultModel(model: string): void;
|
|
64
|
+
getDefaultThinkingLevel(): ThinkingLevel | undefined;
|
|
65
|
+
setDefaultThinkingLevel(level: ThinkingLevel): void;
|
|
66
|
+
getRecentModels(): string[];
|
|
67
|
+
/** Auto-resume on background-task completion (design §2.3b). Default ON. */
|
|
68
|
+
getTasksAutoResume(): boolean;
|
|
69
|
+
/** Grok-style foreground wait budget. `false` disables automatic demotion. */
|
|
70
|
+
getTasksAutoBackgroundAfterMs(): number | false;
|
|
71
|
+
pushRecentModel(model: string): void;
|
|
72
|
+
getApiKey(): string | undefined;
|
|
73
|
+
setApiKey(key: string): void;
|
|
74
|
+
getProviders(): ProviderProfile[];
|
|
75
|
+
setProviders(providers: ProviderProfile[]): void;
|
|
76
|
+
getDefaultProvider(): string | undefined;
|
|
77
|
+
setDefaultProvider(id: string): void;
|
|
78
|
+
getSkillPaths(): string[];
|
|
79
|
+
setSkillPaths(paths: string[]): void;
|
|
80
|
+
/** Skill catalog budget in characters; undefined uses the default, 0 turns the catalog off. */
|
|
81
|
+
getSkillCatalogChars(): number | undefined;
|
|
82
|
+
getDisabledSkills(): string[];
|
|
83
|
+
setDisabledSkills(names: string[]): void;
|
|
84
|
+
getTheme(): ThemeConfig;
|
|
85
|
+
getThemeMode(): ThemeMode;
|
|
86
|
+
getThemeOverrides(): Record<string, string>;
|
|
87
|
+
setThemeMode(mode: ThemeMode): void;
|
|
88
|
+
setThemeOverrides(overrides: Record<string, string>): void;
|
|
89
|
+
getAgentCategories(): AgentCategoriesConfig;
|
|
90
|
+
getAgentRouting(): AgentRoutingConfig;
|
|
91
|
+
getSubagents(): SubagentsUserConfig;
|
|
92
|
+
}
|
|
93
|
+
export declare function shouldProbeTerminalTheme(_config: ThemeConfig): boolean;
|
|
94
|
+
export declare function effectiveThemeModeForTerminal(config: ThemeConfig, detectedTheme: Exclude<ThemeMode, "auto">): ThemeMode;
|
|
95
|
+
/** Mask an API key for safe display. */
|
|
96
|
+
export declare function maskKey(key: string): string;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-level configuration manager.
|
|
3
|
+
*
|
|
4
|
+
* Uses a single JSON file in Bubble home, normally ~/.bubble/config.json.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { dirname, join } from "node:path";
|
|
8
|
+
import { getBubbleHome } from "./bubble-home.js";
|
|
9
|
+
import { sanitizeAgentCategories } from "./agent/categories.js";
|
|
10
|
+
import { sanitizeAgentRouting } from "./agent/routing-catalog.js";
|
|
11
|
+
import { isProviderModelAllowed } from "./provider-model-policy.js";
|
|
12
|
+
// openai-codex is an internal transport profile surfaced through the visible
|
|
13
|
+
// OpenAI OAuth provider. OpenRouter is a regular user-configurable provider.
|
|
14
|
+
const HIDDEN_PROVIDER_IDS = new Set(["openai-codex"]);
|
|
15
|
+
function getConfigPath() {
|
|
16
|
+
return join(getBubbleHome(), "config.json");
|
|
17
|
+
}
|
|
18
|
+
function isHiddenProviderId(providerId) {
|
|
19
|
+
return !!providerId && HIDDEN_PROVIDER_IDS.has(providerId);
|
|
20
|
+
}
|
|
21
|
+
function modelProviderId(model) {
|
|
22
|
+
if (!model.includes(":"))
|
|
23
|
+
return undefined;
|
|
24
|
+
return model.split(":", 1)[0];
|
|
25
|
+
}
|
|
26
|
+
function isAllowedConfiguredModel(model) {
|
|
27
|
+
if (!model.includes(":"))
|
|
28
|
+
return true;
|
|
29
|
+
const [providerId, ...modelParts] = model.split(":");
|
|
30
|
+
return isProviderModelAllowed(providerId, modelParts.join(":"));
|
|
31
|
+
}
|
|
32
|
+
function sanitizeRecentModels(models) {
|
|
33
|
+
if (!models)
|
|
34
|
+
return undefined;
|
|
35
|
+
return models.filter((model) => !isHiddenProviderId(modelProviderId(model)) && isAllowedConfiguredModel(model));
|
|
36
|
+
}
|
|
37
|
+
function sanitizeProviders(providers) {
|
|
38
|
+
if (!providers)
|
|
39
|
+
return undefined;
|
|
40
|
+
return providers.filter((provider) => !isHiddenProviderId(provider.id));
|
|
41
|
+
}
|
|
42
|
+
function sanitizeDefaultModel(model) {
|
|
43
|
+
if (!model)
|
|
44
|
+
return undefined;
|
|
45
|
+
return isHiddenProviderId(modelProviderId(model)) || !isAllowedConfiguredModel(model)
|
|
46
|
+
? undefined
|
|
47
|
+
: model;
|
|
48
|
+
}
|
|
49
|
+
function sanitizeDefaultProvider(providerId) {
|
|
50
|
+
return isHiddenProviderId(providerId) ? undefined : providerId;
|
|
51
|
+
}
|
|
52
|
+
function sanitizeSubagentsConfig(value) {
|
|
53
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
54
|
+
return undefined;
|
|
55
|
+
const raw = value;
|
|
56
|
+
const out = {};
|
|
57
|
+
if (typeof raw.maxActiveSubagents === "number" && Number.isFinite(raw.maxActiveSubagents)) {
|
|
58
|
+
out.maxActiveSubagents = Math.max(1, Math.floor(raw.maxActiveSubagents));
|
|
59
|
+
}
|
|
60
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
61
|
+
}
|
|
62
|
+
function sanitizeTheme(value) {
|
|
63
|
+
if (value == null)
|
|
64
|
+
return undefined;
|
|
65
|
+
if (typeof value === "string") {
|
|
66
|
+
return value === "auto" || value === "light" || value === "dark"
|
|
67
|
+
? { mode: value, explicit: true }
|
|
68
|
+
: undefined;
|
|
69
|
+
}
|
|
70
|
+
if (typeof value !== "object" || Array.isArray(value))
|
|
71
|
+
return undefined;
|
|
72
|
+
// Discriminate the new `{ mode, overrides }` shape from the legacy
|
|
73
|
+
// `Record<string, string>` shape. A legacy config has no `mode` key.
|
|
74
|
+
const maybeNew = value;
|
|
75
|
+
if (typeof maybeNew.mode === "string") {
|
|
76
|
+
const mode = maybeNew.mode;
|
|
77
|
+
if (mode !== "auto" && mode !== "light" && mode !== "dark")
|
|
78
|
+
return undefined;
|
|
79
|
+
const overrides = isStringMap(maybeNew.overrides) ? maybeNew.overrides : undefined;
|
|
80
|
+
const explicit = maybeNew.explicit === true ? true : undefined;
|
|
81
|
+
return {
|
|
82
|
+
mode,
|
|
83
|
+
...(overrides ? { overrides } : {}),
|
|
84
|
+
...(explicit ? { explicit } : {}),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const overrides = pickStringEntries(value);
|
|
88
|
+
if (Object.keys(overrides).length === 0)
|
|
89
|
+
return undefined;
|
|
90
|
+
return { mode: "dark", overrides };
|
|
91
|
+
}
|
|
92
|
+
function isStringMap(value) {
|
|
93
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
94
|
+
return false;
|
|
95
|
+
return Object.values(value).every((entry) => typeof entry === "string");
|
|
96
|
+
}
|
|
97
|
+
function pickStringEntries(value) {
|
|
98
|
+
return Object.fromEntries(Object.entries(value).filter(([, v]) => typeof v === "string"));
|
|
99
|
+
}
|
|
100
|
+
export class UserConfig {
|
|
101
|
+
data = {};
|
|
102
|
+
constructor() {
|
|
103
|
+
this.load();
|
|
104
|
+
}
|
|
105
|
+
load() {
|
|
106
|
+
const configPath = getConfigPath();
|
|
107
|
+
if (!existsSync(configPath))
|
|
108
|
+
return;
|
|
109
|
+
try {
|
|
110
|
+
const raw = readFileSync(configPath, "utf-8");
|
|
111
|
+
const parsed = JSON.parse(raw);
|
|
112
|
+
this.data = {
|
|
113
|
+
...parsed,
|
|
114
|
+
defaultModel: sanitizeDefaultModel(parsed.defaultModel),
|
|
115
|
+
recentModels: sanitizeRecentModels(parsed.recentModels),
|
|
116
|
+
providers: sanitizeProviders(parsed.providers),
|
|
117
|
+
defaultProvider: sanitizeDefaultProvider(parsed.defaultProvider),
|
|
118
|
+
agentCategories: sanitizeAgentCategories(parsed.agentCategories),
|
|
119
|
+
subagents: sanitizeSubagentsConfig(parsed.subagents),
|
|
120
|
+
theme: sanitizeTheme(parsed.theme),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
this.data = {};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
save() {
|
|
128
|
+
const configPath = getConfigPath();
|
|
129
|
+
const dir = dirname(configPath);
|
|
130
|
+
if (!existsSync(dir)) {
|
|
131
|
+
mkdirSync(dir, { recursive: true });
|
|
132
|
+
}
|
|
133
|
+
writeFileSync(configPath, JSON.stringify(this.data, null, 2) + "\n");
|
|
134
|
+
}
|
|
135
|
+
getDefaultModel() {
|
|
136
|
+
return sanitizeDefaultModel(this.data.defaultModel)
|
|
137
|
+
?? sanitizeRecentModels(this.data.recentModels)?.[0];
|
|
138
|
+
}
|
|
139
|
+
setDefaultModel(model) {
|
|
140
|
+
this.data.defaultModel = sanitizeDefaultModel(model);
|
|
141
|
+
this.save();
|
|
142
|
+
}
|
|
143
|
+
getDefaultThinkingLevel() {
|
|
144
|
+
return this.data.defaultThinkingLevel;
|
|
145
|
+
}
|
|
146
|
+
setDefaultThinkingLevel(level) {
|
|
147
|
+
this.data.defaultThinkingLevel = level;
|
|
148
|
+
this.save();
|
|
149
|
+
}
|
|
150
|
+
getRecentModels() {
|
|
151
|
+
return sanitizeRecentModels(this.data.recentModels)?.slice() ?? [];
|
|
152
|
+
}
|
|
153
|
+
/** Auto-resume on background-task completion (design §2.3b). Default ON. */
|
|
154
|
+
getTasksAutoResume() {
|
|
155
|
+
return this.data.tasks?.autoResume !== false;
|
|
156
|
+
}
|
|
157
|
+
/** Grok-style foreground wait budget. `false` disables automatic demotion. */
|
|
158
|
+
getTasksAutoBackgroundAfterMs() {
|
|
159
|
+
if (this.data.tasks?.autoBackground === false)
|
|
160
|
+
return false;
|
|
161
|
+
const configured = this.data.tasks?.foregroundWaitMs;
|
|
162
|
+
if (typeof configured !== "number" || !Number.isFinite(configured))
|
|
163
|
+
return 15_000;
|
|
164
|
+
return Math.max(1_000, Math.min(300_000, Math.floor(configured)));
|
|
165
|
+
}
|
|
166
|
+
pushRecentModel(model) {
|
|
167
|
+
if (isHiddenProviderId(modelProviderId(model)) || !isAllowedConfiguredModel(model)) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const recent = this.data.recentModels ?? [];
|
|
171
|
+
const uniq = [model, ...recent.filter((m) => m !== model)];
|
|
172
|
+
const sanitized = sanitizeRecentModels(uniq.slice(0, 10));
|
|
173
|
+
this.data.recentModels = sanitized;
|
|
174
|
+
this.data.defaultModel = sanitized?.[0];
|
|
175
|
+
this.save();
|
|
176
|
+
}
|
|
177
|
+
getApiKey() {
|
|
178
|
+
return this.data.apiKey;
|
|
179
|
+
}
|
|
180
|
+
setApiKey(key) {
|
|
181
|
+
this.data.apiKey = key;
|
|
182
|
+
this.save();
|
|
183
|
+
}
|
|
184
|
+
getProviders() {
|
|
185
|
+
return sanitizeProviders(this.data.providers)?.slice() ?? [];
|
|
186
|
+
}
|
|
187
|
+
setProviders(providers) {
|
|
188
|
+
this.data.providers = sanitizeProviders(providers);
|
|
189
|
+
this.save();
|
|
190
|
+
}
|
|
191
|
+
getDefaultProvider() {
|
|
192
|
+
return sanitizeDefaultProvider(this.data.defaultProvider);
|
|
193
|
+
}
|
|
194
|
+
setDefaultProvider(id) {
|
|
195
|
+
this.data.defaultProvider = sanitizeDefaultProvider(id);
|
|
196
|
+
this.save();
|
|
197
|
+
}
|
|
198
|
+
getSkillPaths() {
|
|
199
|
+
return Array.isArray(this.data.skillPaths) ? this.data.skillPaths.slice() : [];
|
|
200
|
+
}
|
|
201
|
+
setSkillPaths(paths) {
|
|
202
|
+
this.data.skillPaths = paths.slice();
|
|
203
|
+
this.save();
|
|
204
|
+
}
|
|
205
|
+
/** Skill catalog budget in characters; undefined uses the default, 0 turns the catalog off. */
|
|
206
|
+
getSkillCatalogChars() {
|
|
207
|
+
const value = this.data.skills?.catalogChars;
|
|
208
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0
|
|
209
|
+
? Math.min(Math.floor(value), 200_000)
|
|
210
|
+
: undefined;
|
|
211
|
+
}
|
|
212
|
+
getDisabledSkills() {
|
|
213
|
+
const disabled = this.data.skills?.disabled;
|
|
214
|
+
if (!Array.isArray(disabled))
|
|
215
|
+
return [];
|
|
216
|
+
return [...new Set(disabled.filter((name) => (typeof name === "string" && /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(name))))].sort((a, b) => a.localeCompare(b));
|
|
217
|
+
}
|
|
218
|
+
setDisabledSkills(names) {
|
|
219
|
+
const disabled = [...new Set(names.filter((name) => (/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(name))))].sort((a, b) => a.localeCompare(b));
|
|
220
|
+
if (disabled.length === 0) {
|
|
221
|
+
const next = { ...(this.data.skills ?? {}) };
|
|
222
|
+
delete next.disabled;
|
|
223
|
+
if (Object.keys(next).length === 0)
|
|
224
|
+
delete this.data.skills;
|
|
225
|
+
else
|
|
226
|
+
this.data.skills = next;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
this.data.skills = { ...(this.data.skills ?? {}), disabled };
|
|
230
|
+
}
|
|
231
|
+
this.save();
|
|
232
|
+
}
|
|
233
|
+
getTheme() {
|
|
234
|
+
const theme = sanitizeTheme(this.data.theme);
|
|
235
|
+
return theme ?? { mode: "auto" };
|
|
236
|
+
}
|
|
237
|
+
getThemeMode() {
|
|
238
|
+
return this.getTheme().mode;
|
|
239
|
+
}
|
|
240
|
+
getThemeOverrides() {
|
|
241
|
+
return this.getTheme().overrides ?? {};
|
|
242
|
+
}
|
|
243
|
+
setThemeMode(mode) {
|
|
244
|
+
const current = this.getTheme();
|
|
245
|
+
this.data.theme = current.overrides
|
|
246
|
+
? { mode, overrides: current.overrides, explicit: true }
|
|
247
|
+
: { mode, explicit: true };
|
|
248
|
+
this.save();
|
|
249
|
+
}
|
|
250
|
+
setThemeOverrides(overrides) {
|
|
251
|
+
const current = this.getTheme();
|
|
252
|
+
this.data.theme = Object.keys(overrides).length === 0
|
|
253
|
+
? { mode: current.mode, ...(current.explicit ? { explicit: true } : {}) }
|
|
254
|
+
: { mode: current.mode, overrides: { ...overrides }, ...(current.explicit ? { explicit: true } : {}) };
|
|
255
|
+
this.save();
|
|
256
|
+
}
|
|
257
|
+
getAgentCategories() {
|
|
258
|
+
return sanitizeAgentCategories(this.data.agentCategories);
|
|
259
|
+
}
|
|
260
|
+
getAgentRouting() {
|
|
261
|
+
return sanitizeAgentRouting(this.data.agentRouting);
|
|
262
|
+
}
|
|
263
|
+
getSubagents() {
|
|
264
|
+
return sanitizeSubagentsConfig(this.data.subagents) ?? {};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
export function shouldProbeTerminalTheme(_config) {
|
|
268
|
+
// Always probe: even a forced theme needs the real terminal background to
|
|
269
|
+
// decide between inheriting it (theme matches the terminal) and painting
|
|
270
|
+
// its own canvas (forced theme mismatching the terminal, where the
|
|
271
|
+
// palette's foregrounds would otherwise be unreadable).
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
export function effectiveThemeModeForTerminal(config, detectedTheme) {
|
|
275
|
+
if (isLegacyBareDarkTheme(config) && detectedTheme === "light")
|
|
276
|
+
return "auto";
|
|
277
|
+
return config.mode;
|
|
278
|
+
}
|
|
279
|
+
function isLegacyBareDarkTheme(config) {
|
|
280
|
+
return config.mode === "dark" && config.explicit !== true && !config.overrides;
|
|
281
|
+
}
|
|
282
|
+
/** Mask an API key for safe display. */
|
|
283
|
+
export function maskKey(key) {
|
|
284
|
+
if (key.length <= 12)
|
|
285
|
+
return "****";
|
|
286
|
+
return key.slice(0, 6) + "..." + key.slice(-4);
|
|
287
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Message, ToolDefinition } from "../types.js";
|
|
2
|
+
export declare const OUTPUT_RESERVE_TOKENS = 20000;
|
|
3
|
+
export declare const AUTOCOMPACT_BUFFER_TOKENS = 13000;
|
|
4
|
+
export declare const PRUNE_BUFFER_TOKENS = 50000;
|
|
5
|
+
export declare const MIN_WINDOW_FOR_RESERVE = 40000;
|
|
6
|
+
export interface ContextBudget {
|
|
7
|
+
estimatedTokens: number;
|
|
8
|
+
contextWindow?: number;
|
|
9
|
+
percent?: number;
|
|
10
|
+
shouldPrune: boolean;
|
|
11
|
+
shouldCompact: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ContextBudgetOptions {
|
|
14
|
+
/** Authoritative input-token count from the most recent response usage. */
|
|
15
|
+
usageAnchorTokens?: number;
|
|
16
|
+
/** Messages appended after the anchor (their tokens are estimated and added). */
|
|
17
|
+
tailMessages?: Message[];
|
|
18
|
+
/** Tokens outside the message list, primarily serialized tool definitions. */
|
|
19
|
+
additionalInputTokens?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function estimateMessageTokens(message: Message, providerId?: string): number;
|
|
22
|
+
export declare function estimateContextTokens(messages: Message[], providerId?: string): number;
|
|
23
|
+
export declare function getContextBudget(providerId: string, modelId: string, messages: Message[], options?: ContextBudgetOptions): ContextBudget;
|
|
24
|
+
/** Estimate the request-space occupied by tool schemas sent on every turn. */
|
|
25
|
+
export declare function estimateToolDefinitionsTokens(tools: ToolDefinition[], providerId?: string): number;
|
|
26
|
+
/** Maximum estimated input size that still leaves useful room for an answer. */
|
|
27
|
+
export declare function getMaxInputTokens(contextWindow: number | undefined): number | undefined;
|
|
28
|
+
export declare function estimateTextTokens(text: string, providerId?: string): number;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { getModelContextWindow } from "../model-catalog.js";
|
|
2
|
+
import { getTokenEstimator } from "./token-estimator.js";
|
|
3
|
+
export const OUTPUT_RESERVE_TOKENS = 20_000;
|
|
4
|
+
export const AUTOCOMPACT_BUFFER_TOKENS = 13_000;
|
|
5
|
+
export const PRUNE_BUFFER_TOKENS = 50_000;
|
|
6
|
+
export const MIN_WINDOW_FOR_RESERVE = 40_000;
|
|
7
|
+
// Safety margins applied to estimator-derived token counts. The estimator can
|
|
8
|
+
// undercount on dense / CJK / tool-payload content; treating its output as a
|
|
9
|
+
// hard floor means we'd routinely overshoot the real server-side count. These
|
|
10
|
+
// multipliers bias the budget decision toward earlier compaction.
|
|
11
|
+
const TAIL_SAFETY_MARGIN = 1.15; // applied to estimated tail when anchored
|
|
12
|
+
const FIRST_TURN_SAFETY_MARGIN = 1.25; // applied when there's no anchor yet
|
|
13
|
+
export function estimateMessageTokens(message, providerId) {
|
|
14
|
+
const estimate = (text) => estimateTextTokens(text, providerId);
|
|
15
|
+
switch (message.role) {
|
|
16
|
+
case "system":
|
|
17
|
+
case "meta":
|
|
18
|
+
case "tool":
|
|
19
|
+
return estimate(message.content);
|
|
20
|
+
case "assistant":
|
|
21
|
+
return estimate(message.content)
|
|
22
|
+
+ estimate(message.reasoning ?? "")
|
|
23
|
+
+ estimateProviderMetadataOverhead(message.providerMetadata, providerId)
|
|
24
|
+
+ (message.toolCalls?.reduce((sum, toolCall) => sum + estimate(toolCall.arguments) + 12, 0) ?? 0)
|
|
25
|
+
+ 8;
|
|
26
|
+
case "user":
|
|
27
|
+
if (typeof message.content === "string") {
|
|
28
|
+
return estimate(message.content) + 8;
|
|
29
|
+
}
|
|
30
|
+
return message.content.reduce((sum, part) => {
|
|
31
|
+
if (part.type === "text") {
|
|
32
|
+
return sum + estimate(part.text);
|
|
33
|
+
}
|
|
34
|
+
return sum + 256;
|
|
35
|
+
}, 8);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function estimateProviderMetadataOverhead(metadata, providerId) {
|
|
39
|
+
const blocks = [
|
|
40
|
+
...(metadata?.anthropic?.contentBlocks ?? []),
|
|
41
|
+
...(metadata?.openai?.contentBlocks ?? []),
|
|
42
|
+
];
|
|
43
|
+
if (blocks.length === 0)
|
|
44
|
+
return 0;
|
|
45
|
+
const estimate = (text) => estimateTextTokens(text, providerId);
|
|
46
|
+
return blocks.reduce((sum, block) => {
|
|
47
|
+
let overhead = 0;
|
|
48
|
+
if (typeof block.signature === "string")
|
|
49
|
+
overhead += estimate(block.signature);
|
|
50
|
+
if (block.type === "redacted_thinking" && typeof block.data === "string")
|
|
51
|
+
overhead += estimate(block.data);
|
|
52
|
+
if (block.type === "reasoning" && typeof block.encrypted_content === "string")
|
|
53
|
+
overhead += estimate(block.encrypted_content);
|
|
54
|
+
return sum + overhead;
|
|
55
|
+
}, 0);
|
|
56
|
+
}
|
|
57
|
+
export function estimateContextTokens(messages, providerId) {
|
|
58
|
+
return messages.reduce((sum, message) => sum + estimateMessageTokens(message, providerId), 0);
|
|
59
|
+
}
|
|
60
|
+
export function getContextBudget(providerId, modelId, messages, options = {}) {
|
|
61
|
+
const estimatedTokens = computeEstimatedTokens(providerId, messages, options);
|
|
62
|
+
const contextWindow = getModelContextWindow(providerId, modelId);
|
|
63
|
+
const percent = contextWindow ? Math.min(100, (estimatedTokens / contextWindow) * 100) : undefined;
|
|
64
|
+
return {
|
|
65
|
+
estimatedTokens,
|
|
66
|
+
contextWindow,
|
|
67
|
+
percent,
|
|
68
|
+
shouldPrune: shouldTriggerPrune(estimatedTokens, contextWindow),
|
|
69
|
+
shouldCompact: shouldTriggerCompact(estimatedTokens, contextWindow),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function computeEstimatedTokens(providerId, messages, options) {
|
|
73
|
+
const additionalInputTokens = Math.max(0, options.additionalInputTokens ?? 0);
|
|
74
|
+
if (options.usageAnchorTokens !== undefined && options.tailMessages) {
|
|
75
|
+
// Anchor is authoritative (server-reported input tokens from the last
|
|
76
|
+
// response). Tail goes through our estimator and may undercount on dense /
|
|
77
|
+
// tool-output content, so we inflate it by a small margin before adding.
|
|
78
|
+
const tailEstimate = estimateContextTokens(options.tailMessages, providerId);
|
|
79
|
+
return options.usageAnchorTokens
|
|
80
|
+
+ Math.ceil(tailEstimate * TAIL_SAFETY_MARGIN)
|
|
81
|
+
+ additionalInputTokens;
|
|
82
|
+
}
|
|
83
|
+
// First turn (or anchor lost): there's no server-reported baseline at all,
|
|
84
|
+
// so apply a larger safety margin to the pure estimate.
|
|
85
|
+
return Math.ceil((estimateContextTokens(messages, providerId) + additionalInputTokens)
|
|
86
|
+
* FIRST_TURN_SAFETY_MARGIN);
|
|
87
|
+
}
|
|
88
|
+
/** Estimate the request-space occupied by tool schemas sent on every turn. */
|
|
89
|
+
export function estimateToolDefinitionsTokens(tools, providerId) {
|
|
90
|
+
if (tools.length === 0)
|
|
91
|
+
return 0;
|
|
92
|
+
// Providers wrap this array in their own function/tool envelope. The fixed
|
|
93
|
+
// per-entry allowance covers names, discriminator keys and separators not
|
|
94
|
+
// represented by the plain JSON payload.
|
|
95
|
+
return estimateTextTokens(JSON.stringify(tools), providerId) + tools.length * 16 + 16;
|
|
96
|
+
}
|
|
97
|
+
/** Maximum estimated input size that still leaves useful room for an answer. */
|
|
98
|
+
export function getMaxInputTokens(contextWindow) {
|
|
99
|
+
if (!contextWindow)
|
|
100
|
+
return undefined;
|
|
101
|
+
return contextWindow >= MIN_WINDOW_FOR_RESERVE
|
|
102
|
+
? Math.max(1, contextWindow
|
|
103
|
+
- OUTPUT_RESERVE_TOKENS
|
|
104
|
+
- Math.max(AUTOCOMPACT_BUFFER_TOKENS, Math.floor(contextWindow * 0.05)))
|
|
105
|
+
: Math.max(1, Math.floor(contextWindow * 0.75));
|
|
106
|
+
}
|
|
107
|
+
function shouldTriggerPrune(estimatedTokens, contextWindow) {
|
|
108
|
+
if (!contextWindow) {
|
|
109
|
+
return estimatedTokens >= 16_000;
|
|
110
|
+
}
|
|
111
|
+
const threshold = contextWindow >= MIN_WINDOW_FOR_RESERVE
|
|
112
|
+
? contextWindow - OUTPUT_RESERVE_TOKENS - PRUNE_BUFFER_TOKENS
|
|
113
|
+
: contextWindow * 0.55;
|
|
114
|
+
return estimatedTokens >= threshold;
|
|
115
|
+
}
|
|
116
|
+
function shouldTriggerCompact(estimatedTokens, contextWindow) {
|
|
117
|
+
if (!contextWindow) {
|
|
118
|
+
return estimatedTokens >= 32_000;
|
|
119
|
+
}
|
|
120
|
+
const threshold = contextWindow >= MIN_WINDOW_FOR_RESERVE
|
|
121
|
+
? contextWindow - OUTPUT_RESERVE_TOKENS - AUTOCOMPACT_BUFFER_TOKENS
|
|
122
|
+
: contextWindow * 0.75;
|
|
123
|
+
return estimatedTokens >= threshold;
|
|
124
|
+
}
|
|
125
|
+
export function estimateTextTokens(text, providerId) {
|
|
126
|
+
if (!text) {
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
129
|
+
return getTokenEstimator(providerId).estimate(text);
|
|
130
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Message } from "../types.js";
|
|
2
|
+
/** A versioned, exact conversational projection. Never includes the host system prompt. */
|
|
3
|
+
export interface ContextCheckpoint {
|
|
4
|
+
version: 1;
|
|
5
|
+
compactionId: string;
|
|
6
|
+
reason: "auto" | "manual" | "overflow" | "resident";
|
|
7
|
+
baseRevision?: string;
|
|
8
|
+
summary?: string;
|
|
9
|
+
messages: Message[];
|
|
10
|
+
}
|
|
11
|
+
export declare function createContextCheckpoint(messages: Message[], reason: ContextCheckpoint["reason"], summary?: string, baseRevision?: string): ContextCheckpoint;
|
|
12
|
+
/** Live meta reminders may interleave results, but every canonical call needs a real result. */
|
|
13
|
+
export declare function hasCompleteToolGroups(messages: Message[]): boolean;
|
|
14
|
+
export declare function checkpointMessages(checkpoint: ContextCheckpoint): Message[];
|
|
15
|
+
/** Replay-side read: a checkpoint this build cannot validate (a newer format,
|
|
16
|
+
* a hand-edited record) is not a boundary. Originals are retained, so callers
|
|
17
|
+
* fall back to an earlier boundary instead of failing the whole session. */
|
|
18
|
+
export declare function tryCheckpointMessages(checkpoint: ContextCheckpoint): Message[] | undefined;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { isClaudeWithBoundThinking } from "../anthropic-thinking.js";
|
|
3
|
+
import { isInternalBlockOnlyContent, sanitizeInternalReminderBlocks, sanitizeInternalReasoningText, sanitizeAssistantProviderMetadata } from "../agent/internal-reminder-sanitizer.js";
|
|
4
|
+
import { isCompactionSummaryMessage, splitLeadingContext } from "./compact.js";
|
|
5
|
+
export function createContextCheckpoint(messages, reason, summary, baseRevision) {
|
|
6
|
+
const { body } = splitLeadingContext(messages);
|
|
7
|
+
// Runtime reminders must be recomputed by the host. Compaction summaries are
|
|
8
|
+
// first-class context, not ephemeral reminders, and must survive verbatim.
|
|
9
|
+
const durable = body.filter(message => {
|
|
10
|
+
if (isCompactionSummaryMessage(message))
|
|
11
|
+
return true;
|
|
12
|
+
if (message.role === "meta")
|
|
13
|
+
return false;
|
|
14
|
+
// Backstop for older histories containing provider-projected reminders.
|
|
15
|
+
// Never remove user prose merely because it mentions or quotes a block.
|
|
16
|
+
return !(message.role === "user" && typeof message.content === "string"
|
|
17
|
+
&& isInternalBlockOnlyContent(message.content)
|
|
18
|
+
&& !sanitizeInternalReminderBlocks(message.content).trim());
|
|
19
|
+
});
|
|
20
|
+
const sanitized = durable.map(sanitizeCheckpointMessage);
|
|
21
|
+
return { version: 1, compactionId: randomUUID(), reason, baseRevision,
|
|
22
|
+
summary: summary === undefined ? undefined : sanitizeInternalReminderBlocks(summary),
|
|
23
|
+
messages: structuredClone(sanitized) };
|
|
24
|
+
}
|
|
25
|
+
/** Live meta reminders may interleave results, but every canonical call needs a real result. */
|
|
26
|
+
export function hasCompleteToolGroups(messages) {
|
|
27
|
+
const pending = new Set();
|
|
28
|
+
for (const message of messages) {
|
|
29
|
+
if (message.role === "meta")
|
|
30
|
+
continue;
|
|
31
|
+
if (message.role === "tool") {
|
|
32
|
+
if (!pending.delete(message.toolCallId))
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
if (pending.size)
|
|
37
|
+
return false;
|
|
38
|
+
if (message.role === "assistant") {
|
|
39
|
+
for (const call of message.toolCalls ?? []) {
|
|
40
|
+
// Ids only need to be unambiguous within their own group: providers
|
|
41
|
+
// may scope them per response (`call_1` in every reply).
|
|
42
|
+
if (!call.id || pending.has(call.id))
|
|
43
|
+
return false;
|
|
44
|
+
pending.add(call.id);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return pending.size === 0;
|
|
50
|
+
}
|
|
51
|
+
export function checkpointMessages(checkpoint) {
|
|
52
|
+
if (checkpoint?.version !== 1 || typeof checkpoint.compactionId !== "string" || !checkpoint.compactionId
|
|
53
|
+
|| !Array.isArray(checkpoint.messages))
|
|
54
|
+
throw new Error("Unsupported context checkpoint");
|
|
55
|
+
const pending = new Set();
|
|
56
|
+
for (const message of checkpoint.messages) {
|
|
57
|
+
if (!message || !["user", "assistant", "tool", "system", "meta"].includes(message.role)
|
|
58
|
+
|| !(typeof message.content === "string" || (message.role === "user" && Array.isArray(message.content)))) {
|
|
59
|
+
throw new Error("Invalid context checkpoint message");
|
|
60
|
+
}
|
|
61
|
+
if (message.role === "assistant") {
|
|
62
|
+
if (pending.size)
|
|
63
|
+
throw new Error("Incomplete checkpoint tool group");
|
|
64
|
+
for (const call of message.toolCalls ?? []) {
|
|
65
|
+
if (!call.id || pending.has(call.id))
|
|
66
|
+
throw new Error("Invalid checkpoint tool call id");
|
|
67
|
+
pending.add(call.id);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else if (message.role === "tool") {
|
|
71
|
+
if (!pending.delete(message.toolCallId))
|
|
72
|
+
throw new Error("Orphan checkpoint tool result");
|
|
73
|
+
}
|
|
74
|
+
else if (pending.size)
|
|
75
|
+
throw new Error("Interrupted checkpoint tool group");
|
|
76
|
+
}
|
|
77
|
+
if (pending.size)
|
|
78
|
+
throw new Error("Incomplete checkpoint tool group");
|
|
79
|
+
// Also repairs checkpoints written by builds that retained now-invalid
|
|
80
|
+
// signatures. Messages appended AFTER this boundary are replayed normally.
|
|
81
|
+
return structuredClone(checkpoint.messages.map(sanitizeCheckpointMessage));
|
|
82
|
+
}
|
|
83
|
+
function sanitizeCheckpointMessage(message) {
|
|
84
|
+
if (message.role !== "assistant")
|
|
85
|
+
return message;
|
|
86
|
+
let metadata = message.providerMetadata;
|
|
87
|
+
const blocks = metadata?.anthropic?.contentBlocks;
|
|
88
|
+
if (blocks && isClaudeWithBoundThinking(message.modelId ?? message.model)) {
|
|
89
|
+
// A checkpoint rewrites the prefix. Remove the entire bound thinking run,
|
|
90
|
+
// including encrypted blocks, so the model can reason from the new context.
|
|
91
|
+
// Keep text, tool calls/results, and display reasoning; never mutate originals.
|
|
92
|
+
metadata = {
|
|
93
|
+
...metadata,
|
|
94
|
+
anthropic: {
|
|
95
|
+
...metadata?.anthropic,
|
|
96
|
+
contentBlocks: blocks.filter(block => block.type !== "thinking" && block.type !== "redacted_thinking"),
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
...message,
|
|
102
|
+
content: sanitizeInternalReminderBlocks(message.content),
|
|
103
|
+
...(message.reasoning !== undefined ? { reasoning: sanitizeInternalReasoningText(message.reasoning) } : {}),
|
|
104
|
+
...(metadata ? { providerMetadata: sanitizeAssistantProviderMetadata(metadata) } : {}),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Replay-side read: a checkpoint this build cannot validate (a newer format,
|
|
108
|
+
* a hand-edited record) is not a boundary. Originals are retained, so callers
|
|
109
|
+
* fall back to an earlier boundary instead of failing the whole session. */
|
|
110
|
+
export function tryCheckpointMessages(checkpoint) {
|
|
111
|
+
try {
|
|
112
|
+
return checkpointMessages(checkpoint);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
}
|