@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,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth credential storage in <bubble home>/auth.json.
|
|
3
|
+
*
|
|
4
|
+
* The path is resolved at CONSTRUCTION time through getBubbleHome(), never at
|
|
5
|
+
* module load: a module-level constant froze the real ~/.bubble at import,
|
|
6
|
+
* which no test could isolate (known-defects #7) and which ignored
|
|
7
|
+
* BUBBLE_HOME / dev mode while every other config file honored them
|
|
8
|
+
* (config.json, sessions, memory all derive from getBubbleHome).
|
|
9
|
+
*
|
|
10
|
+
* The file is shared by every Bubble process on the machine (several TUIs, the
|
|
11
|
+
* desktop app, the Feishu host), and OAuth refresh tokens are single-use, so a
|
|
12
|
+
* stale copy is not harmless — presenting an already-rotated refresh token is
|
|
13
|
+
* rejected (`refresh_token_reused`) and forces a new login. Hence:
|
|
14
|
+
* - writes are read-merge-write of ONE key plus an atomic rename, never a
|
|
15
|
+
* dump of this process's whole in-memory map over the file;
|
|
16
|
+
* - reads follow the file (mtime/size check) so a token rotated by another
|
|
17
|
+
* process is picked up instead of the stale in-memory one;
|
|
18
|
+
* - withRefreshLock() serializes refreshes across processes.
|
|
19
|
+
*
|
|
20
|
+
* Node has no flock, so both locks are O_EXCL lock files carrying an owner
|
|
21
|
+
* token: a holder only ever deletes a lock whose content is its own token,
|
|
22
|
+
* and stale locks are broken one breaker at a time (see breakLockIfStale), so
|
|
23
|
+
* a breaker cannot remove a successor's live lock. What remains is a holder
|
|
24
|
+
* suspended past the stale threshold that resumes and releases in the same
|
|
25
|
+
* microseconds a breaker acts. The refresh path tolerates even that: results
|
|
26
|
+
* are stored by compare-and-set, and a rejected token triggers a second look
|
|
27
|
+
* at the file (ProviderRegistry).
|
|
28
|
+
*/
|
|
29
|
+
import { randomUUID } from "node:crypto";
|
|
30
|
+
import { closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, statSync, unlinkSync, utimesSync, writeFileSync, writeSync, } from "node:fs";
|
|
31
|
+
import { dirname, join } from "node:path";
|
|
32
|
+
import { getBubbleHome } from "../bubble-home.js";
|
|
33
|
+
/**
|
|
34
|
+
* The refresh holder heartbeats its lock, so "stale" means the holder is gone,
|
|
35
|
+
* not merely slow. Waiters outlast the stale threshold: a crashed holder is
|
|
36
|
+
* always recovered from, and only a live, stuck one makes a waiter give up.
|
|
37
|
+
*/
|
|
38
|
+
const REFRESH_LOCK_STALE_MS = 30_000;
|
|
39
|
+
const REFRESH_LOCK_HEARTBEAT_MS = 5_000;
|
|
40
|
+
const REFRESH_LOCK_WAIT_MS = 90_000;
|
|
41
|
+
const REFRESH_LOCK_POLL_MS = 50;
|
|
42
|
+
/** The write lock spans a few ms of synchronous file I/O. */
|
|
43
|
+
const WRITE_LOCK_STALE_MS = 5_000;
|
|
44
|
+
const WRITE_LOCK_WAIT_MS = 15_000;
|
|
45
|
+
const WRITE_LOCK_POLL_MS = 5;
|
|
46
|
+
const BREAKER_STALE_MS = 10_000;
|
|
47
|
+
const sleepCell = new Int32Array(new SharedArrayBuffer(4));
|
|
48
|
+
function sleepSync(ms) {
|
|
49
|
+
Atomics.wait(sleepCell, 0, 0, ms);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* One acquisition attempt. Returns the owner token, or undefined on contention
|
|
53
|
+
* (after breaking the lock if it was stale, so the caller's retry can win).
|
|
54
|
+
* Anything but EEXIST is a real error — an unwritable home must surface, not
|
|
55
|
+
* be mistaken for contention and retried forever.
|
|
56
|
+
*/
|
|
57
|
+
function tryAcquireLock(lockPath, staleMs) {
|
|
58
|
+
const token = `${process.pid}:${randomUUID()}`;
|
|
59
|
+
let fd;
|
|
60
|
+
try {
|
|
61
|
+
const dir = dirname(lockPath);
|
|
62
|
+
if (!existsSync(dir))
|
|
63
|
+
mkdirSync(dir, { recursive: true });
|
|
64
|
+
fd = openSync(lockPath, "wx", 0o600);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (error.code !== "EEXIST")
|
|
68
|
+
throw error;
|
|
69
|
+
breakLockIfStale(lockPath, staleMs);
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
writeSync(fd, token);
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
closeSync(fd);
|
|
77
|
+
}
|
|
78
|
+
return token;
|
|
79
|
+
}
|
|
80
|
+
function observeLock(lockPath) {
|
|
81
|
+
try {
|
|
82
|
+
return { mtimeMs: statSync(lockPath).mtimeMs, token: readFileSync(lockPath, "utf-8") };
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return undefined; // released meanwhile
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function isStale(lockPath, staleMs) {
|
|
89
|
+
const observed = observeLock(lockPath);
|
|
90
|
+
return !!observed && Date.now() - observed.mtimeMs > staleMs;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Breakers are serialized by their own O_EXCL lock, held for the few
|
|
94
|
+
* microseconds of the re-check and unlink below. Without it, two waiters that
|
|
95
|
+
* both judged the lock stale could interleave: one unlinks it, a successor
|
|
96
|
+
* acquires the path, and the other then unlinks the successor's live lock.
|
|
97
|
+
* Under the breaker lock the second one re-checks and finds a fresh lock.
|
|
98
|
+
*/
|
|
99
|
+
function breakLockIfStale(lockPath, staleMs) {
|
|
100
|
+
if (!isStale(lockPath, staleMs))
|
|
101
|
+
return;
|
|
102
|
+
const breakerPath = `${lockPath}.breaker`;
|
|
103
|
+
let fd;
|
|
104
|
+
try {
|
|
105
|
+
fd = openSync(breakerPath, "wx", 0o600);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if (error.code !== "EEXIST")
|
|
109
|
+
throw error;
|
|
110
|
+
// Someone else is breaking it right now; only a crash inside that tiny
|
|
111
|
+
// section leaves the file behind, so clear an old one for the next retry.
|
|
112
|
+
if (isStale(breakerPath, BREAKER_STALE_MS)) {
|
|
113
|
+
try {
|
|
114
|
+
unlinkSync(breakerPath);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Already gone.
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
closeSync(fd);
|
|
124
|
+
if (isStale(lockPath, staleMs))
|
|
125
|
+
unlinkSync(lockPath);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Already gone.
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
try {
|
|
132
|
+
unlinkSync(breakerPath);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Already gone.
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** Never delete a lock that is not ours (ours may have been broken as stale). */
|
|
140
|
+
function releaseLock(lockPath, token) {
|
|
141
|
+
try {
|
|
142
|
+
if (readFileSync(lockPath, "utf-8") === token)
|
|
143
|
+
unlinkSync(lockPath);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Already gone.
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export class AuthStorage {
|
|
150
|
+
data = {};
|
|
151
|
+
/** Identity of the file as last read/written, to detect foreign writes. */
|
|
152
|
+
diskStamp;
|
|
153
|
+
mutationListeners = [];
|
|
154
|
+
authPath;
|
|
155
|
+
constructor(authPath = join(getBubbleHome(), "auth.json")) {
|
|
156
|
+
this.authPath = authPath;
|
|
157
|
+
this.load();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Observe credential writes/removals. Callers across the codebase mutate
|
|
161
|
+
* this storage directly (login/logout flows), so consumers that must react
|
|
162
|
+
* to credential-identity changes (ProviderRegistry's routing revision)
|
|
163
|
+
* subscribe here instead of wrapping every call site.
|
|
164
|
+
*/
|
|
165
|
+
onMutation(listener) {
|
|
166
|
+
this.mutationListeners.push(listener);
|
|
167
|
+
return () => {
|
|
168
|
+
this.mutationListeners = this.mutationListeners.filter((item) => item !== listener);
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
notifyMutation(providerId) {
|
|
172
|
+
for (const listener of this.mutationListeners) {
|
|
173
|
+
try {
|
|
174
|
+
listener(providerId);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Listeners must never break credential writes.
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
stampOf() {
|
|
182
|
+
try {
|
|
183
|
+
const stat = statSync(this.authPath);
|
|
184
|
+
// ino + ctime: every write replaces the file by rename, so they change
|
|
185
|
+
// even when a same-size rotation lands within one coarse mtime tick.
|
|
186
|
+
return `${stat.ino}:${stat.mtimeMs}:${stat.ctimeMs}:${stat.size}`;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
readDisk() {
|
|
193
|
+
try {
|
|
194
|
+
const parsed = JSON.parse(readFileSync(this.authPath, "utf-8"));
|
|
195
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return {};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
load() {
|
|
202
|
+
this.diskStamp = this.stampOf();
|
|
203
|
+
this.data = this.diskStamp === undefined ? {} : this.readDisk();
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Adopt writes made by other processes; notifies for the keys that changed.
|
|
207
|
+
* `force` skips the stamp shortcut: a token rotation keeps the file size, so
|
|
208
|
+
* on a coarse-mtime filesystem the stamp alone can miss it. The refresh and
|
|
209
|
+
* write paths cannot afford that.
|
|
210
|
+
*/
|
|
211
|
+
sync(force = false) {
|
|
212
|
+
const stamp = this.stampOf();
|
|
213
|
+
if (!force && stamp === this.diskStamp)
|
|
214
|
+
return;
|
|
215
|
+
const previous = this.data;
|
|
216
|
+
this.diskStamp = stamp;
|
|
217
|
+
this.data = stamp === undefined ? {} : this.readDisk();
|
|
218
|
+
for (const key of new Set([...Object.keys(previous), ...Object.keys(this.data)])) {
|
|
219
|
+
if (JSON.stringify(previous[key]) !== JSON.stringify(this.data[key]))
|
|
220
|
+
this.notifyMutation(key);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Read-merge-write of a single key: entries owned by other processes survive.
|
|
225
|
+
* The whole sequence runs under the cross-process write lock — without it a
|
|
226
|
+
* process could read, lose the CPU while another persists a rotated token,
|
|
227
|
+
* then rename its older snapshot over it.
|
|
228
|
+
*/
|
|
229
|
+
commit(providerId, creds,
|
|
230
|
+
/** Compare-and-set guard, checked under the lock against the re-read file. */
|
|
231
|
+
guard) {
|
|
232
|
+
const lockPath = `${this.authPath}.wlock`;
|
|
233
|
+
const deadline = Date.now() + WRITE_LOCK_WAIT_MS;
|
|
234
|
+
let token = tryAcquireLock(lockPath, WRITE_LOCK_STALE_MS);
|
|
235
|
+
while (token === undefined) {
|
|
236
|
+
if (Date.now() >= deadline) {
|
|
237
|
+
throw new Error(`Timed out waiting for the credential write lock (${lockPath}).`);
|
|
238
|
+
}
|
|
239
|
+
sleepSync(WRITE_LOCK_POLL_MS);
|
|
240
|
+
token = tryAcquireLock(lockPath, WRITE_LOCK_STALE_MS);
|
|
241
|
+
}
|
|
242
|
+
try {
|
|
243
|
+
this.sync(true);
|
|
244
|
+
if (guard && !guard(this.data[providerId]))
|
|
245
|
+
return false;
|
|
246
|
+
const next = { ...this.data };
|
|
247
|
+
if (creds)
|
|
248
|
+
next[providerId] = creds;
|
|
249
|
+
else
|
|
250
|
+
delete next[providerId];
|
|
251
|
+
const tmpPath = `${this.authPath}.${process.pid}.tmp`;
|
|
252
|
+
writeFileSync(tmpPath, JSON.stringify(next, null, 2) + "\n", { mode: 0o600 });
|
|
253
|
+
// Fencing: if this process was suspended past the stale threshold, the
|
|
254
|
+
// lock was broken and someone else may have committed since the re-read
|
|
255
|
+
// above. Publishing the snapshot now would roll their write back.
|
|
256
|
+
if (observeLock(lockPath)?.token !== token) {
|
|
257
|
+
unlinkSync(tmpPath);
|
|
258
|
+
throw new Error("Lost the credential write lock before publishing; the write was not applied.");
|
|
259
|
+
}
|
|
260
|
+
renameSync(tmpPath, this.authPath);
|
|
261
|
+
this.data = next;
|
|
262
|
+
this.diskStamp = this.stampOf();
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
finally {
|
|
266
|
+
releaseLock(lockPath, token);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/** Force a re-read of the file (see sync). */
|
|
270
|
+
reload() {
|
|
271
|
+
this.sync(true);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Serialize token refreshes across processes. Callers must re-read the
|
|
275
|
+
* credentials inside `fn`: whoever held the lock before may already have
|
|
276
|
+
* rotated them. `fn` never runs without the lock — presenting a single-use
|
|
277
|
+
* refresh token concurrently can void the login, while a timeout only costs
|
|
278
|
+
* one retryable request.
|
|
279
|
+
*/
|
|
280
|
+
async withRefreshLock(fn) {
|
|
281
|
+
const lockPath = `${this.authPath}.lock`;
|
|
282
|
+
const deadline = Date.now() + REFRESH_LOCK_WAIT_MS;
|
|
283
|
+
let token = tryAcquireLock(lockPath, REFRESH_LOCK_STALE_MS);
|
|
284
|
+
while (token === undefined) {
|
|
285
|
+
if (Date.now() >= deadline) {
|
|
286
|
+
throw new Error("Timed out waiting for another Bubble process to finish refreshing credentials. Try again.");
|
|
287
|
+
}
|
|
288
|
+
await new Promise((resolve) => setTimeout(resolve, REFRESH_LOCK_POLL_MS));
|
|
289
|
+
token = tryAcquireLock(lockPath, REFRESH_LOCK_STALE_MS);
|
|
290
|
+
}
|
|
291
|
+
const owned = token;
|
|
292
|
+
const heartbeat = setInterval(() => {
|
|
293
|
+
try {
|
|
294
|
+
if (readFileSync(lockPath, "utf-8") === owned)
|
|
295
|
+
utimesSync(lockPath, new Date(), new Date());
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
// Lock gone: nothing to keep alive.
|
|
299
|
+
}
|
|
300
|
+
}, REFRESH_LOCK_HEARTBEAT_MS);
|
|
301
|
+
heartbeat.unref?.();
|
|
302
|
+
try {
|
|
303
|
+
return await fn();
|
|
304
|
+
}
|
|
305
|
+
finally {
|
|
306
|
+
clearInterval(heartbeat);
|
|
307
|
+
releaseLock(lockPath, owned);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
getPath() {
|
|
311
|
+
return this.authPath;
|
|
312
|
+
}
|
|
313
|
+
get(providerId) {
|
|
314
|
+
this.sync();
|
|
315
|
+
return this.data[providerId];
|
|
316
|
+
}
|
|
317
|
+
set(providerId, creds) {
|
|
318
|
+
this.commit(providerId, creds);
|
|
319
|
+
this.notifyMutation(providerId);
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Store the result of a refresh only if the entry is still the one that was
|
|
323
|
+
* refreshed (`fromRefreshToken`; null = the key must still be absent). A
|
|
324
|
+
* /login or /logout in another process only takes the write lock, so it can
|
|
325
|
+
* land while a refresh request is in flight; its outcome must win over a
|
|
326
|
+
* result derived from the credentials it replaced.
|
|
327
|
+
*/
|
|
328
|
+
replaceIfUnchanged(providerId, creds, fromRefreshToken) {
|
|
329
|
+
const written = this.commit(providerId, creds, (onDisk) => fromRefreshToken === null ? onDisk === undefined : onDisk?.refreshToken === fromRefreshToken);
|
|
330
|
+
if (written)
|
|
331
|
+
this.notifyMutation(providerId);
|
|
332
|
+
return written;
|
|
333
|
+
}
|
|
334
|
+
remove(providerId) {
|
|
335
|
+
this.commit(providerId, undefined);
|
|
336
|
+
this.notifyMutation(providerId);
|
|
337
|
+
}
|
|
338
|
+
has(providerId) {
|
|
339
|
+
this.sync();
|
|
340
|
+
return !!this.data[providerId];
|
|
341
|
+
}
|
|
342
|
+
isExpired(providerId, graceMs = 5 * 60 * 1000) {
|
|
343
|
+
this.sync();
|
|
344
|
+
const creds = this.data[providerId];
|
|
345
|
+
if (!creds)
|
|
346
|
+
return true;
|
|
347
|
+
return Date.now() >= creds.expiresAt - graceMs;
|
|
348
|
+
}
|
|
349
|
+
getAccessToken(providerId) {
|
|
350
|
+
this.sync();
|
|
351
|
+
return this.data[providerId]?.accessToken;
|
|
352
|
+
}
|
|
353
|
+
list() {
|
|
354
|
+
this.sync();
|
|
355
|
+
return Object.keys(this.data);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface OAuthTokens {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
refreshToken: string;
|
|
4
|
+
expiresAt: number;
|
|
5
|
+
idToken?: string;
|
|
6
|
+
accountId?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface OAuthCredentials {
|
|
9
|
+
type: "oauth";
|
|
10
|
+
accessToken: string;
|
|
11
|
+
refreshToken: string;
|
|
12
|
+
expiresAt: number;
|
|
13
|
+
idToken?: string;
|
|
14
|
+
accountId?: string;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { TurnHooks } from "./hooks.js";
|
|
2
|
+
/**
|
|
3
|
+
* Default hooks: infrastructure and information only.
|
|
4
|
+
*
|
|
5
|
+
* The cognitive-governance layer that used to live here (task classifier,
|
|
6
|
+
* step-budget governor, discovery barrier, evidence tracker, bash-search
|
|
7
|
+
* arbitration, delegation nudge, completion self-check) was removed — see
|
|
8
|
+
* docs/harness-thinning.md. The TurnHooks mechanism itself stays, pi-style:
|
|
9
|
+
* hosts may install their own policies, the core ships none.
|
|
10
|
+
*
|
|
11
|
+
* What remains, and why it passes the ruler in that document:
|
|
12
|
+
* - resident-history compaction calls (infrastructure)
|
|
13
|
+
* - background-task and subagent-lifecycle reminders (facts the model
|
|
14
|
+
* cannot otherwise see)
|
|
15
|
+
* - orchestrationRequestReminder (deliberately retained policy: amplifies
|
|
16
|
+
* the user's EXPLICIT orchestration request at the decision turn)
|
|
17
|
+
* - userNamedModelReminder (deterministic catalog resolution of a model the
|
|
18
|
+
* user named — information the model would otherwise retype from priors)
|
|
19
|
+
* - modified-existing-tests disclosure (git ground truth: bash writes and
|
|
20
|
+
* subagent worktree merges do not appear in the model's own tool memory)
|
|
21
|
+
*/
|
|
22
|
+
export declare function createDefaultHooks(): TurnHooks[];
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { buildModifiedTestsDisclosure } from "../prompt/reminders.js";
|
|
2
|
+
import { orchestrationRequestReminder, userNamedModelReminder } from "../prompt/task-reminders.js";
|
|
3
|
+
import { captureGitBaseline, detectRunChanges } from "../agent/change-tracker.js";
|
|
4
|
+
import { buildSubagentLifecycleReminder } from "../agent/subagent-lifecycle-reminder.js";
|
|
5
|
+
/**
|
|
6
|
+
* Default hooks: infrastructure and information only.
|
|
7
|
+
*
|
|
8
|
+
* The cognitive-governance layer that used to live here (task classifier,
|
|
9
|
+
* step-budget governor, discovery barrier, evidence tracker, bash-search
|
|
10
|
+
* arbitration, delegation nudge, completion self-check) was removed — see
|
|
11
|
+
* docs/harness-thinning.md. The TurnHooks mechanism itself stays, pi-style:
|
|
12
|
+
* hosts may install their own policies, the core ships none.
|
|
13
|
+
*
|
|
14
|
+
* What remains, and why it passes the ruler in that document:
|
|
15
|
+
* - resident-history compaction calls (infrastructure)
|
|
16
|
+
* - background-task and subagent-lifecycle reminders (facts the model
|
|
17
|
+
* cannot otherwise see)
|
|
18
|
+
* - orchestrationRequestReminder (deliberately retained policy: amplifies
|
|
19
|
+
* the user's EXPLICIT orchestration request at the decision turn)
|
|
20
|
+
* - userNamedModelReminder (deterministic catalog resolution of a model the
|
|
21
|
+
* user named — information the model would otherwise retype from priors)
|
|
22
|
+
* - modified-existing-tests disclosure (git ground truth: bash writes and
|
|
23
|
+
* subagent worktree merges do not appear in the model's own tool memory)
|
|
24
|
+
*/
|
|
25
|
+
export function createDefaultHooks() {
|
|
26
|
+
return [
|
|
27
|
+
{
|
|
28
|
+
async beforeTurn(ctx) {
|
|
29
|
+
// Git ground truth for the tests-touched disclosure: tool-metadata
|
|
30
|
+
// bookkeeping misses bash-written files and subagent worktree merges;
|
|
31
|
+
// a dirty-state baseline at run start makes the run's real footprint
|
|
32
|
+
// observable.
|
|
33
|
+
if (ctx.state.gitBaseline === undefined) {
|
|
34
|
+
ctx.state.gitBaseline = await captureGitBaseline(ctx.cwd);
|
|
35
|
+
}
|
|
36
|
+
// User named the mechanism ("agent team" / workflow / 编排): remind at
|
|
37
|
+
// the decision turn, where it outweighs the parallel-spawns prior.
|
|
38
|
+
const orchestrationReminder = orchestrationRequestReminder(ctx.input, ctx.agent.hasToolAvailable("run_workflow"));
|
|
39
|
+
if (orchestrationReminder) {
|
|
40
|
+
ctx.queueReminder(orchestrationReminder);
|
|
41
|
+
}
|
|
42
|
+
// User named a configured model ("gpt 5.6 sol"): resolve it against
|
|
43
|
+
// the routable catalog and hand over the exact id at the decision
|
|
44
|
+
// point — never let the parent retype ids from priors (v3.6).
|
|
45
|
+
const namedModelReminder = userNamedModelReminder(ctx.input, ctx.agent.listRoutableModels?.(), ctx.agent.hasToolAvailable("spawn_agent"));
|
|
46
|
+
if (namedModelReminder) {
|
|
47
|
+
ctx.queueReminder(namedModelReminder);
|
|
48
|
+
}
|
|
49
|
+
// Background-task truth at turn start: completions that landed while
|
|
50
|
+
// the agent was idle (or during another session's turn) reach the
|
|
51
|
+
// model here; the same state-change gate prevents duplicates with the
|
|
52
|
+
// beforeContinuation emission (background-tasks design §2.3a).
|
|
53
|
+
const backgroundTaskReminder = ctx.agent.consumeBackgroundTaskReminder?.();
|
|
54
|
+
if (backgroundTaskReminder) {
|
|
55
|
+
ctx.queueReminder(backgroundTaskReminder);
|
|
56
|
+
}
|
|
57
|
+
ctx.agent.compactResidentHistory();
|
|
58
|
+
},
|
|
59
|
+
beforeModelCall(ctx) {
|
|
60
|
+
ctx.agent.compactResidentHistory();
|
|
61
|
+
},
|
|
62
|
+
afterTurn(ctx) {
|
|
63
|
+
ctx.agent.compactResidentHistory();
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
beforeToolCall(ctx) {
|
|
68
|
+
ctx.state.toolUsed = true;
|
|
69
|
+
},
|
|
70
|
+
beforeContinuation(ctx) {
|
|
71
|
+
if (hasSubagentLifecycleActivity(ctx.toolCalls, ctx.toolResults)) {
|
|
72
|
+
const reminder = buildSubagentLifecycleReminder(ctx.agent.listSubAgents(), ctx.toolResults);
|
|
73
|
+
if (reminder) {
|
|
74
|
+
ctx.queueReminder(reminder);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Background-task truth: state-change gated inside the agent (a task
|
|
78
|
+
// started/finished/killed since the last emission), so a mid-turn
|
|
79
|
+
// completion reaches the model without stacking per-call duplicates
|
|
80
|
+
// (background-tasks design §2.3a).
|
|
81
|
+
const taskReminder = ctx.agent.consumeBackgroundTaskReminder?.();
|
|
82
|
+
if (taskReminder) {
|
|
83
|
+
ctx.queueReminder(taskReminder);
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
async afterTurn(ctx) {
|
|
87
|
+
// Modified-existing-tests disclosure: pure information, delivered at
|
|
88
|
+
// most once, only when this run touched test files that already
|
|
89
|
+
// existed at run start. Forcing one continuation turn is the only way
|
|
90
|
+
// a final-turn fact can reach the model at all. The old completion
|
|
91
|
+
// self-check ("re-read the request...") was removed with the
|
|
92
|
+
// governance layer; this survives it because the underlying fact
|
|
93
|
+
// comes from git, not from the model's own tool history.
|
|
94
|
+
if (ctx.state.testsTouchedDisclosed)
|
|
95
|
+
return;
|
|
96
|
+
// Tools are frozen: the model could not act on the disclosure, so
|
|
97
|
+
// another turn is pure token burn.
|
|
98
|
+
if (ctx.state.forceTextOnlyReason)
|
|
99
|
+
return;
|
|
100
|
+
// Subagents hand off to a parent whose own disclosure covers their
|
|
101
|
+
// merged changes via the git baseline.
|
|
102
|
+
if (ctx.agent.role === "subagent")
|
|
103
|
+
return;
|
|
104
|
+
// Only attribute git changes to runs that actually used tools, so
|
|
105
|
+
// external repo churn cannot hijack a pure Q&A turn.
|
|
106
|
+
if (!ctx.state.toolUsed || !ctx.state.gitBaseline)
|
|
107
|
+
return;
|
|
108
|
+
const changes = await detectRunChanges(ctx.cwd, ctx.state.gitBaseline);
|
|
109
|
+
if (!changes || changes.modifiedExistingTests.length === 0)
|
|
110
|
+
return;
|
|
111
|
+
ctx.state.testsTouchedDisclosed = true;
|
|
112
|
+
ctx.state.forceContinuationReason = "tests_touched_disclosure";
|
|
113
|
+
ctx.queueReminder(buildModifiedTestsDisclosure(changes.modifiedExistingTests));
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
}
|
|
118
|
+
function hasSubagentLifecycleActivity(toolCalls, toolResults) {
|
|
119
|
+
return toolCalls.some((toolCall) => isSubagentLifecycleTool(toolCall.name))
|
|
120
|
+
|| toolResults.some((result) => result.metadata?.kind === "subagent");
|
|
121
|
+
}
|
|
122
|
+
function isSubagentLifecycleTool(name) {
|
|
123
|
+
return name === "spawn_agent"
|
|
124
|
+
|| name === "wait_agent"
|
|
125
|
+
|| name === "send_input"
|
|
126
|
+
|| name === "close_agent";
|
|
127
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { Agent } from "../agent.js";
|
|
2
|
+
import type { ContentPart, ParsedToolCall, ToolRegistryEntry, ToolResult } from "../types.js";
|
|
3
|
+
import type { GitChangeBaseline } from "../agent/change-tracker.js";
|
|
4
|
+
export interface TurnHookState {
|
|
5
|
+
turnCount?: number;
|
|
6
|
+
forceTextOnlyReason?: string;
|
|
7
|
+
forceContinuationReason?: string;
|
|
8
|
+
/** Modified-existing-tests disclosure already delivered this run (at most once). */
|
|
9
|
+
testsTouchedDisclosed?: boolean;
|
|
10
|
+
/** Git dirty-state snapshot at run start (null = not a git repo / git failed). */
|
|
11
|
+
gitBaseline?: GitChangeBaseline | null;
|
|
12
|
+
/** Any tool executed this run — guards git-change attribution for pure Q&A turns. */
|
|
13
|
+
toolUsed?: boolean;
|
|
14
|
+
taskBudget?: {
|
|
15
|
+
total: number;
|
|
16
|
+
spent: number;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface TurnHookContext {
|
|
20
|
+
agent: Agent;
|
|
21
|
+
cwd: string;
|
|
22
|
+
input: string | ContentPart[];
|
|
23
|
+
state: TurnHookState;
|
|
24
|
+
queueReminder: (reminder: string) => void;
|
|
25
|
+
flushReminders: () => void;
|
|
26
|
+
}
|
|
27
|
+
export interface BeforeModelCallHookContext extends TurnHookContext {
|
|
28
|
+
toolEntries: ToolRegistryEntry[];
|
|
29
|
+
disableTools: (reason: string) => void;
|
|
30
|
+
}
|
|
31
|
+
export interface BeforeToolCallHookContext extends TurnHookContext {
|
|
32
|
+
toolCall: ParsedToolCall;
|
|
33
|
+
blockedResult?: ToolResult;
|
|
34
|
+
replaceToolCall: (toolCall: ParsedToolCall) => void;
|
|
35
|
+
blockToolCall: (result: ToolResult) => void;
|
|
36
|
+
}
|
|
37
|
+
export interface AfterToolCallHookContext extends TurnHookContext {
|
|
38
|
+
toolCall: ParsedToolCall;
|
|
39
|
+
result: ToolResult;
|
|
40
|
+
replaceResult: (result: ToolResult) => void;
|
|
41
|
+
}
|
|
42
|
+
export interface BeforeContinuationHookContext extends TurnHookContext {
|
|
43
|
+
toolCalls: ParsedToolCall[];
|
|
44
|
+
toolResults: ToolResult[];
|
|
45
|
+
requestTextOnlyTurn: (reason: string) => void;
|
|
46
|
+
}
|
|
47
|
+
export interface TurnHooks {
|
|
48
|
+
beforeTurn?: (ctx: TurnHookContext) => void | Promise<void>;
|
|
49
|
+
beforeModelCall?: (ctx: BeforeModelCallHookContext) => void | Promise<void>;
|
|
50
|
+
beforeToolCall?: (ctx: BeforeToolCallHookContext) => void | Promise<void>;
|
|
51
|
+
afterToolCall?: (ctx: AfterToolCallHookContext) => void | Promise<void>;
|
|
52
|
+
beforeContinuation?: (ctx: BeforeContinuationHookContext) => void | Promise<void>;
|
|
53
|
+
afterTurn?: (ctx: TurnHookContext) => void | Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
export declare class HookBus {
|
|
56
|
+
private beforeTurnHooks;
|
|
57
|
+
private beforeModelCallHooks;
|
|
58
|
+
private beforeToolCallHooks;
|
|
59
|
+
private afterToolCallHooks;
|
|
60
|
+
private beforeContinuationHooks;
|
|
61
|
+
private afterTurnHooks;
|
|
62
|
+
register(hooks: TurnHooks): void;
|
|
63
|
+
runBeforeTurn(ctx: TurnHookContext): Promise<void>;
|
|
64
|
+
runBeforeModelCall(ctx: BeforeModelCallHookContext): Promise<void>;
|
|
65
|
+
runBeforeToolCall(ctx: BeforeToolCallHookContext): Promise<void>;
|
|
66
|
+
runAfterToolCall(ctx: AfterToolCallHookContext): Promise<void>;
|
|
67
|
+
runBeforeContinuation(ctx: BeforeContinuationHookContext): Promise<void>;
|
|
68
|
+
runAfterTurn(ctx: TurnHookContext): Promise<void>;
|
|
69
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export class HookBus {
|
|
2
|
+
beforeTurnHooks = [];
|
|
3
|
+
beforeModelCallHooks = [];
|
|
4
|
+
beforeToolCallHooks = [];
|
|
5
|
+
afterToolCallHooks = [];
|
|
6
|
+
beforeContinuationHooks = [];
|
|
7
|
+
afterTurnHooks = [];
|
|
8
|
+
register(hooks) {
|
|
9
|
+
if (hooks.beforeTurn)
|
|
10
|
+
this.beforeTurnHooks.push(hooks.beforeTurn);
|
|
11
|
+
if (hooks.beforeModelCall)
|
|
12
|
+
this.beforeModelCallHooks.push(hooks.beforeModelCall);
|
|
13
|
+
if (hooks.beforeToolCall)
|
|
14
|
+
this.beforeToolCallHooks.push(hooks.beforeToolCall);
|
|
15
|
+
if (hooks.afterToolCall)
|
|
16
|
+
this.afterToolCallHooks.push(hooks.afterToolCall);
|
|
17
|
+
if (hooks.beforeContinuation)
|
|
18
|
+
this.beforeContinuationHooks.push(hooks.beforeContinuation);
|
|
19
|
+
if (hooks.afterTurn)
|
|
20
|
+
this.afterTurnHooks.push(hooks.afterTurn);
|
|
21
|
+
}
|
|
22
|
+
async runBeforeTurn(ctx) {
|
|
23
|
+
for (const hook of this.beforeTurnHooks) {
|
|
24
|
+
await hook(ctx);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async runBeforeModelCall(ctx) {
|
|
28
|
+
for (const hook of this.beforeModelCallHooks) {
|
|
29
|
+
await hook(ctx);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async runBeforeToolCall(ctx) {
|
|
33
|
+
for (const hook of this.beforeToolCallHooks) {
|
|
34
|
+
await hook(ctx);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async runAfterToolCall(ctx) {
|
|
38
|
+
for (const hook of this.afterToolCallHooks) {
|
|
39
|
+
await hook(ctx);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async runBeforeContinuation(ctx) {
|
|
43
|
+
for (const hook of this.beforeContinuationHooks) {
|
|
44
|
+
await hook(ctx);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async runAfterTurn(ctx) {
|
|
48
|
+
for (const hook of this.afterTurnHooks) {
|
|
49
|
+
await hook(ctx);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PermissionMode } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Display metadata for each permission mode. Mirrors Claude Code's
|
|
4
|
+
* PERMISSION_MODE_CONFIG — kept narrow to what the TUI needs today.
|
|
5
|
+
*/
|
|
6
|
+
export interface PermissionModeInfo {
|
|
7
|
+
title: string;
|
|
8
|
+
shortTitle: string;
|
|
9
|
+
/** Single/double-char prefix shown in the footer badge. Empty = no badge. */
|
|
10
|
+
symbol: string;
|
|
11
|
+
/** Theme colour key. */
|
|
12
|
+
color: "muted" | "accent" | "success" | "warning" | "error";
|
|
13
|
+
}
|
|
14
|
+
export declare const PERMISSION_MODE_INFO: Record<PermissionMode, PermissionModeInfo>;
|
|
15
|
+
/**
|
|
16
|
+
* Cycle order for the interactive mode keybind. The visible TUI loop keeps the
|
|
17
|
+
* mental model simple: Build -> Plan -> Bypass -> Build.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getNextPermissionMode(current: PermissionMode): PermissionMode;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const PERMISSION_MODE_INFO = {
|
|
2
|
+
default: { title: "Default", shortTitle: "default", symbol: "", color: "muted" },
|
|
3
|
+
plan: { title: "Plan", shortTitle: "plan", symbol: "⏸", color: "accent" },
|
|
4
|
+
bypassPermissions: { title: "Bypass permissions", shortTitle: "bypass permission", symbol: "⏵⏵", color: "error" },
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Cycle order for the interactive mode keybind. The visible TUI loop keeps the
|
|
8
|
+
* mental model simple: Build -> Plan -> Bypass -> Build.
|
|
9
|
+
*/
|
|
10
|
+
export function getNextPermissionMode(current) {
|
|
11
|
+
if (current === "default")
|
|
12
|
+
return "plan";
|
|
13
|
+
if (current === "plan")
|
|
14
|
+
return "bypassPermissions";
|
|
15
|
+
return "default";
|
|
16
|
+
}
|