@bubblebrain-ai/bubble 0.0.51 → 0.0.53
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 +4 -12
- package/dist/agent/routing-catalog.js +3 -2
- package/dist/agent/subagent/router.js +5 -0
- package/dist/agent/subagent/runtime.d.ts +1 -0
- package/dist/agent/subagent/runtime.js +13 -1
- package/dist/agent/subagent-control.d.ts +4 -0
- package/dist/agent/subagent-control.js +1 -0
- package/dist/agent/subagent-store.js +2 -0
- package/dist/agent/workflow/control.d.ts +2 -0
- package/dist/agent/workflow/runs.d.ts +1 -0
- package/dist/agent/workflow/runs.js +3 -0
- package/dist/agent.d.ts +11 -1
- package/dist/agent.js +158 -57
- package/dist/bin.js +2 -44
- package/dist/config.d.ts +14 -1
- package/dist/config.js +45 -4
- package/dist/context/budget.d.ts +7 -1
- package/dist/context/budget.js +25 -2
- package/dist/context/compact-llm.d.ts +1 -1
- package/dist/context/compact-llm.js +5 -2
- package/dist/context/overflow.js +2 -0
- package/dist/context/projector.d.ts +8 -0
- package/dist/context/projector.js +55 -6
- package/dist/context/tool-output-truncate.d.ts +17 -1
- package/dist/context/tool-output-truncate.js +171 -49
- package/dist/feishu/agent-host/run-driver.js +3 -0
- package/dist/feishu/serve.js +2 -0
- package/dist/goal/command.d.ts +1 -1
- package/dist/goal/command.js +7 -2
- package/dist/main.d.ts +1 -1
- package/dist/main.js +38 -8
- package/dist/memory/db.js +0 -7
- package/dist/model-catalog.js +25 -6
- package/dist/model-config.js +3 -2
- package/dist/model-pricing.d.ts +24 -5
- package/dist/model-pricing.js +0 -0
- package/dist/model-selection.js +13 -4
- package/dist/network/chatgpt-transport.js +0 -34
- package/dist/network/errors.d.ts +19 -0
- package/dist/network/errors.js +24 -0
- package/dist/network/provider-transport.d.ts +0 -4
- package/dist/network/provider-transport.js +3 -35
- package/dist/network/retry.d.ts +6 -1
- package/dist/network/retry.js +9 -0
- package/dist/provider-model-policy.d.ts +16 -0
- package/dist/provider-model-policy.js +33 -0
- package/dist/provider-registry.d.ts +1 -1
- package/dist/provider-registry.js +80 -11
- package/dist/provider-transform.js +32 -4
- package/dist/provider.d.ts +6 -2
- package/dist/provider.js +100 -11
- package/dist/question/controller.js +5 -4
- package/dist/question/normalize.d.ts +6 -0
- package/dist/question/normalize.js +11 -0
- package/dist/rewind.d.ts +20 -0
- package/dist/rewind.js +29 -0
- package/dist/sdk/index.d.ts +1 -1
- package/dist/sdk/index.js +11 -3
- package/dist/session.d.ts +7 -0
- package/dist/session.js +20 -0
- package/dist/skills/discovery.js +18 -0
- package/dist/skills/registry.d.ts +12 -2
- package/dist/skills/registry.js +40 -5
- package/dist/skills/types.d.ts +2 -0
- package/dist/slash-commands/commands.js +120 -81
- package/dist/slash-commands/registry.d.ts +2 -1
- package/dist/slash-commands/registry.js +3 -0
- package/dist/slash-commands/types.d.ts +22 -4
- package/dist/stats/usage.d.ts +3 -1
- package/dist/stats/usage.js +22 -13
- package/dist/tasks/manager.d.ts +4 -2
- package/dist/tasks/manager.js +34 -9
- package/dist/tasks/promotion.d.ts +2 -2
- package/dist/tasks/promotion.js +2 -2
- package/dist/tools/agent-lifecycle.js +4 -0
- package/dist/tools/bash.d.ts +3 -1
- package/dist/tools/bash.js +13 -2
- package/dist/tools/grep.d.ts +5 -1
- package/dist/tools/grep.js +318 -69
- package/dist/tools/index.d.ts +3 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/question.js +5 -4
- package/dist/tools/read.js +40 -21
- 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 +1647 -0
- package/dist/tui/components/approval-dialog.d.ts +43 -0
- package/dist/tui/components/approval-dialog.js +247 -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 +59 -0
- package/dist/tui/components/skills-panel.js +568 -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 +393 -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 +88 -0
- package/dist/tui/components/tasks-pane.js +416 -0
- package/dist/tui/components/transcript.d.ts +96 -0
- package/dist/tui/components/transcript.js +771 -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 +61 -0
- package/dist/tui/composer-autocomplete.js +383 -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 +238 -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 +194 -0
- package/dist/tui/controller/controller.js +1035 -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/footer.d.ts +37 -0
- package/dist/tui/footer.js +80 -0
- package/dist/{tui-ink → tui/formatting}/edit-diff.d.ts +1 -1
- package/dist/{tui-ink → tui/formatting}/edit-diff.js +1 -1
- package/dist/{tui-ink/app-helpers.d.ts → tui/formatting/summary.d.ts} +4 -4
- package/dist/{tui-ink/app-helpers.js → tui/formatting/summary.js} +2 -2
- package/dist/tui/fullscreen.d.ts +48 -0
- package/dist/tui/fullscreen.js +255 -0
- package/dist/tui/image-display.d.ts +4 -0
- package/dist/tui/image-display.js +30 -12
- package/dist/tui/markdown-style.d.ts +5 -0
- package/dist/tui/markdown-style.js +23 -0
- package/dist/{tui-ink → tui/model}/composer-buffer.js +1 -1
- package/dist/tui/model/composer-types.d.ts +17 -0
- package/dist/tui/model/composer-types.js +1 -0
- package/dist/{tui-ink → tui/model}/display-history.d.ts +7 -1
- package/dist/{tui-ink → tui/model}/display-reconstruct.d.ts +1 -1
- package/dist/{tui-ink → tui/model}/display-reconstruct.js +54 -6
- package/dist/{tui-ink → tui/model}/file-mentions.d.ts +2 -0
- package/dist/{tui-ink → tui/model}/file-mentions.js +4 -0
- package/dist/tui/model/image-attachment.d.ts +15 -0
- package/dist/tui/model/image-attachment.js +1 -0
- package/dist/{tui-ink → tui/model}/image-paste.d.ts +7 -1
- package/dist/{tui-ink → tui/model}/image-paste.js +46 -0
- package/dist/tui/model/input-history.d.ts +1 -0
- package/dist/tui/model/input-history.js +1 -0
- package/dist/{tui-ink → tui/model}/input-queue.d.ts +1 -1
- package/dist/{tui-ink → tui/model}/recent-activity.js +1 -1
- package/dist/{tui-ink → tui/model}/subagent-view.d.ts +17 -2
- package/dist/{tui-ink → tui/model}/subagent-view.js +125 -4
- package/dist/{tui-ink → tui/model}/submit-dedupe.d.ts +1 -1
- package/dist/tui/model/theme-style.d.ts +10 -0
- package/dist/tui/model/theme-style.js +79 -0
- package/dist/{tui-ink → tui/model}/theme.d.ts +11 -23
- package/dist/{tui-ink → tui/model}/theme.js +23 -38
- package/dist/{tui-ink → tui/model}/trace-groups.d.ts +2 -0
- package/dist/{tui-ink → tui/model}/trace-groups.js +91 -30
- package/dist/tui/model/trace-interaction.d.ts +63 -0
- package/dist/tui/model/trace-interaction.js +87 -0
- package/dist/tui/model-picker-data.d.ts +1 -2
- package/dist/tui/model-picker-data.js +8 -1
- package/dist/tui/model-switch.js +2 -0
- package/dist/{tui-ink → tui}/run-session-picker.d.ts +2 -3
- 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/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.js +27 -6
- package/dist/types.d.ts +7 -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 +140 -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 +1334 -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 +338 -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 +1016 -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/package.json +23 -10
- package/packages/pi-tui/node_modules/marked/LICENSE +44 -0
- package/packages/pi-tui/node_modules/marked/README.md +115 -0
- package/packages/pi-tui/node_modules/marked/bin/main.js +284 -0
- package/packages/pi-tui/node_modules/marked/bin/marked.js +16 -0
- package/packages/pi-tui/node_modules/marked/lib/marked.d.ts +760 -0
- package/packages/pi-tui/node_modules/marked/lib/marked.esm.js +77 -0
- package/packages/pi-tui/node_modules/marked/lib/marked.esm.js.map +7 -0
- package/packages/pi-tui/node_modules/marked/lib/marked.umd.js +79 -0
- package/packages/pi-tui/node_modules/marked/lib/marked.umd.js.map +7 -0
- package/packages/pi-tui/node_modules/marked/man/marked.1 +113 -0
- package/packages/pi-tui/node_modules/marked/man/marked.1.md +93 -0
- package/packages/pi-tui/node_modules/marked/package.json +103 -0
- package/dist/tui-ink/app.d.ts +0 -76
- package/dist/tui-ink/app.js +0 -2377
- package/dist/tui-ink/approval/approval-dialog.d.ts +0 -13
- package/dist/tui-ink/approval/approval-dialog.js +0 -184
- package/dist/tui-ink/approval/diff-view.d.ts +0 -7
- package/dist/tui-ink/approval/diff-view.js +0 -44
- package/dist/tui-ink/approval/select.d.ts +0 -35
- package/dist/tui-ink/approval/select.js +0 -98
- package/dist/tui-ink/code-highlight.d.ts +0 -8
- package/dist/tui-ink/code-highlight.js +0 -121
- package/dist/tui-ink/command-palette.d.ts +0 -32
- package/dist/tui-ink/command-palette.js +0 -158
- package/dist/tui-ink/compaction-progress.d.ts +0 -19
- package/dist/tui-ink/compaction-progress.js +0 -74
- package/dist/tui-ink/detect-theme.d.ts +0 -1
- package/dist/tui-ink/detect-theme.js +0 -1
- package/dist/tui-ink/feedback-dialog.d.ts +0 -19
- package/dist/tui-ink/feedback-dialog.js +0 -133
- package/dist/tui-ink/feishu-setup-picker.d.ts +0 -5
- package/dist/tui-ink/feishu-setup-picker.js +0 -271
- package/dist/tui-ink/footer.d.ts +0 -26
- package/dist/tui-ink/footer.js +0 -51
- package/dist/tui-ink/input-box.d.ts +0 -189
- package/dist/tui-ink/input-box.js +0 -1279
- package/dist/tui-ink/input-history.d.ts +0 -1
- package/dist/tui-ink/input-history.js +0 -1
- package/dist/tui-ink/markdown.d.ts +0 -103
- package/dist/tui-ink/markdown.js +0 -747
- package/dist/tui-ink/message-list.d.ts +0 -49
- package/dist/tui-ink/message-list.js +0 -841
- package/dist/tui-ink/model-picker.d.ts +0 -143
- package/dist/tui-ink/model-picker.js +0 -966
- package/dist/tui-ink/plan-confirm.d.ts +0 -7
- package/dist/tui-ink/plan-confirm.js +0 -115
- package/dist/tui-ink/question-dialog.d.ts +0 -8
- package/dist/tui-ink/question-dialog.js +0 -135
- package/dist/tui-ink/rewind-picker.d.ts +0 -8
- package/dist/tui-ink/rewind-picker.js +0 -102
- package/dist/tui-ink/run-session-picker.js +0 -22
- package/dist/tui-ink/run.d.ts +0 -62
- package/dist/tui-ink/run.js +0 -103
- package/dist/tui-ink/session-picker.d.ts +0 -10
- package/dist/tui-ink/session-picker.js +0 -113
- package/dist/tui-ink/stats-panel.d.ts +0 -11
- package/dist/tui-ink/stats-panel.js +0 -65
- package/dist/tui-ink/subagent-inspector.d.ts +0 -21
- package/dist/tui-ink/subagent-inspector.js +0 -205
- package/dist/tui-ink/use-terminal-size.d.ts +0 -4
- package/dist/tui-ink/use-terminal-size.js +0 -48
- package/dist/tui-ink/waiting-indicator.d.ts +0 -12
- package/dist/tui-ink/waiting-indicator.js +0 -129
- package/dist/tui-ink/welcome.d.ts +0 -25
- package/dist/tui-ink/welcome.js +0 -88
- package/dist/tui-ink/wordmark.d.ts +0 -8
- package/dist/tui-ink/wordmark.js +0 -103
- /package/dist/{tui-ink → tui/model}/composer-buffer.d.ts +0 -0
- /package/dist/{tui-ink → tui/model}/display-history.js +0 -0
- /package/dist/{tui-ink → tui/model}/input-queue.js +0 -0
- /package/dist/{tui-ink → tui/model}/key-events.d.ts +0 -0
- /package/dist/{tui-ink → tui/model}/key-events.js +0 -0
- /package/dist/{tui-ink → tui/model}/paste-operation-tracker.d.ts +0 -0
- /package/dist/{tui-ink → tui/model}/paste-operation-tracker.js +0 -0
- /package/dist/{tui-ink → tui/model}/recent-activity.d.ts +0 -0
- /package/dist/{tui-ink → tui/model}/submit-dedupe.js +0 -0
- /package/dist/{tui-ink → tui/model}/sync-output.d.ts +0 -0
- /package/dist/{tui-ink → tui/model}/sync-output.js +0 -0
- /package/dist/{tui-ink → tui/model}/terminal-env.d.ts +0 -0
- /package/dist/{tui-ink → tui/model}/terminal-env.js +0 -0
- /package/dist/{tui-ink → tui/model}/terminal-mouse.d.ts +0 -0
- /package/dist/{tui-ink → tui/model}/terminal-mouse.js +0 -0
- /package/dist/{tui-ink → tui/model}/width.d.ts +0 -0
- /package/dist/{tui-ink → tui/model}/width.js +0 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effects are the controller's only vocabulary for side effects. The pure
|
|
3
|
+
* reducers (agent-event-reducer, input-queue) return them; the controller
|
|
4
|
+
* applies them against its state and ports. Renderers observe state changes
|
|
5
|
+
* through snapshots, never effects.
|
|
6
|
+
*/
|
|
7
|
+
import type { DisplayMessage } from "../model/display-history.js";
|
|
8
|
+
export type ControllerEffect = {
|
|
9
|
+
kind: "stream-cleared";
|
|
10
|
+
} | {
|
|
11
|
+
kind: "stream-flushed";
|
|
12
|
+
} | {
|
|
13
|
+
kind: "tools-updated";
|
|
14
|
+
} | {
|
|
15
|
+
kind: "live-subagent-changed";
|
|
16
|
+
} | {
|
|
17
|
+
kind: "assistant-committed";
|
|
18
|
+
taskElapsedMs?: number;
|
|
19
|
+
} | {
|
|
20
|
+
kind: "permission-mode-changed";
|
|
21
|
+
mode: string;
|
|
22
|
+
} | {
|
|
23
|
+
kind: "transcript-append";
|
|
24
|
+
message: DisplayMessage;
|
|
25
|
+
} | {
|
|
26
|
+
kind: "transcript-move-message";
|
|
27
|
+
displayKey: string;
|
|
28
|
+
fullReprint: boolean;
|
|
29
|
+
} | {
|
|
30
|
+
kind: "transcript-rebuild-from-agent";
|
|
31
|
+
fullReprint: boolean;
|
|
32
|
+
} | {
|
|
33
|
+
kind: "session-append-message";
|
|
34
|
+
role: "user";
|
|
35
|
+
content: string;
|
|
36
|
+
} | {
|
|
37
|
+
kind: "queue-updated";
|
|
38
|
+
pending?: number;
|
|
39
|
+
} | {
|
|
40
|
+
kind: "external-cancel";
|
|
41
|
+
sessionId: string;
|
|
42
|
+
} | {
|
|
43
|
+
kind: "external-cancel-policy";
|
|
44
|
+
} | {
|
|
45
|
+
kind: "steer-applied";
|
|
46
|
+
id: string;
|
|
47
|
+
displayKey: string;
|
|
48
|
+
} | {
|
|
49
|
+
kind: "steer-requeued";
|
|
50
|
+
id: string;
|
|
51
|
+
displayKey: string;
|
|
52
|
+
} | {
|
|
53
|
+
kind: "steers-drained";
|
|
54
|
+
cancelled: boolean;
|
|
55
|
+
leftovers: Array<{
|
|
56
|
+
input: import("../../types.js").AgentRunInput;
|
|
57
|
+
displayKey?: string;
|
|
58
|
+
sessionFile?: string;
|
|
59
|
+
}>;
|
|
60
|
+
} | {
|
|
61
|
+
kind: "run-finished";
|
|
62
|
+
cancelled: boolean;
|
|
63
|
+
errored: boolean;
|
|
64
|
+
} | {
|
|
65
|
+
kind: "run-error";
|
|
66
|
+
error: unknown;
|
|
67
|
+
} | {
|
|
68
|
+
kind: "notice";
|
|
69
|
+
role: "assistant" | "error";
|
|
70
|
+
text: string;
|
|
71
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autonomous Goal runtime for the framework-neutral TUI controller.
|
|
3
|
+
*
|
|
4
|
+
* The GoalStore remains the single source of truth shared with the model-facing
|
|
5
|
+
* update_goal tool. This class owns the host lifecycle around it: slash command
|
|
6
|
+
* handling, session persistence, hidden continuation turns, usage accounting,
|
|
7
|
+
* and stop/resume semantics. Renderers only read the resulting snapshot.
|
|
8
|
+
*/
|
|
9
|
+
import type { SessionManager } from "../../session.js";
|
|
10
|
+
import type { GoalState, GoalStatus, GoalStore } from "../../goal/store.js";
|
|
11
|
+
export interface GoalRunSummary {
|
|
12
|
+
goalRun: boolean;
|
|
13
|
+
goalStatusAtStart?: GoalStatus;
|
|
14
|
+
cancelled: boolean;
|
|
15
|
+
errored: boolean;
|
|
16
|
+
usageTokens: number;
|
|
17
|
+
usageReported: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface GoalRuntimeControllerDeps {
|
|
20
|
+
store: GoalStore;
|
|
21
|
+
getSessionManager(): SessionManager;
|
|
22
|
+
isRunActive(): boolean;
|
|
23
|
+
queuedInputs(): number;
|
|
24
|
+
isDisposed(): boolean;
|
|
25
|
+
startRun(input: string, cwd: string): void;
|
|
26
|
+
appendMessage(role: "user" | "assistant" | "error", content: string): void;
|
|
27
|
+
onStateChanged(): void;
|
|
28
|
+
schedule?(callback: () => void): void;
|
|
29
|
+
}
|
|
30
|
+
export declare class GoalRuntimeController {
|
|
31
|
+
private readonly deps;
|
|
32
|
+
private persistSuspended;
|
|
33
|
+
private readonly unsubscribe;
|
|
34
|
+
constructor(deps: GoalRuntimeControllerDeps);
|
|
35
|
+
dispose(): void;
|
|
36
|
+
snapshot(): GoalState | null;
|
|
37
|
+
indicatorLine(): string | undefined;
|
|
38
|
+
/** Restore the newly bound session without resurrecting an autonomous run. */
|
|
39
|
+
loadCurrentSession(): void;
|
|
40
|
+
handleCommand(input: string, cwd: string): void;
|
|
41
|
+
/** Called once after every controller run, before queued next-turn input drains. */
|
|
42
|
+
afterRun(summary: GoalRunSummary, cwd: string): void;
|
|
43
|
+
private scheduleGoalTurn;
|
|
44
|
+
private persistGoal;
|
|
45
|
+
private externalRuntimeBound;
|
|
46
|
+
private notice;
|
|
47
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { formatInternalContextBlock } from "../../agent/internal-reminder-sanitizer.js";
|
|
2
|
+
import { parseGoalCommand } from "../../goal/command.js";
|
|
3
|
+
import { shouldContinueGoal, stopReasonNotice } from "../../goal/engine.js";
|
|
4
|
+
import { goalCompleteNotice, goalIndicatorLine, goalSummaryText } from "../../goal/format.js";
|
|
5
|
+
import { continuationPrompt, initialPrompt } from "../../goal/prompts.js";
|
|
6
|
+
export class GoalRuntimeController {
|
|
7
|
+
deps;
|
|
8
|
+
persistSuspended = false;
|
|
9
|
+
unsubscribe;
|
|
10
|
+
constructor(deps) {
|
|
11
|
+
this.deps = deps;
|
|
12
|
+
this.unsubscribe = deps.store.onChange((goal) => {
|
|
13
|
+
if (!this.persistSuspended)
|
|
14
|
+
this.persistGoal(goal);
|
|
15
|
+
this.deps.onStateChanged();
|
|
16
|
+
});
|
|
17
|
+
this.loadCurrentSession();
|
|
18
|
+
}
|
|
19
|
+
dispose() {
|
|
20
|
+
this.unsubscribe();
|
|
21
|
+
}
|
|
22
|
+
snapshot() {
|
|
23
|
+
return this.deps.store.snapshot();
|
|
24
|
+
}
|
|
25
|
+
indicatorLine() {
|
|
26
|
+
const goal = this.snapshot();
|
|
27
|
+
return goal ? goalIndicatorLine(goal) : undefined;
|
|
28
|
+
}
|
|
29
|
+
/** Restore the newly bound session without resurrecting an autonomous run. */
|
|
30
|
+
loadCurrentSession() {
|
|
31
|
+
let persisted;
|
|
32
|
+
try {
|
|
33
|
+
persisted = this.deps.getSessionManager().getMetadata().goal;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
persisted = undefined;
|
|
37
|
+
}
|
|
38
|
+
this.persistSuspended = true;
|
|
39
|
+
try {
|
|
40
|
+
this.deps.store.loadFrom(persisted?.status === "active" ? { ...persisted, status: "paused" } : persisted);
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
this.persistSuspended = false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
handleCommand(input, cwd) {
|
|
47
|
+
if (this.externalRuntimeBound()) {
|
|
48
|
+
this.deps.appendMessage("error", "/goal is available in native Bubble sessions, not in the current external runtime session.");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const command = parseGoalCommand(input);
|
|
52
|
+
if (command.error) {
|
|
53
|
+
this.deps.appendMessage("error", command.error);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const existing = this.snapshot();
|
|
57
|
+
switch (command.kind) {
|
|
58
|
+
case "show":
|
|
59
|
+
this.notice(existing ? goalSummaryText(existing) : "No active goal. Set one with /goal <objective>");
|
|
60
|
+
return;
|
|
61
|
+
case "clear":
|
|
62
|
+
if (!existing) {
|
|
63
|
+
this.notice("No active goal to clear");
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.deps.store.clear();
|
|
67
|
+
this.notice("Goal cleared");
|
|
68
|
+
return;
|
|
69
|
+
case "pause":
|
|
70
|
+
if (!existing) {
|
|
71
|
+
this.notice("No active goal to pause");
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
this.deps.store.pause();
|
|
75
|
+
this.notice("Goal paused — /goal resume to continue");
|
|
76
|
+
return;
|
|
77
|
+
case "resume": {
|
|
78
|
+
if (!existing) {
|
|
79
|
+
this.notice("No goal to resume. Set one with /goal <objective>");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const resumed = this.deps.store.resume();
|
|
83
|
+
if (resumed?.status !== "active") {
|
|
84
|
+
this.notice("Goal cannot be resumed (already complete)");
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.notice("Goal resumed");
|
|
88
|
+
this.scheduleGoalTurn(resumed, cwd, false);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
case "edit":
|
|
92
|
+
if (!existing) {
|
|
93
|
+
this.notice("No active goal to edit. Set one with /goal <objective>");
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this.deps.store.edit(command.objective);
|
|
97
|
+
if (command.tokenBudget !== undefined)
|
|
98
|
+
this.deps.store.setBudget(command.tokenBudget);
|
|
99
|
+
this.notice(`Goal updated: ${truncate(this.snapshot().objective, 60)}`);
|
|
100
|
+
return;
|
|
101
|
+
case "set": {
|
|
102
|
+
const goal = this.deps.store.set(command.objective, { tokenBudget: command.tokenBudget });
|
|
103
|
+
this.deps.appendMessage("user", input.trim());
|
|
104
|
+
const budgetNote = goal.tokenBudget !== undefined ? ` (budget ${goal.tokenBudget} tok)` : "";
|
|
105
|
+
this.notice(`Goal set${budgetNote} — working autonomously. /goal pause to stop.`);
|
|
106
|
+
this.scheduleGoalTurn(goal, cwd, true);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** Called once after every controller run, before queued next-turn input drains. */
|
|
111
|
+
afterRun(summary, cwd) {
|
|
112
|
+
if (this.deps.isDisposed())
|
|
113
|
+
return;
|
|
114
|
+
const before = this.snapshot();
|
|
115
|
+
if (!before)
|
|
116
|
+
return;
|
|
117
|
+
const belongsToGoal = summary.goalRun
|
|
118
|
+
|| summary.goalStatusAtStart === "active"
|
|
119
|
+
|| before.status === "active";
|
|
120
|
+
if (!belongsToGoal)
|
|
121
|
+
return;
|
|
122
|
+
if (summary.cancelled || summary.errored) {
|
|
123
|
+
if (before.status === "active") {
|
|
124
|
+
this.deps.store.pause();
|
|
125
|
+
this.notice(stopReasonNotice(summary.errored ? "error" : "cancelled"));
|
|
126
|
+
}
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (summary.goalRun) {
|
|
130
|
+
if (summary.usageReported) {
|
|
131
|
+
if (summary.usageTokens > 0)
|
|
132
|
+
this.deps.store.addTokens(summary.usageTokens);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
this.deps.store.markTokenUsageUnavailable();
|
|
136
|
+
}
|
|
137
|
+
this.deps.store.incrementTurn();
|
|
138
|
+
}
|
|
139
|
+
const goal = this.snapshot();
|
|
140
|
+
if (!goal)
|
|
141
|
+
return;
|
|
142
|
+
const decision = shouldContinueGoal({
|
|
143
|
+
goal,
|
|
144
|
+
queuedInputs: this.deps.queuedInputs(),
|
|
145
|
+
});
|
|
146
|
+
if (decision.continue) {
|
|
147
|
+
this.scheduleGoalTurn(goal, cwd, false);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (decision.reason === "budget" && goal.status === "active") {
|
|
151
|
+
this.deps.store.markBudgetLimited();
|
|
152
|
+
}
|
|
153
|
+
if (decision.reason === "complete") {
|
|
154
|
+
this.notice(goalCompleteNotice(goal));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// An explicit /goal pause already emitted its user-facing notice. Other
|
|
158
|
+
// stop causes (blocked, budget, queued input) originate at this boundary.
|
|
159
|
+
if (decision.reason === "paused")
|
|
160
|
+
return;
|
|
161
|
+
const note = stopReasonNotice(decision.reason);
|
|
162
|
+
if (note)
|
|
163
|
+
this.notice(note);
|
|
164
|
+
}
|
|
165
|
+
scheduleGoalTurn(goal, cwd, initial) {
|
|
166
|
+
if (this.deps.isRunActive() || this.deps.isDisposed())
|
|
167
|
+
return;
|
|
168
|
+
const schedule = this.deps.schedule ?? queueMicrotask;
|
|
169
|
+
schedule(() => {
|
|
170
|
+
if (this.deps.isDisposed() || this.deps.isRunActive())
|
|
171
|
+
return;
|
|
172
|
+
const current = this.snapshot();
|
|
173
|
+
if (!current || current.id !== goal.id || current.status !== "active")
|
|
174
|
+
return;
|
|
175
|
+
const prompt = initial ? initialPrompt(current) : continuationPrompt(current);
|
|
176
|
+
this.deps.startRun(formatInternalContextBlock("goal", prompt), cwd);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
persistGoal(goal) {
|
|
180
|
+
try {
|
|
181
|
+
const manager = this.deps.getSessionManager();
|
|
182
|
+
manager.setMetadata({ ...manager.getMetadata(), goal: goal ?? undefined });
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Persistence is best-effort; a filesystem failure must not break a run.
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
externalRuntimeBound() {
|
|
189
|
+
try {
|
|
190
|
+
return this.deps.getSessionManager().getMetadata().externalRuntime !== undefined;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
notice(content) {
|
|
197
|
+
this.deps.appendMessage("assistant", content);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function truncate(value, max) {
|
|
201
|
+
return value.length <= max ? value : `${value.slice(0, Math.max(0, max - 1))}…`;
|
|
202
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure steer/queue input state machine (controller extraction §2.3).
|
|
3
|
+
*
|
|
4
|
+
* Encodes the lifecycle that app.tsx:1768-1813 and the run-finally block
|
|
5
|
+
* (app.tsx:1888-1930) implement inline:
|
|
6
|
+
*
|
|
7
|
+
* queued ──(submit while running & steer-eligible)──▶ steering(pending_steer)
|
|
8
|
+
* steering ──input_applied──▶ applied (row moves to transcript end)
|
|
9
|
+
* steering ──input_rejected──▶ queued (badge flips, row kept)
|
|
10
|
+
* steering ──run cancel + leftover──▶ dropped (row deleted)
|
|
11
|
+
* steering ──run normal end + leftover──▶ queued (requeued)
|
|
12
|
+
* queued ──drain (gates pass)──▶ submitted (placeholder row removed)
|
|
13
|
+
* any ──session switch──▶ purged
|
|
14
|
+
*
|
|
15
|
+
* No rendering, no timers, no Ink: state in, (state, effects) out.
|
|
16
|
+
*/
|
|
17
|
+
import type { AgentEvent } from "../../types.js";
|
|
18
|
+
import type { ControllerEffect } from "./effects.js";
|
|
19
|
+
import type { PendingSteerMeta, QueuedInput } from "../model/input-queue.js";
|
|
20
|
+
export type { PendingSteerMeta, QueuedInput };
|
|
21
|
+
export interface InputQueueState {
|
|
22
|
+
queued: QueuedInput[];
|
|
23
|
+
pendingSteers: Map<string, PendingSteerMeta>;
|
|
24
|
+
}
|
|
25
|
+
export interface QueueDrainGate {
|
|
26
|
+
runActive: boolean;
|
|
27
|
+
startingSubmit: boolean;
|
|
28
|
+
overlayOpen: boolean;
|
|
29
|
+
currentSessionFile?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface QueueTransition {
|
|
32
|
+
readonly state: InputQueueState;
|
|
33
|
+
readonly effects: readonly ControllerEffect[];
|
|
34
|
+
}
|
|
35
|
+
export declare function createInputQueueState(): InputQueueState;
|
|
36
|
+
/** Submit while a run is active and the input is steer-eligible. */
|
|
37
|
+
export declare function beginSteer(state: InputQueueState, input: {
|
|
38
|
+
id: string;
|
|
39
|
+
content: string;
|
|
40
|
+
displayKey: string;
|
|
41
|
+
sessionFile?: string;
|
|
42
|
+
}): QueueTransition;
|
|
43
|
+
/** Queue an input for the next turn (Tab or steer-ineligible while running). */
|
|
44
|
+
export declare function enqueue(state: InputQueueState, input: QueuedInput): QueueTransition;
|
|
45
|
+
/** Reduce an agent event against the queue state (input_* events only). */
|
|
46
|
+
export declare function reduceInputQueueEvent(state: InputQueueState, event: AgentEvent, ctx: {
|
|
47
|
+
isMultiplexed: boolean;
|
|
48
|
+
runSessionFile?: string;
|
|
49
|
+
}): QueueTransition;
|
|
50
|
+
/**
|
|
51
|
+
* Run-end drain for leftover steers (app.tsx:1904-1930):
|
|
52
|
+
* cancelled → drop rows; normal end → requeue for the next turn.
|
|
53
|
+
*/
|
|
54
|
+
export declare function drainLeftoverSteers(state: InputQueueState, leftovers: Array<{
|
|
55
|
+
id: string;
|
|
56
|
+
content: string;
|
|
57
|
+
}>, opts: {
|
|
58
|
+
cancelled: boolean;
|
|
59
|
+
runSessionFile?: string;
|
|
60
|
+
}): QueueTransition;
|
|
61
|
+
/**
|
|
62
|
+
* Attempt to submit the next queued input (app.tsx:2422-2435): all gates
|
|
63
|
+
* must pass and the input must belong to the current session.
|
|
64
|
+
*/
|
|
65
|
+
export declare function drainNextQueued(state: InputQueueState, gate: QueueDrainGate): {
|
|
66
|
+
state: InputQueueState;
|
|
67
|
+
submit?: QueuedInput;
|
|
68
|
+
droppedKeys: string[];
|
|
69
|
+
};
|
|
70
|
+
/** Session switch: purge everything (app.tsx:989-995). */
|
|
71
|
+
export declare function purgeForSessionSwitch(state: InputQueueState): QueueTransition;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
export function createInputQueueState() {
|
|
2
|
+
return { queued: [], pendingSteers: new Map() };
|
|
3
|
+
}
|
|
4
|
+
/** Submit while a run is active and the input is steer-eligible. */
|
|
5
|
+
export function beginSteer(state, input) {
|
|
6
|
+
state.pendingSteers.set(input.id, { displayKey: input.displayKey, sessionFile: input.sessionFile });
|
|
7
|
+
return {
|
|
8
|
+
state,
|
|
9
|
+
effects: [{ kind: "queue-updated", pending: state.pendingSteers.size }],
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** Queue an input for the next turn (Tab or steer-ineligible while running). */
|
|
13
|
+
export function enqueue(state, input) {
|
|
14
|
+
state.queued.push(input);
|
|
15
|
+
return {
|
|
16
|
+
state,
|
|
17
|
+
effects: [{ kind: "queue-updated", pending: state.pendingSteers.size }],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Reduce an agent event against the queue state (input_* events only). */
|
|
21
|
+
export function reduceInputQueueEvent(state, event, ctx) {
|
|
22
|
+
switch (event.type) {
|
|
23
|
+
case "input_applied": {
|
|
24
|
+
const steer = state.pendingSteers.get(event.id);
|
|
25
|
+
if (!steer)
|
|
26
|
+
return { state, effects: [] };
|
|
27
|
+
state.pendingSteers.delete(event.id);
|
|
28
|
+
// app.tsx:1768-1789 — moving the steer out of the live region is an
|
|
29
|
+
// append off a multiplexer but needs a full reprint under tmux/screen.
|
|
30
|
+
return {
|
|
31
|
+
state,
|
|
32
|
+
effects: [
|
|
33
|
+
{ kind: "transcript-move-message", displayKey: steer.displayKey, fullReprint: ctx.isMultiplexed },
|
|
34
|
+
{ kind: "queue-updated", pending: state.pendingSteers.size },
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
case "input_rejected": {
|
|
39
|
+
// app.tsx:1791-1806 — no continuation left: badge flips to QUEUED and
|
|
40
|
+
// the text is queued for the next turn.
|
|
41
|
+
const steer = state.pendingSteers.get(event.id);
|
|
42
|
+
if (!steer)
|
|
43
|
+
return { state, effects: [] };
|
|
44
|
+
state.pendingSteers.delete(event.id);
|
|
45
|
+
state.queued.push({
|
|
46
|
+
payload: { text: event.content, images: [] },
|
|
47
|
+
displayKey: steer.displayKey,
|
|
48
|
+
sessionFile: steer.sessionFile ?? ctx.runSessionFile,
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
state,
|
|
52
|
+
effects: [
|
|
53
|
+
{ kind: "steer-requeued", id: event.id, displayKey: steer.displayKey },
|
|
54
|
+
{ kind: "queue-updated", pending: state.pendingSteers.size },
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
case "input_pending_changed": {
|
|
59
|
+
if (event.pending === 0 && state.pendingSteers.size > 0) {
|
|
60
|
+
state.pendingSteers.clear();
|
|
61
|
+
}
|
|
62
|
+
return { state, effects: [{ kind: "queue-updated", pending: event.pending === 0 ? 0 : event.pending }] };
|
|
63
|
+
}
|
|
64
|
+
default:
|
|
65
|
+
return { state, effects: [] };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Run-end drain for leftover steers (app.tsx:1904-1930):
|
|
70
|
+
* cancelled → drop rows; normal end → requeue for the next turn.
|
|
71
|
+
*/
|
|
72
|
+
export function drainLeftoverSteers(state, leftovers, opts) {
|
|
73
|
+
for (const leftover of leftovers) {
|
|
74
|
+
const steer = state.pendingSteers.get(leftover.id);
|
|
75
|
+
state.pendingSteers.delete(leftover.id);
|
|
76
|
+
if (opts.cancelled) {
|
|
77
|
+
if (steer) {
|
|
78
|
+
// Row removal is a transcript effect the controller applies.
|
|
79
|
+
void steer;
|
|
80
|
+
}
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
state.queued.push({
|
|
84
|
+
payload: { text: leftover.content, images: [] },
|
|
85
|
+
displayKey: steer?.displayKey,
|
|
86
|
+
sessionFile: steer?.sessionFile ?? opts.runSessionFile,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
state,
|
|
91
|
+
effects: [{ kind: "queue-updated", pending: state.pendingSteers.size }],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Attempt to submit the next queued input (app.tsx:2422-2435): all gates
|
|
96
|
+
* must pass and the input must belong to the current session.
|
|
97
|
+
*/
|
|
98
|
+
export function drainNextQueued(state, gate) {
|
|
99
|
+
if (gate.runActive || gate.startingSubmit || gate.overlayOpen) {
|
|
100
|
+
return { state, submit: undefined, droppedKeys: [] };
|
|
101
|
+
}
|
|
102
|
+
while (state.queued.length > 0) {
|
|
103
|
+
const next = state.queued.shift();
|
|
104
|
+
if (!isQueuedInputForCurrentSession(next, gate.currentSessionFile)) {
|
|
105
|
+
continue; // Stale placeholder from a switched-away session: skip.
|
|
106
|
+
}
|
|
107
|
+
return { state, submit: next, droppedKeys: [] };
|
|
108
|
+
}
|
|
109
|
+
return { state, submit: undefined, droppedKeys: [] };
|
|
110
|
+
}
|
|
111
|
+
/** Session switch: purge everything (app.tsx:989-995). */
|
|
112
|
+
export function purgeForSessionSwitch(state) {
|
|
113
|
+
state.queued.length = 0;
|
|
114
|
+
state.pendingSteers.clear();
|
|
115
|
+
return { state, effects: [{ kind: "queue-updated", pending: 0 }] };
|
|
116
|
+
}
|
|
117
|
+
function isQueuedInputForCurrentSession(input, currentSessionFile) {
|
|
118
|
+
if (!input.sessionFile || !currentSessionFile)
|
|
119
|
+
return true;
|
|
120
|
+
return input.sessionFile === currentSessionFile;
|
|
121
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intents are the single entry point into the controller. UI layers
|
|
3
|
+
* (composer, pickers, dialogs, keyboard shortcuts) translate raw input into
|
|
4
|
+
* intents; the controller owns validation, ordering, and state transitions.
|
|
5
|
+
*/
|
|
6
|
+
export type ShutdownReason = "user-quit" | "sigterm" | "sigint" | "error";
|
|
7
|
+
export type BubbleTuiIntent = {
|
|
8
|
+
type: "submit";
|
|
9
|
+
text: string;
|
|
10
|
+
images?: unknown[];
|
|
11
|
+
} | {
|
|
12
|
+
type: "cancel-run";
|
|
13
|
+
} | {
|
|
14
|
+
type: "steer";
|
|
15
|
+
text: string;
|
|
16
|
+
} | {
|
|
17
|
+
type: "queue-input";
|
|
18
|
+
text: string;
|
|
19
|
+
images?: unknown[];
|
|
20
|
+
} | {
|
|
21
|
+
type: "open-picker";
|
|
22
|
+
picker: string;
|
|
23
|
+
} | {
|
|
24
|
+
type: "close-picker";
|
|
25
|
+
} | {
|
|
26
|
+
type: "toggle-thinking";
|
|
27
|
+
} | {
|
|
28
|
+
type: "toggle-verbose-trace";
|
|
29
|
+
} | {
|
|
30
|
+
type: "cycle-thinking";
|
|
31
|
+
} | {
|
|
32
|
+
type: "cycle-permission";
|
|
33
|
+
} | {
|
|
34
|
+
type: "switch-session";
|
|
35
|
+
file: string;
|
|
36
|
+
} | {
|
|
37
|
+
type: "start-fresh-session";
|
|
38
|
+
} | {
|
|
39
|
+
type: "execute-command";
|
|
40
|
+
command: string;
|
|
41
|
+
} | {
|
|
42
|
+
type: "set-composer-draft";
|
|
43
|
+
text: string | null;
|
|
44
|
+
} | {
|
|
45
|
+
type: "promote-task";
|
|
46
|
+
taskId: string;
|
|
47
|
+
} | {
|
|
48
|
+
type: "kill-task";
|
|
49
|
+
taskId: string;
|
|
50
|
+
} | {
|
|
51
|
+
type: "set-focus";
|
|
52
|
+
target: "composer" | "subagent-entry";
|
|
53
|
+
} | {
|
|
54
|
+
type: "shutdown";
|
|
55
|
+
reason: ShutdownReason;
|
|
56
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blocking-interaction lifecycle (controller extraction §3).
|
|
3
|
+
*
|
|
4
|
+
* Models plan approvals, tool approvals, questions, and feedback as owned
|
|
5
|
+
* requests with exactly one terminal state. Legacy wiring lives in
|
|
6
|
+
* app.tsx:542-583 (promise-resolver refs + question subscription) but never
|
|
7
|
+
* settles requests on session switch or shutdown — this controller makes
|
|
8
|
+
* that guarantee explicit (design doc behavior delta).
|
|
9
|
+
*/
|
|
10
|
+
import type { ApprovalDecision, ApprovalRequest } from "../../approval/types.js";
|
|
11
|
+
import type { PlanDecision } from "../../types.js";
|
|
12
|
+
import type { QuestionController } from "../../question/controller.js";
|
|
13
|
+
export type OverlayTerminalState = "accepted" | "rejected" | "cancelled" | "disposed";
|
|
14
|
+
export type SettleVia = "user" | "session-switch" | "shutdown" | "replaced";
|
|
15
|
+
export interface PlanRequestPayload {
|
|
16
|
+
plan: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class OwnedRequest<TDecision> {
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly kind: "plan" | "approval" | "question" | "feedback";
|
|
21
|
+
private readonly onSettle?;
|
|
22
|
+
state: "pending" | OverlayTerminalState;
|
|
23
|
+
private resolvers;
|
|
24
|
+
readonly result: Promise<TDecision>;
|
|
25
|
+
constructor(id: string, kind: "plan" | "approval" | "question" | "feedback", onSettle?: ((request: OwnedRequest<TDecision>, via: SettleVia) => void) | undefined);
|
|
26
|
+
settle(decision: TDecision, via: SettleVia): boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface OverlaySnapshot {
|
|
29
|
+
plan?: {
|
|
30
|
+
id: string;
|
|
31
|
+
plan: string;
|
|
32
|
+
};
|
|
33
|
+
approval?: {
|
|
34
|
+
id: string;
|
|
35
|
+
request: ApprovalRequest;
|
|
36
|
+
};
|
|
37
|
+
question?: {
|
|
38
|
+
id: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export declare class OverlayRequestController {
|
|
42
|
+
private readonly deps;
|
|
43
|
+
private readonly requests;
|
|
44
|
+
private questionUnsubscribe?;
|
|
45
|
+
private notifyChange;
|
|
46
|
+
constructor(deps?: {
|
|
47
|
+
questionController?: QuestionController;
|
|
48
|
+
});
|
|
49
|
+
/** Host wires change notification (snapshot rebuild). */
|
|
50
|
+
onChange(listener: () => void): void;
|
|
51
|
+
installPlanHandler(ref: {
|
|
52
|
+
current?: (plan: string) => Promise<PlanDecision>;
|
|
53
|
+
}): void;
|
|
54
|
+
installApprovalHandler(ref: {
|
|
55
|
+
current?: (request: ApprovalRequest) => Promise<ApprovalDecision>;
|
|
56
|
+
}): void;
|
|
57
|
+
adoptQuestionStream(): void;
|
|
58
|
+
openFeedback(initialDescription: string): OwnedRequest<"dismissed">;
|
|
59
|
+
/** Settle every pending request (session switch, shutdown, replacement). */
|
|
60
|
+
settleAll(via: "session-switch" | "shutdown"): number;
|
|
61
|
+
/** Drain the question subscription (controller shutdown). */
|
|
62
|
+
dispose(): void;
|
|
63
|
+
pendingCount(): number;
|
|
64
|
+
}
|