@bubblebrain-ai/bubble 0.0.63 → 0.0.65
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 +399 -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 +256 -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 +584 -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
|
@@ -0,0 +1,940 @@
|
|
|
1
|
+
import { getAvailableThinkingLevels, normalizeThinkingLevel } from "./provider-transform.js";
|
|
2
|
+
import { getModelDefaultReasoningLevel } from "./model-catalog.js";
|
|
3
|
+
import { isClaudeWithBoundThinking } from "./anthropic-thinking.js";
|
|
4
|
+
import { RateLimitError } from "./network/errors.js";
|
|
5
|
+
import { isProviderTransportError, normalizeProviderNetworkError, providerFetch } from "./network/provider-transport.js";
|
|
6
|
+
import { computeRetryDelayMs, getProviderMaxRetries, isRetryableHttpStatus, ProviderStreamInterruptedError, retryAfterMsFromResponse, sleepBeforeRetry, } from "./network/retry.js";
|
|
7
|
+
const ANTHROPIC_VERSION = "2023-06-01";
|
|
8
|
+
const THINKING_BINDING_BETA = "thinking-binding-controls-2026-08-01";
|
|
9
|
+
const DEFAULT_MAX_TOKENS = 8192;
|
|
10
|
+
const ANTHROPIC_OPUS_LONG_OUTPUT_MAX_TOKENS = 128000;
|
|
11
|
+
const ANTHROPIC_LONG_OUTPUT_MAX_TOKENS = 64000;
|
|
12
|
+
// MiniMax thinking is always-on (M2.x) or default-on (M3), so the 8192 default
|
|
13
|
+
// gets consumed by thinking and the turn truncates before any visible text.
|
|
14
|
+
// MiniMax's docs recommend M3 128K, M2.x 64K output.
|
|
15
|
+
const MINIMAX_M3_MAX_TOKENS = 128000;
|
|
16
|
+
const MINIMAX_M2_MAX_TOKENS = 64000;
|
|
17
|
+
// MiMo counts thinking and visible text together; match its documented 128K cap.
|
|
18
|
+
const MIMO_MAX_TOKENS = 131072;
|
|
19
|
+
const ANTHROPIC_PROMPT_CACHE_CONTROL = { type: "ephemeral" };
|
|
20
|
+
/** Hard API limit: a 5th cache_control breakpoint is a 400, not a warning. */
|
|
21
|
+
const ANTHROPIC_MAX_CACHE_BREAKPOINTS = 4;
|
|
22
|
+
const MINIMAX_PROMPT_CACHE_MODELS = new Set([
|
|
23
|
+
"minimax-m2.7",
|
|
24
|
+
"minimax-m2.7-highspeed",
|
|
25
|
+
"minimax-m2.5",
|
|
26
|
+
"minimax-m2.5-highspeed",
|
|
27
|
+
"minimax-m2.1",
|
|
28
|
+
"minimax-m2.1-highspeed",
|
|
29
|
+
"minimax-m2",
|
|
30
|
+
"m2-her",
|
|
31
|
+
]);
|
|
32
|
+
function anthropicEffortForLevel(level) {
|
|
33
|
+
switch (level) {
|
|
34
|
+
case "off":
|
|
35
|
+
return undefined;
|
|
36
|
+
case "minimal":
|
|
37
|
+
case "low":
|
|
38
|
+
return "low";
|
|
39
|
+
case "medium":
|
|
40
|
+
return "medium";
|
|
41
|
+
case "high":
|
|
42
|
+
return "high";
|
|
43
|
+
case "xhigh":
|
|
44
|
+
return "xhigh";
|
|
45
|
+
case "max":
|
|
46
|
+
return "max";
|
|
47
|
+
default:
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function createAnthropicMessagesProvider(options) {
|
|
52
|
+
async function* streamChat(messages, chatOptions) {
|
|
53
|
+
const body = buildAnthropicRequest(options, messages, {
|
|
54
|
+
model: chatOptions.model,
|
|
55
|
+
tools: chatOptions.tools,
|
|
56
|
+
toolChoice: chatOptions.toolChoice,
|
|
57
|
+
temperature: chatOptions.temperature,
|
|
58
|
+
thinkingLevel: chatOptions.thinkingLevel,
|
|
59
|
+
stream: true,
|
|
60
|
+
});
|
|
61
|
+
const events = streamAnthropicEventsWithRetry(options, {
|
|
62
|
+
url: resolveAnthropicMessagesUrl(options.baseURL),
|
|
63
|
+
model: body.model,
|
|
64
|
+
stream: true,
|
|
65
|
+
method: "POST",
|
|
66
|
+
body: JSON.stringify(body),
|
|
67
|
+
signal: chatOptions.abortSignal,
|
|
68
|
+
rateLimitPolicy: chatOptions.rateLimitPolicy,
|
|
69
|
+
});
|
|
70
|
+
yield* translateAnthropicStream(events);
|
|
71
|
+
yield { type: "done" };
|
|
72
|
+
}
|
|
73
|
+
async function complete(messages, chatOptions) {
|
|
74
|
+
const body = buildAnthropicRequest(options, messages, {
|
|
75
|
+
model: chatOptions?.model ?? "claude-sonnet-4-6",
|
|
76
|
+
temperature: chatOptions?.temperature,
|
|
77
|
+
thinkingLevel: chatOptions?.thinkingLevel,
|
|
78
|
+
stream: false,
|
|
79
|
+
});
|
|
80
|
+
const response = await fetchAnthropicResponseWithRetry(options, {
|
|
81
|
+
url: resolveAnthropicMessagesUrl(options.baseURL),
|
|
82
|
+
model: body.model,
|
|
83
|
+
stream: false,
|
|
84
|
+
method: "POST",
|
|
85
|
+
body: JSON.stringify(body),
|
|
86
|
+
signal: chatOptions?.abortSignal,
|
|
87
|
+
});
|
|
88
|
+
const data = await response.json();
|
|
89
|
+
reportThinkingPrefixDrops(data.input_transformations);
|
|
90
|
+
return extractAnthropicText(data.content).join("");
|
|
91
|
+
}
|
|
92
|
+
return { streamChat, complete };
|
|
93
|
+
}
|
|
94
|
+
export function buildAnthropicRequest(options, messages, chatOptions) {
|
|
95
|
+
const mimo = isMiMoProvider(options);
|
|
96
|
+
const modernClaude = isClaudeWithBoundThinking(chatOptions.model);
|
|
97
|
+
const { system, messages: anthropicMessages } = toAnthropicMessages(messages, modernClaude ? "all" : shouldEchoThinking(options), !modernClaude);
|
|
98
|
+
const enablePromptCache = supportsAnthropicPromptCache(options, chatOptions.model);
|
|
99
|
+
// MiMo only supports tool_choice=auto. Removing tools enforces "none".
|
|
100
|
+
const tools = (mimo && chatOptions.toolChoice === "none" ? undefined : chatOptions.tools)?.map((tool) => ({
|
|
101
|
+
name: tool.name,
|
|
102
|
+
description: tool.description,
|
|
103
|
+
input_schema: tool.parameters,
|
|
104
|
+
}));
|
|
105
|
+
// Anthropic caps a request at 4 cache_control breakpoints and rejects the
|
|
106
|
+
// fifth outright, so the static ones are counted and the message region only
|
|
107
|
+
// ever gets what is left.
|
|
108
|
+
let staticBreakpoints = 0;
|
|
109
|
+
if (enablePromptCache && tools && tools.length > 0) {
|
|
110
|
+
tools[tools.length - 1] = {
|
|
111
|
+
...tools[tools.length - 1],
|
|
112
|
+
cache_control: ANTHROPIC_PROMPT_CACHE_CONTROL,
|
|
113
|
+
};
|
|
114
|
+
staticBreakpoints += 1;
|
|
115
|
+
}
|
|
116
|
+
if (enablePromptCache && system) {
|
|
117
|
+
staticBreakpoints += 1;
|
|
118
|
+
}
|
|
119
|
+
// Message-region breakpoints go to the official endpoint only. `baseURL` is
|
|
120
|
+
// user-editable persisted config, so a corporate gateway can keep
|
|
121
|
+
// providerId "anthropic" while pointing elsewhere — the URL check is the only
|
|
122
|
+
// trustworthy signal. Streaming only: complete() has no next turn to read the
|
|
123
|
+
// entry back.
|
|
124
|
+
if (enablePromptCache
|
|
125
|
+
&& chatOptions.stream === true
|
|
126
|
+
&& isOfficialAnthropicBaseUrl(options.baseURL)
|
|
127
|
+
&& !messageCacheKillSwitchEnabled()) {
|
|
128
|
+
placeMessageCacheBreakpoints(anthropicMessages, ANTHROPIC_MAX_CACHE_BREAKPOINTS - staticBreakpoints);
|
|
129
|
+
}
|
|
130
|
+
const effectiveThinkingLevel = normalizeThinkingLevel(chatOptions.thinkingLevel ?? options.thinkingLevel
|
|
131
|
+
?? (mimo ? "medium" : modernClaude || isClaude5WithOptionalThinking(chatOptions.model)
|
|
132
|
+
? getModelDefaultReasoningLevel(options.providerId || "", chatOptions.model) ?? "off" : "off"), mimo ? ["off", "medium"] : getAvailableThinkingLevels(options.providerId || "", chatOptions.model));
|
|
133
|
+
const body = {
|
|
134
|
+
model: chatOptions.model,
|
|
135
|
+
max_tokens: resolveAnthropicMaxTokens(options, chatOptions.model),
|
|
136
|
+
system: buildAnthropicSystem(system, enablePromptCache),
|
|
137
|
+
messages: anthropicMessages,
|
|
138
|
+
tools: tools && tools.length > 0 ? tools : undefined,
|
|
139
|
+
tool_choice: tools && tools.length > 0 ? { type: mimo ? "auto" : chatOptions.toolChoice ?? "auto" } : undefined,
|
|
140
|
+
stream: chatOptions.stream || undefined,
|
|
141
|
+
};
|
|
142
|
+
if (typeof chatOptions.temperature === "number"
|
|
143
|
+
&& shouldSendTemperature(options, chatOptions.model, effectiveThinkingLevel)) {
|
|
144
|
+
body.temperature = chatOptions.temperature;
|
|
145
|
+
}
|
|
146
|
+
if (mimo) {
|
|
147
|
+
// MiMo defaults to thinking on and rejects Claude's adaptive mode/effort.
|
|
148
|
+
body.thinking = { type: effectiveThinkingLevel === "off" ? "disabled" : "enabled" };
|
|
149
|
+
}
|
|
150
|
+
else if (effectiveThinkingLevel !== "off") {
|
|
151
|
+
body.thinking = modernClaude ? { type: "adaptive", display: "summarized" } : { type: "adaptive" };
|
|
152
|
+
if (modernClaude && isOfficialAnthropicBaseUrl(options.baseURL)) {
|
|
153
|
+
// Checkpoints proactively reset thinking. Runtime reminders, restored
|
|
154
|
+
// host context and tool changes can also change a prefix; let the API
|
|
155
|
+
// drop invalid blocks instead of failing the turn. Applied on every
|
|
156
|
+
// request so this behavior persists after restarts, per official guidance.
|
|
157
|
+
body.thinking.block_binding = { prefix_mismatch_behavior: "drop_block" };
|
|
158
|
+
}
|
|
159
|
+
// Apply the selected reasoning depth via output_config.effort. Without this
|
|
160
|
+
// every thinking request silently ran at Anthropic's default (high),
|
|
161
|
+
// ignoring the chosen level. effort is an official-API feature, so only
|
|
162
|
+
// send it to the official endpoint — anthropic-compatible third parties
|
|
163
|
+
// (e.g. MiniMax) reject it. Levels are already clamped to the model's
|
|
164
|
+
// supported set, so the value is always a valid effort for this model.
|
|
165
|
+
if (isOfficialAnthropicBaseUrl(options.baseURL)) {
|
|
166
|
+
const effort = anthropicEffortForLevel(effectiveThinkingLevel);
|
|
167
|
+
if (effort) {
|
|
168
|
+
body.output_config = { effort };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Opus 5 and Sonnet 5 default to thinking on; omission cannot express Off.
|
|
173
|
+
if (!mimo && effectiveThinkingLevel === "off" && isClaude5WithOptionalThinking(chatOptions.model)) {
|
|
174
|
+
body.thinking = { type: "disabled" };
|
|
175
|
+
}
|
|
176
|
+
return body;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Attach `cache_control` to the last cacheable block of `message`.
|
|
180
|
+
*
|
|
181
|
+
* Returns false when the message has nothing markable (empty block array, or a
|
|
182
|
+
* body made only of thinking blocks, where `cache_control` is not permitted).
|
|
183
|
+
*/
|
|
184
|
+
function markLastCacheableBlock(message) {
|
|
185
|
+
if (typeof message.content === "string") {
|
|
186
|
+
if (!message.content)
|
|
187
|
+
return false;
|
|
188
|
+
// A breakpoint needs a block to sit on. Wrapping is safe: the API keys the
|
|
189
|
+
// cache on canonicalised content, so the same message reverting to a bare
|
|
190
|
+
// string on a later turn still matches this entry.
|
|
191
|
+
message.content = [{
|
|
192
|
+
type: "text",
|
|
193
|
+
text: message.content,
|
|
194
|
+
cache_control: ANTHROPIC_PROMPT_CACHE_CONTROL,
|
|
195
|
+
}];
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
const blocks = message.content;
|
|
199
|
+
for (let index = blocks.length - 1; index >= 0; index--) {
|
|
200
|
+
const block = blocks[index];
|
|
201
|
+
if (block.type === "thinking" || block.type === "redacted_thinking")
|
|
202
|
+
continue;
|
|
203
|
+
blocks[index] = { ...block, cache_control: ANTHROPIC_PROMPT_CACHE_CONTROL };
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Roll prompt-cache breakpoints along the conversation so each turn's context is
|
|
210
|
+
* read back on the next turn instead of being re-billed as fresh input.
|
|
211
|
+
*
|
|
212
|
+
* Two breakpoints, and both are load-bearing:
|
|
213
|
+
*
|
|
214
|
+
* - the **tail** (last block of the last message) writes the entry that the next
|
|
215
|
+
* request reads;
|
|
216
|
+
* - the **anchor** reads it. It goes on the message just before the final
|
|
217
|
+
* assistant message — which is exactly where the previous request ended, since
|
|
218
|
+
* consecutive agent-loop requests differ by one `[assistant, tool results]`
|
|
219
|
+
* step. Landing on the written position directly is what makes this correct
|
|
220
|
+
* for any turn size: Anthropic only looks back 20 content blocks from a
|
|
221
|
+
* breakpoint to find a prior write, and a turn with many parallel tool calls
|
|
222
|
+
* easily exceeds that (1 + 2N blocks for N calls). Measured on Opus 4.8 with
|
|
223
|
+
* 30 parallel calls: tail-only and a fixed-distance anchor both collapse to an
|
|
224
|
+
* 8.6% hit rate, while this anchor holds 77%.
|
|
225
|
+
*
|
|
226
|
+
* Mutates `messages` (built fresh per request by toAnthropicMessages) and
|
|
227
|
+
* returns how many breakpoints it used, never more than `budget`.
|
|
228
|
+
*/
|
|
229
|
+
export function placeMessageCacheBreakpoints(messages, budget) {
|
|
230
|
+
// One-shot prompts (complete(): compaction, titles, memory) are excluded by
|
|
231
|
+
// the caller's streaming gate, not here — a single-message first turn is a
|
|
232
|
+
// real agent turn and marking its tail costs nothing, since writes are billed
|
|
233
|
+
// from the highest hit to the last breakpoint regardless of how many sit in
|
|
234
|
+
// between.
|
|
235
|
+
if (budget <= 0 || messages.length === 0)
|
|
236
|
+
return 0;
|
|
237
|
+
let used = 0;
|
|
238
|
+
const tailIndex = messages.length - 1;
|
|
239
|
+
if (budget - used >= 2) {
|
|
240
|
+
let lastAssistantIndex = -1;
|
|
241
|
+
for (let index = tailIndex; index >= 0; index--) {
|
|
242
|
+
if (messages[index].role === "assistant") {
|
|
243
|
+
lastAssistantIndex = index;
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
const anchorIndex = lastAssistantIndex - 1;
|
|
248
|
+
// An assistant at the anchor position means consecutive assistant messages
|
|
249
|
+
// merged, so this is not the previous request's boundary and the distance
|
|
250
|
+
// back is unbounded — skip rather than guess.
|
|
251
|
+
if (anchorIndex >= 0
|
|
252
|
+
&& anchorIndex < tailIndex
|
|
253
|
+
&& messages[anchorIndex].role !== "assistant"
|
|
254
|
+
&& markLastCacheableBlock(messages[anchorIndex])) {
|
|
255
|
+
used += 1;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (budget - used >= 1 && markLastCacheableBlock(messages[tailIndex])) {
|
|
259
|
+
used += 1;
|
|
260
|
+
}
|
|
261
|
+
return used;
|
|
262
|
+
}
|
|
263
|
+
function messageCacheKillSwitchEnabled() {
|
|
264
|
+
const raw = process.env.BUBBLE_ANTHROPIC_MESSAGE_CACHE;
|
|
265
|
+
return raw === "0" || raw === "false";
|
|
266
|
+
}
|
|
267
|
+
export function resolveAnthropicMaxTokens(options, model) {
|
|
268
|
+
if (isMiMoProvider(options))
|
|
269
|
+
return MIMO_MAX_TOKENS;
|
|
270
|
+
// MiniMax needs a large output budget so thinking doesn't starve the answer.
|
|
271
|
+
if (isMiniMaxProvider(options)) {
|
|
272
|
+
return /m3/i.test(model) ? MINIMAX_M3_MAX_TOKENS : MINIMAX_M2_MAX_TOKENS;
|
|
273
|
+
}
|
|
274
|
+
if (!isOfficialAnthropicBaseUrl(options.baseURL)) {
|
|
275
|
+
return DEFAULT_MAX_TOKENS;
|
|
276
|
+
}
|
|
277
|
+
if (isFableModelWith128kOutput(model) || isOpusModelWith128kOutput(model)
|
|
278
|
+
|| isClaudeFamilyVersionAtLeast(model, "sonnet", 5, 0)) {
|
|
279
|
+
return ANTHROPIC_OPUS_LONG_OUTPUT_MAX_TOKENS;
|
|
280
|
+
}
|
|
281
|
+
if (isSonnetOrHaikuModelWith64kOutput(model)) {
|
|
282
|
+
return ANTHROPIC_LONG_OUTPUT_MAX_TOKENS;
|
|
283
|
+
}
|
|
284
|
+
return DEFAULT_MAX_TOKENS;
|
|
285
|
+
}
|
|
286
|
+
function buildAnthropicSystem(system, enablePromptCache) {
|
|
287
|
+
if (!system)
|
|
288
|
+
return undefined;
|
|
289
|
+
if (!enablePromptCache)
|
|
290
|
+
return system;
|
|
291
|
+
return [{ type: "text", text: system, cache_control: ANTHROPIC_PROMPT_CACHE_CONTROL }];
|
|
292
|
+
}
|
|
293
|
+
export function supportsAnthropicPromptCache(options, model) {
|
|
294
|
+
const providerId = (options.providerId ?? "").toLowerCase();
|
|
295
|
+
if (providerId === "anthropic" || isOfficialAnthropicBaseUrl(options.baseURL)) {
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
if (!isMiniMaxAnthropicEndpoint(options)) {
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
return MINIMAX_PROMPT_CACHE_MODELS.has(model.toLowerCase());
|
|
302
|
+
}
|
|
303
|
+
export function toAnthropicMessages(messages, echoThinking = false, allowUnsignedThinking = true) {
|
|
304
|
+
const system = [];
|
|
305
|
+
const out = [];
|
|
306
|
+
const thinkingReplayIndexes = getThinkingReplayIndexes(messages, echoThinking);
|
|
307
|
+
for (let index = 0; index < messages.length; index++) {
|
|
308
|
+
const message = messages[index];
|
|
309
|
+
if (message.role === "system") {
|
|
310
|
+
system.push(message.content);
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (message.role === "tool") {
|
|
314
|
+
pushAnthropicMessage(out, {
|
|
315
|
+
role: "user",
|
|
316
|
+
content: [{
|
|
317
|
+
type: "tool_result",
|
|
318
|
+
tool_use_id: message.toolCallId,
|
|
319
|
+
content: message.content,
|
|
320
|
+
...(message.isError ? { is_error: true } : {}),
|
|
321
|
+
}],
|
|
322
|
+
});
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (message.role === "assistant") {
|
|
326
|
+
const content = buildAssistantAnthropicBlocks(message, thinkingReplayIndexes.has(index), allowUnsignedThinking);
|
|
327
|
+
if (content.length > 0) {
|
|
328
|
+
pushAnthropicMessage(out, { role: "assistant", content });
|
|
329
|
+
}
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
pushAnthropicMessage(out, {
|
|
333
|
+
role: "user",
|
|
334
|
+
content: typeof message.content === "string"
|
|
335
|
+
? message.content
|
|
336
|
+
: contentPartsToAnthropicBlocks(message.content),
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
return { system: system.join("\n\n"), messages: out };
|
|
340
|
+
}
|
|
341
|
+
function buildAssistantAnthropicBlocks(message, includeThinking, allowUnsignedThinking) {
|
|
342
|
+
const rawBlocks = message.providerMetadata?.anthropic?.contentBlocks;
|
|
343
|
+
if (rawBlocks && rawBlocks.length > 0) {
|
|
344
|
+
const blocks = rawBlocks
|
|
345
|
+
.filter(isReplayableAssistantContentBlock)
|
|
346
|
+
.filter((block) => includeThinking || !isThinkingContentBlock(block))
|
|
347
|
+
.map((block) => cloneAnthropicContentBlock(block));
|
|
348
|
+
if (blocks.length > 0) {
|
|
349
|
+
return blocks;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
const content = [];
|
|
353
|
+
if (includeThinking && allowUnsignedThinking && message.reasoning?.trim()) {
|
|
354
|
+
content.push({ type: "thinking", thinking: message.reasoning });
|
|
355
|
+
}
|
|
356
|
+
if (message.content.trim()) {
|
|
357
|
+
content.push({ type: "text", text: message.content });
|
|
358
|
+
}
|
|
359
|
+
for (const toolCall of message.toolCalls ?? []) {
|
|
360
|
+
content.push({
|
|
361
|
+
type: "tool_use",
|
|
362
|
+
id: toolCall.id,
|
|
363
|
+
name: toolCall.name,
|
|
364
|
+
input: parseToolInput(toolCall.arguments),
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
return content;
|
|
368
|
+
}
|
|
369
|
+
function getThinkingReplayIndexes(messages, echoThinking) {
|
|
370
|
+
const indexes = new Set();
|
|
371
|
+
if (!echoThinking)
|
|
372
|
+
return indexes;
|
|
373
|
+
// MiMo and bound Claude thinking need intact historical blocks across user
|
|
374
|
+
// turns. Removing a middle block breaks the later Claude signature chain.
|
|
375
|
+
if (echoThinking === "all") {
|
|
376
|
+
messages.forEach((message, index) => {
|
|
377
|
+
if (message.role === "assistant")
|
|
378
|
+
indexes.add(index);
|
|
379
|
+
});
|
|
380
|
+
return indexes;
|
|
381
|
+
}
|
|
382
|
+
let lastUserIndex = -1;
|
|
383
|
+
for (let index = 0; index < messages.length; index++) {
|
|
384
|
+
if (messages[index].role === "user") {
|
|
385
|
+
lastUserIndex = index;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
for (let index = Math.max(0, lastUserIndex + 1); index < messages.length; index++) {
|
|
389
|
+
const message = messages[index];
|
|
390
|
+
if (message.role === "assistant" && assistantHasToolUse(message)) {
|
|
391
|
+
indexes.add(index);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return indexes;
|
|
395
|
+
}
|
|
396
|
+
function assistantHasToolUse(message) {
|
|
397
|
+
if (message.toolCalls && message.toolCalls.length > 0)
|
|
398
|
+
return true;
|
|
399
|
+
return message.providerMetadata?.anthropic?.contentBlocks?.some((block) => block.type === "tool_use") ?? false;
|
|
400
|
+
}
|
|
401
|
+
function isThinkingContentBlock(block) {
|
|
402
|
+
return block.type === "thinking" || block.type === "redacted_thinking";
|
|
403
|
+
}
|
|
404
|
+
function isReplayableAssistantContentBlock(block) {
|
|
405
|
+
switch (block.type) {
|
|
406
|
+
case "text":
|
|
407
|
+
return typeof block.text === "string";
|
|
408
|
+
case "thinking":
|
|
409
|
+
return typeof block.thinking === "string";
|
|
410
|
+
case "redacted_thinking":
|
|
411
|
+
return typeof block.data === "string";
|
|
412
|
+
case "tool_use":
|
|
413
|
+
return typeof block.id === "string" && typeof block.name === "string" && isObjectRecord(block.input);
|
|
414
|
+
default:
|
|
415
|
+
return false;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
function cloneAnthropicContentBlock(block) {
|
|
419
|
+
return JSON.parse(JSON.stringify(block));
|
|
420
|
+
}
|
|
421
|
+
export async function* translateAnthropicStream(events) {
|
|
422
|
+
const blocks = new Map();
|
|
423
|
+
let usage;
|
|
424
|
+
for await (const event of events) {
|
|
425
|
+
const type = typeof event.type === "string" ? event.type : "";
|
|
426
|
+
if (type === "message_start") {
|
|
427
|
+
reportThinkingPrefixDrops(event.message?.input_transformations);
|
|
428
|
+
usage = mergeAnthropicUsage(usage, event.message?.usage);
|
|
429
|
+
if (usage)
|
|
430
|
+
yield { type: "usage", usage };
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
if (type === "message_delta") {
|
|
434
|
+
usage = mergeAnthropicUsage(usage, event.usage);
|
|
435
|
+
if (usage)
|
|
436
|
+
yield { type: "usage", usage };
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
if (type === "error") {
|
|
440
|
+
const err = event.error;
|
|
441
|
+
throw new Error(`Anthropic stream error: ${String(err?.message || err?.type || "unknown error")}`);
|
|
442
|
+
}
|
|
443
|
+
if (type === "content_block_start") {
|
|
444
|
+
const index = typeof event.index === "number" ? event.index : 0;
|
|
445
|
+
const block = event.content_block;
|
|
446
|
+
const blockType = typeof block?.type === "string" ? block.type : "";
|
|
447
|
+
const raw = cloneProviderBlock(block, blockType);
|
|
448
|
+
const state = {
|
|
449
|
+
type: blockType,
|
|
450
|
+
id: typeof block?.id === "string" ? block.id : undefined,
|
|
451
|
+
name: typeof block?.name === "string" ? block.name : undefined,
|
|
452
|
+
args: "",
|
|
453
|
+
started: false,
|
|
454
|
+
input: isObjectRecord(block?.input) ? block.input : undefined,
|
|
455
|
+
raw,
|
|
456
|
+
text: typeof block?.text === "string" ? block.text : "",
|
|
457
|
+
thinking: typeof block?.thinking === "string" ? block.thinking : "",
|
|
458
|
+
signature: typeof block?.signature === "string" ? block.signature : "",
|
|
459
|
+
};
|
|
460
|
+
blocks.set(index, state);
|
|
461
|
+
if (blockType === "text" && typeof block?.text === "string" && block.text) {
|
|
462
|
+
yield { type: "text", content: block.text };
|
|
463
|
+
}
|
|
464
|
+
if (blockType === "thinking" && typeof block?.thinking === "string" && block.thinking) {
|
|
465
|
+
yield { type: "reasoning_delta", content: block.thinking };
|
|
466
|
+
}
|
|
467
|
+
if (blockType === "tool_use" && state.id && state.name) {
|
|
468
|
+
state.started = true;
|
|
469
|
+
yield { type: "tool_call", id: state.id, name: state.name, arguments: "", isStart: true, isEnd: false };
|
|
470
|
+
}
|
|
471
|
+
continue;
|
|
472
|
+
}
|
|
473
|
+
if (type === "content_block_delta") {
|
|
474
|
+
const index = typeof event.index === "number" ? event.index : 0;
|
|
475
|
+
const state = blocks.get(index);
|
|
476
|
+
const delta = event.delta;
|
|
477
|
+
const deltaType = typeof delta?.type === "string" ? delta.type : "";
|
|
478
|
+
if (deltaType === "text_delta" && typeof delta?.text === "string" && delta.text) {
|
|
479
|
+
if (state) {
|
|
480
|
+
state.text += delta.text;
|
|
481
|
+
state.raw.text = state.text;
|
|
482
|
+
}
|
|
483
|
+
yield { type: "text", content: delta.text };
|
|
484
|
+
}
|
|
485
|
+
else if (deltaType === "thinking_delta" && typeof delta?.thinking === "string" && delta.thinking) {
|
|
486
|
+
if (state) {
|
|
487
|
+
state.thinking += delta.thinking;
|
|
488
|
+
state.raw.thinking = state.thinking;
|
|
489
|
+
}
|
|
490
|
+
yield { type: "reasoning_delta", content: delta.thinking };
|
|
491
|
+
}
|
|
492
|
+
else if (deltaType === "signature_delta" && typeof delta?.signature === "string" && state) {
|
|
493
|
+
state.signature += delta.signature;
|
|
494
|
+
state.raw.signature = state.signature;
|
|
495
|
+
}
|
|
496
|
+
else if (deltaType === "input_json_delta" && state?.id && state.name && typeof delta?.partial_json === "string") {
|
|
497
|
+
state.args += delta.partial_json;
|
|
498
|
+
if (!state.started) {
|
|
499
|
+
state.started = true;
|
|
500
|
+
yield { type: "tool_call", id: state.id, name: state.name, arguments: "", isStart: true, isEnd: false };
|
|
501
|
+
}
|
|
502
|
+
if (delta.partial_json) {
|
|
503
|
+
yield { type: "tool_call", id: state.id, name: state.name, arguments: delta.partial_json, isStart: false, isEnd: false };
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
continue;
|
|
507
|
+
}
|
|
508
|
+
if (type === "content_block_stop") {
|
|
509
|
+
const index = typeof event.index === "number" ? event.index : 0;
|
|
510
|
+
const state = blocks.get(index);
|
|
511
|
+
blocks.delete(index);
|
|
512
|
+
if (state?.type === "tool_use" && state.id && state.name) {
|
|
513
|
+
const finalArgs = state.args || JSON.stringify(state.input ?? {});
|
|
514
|
+
state.raw.input = parseToolInput(normalizeToolArgs(finalArgs));
|
|
515
|
+
yield { type: "provider_content_block", provider: "anthropic", block: state.raw };
|
|
516
|
+
yield {
|
|
517
|
+
type: "tool_call",
|
|
518
|
+
id: state.id,
|
|
519
|
+
name: state.name,
|
|
520
|
+
arguments: "",
|
|
521
|
+
argumentsFull: normalizeToolArgs(finalArgs),
|
|
522
|
+
isStart: false,
|
|
523
|
+
isEnd: true,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
else if (state && isReplayableAssistantContentBlock(state.raw)) {
|
|
527
|
+
finalizeRawContentBlock(state);
|
|
528
|
+
yield { type: "provider_content_block", provider: "anthropic", block: state.raw };
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
export async function* readSseEvents(response) {
|
|
534
|
+
if (!response.body) {
|
|
535
|
+
throw new Error("Anthropic Messages API returned an empty stream body.");
|
|
536
|
+
}
|
|
537
|
+
const reader = response.body.getReader();
|
|
538
|
+
const decoder = new TextDecoder();
|
|
539
|
+
let buffer = "";
|
|
540
|
+
try {
|
|
541
|
+
while (true) {
|
|
542
|
+
const { done, value } = await reader.read();
|
|
543
|
+
if (done)
|
|
544
|
+
break;
|
|
545
|
+
buffer += decoder.decode(value, { stream: true });
|
|
546
|
+
let separator = buffer.indexOf("\n\n");
|
|
547
|
+
while (separator >= 0) {
|
|
548
|
+
const raw = buffer.slice(0, separator);
|
|
549
|
+
buffer = buffer.slice(separator + 2);
|
|
550
|
+
const event = parseSseEvent(raw);
|
|
551
|
+
if (event)
|
|
552
|
+
yield event;
|
|
553
|
+
separator = buffer.indexOf("\n\n");
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
buffer += decoder.decode();
|
|
557
|
+
const event = parseSseEvent(buffer);
|
|
558
|
+
if (event)
|
|
559
|
+
yield event;
|
|
560
|
+
}
|
|
561
|
+
finally {
|
|
562
|
+
reader.releaseLock();
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
async function* streamAnthropicEventsWithRetry(options, request) {
|
|
566
|
+
const maxRetries = getProviderMaxRetries();
|
|
567
|
+
for (let attempt = 0;; attempt++) {
|
|
568
|
+
// Connection-level failures and retryable HTTP statuses are retried
|
|
569
|
+
// inside fetchAnthropicResponseWithRetry; an error thrown from it has
|
|
570
|
+
// already exhausted its budget, so it propagates without another loop.
|
|
571
|
+
const response = await fetchAnthropicResponseWithRetry(options, request);
|
|
572
|
+
let sawSseEvent = false;
|
|
573
|
+
try {
|
|
574
|
+
for await (const event of readSseEvents(response)) {
|
|
575
|
+
sawSseEvent = true;
|
|
576
|
+
yield event;
|
|
577
|
+
}
|
|
578
|
+
return;
|
|
579
|
+
}
|
|
580
|
+
catch (error) {
|
|
581
|
+
const normalized = normalizeAnthropicTransportError(error, request.url);
|
|
582
|
+
if (sawSseEvent) {
|
|
583
|
+
// Partial content already surfaced — only the agent loop can discard
|
|
584
|
+
// the half-built assistant message and safely re-issue the request.
|
|
585
|
+
if (!request.signal?.aborted && isProviderTransportError(error)) {
|
|
586
|
+
throw new ProviderStreamInterruptedError(normalized.message, { cause: normalized });
|
|
587
|
+
}
|
|
588
|
+
throw normalized;
|
|
589
|
+
}
|
|
590
|
+
if (request.signal?.aborted || attempt >= maxRetries || !isProviderTransportError(error)) {
|
|
591
|
+
throw normalized;
|
|
592
|
+
}
|
|
593
|
+
await sleepBeforeRetry(computeRetryDelayMs(attempt + 1), request.signal);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
async function fetchAnthropicResponseWithRetry(options, request) {
|
|
598
|
+
const maxRetries = getProviderMaxRetries();
|
|
599
|
+
for (let attempt = 0;; attempt++) {
|
|
600
|
+
let response;
|
|
601
|
+
try {
|
|
602
|
+
response = await providerFetch(request.url, {
|
|
603
|
+
method: request.method,
|
|
604
|
+
headers: buildAnthropicHeaders(options, request.stream, request.model),
|
|
605
|
+
body: request.body,
|
|
606
|
+
signal: request.signal,
|
|
607
|
+
keepalive: false,
|
|
608
|
+
}, {
|
|
609
|
+
providerName: "Anthropic",
|
|
610
|
+
verboseEnvVar: "BUBBLE_ANTHROPIC_FETCH_VERBOSE",
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
catch (error) {
|
|
614
|
+
// No response received, so the request is safe to re-issue.
|
|
615
|
+
if (request.signal?.aborted || attempt >= maxRetries || !isProviderTransportError(error)) {
|
|
616
|
+
throw normalizeAnthropicTransportError(error, request.url);
|
|
617
|
+
}
|
|
618
|
+
await sleepBeforeRetry(computeRetryDelayMs(attempt + 1), request.signal);
|
|
619
|
+
continue;
|
|
620
|
+
}
|
|
621
|
+
if (response.ok)
|
|
622
|
+
return response;
|
|
623
|
+
const detail = await readAnthropicErrorDetail(response);
|
|
624
|
+
// Rate-limit contract (design §4.5): under "defer" the transport performs
|
|
625
|
+
// no 429 backoff and throws the typed error immediately; under "handle"
|
|
626
|
+
// an exhausted 429 retry budget still surfaces as the typed error so the
|
|
627
|
+
// caller can recognize it without string matching.
|
|
628
|
+
if (response.status === 429) {
|
|
629
|
+
const retryAfterMs = retryAfterMsFromResponse(response);
|
|
630
|
+
if (request.rateLimitPolicy === "defer") {
|
|
631
|
+
throw new RateLimitError(`Anthropic Messages API rate limited (429): ${detail || response.statusText}`, {
|
|
632
|
+
status: 429,
|
|
633
|
+
retryAfterMs,
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
if (request.signal?.aborted || attempt >= maxRetries) {
|
|
637
|
+
throw new RateLimitError(`Anthropic Messages API rate limited (429) after ${attempt + 1} attempts: ${detail || response.statusText}`, {
|
|
638
|
+
status: 429,
|
|
639
|
+
retryAfterMs,
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
await sleepBeforeRetry(computeRetryDelayMs(attempt + 1, { retryAfterMs }), request.signal);
|
|
643
|
+
continue;
|
|
644
|
+
}
|
|
645
|
+
const error = new Error(`Anthropic Messages API error ${response.status}: ${detail || response.statusText}`);
|
|
646
|
+
if (request.signal?.aborted || attempt >= maxRetries || !isRetryableAnthropicHttpError(response.status, detail)) {
|
|
647
|
+
throw error;
|
|
648
|
+
}
|
|
649
|
+
await sleepBeforeRetry(computeRetryDelayMs(attempt + 1, { retryAfterMs: retryAfterMsFromResponse(response) }), request.signal);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
function resolveAnthropicMessagesUrl(baseURL) {
|
|
653
|
+
const normalized = baseURL.trim().replace(/\/+$/, "");
|
|
654
|
+
if (normalized.endsWith("/v1/messages"))
|
|
655
|
+
return normalized;
|
|
656
|
+
if (normalized.endsWith("/v1"))
|
|
657
|
+
return `${normalized}/messages`;
|
|
658
|
+
return `${normalized || "https://api.anthropic.com"}/v1/messages`;
|
|
659
|
+
}
|
|
660
|
+
function buildAnthropicHeaders(options, stream, model) {
|
|
661
|
+
const headers = {
|
|
662
|
+
"content-type": "application/json",
|
|
663
|
+
"x-api-key": options.apiKey,
|
|
664
|
+
"anthropic-version": ANTHROPIC_VERSION,
|
|
665
|
+
};
|
|
666
|
+
if (shouldSendBearerAuth(options)) {
|
|
667
|
+
headers.authorization = `Bearer ${options.apiKey}`;
|
|
668
|
+
}
|
|
669
|
+
if (stream)
|
|
670
|
+
headers.accept = "text/event-stream";
|
|
671
|
+
// User-configured headers win last: anthropic-protocol coding plans gate on
|
|
672
|
+
// client identity (e.g. a specific User-Agent), configured per provider.
|
|
673
|
+
const merged = { ...headers, ...(options.headers ?? {}) };
|
|
674
|
+
if (isOfficialAnthropicBaseUrl(options.baseURL) && isClaudeWithBoundThinking(model)) {
|
|
675
|
+
// Merge case-insensitively without losing user-configured beta features.
|
|
676
|
+
const betaKeys = Object.keys(merged).filter(key => key.toLowerCase() === "anthropic-beta");
|
|
677
|
+
const betas = betaKeys.flatMap(key => merged[key].split(",").map(value => value.trim()).filter(Boolean));
|
|
678
|
+
for (const key of betaKeys)
|
|
679
|
+
delete merged[key];
|
|
680
|
+
merged["anthropic-beta"] = [...new Set([...betas, THINKING_BINDING_BETA])].join(",");
|
|
681
|
+
}
|
|
682
|
+
return merged;
|
|
683
|
+
}
|
|
684
|
+
function reportThinkingPrefixDrops(transformations) {
|
|
685
|
+
if (!Array.isArray(transformations))
|
|
686
|
+
return;
|
|
687
|
+
const count = transformations.filter(item => item?.type === "thinking_dropped" && item?.reason === "prefix_binding_mismatch").length;
|
|
688
|
+
if (count > 0) {
|
|
689
|
+
// Count only; raw transformations, signatures and prompt text are private.
|
|
690
|
+
console.warn(`[anthropic-thinking] API discarded ${count} thinking block(s) after a conversation prefix change.`);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
async function readAnthropicErrorDetail(response) {
|
|
694
|
+
try {
|
|
695
|
+
return await response.text();
|
|
696
|
+
}
|
|
697
|
+
catch {
|
|
698
|
+
return response.statusText;
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
function normalizeAnthropicTransportError(error, url) {
|
|
702
|
+
if (!isProviderTransportError(error)) {
|
|
703
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
704
|
+
}
|
|
705
|
+
return normalizeProviderNetworkError(error, {
|
|
706
|
+
providerName: "Anthropic",
|
|
707
|
+
input: url,
|
|
708
|
+
});
|
|
709
|
+
}
|
|
710
|
+
function isRetryableAnthropicHttpError(status, detail) {
|
|
711
|
+
// "714 (1000)" is a transient MiniMax backend error surfaced as a 500.
|
|
712
|
+
return isRetryableHttpStatus(status) || detail.includes("714 (1000)");
|
|
713
|
+
}
|
|
714
|
+
function parseSseEvent(raw) {
|
|
715
|
+
const dataLines = [];
|
|
716
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
717
|
+
if (!line || line.startsWith(":"))
|
|
718
|
+
continue;
|
|
719
|
+
if (line.startsWith("data:")) {
|
|
720
|
+
dataLines.push(line.slice(5).trimStart());
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
if (dataLines.length === 0)
|
|
724
|
+
return undefined;
|
|
725
|
+
const data = dataLines.join("\n");
|
|
726
|
+
if (!data || data === "[DONE]")
|
|
727
|
+
return undefined;
|
|
728
|
+
return JSON.parse(data);
|
|
729
|
+
}
|
|
730
|
+
function cloneProviderBlock(block, fallbackType) {
|
|
731
|
+
const type = typeof block?.type === "string" && block.type ? block.type : fallbackType || "unknown";
|
|
732
|
+
const clone = block ? JSON.parse(JSON.stringify(block)) : {};
|
|
733
|
+
clone.type = type;
|
|
734
|
+
return clone;
|
|
735
|
+
}
|
|
736
|
+
function finalizeRawContentBlock(state) {
|
|
737
|
+
if (state.type === "text") {
|
|
738
|
+
state.raw.text = state.text;
|
|
739
|
+
}
|
|
740
|
+
else if (state.type === "thinking") {
|
|
741
|
+
state.raw.thinking = state.thinking;
|
|
742
|
+
if (state.signature) {
|
|
743
|
+
state.raw.signature = state.signature;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
function contentPartsToAnthropicBlocks(parts) {
|
|
748
|
+
const blocks = [];
|
|
749
|
+
for (const part of parts) {
|
|
750
|
+
if (part.type === "text") {
|
|
751
|
+
blocks.push({ type: "text", text: part.text });
|
|
752
|
+
continue;
|
|
753
|
+
}
|
|
754
|
+
const image = part.image_url.url;
|
|
755
|
+
const dataUrlMatch = image.match(/^data:([^;,]+);base64,(.+)$/);
|
|
756
|
+
if (dataUrlMatch) {
|
|
757
|
+
blocks.push({
|
|
758
|
+
type: "image",
|
|
759
|
+
source: {
|
|
760
|
+
type: "base64",
|
|
761
|
+
media_type: dataUrlMatch[1],
|
|
762
|
+
data: dataUrlMatch[2],
|
|
763
|
+
},
|
|
764
|
+
});
|
|
765
|
+
}
|
|
766
|
+
else {
|
|
767
|
+
blocks.push({ type: "image", source: { type: "url", url: image } });
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
return blocks;
|
|
771
|
+
}
|
|
772
|
+
function pushAnthropicMessage(messages, next) {
|
|
773
|
+
const last = messages.at(-1);
|
|
774
|
+
if (!last || last.role !== next.role) {
|
|
775
|
+
messages.push(next);
|
|
776
|
+
return;
|
|
777
|
+
}
|
|
778
|
+
last.content = mergeAnthropicContent(last.content, next.content);
|
|
779
|
+
}
|
|
780
|
+
function mergeAnthropicContent(current, next) {
|
|
781
|
+
const currentBlocks = typeof current === "string" ? [{ type: "text", text: current }] : current;
|
|
782
|
+
const nextBlocks = typeof next === "string" ? [{ type: "text", text: next }] : next;
|
|
783
|
+
return [...currentBlocks, ...nextBlocks];
|
|
784
|
+
}
|
|
785
|
+
function parseToolInput(raw) {
|
|
786
|
+
try {
|
|
787
|
+
const parsed = JSON.parse(raw || "{}");
|
|
788
|
+
return isObjectRecord(parsed) ? parsed : {};
|
|
789
|
+
}
|
|
790
|
+
catch {
|
|
791
|
+
return {};
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
function normalizeToolArgs(raw) {
|
|
795
|
+
try {
|
|
796
|
+
JSON.parse(raw);
|
|
797
|
+
return raw;
|
|
798
|
+
}
|
|
799
|
+
catch {
|
|
800
|
+
return "{}";
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
function isObjectRecord(value) {
|
|
804
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
805
|
+
}
|
|
806
|
+
function extractAnthropicText(content) {
|
|
807
|
+
if (!content)
|
|
808
|
+
return [];
|
|
809
|
+
return content.flatMap((block) => block.type === "text" && typeof block.text === "string" ? [block.text] : []);
|
|
810
|
+
}
|
|
811
|
+
function mergeAnthropicUsage(current, raw) {
|
|
812
|
+
if (!isObjectRecord(raw))
|
|
813
|
+
return current;
|
|
814
|
+
const rawInput = typeof raw.input_tokens === "number" ? raw.input_tokens : undefined;
|
|
815
|
+
const rawCacheRead = typeof raw.cache_read_input_tokens === "number" ? raw.cache_read_input_tokens : undefined;
|
|
816
|
+
const rawCacheCreation = typeof raw.cache_creation_input_tokens === "number" ? raw.cache_creation_input_tokens : undefined;
|
|
817
|
+
const outputTokens = typeof raw.output_tokens === "number" ? raw.output_tokens : current?.completionTokens ?? 0;
|
|
818
|
+
const hasPromptUsage = rawInput !== undefined || rawCacheRead !== undefined || rawCacheCreation !== undefined;
|
|
819
|
+
let promptTokens = current?.promptTokens ?? 0;
|
|
820
|
+
let promptCacheHitTokens = current?.promptCacheHitTokens;
|
|
821
|
+
let promptCacheMissTokens = current?.promptCacheMissTokens;
|
|
822
|
+
let cacheCreationTokens = current?.cacheCreationTokens;
|
|
823
|
+
if (hasPromptUsage) {
|
|
824
|
+
// Every field carries forward: a message_delta may report one of the three
|
|
825
|
+
// without the others, and defaulting a missing one to 0 would deflate
|
|
826
|
+
// promptTokens — which is the compaction anchor (agent lastInputTokens),
|
|
827
|
+
// so an undercount makes the agent compact later than it should.
|
|
828
|
+
// promptCacheMissTokens already includes cache creation, so the prior
|
|
829
|
+
// uncached remainder has to net it back out before being reused.
|
|
830
|
+
const priorUncachedInput = promptCacheMissTokens !== undefined
|
|
831
|
+
? Math.max(0, promptCacheMissTokens - (cacheCreationTokens ?? 0))
|
|
832
|
+
: promptTokens;
|
|
833
|
+
const inputTokens = rawInput ?? priorUncachedInput;
|
|
834
|
+
const cacheRead = rawCacheRead ?? promptCacheHitTokens ?? 0;
|
|
835
|
+
const cacheCreation = rawCacheCreation ?? cacheCreationTokens ?? 0;
|
|
836
|
+
promptTokens = inputTokens + cacheRead + cacheCreation;
|
|
837
|
+
promptCacheHitTokens = cacheRead;
|
|
838
|
+
promptCacheMissTokens = inputTokens + cacheCreation;
|
|
839
|
+
cacheCreationTokens = cacheCreation;
|
|
840
|
+
}
|
|
841
|
+
return {
|
|
842
|
+
promptTokens,
|
|
843
|
+
completionTokens: outputTokens,
|
|
844
|
+
promptCacheHitTokens,
|
|
845
|
+
promptCacheMissTokens,
|
|
846
|
+
cacheCreationTokens,
|
|
847
|
+
totalTokens: promptTokens + outputTokens,
|
|
848
|
+
};
|
|
849
|
+
}
|
|
850
|
+
function shouldEchoThinking(options) {
|
|
851
|
+
if (isMiMoProvider(options))
|
|
852
|
+
return "all";
|
|
853
|
+
return options.providerId?.startsWith("minimax") ?? false;
|
|
854
|
+
}
|
|
855
|
+
function shouldSendBearerAuth(options) {
|
|
856
|
+
return !isOfficialAnthropicBaseUrl(options.baseURL) || options.providerId?.startsWith("minimax") === true;
|
|
857
|
+
}
|
|
858
|
+
function shouldSendTemperature(options, model, thinkingLevel) {
|
|
859
|
+
if (isMiMoProvider(options) && thinkingLevel !== "off")
|
|
860
|
+
return false;
|
|
861
|
+
if (!isOfficialAnthropicBaseUrl(options.baseURL))
|
|
862
|
+
return true;
|
|
863
|
+
if (thinkingLevel !== "off")
|
|
864
|
+
return false;
|
|
865
|
+
return !isOpusModelWithoutSamplingControls(model)
|
|
866
|
+
&& !isFableModelWith128kOutput(model)
|
|
867
|
+
&& !isClaudeFamilyVersionAtLeast(model, "sonnet", 5, 0);
|
|
868
|
+
}
|
|
869
|
+
function isClaude5WithOptionalThinking(model) {
|
|
870
|
+
return isClaudeFamilyVersionAtLeast(model, "sonnet", 5, 0)
|
|
871
|
+
|| (isClaudeFamilyVersionAtLeast(model, "opus", 5, 0) && !isClaudeWithBoundThinking(model));
|
|
872
|
+
}
|
|
873
|
+
function isOpusModelWith128kOutput(model) {
|
|
874
|
+
return isClaudeFamilyVersionAtLeast(model, "opus", 4, 6);
|
|
875
|
+
}
|
|
876
|
+
function isFableModelWith128kOutput(model) {
|
|
877
|
+
return model.toLowerCase().startsWith("claude-fable-5");
|
|
878
|
+
}
|
|
879
|
+
function isSonnetOrHaikuModelWith64kOutput(model) {
|
|
880
|
+
const normalized = model.toLowerCase();
|
|
881
|
+
return normalized.startsWith("claude-sonnet-4-6")
|
|
882
|
+
|| normalized.startsWith("claude-haiku-4-5");
|
|
883
|
+
}
|
|
884
|
+
function isOpusModelWithoutSamplingControls(model) {
|
|
885
|
+
return isClaudeFamilyVersionAtLeast(model, "opus", 4, 7);
|
|
886
|
+
}
|
|
887
|
+
function isClaudeFamilyVersionAtLeast(model, family, minMajor, minMinor) {
|
|
888
|
+
const normalized = model.toLowerCase();
|
|
889
|
+
if (!normalized.startsWith(`claude-${family}-`))
|
|
890
|
+
return false;
|
|
891
|
+
const [, , majorSegment, minorSegment] = normalized.split("-");
|
|
892
|
+
const major = Number(majorSegment);
|
|
893
|
+
if (!Number.isFinite(major))
|
|
894
|
+
return false;
|
|
895
|
+
if (major > minMajor)
|
|
896
|
+
return true;
|
|
897
|
+
if (major < minMajor)
|
|
898
|
+
return false;
|
|
899
|
+
if (!minorSegment || minorSegment.length > 2)
|
|
900
|
+
return minMinor === 0;
|
|
901
|
+
const minor = Number(minorSegment);
|
|
902
|
+
return Number.isFinite(minor) && minor >= minMinor;
|
|
903
|
+
}
|
|
904
|
+
function isMiniMaxAnthropicEndpoint(options) {
|
|
905
|
+
const providerId = (options.providerId ?? "").toLowerCase();
|
|
906
|
+
if (providerId !== "minimax" && providerId !== "minimax-anthropic")
|
|
907
|
+
return false;
|
|
908
|
+
try {
|
|
909
|
+
const url = new URL(options.baseURL);
|
|
910
|
+
const host = url.hostname.toLowerCase();
|
|
911
|
+
const path = url.pathname.toLowerCase();
|
|
912
|
+
return (host === "api.minimax.io" || host === "api.minimaxi.com") && path.includes("/anthropic");
|
|
913
|
+
}
|
|
914
|
+
catch {
|
|
915
|
+
return false;
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
function isOfficialAnthropicBaseUrl(baseURL) {
|
|
919
|
+
try {
|
|
920
|
+
return new URL(baseURL).hostname === "api.anthropic.com";
|
|
921
|
+
}
|
|
922
|
+
catch {
|
|
923
|
+
return false;
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
function isMiniMaxProvider(options) {
|
|
927
|
+
return (options.providerId || "").toLowerCase().startsWith("minimax")
|
|
928
|
+
|| options.baseURL.toLowerCase().includes("minimaxi");
|
|
929
|
+
}
|
|
930
|
+
function isMiMoProvider(options) {
|
|
931
|
+
if (options.providerId === "mimo-token-plan")
|
|
932
|
+
return true;
|
|
933
|
+
try {
|
|
934
|
+
return ["api.xiaomimimo.com", "token-plan-cn.xiaomimimo.com", "token-plan-sgp.xiaomimimo.com", "token-plan-ams.xiaomimimo.com"]
|
|
935
|
+
.includes(new URL(options.baseURL).hostname);
|
|
936
|
+
}
|
|
937
|
+
catch {
|
|
938
|
+
return false;
|
|
939
|
+
}
|
|
940
|
+
}
|