@bubblebrain-ai/bubble 0.0.63 → 0.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +437 -11
- package/dist/agent/abort-errors.d.ts +18 -0
- package/dist/agent/abort-errors.js +51 -0
- package/dist/agent/budget-ledger.d.ts +20 -0
- package/dist/agent/budget-ledger.js +45 -0
- package/dist/agent/categories.d.ts +100 -0
- package/dist/agent/categories.js +203 -0
- package/dist/agent/change-tracker.d.ts +40 -0
- package/dist/agent/change-tracker.js +89 -0
- package/dist/agent/child-runner.d.ts +64 -0
- package/dist/agent/child-runner.js +405 -0
- package/dist/agent/input-controller.d.ts +14 -0
- package/dist/agent/input-controller.js +43 -0
- package/dist/agent/internal-reminder-sanitizer.d.ts +25 -0
- package/dist/agent/internal-reminder-sanitizer.js +297 -0
- package/dist/agent/profiles.d.ts +76 -0
- package/dist/agent/profiles.js +526 -0
- package/dist/agent/provider-fingerprint.d.ts +6 -0
- package/dist/agent/provider-fingerprint.js +89 -0
- package/dist/agent/resident-history.d.ts +7 -0
- package/dist/agent/resident-history.js +61 -0
- package/dist/agent/result-integrator.d.ts +22 -0
- package/dist/agent/result-integrator.js +50 -0
- package/dist/agent/routing-catalog.d.ts +131 -0
- package/dist/agent/routing-catalog.js +260 -0
- package/dist/agent/structured-output.d.ts +37 -0
- package/dist/agent/structured-output.js +193 -0
- package/dist/agent/subagent/router.d.ts +65 -0
- package/dist/agent/subagent/router.js +203 -0
- package/dist/agent/subagent/runtime.d.ts +235 -0
- package/dist/agent/subagent/runtime.js +835 -0
- package/dist/agent/subagent-control.d.ts +100 -0
- package/dist/agent/subagent-control.js +70 -0
- package/dist/agent/subagent-lifecycle-reminder.d.ts +3 -0
- package/dist/agent/subagent-lifecycle-reminder.js +112 -0
- package/dist/agent/subagent-route-format.d.ts +8 -0
- package/dist/agent/subagent-route-format.js +18 -0
- package/dist/agent/subagent-scheduler.d.ts +105 -0
- package/dist/agent/subagent-scheduler.js +287 -0
- package/dist/agent/subagent-store.d.ts +57 -0
- package/dist/agent/subagent-store.js +180 -0
- package/dist/agent/subagent-summary.d.ts +30 -0
- package/dist/agent/subagent-summary.js +74 -0
- package/dist/agent/subagent-wait-guidance.d.ts +2 -0
- package/dist/agent/subagent-wait-guidance.js +8 -0
- package/dist/agent/subtask-policy.d.ts +13 -0
- package/dist/agent/subtask-policy.js +56 -0
- package/dist/agent/task-lifecycle-reminder.d.ts +26 -0
- package/dist/agent/task-lifecycle-reminder.js +59 -0
- package/dist/agent/tool-intent.d.ts +45 -0
- package/dist/agent/tool-intent.js +318 -0
- package/dist/agent/tool-visibility.d.ts +10 -0
- package/dist/agent/tool-visibility.js +6 -0
- package/dist/agent/transcript-helpers.d.ts +20 -0
- package/dist/agent/transcript-helpers.js +63 -0
- package/dist/agent/update-queue.d.ts +13 -0
- package/dist/agent/update-queue.js +69 -0
- package/dist/agent/workflow/control.d.ts +60 -0
- package/dist/agent/workflow/control.js +62 -0
- package/dist/agent/workflow/errors.d.ts +16 -0
- package/dist/agent/workflow/errors.js +24 -0
- package/dist/agent/workflow/runs.d.ts +73 -0
- package/dist/agent/workflow/runs.js +160 -0
- package/dist/agent/workflow/runtime.d.ts +88 -0
- package/dist/agent/workflow/runtime.js +319 -0
- package/dist/agent/worktree.d.ts +29 -0
- package/dist/agent/worktree.js +73 -0
- package/dist/agent.d.ts +460 -0
- package/dist/agent.js +2210 -0
- package/dist/anthropic-thinking.d.ts +4 -0
- package/dist/anthropic-thinking.js +11 -0
- package/dist/approval/controller.d.ts +71 -0
- package/dist/approval/controller.js +286 -0
- package/dist/approval/danger.d.ts +13 -0
- package/dist/approval/danger.js +55 -0
- package/dist/approval/diff-hunks.d.ts +12 -0
- package/dist/approval/diff-hunks.js +32 -0
- package/dist/approval/protected-paths.d.ts +1 -0
- package/dist/approval/protected-paths.js +35 -0
- package/dist/approval/session-cache.d.ts +21 -0
- package/dist/approval/session-cache.js +38 -0
- package/dist/approval/tool-helper.d.ts +14 -0
- package/dist/approval/tool-helper.js +47 -0
- package/dist/approval/types.d.ts +146 -0
- package/dist/approval/types.js +8 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +3 -0
- package/dist/bubble-home.d.ts +8 -0
- package/dist/bubble-home.js +19 -0
- package/dist/checkpoints.d.ts +57 -0
- package/dist/checkpoints.js +0 -0
- package/dist/cli.d.ts +37 -0
- package/dist/cli.js +175 -0
- package/dist/clipboard.d.ts +14 -0
- package/dist/clipboard.js +132 -0
- package/dist/config.d.ts +96 -0
- package/dist/config.js +287 -0
- package/dist/context/budget.d.ts +28 -0
- package/dist/context/budget.js +130 -0
- package/dist/context/checkpoint.d.ts +18 -0
- package/dist/context/checkpoint.js +117 -0
- package/dist/context/compact-llm.d.ts +25 -0
- package/dist/context/compact-llm.js +175 -0
- package/dist/context/compact.d.ts +124 -0
- package/dist/context/compact.js +635 -0
- package/dist/context/compaction-files.d.ts +44 -0
- package/dist/context/compaction-files.js +148 -0
- package/dist/context/llm-compactor.d.ts +53 -0
- package/dist/context/llm-compactor.js +424 -0
- package/dist/context/overflow.d.ts +9 -0
- package/dist/context/overflow.js +50 -0
- package/dist/context/projector.d.ts +34 -0
- package/dist/context/projector.js +251 -0
- package/dist/context/prune.d.ts +26 -0
- package/dist/context/prune.js +171 -0
- package/dist/context/session-write-lock.d.ts +20 -0
- package/dist/context/session-write-lock.js +162 -0
- package/dist/context/token-estimator.d.ts +14 -0
- package/dist/context/token-estimator.js +106 -0
- package/dist/context/tool-images.d.ts +3 -0
- package/dist/context/tool-images.js +35 -0
- package/dist/context/tool-output-truncate.d.ts +24 -0
- package/dist/context/tool-output-truncate.js +181 -0
- package/dist/context/usage.d.ts +34 -0
- package/dist/context/usage.js +230 -0
- package/dist/debug-trace.d.ts +27 -0
- package/dist/debug-trace.js +401 -0
- package/dist/diff-stats.d.ts +5 -0
- package/dist/diff-stats.js +21 -0
- package/dist/external-runtime/grok-acp.d.ts +56 -0
- package/dist/external-runtime/grok-acp.js +386 -0
- package/dist/external-runtime/grok-binary.d.ts +25 -0
- package/dist/external-runtime/grok-binary.js +108 -0
- package/dist/external-runtime/grok-errors.d.ts +7 -0
- package/dist/external-runtime/grok-errors.js +15 -0
- package/dist/external-runtime/grok-input-policy.d.ts +58 -0
- package/dist/external-runtime/grok-input-policy.js +52 -0
- package/dist/external-runtime/grok-ndjson.d.ts +14 -0
- package/dist/external-runtime/grok-ndjson.js +193 -0
- package/dist/external-runtime/grok-network.d.ts +15 -0
- package/dist/external-runtime/grok-network.js +81 -0
- package/dist/external-runtime/grok-preflight.d.ts +28 -0
- package/dist/external-runtime/grok-preflight.js +194 -0
- package/dist/external-runtime/grok-process.d.ts +26 -0
- package/dist/external-runtime/grok-process.js +184 -0
- package/dist/external-runtime/grok-profile.d.ts +32 -0
- package/dist/external-runtime/grok-profile.js +419 -0
- package/dist/external-runtime/grok-provider.d.ts +31 -0
- package/dist/external-runtime/grok-provider.js +41 -0
- package/dist/external-runtime/grok-runtime.d.ts +91 -0
- package/dist/external-runtime/grok-runtime.js +882 -0
- package/dist/external-runtime/index.d.ts +13 -0
- package/dist/external-runtime/index.js +13 -0
- package/dist/external-runtime/session-policy.d.ts +11 -0
- package/dist/external-runtime/session-policy.js +30 -0
- package/dist/external-runtime/types.d.ts +65 -0
- package/dist/external-runtime/types.js +1 -0
- package/dist/feedback/collect.d.ts +7 -0
- package/dist/feedback/collect.js +119 -0
- package/dist/feedback/config.d.ts +14 -0
- package/dist/feedback/config.js +16 -0
- package/dist/feedback/redact.d.ts +1 -0
- package/dist/feedback/redact.js +25 -0
- package/dist/feedback/submit.d.ts +6 -0
- package/dist/feedback/submit.js +43 -0
- package/dist/feedback/types.d.ts +22 -0
- package/dist/feedback/types.js +1 -0
- package/dist/feishu/agent-host/approval-card.d.ts +11 -0
- package/dist/feishu/agent-host/approval-card.js +85 -0
- package/dist/feishu/agent-host/approval-ui.d.ts +59 -0
- package/dist/feishu/agent-host/approval-ui.js +214 -0
- package/dist/feishu/agent-host/run-driver.d.ts +51 -0
- package/dist/feishu/agent-host/run-driver.js +397 -0
- package/dist/feishu/agent-host/runtime-deps.d.ts +33 -0
- package/dist/feishu/agent-host/runtime-deps.js +8 -0
- package/dist/feishu/card/budget.d.ts +40 -0
- package/dist/feishu/card/budget.js +134 -0
- package/dist/feishu/card/renderer.d.ts +29 -0
- package/dist/feishu/card/renderer.js +245 -0
- package/dist/feishu/card/run-state-types.d.ts +49 -0
- package/dist/feishu/card/run-state-types.js +15 -0
- package/dist/feishu/card/run-state.d.ts +21 -0
- package/dist/feishu/card/run-state.js +223 -0
- package/dist/feishu/channel/channel.d.ts +52 -0
- package/dist/feishu/channel/channel.js +74 -0
- package/dist/feishu/config.d.ts +24 -0
- package/dist/feishu/config.js +97 -0
- package/dist/feishu/format.d.ts +6 -0
- package/dist/feishu/format.js +14 -0
- package/dist/feishu/index.d.ts +4 -0
- package/dist/feishu/index.js +4 -0
- package/dist/feishu/logger.d.ts +31 -0
- package/dist/feishu/logger.js +62 -0
- package/dist/feishu/paths.d.ts +12 -0
- package/dist/feishu/paths.js +38 -0
- package/dist/feishu/process-registry.d.ts +29 -0
- package/dist/feishu/process-registry.js +90 -0
- package/dist/feishu/router/commands.d.ts +38 -0
- package/dist/feishu/router/commands.js +286 -0
- package/dist/feishu/router/event-router.d.ts +40 -0
- package/dist/feishu/router/event-router.js +208 -0
- package/dist/feishu/router/whitelist.d.ts +23 -0
- package/dist/feishu/router/whitelist.js +20 -0
- package/dist/feishu/runtime/active-runs.d.ts +32 -0
- package/dist/feishu/runtime/active-runs.js +84 -0
- package/dist/feishu/runtime/pending-queue.d.ts +36 -0
- package/dist/feishu/runtime/pending-queue.js +98 -0
- package/dist/feishu/runtime/process-pool.d.ts +29 -0
- package/dist/feishu/runtime/process-pool.js +49 -0
- package/dist/feishu/schema.d.ts +17 -0
- package/dist/feishu/schema.js +252 -0
- package/dist/feishu/scope/scope-registry.d.ts +39 -0
- package/dist/feishu/scope/scope-registry.js +148 -0
- package/dist/feishu/scope/session-binder.d.ts +44 -0
- package/dist/feishu/scope/session-binder.js +100 -0
- package/dist/feishu/scope/session-store.d.ts +24 -0
- package/dist/feishu/scope/session-store.js +73 -0
- package/dist/feishu/secrets.d.ts +37 -0
- package/dist/feishu/secrets.js +129 -0
- package/dist/feishu/serve.d.ts +12 -0
- package/dist/feishu/serve.js +302 -0
- package/dist/feishu/types.d.ts +75 -0
- package/dist/feishu/types.js +23 -0
- package/dist/feishu/wizard.d.ts +24 -0
- package/dist/feishu/wizard.js +121 -0
- package/dist/goal/command.d.ts +20 -0
- package/dist/goal/command.js +76 -0
- package/dist/goal/engine.d.ts +33 -0
- package/dist/goal/engine.js +65 -0
- package/dist/goal/format.d.ts +18 -0
- package/dist/goal/format.js +112 -0
- package/dist/goal/prompts.d.ts +13 -0
- package/dist/goal/prompts.js +84 -0
- package/dist/goal/store.d.ts +64 -0
- package/dist/goal/store.js +174 -0
- package/dist/goal/tools.d.ts +13 -0
- package/dist/goal/tools.js +67 -0
- package/dist/goal/usage.d.ts +2 -0
- package/dist/goal/usage.js +3 -0
- package/dist/hooks/config.d.ts +9 -0
- package/dist/hooks/config.js +278 -0
- package/dist/hooks/controller.d.ts +24 -0
- package/dist/hooks/controller.js +254 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/log.d.ts +14 -0
- package/dist/hooks/log.js +54 -0
- package/dist/hooks/runner.d.ts +5 -0
- package/dist/hooks/runner.js +225 -0
- package/dist/hooks/trust.d.ts +37 -0
- package/dist/hooks/trust.js +143 -0
- package/dist/hooks/types.d.ts +173 -0
- package/dist/hooks/types.js +46 -0
- package/dist/loop/engine.d.ts +29 -0
- package/dist/loop/engine.js +63 -0
- package/dist/lsp/config.d.ts +18 -0
- package/dist/lsp/config.js +58 -0
- package/dist/lsp/diagnostics.d.ts +24 -0
- package/dist/lsp/diagnostics.js +103 -0
- package/dist/lsp/index.d.ts +3 -0
- package/dist/lsp/index.js +3 -0
- package/dist/lsp/service.d.ts +97 -0
- package/dist/lsp/service.js +815 -0
- package/dist/main.d.ts +5 -0
- package/dist/main.js +984 -0
- package/dist/mcp/client.d.ts +68 -0
- package/dist/mcp/client.js +177 -0
- package/dist/mcp/config.d.ts +30 -0
- package/dist/mcp/config.js +144 -0
- package/dist/mcp/manager.d.ts +67 -0
- package/dist/mcp/manager.js +328 -0
- package/dist/mcp/name.d.ts +26 -0
- package/dist/mcp/name.js +40 -0
- package/dist/mcp/transports.d.ts +54 -0
- package/dist/mcp/transports.js +267 -0
- package/dist/mcp/types.d.ts +111 -0
- package/dist/mcp/types.js +14 -0
- package/dist/memory/db.d.ts +65 -0
- package/dist/memory/db.js +332 -0
- package/dist/memory/index.d.ts +10 -0
- package/dist/memory/index.js +10 -0
- package/dist/memory/paths.d.ts +18 -0
- package/dist/memory/paths.js +38 -0
- package/dist/memory/phase1.d.ts +23 -0
- package/dist/memory/phase1.js +292 -0
- package/dist/memory/phase2.d.ts +19 -0
- package/dist/memory/phase2.js +119 -0
- package/dist/memory/prompts.d.ts +19 -0
- package/dist/memory/prompts.js +104 -0
- package/dist/memory/reset.d.ts +1 -0
- package/dist/memory/reset.js +13 -0
- package/dist/memory/session-policy.d.ts +25 -0
- package/dist/memory/session-policy.js +55 -0
- package/dist/memory/start.d.ts +24 -0
- package/dist/memory/start.js +50 -0
- package/dist/memory/storage.d.ts +11 -0
- package/dist/memory/storage.js +95 -0
- package/dist/memory/store.d.ts +43 -0
- package/dist/memory/store.js +193 -0
- package/dist/memory/usage.d.ts +1 -0
- package/dist/memory/usage.js +38 -0
- package/dist/model-catalog.d.ts +65 -0
- package/dist/model-catalog.js +399 -0
- package/dist/model-config.d.ts +40 -0
- package/dist/model-config.js +74 -0
- package/dist/model-data.generated.d.ts +16 -0
- package/dist/model-data.generated.js +275 -0
- package/dist/model-pricing.d.ts +54 -0
- package/dist/model-pricing.js +256 -0
- package/dist/model-selection.d.ts +7 -0
- package/dist/model-selection.js +18 -0
- package/dist/network/chatgpt-transport.d.ts +16 -0
- package/dist/network/chatgpt-transport.js +232 -0
- package/dist/network/errors.d.ts +47 -0
- package/dist/network/errors.js +48 -0
- package/dist/network/provider-transport-log.d.ts +12 -0
- package/dist/network/provider-transport-log.js +32 -0
- package/dist/network/provider-transport.d.ts +37 -0
- package/dist/network/provider-transport.js +256 -0
- package/dist/network/retry.d.ts +34 -0
- package/dist/network/retry.js +97 -0
- package/dist/network/system-proxy.d.ts +18 -0
- package/dist/network/system-proxy.js +175 -0
- package/dist/oauth/grok.d.ts +26 -0
- package/dist/oauth/grok.js +251 -0
- package/dist/oauth/index.d.ts +4 -0
- package/dist/oauth/index.js +3 -0
- package/dist/oauth/openai-codex.d.ts +15 -0
- package/dist/oauth/openai-codex.js +193 -0
- package/dist/oauth/refresh-control.d.ts +12 -0
- package/dist/oauth/refresh-control.js +42 -0
- package/dist/oauth/storage.d.ts +88 -0
- package/dist/oauth/storage.js +357 -0
- package/dist/oauth/types.d.ts +15 -0
- package/dist/oauth/types.js +1 -0
- package/dist/orchestrator/default-hooks.d.ts +22 -0
- package/dist/orchestrator/default-hooks.js +127 -0
- package/dist/orchestrator/hooks.d.ts +69 -0
- package/dist/orchestrator/hooks.js +52 -0
- package/dist/permission/mode.d.ts +19 -0
- package/dist/permission/mode.js +16 -0
- package/dist/permissions/rule.d.ts +42 -0
- package/dist/permissions/rule.js +293 -0
- package/dist/permissions/settings.d.ts +97 -0
- package/dist/permissions/settings.js +289 -0
- package/dist/permissions/shell-command.d.ts +36 -0
- package/dist/permissions/shell-command.js +226 -0
- package/dist/permissions/trust-prompt.d.ts +10 -0
- package/dist/permissions/trust-prompt.js +34 -0
- package/dist/permissions/trust.d.ts +26 -0
- package/dist/permissions/trust.js +113 -0
- package/dist/permissions/types.d.ts +61 -0
- package/dist/permissions/types.js +14 -0
- package/dist/print-output.d.ts +98 -0
- package/dist/print-output.js +117 -0
- package/dist/prompt/compose.d.ts +19 -0
- package/dist/prompt/compose.js +110 -0
- package/dist/prompt/delegation.d.ts +14 -0
- package/dist/prompt/delegation.js +100 -0
- package/dist/prompt/environment.d.ts +12 -0
- package/dist/prompt/environment.js +55 -0
- package/dist/prompt/provider-prompts/anthropic.d.ts +1 -0
- package/dist/prompt/provider-prompts/anthropic.js +5 -0
- package/dist/prompt/provider-prompts/codex.d.ts +1 -0
- package/dist/prompt/provider-prompts/codex.js +5 -0
- package/dist/prompt/provider-prompts/deepseek.d.ts +1 -0
- package/dist/prompt/provider-prompts/deepseek.js +7 -0
- package/dist/prompt/provider-prompts/default.d.ts +1 -0
- package/dist/prompt/provider-prompts/default.js +6 -0
- package/dist/prompt/provider-prompts/gemini.d.ts +1 -0
- package/dist/prompt/provider-prompts/gemini.js +5 -0
- package/dist/prompt/provider-prompts/glm.d.ts +1 -0
- package/dist/prompt/provider-prompts/glm.js +7 -0
- package/dist/prompt/provider-prompts/gpt.d.ts +1 -0
- package/dist/prompt/provider-prompts/gpt.js +5 -0
- package/dist/prompt/provider-prompts/kimi.d.ts +1 -0
- package/dist/prompt/provider-prompts/kimi.js +8 -0
- package/dist/prompt/reminders.d.ts +33 -0
- package/dist/prompt/reminders.js +135 -0
- package/dist/prompt/routing.d.ts +14 -0
- package/dist/prompt/routing.js +71 -0
- package/dist/prompt/runtime.d.ts +12 -0
- package/dist/prompt/runtime.js +40 -0
- package/dist/prompt/task-reminders.d.ts +12 -0
- package/dist/prompt/task-reminders.js +64 -0
- package/dist/provider-ai-sdk.d.ts +59 -0
- package/dist/provider-ai-sdk.js +584 -0
- package/dist/provider-anthropic.d.ts +126 -0
- package/dist/provider-anthropic.js +940 -0
- package/dist/provider-ark-responses.d.ts +29 -0
- package/dist/provider-ark-responses.js +518 -0
- package/dist/provider-artifacts.d.ts +7 -0
- package/dist/provider-artifacts.js +60 -0
- package/dist/provider-error-record.d.ts +43 -0
- package/dist/provider-error-record.js +213 -0
- package/dist/provider-grok.d.ts +50 -0
- package/dist/provider-grok.js +110 -0
- package/dist/provider-model-policy.d.ts +16 -0
- package/dist/provider-model-policy.js +33 -0
- package/dist/provider-openai-codex.d.ts +66 -0
- package/dist/provider-openai-codex.js +781 -0
- package/dist/provider-registry.d.ts +197 -0
- package/dist/provider-registry.js +1194 -0
- package/dist/provider-transform.d.ts +12 -0
- package/dist/provider-transform.js +293 -0
- package/dist/provider-zen-errors.d.ts +9 -0
- package/dist/provider-zen-errors.js +36 -0
- package/dist/provider.d.ts +85 -0
- package/dist/provider.js +925 -0
- package/dist/question/controller.d.ts +22 -0
- package/dist/question/controller.js +98 -0
- package/dist/question/index.d.ts +2 -0
- package/dist/question/index.js +2 -0
- package/dist/question/normalize.d.ts +6 -0
- package/dist/question/normalize.js +11 -0
- package/dist/question/types.d.ts +42 -0
- package/dist/question/types.js +6 -0
- package/dist/reasoning-debug.d.ts +7 -0
- package/dist/reasoning-debug.js +33 -0
- package/dist/rewind.d.ts +20 -0
- package/dist/rewind.js +29 -0
- package/dist/sdk/index.d.ts +319 -0
- package/dist/sdk/index.js +1068 -0
- package/dist/sdk/replay-event-log.d.ts +26 -0
- package/dist/sdk/replay-event-log.js +122 -0
- package/dist/sdk/session-turn-coordinator.d.ts +45 -0
- package/dist/sdk/session-turn-coordinator.js +227 -0
- package/dist/session-context-fence.d.ts +16 -0
- package/dist/session-context-fence.js +26 -0
- package/dist/session-log.d.ts +25 -0
- package/dist/session-log.js +444 -0
- package/dist/session-title.d.ts +16 -0
- package/dist/session-title.js +131 -0
- package/dist/session-types.d.ts +86 -0
- package/dist/session-types.js +1 -0
- package/dist/session.d.ts +135 -0
- package/dist/session.js +664 -0
- package/dist/skills/discovery.d.ts +12 -0
- package/dist/skills/discovery.js +166 -0
- package/dist/skills/format.d.ts +32 -0
- package/dist/skills/format.js +68 -0
- package/dist/skills/frontmatter.d.ts +5 -0
- package/dist/skills/frontmatter.js +60 -0
- package/dist/skills/invocation.d.ts +8 -0
- package/dist/skills/invocation.js +33 -0
- package/dist/skills/registry.d.ts +28 -0
- package/dist/skills/registry.js +79 -0
- package/dist/skills/types.d.ts +34 -0
- package/dist/skills/types.js +1 -0
- package/dist/slash-commands/commands.d.ts +10 -0
- package/dist/slash-commands/commands.js +1251 -0
- package/dist/slash-commands/feishu.d.ts +17 -0
- package/dist/slash-commands/feishu.js +400 -0
- package/dist/slash-commands/index.d.ts +4 -0
- package/dist/slash-commands/index.js +8 -0
- package/dist/slash-commands/registry.d.ts +32 -0
- package/dist/slash-commands/registry.js +73 -0
- package/dist/slash-commands/types.d.ts +109 -0
- package/dist/slash-commands/types.js +1 -0
- package/dist/slash-commands/unified.d.ts +38 -0
- package/dist/slash-commands/unified.js +38 -0
- package/dist/stats/usage.d.ts +59 -0
- package/dist/stats/usage.js +485 -0
- package/dist/stream-json.d.ts +13 -0
- package/dist/stream-json.js +74 -0
- package/dist/system-prompt.d.ts +40 -0
- package/dist/system-prompt.js +7 -0
- package/dist/tasks/manager.d.ts +145 -0
- package/dist/tasks/manager.js +634 -0
- package/dist/tasks/process-utils.d.ts +10 -0
- package/dist/tasks/process-utils.js +49 -0
- package/dist/tasks/promotion.d.ts +17 -0
- package/dist/tasks/promotion.js +30 -0
- package/dist/tasks/wake.d.ts +53 -0
- package/dist/tasks/wake.js +125 -0
- package/dist/text-display.d.ts +3 -0
- package/dist/text-display.js +25 -0
- package/dist/tools/agent-lifecycle.d.ts +30 -0
- package/dist/tools/agent-lifecycle.js +790 -0
- package/dist/tools/bash.d.ts +23 -0
- package/dist/tools/bash.js +443 -0
- package/dist/tools/child-tools.d.ts +41 -0
- package/dist/tools/child-tools.js +122 -0
- package/dist/tools/edit-apply.d.ts +25 -0
- package/dist/tools/edit-apply.js +274 -0
- package/dist/tools/edit.d.ts +18 -0
- package/dist/tools/edit.js +200 -0
- package/dist/tools/exa-mcp.d.ts +3 -0
- package/dist/tools/exa-mcp.js +74 -0
- package/dist/tools/exit-plan-mode.d.ts +22 -0
- package/dist/tools/exit-plan-mode.js +79 -0
- package/dist/tools/file-mutation-queue.d.ts +2 -0
- package/dist/tools/file-mutation-queue.js +43 -0
- package/dist/tools/file-state.d.ts +48 -0
- package/dist/tools/file-state.js +76 -0
- package/dist/tools/grep.d.ts +9 -0
- package/dist/tools/grep.js +387 -0
- package/dist/tools/index.d.ts +63 -0
- package/dist/tools/index.js +76 -0
- package/dist/tools/ls.d.ts +3 -0
- package/dist/tools/ls.js +85 -0
- package/dist/tools/lsp.d.ts +4 -0
- package/dist/tools/lsp.js +95 -0
- package/dist/tools/memory.d.ts +8 -0
- package/dist/tools/memory.js +77 -0
- package/dist/tools/path-utils.d.ts +8 -0
- package/dist/tools/path-utils.js +53 -0
- package/dist/tools/prompt-metadata.d.ts +3 -0
- package/dist/tools/prompt-metadata.js +17 -0
- package/dist/tools/question.d.ts +3 -0
- package/dist/tools/question.js +177 -0
- package/dist/tools/read.d.ts +8 -0
- package/dist/tools/read.js +309 -0
- package/dist/tools/sensitive-paths.d.ts +11 -0
- package/dist/tools/sensitive-paths.js +106 -0
- package/dist/tools/server-manager.d.ts +6 -0
- package/dist/tools/server-manager.js +6 -0
- package/dist/tools/server.d.ts +6 -0
- package/dist/tools/server.js +249 -0
- package/dist/tools/skill-search.d.ts +10 -0
- package/dist/tools/skill-search.js +134 -0
- package/dist/tools/skill.d.ts +7 -0
- package/dist/tools/skill.js +81 -0
- package/dist/tools/task-tools.d.ts +10 -0
- package/dist/tools/task-tools.js +133 -0
- package/dist/tools/tool-search.d.ts +23 -0
- package/dist/tools/tool-search.js +145 -0
- package/dist/tools/web-fetch.d.ts +6 -0
- package/dist/tools/web-fetch.js +76 -0
- package/dist/tools/web-search.d.ts +5 -0
- package/dist/tools/web-search.js +50 -0
- package/dist/tools/write.d.ts +10 -0
- package/dist/tools/write.js +155 -0
- package/dist/tui/animation-clock.d.ts +14 -0
- package/dist/tui/animation-clock.js +34 -0
- package/dist/tui/app.d.ts +176 -0
- package/dist/tui/app.js +1659 -0
- package/dist/tui/components/approval-dialog.d.ts +43 -0
- package/dist/tui/components/approval-dialog.js +212 -0
- package/dist/tui/components/bottom-sheet.d.ts +9 -0
- package/dist/tui/components/bottom-sheet.js +32 -0
- package/dist/tui/components/context-info.d.ts +54 -0
- package/dist/tui/components/context-info.js +388 -0
- package/dist/tui/components/feedback-dialog.d.ts +56 -0
- package/dist/tui/components/feedback-dialog.js +262 -0
- package/dist/tui/components/feishu-setup-dialog.d.ts +65 -0
- package/dist/tui/components/feishu-setup-dialog.js +332 -0
- package/dist/tui/components/image-preview.d.ts +32 -0
- package/dist/tui/components/image-preview.js +130 -0
- package/dist/tui/components/plan-dialog.d.ts +34 -0
- package/dist/tui/components/plan-dialog.js +196 -0
- package/dist/tui/components/provider-key-input.d.ts +18 -0
- package/dist/tui/components/provider-key-input.js +49 -0
- package/dist/tui/components/question-dialog.d.ts +25 -0
- package/dist/tui/components/question-dialog.js +263 -0
- package/dist/tui/components/responsive-transcript.d.ts +31 -0
- package/dist/tui/components/responsive-transcript.js +77 -0
- package/dist/tui/components/rewind-picker.d.ts +62 -0
- package/dist/tui/components/rewind-picker.js +317 -0
- package/dist/tui/components/session-picker.d.ts +49 -0
- package/dist/tui/components/session-picker.js +303 -0
- package/dist/tui/components/skills-panel.d.ts +63 -0
- package/dist/tui/components/skills-panel.js +582 -0
- package/dist/tui/components/stats-panel.d.ts +40 -0
- package/dist/tui/components/stats-panel.js +301 -0
- package/dist/tui/components/streaming-message.d.ts +69 -0
- package/dist/tui/components/streaming-message.js +398 -0
- package/dist/tui/components/subagent-inspector.d.ts +28 -0
- package/dist/tui/components/subagent-inspector.js +127 -0
- package/dist/tui/components/task-inspector.d.ts +26 -0
- package/dist/tui/components/task-inspector.js +70 -0
- package/dist/tui/components/tasks-pane.d.ts +126 -0
- package/dist/tui/components/tasks-pane.js +566 -0
- package/dist/tui/components/transcript.d.ts +103 -0
- package/dist/tui/components/transcript.js +858 -0
- package/dist/tui/components/welcome.d.ts +20 -0
- package/dist/tui/components/welcome.js +133 -0
- package/dist/tui/components/workflow-inspector.d.ts +30 -0
- package/dist/tui/components/workflow-inspector.js +136 -0
- package/dist/tui/composer-autocomplete.d.ts +76 -0
- package/dist/tui/composer-autocomplete.js +465 -0
- package/dist/tui/composer-style.d.ts +7 -0
- package/dist/tui/composer-style.js +29 -0
- package/dist/tui/controller/agent-event-reducer.d.ts +75 -0
- package/dist/tui/controller/agent-event-reducer.js +239 -0
- package/dist/tui/controller/composer-controller.d.ts +95 -0
- package/dist/tui/controller/composer-controller.js +502 -0
- package/dist/tui/controller/controller.d.ts +199 -0
- package/dist/tui/controller/controller.js +1034 -0
- package/dist/tui/controller/effects.d.ts +71 -0
- package/dist/tui/controller/effects.js +1 -0
- package/dist/tui/controller/goal-runtime-controller.d.ts +47 -0
- package/dist/tui/controller/goal-runtime-controller.js +202 -0
- package/dist/tui/controller/input-queue-machine.d.ts +71 -0
- package/dist/tui/controller/input-queue-machine.js +121 -0
- package/dist/tui/controller/intents.d.ts +56 -0
- package/dist/tui/controller/intents.js +6 -0
- package/dist/tui/controller/overlay-controller.d.ts +64 -0
- package/dist/tui/controller/overlay-controller.js +129 -0
- package/dist/tui/controller/ports.d.ts +57 -0
- package/dist/tui/controller/ports.js +9 -0
- package/dist/tui/controller/session-transition.d.ts +54 -0
- package/dist/tui/controller/session-transition.js +68 -0
- package/dist/tui/controller/state.d.ts +14 -0
- package/dist/tui/controller/state.js +36 -0
- package/dist/tui/controller/task-runtime-controller.d.ts +66 -0
- package/dist/tui/controller/task-runtime-controller.js +158 -0
- package/dist/tui/detect-theme.d.ts +4 -0
- package/dist/tui/detect-theme.js +116 -0
- package/dist/tui/display-history.d.ts +64 -0
- package/dist/tui/display-history.js +283 -0
- package/dist/tui/display-sanitizer.d.ts +3 -0
- package/dist/tui/display-sanitizer.js +38 -0
- package/dist/tui/edit-diff.d.ts +11 -0
- package/dist/tui/edit-diff.js +57 -0
- package/dist/tui/file-mentions.d.ts +29 -0
- package/dist/tui/file-mentions.js +174 -0
- package/dist/tui/footer.d.ts +37 -0
- package/dist/tui/footer.js +80 -0
- package/dist/tui/formatting/edit-diff.d.ts +11 -0
- package/dist/tui/formatting/edit-diff.js +52 -0
- package/dist/tui/formatting/summary.d.ts +43 -0
- package/dist/tui/formatting/summary.js +150 -0
- package/dist/tui/fullscreen.d.ts +48 -0
- package/dist/tui/fullscreen.js +256 -0
- package/dist/tui/image-display.d.ts +23 -0
- package/dist/tui/image-display.js +92 -0
- package/dist/tui/image-paste.d.ts +113 -0
- package/dist/tui/image-paste.js +565 -0
- package/dist/tui/input-history.d.ts +47 -0
- package/dist/tui/input-history.js +250 -0
- package/dist/tui/markdown-style.d.ts +5 -0
- package/dist/tui/markdown-style.js +23 -0
- package/dist/tui/model/composer-buffer.d.ts +55 -0
- package/dist/tui/model/composer-buffer.js +317 -0
- package/dist/tui/model/composer-types.d.ts +17 -0
- package/dist/tui/model/composer-types.js +1 -0
- package/dist/tui/model/display-history.d.ts +78 -0
- package/dist/tui/model/display-history.js +124 -0
- package/dist/tui/model/display-reconstruct.d.ts +3 -0
- package/dist/tui/model/display-reconstruct.js +130 -0
- package/dist/tui/model/file-mentions.d.ts +31 -0
- package/dist/tui/model/file-mentions.js +178 -0
- package/dist/tui/model/image-attachment.d.ts +15 -0
- package/dist/tui/model/image-attachment.js +1 -0
- package/dist/tui/model/image-paste.d.ts +119 -0
- package/dist/tui/model/image-paste.js +610 -0
- package/dist/tui/model/input-history.d.ts +1 -0
- package/dist/tui/model/input-history.js +1 -0
- package/dist/tui/model/input-queue.d.ts +12 -0
- package/dist/tui/model/input-queue.js +17 -0
- package/dist/tui/model/key-events.d.ts +9 -0
- package/dist/tui/model/key-events.js +8 -0
- package/dist/tui/model/paste-operation-tracker.d.ts +13 -0
- package/dist/tui/model/paste-operation-tracker.js +25 -0
- package/dist/tui/model/recent-activity.d.ts +8 -0
- package/dist/tui/model/recent-activity.js +71 -0
- package/dist/tui/model/subagent-view.d.ts +87 -0
- package/dist/tui/model/subagent-view.js +336 -0
- package/dist/tui/model/submit-dedupe.d.ts +5 -0
- package/dist/tui/model/submit-dedupe.js +25 -0
- package/dist/tui/model/sync-output.d.ts +17 -0
- package/dist/tui/model/sync-output.js +35 -0
- package/dist/tui/model/task-lifecycle.d.ts +57 -0
- package/dist/tui/model/task-lifecycle.js +124 -0
- package/dist/tui/model/terminal-env.d.ts +15 -0
- package/dist/tui/model/terminal-env.js +22 -0
- package/dist/tui/model/terminal-mouse.d.ts +28 -0
- package/dist/tui/model/terminal-mouse.js +82 -0
- package/dist/tui/model/theme-style.d.ts +10 -0
- package/dist/tui/model/theme-style.js +79 -0
- package/dist/tui/model/theme.d.ts +72 -0
- package/dist/tui/model/theme.js +121 -0
- package/dist/tui/model/trace-groups.d.ts +45 -0
- package/dist/tui/model/trace-groups.js +558 -0
- package/dist/tui/model/trace-interaction.d.ts +63 -0
- package/dist/tui/model/trace-interaction.js +87 -0
- package/dist/tui/model/width.d.ts +18 -0
- package/dist/tui/model/width.js +130 -0
- package/dist/tui/model-picker-data.d.ts +9 -0
- package/dist/tui/model-picker-data.js +39 -0
- package/dist/tui/model-switch.d.ts +49 -0
- package/dist/tui/model-switch.js +67 -0
- package/dist/tui/paste-placeholder.d.ts +11 -0
- package/dist/tui/paste-placeholder.js +52 -0
- package/dist/tui/recent-activity.d.ts +8 -0
- package/dist/tui/recent-activity.js +71 -0
- package/dist/tui/run-session-picker.d.ts +9 -0
- package/dist/tui/run-session-picker.js +64 -0
- package/dist/tui/run.d.ts +72 -0
- package/dist/tui/run.js +139 -0
- package/dist/tui/session-display.d.ts +6 -0
- package/dist/tui/session-display.js +12 -0
- package/dist/tui/session-picker-data.d.ts +18 -0
- package/dist/tui/session-picker-data.js +21 -0
- package/dist/tui/terminal/multiplexer.d.ts +5 -0
- package/dist/tui/terminal/multiplexer.js +14 -0
- package/dist/tui/testing/fake-agent.d.ts +24 -0
- package/dist/tui/testing/fake-agent.js +22 -0
- package/dist/tui/testing/spy-host.d.ts +21 -0
- package/dist/tui/testing/spy-host.js +55 -0
- package/dist/tui/trace-groups.d.ts +43 -0
- package/dist/tui/trace-groups.js +554 -0
- package/dist/tui/wordmark.d.ts +18 -0
- package/dist/tui/wordmark.js +208 -0
- package/dist/types.d.ts +503 -0
- package/dist/types.js +4 -0
- package/dist/update/index.d.ts +61 -0
- package/dist/update/index.js +267 -0
- package/dist/variant/thinking-level.d.ts +5 -0
- package/dist/variant/thinking-level.js +26 -0
- package/dist/variant/variant-resolver.d.ts +28 -0
- package/dist/variant/variant-resolver.js +62 -0
- package/node_modules/@bubblebrain-ai/pi-tui/LICENSE +21 -0
- package/node_modules/@bubblebrain-ai/pi-tui/README.md +854 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.d.ts +26 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.js +121 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.d.ts +86 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.js +649 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.d.ts +13 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.js +36 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.d.ts +22 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.js +99 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.d.ts +22 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.js +36 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.d.ts +330 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.js +2344 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.d.ts +7 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.js +43 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.d.ts +28 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.js +82 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.d.ts +48 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.js +390 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.d.ts +31 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.js +67 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.d.ts +103 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.js +797 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.d.ts +56 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.js +179 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.d.ts +53 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.js +175 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.d.ts +50 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.js +174 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.d.ts +12 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.js +22 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.d.ts +32 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.js +109 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.d.ts +19 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.js +81 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.d.ts +13 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.js +48 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.d.ts +8 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.js +26 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.d.ts +39 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.js +2 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.d.ts +16 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.js +110 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.d.ts +31 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.js +42 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.d.ts +273 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.js +231 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.d.ts +184 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.js +1174 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.d.ts +28 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.js +46 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.d.ts +10 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.js +1268 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.d.ts +40 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.js +6 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.d.ts +42 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.js +335 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.d.ts +3 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.js +60 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.d.ts +56 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.js +363 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.d.ts +10 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.js +59 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.d.ts +116 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.js +518 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.d.ts +142 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.js +544 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.d.ts +11 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.js +11 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.d.ts +141 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.js +1340 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.d.ts +39 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.js +536 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.d.ts +340 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.js +1020 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.d.ts +17 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.js +27 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.d.ts +96 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.js +1193 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.d.ts +25 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.js +96 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.d.ts +73 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.d.ts.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.js +188 -0
- package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.js.map +1 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/README.md +20 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/build.sh +62 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/src/darwin-modifiers.c +70 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/README.md +22 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/build.mjs +229 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/node_modules/@bubblebrain-ai/pi-tui/native/win32/src/win32-console-mode.c +119 -0
- package/node_modules/@bubblebrain-ai/pi-tui/package.json +66 -0
- package/node_modules/get-east-asian-width/index.d.ts +60 -0
- package/node_modules/get-east-asian-width/index.js +30 -0
- package/node_modules/get-east-asian-width/license +9 -0
- package/node_modules/get-east-asian-width/lookup-data.js +21 -0
- package/node_modules/get-east-asian-width/lookup.js +138 -0
- package/node_modules/get-east-asian-width/package.json +71 -0
- package/node_modules/get-east-asian-width/readme.md +65 -0
- package/node_modules/get-east-asian-width/utilities.js +24 -0
- package/node_modules/marked/LICENSE +44 -0
- package/node_modules/marked/README.md +115 -0
- package/node_modules/marked/bin/main.js +284 -0
- package/node_modules/marked/bin/marked.js +16 -0
- package/node_modules/marked/lib/marked.d.ts +760 -0
- package/node_modules/marked/lib/marked.esm.js +77 -0
- package/node_modules/marked/lib/marked.esm.js.map +7 -0
- package/node_modules/marked/lib/marked.umd.js +79 -0
- package/node_modules/marked/lib/marked.umd.js.map +7 -0
- package/node_modules/marked/man/marked.1 +113 -0
- package/node_modules/marked/man/marked.1.md +93 -0
- package/node_modules/marked/package.json +103 -0
- package/package.json +96 -17
- package/bin/bubble.js +0 -39
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image paste utilities: path detection, file reading, clipboard access, and size-capping.
|
|
3
|
+
*
|
|
4
|
+
* Terminals don't forward image bytes to stdin. Paths arrive as text when users
|
|
5
|
+
* drag files in; Cmd+V of an image produces an empty paste (we probe the
|
|
6
|
+
* clipboard). macOS screenshot shortcut (Cmd+Shift+Ctrl+4) writes to both a
|
|
7
|
+
* TemporaryItems path and the clipboard — the path often gets cleaned up before
|
|
8
|
+
* we can read it, so we fall back to the clipboard.
|
|
9
|
+
*/
|
|
10
|
+
import { execFile } from "node:child_process";
|
|
11
|
+
import fs from "node:fs/promises";
|
|
12
|
+
import os from "node:os";
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
import { promisify } from "node:util";
|
|
15
|
+
const execFileAsync = promisify(execFile);
|
|
16
|
+
const IMAGE_EXT = /\.(png|jpe?g|gif|webp|bmp)$/i;
|
|
17
|
+
const IMAGE_EXT_SOURCE = String.raw `(?:png|jpe?g|gif|webp|bmp)`;
|
|
18
|
+
// Anthropic/OpenAI image uploads cap at ~5MB base64. We target a bit below so
|
|
19
|
+
// the base64 inflation (4/3) doesn't push us over.
|
|
20
|
+
const MAX_BASE64_BYTES = 5 * 1024 * 1024;
|
|
21
|
+
const RESIZE_TRIGGER_BYTES = Math.floor(MAX_BASE64_BYTES * 0.95);
|
|
22
|
+
// Target max dimension for auto-resize.
|
|
23
|
+
const RESIZE_MAX_DIM = 2048;
|
|
24
|
+
export function isImageFilePath(raw) {
|
|
25
|
+
const s = raw.trim();
|
|
26
|
+
if (!s)
|
|
27
|
+
return false;
|
|
28
|
+
if (!IMAGE_EXT.test(s))
|
|
29
|
+
return false;
|
|
30
|
+
// Require an absolute or home-relative path. Pasted arbitrary text shouldn't
|
|
31
|
+
// be treated as a path.
|
|
32
|
+
return path.isAbsolute(s) || s.startsWith("~") || /^[A-Za-z]:\\/.test(s);
|
|
33
|
+
}
|
|
34
|
+
export function extractImagePathTokens(input) {
|
|
35
|
+
const pattern = new RegExp(String.raw `(^|\s)(?:"([^"]+\.${IMAGE_EXT_SOURCE})"|'([^']+\.${IMAGE_EXT_SOURCE})'|((?:~|\/|[A-Za-z]:\\)(?:\\ |[^\s"'<>])+\.${IMAGE_EXT_SOURCE}))(?=$|\s)`, "gi");
|
|
36
|
+
const tokens = [];
|
|
37
|
+
for (const match of input.matchAll(pattern)) {
|
|
38
|
+
const leading = match[1] ?? "";
|
|
39
|
+
const rawPath = match[2] ?? match[3] ?? match[4];
|
|
40
|
+
if (!rawPath || !isImageFilePath(rawPath))
|
|
41
|
+
continue;
|
|
42
|
+
const start = (match.index ?? 0) + leading.length;
|
|
43
|
+
const end = (match.index ?? 0) + match[0].length;
|
|
44
|
+
tokens.push({ rawPath, start, end });
|
|
45
|
+
}
|
|
46
|
+
return tokens;
|
|
47
|
+
}
|
|
48
|
+
export function removeImagePathTokens(input, tokens) {
|
|
49
|
+
if (tokens.length === 0)
|
|
50
|
+
return input.trim();
|
|
51
|
+
let out = "";
|
|
52
|
+
let cursor = 0;
|
|
53
|
+
for (const token of tokens) {
|
|
54
|
+
out += input.slice(cursor, token.start);
|
|
55
|
+
out += " ";
|
|
56
|
+
cursor = token.end;
|
|
57
|
+
}
|
|
58
|
+
out += input.slice(cursor);
|
|
59
|
+
return out
|
|
60
|
+
.replace(/[ \t]+/g, " ")
|
|
61
|
+
.replace(/ *\n */g, "\n")
|
|
62
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
63
|
+
.trim();
|
|
64
|
+
}
|
|
65
|
+
export function imageAttachmentLabel(att, index) {
|
|
66
|
+
return `image#${index}${imageExtension(att)}`;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Label for an image path before ingestion runs. Matches what
|
|
70
|
+
* imageAttachmentLabel produces for the same file, so a label inserted at
|
|
71
|
+
* paste time stays a valid key once the attachment is registered.
|
|
72
|
+
*/
|
|
73
|
+
export function imageLabelForPath(rawPath, index) {
|
|
74
|
+
const ext = path.extname(unescapeShell(rawPath.trim())).toLowerCase() || ".png";
|
|
75
|
+
return `image#${index}${ext}`;
|
|
76
|
+
}
|
|
77
|
+
export function imageAttachmentReference(att, index) {
|
|
78
|
+
return `[${imageAttachmentLabel(att, index)}]`;
|
|
79
|
+
}
|
|
80
|
+
export function imageAttachmentLabelPattern() {
|
|
81
|
+
return /\[image#(\d+)\.[^\]\s]+\]/g;
|
|
82
|
+
}
|
|
83
|
+
function defaultImagePrompt(count) {
|
|
84
|
+
return count === 1
|
|
85
|
+
? "Please analyze the attached image."
|
|
86
|
+
: "Please analyze the attached images.";
|
|
87
|
+
}
|
|
88
|
+
function imageExtension(att) {
|
|
89
|
+
const fromPath = path.extname(att.filename ?? att.sourcePath ?? "").toLowerCase();
|
|
90
|
+
if (fromPath)
|
|
91
|
+
return fromPath;
|
|
92
|
+
if (att.mediaType === "image/jpeg")
|
|
93
|
+
return ".jpg";
|
|
94
|
+
if (att.mediaType === "image/webp")
|
|
95
|
+
return ".webp";
|
|
96
|
+
if (att.mediaType === "image/gif")
|
|
97
|
+
return ".gif";
|
|
98
|
+
if (att.mediaType === "image/bmp")
|
|
99
|
+
return ".bmp";
|
|
100
|
+
return ".png";
|
|
101
|
+
}
|
|
102
|
+
export function buildImageContentParts(promptText, attachments) {
|
|
103
|
+
const text = promptText.trim() || defaultImagePrompt(attachments.length);
|
|
104
|
+
return [
|
|
105
|
+
{ type: "text", text },
|
|
106
|
+
...attachments.map((attachment) => ({
|
|
107
|
+
type: "image_url",
|
|
108
|
+
image_url: { url: attachment.dataUrl },
|
|
109
|
+
})),
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Convert the composer's inline [Image #N] chips into ordered multimodal
|
|
114
|
+
* content. The labels remain UI-only, while each image reaches the provider at
|
|
115
|
+
* the same position the user chose in the draft.
|
|
116
|
+
*/
|
|
117
|
+
export function buildImageContentPartsFromDisplayText(displayText, promptText, attachments, labelStart = 1) {
|
|
118
|
+
const byLabel = new Map(attachments.map((attachment, index) => [`[Image #${labelStart + index}]`, attachment]));
|
|
119
|
+
const parts = [];
|
|
120
|
+
const used = new Set();
|
|
121
|
+
let cursor = 0;
|
|
122
|
+
while (cursor < displayText.length) {
|
|
123
|
+
let nextLabel;
|
|
124
|
+
let nextIndex = -1;
|
|
125
|
+
for (const label of byLabel.keys()) {
|
|
126
|
+
if (used.has(label))
|
|
127
|
+
continue;
|
|
128
|
+
const index = displayText.indexOf(label, cursor);
|
|
129
|
+
if (index >= 0 && (nextIndex < 0 || index < nextIndex)) {
|
|
130
|
+
nextLabel = label;
|
|
131
|
+
nextIndex = index;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (!nextLabel || nextIndex < 0)
|
|
135
|
+
break;
|
|
136
|
+
const before = displayText.slice(cursor, nextIndex).trim();
|
|
137
|
+
if (before)
|
|
138
|
+
parts.push({ type: "text", text: before });
|
|
139
|
+
parts.push({ type: "image_url", image_url: { url: byLabel.get(nextLabel).dataUrl } });
|
|
140
|
+
used.add(nextLabel);
|
|
141
|
+
cursor = nextIndex + nextLabel.length;
|
|
142
|
+
}
|
|
143
|
+
const after = displayText.slice(cursor).trim();
|
|
144
|
+
if (after)
|
|
145
|
+
parts.push({ type: "text", text: after });
|
|
146
|
+
for (const [label, attachment] of byLabel) {
|
|
147
|
+
if (!used.has(label)) {
|
|
148
|
+
parts.push({ type: "image_url", image_url: { url: attachment.dataUrl } });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (used.size === 0)
|
|
152
|
+
return buildImageContentParts(promptText, attachments);
|
|
153
|
+
if (!parts.some((part) => part.type === "text")) {
|
|
154
|
+
parts.unshift({ type: "text", text: promptText.trim() || defaultImagePrompt(attachments.length) });
|
|
155
|
+
}
|
|
156
|
+
return parts;
|
|
157
|
+
}
|
|
158
|
+
export function formatImageDisplayInput(promptText, attachments, labelStart = 1) {
|
|
159
|
+
const text = promptText.trim() || defaultImagePrompt(attachments.length);
|
|
160
|
+
const imageLines = attachments.map((attachment, index) => imageAttachmentReference(attachment, labelStart + index));
|
|
161
|
+
return `${text}\n${imageLines.join("\n")}`;
|
|
162
|
+
}
|
|
163
|
+
export function buildImageContentPartsFromLabels(input, attachmentsByLabel) {
|
|
164
|
+
const matches = Array.from(input.matchAll(imageAttachmentLabelPattern()));
|
|
165
|
+
const usedLabels = [];
|
|
166
|
+
const parts = [];
|
|
167
|
+
let cursor = 0;
|
|
168
|
+
for (const match of matches) {
|
|
169
|
+
const label = match[0].slice(1, -1);
|
|
170
|
+
const attachment = attachmentsByLabel.get(label);
|
|
171
|
+
if (!attachment)
|
|
172
|
+
continue;
|
|
173
|
+
const start = match.index ?? 0;
|
|
174
|
+
const before = input.slice(cursor, start).trim();
|
|
175
|
+
if (before)
|
|
176
|
+
parts.push({ type: "text", text: before });
|
|
177
|
+
parts.push({ type: "image_url", image_url: { url: attachment.dataUrl } });
|
|
178
|
+
usedLabels.push(label);
|
|
179
|
+
cursor = start + match[0].length;
|
|
180
|
+
}
|
|
181
|
+
if (usedLabels.length === 0)
|
|
182
|
+
return { displayInput: input, usedLabels: [] };
|
|
183
|
+
const rest = input.slice(cursor).trim();
|
|
184
|
+
if (rest)
|
|
185
|
+
parts.push({ type: "text", text: rest });
|
|
186
|
+
if (!parts.some((part) => part.type === "text")) {
|
|
187
|
+
parts.unshift({ type: "text", text: defaultImagePrompt(usedLabels.length) });
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
actualInput: parts,
|
|
191
|
+
displayInput: input.trim() || usedLabels.map((label) => `[${label}]`).join("\n"),
|
|
192
|
+
usedLabels,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Split a pasted blob into candidate path tokens.
|
|
197
|
+
*
|
|
198
|
+
* Multi-drag from Finder delivers a mix of newline- and space-separated
|
|
199
|
+
* absolute paths. Spaces inside a single path are escaped (`\ `) — we split
|
|
200
|
+
* only on a space that is followed by the start of a new absolute path.
|
|
201
|
+
*/
|
|
202
|
+
export function splitPastedPaths(pasted) {
|
|
203
|
+
const out = [];
|
|
204
|
+
for (const line of pasted.split(/\r?\n/)) {
|
|
205
|
+
for (const piece of line.split(/ (?=\/|[A-Za-z]:\\)/)) {
|
|
206
|
+
const t = piece.trim();
|
|
207
|
+
if (t)
|
|
208
|
+
out.push(t);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return out;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* True when a pasted blob consists solely of image file paths (drag from
|
|
215
|
+
* Finder, or a terminal that converts clipboard images to temp-file paths).
|
|
216
|
+
*/
|
|
217
|
+
export function isImagePathPaste(pasted) {
|
|
218
|
+
const pieces = splitPastedPaths(pasted);
|
|
219
|
+
return pieces.length > 0 && pieces.every((piece) => isImageFilePath(piece));
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Bare image filename with no directory, e.g. "Screenshot ... AM.png".
|
|
223
|
+
* Copying an image file in Finder puts only the file's NAME in the
|
|
224
|
+
* clipboard's plain-text flavor — the actual bits arrive as a file-url or
|
|
225
|
+
* image flavor that must be read from the clipboard separately.
|
|
226
|
+
*/
|
|
227
|
+
export function bareImageFilenameFromPaste(pasted) {
|
|
228
|
+
const s = pasted.trim();
|
|
229
|
+
if (!s || s.length > 255)
|
|
230
|
+
return null;
|
|
231
|
+
if (/[\n\r/\\]/.test(s))
|
|
232
|
+
return null;
|
|
233
|
+
if (!IMAGE_EXT.test(s))
|
|
234
|
+
return null;
|
|
235
|
+
return s;
|
|
236
|
+
}
|
|
237
|
+
function mediaTypeFromExt(p) {
|
|
238
|
+
const ext = path.extname(p).toLowerCase();
|
|
239
|
+
if (ext === ".jpg" || ext === ".jpeg")
|
|
240
|
+
return "image/jpeg";
|
|
241
|
+
if (ext === ".gif")
|
|
242
|
+
return "image/gif";
|
|
243
|
+
if (ext === ".webp")
|
|
244
|
+
return "image/webp";
|
|
245
|
+
if (ext === ".bmp")
|
|
246
|
+
return "image/bmp";
|
|
247
|
+
return "image/png";
|
|
248
|
+
}
|
|
249
|
+
function resolveHome(p) {
|
|
250
|
+
if (p.startsWith("~/") || p === "~") {
|
|
251
|
+
return path.join(os.homedir(), p.slice(1));
|
|
252
|
+
}
|
|
253
|
+
return p;
|
|
254
|
+
}
|
|
255
|
+
function unescapeShell(p) {
|
|
256
|
+
return p.replace(/\\ /g, " ");
|
|
257
|
+
}
|
|
258
|
+
function attachmentFromBuffer(buffer, mediaType, meta = {}) {
|
|
259
|
+
const base64 = buffer.toString("base64");
|
|
260
|
+
return {
|
|
261
|
+
base64,
|
|
262
|
+
mediaType,
|
|
263
|
+
bytes: buffer.length,
|
|
264
|
+
dataUrl: `data:${mediaType};base64,${base64}`,
|
|
265
|
+
filename: meta.filename,
|
|
266
|
+
sourcePath: meta.sourcePath,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
export async function readImageFromPath(rawPath) {
|
|
270
|
+
const resolved = resolveHome(unescapeShell(rawPath.trim()));
|
|
271
|
+
try {
|
|
272
|
+
const stat = await fs.stat(resolved);
|
|
273
|
+
if (!stat.isFile())
|
|
274
|
+
return null;
|
|
275
|
+
const buffer = await fs.readFile(resolved);
|
|
276
|
+
return attachmentFromBuffer(buffer, mediaTypeFromExt(resolved), {
|
|
277
|
+
filename: path.basename(resolved),
|
|
278
|
+
sourcePath: resolved,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/** macOS screenshot shortcut writes to these paths and they may be auto-cleaned. */
|
|
286
|
+
export function isScreenshotTempPath(s) {
|
|
287
|
+
return /\/TemporaryItems\/.*screencaptureui.*\/Screenshot/i.test(s);
|
|
288
|
+
}
|
|
289
|
+
export async function getImageFromClipboard() {
|
|
290
|
+
switch (process.platform) {
|
|
291
|
+
case "darwin":
|
|
292
|
+
return getClipboardImageDarwin();
|
|
293
|
+
case "linux":
|
|
294
|
+
return getClipboardImageLinux();
|
|
295
|
+
case "win32":
|
|
296
|
+
return getClipboardImageWindows();
|
|
297
|
+
default:
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
async function getClipboardImageDarwin() {
|
|
302
|
+
const tmp = path.join(os.tmpdir(), `bubble_clip_${Date.now()}_${process.pid}.png`);
|
|
303
|
+
const script = `set png_data to (the clipboard as «class PNGf»)\n` +
|
|
304
|
+
`set fp to open for access POSIX file "${tmp}" with write permission\n` +
|
|
305
|
+
`try\n` +
|
|
306
|
+
`set eof fp to 0\n` +
|
|
307
|
+
`write png_data to fp\n` +
|
|
308
|
+
`close access fp\n` +
|
|
309
|
+
`on error err_msg number err_num\n` +
|
|
310
|
+
`try\n` +
|
|
311
|
+
`close access fp\n` +
|
|
312
|
+
`end try\n` +
|
|
313
|
+
`error err_msg number err_num\n` +
|
|
314
|
+
`end try`;
|
|
315
|
+
try {
|
|
316
|
+
await execFileAsync("osascript", ["-e", script], { timeout: 5000 });
|
|
317
|
+
const buf = await fs.readFile(tmp);
|
|
318
|
+
return attachmentFromBuffer(buf, "image/png");
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
finally {
|
|
324
|
+
await fs.unlink(tmp).catch(() => undefined);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
async function getClipboardImageLinux() {
|
|
328
|
+
const candidates = [
|
|
329
|
+
["xclip", ["-selection", "clipboard", "-t", "image/png", "-o"]],
|
|
330
|
+
["wl-paste", ["--type", "image/png"]],
|
|
331
|
+
];
|
|
332
|
+
for (const [cmd, args] of candidates) {
|
|
333
|
+
try {
|
|
334
|
+
// encoding: "buffer" makes stdout a Buffer instead of a string so PNG
|
|
335
|
+
// bytes survive without UTF-8 mangling.
|
|
336
|
+
const result = await execFileAsync(cmd, args, {
|
|
337
|
+
timeout: 5000,
|
|
338
|
+
encoding: "buffer",
|
|
339
|
+
});
|
|
340
|
+
const buf = result.stdout;
|
|
341
|
+
if (buf && buf.length > 0) {
|
|
342
|
+
return attachmentFromBuffer(buf, "image/png");
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
async function getClipboardImageWindows() {
|
|
352
|
+
const tmp = path.join(os.tmpdir(), `bubble_clip_${Date.now()}_${process.pid}.png`);
|
|
353
|
+
const tmpPs = tmp.replace(/\\/g, "\\\\");
|
|
354
|
+
const script = `Add-Type -AssemblyName System.Drawing; ` +
|
|
355
|
+
`$img = Get-Clipboard -Format Image; ` +
|
|
356
|
+
`if ($img) { $img.Save('${tmpPs}', [System.Drawing.Imaging.ImageFormat]::Png); Write-Output 'OK' } ` +
|
|
357
|
+
`else { Write-Output 'NONE' }`;
|
|
358
|
+
try {
|
|
359
|
+
const result = await execFileAsync("powershell", ["-NoProfile", "-Command", script], { timeout: 5000 });
|
|
360
|
+
if (!String(result.stdout).includes("OK"))
|
|
361
|
+
return null;
|
|
362
|
+
const buf = await fs.readFile(tmp);
|
|
363
|
+
return attachmentFromBuffer(buf, "image/png");
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
finally {
|
|
369
|
+
await fs.unlink(tmp).catch(() => undefined);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
async function which(cmd) {
|
|
373
|
+
try {
|
|
374
|
+
await execFileAsync(process.platform === "win32" ? "where" : "which", [cmd], {
|
|
375
|
+
timeout: 1500,
|
|
376
|
+
});
|
|
377
|
+
return true;
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
return false;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* If the image is close to the API size cap, try to downscale it in place.
|
|
385
|
+
* Uses the OS-native tools that are typically available:
|
|
386
|
+
* - macOS: `sips` (always present)
|
|
387
|
+
* - linux: ImageMagick `convert` (if installed)
|
|
388
|
+
* Returns the original attachment if resize isn't needed or can't run.
|
|
389
|
+
*/
|
|
390
|
+
export async function maybeResizeImage(att) {
|
|
391
|
+
if (att.base64.length < RESIZE_TRIGGER_BYTES)
|
|
392
|
+
return att;
|
|
393
|
+
const tmpDir = os.tmpdir();
|
|
394
|
+
const stamp = `${Date.now()}_${process.pid}`;
|
|
395
|
+
const inExt = path.extname(att.filename ?? att.sourcePath ?? `.png`).toLowerCase() || ".png";
|
|
396
|
+
const tmpIn = path.join(tmpDir, `bubble_img_in_${stamp}${inExt}`);
|
|
397
|
+
const tmpOut = path.join(tmpDir, `bubble_img_out_${stamp}.jpg`);
|
|
398
|
+
try {
|
|
399
|
+
await fs.writeFile(tmpIn, Buffer.from(att.base64, "base64"));
|
|
400
|
+
let ok = false;
|
|
401
|
+
if (process.platform === "darwin") {
|
|
402
|
+
try {
|
|
403
|
+
await execFileAsync("sips", ["-Z", String(RESIZE_MAX_DIM), "-s", "format", "jpeg", "-s", "formatOptions", "80", tmpIn, "--out", tmpOut], { timeout: 10000 });
|
|
404
|
+
ok = true;
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
ok = false;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
else if (await which("convert")) {
|
|
411
|
+
try {
|
|
412
|
+
await execFileAsync("convert", [tmpIn, "-resize", `${RESIZE_MAX_DIM}x${RESIZE_MAX_DIM}>`, "-quality", "80", tmpOut], { timeout: 10000 });
|
|
413
|
+
ok = true;
|
|
414
|
+
}
|
|
415
|
+
catch {
|
|
416
|
+
ok = false;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
if (!ok)
|
|
420
|
+
return att;
|
|
421
|
+
const resized = await fs.readFile(tmpOut);
|
|
422
|
+
if (resized.length >= att.bytes)
|
|
423
|
+
return att;
|
|
424
|
+
return attachmentFromBuffer(resized, "image/jpeg", {
|
|
425
|
+
filename: att.filename,
|
|
426
|
+
sourcePath: att.sourcePath,
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
return att;
|
|
431
|
+
}
|
|
432
|
+
finally {
|
|
433
|
+
await fs.unlink(tmpIn).catch(() => undefined);
|
|
434
|
+
await fs.unlink(tmpOut).catch(() => undefined);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
export function validateImageSize(att) {
|
|
438
|
+
if (att.base64.length > MAX_BASE64_BYTES) {
|
|
439
|
+
const kb = Math.round(att.base64.length / 1024);
|
|
440
|
+
const max = Math.round(MAX_BASE64_BYTES / 1024);
|
|
441
|
+
const hint = process.platform === "darwin"
|
|
442
|
+
? " (install/confirm `sips` on PATH to auto-resize)"
|
|
443
|
+
: process.platform === "linux"
|
|
444
|
+
? " (install ImageMagick `convert` to auto-resize)"
|
|
445
|
+
: "";
|
|
446
|
+
return {
|
|
447
|
+
ok: false,
|
|
448
|
+
reason: `image base64 is ${kb}KB, exceeds ${max}KB API cap${hint}`,
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
return { ok: true };
|
|
452
|
+
}
|
|
453
|
+
/** End-to-end: given a file path, read -> resize-if-needed -> validate. */
|
|
454
|
+
export async function ingestImagePath(p) {
|
|
455
|
+
const raw = await readImageFromPath(p);
|
|
456
|
+
if (!raw)
|
|
457
|
+
return { error: `cannot read image at ${p}` };
|
|
458
|
+
const sized = await maybeResizeImage(raw);
|
|
459
|
+
const validation = validateImageSize(sized);
|
|
460
|
+
if (!validation.ok)
|
|
461
|
+
return { error: validation.reason };
|
|
462
|
+
return { attachment: sized };
|
|
463
|
+
}
|
|
464
|
+
export async function ingestClipboardImage() {
|
|
465
|
+
// A file reference wins over bitmap flavors: for a copied FILE, coercing
|
|
466
|
+
// the clipboard to PNGf yields the file's generic ICON, not the image.
|
|
467
|
+
const filePath = await getClipboardFilePath();
|
|
468
|
+
if (filePath) {
|
|
469
|
+
if (isImageFilePath(filePath))
|
|
470
|
+
return ingestImagePath(filePath);
|
|
471
|
+
return { error: `clipboard file is not an image: ${filePath}` };
|
|
472
|
+
}
|
|
473
|
+
const raw = await getImageFromClipboard();
|
|
474
|
+
if (!raw)
|
|
475
|
+
return { error: "clipboard has no image" };
|
|
476
|
+
const sized = await maybeResizeImage(raw);
|
|
477
|
+
const validation = validateImageSize(sized);
|
|
478
|
+
if (!validation.ok)
|
|
479
|
+
return { error: validation.reason };
|
|
480
|
+
return { attachment: sized };
|
|
481
|
+
}
|
|
482
|
+
async function getClipboardFilePath() {
|
|
483
|
+
if (process.platform !== "darwin")
|
|
484
|
+
return null;
|
|
485
|
+
try {
|
|
486
|
+
// Probe first — AppleScript happily coerces plain TEXT into a file URL,
|
|
487
|
+
// so only trust «class furl» when the clipboard really carries one.
|
|
488
|
+
const probe = await execFileAsync("osascript", ["-e", "clipboard info for «class furl»"], {
|
|
489
|
+
timeout: 5000,
|
|
490
|
+
});
|
|
491
|
+
if (!String(probe.stdout).includes("furl"))
|
|
492
|
+
return null;
|
|
493
|
+
const result = await execFileAsync("osascript", ["-e", "POSIX path of (the clipboard as «class furl»)"], { timeout: 5000 });
|
|
494
|
+
const p = String(result.stdout).trim();
|
|
495
|
+
return p || null;
|
|
496
|
+
}
|
|
497
|
+
catch {
|
|
498
|
+
return null;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
export async function resolveImageInput(input, options = {}) {
|
|
502
|
+
const tokens = extractImagePathTokens(input);
|
|
503
|
+
if (tokens.length === 0) {
|
|
504
|
+
return {
|
|
505
|
+
actualInput: input,
|
|
506
|
+
displayInput: input,
|
|
507
|
+
errors: [],
|
|
508
|
+
attachments: [],
|
|
509
|
+
imagePathCount: 0,
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
const attachments = [];
|
|
513
|
+
const errors = [];
|
|
514
|
+
const attachmentsByToken = new Map();
|
|
515
|
+
let nextLabelIndex = options.labelStart ?? 1;
|
|
516
|
+
for (const token of tokens) {
|
|
517
|
+
const result = await ingestImagePath(token.rawPath);
|
|
518
|
+
if (result.attachment) {
|
|
519
|
+
attachments.push(result.attachment);
|
|
520
|
+
attachmentsByToken.set(token, {
|
|
521
|
+
attachment: result.attachment,
|
|
522
|
+
label: imageAttachmentLabel(result.attachment, nextLabelIndex++),
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
else {
|
|
526
|
+
errors.push(`${token.rawPath}: ${result.error ?? "could not attach image"}`);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
if (attachments.length === 0) {
|
|
530
|
+
return {
|
|
531
|
+
actualInput: input,
|
|
532
|
+
displayInput: input,
|
|
533
|
+
errors,
|
|
534
|
+
attachments: [],
|
|
535
|
+
imagePathCount: tokens.length,
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
const parts = [];
|
|
539
|
+
let displayInput = "";
|
|
540
|
+
let cursor = 0;
|
|
541
|
+
for (const token of tokens) {
|
|
542
|
+
const entry = attachmentsByToken.get(token);
|
|
543
|
+
if (!entry)
|
|
544
|
+
continue;
|
|
545
|
+
const before = input.slice(cursor, token.start);
|
|
546
|
+
displayInput += before;
|
|
547
|
+
const text = before.trim();
|
|
548
|
+
if (text)
|
|
549
|
+
parts.push({ type: "text", text });
|
|
550
|
+
parts.push({ type: "image_url", image_url: { url: entry.attachment.dataUrl } });
|
|
551
|
+
displayInput += `[${entry.label}]`;
|
|
552
|
+
cursor = token.end;
|
|
553
|
+
}
|
|
554
|
+
const rest = input.slice(cursor);
|
|
555
|
+
displayInput += rest;
|
|
556
|
+
const restText = rest.trim();
|
|
557
|
+
if (restText)
|
|
558
|
+
parts.push({ type: "text", text: restText });
|
|
559
|
+
if (!parts.some((part) => part.type === "text")) {
|
|
560
|
+
parts.unshift({ type: "text", text: defaultImagePrompt(attachments.length) });
|
|
561
|
+
}
|
|
562
|
+
return {
|
|
563
|
+
actualInput: parts,
|
|
564
|
+
displayInput: displayInput.trim(),
|
|
565
|
+
errors,
|
|
566
|
+
attachments,
|
|
567
|
+
imagePathCount: tokens.length,
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
export async function resolveComposerImagePaths(input, options = {}) {
|
|
571
|
+
const tokens = extractImagePathTokens(input);
|
|
572
|
+
let nextLabelIndex = options.labelStart ?? 1;
|
|
573
|
+
if (tokens.length === 0) {
|
|
574
|
+
return {
|
|
575
|
+
text: input,
|
|
576
|
+
attachments: [],
|
|
577
|
+
errors: [],
|
|
578
|
+
imagePathCount: 0,
|
|
579
|
+
nextLabelIndex,
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
const errors = [];
|
|
583
|
+
const attachments = [];
|
|
584
|
+
const replacements = new Map();
|
|
585
|
+
for (const token of tokens) {
|
|
586
|
+
const result = await ingestImagePath(token.rawPath);
|
|
587
|
+
if (!result.attachment) {
|
|
588
|
+
errors.push(`${token.rawPath}: ${result.error ?? "could not attach image"}`);
|
|
589
|
+
continue;
|
|
590
|
+
}
|
|
591
|
+
const label = imageAttachmentLabel(result.attachment, nextLabelIndex++);
|
|
592
|
+
attachments.push({ ...result.attachment, label });
|
|
593
|
+
replacements.set(token, `[${label}]`);
|
|
594
|
+
}
|
|
595
|
+
let text = "";
|
|
596
|
+
let cursor = 0;
|
|
597
|
+
for (const token of tokens) {
|
|
598
|
+
text += input.slice(cursor, token.start);
|
|
599
|
+
text += replacements.get(token) ?? input.slice(token.start, token.end);
|
|
600
|
+
cursor = token.end;
|
|
601
|
+
}
|
|
602
|
+
text += input.slice(cursor);
|
|
603
|
+
return {
|
|
604
|
+
text,
|
|
605
|
+
attachments,
|
|
606
|
+
errors,
|
|
607
|
+
imagePathCount: tokens.length,
|
|
608
|
+
nextLabelIndex,
|
|
609
|
+
};
|
|
610
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../tui/input-history.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../tui/input-history.js";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SubmitPayload } from "./composer-types.js";
|
|
2
|
+
export interface QueuedInput {
|
|
3
|
+
payload: SubmitPayload;
|
|
4
|
+
displayKey?: string;
|
|
5
|
+
sessionFile?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface PendingSteerMeta {
|
|
8
|
+
displayKey: string;
|
|
9
|
+
sessionFile?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function isQueuedInputForCurrentSession(input: QueuedInput, currentSessionFile?: string): boolean;
|
|
12
|
+
export declare function queuedAndPendingDisplayKeys(queuedInputs: QueuedInput[], pendingSteers: Iterable<PendingSteerMeta>): Set<string>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function isQueuedInputForCurrentSession(input, currentSessionFile) {
|
|
2
|
+
if (!input.sessionFile || !currentSessionFile)
|
|
3
|
+
return true;
|
|
4
|
+
return input.sessionFile === currentSessionFile;
|
|
5
|
+
}
|
|
6
|
+
export function queuedAndPendingDisplayKeys(queuedInputs, pendingSteers) {
|
|
7
|
+
const keys = new Set();
|
|
8
|
+
for (const input of queuedInputs) {
|
|
9
|
+
if (input.displayKey)
|
|
10
|
+
keys.add(input.displayKey);
|
|
11
|
+
}
|
|
12
|
+
for (const steer of pendingSteers) {
|
|
13
|
+
if (steer.displayKey)
|
|
14
|
+
keys.add(steer.displayKey);
|
|
15
|
+
}
|
|
16
|
+
return keys;
|
|
17
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface InkKeyEvent {
|
|
2
|
+
eventType?: string;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Kitty keyboard protocol can report key press/repeat/release separately.
|
|
6
|
+
* Release events still carry the printable text, so handling them like normal
|
|
7
|
+
* input inserts every typed character twice.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isKeyReleaseEvent(key: InkKeyEvent): boolean;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kitty keyboard protocol can report key press/repeat/release separately.
|
|
3
|
+
* Release events still carry the printable text, so handling them like normal
|
|
4
|
+
* input inserts every typed character twice.
|
|
5
|
+
*/
|
|
6
|
+
export function isKeyReleaseEvent(key) {
|
|
7
|
+
return key.eventType === "release";
|
|
8
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
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 declare class PasteOperationTracker {
|
|
6
|
+
private nextId;
|
|
7
|
+
private readonly active;
|
|
8
|
+
begin(): number;
|
|
9
|
+
finish(id: number): void;
|
|
10
|
+
invalidateAll(): void;
|
|
11
|
+
get hasPending(): boolean;
|
|
12
|
+
get pendingCount(): number;
|
|
13
|
+
}
|