@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,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/feishu` slash command — control the Feishu remote-access serve process
|
|
3
|
+
* from inside the Bubble TUI without leaving it.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* /feishu equivalent to `/feishu status`
|
|
7
|
+
* /feishu status show running state and configured scopes
|
|
8
|
+
* /feishu start spawn `bubble serve --feishu` detached
|
|
9
|
+
* /feishu stop SIGTERM the running serve instance
|
|
10
|
+
* /feishu logs [N] tail last N lines of today's log (default 30)
|
|
11
|
+
*
|
|
12
|
+
* The serve subprocess runs independently of the TUI — closing the TUI
|
|
13
|
+
* does not stop it. Use `/feishu stop` (or kill the PID directly) to
|
|
14
|
+
* terminate.
|
|
15
|
+
*/
|
|
16
|
+
import type { SlashCommand } from "./types.js";
|
|
17
|
+
export declare const feishuCommand: SlashCommand;
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/feishu` slash command — control the Feishu remote-access serve process
|
|
3
|
+
* from inside the Bubble TUI without leaving it.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* /feishu equivalent to `/feishu status`
|
|
7
|
+
* /feishu status show running state and configured scopes
|
|
8
|
+
* /feishu start spawn `bubble serve --feishu` detached
|
|
9
|
+
* /feishu stop SIGTERM the running serve instance
|
|
10
|
+
* /feishu logs [N] tail last N lines of today's log (default 30)
|
|
11
|
+
*
|
|
12
|
+
* The serve subprocess runs independently of the TUI — closing the TUI
|
|
13
|
+
* does not stop it. Use `/feishu stop` (or kill the PID directly) to
|
|
14
|
+
* terminate.
|
|
15
|
+
*/
|
|
16
|
+
import { spawn } from "node:child_process";
|
|
17
|
+
import { existsSync, openSync, readFileSync, statSync } from "node:fs";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
import { configExists, loadConfig } from "../feishu/config.js";
|
|
20
|
+
import { getConfigPath, getLogsDir } from "../feishu/paths.js";
|
|
21
|
+
import { ProcessRegistry } from "../feishu/process-registry.js";
|
|
22
|
+
import { ScopeRegistry } from "../feishu/scope/scope-registry.js";
|
|
23
|
+
const SUBCOMMANDS = ["status", "setup", "start", "stop", "logs", "discover", "bind"];
|
|
24
|
+
export const feishuCommand = {
|
|
25
|
+
name: "feishu",
|
|
26
|
+
description: "Control the Feishu remote-access service (setup/status/start/stop/logs/discover/bind)",
|
|
27
|
+
async handler(args, ctx) {
|
|
28
|
+
const [sub, ...rest] = args.trim().split(/\s+/).filter(Boolean);
|
|
29
|
+
const cmd = (sub ?? "status").toLowerCase();
|
|
30
|
+
if (!SUBCOMMANDS.includes(cmd)) {
|
|
31
|
+
return `Unknown subcommand \`${cmd}\`. Usage: /feishu [setup|status|start|stop|logs|discover|bind]`;
|
|
32
|
+
}
|
|
33
|
+
switch (cmd) {
|
|
34
|
+
case "setup":
|
|
35
|
+
return runSetup(ctx);
|
|
36
|
+
case "status":
|
|
37
|
+
return runStatus();
|
|
38
|
+
case "start":
|
|
39
|
+
return runStart();
|
|
40
|
+
case "stop":
|
|
41
|
+
return runStop();
|
|
42
|
+
case "logs":
|
|
43
|
+
return runLogs(parseInt(rest[0] ?? "30", 10));
|
|
44
|
+
case "discover":
|
|
45
|
+
return runDiscover();
|
|
46
|
+
case "bind":
|
|
47
|
+
return runBind(rest);
|
|
48
|
+
default:
|
|
49
|
+
return "";
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
function runSetup(ctx) {
|
|
54
|
+
if (!ctx.openPicker) {
|
|
55
|
+
return "Setup wizard is only available in interactive TUI mode. Run `bubble serve --feishu --setup` from a shell instead.";
|
|
56
|
+
}
|
|
57
|
+
if (configExists()) {
|
|
58
|
+
return [
|
|
59
|
+
"已检测到现有 config (`~/.bubble/feishu/config.json`)。重新 setup 会覆盖现有的应用注册。",
|
|
60
|
+
"",
|
|
61
|
+
"如果只是想加新的 chat scope,编辑 `~/.bubble/feishu/scopes.json` 即可;要重置则先 `rm ~/.bubble/feishu/config.json ~/.bubble/feishu/secrets.enc` 再运行 `/feishu setup`。",
|
|
62
|
+
].join("\n");
|
|
63
|
+
}
|
|
64
|
+
ctx.openPicker("feishu-setup");
|
|
65
|
+
}
|
|
66
|
+
function runStatus() {
|
|
67
|
+
if (!configExists()) {
|
|
68
|
+
return [
|
|
69
|
+
"Feishu serve is **not configured**.",
|
|
70
|
+
"",
|
|
71
|
+
"Run from a shell: `bubble serve --feishu --setup` to scan the QR code and create config.",
|
|
72
|
+
`Config path: \`${getConfigPath()}\``,
|
|
73
|
+
].join("\n");
|
|
74
|
+
}
|
|
75
|
+
let config;
|
|
76
|
+
try {
|
|
77
|
+
config = loadConfig();
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
return `Failed to read config: ${err.message}`;
|
|
81
|
+
}
|
|
82
|
+
const procRegistry = new ProcessRegistry();
|
|
83
|
+
const conflicts = procRegistry.findConflicts(config.app.appId);
|
|
84
|
+
const running = conflicts.length > 0;
|
|
85
|
+
let scopesCount = 0;
|
|
86
|
+
try {
|
|
87
|
+
scopesCount = ScopeRegistry.load().list().length;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// ignore
|
|
91
|
+
}
|
|
92
|
+
const lines = [];
|
|
93
|
+
lines.push(`**Feishu serve status**`);
|
|
94
|
+
lines.push(`- app: \`${config.app.appId}\``);
|
|
95
|
+
lines.push(`- owner: \`${config.app.ownerOpenId}\``);
|
|
96
|
+
lines.push(`- scopes configured: ${scopesCount}`);
|
|
97
|
+
if (running) {
|
|
98
|
+
const pids = conflicts.map((c) => c.entry.pid).join(", ");
|
|
99
|
+
lines.push(`- 🟢 running (pid ${pids})`);
|
|
100
|
+
lines.push(` use \`/feishu stop\` to terminate, \`/feishu logs\` to tail logs`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
lines.push(`- ⚪ not running`);
|
|
104
|
+
lines.push(` use \`/feishu start\` to launch`);
|
|
105
|
+
}
|
|
106
|
+
return lines.join("\n");
|
|
107
|
+
}
|
|
108
|
+
function runStart() {
|
|
109
|
+
if (!configExists()) {
|
|
110
|
+
return [
|
|
111
|
+
"Cannot start: no Feishu config found.",
|
|
112
|
+
"",
|
|
113
|
+
"Run from a shell first: `bubble serve --feishu --setup`",
|
|
114
|
+
"(the wizard needs an interactive terminal to scan the QR code).",
|
|
115
|
+
].join("\n");
|
|
116
|
+
}
|
|
117
|
+
let config;
|
|
118
|
+
try {
|
|
119
|
+
config = loadConfig();
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
return `Failed to read config: ${err.message}`;
|
|
123
|
+
}
|
|
124
|
+
// Bail if already running for this appId.
|
|
125
|
+
const procRegistry = new ProcessRegistry();
|
|
126
|
+
procRegistry.gc();
|
|
127
|
+
if (procRegistry.findConflicts(config.app.appId).length > 0) {
|
|
128
|
+
return "Feishu serve is already running. Use `/feishu status` for details.";
|
|
129
|
+
}
|
|
130
|
+
// Spawn detached subprocess. Redirect stdout/stderr to a log file so we
|
|
131
|
+
// don't fight the TUI for the terminal. Use process.execPath + argv[1] so
|
|
132
|
+
// the subprocess inherits whatever way the user launched the TUI (npm bin,
|
|
133
|
+
// node dist/main.js, bun dist/main.js, etc.).
|
|
134
|
+
const scriptPath = process.argv[1];
|
|
135
|
+
if (!scriptPath) {
|
|
136
|
+
return "Cannot determine bubble script path; please launch from shell instead.";
|
|
137
|
+
}
|
|
138
|
+
const stdoutLog = join(getLogsDir(), "serve-stdout.log");
|
|
139
|
+
const stderrLog = join(getLogsDir(), "serve-stderr.log");
|
|
140
|
+
let outFd;
|
|
141
|
+
let errFd;
|
|
142
|
+
try {
|
|
143
|
+
outFd = openSync(stdoutLog, "a");
|
|
144
|
+
errFd = openSync(stderrLog, "a");
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
return `Failed to open log files: ${err.message}`;
|
|
148
|
+
}
|
|
149
|
+
let child;
|
|
150
|
+
try {
|
|
151
|
+
child = spawn(process.execPath, [scriptPath, "serve", "--feishu"], {
|
|
152
|
+
detached: true,
|
|
153
|
+
stdio: ["ignore", outFd, errFd],
|
|
154
|
+
env: { ...process.env },
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
return `Failed to spawn: ${err.message}`;
|
|
159
|
+
}
|
|
160
|
+
// unref so the parent (TUI) can exit without waiting for the child.
|
|
161
|
+
child.unref();
|
|
162
|
+
// If spawn failed asynchronously, we won't catch it here — the user will
|
|
163
|
+
// see emptiness in /feishu status, which then prompts them to check logs.
|
|
164
|
+
return [
|
|
165
|
+
`🚀 Started Feishu serve (pid ${child.pid ?? "?"}).`,
|
|
166
|
+
` stdout: \`${stdoutLog}\``,
|
|
167
|
+
` stderr: \`${stderrLog}\``,
|
|
168
|
+
"",
|
|
169
|
+
"Use `/feishu status` to verify, `/feishu logs` to tail.",
|
|
170
|
+
].join("\n");
|
|
171
|
+
}
|
|
172
|
+
function runStop() {
|
|
173
|
+
if (!configExists())
|
|
174
|
+
return "No config — nothing to stop.";
|
|
175
|
+
let config;
|
|
176
|
+
try {
|
|
177
|
+
config = loadConfig();
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
return `Failed to read config: ${err.message}`;
|
|
181
|
+
}
|
|
182
|
+
const procRegistry = new ProcessRegistry();
|
|
183
|
+
const conflicts = procRegistry.findConflicts(config.app.appId);
|
|
184
|
+
if (conflicts.length === 0) {
|
|
185
|
+
return "Feishu serve is not running.";
|
|
186
|
+
}
|
|
187
|
+
const killed = procRegistry.killConflicts(config.app.appId);
|
|
188
|
+
if (killed === 0) {
|
|
189
|
+
return "Found stale registry entries but no live processes — cleaned up.";
|
|
190
|
+
}
|
|
191
|
+
return `⏹ Sent SIGTERM to ${killed} process(es). Use \`/feishu status\` to confirm shutdown.`;
|
|
192
|
+
}
|
|
193
|
+
function runDiscover() {
|
|
194
|
+
if (!configExists()) {
|
|
195
|
+
return "未配置。先跑 `/feishu setup`。";
|
|
196
|
+
}
|
|
197
|
+
let config;
|
|
198
|
+
try {
|
|
199
|
+
config = loadConfig();
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
return `Failed to read config: ${err.message}`;
|
|
203
|
+
}
|
|
204
|
+
// Scan today's + yesterday's log for `scope_not_found` (or user_not_allowed)
|
|
205
|
+
// events. Most recent first.
|
|
206
|
+
const events = collectGateEvents();
|
|
207
|
+
if (events.length === 0) {
|
|
208
|
+
return [
|
|
209
|
+
"没找到未授权的 chat 记录。",
|
|
210
|
+
"",
|
|
211
|
+
"确保:",
|
|
212
|
+
"1. `/feishu start` 已经把服务跑起来了(`/feishu status` 看一下)",
|
|
213
|
+
"2. 你已经在手机飞书里给 bot 发过至少一条消息",
|
|
214
|
+
"3. 如果之前测试过,可能已经被 `requireMentionInGroup` 过滤;用私聊试试",
|
|
215
|
+
].join("\n");
|
|
216
|
+
}
|
|
217
|
+
const known = new Set(loadKnownChats());
|
|
218
|
+
const unknown = events.filter((e) => !known.has(e.chatId));
|
|
219
|
+
if (unknown.length === 0) {
|
|
220
|
+
return [
|
|
221
|
+
"找到的 chat 都已经配置过了:",
|
|
222
|
+
...events.slice(0, 5).map((e) => `- ${e.chatId} (user ${e.userId}, ${e.reason})`),
|
|
223
|
+
].join("\n");
|
|
224
|
+
}
|
|
225
|
+
const lines = [
|
|
226
|
+
`发现 ${unknown.length} 个未授权的 chat:`,
|
|
227
|
+
"",
|
|
228
|
+
];
|
|
229
|
+
// Group by chatId, keep latest senderId per chat.
|
|
230
|
+
const byChat = new Map();
|
|
231
|
+
for (const e of unknown) {
|
|
232
|
+
if (!byChat.has(e.chatId))
|
|
233
|
+
byChat.set(e.chatId, e);
|
|
234
|
+
}
|
|
235
|
+
let idx = 1;
|
|
236
|
+
for (const [chatId, info] of byChat.entries()) {
|
|
237
|
+
lines.push(`${idx}. \`${chatId}\``);
|
|
238
|
+
lines.push(` sender: \`${info.userId}\` · ${info.reason} · ${info.ts}`);
|
|
239
|
+
lines.push(` → \`/feishu bind ${chatId} <你的项目路径>\``);
|
|
240
|
+
lines.push("");
|
|
241
|
+
idx++;
|
|
242
|
+
}
|
|
243
|
+
lines.push(`(owner open_id = \`${config.app.ownerOpenId}\`,会自动加入新 scope 的 allowedUsers)`);
|
|
244
|
+
return lines.join("\n");
|
|
245
|
+
}
|
|
246
|
+
function collectGateEvents() {
|
|
247
|
+
const today = new Date();
|
|
248
|
+
const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000);
|
|
249
|
+
const dates = [iso(today), iso(yesterday)];
|
|
250
|
+
const all = [];
|
|
251
|
+
for (const d of dates) {
|
|
252
|
+
const path = join(getLogsDir(), `${d}.log`);
|
|
253
|
+
if (!existsSync(path))
|
|
254
|
+
continue;
|
|
255
|
+
let raw;
|
|
256
|
+
try {
|
|
257
|
+
raw = readFileSync(path, "utf8");
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
for (const line of raw.split("\n")) {
|
|
263
|
+
if (!line.trim())
|
|
264
|
+
continue;
|
|
265
|
+
try {
|
|
266
|
+
const obj = JSON.parse(line);
|
|
267
|
+
if (obj.msg !== "gate_rejected")
|
|
268
|
+
continue;
|
|
269
|
+
all.push({
|
|
270
|
+
chatId: String(obj.chatId ?? ""),
|
|
271
|
+
userId: String(obj.userId ?? ""),
|
|
272
|
+
reason: String(obj.reason ?? ""),
|
|
273
|
+
ts: String(obj.ts ?? "").slice(11, 19),
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
catch { /* skip */ }
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return all.reverse(); // newest first
|
|
280
|
+
}
|
|
281
|
+
function iso(d) {
|
|
282
|
+
return d.toISOString().slice(0, 10);
|
|
283
|
+
}
|
|
284
|
+
function loadKnownChats() {
|
|
285
|
+
try {
|
|
286
|
+
return ScopeRegistry.load().list().map((s) => s.chatId);
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
return [];
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
function runBind(args) {
|
|
293
|
+
if (!configExists()) {
|
|
294
|
+
return "未配置。先跑 `/feishu setup`。";
|
|
295
|
+
}
|
|
296
|
+
let config;
|
|
297
|
+
try {
|
|
298
|
+
config = loadConfig();
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
return `Failed to read config: ${err.message}`;
|
|
302
|
+
}
|
|
303
|
+
if (args.length < 2) {
|
|
304
|
+
return [
|
|
305
|
+
"用法:`/feishu bind <chat_id> <cwd> [display_name]`",
|
|
306
|
+
"",
|
|
307
|
+
"示例:`/feishu bind oc_abc123 ~/projects/my-app my-app`",
|
|
308
|
+
"",
|
|
309
|
+
"用 `/feishu discover` 找到未授权的 chat_id。",
|
|
310
|
+
].join("\n");
|
|
311
|
+
}
|
|
312
|
+
const chatId = args[0].trim();
|
|
313
|
+
const cwdRaw = args[1].trim();
|
|
314
|
+
const displayName = args.slice(2).join(" ").trim();
|
|
315
|
+
// Expand ~
|
|
316
|
+
const cwd = (cwdRaw === "~" || cwdRaw.startsWith("~/"))
|
|
317
|
+
? (process.env.HOME ?? "") + cwdRaw.slice(1)
|
|
318
|
+
: cwdRaw;
|
|
319
|
+
// Validate
|
|
320
|
+
let stat;
|
|
321
|
+
try {
|
|
322
|
+
stat = existsSync(cwd) ? statSync(cwd) : undefined;
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
stat = undefined;
|
|
326
|
+
}
|
|
327
|
+
if (!stat || !stat.isDirectory()) {
|
|
328
|
+
return `❌ cwd 无效(不存在或不是目录):\`${cwd}\``;
|
|
329
|
+
}
|
|
330
|
+
if (!chatId.startsWith("oc_")) {
|
|
331
|
+
// Not strictly required, but worth flagging.
|
|
332
|
+
return `⚠️ chat_id 看起来不像飞书的(一般以 \`oc_\` 开头)。确认无误后强制添加请直接编辑 \`~/.bubble/feishu/scopes.json\`。收到:\`${chatId}\``;
|
|
333
|
+
}
|
|
334
|
+
const registry = ScopeRegistry.load();
|
|
335
|
+
if (registry.has(chatId)) {
|
|
336
|
+
return `⚠️ scope \`${chatId}\` 已存在。如果想改 cwd,先 \`rm ~/.bubble/feishu/scopes.json\` 里手动调,或者用 \`/cd\` 在飞书会话里切换。`;
|
|
337
|
+
}
|
|
338
|
+
const finalName = displayName || basenameOf(cwd);
|
|
339
|
+
registry.upsert(chatId, {
|
|
340
|
+
cwd,
|
|
341
|
+
displayName: finalName,
|
|
342
|
+
allowedUsers: [config.app.ownerOpenId],
|
|
343
|
+
admins: [config.app.ownerOpenId],
|
|
344
|
+
defaultPermissionMode: "default",
|
|
345
|
+
model: null,
|
|
346
|
+
createdAt: Date.now(),
|
|
347
|
+
lastActiveAt: Date.now(),
|
|
348
|
+
});
|
|
349
|
+
return [
|
|
350
|
+
`✅ 已绑定 scope:`,
|
|
351
|
+
` chat: \`${chatId}\``,
|
|
352
|
+
` cwd: \`${cwd}\``,
|
|
353
|
+
` name: \`${finalName}\``,
|
|
354
|
+
` allowedUsers: [\`${config.app.ownerOpenId}\`]`,
|
|
355
|
+
"",
|
|
356
|
+
"现在去飞书重新发条消息,应该能看到卡片回复了。",
|
|
357
|
+
].join("\n");
|
|
358
|
+
}
|
|
359
|
+
function basenameOf(p) {
|
|
360
|
+
const parts = p.split(/[\\/]/);
|
|
361
|
+
return parts[parts.length - 1] || p;
|
|
362
|
+
}
|
|
363
|
+
function runLogs(n) {
|
|
364
|
+
const tailN = Number.isFinite(n) && n > 0 ? Math.min(n, 500) : 30;
|
|
365
|
+
const dateKey = new Date().toISOString().slice(0, 10);
|
|
366
|
+
const path = join(getLogsDir(), `${dateKey}.log`);
|
|
367
|
+
if (!existsSync(path)) {
|
|
368
|
+
// Fall back to the most recent log file in the dir.
|
|
369
|
+
return `No log file for today yet (\`${path}\`). Start the service first or check \`${getLogsDir()}\`.`;
|
|
370
|
+
}
|
|
371
|
+
let raw;
|
|
372
|
+
try {
|
|
373
|
+
raw = readFileSync(path, "utf8");
|
|
374
|
+
}
|
|
375
|
+
catch (err) {
|
|
376
|
+
return `Failed to read log: ${err.message}`;
|
|
377
|
+
}
|
|
378
|
+
const lines = raw.split("\n").filter((l) => l.trim() !== "");
|
|
379
|
+
const slice = lines.slice(-tailN);
|
|
380
|
+
if (slice.length === 0)
|
|
381
|
+
return `(log is empty: \`${path}\`)`;
|
|
382
|
+
// Format JSON lines compactly for readability in chat.
|
|
383
|
+
const formatted = slice.map((line) => {
|
|
384
|
+
try {
|
|
385
|
+
const obj = JSON.parse(line);
|
|
386
|
+
const ts = String(obj.ts ?? "").slice(11, 19);
|
|
387
|
+
const lvl = String(obj.level ?? "?").padEnd(5);
|
|
388
|
+
const msg = String(obj.msg ?? "");
|
|
389
|
+
const extra = Object.entries(obj)
|
|
390
|
+
.filter(([k]) => !["ts", "level", "msg"].includes(k))
|
|
391
|
+
.map(([k, v]) => `${k}=${typeof v === "string" ? v : JSON.stringify(v)}`)
|
|
392
|
+
.join(" ");
|
|
393
|
+
return `${ts} ${lvl} ${msg}${extra ? " " + extra : ""}`;
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
return line;
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
return ["```", ...formatted, "```", `(${slice.length} lines from \`${path}\`)`].join("\n");
|
|
400
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SlashCommandRegistry } from "./registry.js";
|
|
2
|
+
import { builtinSlashCommands } from "./commands.js";
|
|
3
|
+
export const registry = new SlashCommandRegistry();
|
|
4
|
+
for (const cmd of builtinSlashCommands) {
|
|
5
|
+
registry.register(cmd);
|
|
6
|
+
}
|
|
7
|
+
export * from "./types.js";
|
|
8
|
+
export * from "./registry.js";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { SlashCommand, SlashCommandContext, SlashCommandResultDetail } from "./types.js";
|
|
2
|
+
import { type CommandSource, type UnifiedCommand } from "./unified.js";
|
|
3
|
+
/**
|
|
4
|
+
* Dynamic source: called at lookup time to produce extra commands (e.g. MCP
|
|
5
|
+
* prompts loaded from a server after connect). The registry only keeps the
|
|
6
|
+
* callback — commands are never cached, so re-registering after a reconnect
|
|
7
|
+
* just works.
|
|
8
|
+
*
|
|
9
|
+
* Sources may return bare SlashCommand objects for backwards compatibility;
|
|
10
|
+
* the registry treats unlabelled commands as source: "builtin". MCP's dynamic
|
|
11
|
+
* source returns UnifiedCommand with source: "mcp".
|
|
12
|
+
*/
|
|
13
|
+
export type DynamicSource = () => SlashCommand[];
|
|
14
|
+
export declare class SlashCommandRegistry {
|
|
15
|
+
private commands;
|
|
16
|
+
private dynamicSources;
|
|
17
|
+
register(cmd: SlashCommand): void;
|
|
18
|
+
addDynamicSource(source: DynamicSource): void;
|
|
19
|
+
get(name: string): UnifiedCommand | undefined;
|
|
20
|
+
list(): UnifiedCommand[];
|
|
21
|
+
/**
|
|
22
|
+
* Convenience filter used by UI code that wants to group by source
|
|
23
|
+
* (e.g. builtin first, then mcp) without filtering in-line every time.
|
|
24
|
+
*/
|
|
25
|
+
listBySource(source: CommandSource): UnifiedCommand[];
|
|
26
|
+
execute(input: string, ctx: SlashCommandContext): Promise<{
|
|
27
|
+
handled: boolean;
|
|
28
|
+
result?: string;
|
|
29
|
+
inject?: string;
|
|
30
|
+
detail?: SlashCommandResultDetail;
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { asUnified } from "./unified.js";
|
|
2
|
+
export class SlashCommandRegistry {
|
|
3
|
+
commands = new Map();
|
|
4
|
+
dynamicSources = [];
|
|
5
|
+
register(cmd) {
|
|
6
|
+
this.commands.set(cmd.name, asUnified(cmd, "builtin"));
|
|
7
|
+
}
|
|
8
|
+
addDynamicSource(source) {
|
|
9
|
+
this.dynamicSources.push(source);
|
|
10
|
+
}
|
|
11
|
+
get(name) {
|
|
12
|
+
const builtin = this.commands.get(name);
|
|
13
|
+
if (builtin)
|
|
14
|
+
return builtin;
|
|
15
|
+
for (const source of this.dynamicSources) {
|
|
16
|
+
for (const cmd of source()) {
|
|
17
|
+
if (cmd.name === name)
|
|
18
|
+
return asUnified(cmd);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
list() {
|
|
24
|
+
const out = [...this.commands.values()];
|
|
25
|
+
for (const source of this.dynamicSources) {
|
|
26
|
+
for (const cmd of source()) {
|
|
27
|
+
out.push(asUnified(cmd));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Convenience filter used by UI code that wants to group by source
|
|
34
|
+
* (e.g. builtin first, then mcp) without filtering in-line every time.
|
|
35
|
+
*/
|
|
36
|
+
listBySource(source) {
|
|
37
|
+
return this.list().filter((cmd) => cmd.source === source);
|
|
38
|
+
}
|
|
39
|
+
async execute(input, ctx) {
|
|
40
|
+
if (!input.startsWith("/"))
|
|
41
|
+
return { handled: false };
|
|
42
|
+
const spaceIndex = input.indexOf(" ");
|
|
43
|
+
const name = spaceIndex === -1 ? input.slice(1) : input.slice(1, spaceIndex);
|
|
44
|
+
const args = spaceIndex === -1 ? "" : input.slice(spaceIndex + 1).trim();
|
|
45
|
+
const cmd = this.get(name);
|
|
46
|
+
if (!cmd) {
|
|
47
|
+
const skill = ctx.skillRegistry.get(name);
|
|
48
|
+
if (skill) {
|
|
49
|
+
return {
|
|
50
|
+
handled: true,
|
|
51
|
+
result: `Skill "${skill.meta.name}": ${skill.meta.description}\nUse /${skill.meta.name} <your request> to run with this skill, or /skills to choose from the picker.`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
handled: true,
|
|
56
|
+
result: `Unknown command: /${name}. Use /help to see available commands.`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const output = await cmd.handler(args, ctx);
|
|
61
|
+
if (output && typeof output === "object" && "inject" in output) {
|
|
62
|
+
return { handled: true, inject: output.inject };
|
|
63
|
+
}
|
|
64
|
+
if (output && typeof output === "object" && "result" in output) {
|
|
65
|
+
return { handled: true, result: output.result, detail: output.detail };
|
|
66
|
+
}
|
|
67
|
+
return { handled: true, result: typeof output === "string" ? output : undefined };
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
return { handled: true, result: `Error: ${err.message || String(err)}` };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { Agent } from "../agent.js";
|
|
2
|
+
import type { SessionManager, SessionMetadata } from "../session.js";
|
|
3
|
+
import type { Provider } from "../types.js";
|
|
4
|
+
import type { ProviderRegistry } from "../provider-registry.js";
|
|
5
|
+
import type { SkillRegistry } from "../skills/registry.js";
|
|
6
|
+
import type { BashAllowlist } from "../approval/session-cache.js";
|
|
7
|
+
import type { SettingsManager } from "../permissions/settings.js";
|
|
8
|
+
import type { McpManager } from "../mcp/manager.js";
|
|
9
|
+
import type { LspService } from "../lsp/index.js";
|
|
10
|
+
import type { MemoryScope } from "../memory/index.js";
|
|
11
|
+
import type { ThemeMode } from "../config.js";
|
|
12
|
+
import type { ExternalHookController } from "../hooks/controller.js";
|
|
13
|
+
import type { ExternalRuntimeManager } from "../external-runtime/types.js";
|
|
14
|
+
import type { ContextUsageSnapshot } from "../context/usage.js";
|
|
15
|
+
/**
|
|
16
|
+
* Live progress for a manual `/compact` run. `phase` advances collecting →
|
|
17
|
+
* summarizing → applying; interactive hosts can use it for diagnostics while
|
|
18
|
+
* the visible Grok-style activity lane remains a stable `Compacting…` state.
|
|
19
|
+
* Hosts without a UI omit the sink.
|
|
20
|
+
*/
|
|
21
|
+
export interface CompactionProgress {
|
|
22
|
+
phase: "collecting" | "summarizing" | "applying";
|
|
23
|
+
streamedChars: number;
|
|
24
|
+
}
|
|
25
|
+
export interface SlashCommandResultDetail {
|
|
26
|
+
kind: "compaction-summary";
|
|
27
|
+
content: string;
|
|
28
|
+
}
|
|
29
|
+
export interface SlashCommandContext {
|
|
30
|
+
agent: Agent;
|
|
31
|
+
addMessage: (role: "user" | "assistant" | "error", content: string) => void;
|
|
32
|
+
clearMessages: () => void;
|
|
33
|
+
cwd: string;
|
|
34
|
+
exit: () => void;
|
|
35
|
+
sessionManager?: SessionManager;
|
|
36
|
+
createProvider: (providerId: string, apiKey: string, baseURL: string) => Provider;
|
|
37
|
+
openPicker: (mode: "model" | "key" | "provider" | "provider-add" | "login" | "logout" | "skill" | "theme" | "feishu-setup", providerId?: string) => void;
|
|
38
|
+
registry: ProviderRegistry;
|
|
39
|
+
skillRegistry: SkillRegistry;
|
|
40
|
+
bashAllowlist?: BashAllowlist;
|
|
41
|
+
settingsManager?: SettingsManager;
|
|
42
|
+
hookController?: ExternalHookController;
|
|
43
|
+
mcpManager?: McpManager;
|
|
44
|
+
lspService?: LspService;
|
|
45
|
+
flushMemory?: () => Promise<void>;
|
|
46
|
+
runMemoryCompaction?: () => Promise<string>;
|
|
47
|
+
runMemorySummary?: (scope?: MemoryScope) => Promise<string>;
|
|
48
|
+
runMemoryRefresh?: (scope?: MemoryScope) => Promise<string>;
|
|
49
|
+
/** Get the current theme mode (auto/light/dark) — undefined when running in non-TUI contexts. */
|
|
50
|
+
getThemeMode?: () => ThemeMode;
|
|
51
|
+
/** Get the resolved active theme (always light or dark) — undefined when running in non-TUI contexts. */
|
|
52
|
+
getResolvedTheme?: () => "light" | "dark";
|
|
53
|
+
/** Persist a new theme mode AND apply it to the running TUI. */
|
|
54
|
+
setThemeMode?: (mode: ThemeMode) => void;
|
|
55
|
+
/** Open the feedback dialog. `initialDescription` prefills the description field. */
|
|
56
|
+
openFeedback?: (initialDescription: string) => void;
|
|
57
|
+
/** Open the interactive rewind picker. When absent, /rewind falls back to a text listing. */
|
|
58
|
+
openRewindPicker?: () => void;
|
|
59
|
+
/** Open the interactive session picker. When absent, /session falls back to a text listing. */
|
|
60
|
+
openSessionPicker?: () => void;
|
|
61
|
+
/** Replace the composer/input box content (e.g. /rewind restores the rewound message for re-editing). */
|
|
62
|
+
fillComposer?: (text: string) => void;
|
|
63
|
+
/** Re-project host transcript state after a command rewrites agent.messages. */
|
|
64
|
+
rebuildTranscript?: () => void;
|
|
65
|
+
/** Open the interactive usage stats panel. */
|
|
66
|
+
openStats?: () => void;
|
|
67
|
+
/** Open the interactive context-usage panel. Text-only hosts omit this. */
|
|
68
|
+
openContextInfo?: (snapshot: ContextUsageSnapshot) => void;
|
|
69
|
+
/** Execute the persistent autonomous Goal lifecycle in an interactive host. */
|
|
70
|
+
handleGoalCommand?: (input: string) => void | Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Push live compaction progress to the running TUI. Pass a progress object
|
|
73
|
+
* while compacting and `null` to clear the indicator. Absent in non-TUI hosts.
|
|
74
|
+
*/
|
|
75
|
+
compactionProgress?: (progress: CompactionProgress | null) => void;
|
|
76
|
+
/** Cancellation signal owned by the interactive host's Compact activity. */
|
|
77
|
+
compactionAbortSignal?: AbortSignal;
|
|
78
|
+
/** External agent runtime used by Grok subscription chat. */
|
|
79
|
+
externalRuntime?: ExternalRuntimeManager;
|
|
80
|
+
/**
|
|
81
|
+
* Atomically create and bind a fresh Bubble session with optional metadata.
|
|
82
|
+
* External runtimes are session-affine, so crossing the native/external
|
|
83
|
+
* boundary never reuses history.
|
|
84
|
+
*/
|
|
85
|
+
startFreshSession?: (metadata?: Partial<SessionMetadata>) => Promise<SessionManager>;
|
|
86
|
+
/** Stop the external runtime and atomically enter a fresh native session. */
|
|
87
|
+
transitionToNative?: () => Promise<SessionManager | undefined>;
|
|
88
|
+
/** Refresh TUI state after a command changes the external session binding. */
|
|
89
|
+
onExternalRuntimeChange?: (manager?: SessionManager) => void;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Return types for a slash command handler:
|
|
93
|
+
* - string | void: the string (if any) is displayed as an assistant message
|
|
94
|
+
* - { inject }: the content is sent to the agent as the user's next turn
|
|
95
|
+
* (used by MCP prompts that expand a template into a user message)
|
|
96
|
+
* - { result, detail }: keep the visible result terse while exposing
|
|
97
|
+
* structured, host-rendered detail such as an inspectable Compact summary
|
|
98
|
+
*/
|
|
99
|
+
export type SlashCommandOutput = string | void | {
|
|
100
|
+
inject: string;
|
|
101
|
+
} | {
|
|
102
|
+
result: string;
|
|
103
|
+
detail?: SlashCommandResultDetail;
|
|
104
|
+
};
|
|
105
|
+
export interface SlashCommand {
|
|
106
|
+
name: string;
|
|
107
|
+
description: string;
|
|
108
|
+
handler: (args: string, ctx: SlashCommandContext) => Promise<SlashCommandOutput>;
|
|
109
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|