@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,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks overlapping paste operations by identity. Finishing an older paste
|
|
3
|
+
* must never clear the pending state of a newer paste.
|
|
4
|
+
*/
|
|
5
|
+
export class PasteOperationTracker {
|
|
6
|
+
nextId = 1;
|
|
7
|
+
active = new Set();
|
|
8
|
+
begin() {
|
|
9
|
+
const id = this.nextId++;
|
|
10
|
+
this.active.add(id);
|
|
11
|
+
return id;
|
|
12
|
+
}
|
|
13
|
+
finish(id) {
|
|
14
|
+
this.active.delete(id);
|
|
15
|
+
}
|
|
16
|
+
invalidateAll() {
|
|
17
|
+
this.active.clear();
|
|
18
|
+
}
|
|
19
|
+
get hasPending() {
|
|
20
|
+
return this.active.size > 0;
|
|
21
|
+
}
|
|
22
|
+
get pendingCount() {
|
|
23
|
+
return this.active.size;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface RecentSession {
|
|
2
|
+
file: string;
|
|
3
|
+
modifiedAt: number;
|
|
4
|
+
preview: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function getRecentSessions(cwd: string, limit?: number): RecentSession[];
|
|
7
|
+
export declare function formatRelativeTime(timestampMs: number, now?: number): string;
|
|
8
|
+
export declare function truncatePreview(preview: string, maxLen: number): string;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, statSync, existsSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { getSessionsDir } from "../../session.js";
|
|
4
|
+
export function getRecentSessions(cwd, limit = 3) {
|
|
5
|
+
const dir = getSessionsDir(cwd);
|
|
6
|
+
if (!existsSync(dir))
|
|
7
|
+
return [];
|
|
8
|
+
const files = readdirSync(dir).filter((f) => f.endsWith(".jsonl"));
|
|
9
|
+
const withMtime = files.map((f) => {
|
|
10
|
+
const full = path.join(dir, f);
|
|
11
|
+
try {
|
|
12
|
+
return { file: f, full, modifiedAt: statSync(full).mtimeMs };
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return { file: f, full, modifiedAt: 0 };
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
withMtime.sort((a, b) => b.modifiedAt - a.modifiedAt);
|
|
19
|
+
return withMtime.slice(0, limit).map(({ file, full, modifiedAt }) => ({
|
|
20
|
+
file,
|
|
21
|
+
modifiedAt,
|
|
22
|
+
preview: extractFirstUserMessage(full) ?? "(no messages)",
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
export function formatRelativeTime(timestampMs, now = Date.now()) {
|
|
26
|
+
const diffSec = Math.max(0, Math.floor((now - timestampMs) / 1000));
|
|
27
|
+
if (diffSec < 60)
|
|
28
|
+
return "just now";
|
|
29
|
+
if (diffSec < 3600)
|
|
30
|
+
return `${Math.floor(diffSec / 60)}m ago`;
|
|
31
|
+
if (diffSec < 86400)
|
|
32
|
+
return `${Math.floor(diffSec / 3600)}h ago`;
|
|
33
|
+
if (diffSec < 604800)
|
|
34
|
+
return `${Math.floor(diffSec / 86400)}d ago`;
|
|
35
|
+
const weeks = Math.floor(diffSec / 604800);
|
|
36
|
+
if (weeks < 5)
|
|
37
|
+
return `${weeks}w ago`;
|
|
38
|
+
const months = Math.floor(diffSec / (30 * 86400));
|
|
39
|
+
return `${months}mo ago`;
|
|
40
|
+
}
|
|
41
|
+
function extractFirstUserMessage(file) {
|
|
42
|
+
let raw;
|
|
43
|
+
try {
|
|
44
|
+
raw = readFileSync(file, "utf-8");
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
const lines = raw.split("\n");
|
|
50
|
+
for (const line of lines) {
|
|
51
|
+
if (!line.trim())
|
|
52
|
+
continue;
|
|
53
|
+
let entry;
|
|
54
|
+
try {
|
|
55
|
+
entry = JSON.parse(line);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (entry.type === "user_message" && typeof entry.message?.content === "string") {
|
|
61
|
+
return entry.message.content;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
export function truncatePreview(preview, maxLen) {
|
|
67
|
+
const firstLine = preview.split("\n")[0]?.trim() ?? "";
|
|
68
|
+
if (firstLine.length <= maxLen)
|
|
69
|
+
return firstLine;
|
|
70
|
+
return firstLine.slice(0, Math.max(1, maxLen - 1)) + "…";
|
|
71
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared subagent view-model + presentation helpers, used by both the inline
|
|
3
|
+
* Subagents block (message-list.tsx) and the full-screen inspector
|
|
4
|
+
* (subagent-inspector.tsx). Pure functions only — no React.
|
|
5
|
+
*/
|
|
6
|
+
import { type SubagentRouteLike } from "../../agent/subagent-route-format.js";
|
|
7
|
+
import type { Theme } from "./theme.js";
|
|
8
|
+
import type { DisplayMessage, DisplayToolCall } from "./display-history.js";
|
|
9
|
+
import type { TokenUsage, ToolResultMetadata } from "../../types.js";
|
|
10
|
+
export interface SubagentDisplay {
|
|
11
|
+
subAgentId?: string;
|
|
12
|
+
agentName?: string;
|
|
13
|
+
nickname?: string;
|
|
14
|
+
status?: string;
|
|
15
|
+
category?: string;
|
|
16
|
+
phase?: string;
|
|
17
|
+
route?: SubagentRouteLike;
|
|
18
|
+
profileSource?: string;
|
|
19
|
+
task?: string;
|
|
20
|
+
summary?: string;
|
|
21
|
+
toolNotes?: string[];
|
|
22
|
+
error?: string;
|
|
23
|
+
usage?: TokenUsage;
|
|
24
|
+
createdAt?: number;
|
|
25
|
+
updatedAt?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare function latestSubagentNote(subagent: SubagentDisplay): string;
|
|
28
|
+
export declare function subagentLabel(subagent: SubagentDisplay): string;
|
|
29
|
+
export declare function subagentRole(subagent: SubagentDisplay): string;
|
|
30
|
+
export declare function subagentDescriptor(subagent: SubagentDisplay, includeThinking?: boolean): string;
|
|
31
|
+
export declare function subagentStatusColor(status: string | undefined, theme: Theme): string;
|
|
32
|
+
export declare function subagentSummary(subagents: SubagentDisplay[]): string;
|
|
33
|
+
export declare function sortSubagents(subagents: SubagentDisplay[]): SubagentDisplay[];
|
|
34
|
+
/** A spawn_agent (one member) or a run_workflow (a group of members). The
|
|
35
|
+
* "team"/"batch" kinds survive only to render transcripts recorded before
|
|
36
|
+
* those tools were removed (2026-07-06). */
|
|
37
|
+
export interface SubagentGroup {
|
|
38
|
+
id: string;
|
|
39
|
+
runId?: string;
|
|
40
|
+
kind: "single" | "team" | "batch" | "workflow";
|
|
41
|
+
label: string;
|
|
42
|
+
members: SubagentDisplay[];
|
|
43
|
+
}
|
|
44
|
+
/** Maps every tool call in the transcript; returns the same array when nothing changed. */
|
|
45
|
+
export declare function mapTranscriptTools(messages: DisplayMessage[], updateTool: (tool: DisplayToolCall) => DisplayToolCall): DisplayMessage[];
|
|
46
|
+
/**
|
|
47
|
+
* Projects a newer lifecycle snapshot back onto every existing trace that
|
|
48
|
+
* already references the same child. spawn_agent settles as soon as the child
|
|
49
|
+
* is queued, while later tool_update/wait_agent events carry the authoritative
|
|
50
|
+
* running/final state. Keeping the launch row synchronized prevents it from
|
|
51
|
+
* remaining permanently "running" beside a completed Tasks Pane entry.
|
|
52
|
+
*/
|
|
53
|
+
export declare function mergeSubagentSnapshotsIntoMessages(messages: DisplayMessage[], incoming: ToolResultMetadata | undefined): DisplayMessage[];
|
|
54
|
+
/** Reconciles persisted launch/wait/list echoes when rebuilding a session. */
|
|
55
|
+
export declare function synchronizeSubagentSnapshots(messages: DisplayMessage[]): DisplayMessage[];
|
|
56
|
+
/**
|
|
57
|
+
* Merges subagent tool metadata, deduping member snapshots by subAgentId so a
|
|
58
|
+
* stream of per-child updates accumulates into one member list instead of each
|
|
59
|
+
* update replacing the last.
|
|
60
|
+
*/
|
|
61
|
+
export declare function mergeToolMetadata(current: ToolResultMetadata | undefined, incoming: ToolResultMetadata | undefined): ToolResultMetadata | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Applies a subagent tool_update whose launching call has already settled out
|
|
64
|
+
* of the streaming round. Children keep reporting against the launching
|
|
65
|
+
* spawn_agent / run_workflow call id across later rounds (e.g. while a
|
|
66
|
+
* wait_workflow blocks), so the update is merged into that entry by id — which
|
|
67
|
+
* absorbs members a workflow spawned after commit — and then projected onto
|
|
68
|
+
* every echo referencing the same members. The settled transcript is the only
|
|
69
|
+
* data source; the live tail never carries synthetic tool rows.
|
|
70
|
+
*/
|
|
71
|
+
export declare function applySubagentUpdateToMessages(messages: DisplayMessage[], update: {
|
|
72
|
+
id: string;
|
|
73
|
+
name: string;
|
|
74
|
+
metadata?: ToolResultMetadata;
|
|
75
|
+
}): DisplayMessage[];
|
|
76
|
+
/**
|
|
77
|
+
* Collects every spawned subagent from the live transcript + streaming tools,
|
|
78
|
+
* grouped by their originating tool call, for the inspector. Pure.
|
|
79
|
+
*
|
|
80
|
+
* The same subagent is echoed by MULTIPLE lifecycle tool calls — its spawn_agent
|
|
81
|
+
* (a stale snapshot) plus every wait_agent/list_agents that observed it (later
|
|
82
|
+
* snapshots), all carrying metadata.subagents (agent-lifecycle formatLifecycleResult).
|
|
83
|
+
* So we dedupe by subAgentId, keep the freshest snapshot, group team/batch members
|
|
84
|
+
* by their originating tool call, and collapse a single agent's many lifecycle
|
|
85
|
+
* echoes into one "single" group keyed by the agent itself.
|
|
86
|
+
*/
|
|
87
|
+
export declare function collectSubagentGroups(messages: DisplayMessage[], streamingTools: DisplayToolCall[]): SubagentGroup[];
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared subagent view-model + presentation helpers, used by both the inline
|
|
3
|
+
* Subagents block (message-list.tsx) and the full-screen inspector
|
|
4
|
+
* (subagent-inspector.tsx). Pure functions only — no React.
|
|
5
|
+
*/
|
|
6
|
+
import { formatSubagentRoute } from "../../agent/subagent-route-format.js";
|
|
7
|
+
export function latestSubagentNote(subagent) {
|
|
8
|
+
const note = subagent.error
|
|
9
|
+
|| subagent.toolNotes?.filter(Boolean).at(-1)
|
|
10
|
+
|| subagent.summary
|
|
11
|
+
|| subagent.task
|
|
12
|
+
|| "";
|
|
13
|
+
return note.replace(/\r\n/g, "\n").split("\n").map((line) => line.trim()).find(Boolean) ?? "";
|
|
14
|
+
}
|
|
15
|
+
export function subagentLabel(subagent) {
|
|
16
|
+
return subagent.nickname ?? subagent.agentName ?? "subagent";
|
|
17
|
+
}
|
|
18
|
+
export function subagentRole(subagent) {
|
|
19
|
+
return [subagent.agentName, subagent.category ? `/${subagent.category}` : ""].join("") || "default";
|
|
20
|
+
}
|
|
21
|
+
export function subagentDescriptor(subagent, includeThinking = false) {
|
|
22
|
+
const route = formatSubagentRoute(subagent.route, { includeThinking });
|
|
23
|
+
const role = subagentRole(subagent);
|
|
24
|
+
return route ? `${role} @ ${route}` : role;
|
|
25
|
+
}
|
|
26
|
+
export function subagentStatusColor(status, theme) {
|
|
27
|
+
if (status === "completed")
|
|
28
|
+
return theme.success;
|
|
29
|
+
if (status === "failed" || status === "blocked" || status === "cancelled")
|
|
30
|
+
return theme.error;
|
|
31
|
+
if (status === "queued")
|
|
32
|
+
return theme.muted;
|
|
33
|
+
return theme.toolPending;
|
|
34
|
+
}
|
|
35
|
+
export function subagentSummary(subagents) {
|
|
36
|
+
if (subagents.length === 0)
|
|
37
|
+
return "no subagents";
|
|
38
|
+
const counts = new Map();
|
|
39
|
+
for (const subagent of subagents) {
|
|
40
|
+
const status = subagent.status ?? "running";
|
|
41
|
+
counts.set(status, (counts.get(status) ?? 0) + 1);
|
|
42
|
+
}
|
|
43
|
+
const order = ["running", "queued", "completed", "blocked", "failed", "cancelled"];
|
|
44
|
+
return order
|
|
45
|
+
.filter((status) => counts.has(status))
|
|
46
|
+
.map((status) => `${counts.get(status)} ${status}`)
|
|
47
|
+
.join(" ");
|
|
48
|
+
}
|
|
49
|
+
export function sortSubagents(subagents) {
|
|
50
|
+
const rank = {
|
|
51
|
+
running: 0,
|
|
52
|
+
blocked: 1,
|
|
53
|
+
failed: 2,
|
|
54
|
+
queued: 3,
|
|
55
|
+
cancelled: 4,
|
|
56
|
+
completed: 5,
|
|
57
|
+
};
|
|
58
|
+
return [...subagents].sort((a, b) => (rank[a.status ?? "running"] ?? 9) - (rank[b.status ?? "running"] ?? 9));
|
|
59
|
+
}
|
|
60
|
+
function subagentStatusRank(status) {
|
|
61
|
+
if (status === "completed" || status === "failed" || status === "blocked" || status === "cancelled" || status === "closed")
|
|
62
|
+
return 3;
|
|
63
|
+
if (status === "running")
|
|
64
|
+
return 2;
|
|
65
|
+
if (status === "queued")
|
|
66
|
+
return 1;
|
|
67
|
+
return 0;
|
|
68
|
+
}
|
|
69
|
+
/** Higher = more "complete"/recent snapshot of the same subagent. */
|
|
70
|
+
function subagentFreshness(member) {
|
|
71
|
+
return subagentStatusRank(member.status) * 100_000
|
|
72
|
+
+ (member.toolNotes?.length ?? 0) * 10
|
|
73
|
+
+ (member.summary ? 1 : 0);
|
|
74
|
+
}
|
|
75
|
+
function memberKey(member) {
|
|
76
|
+
return member.subAgentId || `${member.nickname ?? ""}|${member.task ?? ""}`;
|
|
77
|
+
}
|
|
78
|
+
function toolCallsFromMessage(message) {
|
|
79
|
+
return [
|
|
80
|
+
...(message.toolCalls ?? []),
|
|
81
|
+
...(message.parts ?? []).flatMap((part) => part.type === "tools" ? part.toolCalls : []),
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
function freshestSubagentSnapshots(messages) {
|
|
85
|
+
const freshest = new Map();
|
|
86
|
+
for (const message of messages) {
|
|
87
|
+
for (const tool of toolCallsFromMessage(message)) {
|
|
88
|
+
if (tool.metadata?.kind !== "subagent" || !Array.isArray(tool.metadata.subagents))
|
|
89
|
+
continue;
|
|
90
|
+
for (const raw of tool.metadata.subagents) {
|
|
91
|
+
if (typeof raw !== "object" || raw === null)
|
|
92
|
+
continue;
|
|
93
|
+
const member = raw;
|
|
94
|
+
const key = memberKey(member);
|
|
95
|
+
if (!key)
|
|
96
|
+
continue;
|
|
97
|
+
const current = freshest.get(key);
|
|
98
|
+
if (!current || subagentFreshness(member) >= subagentFreshness(current)) {
|
|
99
|
+
freshest.set(key, current ? { ...current, ...member } : member);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return [...freshest.values()];
|
|
105
|
+
}
|
|
106
|
+
/** Maps every tool call in the transcript; returns the same array when nothing changed. */
|
|
107
|
+
export function mapTranscriptTools(messages, updateTool) {
|
|
108
|
+
let anyChanged = false;
|
|
109
|
+
const updated = messages.map((message) => {
|
|
110
|
+
let messageChanged = false;
|
|
111
|
+
const toolCalls = message.toolCalls?.map((tool) => {
|
|
112
|
+
const next = updateTool(tool);
|
|
113
|
+
if (next !== tool)
|
|
114
|
+
messageChanged = true;
|
|
115
|
+
return next;
|
|
116
|
+
});
|
|
117
|
+
const parts = message.parts?.map((part) => {
|
|
118
|
+
if (part.type !== "tools")
|
|
119
|
+
return part;
|
|
120
|
+
let partChanged = false;
|
|
121
|
+
const nextTools = part.toolCalls.map((tool) => {
|
|
122
|
+
const next = updateTool(tool);
|
|
123
|
+
if (next !== tool)
|
|
124
|
+
partChanged = true;
|
|
125
|
+
return next;
|
|
126
|
+
});
|
|
127
|
+
if (!partChanged)
|
|
128
|
+
return part;
|
|
129
|
+
messageChanged = true;
|
|
130
|
+
return { ...part, toolCalls: nextTools };
|
|
131
|
+
});
|
|
132
|
+
if (!messageChanged)
|
|
133
|
+
return message;
|
|
134
|
+
anyChanged = true;
|
|
135
|
+
return { ...message, toolCalls, parts };
|
|
136
|
+
});
|
|
137
|
+
return anyChanged ? updated : messages;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Projects a newer lifecycle snapshot back onto every existing trace that
|
|
141
|
+
* already references the same child. spawn_agent settles as soon as the child
|
|
142
|
+
* is queued, while later tool_update/wait_agent events carry the authoritative
|
|
143
|
+
* running/final state. Keeping the launch row synchronized prevents it from
|
|
144
|
+
* remaining permanently "running" beside a completed Tasks Pane entry.
|
|
145
|
+
*/
|
|
146
|
+
export function mergeSubagentSnapshotsIntoMessages(messages, incoming) {
|
|
147
|
+
if (incoming?.kind !== "subagent" || !Array.isArray(incoming.subagents))
|
|
148
|
+
return messages;
|
|
149
|
+
const incomingByKey = new Map();
|
|
150
|
+
for (const raw of incoming.subagents) {
|
|
151
|
+
if (typeof raw !== "object" || raw === null)
|
|
152
|
+
continue;
|
|
153
|
+
const member = raw;
|
|
154
|
+
const key = memberKey(member);
|
|
155
|
+
if (key)
|
|
156
|
+
incomingByKey.set(key, member);
|
|
157
|
+
}
|
|
158
|
+
if (incomingByKey.size === 0)
|
|
159
|
+
return messages;
|
|
160
|
+
const updateTool = (tool) => {
|
|
161
|
+
if (tool.metadata?.kind !== "subagent" || !Array.isArray(tool.metadata.subagents))
|
|
162
|
+
return tool;
|
|
163
|
+
let changed = false;
|
|
164
|
+
const subagents = tool.metadata.subagents.map((raw) => {
|
|
165
|
+
if (typeof raw !== "object" || raw === null)
|
|
166
|
+
return raw;
|
|
167
|
+
const current = raw;
|
|
168
|
+
const next = incomingByKey.get(memberKey(current));
|
|
169
|
+
if (!next || subagentFreshness(next) < subagentFreshness(current))
|
|
170
|
+
return raw;
|
|
171
|
+
changed = true;
|
|
172
|
+
return { ...current, ...next };
|
|
173
|
+
});
|
|
174
|
+
return changed ? { ...tool, metadata: { ...tool.metadata, subagents } } : tool;
|
|
175
|
+
};
|
|
176
|
+
return mapTranscriptTools(messages, updateTool);
|
|
177
|
+
}
|
|
178
|
+
/** Reconciles persisted launch/wait/list echoes when rebuilding a session. */
|
|
179
|
+
export function synchronizeSubagentSnapshots(messages) {
|
|
180
|
+
const snapshots = freshestSubagentSnapshots(messages);
|
|
181
|
+
return snapshots.length === 0
|
|
182
|
+
? messages
|
|
183
|
+
: mergeSubagentSnapshotsIntoMessages(messages, { kind: "subagent", subagents: snapshots });
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Merges subagent tool metadata, deduping member snapshots by subAgentId so a
|
|
187
|
+
* stream of per-child updates accumulates into one member list instead of each
|
|
188
|
+
* update replacing the last.
|
|
189
|
+
*/
|
|
190
|
+
export function mergeToolMetadata(current, incoming) {
|
|
191
|
+
if (!incoming)
|
|
192
|
+
return current;
|
|
193
|
+
if (current?.kind !== "subagent" || incoming.kind !== "subagent") {
|
|
194
|
+
return incoming;
|
|
195
|
+
}
|
|
196
|
+
const currentSubagents = Array.isArray(current.subagents) ? current.subagents : [];
|
|
197
|
+
const incomingSubagents = Array.isArray(incoming.subagents) ? incoming.subagents : [];
|
|
198
|
+
const byId = new Map();
|
|
199
|
+
for (const item of currentSubagents) {
|
|
200
|
+
const subAgentId = typeof item === "object" && item !== null && "subAgentId" in item
|
|
201
|
+
? String(item.subAgentId)
|
|
202
|
+
: "";
|
|
203
|
+
byId.set(subAgentId || `current:${byId.size}`, item);
|
|
204
|
+
}
|
|
205
|
+
for (const item of incomingSubagents) {
|
|
206
|
+
const subAgentId = typeof item === "object" && item !== null && "subAgentId" in item
|
|
207
|
+
? String(item.subAgentId)
|
|
208
|
+
: "";
|
|
209
|
+
byId.set(subAgentId || `incoming:${byId.size}`, item);
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
...current,
|
|
213
|
+
...incoming,
|
|
214
|
+
subagents: [...byId.values()],
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Applies a subagent tool_update whose launching call has already settled out
|
|
219
|
+
* of the streaming round. Children keep reporting against the launching
|
|
220
|
+
* spawn_agent / run_workflow call id across later rounds (e.g. while a
|
|
221
|
+
* wait_workflow blocks), so the update is merged into that entry by id — which
|
|
222
|
+
* absorbs members a workflow spawned after commit — and then projected onto
|
|
223
|
+
* every echo referencing the same members. The settled transcript is the only
|
|
224
|
+
* data source; the live tail never carries synthetic tool rows.
|
|
225
|
+
*/
|
|
226
|
+
export function applySubagentUpdateToMessages(messages, update) {
|
|
227
|
+
if (update.metadata?.kind !== "subagent")
|
|
228
|
+
return messages;
|
|
229
|
+
const byId = mapTranscriptTools(messages, (tool) => {
|
|
230
|
+
if (tool.id !== update.id)
|
|
231
|
+
return tool;
|
|
232
|
+
const metadata = mergeToolMetadata(tool.metadata, update.metadata);
|
|
233
|
+
if (!metadata || metadata === tool.metadata)
|
|
234
|
+
return tool;
|
|
235
|
+
// Per-child updates carry no mode; keep them grouped under the launching
|
|
236
|
+
// workflow call rather than falling back to one single-agent group each.
|
|
237
|
+
if (update.name === "run_workflow" && metadata.mode === undefined)
|
|
238
|
+
metadata.mode = "workflow";
|
|
239
|
+
return { ...tool, metadata };
|
|
240
|
+
});
|
|
241
|
+
return mergeSubagentSnapshotsIntoMessages(byId, update.metadata);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Collects every spawned subagent from the live transcript + streaming tools,
|
|
245
|
+
* grouped by their originating tool call, for the inspector. Pure.
|
|
246
|
+
*
|
|
247
|
+
* The same subagent is echoed by MULTIPLE lifecycle tool calls — its spawn_agent
|
|
248
|
+
* (a stale snapshot) plus every wait_agent/list_agents that observed it (later
|
|
249
|
+
* snapshots), all carrying metadata.subagents (agent-lifecycle formatLifecycleResult).
|
|
250
|
+
* So we dedupe by subAgentId, keep the freshest snapshot, group team/batch members
|
|
251
|
+
* by their originating tool call, and collapse a single agent's many lifecycle
|
|
252
|
+
* echoes into one "single" group keyed by the agent itself.
|
|
253
|
+
*/
|
|
254
|
+
export function collectSubagentGroups(messages, streamingTools) {
|
|
255
|
+
const toolCalls = [];
|
|
256
|
+
const ingest = (tcs) => {
|
|
257
|
+
if (!tcs)
|
|
258
|
+
return;
|
|
259
|
+
for (const tc of tcs)
|
|
260
|
+
if (tc.metadata?.kind === "subagent")
|
|
261
|
+
toolCalls.push(tc);
|
|
262
|
+
};
|
|
263
|
+
for (const message of messages) {
|
|
264
|
+
ingest(message.toolCalls);
|
|
265
|
+
if (message.parts) {
|
|
266
|
+
for (const part of message.parts) {
|
|
267
|
+
if (part.type === "tools")
|
|
268
|
+
ingest(part.toolCalls);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
ingest(streamingTools);
|
|
273
|
+
const freshest = new Map();
|
|
274
|
+
const memberToGroup = new Map();
|
|
275
|
+
const groups = new Map();
|
|
276
|
+
let order = 0;
|
|
277
|
+
for (const tc of toolCalls) {
|
|
278
|
+
const rawMembers = Array.isArray(tc.metadata?.subagents) ? tc.metadata.subagents : [];
|
|
279
|
+
const members = rawMembers.filter((m) => typeof m === "object" && m !== null);
|
|
280
|
+
if (members.length === 0)
|
|
281
|
+
continue;
|
|
282
|
+
// Track the freshest snapshot seen for each subagent.
|
|
283
|
+
for (const m of members) {
|
|
284
|
+
const key = memberKey(m);
|
|
285
|
+
const prev = freshest.get(key);
|
|
286
|
+
if (!prev || subagentFreshness(m) >= subagentFreshness(prev))
|
|
287
|
+
freshest.set(key, m);
|
|
288
|
+
}
|
|
289
|
+
const mode = tc.metadata.mode;
|
|
290
|
+
if (mode === "team" || mode === "batch" || mode === "workflow") {
|
|
291
|
+
// A team/batch/workflow tool call is the canonical group for its members.
|
|
292
|
+
const groupKey = tc.id;
|
|
293
|
+
if (!groups.has(groupKey)) {
|
|
294
|
+
const description = typeof tc.args?.description === "string" ? tc.args.description.trim()
|
|
295
|
+
: typeof tc.args?.title === "string" ? tc.args.title.trim() : "";
|
|
296
|
+
const metadataRunId = typeof tc.metadata?.runId === "string" ? tc.metadata.runId : undefined;
|
|
297
|
+
const memberRunId = typeof members[0]?.subAgentId === "string"
|
|
298
|
+
? (typeof members[0].runId === "string" ? String(members[0].runId) : undefined)
|
|
299
|
+
: undefined;
|
|
300
|
+
groups.set(groupKey, { kind: mode, label: description || mode, runId: metadataRunId ?? memberRunId, memberKeys: [], order: order++ });
|
|
301
|
+
}
|
|
302
|
+
const group = groups.get(groupKey);
|
|
303
|
+
for (const m of members) {
|
|
304
|
+
const key = memberKey(m);
|
|
305
|
+
if (!memberToGroup.has(key)) {
|
|
306
|
+
memberToGroup.set(key, groupKey);
|
|
307
|
+
group.memberKeys.push(key);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
// Lifecycle echo (spawn/wait/list/...): one "single" group per agent,
|
|
313
|
+
// collapsing all its echoes; skip any already claimed by a team/batch.
|
|
314
|
+
for (const m of members) {
|
|
315
|
+
const key = memberKey(m);
|
|
316
|
+
if (memberToGroup.has(key))
|
|
317
|
+
continue;
|
|
318
|
+
const groupKey = `single:${key}`;
|
|
319
|
+
memberToGroup.set(key, groupKey);
|
|
320
|
+
groups.set(groupKey, { kind: "single", label: m.nickname ?? m.task ?? "subagent", runId: typeof m.runId === "string" ? String(m.runId) : undefined, memberKeys: [key], order: order++ });
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return [...groups.entries()]
|
|
325
|
+
.sort((a, b) => a[1].order - b[1].order)
|
|
326
|
+
.map(([id, g]) => ({
|
|
327
|
+
id,
|
|
328
|
+
kind: g.kind,
|
|
329
|
+
label: g.label,
|
|
330
|
+
runId: g.runId,
|
|
331
|
+
members: g.memberKeys.map((k) => freshest.get(k)).filter((m) => !!m),
|
|
332
|
+
}))
|
|
333
|
+
// A group can end up empty when a later echo of the same run (e.g. the
|
|
334
|
+
// wait_workflow result vs the live accumulator) claimed all its members.
|
|
335
|
+
.filter((group) => group.members.length > 0);
|
|
336
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SubmitPayload } from "./composer-types.js";
|
|
2
|
+
export type StartingSubmitDecision = "accept" | "ignore" | "queue";
|
|
3
|
+
export declare function submitPayloadFingerprint(payload: SubmitPayload): string;
|
|
4
|
+
export declare function decideStartingSubmit(activeFingerprint: string | null, payload: SubmitPayload): StartingSubmitDecision;
|
|
5
|
+
export declare function decideStartingSubmitFingerprint(activeFingerprint: string | null, submitFingerprint: string): StartingSubmitDecision;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
function hashValue(value) {
|
|
3
|
+
return createHash("sha256").update(value).digest("hex");
|
|
4
|
+
}
|
|
5
|
+
export function submitPayloadFingerprint(payload) {
|
|
6
|
+
return JSON.stringify({
|
|
7
|
+
text: payload.text,
|
|
8
|
+
displayText: payload.displayText ?? "",
|
|
9
|
+
images: payload.images.map((image) => ({
|
|
10
|
+
mediaType: image.mediaType,
|
|
11
|
+
bytes: image.bytes,
|
|
12
|
+
filename: image.filename ?? "",
|
|
13
|
+
sourcePath: image.sourcePath ?? "",
|
|
14
|
+
dataUrlHash: hashValue(image.dataUrl),
|
|
15
|
+
})),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function decideStartingSubmit(activeFingerprint, payload) {
|
|
19
|
+
return decideStartingSubmitFingerprint(activeFingerprint, submitPayloadFingerprint(payload));
|
|
20
|
+
}
|
|
21
|
+
export function decideStartingSubmitFingerprint(activeFingerprint, submitFingerprint) {
|
|
22
|
+
if (!activeFingerprint)
|
|
23
|
+
return "accept";
|
|
24
|
+
return activeFingerprint === submitFingerprint ? "ignore" : "queue";
|
|
25
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synchronized-output wrapper (CSI ?2026, "sync updates").
|
|
3
|
+
*
|
|
4
|
+
* Every frame Ink writes gets bracketed in begin/end synchronized-output so
|
|
5
|
+
* the terminal composites it atomically instead of painting mid-erase state —
|
|
6
|
+
* the primary source of visible flicker during streaming. This is exactly
|
|
7
|
+
* what pi's main-screen renderer does per paint batch; alt-screen is NOT
|
|
8
|
+
* required for it.
|
|
9
|
+
*
|
|
10
|
+
* Terminals that don't implement mode 2026 ignore unknown DEC private modes,
|
|
11
|
+
* so emitting unconditionally is safe; BUBBLE_NO_SYNC_OUTPUT=1 is the escape
|
|
12
|
+
* hatch for anything that misbehaves. Only string chunks are bracketed —
|
|
13
|
+
* Ink writes frames as strings; binary writes pass through untouched.
|
|
14
|
+
*/
|
|
15
|
+
export declare const BEGIN_SYNC = "\u001B[?2026h";
|
|
16
|
+
export declare const END_SYNC = "\u001B[?2026l";
|
|
17
|
+
export declare function wrapSynchronizedOutput(stream: NodeJS.WriteStream): NodeJS.WriteStream;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synchronized-output wrapper (CSI ?2026, "sync updates").
|
|
3
|
+
*
|
|
4
|
+
* Every frame Ink writes gets bracketed in begin/end synchronized-output so
|
|
5
|
+
* the terminal composites it atomically instead of painting mid-erase state —
|
|
6
|
+
* the primary source of visible flicker during streaming. This is exactly
|
|
7
|
+
* what pi's main-screen renderer does per paint batch; alt-screen is NOT
|
|
8
|
+
* required for it.
|
|
9
|
+
*
|
|
10
|
+
* Terminals that don't implement mode 2026 ignore unknown DEC private modes,
|
|
11
|
+
* so emitting unconditionally is safe; BUBBLE_NO_SYNC_OUTPUT=1 is the escape
|
|
12
|
+
* hatch for anything that misbehaves. Only string chunks are bracketed —
|
|
13
|
+
* Ink writes frames as strings; binary writes pass through untouched.
|
|
14
|
+
*/
|
|
15
|
+
export const BEGIN_SYNC = "\x1b[?2026h";
|
|
16
|
+
export const END_SYNC = "\x1b[?2026l";
|
|
17
|
+
export function wrapSynchronizedOutput(stream) {
|
|
18
|
+
if (!stream.isTTY || process.env.BUBBLE_NO_SYNC_OUTPUT === "1")
|
|
19
|
+
return stream;
|
|
20
|
+
return new Proxy(stream, {
|
|
21
|
+
get(target, prop) {
|
|
22
|
+
if (prop === "write") {
|
|
23
|
+
return (chunk, ...rest) => typeof chunk === "string" && chunk.length > 0
|
|
24
|
+
? target.write(BEGIN_SYNC + chunk + END_SYNC, ...rest)
|
|
25
|
+
: target.write(chunk, ...rest);
|
|
26
|
+
}
|
|
27
|
+
const value = Reflect.get(target, prop, target);
|
|
28
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
29
|
+
},
|
|
30
|
+
set(target, prop, value) {
|
|
31
|
+
Reflect.set(target, prop, value);
|
|
32
|
+
return true;
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background task lifecycle projection for the transcript.
|
|
3
|
+
*
|
|
4
|
+
* A `bash run_in_background` call settles as soon as the process is spawned,
|
|
5
|
+
* leaving a "Task started" row in the trace. When the task later finishes,
|
|
6
|
+
* its terminal state (completed / failed / killed, exit code, duration,
|
|
7
|
+
* output tail) is landed on that same launch row by task id, so the reader
|
|
8
|
+
* sees the outcome where the command was issued rather than as a detached
|
|
9
|
+
* row appended after the assistant's answer.
|
|
10
|
+
*
|
|
11
|
+
* A synthetic terminal row is only produced when no launch row exists (the
|
|
12
|
+
* transcript was cleared, or the task was started outside this transcript).
|
|
13
|
+
*/
|
|
14
|
+
import type { BackgroundTaskInfo } from "../../tasks/manager.js";
|
|
15
|
+
import { type DisplayMessage, type DisplayToolCall } from "./display-history.js";
|
|
16
|
+
/**
|
|
17
|
+
* Occurrence for a restored terminal marker whose task_started marker is not
|
|
18
|
+
* in the retained log (the task was launched before a conversation_clear).
|
|
19
|
+
* It must never land on a later launch that happens to reuse the task id.
|
|
20
|
+
*/
|
|
21
|
+
export declare const UNMATCHED_LAUNCH = -1;
|
|
22
|
+
export interface TaskLifecycleTerminal {
|
|
23
|
+
task: BackgroundTaskInfo;
|
|
24
|
+
output?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Which launch of this task id the terminal state belongs to (0-based, in
|
|
27
|
+
* transcript order), or UNMATCHED_LAUNCH. Task ids restart at task_0001 in
|
|
28
|
+
* every process, so a resumed session can hold several launches sharing
|
|
29
|
+
* one id; persisted markers carry their launch order. Omitted for live
|
|
30
|
+
* completions, which always belong to the newest launch not settled yet.
|
|
31
|
+
*/
|
|
32
|
+
occurrence?: number;
|
|
33
|
+
}
|
|
34
|
+
/** Returns a copy of `tool` carrying the task's terminal state. */
|
|
35
|
+
export declare function applyTaskLifecycleToTool(tool: DisplayToolCall, task: BackgroundTaskInfo, output?: string): DisplayToolCall;
|
|
36
|
+
/**
|
|
37
|
+
* Lands the terminal state on a launch row that is still in the streaming
|
|
38
|
+
* accumulator. Mutates in place because the accumulator's parts share the
|
|
39
|
+
* same tool objects. A row whose tool_end has not arrived yet is skipped:
|
|
40
|
+
* the reducer would overwrite the merge when the result lands.
|
|
41
|
+
*/
|
|
42
|
+
export declare function mergeTaskLifecycleIntoLiveTools(tools: DisplayToolCall[], task: BackgroundTaskInfo, output?: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Lands the terminal state on exactly one committed launch row: the given
|
|
45
|
+
* launch occurrence, or (for live completions) the newest one still open.
|
|
46
|
+
*/
|
|
47
|
+
export declare function applyTaskLifecycleToMessages(messages: DisplayMessage[], task: BackgroundTaskInfo, output?: string, occurrence?: number): {
|
|
48
|
+
messages: DisplayMessage[];
|
|
49
|
+
merged: boolean;
|
|
50
|
+
};
|
|
51
|
+
/** Detached terminal row for a task whose launch row is not in the transcript. */
|
|
52
|
+
export declare function taskLifecycleDisplayMessage(task: BackgroundTaskInfo, output?: string): DisplayMessage;
|
|
53
|
+
/**
|
|
54
|
+
* Lands every terminal state on its launch row; tasks without one get a
|
|
55
|
+
* detached row appended in the given order.
|
|
56
|
+
*/
|
|
57
|
+
export declare function landTaskLifecycles(messages: DisplayMessage[], terminals: TaskLifecycleTerminal[]): DisplayMessage[];
|