@bubblebrain-ai/bubble 0.0.63 → 0.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +437 -11
- package/dist/agent/abort-errors.d.ts +18 -0
- package/dist/agent/abort-errors.js +51 -0
- package/dist/agent/budget-ledger.d.ts +20 -0
- package/dist/agent/budget-ledger.js +45 -0
- package/dist/agent/categories.d.ts +100 -0
- package/dist/agent/categories.js +203 -0
- package/dist/agent/change-tracker.d.ts +40 -0
- package/dist/agent/change-tracker.js +89 -0
- package/dist/agent/child-runner.d.ts +64 -0
- package/dist/agent/child-runner.js +405 -0
- package/dist/agent/input-controller.d.ts +14 -0
- package/dist/agent/input-controller.js +43 -0
- package/dist/agent/internal-reminder-sanitizer.d.ts +25 -0
- package/dist/agent/internal-reminder-sanitizer.js +297 -0
- package/dist/agent/profiles.d.ts +76 -0
- package/dist/agent/profiles.js +526 -0
- package/dist/agent/provider-fingerprint.d.ts +6 -0
- package/dist/agent/provider-fingerprint.js +89 -0
- package/dist/agent/resident-history.d.ts +7 -0
- package/dist/agent/resident-history.js +61 -0
- package/dist/agent/result-integrator.d.ts +22 -0
- package/dist/agent/result-integrator.js +50 -0
- package/dist/agent/routing-catalog.d.ts +131 -0
- package/dist/agent/routing-catalog.js +260 -0
- package/dist/agent/structured-output.d.ts +37 -0
- package/dist/agent/structured-output.js +193 -0
- package/dist/agent/subagent/router.d.ts +65 -0
- package/dist/agent/subagent/router.js +203 -0
- package/dist/agent/subagent/runtime.d.ts +235 -0
- package/dist/agent/subagent/runtime.js +835 -0
- package/dist/agent/subagent-control.d.ts +100 -0
- package/dist/agent/subagent-control.js +70 -0
- package/dist/agent/subagent-lifecycle-reminder.d.ts +3 -0
- package/dist/agent/subagent-lifecycle-reminder.js +112 -0
- package/dist/agent/subagent-route-format.d.ts +8 -0
- package/dist/agent/subagent-route-format.js +18 -0
- package/dist/agent/subagent-scheduler.d.ts +105 -0
- package/dist/agent/subagent-scheduler.js +287 -0
- package/dist/agent/subagent-store.d.ts +57 -0
- package/dist/agent/subagent-store.js +180 -0
- package/dist/agent/subagent-summary.d.ts +30 -0
- package/dist/agent/subagent-summary.js +74 -0
- package/dist/agent/subagent-wait-guidance.d.ts +2 -0
- package/dist/agent/subagent-wait-guidance.js +8 -0
- package/dist/agent/subtask-policy.d.ts +13 -0
- package/dist/agent/subtask-policy.js +56 -0
- package/dist/agent/task-lifecycle-reminder.d.ts +26 -0
- package/dist/agent/task-lifecycle-reminder.js +59 -0
- package/dist/agent/tool-intent.d.ts +45 -0
- package/dist/agent/tool-intent.js +318 -0
- package/dist/agent/tool-visibility.d.ts +10 -0
- package/dist/agent/tool-visibility.js +6 -0
- package/dist/agent/transcript-helpers.d.ts +20 -0
- package/dist/agent/transcript-helpers.js +63 -0
- package/dist/agent/update-queue.d.ts +13 -0
- package/dist/agent/update-queue.js +69 -0
- package/dist/agent/workflow/control.d.ts +60 -0
- package/dist/agent/workflow/control.js +62 -0
- package/dist/agent/workflow/errors.d.ts +16 -0
- package/dist/agent/workflow/errors.js +24 -0
- package/dist/agent/workflow/runs.d.ts +73 -0
- package/dist/agent/workflow/runs.js +160 -0
- package/dist/agent/workflow/runtime.d.ts +88 -0
- package/dist/agent/workflow/runtime.js +319 -0
- package/dist/agent/worktree.d.ts +29 -0
- package/dist/agent/worktree.js +73 -0
- package/dist/agent.d.ts +460 -0
- package/dist/agent.js +2210 -0
- package/dist/anthropic-thinking.d.ts +4 -0
- package/dist/anthropic-thinking.js +11 -0
- package/dist/approval/controller.d.ts +71 -0
- package/dist/approval/controller.js +286 -0
- package/dist/approval/danger.d.ts +13 -0
- package/dist/approval/danger.js +55 -0
- package/dist/approval/diff-hunks.d.ts +12 -0
- package/dist/approval/diff-hunks.js +32 -0
- package/dist/approval/protected-paths.d.ts +1 -0
- package/dist/approval/protected-paths.js +35 -0
- package/dist/approval/session-cache.d.ts +21 -0
- package/dist/approval/session-cache.js +38 -0
- package/dist/approval/tool-helper.d.ts +14 -0
- package/dist/approval/tool-helper.js +47 -0
- package/dist/approval/types.d.ts +146 -0
- package/dist/approval/types.js +8 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +3 -0
- package/dist/bubble-home.d.ts +8 -0
- package/dist/bubble-home.js +19 -0
- package/dist/checkpoints.d.ts +57 -0
- package/dist/checkpoints.js +0 -0
- package/dist/cli.d.ts +37 -0
- package/dist/cli.js +175 -0
- package/dist/clipboard.d.ts +14 -0
- package/dist/clipboard.js +132 -0
- package/dist/config.d.ts +96 -0
- package/dist/config.js +287 -0
- package/dist/context/budget.d.ts +28 -0
- package/dist/context/budget.js +130 -0
- package/dist/context/checkpoint.d.ts +18 -0
- package/dist/context/checkpoint.js +117 -0
- package/dist/context/compact-llm.d.ts +25 -0
- package/dist/context/compact-llm.js +175 -0
- package/dist/context/compact.d.ts +124 -0
- package/dist/context/compact.js +635 -0
- package/dist/context/compaction-files.d.ts +44 -0
- package/dist/context/compaction-files.js +148 -0
- package/dist/context/llm-compactor.d.ts +53 -0
- package/dist/context/llm-compactor.js +424 -0
- package/dist/context/overflow.d.ts +9 -0
- package/dist/context/overflow.js +50 -0
- package/dist/context/projector.d.ts +34 -0
- package/dist/context/projector.js +251 -0
- package/dist/context/prune.d.ts +26 -0
- package/dist/context/prune.js +171 -0
- package/dist/context/session-write-lock.d.ts +20 -0
- package/dist/context/session-write-lock.js +162 -0
- package/dist/context/token-estimator.d.ts +14 -0
- package/dist/context/token-estimator.js +106 -0
- package/dist/context/tool-images.d.ts +3 -0
- package/dist/context/tool-images.js +35 -0
- package/dist/context/tool-output-truncate.d.ts +24 -0
- package/dist/context/tool-output-truncate.js +181 -0
- package/dist/context/usage.d.ts +34 -0
- package/dist/context/usage.js +230 -0
- package/dist/debug-trace.d.ts +27 -0
- package/dist/debug-trace.js +401 -0
- package/dist/diff-stats.d.ts +5 -0
- package/dist/diff-stats.js +21 -0
- package/dist/external-runtime/grok-acp.d.ts +56 -0
- package/dist/external-runtime/grok-acp.js +386 -0
- package/dist/external-runtime/grok-binary.d.ts +25 -0
- package/dist/external-runtime/grok-binary.js +108 -0
- package/dist/external-runtime/grok-errors.d.ts +7 -0
- package/dist/external-runtime/grok-errors.js +15 -0
- package/dist/external-runtime/grok-input-policy.d.ts +58 -0
- package/dist/external-runtime/grok-input-policy.js +52 -0
- package/dist/external-runtime/grok-ndjson.d.ts +14 -0
- package/dist/external-runtime/grok-ndjson.js +193 -0
- package/dist/external-runtime/grok-network.d.ts +15 -0
- package/dist/external-runtime/grok-network.js +81 -0
- package/dist/external-runtime/grok-preflight.d.ts +28 -0
- package/dist/external-runtime/grok-preflight.js +194 -0
- package/dist/external-runtime/grok-process.d.ts +26 -0
- package/dist/external-runtime/grok-process.js +184 -0
- package/dist/external-runtime/grok-profile.d.ts +32 -0
- package/dist/external-runtime/grok-profile.js +419 -0
- package/dist/external-runtime/grok-provider.d.ts +31 -0
- package/dist/external-runtime/grok-provider.js +41 -0
- package/dist/external-runtime/grok-runtime.d.ts +91 -0
- package/dist/external-runtime/grok-runtime.js +882 -0
- package/dist/external-runtime/index.d.ts +13 -0
- package/dist/external-runtime/index.js +13 -0
- package/dist/external-runtime/session-policy.d.ts +11 -0
- package/dist/external-runtime/session-policy.js +30 -0
- package/dist/external-runtime/types.d.ts +65 -0
- package/dist/external-runtime/types.js +1 -0
- package/dist/feedback/collect.d.ts +7 -0
- package/dist/feedback/collect.js +119 -0
- package/dist/feedback/config.d.ts +14 -0
- package/dist/feedback/config.js +16 -0
- package/dist/feedback/redact.d.ts +1 -0
- package/dist/feedback/redact.js +25 -0
- package/dist/feedback/submit.d.ts +6 -0
- package/dist/feedback/submit.js +43 -0
- package/dist/feedback/types.d.ts +22 -0
- package/dist/feedback/types.js +1 -0
- package/dist/feishu/agent-host/approval-card.d.ts +11 -0
- package/dist/feishu/agent-host/approval-card.js +85 -0
- package/dist/feishu/agent-host/approval-ui.d.ts +59 -0
- package/dist/feishu/agent-host/approval-ui.js +214 -0
- package/dist/feishu/agent-host/run-driver.d.ts +51 -0
- package/dist/feishu/agent-host/run-driver.js +397 -0
- package/dist/feishu/agent-host/runtime-deps.d.ts +33 -0
- package/dist/feishu/agent-host/runtime-deps.js +8 -0
- package/dist/feishu/card/budget.d.ts +40 -0
- package/dist/feishu/card/budget.js +134 -0
- package/dist/feishu/card/renderer.d.ts +29 -0
- package/dist/feishu/card/renderer.js +245 -0
- package/dist/feishu/card/run-state-types.d.ts +49 -0
- package/dist/feishu/card/run-state-types.js +15 -0
- package/dist/feishu/card/run-state.d.ts +21 -0
- package/dist/feishu/card/run-state.js +223 -0
- package/dist/feishu/channel/channel.d.ts +52 -0
- package/dist/feishu/channel/channel.js +74 -0
- package/dist/feishu/config.d.ts +24 -0
- package/dist/feishu/config.js +97 -0
- package/dist/feishu/format.d.ts +6 -0
- package/dist/feishu/format.js +14 -0
- package/dist/feishu/index.d.ts +4 -0
- package/dist/feishu/index.js +4 -0
- package/dist/feishu/logger.d.ts +31 -0
- package/dist/feishu/logger.js +62 -0
- package/dist/feishu/paths.d.ts +12 -0
- package/dist/feishu/paths.js +38 -0
- package/dist/feishu/process-registry.d.ts +29 -0
- package/dist/feishu/process-registry.js +90 -0
- package/dist/feishu/router/commands.d.ts +38 -0
- package/dist/feishu/router/commands.js +286 -0
- package/dist/feishu/router/event-router.d.ts +40 -0
- package/dist/feishu/router/event-router.js +208 -0
- package/dist/feishu/router/whitelist.d.ts +23 -0
- package/dist/feishu/router/whitelist.js +20 -0
- package/dist/feishu/runtime/active-runs.d.ts +32 -0
- package/dist/feishu/runtime/active-runs.js +84 -0
- package/dist/feishu/runtime/pending-queue.d.ts +36 -0
- package/dist/feishu/runtime/pending-queue.js +98 -0
- package/dist/feishu/runtime/process-pool.d.ts +29 -0
- package/dist/feishu/runtime/process-pool.js +49 -0
- package/dist/feishu/schema.d.ts +17 -0
- package/dist/feishu/schema.js +252 -0
- package/dist/feishu/scope/scope-registry.d.ts +39 -0
- package/dist/feishu/scope/scope-registry.js +148 -0
- package/dist/feishu/scope/session-binder.d.ts +44 -0
- package/dist/feishu/scope/session-binder.js +100 -0
- package/dist/feishu/scope/session-store.d.ts +24 -0
- package/dist/feishu/scope/session-store.js +73 -0
- package/dist/feishu/secrets.d.ts +37 -0
- package/dist/feishu/secrets.js +129 -0
- package/dist/feishu/serve.d.ts +12 -0
- package/dist/feishu/serve.js +302 -0
- package/dist/feishu/types.d.ts +75 -0
- package/dist/feishu/types.js +23 -0
- package/dist/feishu/wizard.d.ts +24 -0
- package/dist/feishu/wizard.js +121 -0
- package/dist/goal/command.d.ts +20 -0
- package/dist/goal/command.js +76 -0
- package/dist/goal/engine.d.ts +33 -0
- package/dist/goal/engine.js +65 -0
- package/dist/goal/format.d.ts +18 -0
- package/dist/goal/format.js +112 -0
- package/dist/goal/prompts.d.ts +13 -0
- package/dist/goal/prompts.js +84 -0
- package/dist/goal/store.d.ts +64 -0
- package/dist/goal/store.js +174 -0
- package/dist/goal/tools.d.ts +13 -0
- package/dist/goal/tools.js +67 -0
- package/dist/goal/usage.d.ts +2 -0
- package/dist/goal/usage.js +3 -0
- package/dist/hooks/config.d.ts +9 -0
- package/dist/hooks/config.js +278 -0
- package/dist/hooks/controller.d.ts +24 -0
- package/dist/hooks/controller.js +254 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/log.d.ts +14 -0
- package/dist/hooks/log.js +54 -0
- package/dist/hooks/runner.d.ts +5 -0
- package/dist/hooks/runner.js +225 -0
- package/dist/hooks/trust.d.ts +37 -0
- package/dist/hooks/trust.js +143 -0
- package/dist/hooks/types.d.ts +173 -0
- package/dist/hooks/types.js +46 -0
- package/dist/loop/engine.d.ts +29 -0
- package/dist/loop/engine.js +63 -0
- package/dist/lsp/config.d.ts +18 -0
- package/dist/lsp/config.js +58 -0
- package/dist/lsp/diagnostics.d.ts +24 -0
- package/dist/lsp/diagnostics.js +103 -0
- package/dist/lsp/index.d.ts +3 -0
- package/dist/lsp/index.js +3 -0
- package/dist/lsp/service.d.ts +97 -0
- package/dist/lsp/service.js +815 -0
- package/dist/main.d.ts +5 -0
- package/dist/main.js +984 -0
- package/dist/mcp/client.d.ts +68 -0
- package/dist/mcp/client.js +177 -0
- package/dist/mcp/config.d.ts +30 -0
- package/dist/mcp/config.js +144 -0
- package/dist/mcp/manager.d.ts +67 -0
- package/dist/mcp/manager.js +328 -0
- package/dist/mcp/name.d.ts +26 -0
- package/dist/mcp/name.js +40 -0
- package/dist/mcp/transports.d.ts +54 -0
- package/dist/mcp/transports.js +267 -0
- package/dist/mcp/types.d.ts +111 -0
- package/dist/mcp/types.js +14 -0
- package/dist/memory/db.d.ts +65 -0
- package/dist/memory/db.js +332 -0
- package/dist/memory/index.d.ts +10 -0
- package/dist/memory/index.js +10 -0
- package/dist/memory/paths.d.ts +18 -0
- package/dist/memory/paths.js +38 -0
- package/dist/memory/phase1.d.ts +23 -0
- package/dist/memory/phase1.js +292 -0
- package/dist/memory/phase2.d.ts +19 -0
- package/dist/memory/phase2.js +119 -0
- package/dist/memory/prompts.d.ts +19 -0
- package/dist/memory/prompts.js +104 -0
- package/dist/memory/reset.d.ts +1 -0
- package/dist/memory/reset.js +13 -0
- package/dist/memory/session-policy.d.ts +25 -0
- package/dist/memory/session-policy.js +55 -0
- package/dist/memory/start.d.ts +24 -0
- package/dist/memory/start.js +50 -0
- package/dist/memory/storage.d.ts +11 -0
- package/dist/memory/storage.js +95 -0
- package/dist/memory/store.d.ts +43 -0
- package/dist/memory/store.js +193 -0
- package/dist/memory/usage.d.ts +1 -0
- package/dist/memory/usage.js +38 -0
- package/dist/model-catalog.d.ts +65 -0
- package/dist/model-catalog.js +387 -0
- package/dist/model-config.d.ts +40 -0
- package/dist/model-config.js +74 -0
- package/dist/model-data.generated.d.ts +16 -0
- package/dist/model-data.generated.js +275 -0
- package/dist/model-pricing.d.ts +54 -0
- package/dist/model-pricing.js +244 -0
- package/dist/model-selection.d.ts +7 -0
- package/dist/model-selection.js +18 -0
- package/dist/network/chatgpt-transport.d.ts +16 -0
- package/dist/network/chatgpt-transport.js +232 -0
- package/dist/network/errors.d.ts +47 -0
- package/dist/network/errors.js +48 -0
- package/dist/network/provider-transport-log.d.ts +12 -0
- package/dist/network/provider-transport-log.js +32 -0
- package/dist/network/provider-transport.d.ts +37 -0
- package/dist/network/provider-transport.js +256 -0
- package/dist/network/retry.d.ts +34 -0
- package/dist/network/retry.js +97 -0
- package/dist/network/system-proxy.d.ts +18 -0
- package/dist/network/system-proxy.js +175 -0
- package/dist/oauth/grok.d.ts +26 -0
- package/dist/oauth/grok.js +251 -0
- package/dist/oauth/index.d.ts +4 -0
- package/dist/oauth/index.js +3 -0
- package/dist/oauth/openai-codex.d.ts +15 -0
- package/dist/oauth/openai-codex.js +193 -0
- package/dist/oauth/refresh-control.d.ts +12 -0
- package/dist/oauth/refresh-control.js +42 -0
- package/dist/oauth/storage.d.ts +88 -0
- package/dist/oauth/storage.js +357 -0
- package/dist/oauth/types.d.ts +15 -0
- package/dist/oauth/types.js +1 -0
- package/dist/orchestrator/default-hooks.d.ts +22 -0
- package/dist/orchestrator/default-hooks.js +127 -0
- package/dist/orchestrator/hooks.d.ts +69 -0
- package/dist/orchestrator/hooks.js +52 -0
- package/dist/permission/mode.d.ts +19 -0
- package/dist/permission/mode.js +16 -0
- package/dist/permissions/rule.d.ts +42 -0
- package/dist/permissions/rule.js +293 -0
- package/dist/permissions/settings.d.ts +97 -0
- package/dist/permissions/settings.js +289 -0
- package/dist/permissions/shell-command.d.ts +36 -0
- package/dist/permissions/shell-command.js +226 -0
- package/dist/permissions/trust-prompt.d.ts +10 -0
- package/dist/permissions/trust-prompt.js +34 -0
- package/dist/permissions/trust.d.ts +26 -0
- package/dist/permissions/trust.js +113 -0
- package/dist/permissions/types.d.ts +61 -0
- package/dist/permissions/types.js +14 -0
- package/dist/print-output.d.ts +98 -0
- package/dist/print-output.js +117 -0
- package/dist/prompt/compose.d.ts +19 -0
- package/dist/prompt/compose.js +110 -0
- package/dist/prompt/delegation.d.ts +14 -0
- package/dist/prompt/delegation.js +100 -0
- package/dist/prompt/environment.d.ts +12 -0
- package/dist/prompt/environment.js +55 -0
- package/dist/prompt/provider-prompts/anthropic.d.ts +1 -0
- package/dist/prompt/provider-prompts/anthropic.js +5 -0
- package/dist/prompt/provider-prompts/codex.d.ts +1 -0
- package/dist/prompt/provider-prompts/codex.js +5 -0
- package/dist/prompt/provider-prompts/deepseek.d.ts +1 -0
- package/dist/prompt/provider-prompts/deepseek.js +7 -0
- package/dist/prompt/provider-prompts/default.d.ts +1 -0
- package/dist/prompt/provider-prompts/default.js +6 -0
- package/dist/prompt/provider-prompts/gemini.d.ts +1 -0
- package/dist/prompt/provider-prompts/gemini.js +5 -0
- package/dist/prompt/provider-prompts/glm.d.ts +1 -0
- package/dist/prompt/provider-prompts/glm.js +7 -0
- package/dist/prompt/provider-prompts/gpt.d.ts +1 -0
- package/dist/prompt/provider-prompts/gpt.js +5 -0
- package/dist/prompt/provider-prompts/kimi.d.ts +1 -0
- package/dist/prompt/provider-prompts/kimi.js +8 -0
- package/dist/prompt/reminders.d.ts +33 -0
- package/dist/prompt/reminders.js +135 -0
- package/dist/prompt/routing.d.ts +14 -0
- package/dist/prompt/routing.js +71 -0
- package/dist/prompt/runtime.d.ts +12 -0
- package/dist/prompt/runtime.js +40 -0
- package/dist/prompt/task-reminders.d.ts +12 -0
- package/dist/prompt/task-reminders.js +64 -0
- package/dist/provider-ai-sdk.d.ts +59 -0
- package/dist/provider-ai-sdk.js +541 -0
- package/dist/provider-anthropic.d.ts +126 -0
- package/dist/provider-anthropic.js +940 -0
- package/dist/provider-ark-responses.d.ts +29 -0
- package/dist/provider-ark-responses.js +518 -0
- package/dist/provider-artifacts.d.ts +7 -0
- package/dist/provider-artifacts.js +60 -0
- package/dist/provider-error-record.d.ts +43 -0
- package/dist/provider-error-record.js +213 -0
- package/dist/provider-grok.d.ts +50 -0
- package/dist/provider-grok.js +110 -0
- package/dist/provider-model-policy.d.ts +16 -0
- package/dist/provider-model-policy.js +33 -0
- package/dist/provider-openai-codex.d.ts +66 -0
- package/dist/provider-openai-codex.js +781 -0
- package/dist/provider-registry.d.ts +197 -0
- package/dist/provider-registry.js +1194 -0
- package/dist/provider-transform.d.ts +12 -0
- package/dist/provider-transform.js +293 -0
- package/dist/provider-zen-errors.d.ts +9 -0
- package/dist/provider-zen-errors.js +36 -0
- package/dist/provider.d.ts +85 -0
- package/dist/provider.js +925 -0
- package/dist/question/controller.d.ts +22 -0
- package/dist/question/controller.js +98 -0
- package/dist/question/index.d.ts +2 -0
- package/dist/question/index.js +2 -0
- package/dist/question/normalize.d.ts +6 -0
- package/dist/question/normalize.js +11 -0
- package/dist/question/types.d.ts +42 -0
- package/dist/question/types.js +6 -0
- package/dist/reasoning-debug.d.ts +7 -0
- package/dist/reasoning-debug.js +33 -0
- package/dist/rewind.d.ts +20 -0
- package/dist/rewind.js +29 -0
- package/dist/sdk/index.d.ts +319 -0
- package/dist/sdk/index.js +1068 -0
- package/dist/sdk/replay-event-log.d.ts +26 -0
- package/dist/sdk/replay-event-log.js +122 -0
- package/dist/sdk/session-turn-coordinator.d.ts +45 -0
- package/dist/sdk/session-turn-coordinator.js +227 -0
- package/dist/session-context-fence.d.ts +16 -0
- package/dist/session-context-fence.js +26 -0
- package/dist/session-log.d.ts +25 -0
- package/dist/session-log.js +444 -0
- package/dist/session-title.d.ts +16 -0
- package/dist/session-title.js +131 -0
- package/dist/session-types.d.ts +86 -0
- package/dist/session-types.js +1 -0
- package/dist/session.d.ts +135 -0
- package/dist/session.js +664 -0
- package/dist/skills/discovery.d.ts +12 -0
- package/dist/skills/discovery.js +166 -0
- package/dist/skills/format.d.ts +32 -0
- package/dist/skills/format.js +68 -0
- package/dist/skills/frontmatter.d.ts +5 -0
- package/dist/skills/frontmatter.js +60 -0
- package/dist/skills/invocation.d.ts +8 -0
- package/dist/skills/invocation.js +33 -0
- package/dist/skills/registry.d.ts +28 -0
- package/dist/skills/registry.js +79 -0
- package/dist/skills/types.d.ts +34 -0
- package/dist/skills/types.js +1 -0
- package/dist/slash-commands/commands.d.ts +10 -0
- package/dist/slash-commands/commands.js +1251 -0
- package/dist/slash-commands/feishu.d.ts +17 -0
- package/dist/slash-commands/feishu.js +400 -0
- package/dist/slash-commands/index.d.ts +4 -0
- package/dist/slash-commands/index.js +8 -0
- package/dist/slash-commands/registry.d.ts +32 -0
- package/dist/slash-commands/registry.js +73 -0
- package/dist/slash-commands/types.d.ts +109 -0
- package/dist/slash-commands/types.js +1 -0
- package/dist/slash-commands/unified.d.ts +38 -0
- package/dist/slash-commands/unified.js +38 -0
- package/dist/stats/usage.d.ts +59 -0
- package/dist/stats/usage.js +485 -0
- package/dist/stream-json.d.ts +13 -0
- package/dist/stream-json.js +74 -0
- package/dist/system-prompt.d.ts +40 -0
- package/dist/system-prompt.js +7 -0
- package/dist/tasks/manager.d.ts +145 -0
- package/dist/tasks/manager.js +634 -0
- package/dist/tasks/process-utils.d.ts +10 -0
- package/dist/tasks/process-utils.js +49 -0
- package/dist/tasks/promotion.d.ts +17 -0
- package/dist/tasks/promotion.js +30 -0
- package/dist/tasks/wake.d.ts +53 -0
- package/dist/tasks/wake.js +125 -0
- package/dist/text-display.d.ts +3 -0
- package/dist/text-display.js +25 -0
- package/dist/tools/agent-lifecycle.d.ts +30 -0
- package/dist/tools/agent-lifecycle.js +790 -0
- package/dist/tools/bash.d.ts +23 -0
- package/dist/tools/bash.js +443 -0
- package/dist/tools/child-tools.d.ts +41 -0
- package/dist/tools/child-tools.js +122 -0
- package/dist/tools/edit-apply.d.ts +25 -0
- package/dist/tools/edit-apply.js +274 -0
- package/dist/tools/edit.d.ts +18 -0
- package/dist/tools/edit.js +200 -0
- package/dist/tools/exa-mcp.d.ts +3 -0
- package/dist/tools/exa-mcp.js +74 -0
- package/dist/tools/exit-plan-mode.d.ts +22 -0
- package/dist/tools/exit-plan-mode.js +79 -0
- package/dist/tools/file-mutation-queue.d.ts +2 -0
- package/dist/tools/file-mutation-queue.js +43 -0
- package/dist/tools/file-state.d.ts +48 -0
- package/dist/tools/file-state.js +76 -0
- package/dist/tools/grep.d.ts +9 -0
- package/dist/tools/grep.js +387 -0
- package/dist/tools/index.d.ts +63 -0
- package/dist/tools/index.js +76 -0
- package/dist/tools/ls.d.ts +3 -0
- package/dist/tools/ls.js +85 -0
- package/dist/tools/lsp.d.ts +4 -0
- package/dist/tools/lsp.js +95 -0
- package/dist/tools/memory.d.ts +8 -0
- package/dist/tools/memory.js +77 -0
- package/dist/tools/path-utils.d.ts +8 -0
- package/dist/tools/path-utils.js +53 -0
- package/dist/tools/prompt-metadata.d.ts +3 -0
- package/dist/tools/prompt-metadata.js +17 -0
- package/dist/tools/question.d.ts +3 -0
- package/dist/tools/question.js +177 -0
- package/dist/tools/read.d.ts +8 -0
- package/dist/tools/read.js +309 -0
- package/dist/tools/sensitive-paths.d.ts +11 -0
- package/dist/tools/sensitive-paths.js +106 -0
- package/dist/tools/server-manager.d.ts +6 -0
- package/dist/tools/server-manager.js +6 -0
- package/dist/tools/server.d.ts +6 -0
- package/dist/tools/server.js +249 -0
- package/dist/tools/skill-search.d.ts +10 -0
- package/dist/tools/skill-search.js +134 -0
- package/dist/tools/skill.d.ts +7 -0
- package/dist/tools/skill.js +81 -0
- package/dist/tools/task-tools.d.ts +10 -0
- package/dist/tools/task-tools.js +133 -0
- package/dist/tools/tool-search.d.ts +23 -0
- package/dist/tools/tool-search.js +145 -0
- package/dist/tools/web-fetch.d.ts +6 -0
- package/dist/tools/web-fetch.js +76 -0
- package/dist/tools/web-search.d.ts +5 -0
- package/dist/tools/web-search.js +50 -0
- package/dist/tools/write.d.ts +10 -0
- package/dist/tools/write.js +155 -0
- package/dist/tui/animation-clock.d.ts +14 -0
- package/dist/tui/animation-clock.js +34 -0
- package/dist/tui/app.d.ts +176 -0
- package/dist/tui/app.js +1659 -0
- package/dist/tui/components/approval-dialog.d.ts +43 -0
- package/dist/tui/components/approval-dialog.js +212 -0
- package/dist/tui/components/bottom-sheet.d.ts +9 -0
- package/dist/tui/components/bottom-sheet.js +32 -0
- package/dist/tui/components/context-info.d.ts +54 -0
- package/dist/tui/components/context-info.js +388 -0
- package/dist/tui/components/feedback-dialog.d.ts +56 -0
- package/dist/tui/components/feedback-dialog.js +262 -0
- package/dist/tui/components/feishu-setup-dialog.d.ts +65 -0
- package/dist/tui/components/feishu-setup-dialog.js +332 -0
- package/dist/tui/components/image-preview.d.ts +32 -0
- package/dist/tui/components/image-preview.js +130 -0
- package/dist/tui/components/plan-dialog.d.ts +34 -0
- package/dist/tui/components/plan-dialog.js +196 -0
- package/dist/tui/components/provider-key-input.d.ts +18 -0
- package/dist/tui/components/provider-key-input.js +49 -0
- package/dist/tui/components/question-dialog.d.ts +25 -0
- package/dist/tui/components/question-dialog.js +263 -0
- package/dist/tui/components/responsive-transcript.d.ts +31 -0
- package/dist/tui/components/responsive-transcript.js +77 -0
- package/dist/tui/components/rewind-picker.d.ts +62 -0
- package/dist/tui/components/rewind-picker.js +317 -0
- package/dist/tui/components/session-picker.d.ts +49 -0
- package/dist/tui/components/session-picker.js +303 -0
- package/dist/tui/components/skills-panel.d.ts +63 -0
- package/dist/tui/components/skills-panel.js +582 -0
- package/dist/tui/components/stats-panel.d.ts +40 -0
- package/dist/tui/components/stats-panel.js +301 -0
- package/dist/tui/components/streaming-message.d.ts +69 -0
- package/dist/tui/components/streaming-message.js +398 -0
- package/dist/tui/components/subagent-inspector.d.ts +28 -0
- package/dist/tui/components/subagent-inspector.js +127 -0
- package/dist/tui/components/task-inspector.d.ts +26 -0
- package/dist/tui/components/task-inspector.js +70 -0
- package/dist/tui/components/tasks-pane.d.ts +126 -0
- package/dist/tui/components/tasks-pane.js +566 -0
- package/dist/tui/components/transcript.d.ts +103 -0
- package/dist/tui/components/transcript.js +858 -0
- package/dist/tui/components/welcome.d.ts +20 -0
- package/dist/tui/components/welcome.js +133 -0
- package/dist/tui/components/workflow-inspector.d.ts +30 -0
- package/dist/tui/components/workflow-inspector.js +136 -0
- package/dist/tui/composer-autocomplete.d.ts +76 -0
- package/dist/tui/composer-autocomplete.js +465 -0
- package/dist/tui/composer-style.d.ts +7 -0
- package/dist/tui/composer-style.js +29 -0
- package/dist/tui/controller/agent-event-reducer.d.ts +75 -0
- package/dist/tui/controller/agent-event-reducer.js +239 -0
- package/dist/tui/controller/composer-controller.d.ts +95 -0
- package/dist/tui/controller/composer-controller.js +502 -0
- package/dist/tui/controller/controller.d.ts +199 -0
- package/dist/tui/controller/controller.js +1034 -0
- package/dist/tui/controller/effects.d.ts +71 -0
- package/dist/tui/controller/effects.js +1 -0
- package/dist/tui/controller/goal-runtime-controller.d.ts +47 -0
- package/dist/tui/controller/goal-runtime-controller.js +202 -0
- package/dist/tui/controller/input-queue-machine.d.ts +71 -0
- package/dist/tui/controller/input-queue-machine.js +121 -0
- package/dist/tui/controller/intents.d.ts +56 -0
- package/dist/tui/controller/intents.js +6 -0
- package/dist/tui/controller/overlay-controller.d.ts +64 -0
- package/dist/tui/controller/overlay-controller.js +129 -0
- package/dist/tui/controller/ports.d.ts +57 -0
- package/dist/tui/controller/ports.js +9 -0
- package/dist/tui/controller/session-transition.d.ts +54 -0
- package/dist/tui/controller/session-transition.js +68 -0
- package/dist/tui/controller/state.d.ts +14 -0
- package/dist/tui/controller/state.js +36 -0
- package/dist/tui/controller/task-runtime-controller.d.ts +66 -0
- package/dist/tui/controller/task-runtime-controller.js +158 -0
- package/dist/tui/detect-theme.d.ts +4 -0
- package/dist/tui/detect-theme.js +116 -0
- package/dist/tui/display-history.d.ts +64 -0
- package/dist/tui/display-history.js +283 -0
- package/dist/tui/display-sanitizer.d.ts +3 -0
- package/dist/tui/display-sanitizer.js +38 -0
- package/dist/tui/edit-diff.d.ts +11 -0
- package/dist/tui/edit-diff.js +57 -0
- package/dist/tui/file-mentions.d.ts +29 -0
- package/dist/tui/file-mentions.js +174 -0
- package/dist/tui/footer.d.ts +37 -0
- package/dist/tui/footer.js +80 -0
- package/dist/tui/formatting/edit-diff.d.ts +11 -0
- package/dist/tui/formatting/edit-diff.js +52 -0
- package/dist/tui/formatting/summary.d.ts +43 -0
- package/dist/tui/formatting/summary.js +150 -0
- package/dist/tui/fullscreen.d.ts +48 -0
- package/dist/tui/fullscreen.js +256 -0
- package/dist/tui/image-display.d.ts +23 -0
- package/dist/tui/image-display.js +92 -0
- package/dist/tui/image-paste.d.ts +113 -0
- package/dist/tui/image-paste.js +565 -0
- package/dist/tui/input-history.d.ts +47 -0
- package/dist/tui/input-history.js +250 -0
- package/dist/tui/markdown-style.d.ts +5 -0
- package/dist/tui/markdown-style.js +23 -0
- package/dist/tui/model/composer-buffer.d.ts +55 -0
- package/dist/tui/model/composer-buffer.js +317 -0
- package/dist/tui/model/composer-types.d.ts +17 -0
- package/dist/tui/model/composer-types.js +1 -0
- package/dist/tui/model/display-history.d.ts +78 -0
- package/dist/tui/model/display-history.js +124 -0
- package/dist/tui/model/display-reconstruct.d.ts +3 -0
- package/dist/tui/model/display-reconstruct.js +130 -0
- package/dist/tui/model/file-mentions.d.ts +31 -0
- package/dist/tui/model/file-mentions.js +178 -0
- package/dist/tui/model/image-attachment.d.ts +15 -0
- package/dist/tui/model/image-attachment.js +1 -0
- package/dist/tui/model/image-paste.d.ts +119 -0
- package/dist/tui/model/image-paste.js +610 -0
- package/dist/tui/model/input-history.d.ts +1 -0
- package/dist/tui/model/input-history.js +1 -0
- package/dist/tui/model/input-queue.d.ts +12 -0
- package/dist/tui/model/input-queue.js +17 -0
- package/dist/tui/model/key-events.d.ts +9 -0
- package/dist/tui/model/key-events.js +8 -0
- package/dist/tui/model/paste-operation-tracker.d.ts +13 -0
- package/dist/tui/model/paste-operation-tracker.js +25 -0
- package/dist/tui/model/recent-activity.d.ts +8 -0
- package/dist/tui/model/recent-activity.js +71 -0
- package/dist/tui/model/subagent-view.d.ts +87 -0
- package/dist/tui/model/subagent-view.js +336 -0
- package/dist/tui/model/submit-dedupe.d.ts +5 -0
- package/dist/tui/model/submit-dedupe.js +25 -0
- package/dist/tui/model/sync-output.d.ts +17 -0
- package/dist/tui/model/sync-output.js +35 -0
- package/dist/tui/model/task-lifecycle.d.ts +57 -0
- package/dist/tui/model/task-lifecycle.js +124 -0
- package/dist/tui/model/terminal-env.d.ts +15 -0
- package/dist/tui/model/terminal-env.js +22 -0
- package/dist/tui/model/terminal-mouse.d.ts +28 -0
- package/dist/tui/model/terminal-mouse.js +82 -0
- package/dist/tui/model/theme-style.d.ts +10 -0
- package/dist/tui/model/theme-style.js +79 -0
- package/dist/tui/model/theme.d.ts +72 -0
- package/dist/tui/model/theme.js +121 -0
- package/dist/tui/model/trace-groups.d.ts +45 -0
- package/dist/tui/model/trace-groups.js +558 -0
- package/dist/tui/model/trace-interaction.d.ts +63 -0
- package/dist/tui/model/trace-interaction.js +87 -0
- package/dist/tui/model/width.d.ts +18 -0
- package/dist/tui/model/width.js +130 -0
- package/dist/tui/model-picker-data.d.ts +9 -0
- package/dist/tui/model-picker-data.js +39 -0
- package/dist/tui/model-switch.d.ts +49 -0
- package/dist/tui/model-switch.js +67 -0
- package/dist/tui/paste-placeholder.d.ts +11 -0
- package/dist/tui/paste-placeholder.js +52 -0
- package/dist/tui/recent-activity.d.ts +8 -0
- package/dist/tui/recent-activity.js +71 -0
- package/dist/tui/run-session-picker.d.ts +9 -0
- package/dist/tui/run-session-picker.js +64 -0
- package/dist/tui/run.d.ts +72 -0
- package/dist/tui/run.js +139 -0
- package/dist/tui/session-display.d.ts +6 -0
- package/dist/tui/session-display.js +12 -0
- package/dist/tui/session-picker-data.d.ts +18 -0
- package/dist/tui/session-picker-data.js +21 -0
- package/dist/tui/terminal/multiplexer.d.ts +5 -0
- package/dist/tui/terminal/multiplexer.js +14 -0
- package/dist/tui/testing/fake-agent.d.ts +24 -0
- package/dist/tui/testing/fake-agent.js +22 -0
- package/dist/tui/testing/spy-host.d.ts +21 -0
- package/dist/tui/testing/spy-host.js +55 -0
- package/dist/tui/trace-groups.d.ts +43 -0
- package/dist/tui/trace-groups.js +554 -0
- package/dist/tui/wordmark.d.ts +18 -0
- package/dist/tui/wordmark.js +208 -0
- package/dist/types.d.ts +503 -0
- package/dist/types.js +4 -0
- package/dist/update/index.d.ts +61 -0
- package/dist/update/index.js +267 -0
- package/dist/variant/thinking-level.d.ts +5 -0
- package/dist/variant/thinking-level.js +26 -0
- package/dist/variant/variant-resolver.d.ts +28 -0
- package/dist/variant/variant-resolver.js +62 -0
- package/node_modules/@bubblebrain-ai/pi-tui/LICENSE +21 -0
- package/node_modules/@bubblebrain-ai/pi-tui/README.md +854 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.d.ts +26 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.js +121 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.d.ts +86 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.js +649 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.d.ts +13 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.js +36 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.d.ts +22 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.js +99 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.d.ts +22 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.js +36 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.d.ts +330 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.js +2344 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.d.ts +7 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.js +43 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.d.ts +28 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.js +82 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.d.ts +48 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.js +390 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.d.ts +31 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.js +67 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.d.ts +103 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.js +797 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.d.ts +56 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.js +179 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.d.ts +53 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.js +175 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.d.ts +50 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.js +174 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.d.ts +12 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.js +22 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.d.ts +32 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.js +109 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.d.ts +19 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.js +81 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.d.ts +13 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.js +48 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.d.ts +8 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.js +26 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.d.ts +39 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.js +2 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.d.ts +16 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.js +110 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.d.ts +31 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.js +42 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.d.ts +273 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.js +231 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.d.ts +184 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.js +1174 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.d.ts +28 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.js +46 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.d.ts +10 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.js +1268 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.d.ts +40 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.js +6 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.d.ts +42 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.js +335 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.d.ts +3 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.js +60 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.d.ts +56 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.js +363 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.d.ts +10 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.js +59 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.d.ts +116 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.js +518 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.d.ts +142 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.js +544 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.d.ts +11 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.js +11 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.d.ts +141 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.js +1340 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.d.ts +39 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.js +536 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.d.ts +340 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.js +1020 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.d.ts +17 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.js +27 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.d.ts +96 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.js +1193 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.d.ts +25 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.js +96 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.d.ts +73 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.js +188 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/README.md +20 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/build.sh +62 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/src/darwin-modifiers.c +70 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/README.md +22 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/build.mjs +229 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/src/win32-console-mode.c +119 -0
- package/node_modules/@bubblebrain-ai/pi-tui/package.json +66 -0
- package/node_modules/get-east-asian-width/index.d.ts +60 -0
- package/node_modules/get-east-asian-width/index.js +30 -0
- package/node_modules/get-east-asian-width/license +9 -0
- package/node_modules/get-east-asian-width/lookup-data.js +21 -0
- package/node_modules/get-east-asian-width/lookup.js +138 -0
- package/node_modules/get-east-asian-width/package.json +71 -0
- package/node_modules/get-east-asian-width/readme.md +65 -0
- package/node_modules/get-east-asian-width/utilities.js +24 -0
- package/node_modules/marked/LICENSE +44 -0
- package/node_modules/marked/README.md +115 -0
- package/node_modules/marked/bin/main.js +284 -0
- package/node_modules/marked/bin/marked.js +16 -0
- package/node_modules/marked/lib/marked.d.ts +760 -0
- package/node_modules/marked/lib/marked.esm.js +77 -0
- package/node_modules/marked/lib/marked.esm.js.map +7 -0
- package/node_modules/marked/lib/marked.umd.js +79 -0
- package/node_modules/marked/lib/marked.umd.js.map +7 -0
- package/node_modules/marked/man/marked.1 +113 -0
- package/node_modules/marked/man/marked.1.md +93 -0
- package/node_modules/marked/package.json +103 -0
- package/package.json +96 -17
- package/bin/bubble.js +0 -39
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { GENERATED_MODEL_DATA } from "./model-data.generated.js";
|
|
2
|
+
// Official USD prices checked 2026-09-10:
|
|
3
|
+
// https://api-docs.deepseek.com/quick_start/pricing
|
|
4
|
+
// Exact transition times: https://api-docs.deepseek.com/news/news260910
|
|
5
|
+
const DEEPSEEK_PEAK_WINDOWS_UTC = [
|
|
6
|
+
{ startMinute: 60, endMinute: 240 },
|
|
7
|
+
{ startMinute: 360, endMinute: 600 },
|
|
8
|
+
];
|
|
9
|
+
const DEEPSEEK_PEAK_WEEKDAYS_UTC = [1, 2, 3, 4, 5];
|
|
10
|
+
const DEEPSEEK_V41_FLASH_TARIFF = {
|
|
11
|
+
inputCacheHitPerMillion: 0.006,
|
|
12
|
+
inputCacheMissPerMillion: 0.3,
|
|
13
|
+
outputPerMillion: 1.2,
|
|
14
|
+
peakWindowsUtc: DEEPSEEK_PEAK_WINDOWS_UTC,
|
|
15
|
+
peakWeekdaysUtc: DEEPSEEK_PEAK_WEEKDAYS_UTC,
|
|
16
|
+
offPeak: {
|
|
17
|
+
inputCacheHitPerMillion: 0.003,
|
|
18
|
+
inputCacheMissPerMillion: 0.15,
|
|
19
|
+
outputPerMillion: 0.6,
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Hand-maintained corrections layered over the generated models.dev snapshot.
|
|
24
|
+
* An entry here shadows the generated entry with the same (providerId, modelId).
|
|
25
|
+
* Only exceptions belong here — facts the upstream catalog cannot carry
|
|
26
|
+
* (promo expiry dates, non-USD billing) or gets wrong. Everything else comes
|
|
27
|
+
* from src/model-data.generated.ts via `npm run refresh-models`.
|
|
28
|
+
*/
|
|
29
|
+
export const MODEL_PRICING_OVERRIDES = [
|
|
30
|
+
...[
|
|
31
|
+
"muse-spark-1.3-contributor-free",
|
|
32
|
+
"muse-spark-1.2-contributor-free",
|
|
33
|
+
"space-bunny-free",
|
|
34
|
+
].map((modelId) => ({
|
|
35
|
+
providerId: "opencode-zen",
|
|
36
|
+
modelId,
|
|
37
|
+
currency: "USD",
|
|
38
|
+
inputCacheHitPerMillion: 0,
|
|
39
|
+
inputCacheMissPerMillion: 0,
|
|
40
|
+
outputPerMillion: 0,
|
|
41
|
+
})),
|
|
42
|
+
{
|
|
43
|
+
providerId: "opencode-zen",
|
|
44
|
+
modelId: "muse-spark-1.2",
|
|
45
|
+
currency: "USD",
|
|
46
|
+
inputCacheHitPerMillion: 0.15,
|
|
47
|
+
inputCacheMissPerMillion: 1.25,
|
|
48
|
+
outputPerMillion: 4.25,
|
|
49
|
+
},
|
|
50
|
+
// Gemini 3.7/3.8 Flash launch pricing. Google's standard paid-tier prices
|
|
51
|
+
// double on 2027-01-01; keep both rates so historical and future /stats are
|
|
52
|
+
// priced against the tariff that was actually active.
|
|
53
|
+
...["gemini-3.7-flash", "gemini-3.8-flash"].map((modelId) => ({
|
|
54
|
+
providerId: "google",
|
|
55
|
+
modelId,
|
|
56
|
+
currency: "USD",
|
|
57
|
+
inputCacheHitPerMillion: 0.075,
|
|
58
|
+
inputCacheMissPerMillion: 0.75,
|
|
59
|
+
outputPerMillion: 3.75,
|
|
60
|
+
effectiveUntil: "2027-01-01T00:00:00Z",
|
|
61
|
+
original: {
|
|
62
|
+
inputCacheHitPerMillion: 0.15,
|
|
63
|
+
inputCacheMissPerMillion: 1.5,
|
|
64
|
+
outputPerMillion: 7.5,
|
|
65
|
+
},
|
|
66
|
+
})),
|
|
67
|
+
// Gemini 4 Argon introductory pricing through 2026-11-30; standard rates from
|
|
68
|
+
// 2026-12-01. Implicit caching only (95% off input), so no cache-write rate.
|
|
69
|
+
// https://ai.google.dev/gemini-api/docs/pricing
|
|
70
|
+
{
|
|
71
|
+
providerId: "google",
|
|
72
|
+
modelId: "gemini-4-argon",
|
|
73
|
+
currency: "USD",
|
|
74
|
+
inputCacheHitPerMillion: 0.1,
|
|
75
|
+
inputCacheMissPerMillion: 2,
|
|
76
|
+
outputPerMillion: 10,
|
|
77
|
+
effectiveUntil: "2026-12-01T00:00:00Z",
|
|
78
|
+
original: {
|
|
79
|
+
inputCacheHitPerMillion: 0.2,
|
|
80
|
+
inputCacheMissPerMillion: 4,
|
|
81
|
+
outputPerMillion: 20,
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
providerId: "deepseek",
|
|
86
|
+
modelId: "deepseek-flash",
|
|
87
|
+
currency: "USD",
|
|
88
|
+
...DEEPSEEK_V41_FLASH_TARIFF,
|
|
89
|
+
effectiveFrom: "2026-09-10T04:00:00Z",
|
|
90
|
+
},
|
|
91
|
+
// Preserve older tariffs for historical /stats. Both legacy Flash IDs now
|
|
92
|
+
// serve V4.1 Flash; Pro switches on 2026-09-14 at 04:00 UTC. A transition
|
|
93
|
+
// must select the whole tariff, including its peak/off-peak schedule.
|
|
94
|
+
...[
|
|
95
|
+
{ modelId: "deepseek-v4-flash", kind: "flash" },
|
|
96
|
+
{ modelId: "deepseek-v4-flash-vision-exp", kind: "flash" },
|
|
97
|
+
{ modelId: "deepseek-v4-pro", kind: "pro" },
|
|
98
|
+
].map(({ modelId, kind }) => {
|
|
99
|
+
const peak = kind === "pro"
|
|
100
|
+
? { inputCacheHitPerMillion: 0.044, inputCacheMissPerMillion: 1.32, outputPerMillion: 3.96 }
|
|
101
|
+
: { inputCacheHitPerMillion: 0.014, inputCacheMissPerMillion: 0.44, outputPerMillion: 1.32 };
|
|
102
|
+
const offPeak = kind === "pro"
|
|
103
|
+
? { inputCacheHitPerMillion: 0.022, inputCacheMissPerMillion: 0.66, outputPerMillion: 1.98 }
|
|
104
|
+
: { inputCacheHitPerMillion: 0.007, inputCacheMissPerMillion: 0.22, outputPerMillion: 0.66 };
|
|
105
|
+
const prior = kind === "pro"
|
|
106
|
+
? { inputCacheHitPerMillion: 0.003625, inputCacheMissPerMillion: 0.435, outputPerMillion: 0.87 }
|
|
107
|
+
: { inputCacheHitPerMillion: 0.0028, inputCacheMissPerMillion: 0.14, outputPerMillion: 0.28 };
|
|
108
|
+
// The 2026-08-16 schedule was already Monday-Friday only; the earlier
|
|
109
|
+
// every-day model here was an omission, so applying the weekday rule to
|
|
110
|
+
// this tariff corrects August weekend history rather than repricing it.
|
|
111
|
+
const previous = {
|
|
112
|
+
...peak,
|
|
113
|
+
peakWindowsUtc: DEEPSEEK_PEAK_WINDOWS_UTC,
|
|
114
|
+
peakWeekdaysUtc: DEEPSEEK_PEAK_WEEKDAYS_UTC,
|
|
115
|
+
offPeak,
|
|
116
|
+
effectiveFrom: "2026-08-16T16:00:00Z",
|
|
117
|
+
// The vision model launched after the tariff change; it has no valid
|
|
118
|
+
// pre-change usage. Stable Flash/Pro retain their former rates so /stats
|
|
119
|
+
// does not reprice old sessions using today's schedule.
|
|
120
|
+
...(modelId === "deepseek-v4-flash-vision-exp" ? {} : { prior }),
|
|
121
|
+
};
|
|
122
|
+
return {
|
|
123
|
+
providerId: "deepseek",
|
|
124
|
+
modelId,
|
|
125
|
+
currency: "USD",
|
|
126
|
+
...(kind === "flash" ? {
|
|
127
|
+
...DEEPSEEK_V41_FLASH_TARIFF,
|
|
128
|
+
effectiveFrom: "2026-09-10T04:00:00Z",
|
|
129
|
+
prior: previous,
|
|
130
|
+
} : {
|
|
131
|
+
...previous,
|
|
132
|
+
effectiveUntil: "2026-09-14T04:00:00Z",
|
|
133
|
+
original: DEEPSEEK_V41_FLASH_TARIFF,
|
|
134
|
+
}),
|
|
135
|
+
};
|
|
136
|
+
}),
|
|
137
|
+
// Official current prices, verified 2026-09-23:
|
|
138
|
+
// https://platform.claude.com/docs/en/about-claude/pricing
|
|
139
|
+
// Cache reads are 2.5% (Fable 5.1) / 5% (Opus 5.5), not the older 10%.
|
|
140
|
+
{
|
|
141
|
+
providerId: "anthropic",
|
|
142
|
+
modelId: "claude-fable-5-1",
|
|
143
|
+
currency: "USD",
|
|
144
|
+
inputCacheHitPerMillion: 0.25,
|
|
145
|
+
inputCacheMissPerMillion: 10,
|
|
146
|
+
inputCacheWritePerMillion: 12.5,
|
|
147
|
+
outputPerMillion: 50,
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
providerId: "anthropic",
|
|
151
|
+
modelId: "claude-opus-5-5",
|
|
152
|
+
currency: "USD",
|
|
153
|
+
inputCacheHitPerMillion: 0.2,
|
|
154
|
+
inputCacheMissPerMillion: 4,
|
|
155
|
+
inputCacheWritePerMillion: 5,
|
|
156
|
+
outputPerMillion: 20,
|
|
157
|
+
},
|
|
158
|
+
// The current official Sonnet 5 price is $2/$10 without an expiry.
|
|
159
|
+
{
|
|
160
|
+
providerId: "anthropic",
|
|
161
|
+
modelId: "claude-sonnet-5",
|
|
162
|
+
currency: "USD",
|
|
163
|
+
inputCacheHitPerMillion: 0.2,
|
|
164
|
+
inputCacheMissPerMillion: 2,
|
|
165
|
+
inputCacheWritePerMillion: 2.5,
|
|
166
|
+
outputPerMillion: 10,
|
|
167
|
+
},
|
|
168
|
+
// The StepFun step plan bills in CNY; models.dev normalizes prices to USD.
|
|
169
|
+
{
|
|
170
|
+
providerId: "stepfun",
|
|
171
|
+
modelId: "step-3.7-flash",
|
|
172
|
+
currency: "CNY",
|
|
173
|
+
inputCacheHitPerMillion: 0.27,
|
|
174
|
+
inputCacheMissPerMillion: 1.35,
|
|
175
|
+
outputPerMillion: 8.1,
|
|
176
|
+
},
|
|
177
|
+
];
|
|
178
|
+
function pricingFromGenerated(entry) {
|
|
179
|
+
return {
|
|
180
|
+
providerId: entry.providerId,
|
|
181
|
+
modelId: entry.modelId,
|
|
182
|
+
currency: "USD",
|
|
183
|
+
// Without a cache discount upstream, cached input bills at the plain rate.
|
|
184
|
+
inputCacheHitPerMillion: entry.cacheReadPerMillion ?? entry.inputPerMillion,
|
|
185
|
+
inputCacheMissPerMillion: entry.inputPerMillion,
|
|
186
|
+
...(entry.cacheWritePerMillion !== undefined
|
|
187
|
+
? { inputCacheWritePerMillion: entry.cacheWritePerMillion }
|
|
188
|
+
: {}),
|
|
189
|
+
outputPerMillion: entry.outputPerMillion,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const overriddenKeys = new Set(MODEL_PRICING_OVERRIDES.map((item) => `${item.providerId}\0${item.modelId}`));
|
|
193
|
+
export const MODEL_PRICING = [
|
|
194
|
+
...GENERATED_MODEL_DATA
|
|
195
|
+
.filter((entry) => !overriddenKeys.has(`${entry.providerId}\0${entry.modelId}`))
|
|
196
|
+
.map(pricingFromGenerated),
|
|
197
|
+
...MODEL_PRICING_OVERRIDES,
|
|
198
|
+
];
|
|
199
|
+
export function getModelPricing(providerId, modelId) {
|
|
200
|
+
return MODEL_PRICING.find((item) => item.providerId === providerId && item.modelId === modelId);
|
|
201
|
+
}
|
|
202
|
+
function pricingRateAt(pricing, at) {
|
|
203
|
+
if (pricing.prior && pricing.effectiveFrom && at.getTime() < Date.parse(pricing.effectiveFrom)) {
|
|
204
|
+
return pricingRateAt(pricing.prior, at);
|
|
205
|
+
}
|
|
206
|
+
if (pricing.original && pricing.effectiveUntil && at.getTime() >= Date.parse(pricing.effectiveUntil)) {
|
|
207
|
+
return pricingRateAt(pricing.original, at);
|
|
208
|
+
}
|
|
209
|
+
if (!pricing.offPeak || !pricing.peakWindowsUtc?.length)
|
|
210
|
+
return pricing;
|
|
211
|
+
const minute = at.getUTCHours() * 60 + at.getUTCMinutes();
|
|
212
|
+
const isPeakDay = !pricing.peakWeekdaysUtc || pricing.peakWeekdaysUtc.includes(at.getUTCDay());
|
|
213
|
+
const isPeak = isPeakDay && pricing.peakWindowsUtc.some((window) => minute >= window.startMinute && minute < window.endMinute);
|
|
214
|
+
return isPeak ? pricing : pricing.offPeak;
|
|
215
|
+
}
|
|
216
|
+
export function calculateUsageCost(providerId, modelId, usage, at = new Date()) {
|
|
217
|
+
const pricing = getModelPricing(providerId, modelId);
|
|
218
|
+
if (!pricing)
|
|
219
|
+
return undefined;
|
|
220
|
+
const rate = pricingRateAt(pricing, at);
|
|
221
|
+
const hasCacheBreakdown = typeof usage.promptCacheHitTokens === "number"
|
|
222
|
+
|| typeof usage.promptCacheMissTokens === "number"
|
|
223
|
+
|| typeof usage.cacheCreationTokens === "number";
|
|
224
|
+
const hit = usage.promptCacheHitTokens ?? 0;
|
|
225
|
+
const miss = hasCacheBreakdown
|
|
226
|
+
? usage.promptCacheMissTokens ?? Math.max(0, usage.promptTokens - hit)
|
|
227
|
+
: usage.promptTokens;
|
|
228
|
+
// `miss` already contains the cache-write tokens (see mergeAnthropicUsage),
|
|
229
|
+
// so writes must be netted out before being re-priced — adding a write term
|
|
230
|
+
// on top of the untouched miss term would bill them at miss + write.
|
|
231
|
+
const write = rate.inputCacheWritePerMillion !== undefined
|
|
232
|
+
? Math.min(usage.cacheCreationTokens ?? 0, miss)
|
|
233
|
+
: 0;
|
|
234
|
+
const missOnly = miss - write;
|
|
235
|
+
const cost = (hit / 1_000_000) * rate.inputCacheHitPerMillion
|
|
236
|
+
+ (write / 1_000_000) * (rate.inputCacheWritePerMillion ?? rate.inputCacheMissPerMillion)
|
|
237
|
+
+ (missOnly / 1_000_000) * rate.inputCacheMissPerMillion
|
|
238
|
+
+ (usage.completionTokens / 1_000_000) * rate.outputPerMillion;
|
|
239
|
+
return {
|
|
240
|
+
currency: pricing.currency,
|
|
241
|
+
cost,
|
|
242
|
+
estimated: !hasCacheBreakdown,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { decodeModel, encodeModel } from "./provider-registry.js";
|
|
2
|
+
import { assertProviderModelAllowed } from "./provider-model-policy.js";
|
|
3
|
+
export function resolveConfiguredModel(input) {
|
|
4
|
+
const selected = input.cliModel ?? input.sessionModel ?? input.defaultModel;
|
|
5
|
+
if (!selected)
|
|
6
|
+
return "";
|
|
7
|
+
const normalized = selected.includes(":")
|
|
8
|
+
? selected
|
|
9
|
+
: input.fallbackProviderId
|
|
10
|
+
? encodeModel(input.fallbackProviderId, selected)
|
|
11
|
+
: "";
|
|
12
|
+
if (!normalized)
|
|
13
|
+
return "";
|
|
14
|
+
const { providerId, modelId } = decodeModel(normalized);
|
|
15
|
+
if (providerId)
|
|
16
|
+
assertProviderModelAllowed(providerId, modelId);
|
|
17
|
+
return normalized;
|
|
18
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type Dispatcher } from "undici";
|
|
2
|
+
export type ChatGptFetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
3
|
+
export interface ChatGptFetchOptions {
|
|
4
|
+
fetch?: ChatGptFetch;
|
|
5
|
+
env?: NodeJS.ProcessEnv;
|
|
6
|
+
}
|
|
7
|
+
type RequestInitWithDispatcher = RequestInit & {
|
|
8
|
+
dispatcher?: Dispatcher;
|
|
9
|
+
};
|
|
10
|
+
export declare function chatGptFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
|
|
11
|
+
export declare function getChatGptFetch(env?: NodeJS.ProcessEnv): ChatGptFetch;
|
|
12
|
+
export declare function createChatGptFetch(options?: ChatGptFetchOptions): ChatGptFetch;
|
|
13
|
+
export declare function createChatGptDispatcher(env?: NodeJS.ProcessEnv, input?: RequestInfo | URL): Dispatcher | undefined;
|
|
14
|
+
export declare function withChatGptNetworkOptions(input: RequestInfo | URL, init: RequestInit | undefined, env?: NodeJS.ProcessEnv, dispatcher?: Dispatcher | undefined): RequestInitWithDispatcher;
|
|
15
|
+
export declare function normalizeChatGptNetworkError(error: unknown, env?: NodeJS.ProcessEnv): Error;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { delimiter } from "node:path";
|
|
3
|
+
import { rootCertificates } from "node:tls";
|
|
4
|
+
import { Agent, ProxyAgent } from "undici";
|
|
5
|
+
import { getSystemProxyForUrl } from "./system-proxy.js";
|
|
6
|
+
let cachedDefaultFetch;
|
|
7
|
+
export function chatGptFetch(input, init) {
|
|
8
|
+
return getChatGptFetch()(input, init);
|
|
9
|
+
}
|
|
10
|
+
export function getChatGptFetch(env = process.env) {
|
|
11
|
+
const signature = networkEnvSignature(env);
|
|
12
|
+
if (!cachedDefaultFetch || cachedDefaultFetch.signature !== signature) {
|
|
13
|
+
cachedDefaultFetch = {
|
|
14
|
+
signature,
|
|
15
|
+
fetch: createChatGptFetch({ env }),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return cachedDefaultFetch.fetch;
|
|
19
|
+
}
|
|
20
|
+
export function createChatGptFetch(options = {}) {
|
|
21
|
+
const env = options.env ?? process.env;
|
|
22
|
+
const fetchImpl = options.fetch ?? ((input, init) => globalThis.fetch(input, init));
|
|
23
|
+
const dispatcher = createChatGptDispatcher(env);
|
|
24
|
+
return async (input, init) => {
|
|
25
|
+
const requestInit = withChatGptNetworkOptions(input, init, env, dispatcher);
|
|
26
|
+
try {
|
|
27
|
+
return await fetchImpl(input, requestInit);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
throw normalizeChatGptNetworkError(error, env);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function createChatGptDispatcher(env = process.env, input) {
|
|
35
|
+
const ca = loadExtraCaCertificates(env);
|
|
36
|
+
const proxy = input ? nodeProxyForUrl(input, env) : defaultNodeProxy(env);
|
|
37
|
+
if (!proxy && ca.length === 0)
|
|
38
|
+
return undefined;
|
|
39
|
+
const caOptions = ca.length > 0 ? { ca: [...rootCertificates, ...ca] } : undefined;
|
|
40
|
+
if (proxy) {
|
|
41
|
+
return new ProxyAgent({
|
|
42
|
+
uri: proxy,
|
|
43
|
+
...(caOptions ? { requestTls: caOptions, proxyTls: caOptions } : {}),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return caOptions ? new Agent({ connect: caOptions }) : undefined;
|
|
47
|
+
}
|
|
48
|
+
export function withChatGptNetworkOptions(input, init, env = process.env, dispatcher = createChatGptDispatcher(env, input)) {
|
|
49
|
+
const next = { ...(init ?? {}) };
|
|
50
|
+
if (dispatcher)
|
|
51
|
+
next.dispatcher = dispatcher;
|
|
52
|
+
return next;
|
|
53
|
+
}
|
|
54
|
+
export function normalizeChatGptNetworkError(error, env = process.env) {
|
|
55
|
+
// Already normalized — wrapping again would nest "Original error:" messages.
|
|
56
|
+
if (error instanceof Error && error.message.includes("connection failed before Bubble received a response")) {
|
|
57
|
+
return error;
|
|
58
|
+
}
|
|
59
|
+
const text = errorMessageChain(error).join("\n");
|
|
60
|
+
if (!isChatGptNetworkErrorText(text)) {
|
|
61
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
62
|
+
}
|
|
63
|
+
const systemProxy = hasProxyEnv(env) ? undefined : getSystemProxyForUrl(new URL("https://chatgpt.com/"), env);
|
|
64
|
+
const message = [
|
|
65
|
+
"ChatGPT connection failed before Bubble received a response.",
|
|
66
|
+
isCertificateErrorText(text)
|
|
67
|
+
? "TLS certificate verification failed. If you are on a corporate proxy, VPN, or HTTPS inspection network, start Bubble with NODE_EXTRA_CA_CERTS=/absolute/path/to/ca.pem or BUBBLE_EXTRA_CA_CERTS=/absolute/path/to/ca.pem."
|
|
68
|
+
: "This looks like a proxy or network transport failure.",
|
|
69
|
+
hasProxyEnv(env)
|
|
70
|
+
? "Bubble is using proxy environment variables for ChatGPT requests. Make sure NO_PROXY includes localhost,127.0.0.1."
|
|
71
|
+
: systemProxy
|
|
72
|
+
? `Bubble is routing this request through the OS system proxy at ${systemProxy} (detected automatically). Check that the proxy app is running and healthy, or set BUBBLE_SYSTEM_PROXY=0 to disable system proxy detection.`
|
|
73
|
+
: "If your network requires a proxy, set HTTPS_PROXY or HTTP_PROXY, and set NO_PROXY=localhost,127.0.0.1.",
|
|
74
|
+
"Do not disable TLS verification with NODE_TLS_REJECT_UNAUTHORIZED=0.",
|
|
75
|
+
`Original error: ${firstMeaningfulErrorMessage(error) || "unknown network error"}`,
|
|
76
|
+
].join(" ");
|
|
77
|
+
return new Error(message, { cause: error });
|
|
78
|
+
}
|
|
79
|
+
function hasProxyEnv(env) {
|
|
80
|
+
return Boolean(env.BUBBLE_CHATGPT_PROXY || env.bubble_chatgpt_proxy
|
|
81
|
+
|| env.HTTPS_PROXY || env.https_proxy || env.HTTP_PROXY || env.http_proxy || env.ALL_PROXY || env.all_proxy);
|
|
82
|
+
}
|
|
83
|
+
function chatGptProxyOverride(env) {
|
|
84
|
+
return env.BUBBLE_CHATGPT_PROXY ?? env.bubble_chatgpt_proxy;
|
|
85
|
+
}
|
|
86
|
+
function nodeProxyForUrl(input, env) {
|
|
87
|
+
const url = urlFromInput(input);
|
|
88
|
+
if (!url || shouldBypassProxy(url, env))
|
|
89
|
+
return undefined;
|
|
90
|
+
const override = chatGptProxyOverride(env);
|
|
91
|
+
if (override)
|
|
92
|
+
return override;
|
|
93
|
+
if (url.protocol === "https:")
|
|
94
|
+
return env.HTTPS_PROXY ?? env.https_proxy ?? env.ALL_PROXY ?? env.all_proxy ?? getSystemProxyForUrl(url, env);
|
|
95
|
+
if (url.protocol === "http:")
|
|
96
|
+
return env.HTTP_PROXY ?? env.http_proxy ?? env.ALL_PROXY ?? env.all_proxy ?? getSystemProxyForUrl(url, env);
|
|
97
|
+
return defaultNodeProxy(env);
|
|
98
|
+
}
|
|
99
|
+
function defaultNodeProxy(env) {
|
|
100
|
+
return chatGptProxyOverride(env)
|
|
101
|
+
?? env.HTTPS_PROXY ?? env.https_proxy ?? env.HTTP_PROXY ?? env.http_proxy ?? env.ALL_PROXY ?? env.all_proxy
|
|
102
|
+
?? getSystemProxyForUrl(new URL("https://system-proxy-default.invalid/"), env);
|
|
103
|
+
}
|
|
104
|
+
function urlFromInput(input) {
|
|
105
|
+
if (input instanceof URL)
|
|
106
|
+
return input;
|
|
107
|
+
if (typeof input === "string")
|
|
108
|
+
return URL.canParse(input) ? new URL(input) : undefined;
|
|
109
|
+
const url = input.url;
|
|
110
|
+
return URL.canParse(url) ? new URL(url) : undefined;
|
|
111
|
+
}
|
|
112
|
+
function shouldBypassProxy(url, env) {
|
|
113
|
+
const noProxy = (env.NO_PROXY ?? env.no_proxy ?? "").trim();
|
|
114
|
+
if (!noProxy)
|
|
115
|
+
return false;
|
|
116
|
+
if (noProxy === "*")
|
|
117
|
+
return true;
|
|
118
|
+
const hostname = url.hostname.toLowerCase();
|
|
119
|
+
const port = url.port;
|
|
120
|
+
return noProxy
|
|
121
|
+
.split(/[,\s]+/)
|
|
122
|
+
.filter(Boolean)
|
|
123
|
+
.some((entry) => noProxyEntryMatches(entry.toLowerCase(), hostname, port));
|
|
124
|
+
}
|
|
125
|
+
function noProxyEntryMatches(entry, hostname, port) {
|
|
126
|
+
const [entryHost, entryPort] = entry.includes(":") ? entry.split(":") : [entry, ""];
|
|
127
|
+
if (entryPort && entryPort !== port)
|
|
128
|
+
return false;
|
|
129
|
+
if (entryHost === hostname)
|
|
130
|
+
return true;
|
|
131
|
+
if (entryHost.startsWith("*."))
|
|
132
|
+
return hostname.endsWith(entryHost.slice(1));
|
|
133
|
+
if (entryHost.startsWith("."))
|
|
134
|
+
return hostname.endsWith(entryHost);
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
function loadExtraCaCertificates(env) {
|
|
138
|
+
const paths = extraCaCertificatePaths(env);
|
|
139
|
+
return paths.map((path) => {
|
|
140
|
+
try {
|
|
141
|
+
return readFileSync(path, "utf-8");
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
throw new Error(`Failed to read ChatGPT custom CA certificate at ${path}. Check NODE_EXTRA_CA_CERTS or BUBBLE_EXTRA_CA_CERTS.`, {
|
|
145
|
+
cause: error,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
function extraCaCertificatePaths(env) {
|
|
151
|
+
const bubbleValue = env.BUBBLE_EXTRA_CA_CERTS?.trim();
|
|
152
|
+
if (bubbleValue) {
|
|
153
|
+
return bubbleValue.split(delimiter).map((item) => item.trim()).filter(Boolean);
|
|
154
|
+
}
|
|
155
|
+
const nodeValue = env.NODE_EXTRA_CA_CERTS?.trim();
|
|
156
|
+
return nodeValue ? [nodeValue] : [];
|
|
157
|
+
}
|
|
158
|
+
function networkEnvSignature(env) {
|
|
159
|
+
return [
|
|
160
|
+
env.BUBBLE_CHATGPT_PROXY,
|
|
161
|
+
env.bubble_chatgpt_proxy,
|
|
162
|
+
env.HTTP_PROXY,
|
|
163
|
+
env.http_proxy,
|
|
164
|
+
env.HTTPS_PROXY,
|
|
165
|
+
env.https_proxy,
|
|
166
|
+
env.ALL_PROXY,
|
|
167
|
+
env.all_proxy,
|
|
168
|
+
env.NO_PROXY,
|
|
169
|
+
env.no_proxy,
|
|
170
|
+
env.NODE_EXTRA_CA_CERTS,
|
|
171
|
+
env.BUBBLE_EXTRA_CA_CERTS,
|
|
172
|
+
// Invalidate the cached fetch when the user toggles the OS proxy
|
|
173
|
+
// (e.g. turning Clash system proxy on/off mid-session).
|
|
174
|
+
getSystemProxyForUrl(new URL("https://chatgpt.com/"), env),
|
|
175
|
+
].join("\0");
|
|
176
|
+
}
|
|
177
|
+
function isChatGptNetworkErrorText(text) {
|
|
178
|
+
return [
|
|
179
|
+
/fetch failed/i,
|
|
180
|
+
/network.*failed/i,
|
|
181
|
+
/socket connection was closed unexpectedly/i,
|
|
182
|
+
/\bConnectionClosed\b/i,
|
|
183
|
+
/\bECONNRESET\b/i,
|
|
184
|
+
/\bECONNREFUSED\b/i,
|
|
185
|
+
/\bETIMEDOUT\b/i,
|
|
186
|
+
/\bEPIPE\b/i,
|
|
187
|
+
/\bUND_ERR_/i,
|
|
188
|
+
/socket hang up/i,
|
|
189
|
+
/Unable to connect\. Is the computer able to access the url\?/i,
|
|
190
|
+
/certificate/i,
|
|
191
|
+
/unable to verify/i,
|
|
192
|
+
/self[- ]signed/i,
|
|
193
|
+
].some((pattern) => pattern.test(text));
|
|
194
|
+
}
|
|
195
|
+
function isCertificateErrorText(text) {
|
|
196
|
+
return [
|
|
197
|
+
/unknown certificate verification error/i,
|
|
198
|
+
/certificate (?:verify|verification) (?:failed|error)/i,
|
|
199
|
+
/unable to verify (?:the )?(?:first )?certificate/i,
|
|
200
|
+
/UNABLE_TO_(?:VERIFY_LEAF_SIGNATURE|GET_ISSUER_CERT_LOCALLY)/i,
|
|
201
|
+
/SELF_SIGNED_CERT_IN_CHAIN/i,
|
|
202
|
+
/DEPTH_ZERO_SELF_SIGNED_CERT/i,
|
|
203
|
+
/CERT_(?:HAS_EXPIRED|UNTRUSTED|INVALID)/i,
|
|
204
|
+
/self[- ]signed certificate/i,
|
|
205
|
+
].some((pattern) => pattern.test(text));
|
|
206
|
+
}
|
|
207
|
+
function firstMeaningfulErrorMessage(error) {
|
|
208
|
+
return errorMessageChain(error).find((item) => item && item !== "Error");
|
|
209
|
+
}
|
|
210
|
+
function errorMessageChain(error) {
|
|
211
|
+
const messages = [];
|
|
212
|
+
let current = error;
|
|
213
|
+
for (let depth = 0; current && depth < 8; depth++) {
|
|
214
|
+
if (current instanceof Error) {
|
|
215
|
+
messages.push(current.name, current.message);
|
|
216
|
+
current = current.cause;
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (typeof current === "object") {
|
|
220
|
+
const record = current;
|
|
221
|
+
for (const key of ["name", "code", "message"]) {
|
|
222
|
+
if (typeof record[key] === "string")
|
|
223
|
+
messages.push(record[key]);
|
|
224
|
+
}
|
|
225
|
+
current = record.cause;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
messages.push(String(current));
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
return messages;
|
|
232
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed transport errors shared between providers and the subagent runtime.
|
|
3
|
+
*
|
|
4
|
+
* `RateLimitError` is the contract for 429 handling (design doc
|
|
5
|
+
* docs/subagent-runtime-design.md §4.5): under `rateLimitPolicy: "defer"` the
|
|
6
|
+
* transport performs no 429 backoff of its own and throws this error
|
|
7
|
+
* immediately so the subagent scheduler can be the single backoff layer.
|
|
8
|
+
*/
|
|
9
|
+
export declare class RateLimitError extends Error {
|
|
10
|
+
readonly isRateLimitError = true;
|
|
11
|
+
readonly status: number;
|
|
12
|
+
readonly retryAfterMs?: number;
|
|
13
|
+
constructor(message: string, options?: {
|
|
14
|
+
status?: number;
|
|
15
|
+
retryAfterMs?: number;
|
|
16
|
+
cause?: unknown;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export declare function isRateLimitError(error: unknown): error is RateLimitError;
|
|
20
|
+
/**
|
|
21
|
+
* A provider accepted the HTTP request but terminated generation with an
|
|
22
|
+
* in-band protocol error (for example OpenRouter's HTTP-200 SSE error chunk).
|
|
23
|
+
* Keeping the wire status/type structured prevents the agent from mistaking
|
|
24
|
+
* the terminal event for a successful empty response.
|
|
25
|
+
*/
|
|
26
|
+
export declare class ProviderResponseError extends Error {
|
|
27
|
+
readonly isProviderResponseError = true;
|
|
28
|
+
readonly status?: number;
|
|
29
|
+
readonly errorType?: string;
|
|
30
|
+
readonly retryAfterMs?: number;
|
|
31
|
+
constructor(message: string, options?: {
|
|
32
|
+
status?: number;
|
|
33
|
+
errorType?: string;
|
|
34
|
+
retryAfterMs?: number;
|
|
35
|
+
cause?: unknown;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
export declare function isProviderResponseError(error: unknown): error is ProviderResponseError;
|
|
39
|
+
/**
|
|
40
|
+
* How a provider transport should treat HTTP 429 responses.
|
|
41
|
+
*
|
|
42
|
+
* - "handle": retry inside the transport with backoff (parent traffic default).
|
|
43
|
+
* - "defer": do not retry 429 at all; throw RateLimitError immediately so the
|
|
44
|
+
* caller (subagent scheduler) owns the backoff. Other retryable
|
|
45
|
+
* statuses are unaffected.
|
|
46
|
+
*/
|
|
47
|
+
export type RateLimitPolicy = "handle" | "defer";
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed transport errors shared between providers and the subagent runtime.
|
|
3
|
+
*
|
|
4
|
+
* `RateLimitError` is the contract for 429 handling (design doc
|
|
5
|
+
* docs/subagent-runtime-design.md §4.5): under `rateLimitPolicy: "defer"` the
|
|
6
|
+
* transport performs no 429 backoff of its own and throws this error
|
|
7
|
+
* immediately so the subagent scheduler can be the single backoff layer.
|
|
8
|
+
*/
|
|
9
|
+
export class RateLimitError extends Error {
|
|
10
|
+
isRateLimitError = true;
|
|
11
|
+
status;
|
|
12
|
+
retryAfterMs;
|
|
13
|
+
constructor(message, options) {
|
|
14
|
+
super(message, options?.cause !== undefined ? { cause: options.cause } : undefined);
|
|
15
|
+
this.name = "RateLimitError";
|
|
16
|
+
this.status = options?.status ?? 429;
|
|
17
|
+
this.retryAfterMs = options?.retryAfterMs;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function isRateLimitError(error) {
|
|
21
|
+
return !!error
|
|
22
|
+
&& typeof error === "object"
|
|
23
|
+
&& error.isRateLimitError === true;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A provider accepted the HTTP request but terminated generation with an
|
|
27
|
+
* in-band protocol error (for example OpenRouter's HTTP-200 SSE error chunk).
|
|
28
|
+
* Keeping the wire status/type structured prevents the agent from mistaking
|
|
29
|
+
* the terminal event for a successful empty response.
|
|
30
|
+
*/
|
|
31
|
+
export class ProviderResponseError extends Error {
|
|
32
|
+
isProviderResponseError = true;
|
|
33
|
+
status;
|
|
34
|
+
errorType;
|
|
35
|
+
retryAfterMs;
|
|
36
|
+
constructor(message, options = {}) {
|
|
37
|
+
super(message, options.cause !== undefined ? { cause: options.cause } : undefined);
|
|
38
|
+
this.name = "ProviderResponseError";
|
|
39
|
+
this.status = options.status;
|
|
40
|
+
this.errorType = options.errorType;
|
|
41
|
+
this.retryAfterMs = options.retryAfterMs;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function isProviderResponseError(error) {
|
|
45
|
+
return !!error
|
|
46
|
+
&& typeof error === "object"
|
|
47
|
+
&& error.isProviderResponseError === true;
|
|
48
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ProviderErrorContext } from "../provider-error-record.js";
|
|
2
|
+
export interface ProviderTransportFailureContext extends ProviderErrorContext {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
requestId: string;
|
|
5
|
+
attempt: number;
|
|
6
|
+
responseStatus?: number;
|
|
7
|
+
receivedEvents: number;
|
|
8
|
+
elapsedMs: number;
|
|
9
|
+
lastEventAgeMs?: number;
|
|
10
|
+
decision: "retry" | "delegate_retry" | "fail" | "cancelled";
|
|
11
|
+
}
|
|
12
|
+
export declare function logProviderTransportFailure(error: unknown, context: ProviderTransportFailureContext): void;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, renameSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { getBubbleHome } from "../bubble-home.js";
|
|
4
|
+
import { createSanitizedProviderError } from "../provider-error-record.js";
|
|
5
|
+
// Failure-only diagnostics are enabled without BUBBLE_TRACE. Keep at most two
|
|
6
|
+
// 2 MiB files; never persist request/response bodies, headers, or raw errors.
|
|
7
|
+
export function logProviderTransportFailure(error, context) {
|
|
8
|
+
try {
|
|
9
|
+
const dir = join(getBubbleHome(), "logs");
|
|
10
|
+
mkdirSync(dir, { recursive: true });
|
|
11
|
+
const file = join(dir, "provider-transport.jsonl");
|
|
12
|
+
if (existsSync(file) && statSync(file).size >= 2 * 1024 * 1024) {
|
|
13
|
+
renameSync(file, `${file}.1`);
|
|
14
|
+
}
|
|
15
|
+
appendFileSync(file, JSON.stringify({
|
|
16
|
+
timestamp: new Date().toISOString(),
|
|
17
|
+
phase: "provider_transport_failure",
|
|
18
|
+
sessionId: context.sessionId,
|
|
19
|
+
requestId: context.requestId,
|
|
20
|
+
attempt: context.attempt,
|
|
21
|
+
responseStatus: context.responseStatus,
|
|
22
|
+
receivedEvents: context.receivedEvents,
|
|
23
|
+
elapsedMs: context.elapsedMs,
|
|
24
|
+
lastEventAgeMs: context.lastEventAgeMs,
|
|
25
|
+
decision: context.decision,
|
|
26
|
+
error: createSanitizedProviderError(error, context),
|
|
27
|
+
}) + "\n", { encoding: "utf8", mode: 0o600 });
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Disk errors and concurrent rotation must never affect the request.
|
|
31
|
+
}
|
|
32
|
+
}
|