@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,11 @@
|
|
|
1
|
+
/** Claude thinking bound to both the model and the exact preceding conversation.
|
|
2
|
+
* https://platform.claude.com/docs/en/build-with-claude/preserved-thinking
|
|
3
|
+
*/
|
|
4
|
+
export function isClaudeWithBoundThinking(model) {
|
|
5
|
+
const match = model?.match(/(?:^|:)claude-(opus|fable)-(\d+)(?:-(\d{1,2})(?=-|\[|$))?/i);
|
|
6
|
+
if (!match)
|
|
7
|
+
return false;
|
|
8
|
+
const major = Number(match[2]);
|
|
9
|
+
const minor = Number(match[3] ?? 0);
|
|
10
|
+
return major > 5 || (major === 5 && minor >= (match[1].toLowerCase() === "opus" ? 5 : 1));
|
|
11
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { PermissionCheckResult, PermissionQuery, PermissionRuleSet } from "../permissions/types.js";
|
|
2
|
+
import type { PermissionMode } from "../types.js";
|
|
3
|
+
import type { ExternalHookController } from "../hooks/controller.js";
|
|
4
|
+
import { type BashAllowlist } from "./session-cache.js";
|
|
5
|
+
import type { ApprovalController, ApprovalDecision, ApprovalRequest } from "./types.js";
|
|
6
|
+
export interface ApprovalControllerOptions {
|
|
7
|
+
/** Reads the live agent mode on each request so mode flips take effect immediately. */
|
|
8
|
+
getMode: () => PermissionMode;
|
|
9
|
+
/**
|
|
10
|
+
* UI handler attached by the TUI on mount. Returns the user's decision from
|
|
11
|
+
* an interactive dialog. When not attached (e.g. --print mode), the
|
|
12
|
+
* controller falls back to rejecting in safe modes.
|
|
13
|
+
*/
|
|
14
|
+
handlerRef: {
|
|
15
|
+
current?: (req: ApprovalRequest) => Promise<ApprovalDecision>;
|
|
16
|
+
};
|
|
17
|
+
/** Session-scoped bash command prefix allowlist. Optional. */
|
|
18
|
+
bashAllowlist?: BashAllowlist;
|
|
19
|
+
/**
|
|
20
|
+
* Session-scoped grants for non-bash requests (MCP tools), keyed by
|
|
21
|
+
* sessionGrantKey. Optional; without it hosts cannot offer "this session".
|
|
22
|
+
*/
|
|
23
|
+
sessionGrants?: Set<string>;
|
|
24
|
+
/** Working directory — used to anchor relative path rules. */
|
|
25
|
+
cwd: string;
|
|
26
|
+
/**
|
|
27
|
+
* Live view of configured allow/deny rules (from ~/.bubble/settings.json and
|
|
28
|
+
* project-level equivalents). Called on each request so edits via
|
|
29
|
+
* /permissions take effect immediately. Omit to disable rule-based gating.
|
|
30
|
+
*/
|
|
31
|
+
getRuleSet?: () => PermissionRuleSet;
|
|
32
|
+
/** External lifecycle hooks may observe or reject pending permission requests. */
|
|
33
|
+
externalHooks?: ExternalHookController;
|
|
34
|
+
sessionId?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Default ApprovalController. Decision tree:
|
|
38
|
+
*
|
|
39
|
+
* deny rule match → reject (applies even under bypassPermissions)
|
|
40
|
+
* bypassPermissions → auto-approve, no prompt
|
|
41
|
+
* default + edit|write → auto-approve (workspace paths only; a
|
|
42
|
+
* path outside the workspace, or a protected
|
|
43
|
+
* one — .git, agent permission settings —
|
|
44
|
+
* falls through to the interactive prompt)
|
|
45
|
+
* plan → reject with instructions to use exit_plan_mode
|
|
46
|
+
* allow rule match → auto-approve (never for protected paths)
|
|
47
|
+
* session grant (bash prefix,
|
|
48
|
+
* MCP tool) → auto-approve
|
|
49
|
+
* bash / other → delegate to UI; if no UI, reject
|
|
50
|
+
*
|
|
51
|
+
* Deny rules sit at the top as a hard ceiling: bypassPermissions is a trust
|
|
52
|
+
* escalation, not a policy override. Users who want to permit a currently-
|
|
53
|
+
* denied action must edit their settings.json, not bypass checks at runtime.
|
|
54
|
+
*/
|
|
55
|
+
export declare class PermissionAwareApprovalController implements ApprovalController {
|
|
56
|
+
private readonly options;
|
|
57
|
+
constructor(options: ApprovalControllerOptions);
|
|
58
|
+
checkRules(query: PermissionQuery): PermissionCheckResult;
|
|
59
|
+
request(original: ApprovalRequest): Promise<ApprovalDecision>;
|
|
60
|
+
/**
|
|
61
|
+
* Facts the host needs to render the prompt correctly: whether a path is
|
|
62
|
+
* protected (never auto-approve it host-side either) and what scope a
|
|
63
|
+
* "this session" approval would cover.
|
|
64
|
+
*/
|
|
65
|
+
private annotate;
|
|
66
|
+
private rememberForSession;
|
|
67
|
+
private requestToQuery;
|
|
68
|
+
private checkRequestRules;
|
|
69
|
+
private runPermissionRequestHook;
|
|
70
|
+
private runPermissionResultHook;
|
|
71
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { checkPermission } from "../permissions/rule.js";
|
|
2
|
+
import { truncateHookText } from "../hooks/index.js";
|
|
3
|
+
import { bashSessionGrant } from "./session-cache.js";
|
|
4
|
+
import { isProtectedWorkspacePath } from "./protected-paths.js";
|
|
5
|
+
/**
|
|
6
|
+
* Default ApprovalController. Decision tree:
|
|
7
|
+
*
|
|
8
|
+
* deny rule match → reject (applies even under bypassPermissions)
|
|
9
|
+
* bypassPermissions → auto-approve, no prompt
|
|
10
|
+
* default + edit|write → auto-approve (workspace paths only; a
|
|
11
|
+
* path outside the workspace, or a protected
|
|
12
|
+
* one — .git, agent permission settings —
|
|
13
|
+
* falls through to the interactive prompt)
|
|
14
|
+
* plan → reject with instructions to use exit_plan_mode
|
|
15
|
+
* allow rule match → auto-approve (never for protected paths)
|
|
16
|
+
* session grant (bash prefix,
|
|
17
|
+
* MCP tool) → auto-approve
|
|
18
|
+
* bash / other → delegate to UI; if no UI, reject
|
|
19
|
+
*
|
|
20
|
+
* Deny rules sit at the top as a hard ceiling: bypassPermissions is a trust
|
|
21
|
+
* escalation, not a policy override. Users who want to permit a currently-
|
|
22
|
+
* denied action must edit their settings.json, not bypass checks at runtime.
|
|
23
|
+
*/
|
|
24
|
+
export class PermissionAwareApprovalController {
|
|
25
|
+
options;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.options = options;
|
|
28
|
+
}
|
|
29
|
+
checkRules(query) {
|
|
30
|
+
const ruleSet = this.options.getRuleSet?.();
|
|
31
|
+
if (!ruleSet)
|
|
32
|
+
return { decision: "ask" };
|
|
33
|
+
return checkPermission(ruleSet, query);
|
|
34
|
+
}
|
|
35
|
+
async request(original) {
|
|
36
|
+
const req = this.annotate(original);
|
|
37
|
+
const ruleResult = this.checkRequestRules(req);
|
|
38
|
+
const finalize = async (decision) => {
|
|
39
|
+
await this.runPermissionResultHook(req, decision);
|
|
40
|
+
return decision;
|
|
41
|
+
};
|
|
42
|
+
if (ruleResult.decision === "deny") {
|
|
43
|
+
return finalize({
|
|
44
|
+
action: "reject",
|
|
45
|
+
feedback: `Blocked by deny rule: ${ruleResult.rule?.source ?? "<unknown>"}`,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const mode = this.options.getMode();
|
|
49
|
+
const hookDecision = await this.runPermissionRequestHook(req, mode, ruleResult.decision);
|
|
50
|
+
if (hookDecision.action === "reject") {
|
|
51
|
+
return finalize(hookDecision);
|
|
52
|
+
}
|
|
53
|
+
if (mode === "bypassPermissions") {
|
|
54
|
+
return finalize({ action: "approve" });
|
|
55
|
+
}
|
|
56
|
+
const outsideWorkspace = (req.type === "edit" || req.type === "write") && req.outsideWorkspace === true;
|
|
57
|
+
const protectedPath = (req.type === "edit" || req.type === "write" || req.type === "patch") && req.protectedPath === true;
|
|
58
|
+
if (mode === "default" && !outsideWorkspace && !protectedPath
|
|
59
|
+
&& (req.type === "edit" || req.type === "write" || req.type === "patch")) {
|
|
60
|
+
return finalize({ action: "approve" });
|
|
61
|
+
}
|
|
62
|
+
// Project profile trust is a user decision, not a destructive action:
|
|
63
|
+
// spawn_agent is legal in plan mode, so the gate prompts there too.
|
|
64
|
+
if (mode === "plan" && req.type !== "agent_profile") {
|
|
65
|
+
return finalize({
|
|
66
|
+
action: "reject",
|
|
67
|
+
feedback: "Plan mode is active. Do not call destructive tools directly — propose your changes via exit_plan_mode and wait for user approval.",
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// A broad allow rule (`Edit`, `Write(**)`) must not silently cover a
|
|
71
|
+
// protected path; the user confirms those one at a time.
|
|
72
|
+
if (ruleResult.decision === "allow" && !protectedPath) {
|
|
73
|
+
return finalize({ action: "approve" });
|
|
74
|
+
}
|
|
75
|
+
// Session-scoped allowlist: previously-approved bash prefixes skip the prompt.
|
|
76
|
+
if (req.type === "bash" && this.options.bashAllowlist?.matches(req.command)) {
|
|
77
|
+
return finalize({ action: "approve" });
|
|
78
|
+
}
|
|
79
|
+
const grantKey = sessionGrantKey(req);
|
|
80
|
+
if (grantKey && this.options.sessionGrants?.has(grantKey)) {
|
|
81
|
+
return finalize({ action: "approve" });
|
|
82
|
+
}
|
|
83
|
+
const handler = this.options.handlerRef.current;
|
|
84
|
+
if (!handler) {
|
|
85
|
+
return finalize({
|
|
86
|
+
action: "reject",
|
|
87
|
+
feedback: "No interactive UI is available to approve this tool call.",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
const decision = await handler(req);
|
|
91
|
+
if (decision.action === "approve" && decision.remember === "session") {
|
|
92
|
+
this.rememberForSession(req);
|
|
93
|
+
}
|
|
94
|
+
return finalize(decision);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Facts the host needs to render the prompt correctly: whether a path is
|
|
98
|
+
* protected (never auto-approve it host-side either) and what scope a
|
|
99
|
+
* "this session" approval would cover.
|
|
100
|
+
*/
|
|
101
|
+
annotate(req) {
|
|
102
|
+
const cwd = this.options.cwd;
|
|
103
|
+
switch (req.type) {
|
|
104
|
+
case "edit":
|
|
105
|
+
case "write":
|
|
106
|
+
return isProtectedWorkspacePath(cwd, req.path) ? { ...req, protectedPath: true } : req;
|
|
107
|
+
case "patch": {
|
|
108
|
+
const paths = [...req.paths, ...req.files.map((file) => file.path)];
|
|
109
|
+
return paths.some((path) => isProtectedWorkspacePath(cwd, path)) ? { ...req, protectedPath: true } : req;
|
|
110
|
+
}
|
|
111
|
+
case "bash": {
|
|
112
|
+
const grant = this.options.bashAllowlist ? bashSessionGrant(req.command) : undefined;
|
|
113
|
+
return grant ? { ...req, sessionGrant: grant } : req;
|
|
114
|
+
}
|
|
115
|
+
case "external_tool":
|
|
116
|
+
return req.kind === "mcp" && this.options.sessionGrants && req.title.trim()
|
|
117
|
+
? { ...req, sessionGrant: req.title.trim() }
|
|
118
|
+
: req;
|
|
119
|
+
default:
|
|
120
|
+
return req;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
rememberForSession(req) {
|
|
124
|
+
if (req.type === "bash") {
|
|
125
|
+
if (req.sessionGrant)
|
|
126
|
+
this.options.bashAllowlist?.add(req.sessionGrant);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const key = sessionGrantKey(req);
|
|
130
|
+
if (key)
|
|
131
|
+
this.options.sessionGrants?.add(key);
|
|
132
|
+
}
|
|
133
|
+
requestToQuery(req) {
|
|
134
|
+
switch (req.type) {
|
|
135
|
+
case "bash":
|
|
136
|
+
return { tool: "Bash", command: req.command };
|
|
137
|
+
case "write":
|
|
138
|
+
return { tool: "Write", path: req.path, cwd: this.options.cwd };
|
|
139
|
+
case "edit":
|
|
140
|
+
return { tool: "Edit", path: req.path, cwd: this.options.cwd };
|
|
141
|
+
case "patch":
|
|
142
|
+
return { tool: "Edit", path: req.path, cwd: this.options.cwd };
|
|
143
|
+
case "lsp":
|
|
144
|
+
return { tool: "Lsp", path: req.path, cwd: this.options.cwd };
|
|
145
|
+
case "agent_profile":
|
|
146
|
+
return { tool: "AgentProfile" };
|
|
147
|
+
case "external_tool": {
|
|
148
|
+
const command = externalCommand(req.rawInput);
|
|
149
|
+
if (req.kind === "execute" && command !== undefined) {
|
|
150
|
+
return { tool: "Bash", command };
|
|
151
|
+
}
|
|
152
|
+
const path = req.locations?.[0]?.path;
|
|
153
|
+
if ((req.kind === "edit" || req.kind === "delete" || req.kind === "move") && path) {
|
|
154
|
+
return { tool: "Edit", path, cwd: this.options.cwd };
|
|
155
|
+
}
|
|
156
|
+
return { tool: req.title.trim() || req.kind.trim() || "ExternalTool" };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
checkRequestRules(req) {
|
|
161
|
+
if (req.type !== "patch")
|
|
162
|
+
return this.checkRules(this.requestToQuery(req));
|
|
163
|
+
const perFile = req.files.map((file) => this.checkRules({
|
|
164
|
+
tool: file.kind === "add" ? "Write" : "Edit",
|
|
165
|
+
path: file.path,
|
|
166
|
+
cwd: this.options.cwd,
|
|
167
|
+
}));
|
|
168
|
+
const denied = perFile.find((result) => result.decision === "deny");
|
|
169
|
+
if (denied)
|
|
170
|
+
return denied;
|
|
171
|
+
if (perFile.length > 0 && perFile.every((result) => result.decision === "allow")) {
|
|
172
|
+
return { decision: "allow", rule: perFile[0].rule };
|
|
173
|
+
}
|
|
174
|
+
return { decision: "ask" };
|
|
175
|
+
}
|
|
176
|
+
async runPermissionRequestHook(req, mode, ruleDecision) {
|
|
177
|
+
const hooks = this.options.externalHooks;
|
|
178
|
+
if (!hooks)
|
|
179
|
+
return { action: "approve" };
|
|
180
|
+
try {
|
|
181
|
+
const result = await hooks.runEvent({
|
|
182
|
+
eventName: "PermissionRequest",
|
|
183
|
+
cwd: this.options.cwd,
|
|
184
|
+
sessionId: this.options.sessionId,
|
|
185
|
+
agentRole: "driver",
|
|
186
|
+
target: approvalTarget(req),
|
|
187
|
+
payload: {
|
|
188
|
+
request: summarizeApprovalRequest(req),
|
|
189
|
+
mode,
|
|
190
|
+
ruleDecision,
|
|
191
|
+
},
|
|
192
|
+
fullPayload: { permissionRequest: req },
|
|
193
|
+
});
|
|
194
|
+
if (result.decision === "deny") {
|
|
195
|
+
return {
|
|
196
|
+
action: "reject",
|
|
197
|
+
feedback: result.reason ?? `Blocked by hook ${result.sourceHookId ?? "<unknown>"}.`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// Hook failures are handled by the hook controller policy and must not
|
|
203
|
+
// crash approval handling.
|
|
204
|
+
}
|
|
205
|
+
return { action: "approve" };
|
|
206
|
+
}
|
|
207
|
+
async runPermissionResultHook(req, decision) {
|
|
208
|
+
const hooks = this.options.externalHooks;
|
|
209
|
+
if (!hooks)
|
|
210
|
+
return;
|
|
211
|
+
try {
|
|
212
|
+
await hooks.runEvent({
|
|
213
|
+
eventName: "PermissionResult",
|
|
214
|
+
cwd: this.options.cwd,
|
|
215
|
+
sessionId: this.options.sessionId,
|
|
216
|
+
agentRole: "driver",
|
|
217
|
+
target: approvalTarget(req),
|
|
218
|
+
payload: {
|
|
219
|
+
request: summarizeApprovalRequest(req),
|
|
220
|
+
decision: decision.action,
|
|
221
|
+
feedback: decision.feedback ? truncateHookText(decision.feedback, 500) : undefined,
|
|
222
|
+
},
|
|
223
|
+
fullPayload: {
|
|
224
|
+
permissionRequest: req,
|
|
225
|
+
permissionDecision: decision,
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
// Observe-only.
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function approvalTarget(req) {
|
|
235
|
+
switch (req.type) {
|
|
236
|
+
case "bash":
|
|
237
|
+
return "Bash";
|
|
238
|
+
case "write":
|
|
239
|
+
return "Write";
|
|
240
|
+
case "edit":
|
|
241
|
+
case "patch":
|
|
242
|
+
return "Edit";
|
|
243
|
+
case "lsp":
|
|
244
|
+
return "Lsp";
|
|
245
|
+
case "agent_profile":
|
|
246
|
+
return "AgentProfile";
|
|
247
|
+
case "external_tool":
|
|
248
|
+
return req.title.trim() || req.kind.trim() || "ExternalTool";
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function summarizeApprovalRequest(req) {
|
|
252
|
+
switch (req.type) {
|
|
253
|
+
case "bash":
|
|
254
|
+
return { type: req.type, commandPreview: truncateHookText(req.command, 500), cwd: req.cwd };
|
|
255
|
+
case "write":
|
|
256
|
+
return { type: req.type, path: req.path, fileExists: req.fileExists, contentLength: req.content.length };
|
|
257
|
+
case "edit":
|
|
258
|
+
return { type: req.type, path: req.path, fileExists: req.fileExists, diffLength: req.diff.length };
|
|
259
|
+
case "patch":
|
|
260
|
+
return { type: req.type, path: req.path, paths: req.paths, files: req.files, diffLength: req.diff.length };
|
|
261
|
+
case "lsp":
|
|
262
|
+
return { type: req.type, path: req.path, operation: req.operation };
|
|
263
|
+
case "agent_profile":
|
|
264
|
+
return { type: req.type, name: req.name, path: req.path, contentHash: req.contentHash };
|
|
265
|
+
case "external_tool":
|
|
266
|
+
return {
|
|
267
|
+
type: req.type,
|
|
268
|
+
toolCallId: req.toolCallId,
|
|
269
|
+
title: req.title,
|
|
270
|
+
kind: req.kind,
|
|
271
|
+
locations: req.locations,
|
|
272
|
+
rawInput: req.rawInput,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function sessionGrantKey(req) {
|
|
277
|
+
if (req.type === "external_tool" && req.sessionGrant)
|
|
278
|
+
return `${req.kind}:${req.sessionGrant}`;
|
|
279
|
+
return undefined;
|
|
280
|
+
}
|
|
281
|
+
function externalCommand(rawInput) {
|
|
282
|
+
if (typeof rawInput !== "object" || rawInput === null || Array.isArray(rawInput))
|
|
283
|
+
return undefined;
|
|
284
|
+
const command = rawInput.command;
|
|
285
|
+
return typeof command === "string" ? command : undefined;
|
|
286
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heuristic classifier for bash commands that deserve an extra user warning.
|
|
3
|
+
*
|
|
4
|
+
* Conservative by design: false negatives are fine (users are still prompted
|
|
5
|
+
* to approve), false positives are annoying (users get desensitised to the
|
|
6
|
+
* warning). We only flag patterns that are widely recognised as destructive
|
|
7
|
+
* or commonly abused by injected prompts.
|
|
8
|
+
*/
|
|
9
|
+
export interface DangerSignal {
|
|
10
|
+
pattern: string;
|
|
11
|
+
message: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function classifyBashDanger(command: string): DangerSignal | null;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heuristic classifier for bash commands that deserve an extra user warning.
|
|
3
|
+
*
|
|
4
|
+
* Conservative by design: false negatives are fine (users are still prompted
|
|
5
|
+
* to approve), false positives are annoying (users get desensitised to the
|
|
6
|
+
* warning). We only flag patterns that are widely recognised as destructive
|
|
7
|
+
* or commonly abused by injected prompts.
|
|
8
|
+
*/
|
|
9
|
+
export function classifyBashDanger(command) {
|
|
10
|
+
const normalized = command.trim();
|
|
11
|
+
if (!normalized)
|
|
12
|
+
return null;
|
|
13
|
+
// Piping an internet download into a shell — classic supply-chain foot-gun.
|
|
14
|
+
if (/\b(curl|wget|fetch)\b[^|]*\|\s*(bash|sh|zsh|fish)\b/i.test(normalized)) {
|
|
15
|
+
return {
|
|
16
|
+
pattern: "curl | sh",
|
|
17
|
+
message: "This command pipes a downloaded script directly into a shell.",
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
// Recursive force delete. Match `rm -rf`, `rm -fr`, `rm -Rf`, etc.
|
|
21
|
+
if (/\brm\s+(-[a-zA-Z]*[rR][a-zA-Z]*f|-[a-zA-Z]*f[a-zA-Z]*[rR])\b/.test(normalized)) {
|
|
22
|
+
return {
|
|
23
|
+
pattern: "rm -rf",
|
|
24
|
+
message: "This command recursively deletes files and directories.",
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// Privilege escalation.
|
|
28
|
+
if (/\bsudo\b/.test(normalized)) {
|
|
29
|
+
return {
|
|
30
|
+
pattern: "sudo",
|
|
31
|
+
message: "This command runs with elevated privileges.",
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// chmod 777 and friends.
|
|
35
|
+
if (/\bchmod\s+(-R\s+)?(0?777|a\+rwx|u\+rwx,g\+rwx,o\+rwx)\b/.test(normalized)) {
|
|
36
|
+
return {
|
|
37
|
+
pattern: "chmod 777",
|
|
38
|
+
message: "This command gives world-writable permissions.",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Git force push / reset hard — potentially destructive on shared branches.
|
|
42
|
+
if (/\bgit\s+push\s+(-f\b|--force\b|--force-with-lease\b)/.test(normalized)) {
|
|
43
|
+
return {
|
|
44
|
+
pattern: "git push --force",
|
|
45
|
+
message: "This force-pushes and can overwrite the remote branch history.",
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (/\bgit\s+reset\s+--hard\b/.test(normalized)) {
|
|
49
|
+
return {
|
|
50
|
+
pattern: "git reset --hard",
|
|
51
|
+
message: "This discards uncommitted changes and rewrites the working tree.",
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses unified-diff output (e.g. from `diff`'s `createTwoFilesPatch`) into
|
|
3
|
+
* discrete hunks so the TUI can render each one with its own header and fold
|
|
4
|
+
* gracefully when the total body exceeds the available line budget.
|
|
5
|
+
*/
|
|
6
|
+
export interface DiffHunk {
|
|
7
|
+
/** The `@@ -old,count +new,count @@ ...` line verbatim. */
|
|
8
|
+
header: string;
|
|
9
|
+
/** Body lines, each beginning with '+', '-', or ' '. No trailing newline. */
|
|
10
|
+
lines: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare function parseDiffHunks(diff: string): DiffHunk[];
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses unified-diff output (e.g. from `diff`'s `createTwoFilesPatch`) into
|
|
3
|
+
* discrete hunks so the TUI can render each one with its own header and fold
|
|
4
|
+
* gracefully when the total body exceeds the available line budget.
|
|
5
|
+
*/
|
|
6
|
+
export function parseDiffHunks(diff) {
|
|
7
|
+
const hunks = [];
|
|
8
|
+
const rawLines = diff.split("\n");
|
|
9
|
+
let current = null;
|
|
10
|
+
for (const line of rawLines) {
|
|
11
|
+
if (line.startsWith("===") ||
|
|
12
|
+
line.startsWith("Index:") ||
|
|
13
|
+
line.startsWith("---") ||
|
|
14
|
+
line.startsWith("+++")) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
if (line.startsWith("@@")) {
|
|
18
|
+
if (current)
|
|
19
|
+
hunks.push(current);
|
|
20
|
+
current = { header: line, lines: [] };
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (!current)
|
|
24
|
+
continue;
|
|
25
|
+
if (line.startsWith("\\ No newline"))
|
|
26
|
+
continue;
|
|
27
|
+
current.lines.push(line);
|
|
28
|
+
}
|
|
29
|
+
if (current)
|
|
30
|
+
hunks.push(current);
|
|
31
|
+
return hunks;
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isProtectedWorkspacePath(cwd: string, filePath: string): boolean;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { basename, dirname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
2
|
+
import { resolveThroughLinks } from "../tools/path-utils.js";
|
|
3
|
+
/**
|
|
4
|
+
* Workspace files whose content grants capabilities beyond the edit itself.
|
|
5
|
+
* Default mode auto-approves ordinary workspace edits; these always ask,
|
|
6
|
+
* because writing them is a privilege escalation rather than a code change:
|
|
7
|
+
*
|
|
8
|
+
* - anything inside a `.git` directory — hooks and `core.hooksPath` /
|
|
9
|
+
* `core.fsmonitor` in `.git/config` run arbitrary commands the next time
|
|
10
|
+
* anyone runs git;
|
|
11
|
+
* - agent permission settings (`.bubble/settings*.json`, and Claude Code's
|
|
12
|
+
* `.claude/settings*.json`) — an allow rule written there approves every
|
|
13
|
+
* later command without a prompt.
|
|
14
|
+
*/
|
|
15
|
+
const PROTECTED_SETTINGS = [
|
|
16
|
+
{ dir: ".bubble", files: new Set(["settings.json", "settings.local.json"]) },
|
|
17
|
+
{ dir: ".claude", files: new Set(["settings.json", "settings.local.json"]) },
|
|
18
|
+
];
|
|
19
|
+
export function isProtectedWorkspacePath(cwd, filePath) {
|
|
20
|
+
const absolute = isAbsolute(filePath) ? resolve(filePath) : resolve(cwd, filePath);
|
|
21
|
+
// Also where the path really leads: `docs/hooks -> ../.git/hooks` must not
|
|
22
|
+
// turn a hook into an ordinary auto-approved edit.
|
|
23
|
+
return isProtected(cwd, absolute) || isProtected(resolveThroughLinks(cwd), resolveThroughLinks(absolute));
|
|
24
|
+
}
|
|
25
|
+
function isProtected(cwd, absolute) {
|
|
26
|
+
// Case-folded: on the default macOS (and Windows) filesystem `.GIT/config`
|
|
27
|
+
// is `.git/config`. On case-sensitive systems this only asks more often.
|
|
28
|
+
const rel = relative(resolve(cwd), absolute).toLowerCase();
|
|
29
|
+
const parts = rel.split(sep).filter(Boolean);
|
|
30
|
+
if (parts.includes(".git"))
|
|
31
|
+
return true;
|
|
32
|
+
const parent = basename(dirname(absolute)).toLowerCase();
|
|
33
|
+
const name = basename(absolute).toLowerCase();
|
|
34
|
+
return PROTECTED_SETTINGS.some((entry) => entry.dir === parent && entry.files.has(name));
|
|
35
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session-scoped set of bash commands the user approved "for this session".
|
|
3
|
+
* Not persisted to disk.
|
|
4
|
+
*
|
|
5
|
+
* Exact match only (after trimming), like Kimi Code's session approvals: a
|
|
6
|
+
* remembered command never vouches for a different one, so no shell parsing
|
|
7
|
+
* is involved and a compound line cannot smuggle an extra command past it.
|
|
8
|
+
* Broader, prefix-style grants belong in allow rules (`Bash(npm test:*)`),
|
|
9
|
+
* which are matched per simple command.
|
|
10
|
+
*/
|
|
11
|
+
export declare class BashAllowlist {
|
|
12
|
+
private commands;
|
|
13
|
+
add(command: string): void;
|
|
14
|
+
remove(command: string): boolean;
|
|
15
|
+
clear(): void;
|
|
16
|
+
matches(command: string): boolean;
|
|
17
|
+
list(): string[];
|
|
18
|
+
size(): number;
|
|
19
|
+
}
|
|
20
|
+
/** What a "this session" approval of `command` remembers: the command itself. */
|
|
21
|
+
export declare function bashSessionGrant(command: string): string | undefined;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session-scoped set of bash commands the user approved "for this session".
|
|
3
|
+
* Not persisted to disk.
|
|
4
|
+
*
|
|
5
|
+
* Exact match only (after trimming), like Kimi Code's session approvals: a
|
|
6
|
+
* remembered command never vouches for a different one, so no shell parsing
|
|
7
|
+
* is involved and a compound line cannot smuggle an extra command past it.
|
|
8
|
+
* Broader, prefix-style grants belong in allow rules (`Bash(npm test:*)`),
|
|
9
|
+
* which are matched per simple command.
|
|
10
|
+
*/
|
|
11
|
+
export class BashAllowlist {
|
|
12
|
+
commands = new Set();
|
|
13
|
+
add(command) {
|
|
14
|
+
const cleaned = command.trim();
|
|
15
|
+
if (!cleaned)
|
|
16
|
+
return;
|
|
17
|
+
this.commands.add(cleaned);
|
|
18
|
+
}
|
|
19
|
+
remove(command) {
|
|
20
|
+
return this.commands.delete(command.trim());
|
|
21
|
+
}
|
|
22
|
+
clear() {
|
|
23
|
+
this.commands.clear();
|
|
24
|
+
}
|
|
25
|
+
matches(command) {
|
|
26
|
+
return this.commands.has(command.trim());
|
|
27
|
+
}
|
|
28
|
+
list() {
|
|
29
|
+
return [...this.commands].sort();
|
|
30
|
+
}
|
|
31
|
+
size() {
|
|
32
|
+
return this.commands.size;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** What a "this session" approval of `command` remembers: the command itself. */
|
|
36
|
+
export function bashSessionGrant(command) {
|
|
37
|
+
return command.trim() || undefined;
|
|
38
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ToolResult } from "../types.js";
|
|
2
|
+
import type { ApprovalController, ApprovalDecision, ApprovalRequest } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Runs a tool action through the approval controller. Returns either the
|
|
5
|
+
* decision (on approve) or a pre-built rejection ToolResult (on reject or
|
|
6
|
+
* no controller available to the tool).
|
|
7
|
+
*/
|
|
8
|
+
export declare function gateToolAction(approval: ApprovalController | undefined, req: ApprovalRequest): Promise<{
|
|
9
|
+
approved: true;
|
|
10
|
+
decision: ApprovalDecision;
|
|
11
|
+
} | {
|
|
12
|
+
approved: false;
|
|
13
|
+
result: ToolResult;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs a tool action through the approval controller. Returns either the
|
|
3
|
+
* decision (on approve) or a pre-built rejection ToolResult (on reject or
|
|
4
|
+
* no controller available to the tool).
|
|
5
|
+
*/
|
|
6
|
+
export async function gateToolAction(approval, req) {
|
|
7
|
+
if (!approval) {
|
|
8
|
+
return { approved: true, decision: { action: "approve" } };
|
|
9
|
+
}
|
|
10
|
+
const decision = await approval.request(req);
|
|
11
|
+
if (decision.action === "approve") {
|
|
12
|
+
return { approved: true, decision };
|
|
13
|
+
}
|
|
14
|
+
const feedback = decision.feedback?.trim();
|
|
15
|
+
const label = approvalRequestLabel(req);
|
|
16
|
+
const message = feedback
|
|
17
|
+
? `${label} was rejected by the user. User feedback: ${feedback}`
|
|
18
|
+
: `${label} was rejected by the user.`;
|
|
19
|
+
return {
|
|
20
|
+
approved: false,
|
|
21
|
+
result: {
|
|
22
|
+
content: message,
|
|
23
|
+
isError: true,
|
|
24
|
+
// Surfaces the rejection reason in subagent tool notes (which prefer
|
|
25
|
+
// metadata.reason over the truncated first content line).
|
|
26
|
+
metadata: { kind: "security", reason: feedback || message },
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function approvalRequestLabel(req) {
|
|
31
|
+
switch (req.type) {
|
|
32
|
+
case "edit":
|
|
33
|
+
return `Edit to ${req.path}`;
|
|
34
|
+
case "write":
|
|
35
|
+
return `${req.fileExists ? "Overwrite" : "Write"} to ${req.path}`;
|
|
36
|
+
case "patch":
|
|
37
|
+
return `Patch to ${req.path}`;
|
|
38
|
+
case "bash":
|
|
39
|
+
return `Bash command \`${req.command}\``;
|
|
40
|
+
case "lsp":
|
|
41
|
+
return `LSP ${req.operation} on ${req.path}`;
|
|
42
|
+
case "agent_profile":
|
|
43
|
+
return `Project agent profile "${req.name}"`;
|
|
44
|
+
case "external_tool":
|
|
45
|
+
return `External tool "${req.title}"`;
|
|
46
|
+
}
|
|
47
|
+
}
|