@bastani/atomic 0.8.31-alpha.4 → 0.9.0-alpha.1
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/CHANGELOG.md +6 -1
- package/dist/builtin/cursor/CHANGELOG.md +4 -1
- package/dist/builtin/cursor/package.json +2 -2
- package/dist/builtin/cursor/src/proto/protobuf-codec-json.ts +44 -0
- package/dist/builtin/cursor/src/proto/protobuf-codec-request.ts +271 -0
- package/dist/builtin/cursor/src/proto/protobuf-codec-wire.ts +231 -0
- package/dist/builtin/cursor/src/proto/protobuf-codec.ts +5 -523
- package/dist/builtin/cursor/src/stream.ts +6 -70
- package/dist/builtin/cursor/src/transport-errors.ts +74 -0
- package/dist/builtin/cursor/src/transport-frame.ts +56 -0
- package/dist/builtin/cursor/src/transport-http2.ts +122 -0
- package/dist/builtin/cursor/src/transport-native-client.ts +161 -0
- package/dist/builtin/cursor/src/transport-run-stream.ts +188 -0
- package/dist/builtin/cursor/src/transport-timeouts.ts +87 -0
- package/dist/builtin/cursor/src/transport-types.ts +140 -0
- package/dist/builtin/cursor/src/transport.ts +24 -790
- package/dist/builtin/intercom/CHANGELOG.md +3 -0
- package/dist/builtin/intercom/broker/client.ts +0 -35
- package/dist/builtin/intercom/contact-supervisor-tool.ts +289 -0
- package/dist/builtin/intercom/index-heavy.ts +77 -1336
- package/dist/builtin/intercom/intercom-tool.ts +409 -0
- package/dist/builtin/intercom/intercom-utils.ts +401 -0
- package/dist/builtin/intercom/lifecycle.ts +133 -0
- package/dist/builtin/intercom/overlay.ts +96 -0
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/intercom/subagent-relay.ts +137 -0
- package/dist/builtin/mcp/CHANGELOG.md +3 -0
- package/dist/builtin/mcp/config-write-utils.ts +104 -0
- package/dist/builtin/mcp/config.ts +4 -180
- package/dist/builtin/mcp/mcp-panel-renderer.ts +243 -0
- package/dist/builtin/mcp/mcp-panel-state.ts +227 -0
- package/dist/builtin/mcp/mcp-panel-types.ts +86 -0
- package/dist/builtin/mcp/mcp-panel.ts +145 -579
- package/dist/builtin/mcp/mcp-setup-panel.ts +4 -81
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/mcp/proxy-auth.ts +61 -0
- package/dist/builtin/mcp/proxy-call.ts +373 -0
- package/dist/builtin/mcp/proxy-connect.ts +58 -0
- package/dist/builtin/mcp/proxy-info-modes.ts +326 -0
- package/dist/builtin/mcp/proxy-modes.ts +3 -805
- package/dist/builtin/mcp/proxy-types.ts +3 -0
- package/dist/builtin/mcp/ui-server-http.ts +81 -0
- package/dist/builtin/mcp/ui-server.ts +2 -127
- package/dist/builtin/subagents/CHANGELOG.md +3 -0
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/subagents/src/agents/agent-discovery.ts +127 -0
- package/dist/builtin/subagents/src/agents/agent-loaders.ts +175 -0
- package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +310 -0
- package/dist/builtin/subagents/src/agents/agent-management.ts +3 -309
- package/dist/builtin/subagents/src/agents/agent-overrides.ts +397 -0
- package/dist/builtin/subagents/src/agents/agent-paths.ts +88 -0
- package/dist/builtin/subagents/src/agents/agent-types.ts +136 -0
- package/dist/builtin/subagents/src/agents/agents.ts +22 -895
- package/dist/builtin/subagents/src/agents/skills-paths.ts +333 -0
- package/dist/builtin/subagents/src/agents/skills.ts +3 -326
- package/dist/builtin/subagents/src/extension/index.ts +4 -118
- package/dist/builtin/subagents/src/extension/prompt-guidance.ts +13 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +401 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +131 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +213 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +84 -0
- package/dist/builtin/subagents/src/runs/background/async-execution.ts +13 -795
- package/dist/builtin/subagents/src/runs/background/subagent-runner-dynamic.ts +215 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-finalize.ts +136 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-output.ts +105 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel-helpers.ts +112 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel.ts +159 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-sequential.ts +127 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-state.ts +427 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +273 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +269 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-types.ts +196 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-utils.ts +70 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +44 -2233
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-behavior.ts +75 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-component.ts +202 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-edit.ts +97 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-editor.ts +160 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-frame.ts +72 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-modes.ts +161 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-selectors.ts +203 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-selectors.ts +234 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-state.ts +103 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-types.ts +29 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +4 -1328
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-clarify.ts +117 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-details.ts +35 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +194 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +183 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +185 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +229 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +194 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +94 -1043
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt-control.ts +135 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +107 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt-types.ts +17 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +454 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +219 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-structured-retries.ts +77 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +34 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-utils.ts +56 -0
- package/dist/builtin/subagents/src/runs/foreground/execution.ts +6 -1082
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +207 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +140 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +266 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +270 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +157 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +375 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +463 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +17 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +320 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +207 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +121 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +113 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +150 -2522
- package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +0 -16
- package/dist/builtin/subagents/src/runs/shared/nested-events-control.ts +167 -0
- package/dist/builtin/subagents/src/runs/shared/nested-events-core.ts +219 -0
- package/dist/builtin/subagents/src/runs/shared/nested-events-projection.ts +121 -0
- package/dist/builtin/subagents/src/runs/shared/nested-events-registry.ts +289 -0
- package/dist/builtin/subagents/src/runs/shared/nested-events-sanitize.ts +201 -0
- package/dist/builtin/subagents/src/runs/shared/nested-events.ts +50 -935
- package/dist/builtin/subagents/src/runs/shared/worktree.ts +0 -78
- package/dist/builtin/subagents/src/shared/types-async.ts +265 -0
- package/dist/builtin/subagents/src/shared/types-config.ts +125 -0
- package/dist/builtin/subagents/src/shared/types-depth.ts +121 -0
- package/dist/builtin/subagents/src/shared/types-output.ts +63 -0
- package/dist/builtin/subagents/src/shared/types-results.ts +318 -0
- package/dist/builtin/subagents/src/shared/types-runtime.ts +136 -0
- package/dist/builtin/subagents/src/shared/types.ts +10 -975
- package/dist/builtin/subagents/src/slash/slash-commands.ts +0 -12
- package/dist/builtin/subagents/src/tui/render-chain-graph.ts +247 -0
- package/dist/builtin/subagents/src/tui/render-event-formatting.ts +259 -0
- package/dist/builtin/subagents/src/tui/render-layout.ts +120 -0
- package/dist/builtin/subagents/src/tui/render-result-animation.ts +56 -0
- package/dist/builtin/subagents/src/tui/render-result-compact.ts +154 -0
- package/dist/builtin/subagents/src/tui/render-result.ts +390 -0
- package/dist/builtin/subagents/src/tui/render-stable-output.ts +83 -0
- package/dist/builtin/subagents/src/tui/render-status-progress.ts +133 -0
- package/dist/builtin/subagents/src/tui/render-widget-graph.ts +166 -0
- package/dist/builtin/subagents/src/tui/render-widget.ts +273 -0
- package/dist/builtin/subagents/src/tui/render.ts +14 -1801
- package/dist/builtin/web-access/CHANGELOG.md +3 -0
- package/dist/builtin/web-access/content-tools.ts +348 -0
- package/dist/builtin/web-access/curator-page-assets/script-1.ts +400 -0
- package/dist/builtin/web-access/curator-page-assets/script-2.ts +400 -0
- package/dist/builtin/web-access/curator-page-assets/script-3.ts +400 -0
- package/dist/builtin/web-access/curator-page-assets/script-4.ts +400 -0
- package/dist/builtin/web-access/curator-page-assets/script-5.ts +398 -0
- package/dist/builtin/web-access/curator-page-assets/styles-1.ts +394 -0
- package/dist/builtin/web-access/curator-page-assets/styles-2.ts +394 -0
- package/dist/builtin/web-access/curator-page-assets/styles-3.ts +393 -0
- package/dist/builtin/web-access/curator-page.ts +17 -3180
- package/dist/builtin/web-access/curator-server-helpers.ts +115 -0
- package/dist/builtin/web-access/curator-server.ts +2 -113
- package/dist/builtin/web-access/exa-mcp.ts +218 -0
- package/dist/builtin/web-access/exa.ts +2 -207
- package/dist/builtin/web-access/extract-frames.ts +228 -0
- package/dist/builtin/web-access/extract.ts +13 -214
- package/dist/builtin/web-access/github-config.ts +156 -0
- package/dist/builtin/web-access/github-extract.ts +3 -154
- package/dist/builtin/web-access/index-heavy.ts +8 -1904
- package/dist/builtin/web-access/package.json +2 -1
- package/dist/builtin/web-access/web-search-activity.ts +102 -0
- package/dist/builtin/web-access/web-search-browser.ts +116 -0
- package/dist/builtin/web-access/web-search-command.ts +242 -0
- package/dist/builtin/web-access/web-search-config.ts +163 -0
- package/dist/builtin/web-access/web-search-curator.ts +214 -0
- package/dist/builtin/web-access/web-search-features.ts +165 -0
- package/dist/builtin/web-access/web-search-formatting.ts +117 -0
- package/dist/builtin/web-access/web-search-return.ts +136 -0
- package/dist/builtin/web-access/web-search-summary.ts +170 -0
- package/dist/builtin/web-access/web-search-tool.ts +290 -0
- package/dist/builtin/web-access/web-search-types.ts +50 -0
- package/dist/builtin/workflows/CHANGELOG.md +8 -1
- package/dist/builtin/workflows/builtin/deep-research-codebase-runner.ts +492 -0
- package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +346 -0
- package/dist/builtin/workflows/builtin/deep-research-codebase.ts +6 -822
- package/dist/builtin/workflows/builtin/goal-artifacts.ts +43 -0
- package/dist/builtin/workflows/builtin/goal-ledger.ts +54 -0
- package/dist/builtin/workflows/builtin/goal-prompts.ts +360 -0
- package/dist/builtin/workflows/builtin/goal-reducer.ts +141 -0
- package/dist/builtin/workflows/builtin/goal-reports.ts +56 -0
- package/dist/builtin/workflows/builtin/goal-review.ts +84 -0
- package/dist/builtin/workflows/builtin/goal-runner.ts +343 -0
- package/dist/builtin/workflows/builtin/goal-schemas.ts +60 -0
- package/dist/builtin/workflows/builtin/goal-types.ts +132 -0
- package/dist/builtin/workflows/builtin/goal.ts +4 -1160
- package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +432 -0
- package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +477 -0
- package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +312 -0
- package/dist/builtin/workflows/builtin/open-claude-design.ts +7 -1083
- package/dist/builtin/workflows/builtin/ralph-core.ts +408 -0
- package/dist/builtin/workflows/builtin/ralph-models.ts +123 -0
- package/dist/builtin/workflows/builtin/ralph-review-gate.ts +89 -0
- package/dist/builtin/workflows/builtin/ralph-runner.ts +499 -0
- package/dist/builtin/workflows/builtin/ralph.ts +7 -1015
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +2 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +2 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +2 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +8 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +13 -15
- package/dist/builtin/workflows/skills/impeccable/scripts/live-manual-edit-evidence.mjs +2 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +9 -0
- package/dist/builtin/workflows/src/extension/atomic-stage-session.ts +186 -0
- package/dist/builtin/workflows/src/extension/config-file-loader.ts +152 -0
- package/dist/builtin/workflows/src/extension/config-loader.ts +2 -167
- package/dist/builtin/workflows/src/extension/discovery-loaders.ts +115 -0
- package/dist/builtin/workflows/src/extension/discovery.ts +3 -117
- package/dist/builtin/workflows/src/extension/dispatcher.ts +3 -0
- package/dist/builtin/workflows/src/extension/extension-factory.ts +120 -0
- package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +109 -0
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +270 -0
- package/dist/builtin/workflows/src/extension/index.ts +42 -4151
- package/dist/builtin/workflows/src/extension/public-types.ts +295 -0
- package/dist/builtin/workflows/src/extension/render-component.ts +14 -0
- package/dist/builtin/workflows/src/extension/runtime-direct.ts +96 -0
- package/dist/builtin/workflows/src/extension/runtime.ts +8 -92
- package/dist/builtin/workflows/src/extension/ui-surface.ts +286 -0
- package/dist/builtin/workflows/src/extension/wiring.ts +6 -475
- package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +111 -0
- package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +213 -0
- package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +81 -0
- package/dist/builtin/workflows/src/extension/workflow-command-utils.ts +181 -0
- package/dist/builtin/workflows/src/extension/workflow-policy.ts +15 -0
- package/dist/builtin/workflows/src/extension/workflow-ports.ts +41 -0
- package/dist/builtin/workflows/src/extension/workflow-prompts.ts +23 -0
- package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +286 -0
- package/dist/builtin/workflows/src/extension/workflow-schema.ts +1 -1
- package/dist/builtin/workflows/src/extension/workflow-stage-results.ts +264 -0
- package/dist/builtin/workflows/src/extension/workflow-targets.ts +181 -0
- package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +175 -0
- package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +205 -0
- package/dist/builtin/workflows/src/extension/workflow-tool-helpers.ts +66 -0
- package/dist/builtin/workflows/src/extension/workflow-tool-inspection.ts +164 -0
- package/dist/builtin/workflows/src/extension/workflow-tool-registration.ts +54 -0
- package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +164 -0
- package/dist/builtin/workflows/src/extension/workflow-tool.ts +102 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-abort.ts +431 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-child-boundary.ts +232 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-child-helpers.ts +74 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-child-workflow.ts +158 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-continuation.ts +167 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +450 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-direct.ts +233 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-exit-manager.ts +195 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +368 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-inputs.ts +83 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +441 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-outputs.ts +160 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +274 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-run-finalizers.ts +122 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-run.ts +359 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-scheduler.ts +204 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +197 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-context.ts +120 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +126 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +351 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +134 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +54 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-task-context.ts +132 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +293 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +109 -0
- package/dist/builtin/workflows/src/runs/foreground/executor.ts +19 -5258
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +219 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +500 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +129 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +53 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +146 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-session.ts +55 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +82 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +141 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +13 -1342
- package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +453 -0
- package/dist/builtin/workflows/src/runs/shared/model-fallback-failures.ts +442 -0
- package/dist/builtin/workflows/src/runs/shared/model-fallback.ts +2 -836
- package/dist/builtin/workflows/src/runs/shared/worktree-diff.ts +165 -0
- package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +220 -0
- package/dist/builtin/workflows/src/runs/shared/worktree-setup.ts +335 -0
- package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +92 -0
- package/dist/builtin/workflows/src/runs/shared/worktree.ts +18 -791
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +365 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +425 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +236 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +354 -0
- package/dist/builtin/workflows/src/shared/authoring-contract.d.ts +5 -598
- package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +428 -0
- package/dist/builtin/workflows/src/shared/persistence-restore.ts +11 -431
- package/dist/builtin/workflows/src/shared/store-factory.ts +16 -0
- package/dist/builtin/workflows/src/shared/store-internal.ts +219 -0
- package/dist/builtin/workflows/src/shared/store-prompt-methods.ts +219 -0
- package/dist/builtin/workflows/src/shared/store-public-types.ts +215 -0
- package/dist/builtin/workflows/src/shared/store-run-methods.ts +223 -0
- package/dist/builtin/workflows/src/shared/store-stage-methods.ts +305 -0
- package/dist/builtin/workflows/src/shared/store.ts +11 -1138
- package/dist/builtin/workflows/src/shared/workflow-failures-classifier.ts +266 -0
- package/dist/builtin/workflows/src/shared/workflow-failures-contract.ts +75 -0
- package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +477 -0
- package/dist/builtin/workflows/src/shared/workflow-failures-signals.ts +248 -0
- package/dist/builtin/workflows/src/shared/workflow-failures.ts +13 -1001
- package/dist/builtin/workflows/src/tui/chat-surface.ts +0 -66
- package/dist/builtin/workflows/src/tui/graph-view-constants.ts +45 -0
- package/dist/builtin/workflows/src/tui/graph-view-graph-render.ts +161 -0
- package/dist/builtin/workflows/src/tui/graph-view-input.ts +333 -0
- package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +336 -0
- package/dist/builtin/workflows/src/tui/graph-view-render.ts +194 -0
- package/dist/builtin/workflows/src/tui/graph-view-state.ts +306 -0
- package/dist/builtin/workflows/src/tui/graph-view-types.ts +70 -0
- package/dist/builtin/workflows/src/tui/graph-view.ts +4 -1386
- package/dist/builtin/workflows/src/tui/inline-form-editor-text.ts +121 -0
- package/dist/builtin/workflows/src/tui/inline-form-editor.ts +11 -223
- package/dist/builtin/workflows/src/tui/inputs-picker-editing.ts +151 -0
- package/dist/builtin/workflows/src/tui/inputs-picker-input.ts +305 -0
- package/dist/builtin/workflows/src/tui/inputs-picker-render.ts +300 -0
- package/dist/builtin/workflows/src/tui/inputs-picker-types.ts +190 -0
- package/dist/builtin/workflows/src/tui/inputs-picker.ts +19 -997
- package/dist/builtin/workflows/src/tui/prompt-card-input.ts +226 -0
- package/dist/builtin/workflows/src/tui/prompt-card-render.ts +373 -0
- package/dist/builtin/workflows/src/tui/prompt-card-select.ts +116 -0
- package/dist/builtin/workflows/src/tui/prompt-card-state.ts +61 -0
- package/dist/builtin/workflows/src/tui/prompt-card-text.ts +129 -0
- package/dist/builtin/workflows/src/tui/prompt-card.ts +8 -910
- package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +315 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-custom-ui.ts +127 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +187 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +222 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-render-helpers.ts +152 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +464 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-transcript.ts +242 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +151 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +141 -1777
- package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +85 -0
- package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +1 -129
- package/dist/config-self-update.d.ts +21 -0
- package/dist/config-self-update.d.ts.map +1 -0
- package/dist/config-self-update.js +265 -0
- package/dist/config-self-update.js.map +1 -0
- package/dist/config.d.ts +3 -12
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -252
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-accessors.d.ts +3 -0
- package/dist/core/agent-session-accessors.d.ts.map +1 -0
- package/dist/core/agent-session-accessors.js +36 -0
- package/dist/core/agent-session-accessors.js.map +1 -0
- package/dist/core/agent-session-auto-compaction.d.ts +32 -0
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -0
- package/dist/core/agent-session-auto-compaction.js +214 -0
- package/dist/core/agent-session-auto-compaction.js.map +1 -0
- package/dist/core/agent-session-bash.d.ts +30 -0
- package/dist/core/agent-session-bash.d.ts.map +1 -0
- package/dist/core/agent-session-bash.js +84 -0
- package/dist/core/agent-session-bash.js.map +1 -0
- package/dist/core/agent-session-compaction.d.ts +44 -0
- package/dist/core/agent-session-compaction.d.ts.map +1 -0
- package/dist/core/agent-session-compaction.js +282 -0
- package/dist/core/agent-session-compaction.js.map +1 -0
- package/dist/core/agent-session-events.d.ts +65 -0
- package/dist/core/agent-session-events.d.ts.map +1 -0
- package/dist/core/agent-session-events.js +373 -0
- package/dist/core/agent-session-events.js.map +1 -0
- package/dist/core/agent-session-export.d.ts +42 -0
- package/dist/core/agent-session-export.d.ts.map +1 -0
- package/dist/core/agent-session-export.js +199 -0
- package/dist/core/agent-session-export.js.map +1 -0
- package/dist/core/agent-session-extension-bindings.d.ts +37 -0
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -0
- package/dist/core/agent-session-extension-bindings.js +231 -0
- package/dist/core/agent-session-extension-bindings.js.map +1 -0
- package/dist/core/agent-session-message-queue.d.ts +85 -0
- package/dist/core/agent-session-message-queue.d.ts.map +1 -0
- package/dist/core/agent-session-message-queue.js +264 -0
- package/dist/core/agent-session-message-queue.js.map +1 -0
- package/dist/core/agent-session-methods.d.ts +302 -0
- package/dist/core/agent-session-methods.d.ts.map +1 -0
- package/dist/core/agent-session-methods.js +2 -0
- package/dist/core/agent-session-methods.js.map +1 -0
- package/dist/core/agent-session-models.d.ts +111 -0
- package/dist/core/agent-session-models.d.ts.map +1 -0
- package/dist/core/agent-session-models.js +368 -0
- package/dist/core/agent-session-models.js.map +1 -0
- package/dist/core/agent-session-prompt.d.ts +61 -0
- package/dist/core/agent-session-prompt.d.ts.map +1 -0
- package/dist/core/agent-session-prompt.js +330 -0
- package/dist/core/agent-session-prompt.js.map +1 -0
- package/dist/core/agent-session-retry.d.ts +62 -0
- package/dist/core/agent-session-retry.d.ts.map +1 -0
- package/dist/core/agent-session-retry.js +202 -0
- package/dist/core/agent-session-retry.js.map +1 -0
- package/dist/core/agent-session-skill-block.d.ts +13 -0
- package/dist/core/agent-session-skill-block.d.ts.map +1 -0
- package/dist/core/agent-session-skill-block.js +37 -0
- package/dist/core/agent-session-skill-block.js.map +1 -0
- package/dist/core/agent-session-state.d.ts +48 -0
- package/dist/core/agent-session-state.d.ts.map +1 -0
- package/dist/core/agent-session-state.js +129 -0
- package/dist/core/agent-session-state.js.map +1 -0
- package/dist/core/agent-session-tool-hooks.d.ts +7 -0
- package/dist/core/agent-session-tool-hooks.d.ts.map +1 -0
- package/dist/core/agent-session-tool-hooks.js +72 -0
- package/dist/core/agent-session-tool-hooks.js.map +1 -0
- package/dist/core/agent-session-tool-registry.d.ts +15 -0
- package/dist/core/agent-session-tool-registry.d.ts.map +1 -0
- package/dist/core/agent-session-tool-registry.js +151 -0
- package/dist/core/agent-session-tool-registry.js.map +1 -0
- package/dist/core/agent-session-tree.d.ts +46 -0
- package/dist/core/agent-session-tree.d.ts.map +1 -0
- package/dist/core/agent-session-tree.js +217 -0
- package/dist/core/agent-session-tree.js.map +1 -0
- package/dist/core/agent-session-types.d.ts +159 -0
- package/dist/core/agent-session-types.d.ts.map +1 -0
- package/dist/core/agent-session-types.js +41 -0
- package/dist/core/agent-session-types.js.map +1 -0
- package/dist/core/agent-session.d.ts +68 -688
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +26 -3152
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage-backends.d.ts +49 -0
- package/dist/core/auth-storage-backends.d.ts.map +1 -0
- package/dist/core/auth-storage-backends.js +185 -0
- package/dist/core/auth-storage-backends.js.map +1 -0
- package/dist/core/auth-storage.d.ts +2 -49
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -183
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/context-compaction-metrics.d.ts +16 -0
- package/dist/core/compaction/context-compaction-metrics.d.ts.map +1 -0
- package/dist/core/compaction/context-compaction-metrics.js +58 -0
- package/dist/core/compaction/context-compaction-metrics.js.map +1 -0
- package/dist/core/compaction/context-compaction-prompt.d.ts +9 -0
- package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -0
- package/dist/core/compaction/context-compaction-prompt.js +161 -0
- package/dist/core/compaction/context-compaction-prompt.js.map +1 -0
- package/dist/core/compaction/context-compaction-runner.d.ts +5 -0
- package/dist/core/compaction/context-compaction-runner.d.ts.map +1 -0
- package/dist/core/compaction/context-compaction-runner.js +181 -0
- package/dist/core/compaction/context-compaction-runner.js.map +1 -0
- package/dist/core/compaction/context-compaction-strategy.d.ts +5 -0
- package/dist/core/compaction/context-compaction-strategy.d.ts.map +1 -0
- package/dist/core/compaction/context-compaction-strategy.js +27 -0
- package/dist/core/compaction/context-compaction-strategy.js.map +1 -0
- package/dist/core/compaction/context-compaction-types.d.ts +73 -0
- package/dist/core/compaction/context-compaction-types.d.ts.map +1 -0
- package/dist/core/compaction/context-compaction-types.js +6 -0
- package/dist/core/compaction/context-compaction-types.js.map +1 -0
- package/dist/core/compaction/context-compaction.d.ts +9 -200
- package/dist/core/compaction/context-compaction.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction.js +7 -1943
- package/dist/core/compaction/context-compaction.js.map +1 -1
- package/dist/core/compaction/context-deletion-application.d.ts +13 -0
- package/dist/core/compaction/context-deletion-application.d.ts.map +1 -0
- package/dist/core/compaction/context-deletion-application.js +259 -0
- package/dist/core/compaction/context-deletion-application.js.map +1 -0
- package/dist/core/compaction/context-deletion-store.d.ts +78 -0
- package/dist/core/compaction/context-deletion-store.d.ts.map +1 -0
- package/dist/core/compaction/context-deletion-store.js +162 -0
- package/dist/core/compaction/context-deletion-store.js.map +1 -0
- package/dist/core/compaction/context-deletion-targets.d.ts +40 -0
- package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -0
- package/dist/core/compaction/context-deletion-targets.js +267 -0
- package/dist/core/compaction/context-deletion-targets.js.map +1 -0
- package/dist/core/compaction/context-deletion-tool-definitions.d.ts +187 -0
- package/dist/core/compaction/context-deletion-tool-definitions.d.ts.map +1 -0
- package/dist/core/compaction/context-deletion-tool-definitions.js +98 -0
- package/dist/core/compaction/context-deletion-tool-definitions.js.map +1 -0
- package/dist/core/compaction/context-deletion-tool-helpers.d.ts +19 -0
- package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +1 -0
- package/dist/core/compaction/context-deletion-tool-helpers.js +137 -0
- package/dist/core/compaction/context-deletion-tool-helpers.js.map +1 -0
- package/dist/core/compaction/context-deletion-tools.d.ts +4 -0
- package/dist/core/compaction/context-deletion-tools.d.ts.map +1 -0
- package/dist/core/compaction/context-deletion-tools.js +395 -0
- package/dist/core/compaction/context-deletion-tools.js.map +1 -0
- package/dist/core/compaction/context-transcript-analysis.d.ts +9 -0
- package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -0
- package/dist/core/compaction/context-transcript-analysis.js +234 -0
- package/dist/core/compaction/context-transcript-analysis.js.map +1 -0
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +2 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template-js/data-tree.js +287 -0
- package/dist/core/export-html/template-js/entries-navigation.js +424 -0
- package/dist/core/export-html/template-js/initialization.js +312 -0
- package/dist/core/export-html/template-js/message-tools.js +415 -0
- package/dist/core/export-html/template-js/tree-filter-render.js +421 -0
- package/dist/core/export-html/template-script.d.ts +3 -0
- package/dist/core/export-html/template-script.d.ts.map +1 -0
- package/dist/core/export-html/template-script.js +13 -0
- package/dist/core/export-html/template-script.js.map +1 -0
- package/dist/core/export-html/template.js +3 -1
- package/dist/core/extensions/agent-events.d.ts +159 -0
- package/dist/core/extensions/agent-events.d.ts.map +1 -0
- package/dist/core/extensions/agent-events.js +2 -0
- package/dist/core/extensions/agent-events.js.map +1 -0
- package/dist/core/extensions/api-types.d.ts +189 -0
- package/dist/core/extensions/api-types.d.ts.map +1 -0
- package/dist/core/extensions/api-types.js +2 -0
- package/dist/core/extensions/api-types.js.map +1 -0
- package/dist/core/extensions/command-types.d.ts +14 -0
- package/dist/core/extensions/command-types.d.ts.map +1 -0
- package/dist/core/extensions/command-types.js +2 -0
- package/dist/core/extensions/command-types.js.map +1 -0
- package/dist/core/extensions/context-types.d.ts +130 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -0
- package/dist/core/extensions/context-types.js +2 -0
- package/dist/core/extensions/context-types.js.map +1 -0
- package/dist/core/extensions/event-results.d.ts +61 -0
- package/dist/core/extensions/event-results.d.ts.map +1 -0
- package/dist/core/extensions/event-results.js +2 -0
- package/dist/core/extensions/event-results.js.map +1 -0
- package/dist/core/extensions/event-types.d.ts +6 -0
- package/dist/core/extensions/event-types.d.ts.map +1 -0
- package/dist/core/extensions/event-types.js +2 -0
- package/dist/core/extensions/event-types.js.map +1 -0
- package/dist/core/extensions/loader-api.d.ts +10 -0
- package/dist/core/extensions/loader-api.d.ts.map +1 -0
- package/dist/core/extensions/loader-api.js +143 -0
- package/dist/core/extensions/loader-api.js.map +1 -0
- package/dist/core/extensions/loader-core.d.ts +12 -0
- package/dist/core/extensions/loader-core.d.ts.map +1 -0
- package/dist/core/extensions/loader-core.js +91 -0
- package/dist/core/extensions/loader-core.js.map +1 -0
- package/dist/core/extensions/loader-discovery.d.ts +7 -0
- package/dist/core/extensions/loader-discovery.d.ts.map +1 -0
- package/dist/core/extensions/loader-discovery.js +139 -0
- package/dist/core/extensions/loader-discovery.js.map +1 -0
- package/dist/core/extensions/loader-resources.d.ts +11 -0
- package/dist/core/extensions/loader-resources.d.ts.map +1 -0
- package/dist/core/extensions/loader-resources.js +10 -0
- package/dist/core/extensions/loader-resources.js.map +1 -0
- package/dist/core/extensions/loader-runtime.d.ts +7 -0
- package/dist/core/extensions/loader-runtime.d.ts.map +1 -0
- package/dist/core/extensions/loader-runtime.js +51 -0
- package/dist/core/extensions/loader-runtime.js.map +1 -0
- package/dist/core/extensions/loader-virtual-modules.d.ts +3 -0
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -0
- package/dist/core/extensions/loader-virtual-modules.js +92 -0
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +4 -28
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +3 -542
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/message-types.d.ts +34 -0
- package/dist/core/extensions/message-types.d.ts.map +1 -0
- package/dist/core/extensions/message-types.js +2 -0
- package/dist/core/extensions/message-types.js.map +1 -0
- package/dist/core/extensions/provider-types.d.ts +71 -0
- package/dist/core/extensions/provider-types.d.ts.map +1 -0
- package/dist/core/extensions/provider-types.js +2 -0
- package/dist/core/extensions/provider-types.js.map +1 -0
- package/dist/core/extensions/runner-context.d.ts +42 -0
- package/dist/core/extensions/runner-context.d.ts.map +1 -0
- package/dist/core/extensions/runner-context.js +112 -0
- package/dist/core/extensions/runner-context.js.map +1 -0
- package/dist/core/extensions/runner-events.d.ts +47 -0
- package/dist/core/extensions/runner-events.d.ts.map +1 -0
- package/dist/core/extensions/runner-events.js +280 -0
- package/dist/core/extensions/runner-events.js.map +1 -0
- package/dist/core/extensions/runner-handlers.d.ts +32 -0
- package/dist/core/extensions/runner-handlers.d.ts.map +1 -0
- package/dist/core/extensions/runner-handlers.js +2 -0
- package/dist/core/extensions/runner-handlers.js.map +1 -0
- package/dist/core/extensions/runner-project-trust.d.ts +6 -0
- package/dist/core/extensions/runner-project-trust.d.ts.map +1 -0
- package/dist/core/extensions/runner-project-trust.js +27 -0
- package/dist/core/extensions/runner-project-trust.js.map +1 -0
- package/dist/core/extensions/runner-registries.d.ts +8 -0
- package/dist/core/extensions/runner-registries.d.ts.map +1 -0
- package/dist/core/extensions/runner-registries.js +76 -0
- package/dist/core/extensions/runner-registries.js.map +1 -0
- package/dist/core/extensions/runner-shortcuts.d.ts +10 -0
- package/dist/core/extensions/runner-shortcuts.d.ts.map +1 -0
- package/dist/core/extensions/runner-shortcuts.js +71 -0
- package/dist/core/extensions/runner-shortcuts.js.map +1 -0
- package/dist/core/extensions/runner-ui.d.ts +3 -0
- package/dist/core/extensions/runner-ui.d.ts.map +1 -0
- package/dist/core/extensions/runner-ui.js +50 -0
- package/dist/core/extensions/runner-ui.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +7 -74
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +67 -673
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts +179 -0
- package/dist/core/extensions/runtime-types.d.ts.map +1 -0
- package/dist/core/extensions/runtime-types.js +2 -0
- package/dist/core/extensions/runtime-types.js.map +1 -0
- package/dist/core/extensions/session-events.d.ts +89 -0
- package/dist/core/extensions/session-events.d.ts.map +1 -0
- package/dist/core/extensions/session-events.js +2 -0
- package/dist/core/extensions/session-events.js.map +1 -0
- package/dist/core/extensions/tool-events.d.ts +127 -0
- package/dist/core/extensions/tool-events.d.ts.map +1 -0
- package/dist/core/extensions/tool-events.js +26 -0
- package/dist/core/extensions/tool-events.js.map +1 -0
- package/dist/core/extensions/tool-types.d.ts +100 -0
- package/dist/core/extensions/tool-types.d.ts.map +1 -0
- package/dist/core/extensions/tool-types.js +11 -0
- package/dist/core/extensions/tool-types.js.map +1 -0
- package/dist/core/extensions/types.d.ts +20 -1288
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js +4 -34
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/ui-types.d.ts +200 -0
- package/dist/core/extensions/ui-types.d.ts.map +1 -0
- package/dist/core/extensions/ui-types.js +2 -0
- package/dist/core/extensions/ui-types.js.map +1 -0
- package/dist/core/model-registry-auth.d.ts +7 -0
- package/dist/core/model-registry-auth.d.ts.map +1 -0
- package/dist/core/model-registry-auth.js +64 -0
- package/dist/core/model-registry-auth.js.map +1 -0
- package/dist/core/model-registry-builtins.d.ts +9 -0
- package/dist/core/model-registry-builtins.d.ts.map +1 -0
- package/dist/core/model-registry-builtins.js +120 -0
- package/dist/core/model-registry-builtins.js.map +1 -0
- package/dist/core/model-registry-custom-loader.d.ts +3 -0
- package/dist/core/model-registry-custom-loader.d.ts.map +1 -0
- package/dist/core/model-registry-custom-loader.js +213 -0
- package/dist/core/model-registry-custom-loader.js.map +1 -0
- package/dist/core/model-registry-dynamic.d.ts +6 -0
- package/dist/core/model-registry-dynamic.d.ts.map +1 -0
- package/dist/core/model-registry-dynamic.js +155 -0
- package/dist/core/model-registry-dynamic.js.map +1 -0
- package/dist/core/model-registry-loader.d.ts +4 -0
- package/dist/core/model-registry-loader.d.ts.map +1 -0
- package/dist/core/model-registry-loader.js +20 -0
- package/dist/core/model-registry-loader.js.map +1 -0
- package/dist/core/model-registry-schemas.d.ts +1084 -0
- package/dist/core/model-registry-schemas.d.ts.map +1 -0
- package/dist/core/model-registry-schemas.js +161 -0
- package/dist/core/model-registry-schemas.js.map +1 -0
- package/dist/core/model-registry-types.d.ts +74 -0
- package/dist/core/model-registry-types.d.ts.map +1 -0
- package/dist/core/model-registry-types.js +2 -0
- package/dist/core/model-registry-types.js.map +1 -0
- package/dist/core/model-registry.d.ts +3 -76
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +24 -733
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver-cli.d.ts +19 -0
- package/dist/core/model-resolver-cli.d.ts.map +1 -0
- package/dist/core/model-resolver-cli.js +118 -0
- package/dist/core/model-resolver-cli.js.map +1 -0
- package/dist/core/model-resolver-defaults.d.ts +5 -0
- package/dist/core/model-resolver-defaults.d.ts.map +1 -0
- package/dist/core/model-resolver-defaults.js +47 -0
- package/dist/core/model-resolver-defaults.js.map +1 -0
- package/dist/core/model-resolver-initial.d.ts +31 -0
- package/dist/core/model-resolver-initial.d.ts.map +1 -0
- package/dist/core/model-resolver-initial.js +116 -0
- package/dist/core/model-resolver-initial.js.map +1 -0
- package/dist/core/model-resolver-patterns.d.ts +26 -0
- package/dist/core/model-resolver-patterns.d.ts.map +1 -0
- package/dist/core/model-resolver-patterns.js +139 -0
- package/dist/core/model-resolver-patterns.js.map +1 -0
- package/dist/core/model-resolver-scope.d.ts +15 -0
- package/dist/core/model-resolver-scope.d.ts.map +1 -0
- package/dist/core/model-resolver-scope.js +66 -0
- package/dist/core/model-resolver-scope.js.map +1 -0
- package/dist/core/model-resolver-types.d.ts +29 -0
- package/dist/core/model-resolver-types.d.ts.map +1 -0
- package/dist/core/model-resolver-types.js +2 -0
- package/dist/core/model-resolver-types.js.map +1 -0
- package/dist/core/model-resolver.d.ts +6 -107
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +5 -549
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-manager-auto-resources.d.ts +5 -0
- package/dist/core/package-manager-auto-resources.d.ts.map +1 -0
- package/dist/core/package-manager-auto-resources.js +109 -0
- package/dist/core/package-manager-auto-resources.js.map +1 -0
- package/dist/core/package-manager-command.d.ts +11 -0
- package/dist/core/package-manager-command.d.ts.map +1 -0
- package/dist/core/package-manager-command.js +102 -0
- package/dist/core/package-manager-command.js.map +1 -0
- package/dist/core/package-manager-constants.d.ts +4 -0
- package/dist/core/package-manager-constants.d.ts.map +1 -0
- package/dist/core/package-manager-constants.js +4 -0
- package/dist/core/package-manager-constants.js.map +1 -0
- package/dist/core/package-manager-env.d.ts +4 -0
- package/dist/core/package-manager-env.d.ts.map +1 -0
- package/dist/core/package-manager-env.js +40 -0
- package/dist/core/package-manager-env.js.map +1 -0
- package/dist/core/package-manager-git.d.ts +10 -0
- package/dist/core/package-manager-git.d.ts.map +1 -0
- package/dist/core/package-manager-git.js +271 -0
- package/dist/core/package-manager-git.js.map +1 -0
- package/dist/core/package-manager-manifest.d.ts +7 -0
- package/dist/core/package-manager-manifest.d.ts.map +1 -0
- package/dist/core/package-manager-manifest.js +45 -0
- package/dist/core/package-manager-manifest.js.map +1 -0
- package/dist/core/package-manager-npm.d.ts +25 -0
- package/dist/core/package-manager-npm.d.ts.map +1 -0
- package/dist/core/package-manager-npm.js +252 -0
- package/dist/core/package-manager-npm.js.map +1 -0
- package/dist/core/package-manager-operations.d.ts +11 -0
- package/dist/core/package-manager-operations.d.ts.map +1 -0
- package/dist/core/package-manager-operations.js +196 -0
- package/dist/core/package-manager-operations.js.map +1 -0
- package/dist/core/package-manager-paths.d.ts +14 -0
- package/dist/core/package-manager-paths.d.ts.map +1 -0
- package/dist/core/package-manager-paths.js +61 -0
- package/dist/core/package-manager-paths.js.map +1 -0
- package/dist/core/package-manager-progress.d.ts +4 -0
- package/dist/core/package-manager-progress.d.ts.map +1 -0
- package/dist/core/package-manager-progress.js +16 -0
- package/dist/core/package-manager-progress.js.map +1 -0
- package/dist/core/package-manager-resolver.d.ts +5 -0
- package/dist/core/package-manager-resolver.d.ts.map +1 -0
- package/dist/core/package-manager-resolver.js +149 -0
- package/dist/core/package-manager-resolver.js.map +1 -0
- package/dist/core/package-manager-resource-accumulator.d.ts +6 -0
- package/dist/core/package-manager-resource-accumulator.d.ts.map +1 -0
- package/dist/core/package-manager-resource-accumulator.js +67 -0
- package/dist/core/package-manager-resource-accumulator.js.map +1 -0
- package/dist/core/package-manager-resource-collector.d.ts +5 -0
- package/dist/core/package-manager-resource-collector.d.ts.map +1 -0
- package/dist/core/package-manager-resource-collector.js +148 -0
- package/dist/core/package-manager-resource-collector.js.map +1 -0
- package/dist/core/package-manager-resource-files.d.ts +14 -0
- package/dist/core/package-manager-resource-files.d.ts.map +1 -0
- package/dist/core/package-manager-resource-files.js +265 -0
- package/dist/core/package-manager-resource-files.js.map +1 -0
- package/dist/core/package-manager-resource-patterns.d.ts +12 -0
- package/dist/core/package-manager-resource-patterns.d.ts.map +1 -0
- package/dist/core/package-manager-resource-patterns.js +136 -0
- package/dist/core/package-manager-resource-patterns.js.map +1 -0
- package/dist/core/package-manager-settings.d.ts +10 -0
- package/dist/core/package-manager-settings.d.ts.map +1 -0
- package/dist/core/package-manager-settings.js +91 -0
- package/dist/core/package-manager-settings.js.map +1 -0
- package/dist/core/package-manager-source.d.ts +21 -0
- package/dist/core/package-manager-source.d.ts.map +1 -0
- package/dist/core/package-manager-source.js +146 -0
- package/dist/core/package-manager-source.js.map +1 -0
- package/dist/core/package-manager-types.d.ts +169 -0
- package/dist/core/package-manager-types.d.ts.map +1 -0
- package/dist/core/package-manager-types.js +9 -0
- package/dist/core/package-manager-types.js.map +1 -0
- package/dist/core/package-manager.d.ts +9 -174
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +56 -2100
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/resource-loader-assets.d.ts +6 -0
- package/dist/core/resource-loader-assets.d.ts.map +1 -0
- package/dist/core/resource-loader-assets.js +209 -0
- package/dist/core/resource-loader-assets.js.map +1 -0
- package/dist/core/resource-loader-context-files.d.ts +10 -0
- package/dist/core/resource-loader-context-files.d.ts.map +1 -0
- package/dist/core/resource-loader-context-files.js +74 -0
- package/dist/core/resource-loader-context-files.js.map +1 -0
- package/dist/core/resource-loader-core.d.ts +82 -0
- package/dist/core/resource-loader-core.d.ts.map +1 -0
- package/dist/core/resource-loader-core.js +168 -0
- package/dist/core/resource-loader-core.js.map +1 -0
- package/dist/core/resource-loader-discovery.d.ts +4 -0
- package/dist/core/resource-loader-discovery.d.ts.map +1 -0
- package/dist/core/resource-loader-discovery.js +28 -0
- package/dist/core/resource-loader-discovery.js.map +1 -0
- package/dist/core/resource-loader-extensions.d.ts +13 -0
- package/dist/core/resource-loader-extensions.d.ts.map +1 -0
- package/dist/core/resource-loader-extensions.js +110 -0
- package/dist/core/resource-loader-extensions.js.map +1 -0
- package/dist/core/resource-loader-helpers.d.ts +4 -0
- package/dist/core/resource-loader-helpers.d.ts.map +1 -0
- package/dist/core/resource-loader-helpers.js +23 -0
- package/dist/core/resource-loader-helpers.js.map +1 -0
- package/dist/core/resource-loader-internals.d.ts +96 -0
- package/dist/core/resource-loader-internals.d.ts.map +1 -0
- package/dist/core/resource-loader-internals.js +4 -0
- package/dist/core/resource-loader-internals.js.map +1 -0
- package/dist/core/resource-loader-package-resources.d.ts +31 -0
- package/dist/core/resource-loader-package-resources.d.ts.map +1 -0
- package/dist/core/resource-loader-package-resources.js +112 -0
- package/dist/core/resource-loader-package-resources.js.map +1 -0
- package/dist/core/resource-loader-paths.d.ts +4 -0
- package/dist/core/resource-loader-paths.d.ts.map +1 -0
- package/dist/core/resource-loader-paths.js +22 -0
- package/dist/core/resource-loader-paths.js.map +1 -0
- package/dist/core/resource-loader-reload.d.ts +6 -0
- package/dist/core/resource-loader-reload.d.ts.map +1 -0
- package/dist/core/resource-loader-reload.js +226 -0
- package/dist/core/resource-loader-reload.js.map +1 -0
- package/dist/core/resource-loader-source-info.d.ts +9 -0
- package/dist/core/resource-loader-source-info.d.ts.map +1 -0
- package/dist/core/resource-loader-source-info.js +101 -0
- package/dist/core/resource-loader-source-info.js.map +1 -0
- package/dist/core/resource-loader-types.d.ts +130 -0
- package/dist/core/resource-loader-types.d.ts.map +1 -0
- package/dist/core/resource-loader-types.js +2 -0
- package/dist/core/resource-loader-types.js.map +1 -0
- package/dist/core/resource-loader.d.ts +3 -242
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +2 -976
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk-exports.d.ts +7 -0
- package/dist/core/sdk-exports.d.ts.map +1 -0
- package/dist/core/sdk-exports.js +5 -0
- package/dist/core/sdk-exports.js.map +1 -0
- package/dist/core/sdk-types.d.ts +86 -0
- package/dist/core/sdk-types.d.ts.map +1 -0
- package/dist/core/sdk-types.js +2 -0
- package/dist/core/sdk-types.js.map +1 -0
- package/dist/core/sdk.d.ts +3 -91
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +2 -6
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-archive.d.ts +27 -0
- package/dist/core/session-manager-archive.d.ts.map +1 -0
- package/dist/core/session-manager-archive.js +114 -0
- package/dist/core/session-manager-archive.js.map +1 -0
- package/dist/core/session-manager-core.d.ts +104 -0
- package/dist/core/session-manager-core.d.ts.map +1 -0
- package/dist/core/session-manager-core.js +346 -0
- package/dist/core/session-manager-core.js.map +1 -0
- package/dist/core/session-manager-entries.d.ts +38 -0
- package/dist/core/session-manager-entries.d.ts.map +1 -0
- package/dist/core/session-manager-entries.js +124 -0
- package/dist/core/session-manager-entries.js.map +1 -0
- package/dist/core/session-manager-history.d.ts +38 -0
- package/dist/core/session-manager-history.d.ts.map +1 -0
- package/dist/core/session-manager-history.js +378 -0
- package/dist/core/session-manager-history.js.map +1 -0
- package/dist/core/session-manager-list.d.ts +5 -0
- package/dist/core/session-manager-list.d.ts.map +1 -0
- package/dist/core/session-manager-list.js +196 -0
- package/dist/core/session-manager-list.js.map +1 -0
- package/dist/core/session-manager-migrations.d.ts +11 -0
- package/dist/core/session-manager-migrations.d.ts.map +1 -0
- package/dist/core/session-manager-migrations.js +80 -0
- package/dist/core/session-manager-migrations.js.map +1 -0
- package/dist/core/session-manager-paths.d.ts +7 -0
- package/dist/core/session-manager-paths.d.ts.map +1 -0
- package/dist/core/session-manager-paths.js +22 -0
- package/dist/core/session-manager-paths.js.map +1 -0
- package/dist/core/session-manager-storage.d.ts +15 -0
- package/dist/core/session-manager-storage.d.ts.map +1 -0
- package/dist/core/session-manager-storage.js +127 -0
- package/dist/core/session-manager-storage.js.map +1 -0
- package/dist/core/session-manager-types.d.ts +172 -0
- package/dist/core/session-manager-types.d.ts.map +1 -0
- package/dist/core/session-manager-types.js +2 -0
- package/dist/core/session-manager-types.js.map +1 -0
- package/dist/core/session-manager-validation.d.ts +7 -0
- package/dist/core/session-manager-validation.d.ts.map +1 -0
- package/dist/core/session-manager-validation.js +34 -0
- package/dist/core/session-manager-validation.js.map +1 -0
- package/dist/core/session-manager.d.ts +8 -390
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +7 -1418
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts +65 -0
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -0
- package/dist/core/settings-manager-basic-accessors.js +253 -0
- package/dist/core/settings-manager-basic-accessors.js.map +1 -0
- package/dist/core/settings-manager-core.d.ts +57 -0
- package/dist/core/settings-manager-core.d.ts.map +1 -0
- package/dist/core/settings-manager-core.js +387 -0
- package/dist/core/settings-manager-core.js.map +1 -0
- package/dist/core/settings-manager-internals.d.ts +13 -0
- package/dist/core/settings-manager-internals.d.ts.map +1 -0
- package/dist/core/settings-manager-internals.js +4 -0
- package/dist/core/settings-manager-internals.js.map +1 -0
- package/dist/core/settings-manager-resource-accessors.d.ts +43 -0
- package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -0
- package/dist/core/settings-manager-resource-accessors.js +172 -0
- package/dist/core/settings-manager-resource-accessors.js.map +1 -0
- package/dist/core/settings-manager-ui-accessors.d.ts +44 -0
- package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -0
- package/dist/core/settings-manager-ui-accessors.js +208 -0
- package/dist/core/settings-manager-ui-accessors.js.map +1 -0
- package/dist/core/settings-manager.d.ts +6 -321
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +5 -1060
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-merge.d.ts +4 -0
- package/dist/core/settings-merge.d.ts.map +1 -0
- package/dist/core/settings-merge.js +26 -0
- package/dist/core/settings-merge.js.map +1 -0
- package/dist/core/settings-storage.d.ts +20 -0
- package/dist/core/settings-storage.d.ts.map +1 -0
- package/dist/core/settings-storage.js +100 -0
- package/dist/core/settings-storage.js.map +1 -0
- package/dist/core/settings-types.d.ts +123 -0
- package/dist/core/settings-types.d.ts.map +1 -0
- package/dist/core/settings-types.js +2 -0
- package/dist/core/settings-types.js.map +1 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +7 -0
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash-policy-compile.d.ts +5 -0
- package/dist/core/tools/bash-policy-compile.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-compile.js +241 -0
- package/dist/core/tools/bash-policy-compile.js.map +1 -0
- package/dist/core/tools/bash-policy-evaluate.d.ts +3 -0
- package/dist/core/tools/bash-policy-evaluate.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-evaluate.js +92 -0
- package/dist/core/tools/bash-policy-evaluate.js.map +1 -0
- package/dist/core/tools/bash-policy-format.d.ts +5 -0
- package/dist/core/tools/bash-policy-format.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-format.js +49 -0
- package/dist/core/tools/bash-policy-format.js.map +1 -0
- package/dist/core/tools/bash-policy-parser.d.ts +4 -0
- package/dist/core/tools/bash-policy-parser.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-parser.js +155 -0
- package/dist/core/tools/bash-policy-parser.js.map +1 -0
- package/dist/core/tools/bash-policy-segment.d.ts +3 -0
- package/dist/core/tools/bash-policy-segment.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-segment.js +275 -0
- package/dist/core/tools/bash-policy-segment.js.map +1 -0
- package/dist/core/tools/bash-policy-shell.d.ts +11 -0
- package/dist/core/tools/bash-policy-shell.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-shell.js +267 -0
- package/dist/core/tools/bash-policy-shell.js.map +1 -0
- package/dist/core/tools/bash-policy-types.d.ts +146 -0
- package/dist/core/tools/bash-policy-types.d.ts.map +1 -0
- package/dist/core/tools/bash-policy-types.js +2 -0
- package/dist/core/tools/bash-policy-types.js.map +1 -0
- package/dist/core/tools/bash-policy.d.ts +5 -61
- package/dist/core/tools/bash-policy.d.ts.map +1 -1
- package/dist/core/tools/bash-policy.js +4 -1068
- package/dist/core/tools/bash-policy.js.map +1 -1
- package/dist/core/tools/todos-execute.d.ts +5 -0
- package/dist/core/tools/todos-execute.d.ts.map +1 -0
- package/dist/core/tools/todos-execute.js +200 -0
- package/dist/core/tools/todos-execute.js.map +1 -0
- package/dist/core/tools/todos-locks.d.ts +4 -0
- package/dist/core/tools/todos-locks.d.ts.map +1 -0
- package/dist/core/tools/todos-locks.js +80 -0
- package/dist/core/tools/todos-locks.js.map +1 -0
- package/dist/core/tools/todos-model.d.ts +21 -0
- package/dist/core/tools/todos-model.d.ts.map +1 -0
- package/dist/core/tools/todos-model.js +71 -0
- package/dist/core/tools/todos-model.js.map +1 -0
- package/dist/core/tools/todos-mutations.d.ts +6 -0
- package/dist/core/tools/todos-mutations.d.ts.map +1 -0
- package/dist/core/tools/todos-mutations.js +85 -0
- package/dist/core/tools/todos-mutations.js.map +1 -0
- package/dist/core/tools/todos-paths.d.ts +5 -0
- package/dist/core/tools/todos-paths.d.ts.map +1 -0
- package/dist/core/tools/todos-paths.js +25 -0
- package/dist/core/tools/todos-paths.js.map +1 -0
- package/dist/core/tools/todos-render.d.ts +10 -0
- package/dist/core/tools/todos-render.d.ts.map +1 -0
- package/dist/core/tools/todos-render.js +159 -0
- package/dist/core/tools/todos-render.js.map +1 -0
- package/dist/core/tools/todos-storage.d.ts +9 -0
- package/dist/core/tools/todos-storage.d.ts.map +1 -0
- package/dist/core/tools/todos-storage.js +183 -0
- package/dist/core/tools/todos-storage.js.map +1 -0
- package/dist/core/tools/todos-types.d.ts +46 -0
- package/dist/core/tools/todos-types.d.ts.map +1 -0
- package/dist/core/tools/todos-types.js +27 -0
- package/dist/core/tools/todos-types.js.map +1 -0
- package/dist/core/tools/todos.d.ts +12 -32
- package/dist/core/tools/todos.d.ts.map +1 -1
- package/dist/core/tools/todos.js +7 -893
- package/dist/core/tools/todos.js.map +1 -1
- package/dist/index-extensions.d.ts +3 -0
- package/dist/index-extensions.d.ts.map +1 -0
- package/dist/index-extensions.js +2 -0
- package/dist/index-extensions.js.map +1 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main-app-mode.d.ts +15 -0
- package/dist/main-app-mode.d.ts.map +1 -0
- package/dist/main-app-mode.js +51 -0
- package/dist/main-app-mode.js.map +1 -0
- package/dist/main-session-options.d.ts +12 -0
- package/dist/main-session-options.d.ts.map +1 -0
- package/dist/main-session-options.js +87 -0
- package/dist/main-session-options.js.map +1 -0
- package/dist/main-session.d.ts +9 -0
- package/dist/main-session.d.ts.map +1 -0
- package/dist/main-session.js +188 -0
- package/dist/main-session.js.map +1 -0
- package/dist/main-stdio.d.ts +12 -0
- package/dist/main-stdio.d.ts.map +1 -0
- package/dist/main-stdio.js +68 -0
- package/dist/main-stdio.js.map +1 -0
- package/dist/main.d.ts +2 -3
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +11 -388
- package/dist/main.js.map +1 -1
- package/dist/migrations-config-values.d.ts +9 -0
- package/dist/migrations-config-values.d.ts.map +1 -0
- package/dist/migrations-config-values.js +298 -0
- package/dist/migrations-config-values.js.map +1 -0
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +2 -296
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.js +0 -7
- package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts +9 -0
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-actions.js +244 -0
- package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-editor.d.ts +18 -0
- package/dist/modes/interactive/components/chat-session-host-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-editor.js +165 -0
- package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-events.d.ts +5 -0
- package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-events.js +200 -0
- package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-rendering.d.ts +13 -0
- package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-rendering.js +185 -0
- package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-runtime.d.ts +13 -0
- package/dist/modes/interactive/components/chat-session-host-runtime.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-runtime.js +101 -0
- package/dist/modes/interactive/components/chat-session-host-runtime.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-state.d.ts +53 -0
- package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-state.js +42 -0
- package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-types.d.ts +63 -0
- package/dist/modes/interactive/components/chat-session-host-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-types.js +2 -0
- package/dist/modes/interactive/components/chat-session-host-types.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-utils.d.ts +28 -0
- package/dist/modes/interactive/components/chat-session-host-utils.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-utils.js +103 -0
- package/dist/modes/interactive/components/chat-session-host-utils.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host.d.ts +6 -129
- package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.js +50 -1022
- package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
- package/dist/modes/interactive/components/config-selector-list.d.ts +65 -0
- package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector-list.js +458 -0
- package/dist/modes/interactive/components/config-selector-list.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +3 -58
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +2 -457
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-delete.d.ts +10 -0
- package/dist/modes/interactive/components/session-selector-delete.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-delete.js +40 -0
- package/dist/modes/interactive/components/session-selector-delete.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-header.d.ts +33 -0
- package/dist/modes/interactive/components/session-selector-header.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-header.js +117 -0
- package/dist/modes/interactive/components/session-selector-header.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-list.d.ts +49 -0
- package/dist/modes/interactive/components/session-selector-list.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-list.js +307 -0
- package/dist/modes/interactive/components/session-selector-list.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-tree.d.ts +25 -0
- package/dist/modes/interactive/components/session-selector-tree.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-tree.js +53 -0
- package/dist/modes/interactive/components/session-selector-tree.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-types.d.ts +4 -0
- package/dist/modes/interactive/components/session-selector-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-types.js +2 -0
- package/dist/modes/interactive/components/session-selector-types.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-utils.d.ts +4 -0
- package/dist/modes/interactive/components/session-selector-utils.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-utils.js +37 -0
- package/dist/modes/interactive/components/session-selector-utils.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +3 -49
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +5 -542
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.d.ts +3 -0
- package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector-handlers.js +84 -0
- package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector-items.d.ts +4 -0
- package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector-items.js +211 -0
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector-options.d.ts +6 -0
- package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector-options.js +14 -0
- package/dist/modes/interactive/components/settings-selector-options.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector-submenus.d.ts +44 -0
- package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector-submenus.js +228 -0
- package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector-types.d.ts +67 -0
- package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector-types.js +2 -0
- package/dist/modes/interactive/components/settings-selector-types.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +2 -63
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +5 -538
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector-component.d.ts +21 -0
- package/dist/modes/interactive/components/tree-selector-component.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-component.js +80 -0
- package/dist/modes/interactive/components/tree-selector-component.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-content.d.ts +8 -0
- package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-content.js +263 -0
- package/dist/modes/interactive/components/tree-selector-content.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-help.d.ts +16 -0
- package/dist/modes/interactive/components/tree-selector-help.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-help.js +103 -0
- package/dist/modes/interactive/components/tree-selector-help.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-label-input.d.ts +16 -0
- package/dist/modes/interactive/components/tree-selector-label-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-label-input.js +46 -0
- package/dist/modes/interactive/components/tree-selector-label-input.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-list.d.ts +33 -0
- package/dist/modes/interactive/components/tree-selector-list.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-list.js +336 -0
- package/dist/modes/interactive/components/tree-selector-list.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-model.d.ts +7 -0
- package/dist/modes/interactive/components/tree-selector-model.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-model.js +358 -0
- package/dist/modes/interactive/components/tree-selector-model.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-types.d.ts +57 -0
- package/dist/modes/interactive/components/tree-selector-types.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-types.js +6 -0
- package/dist/modes/interactive/components/tree-selector-types.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector-viewport.d.ts +10 -0
- package/dist/modes/interactive/components/tree-selector-viewport.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector-viewport.js +32 -0
- package/dist/modes/interactive/components/tree-selector-viewport.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +2 -88
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +1 -1200
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.d.ts +2 -0
- package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-agent-events.js +370 -0
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -0
- package/dist/modes/interactive/interactive-auth-login.d.ts +2 -0
- package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-auth-login.js +214 -0
- package/dist/modes/interactive/interactive-auth-login.js.map +1 -0
- package/dist/modes/interactive/interactive-auth-routing.d.ts +2 -0
- package/dist/modes/interactive/interactive-auth-routing.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-auth-routing.js +128 -0
- package/dist/modes/interactive/interactive-auth-routing.js.map +1 -0
- package/dist/modes/interactive/interactive-autocomplete.d.ts +2 -0
- package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-autocomplete.js +140 -0
- package/dist/modes/interactive/interactive-autocomplete.js.map +1 -0
- package/dist/modes/interactive/interactive-bash-compact.d.ts +2 -0
- package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-bash-compact.js +112 -0
- package/dist/modes/interactive/interactive-bash-compact.js.map +1 -0
- package/dist/modes/interactive/interactive-editor-actions.d.ts +2 -0
- package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-editor-actions.js +131 -0
- package/dist/modes/interactive/interactive-editor-actions.js.map +1 -0
- package/dist/modes/interactive/interactive-extension-context.d.ts +2 -0
- package/dist/modes/interactive/interactive-extension-context.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-extension-context.js +159 -0
- package/dist/modes/interactive/interactive-extension-context.js.map +1 -0
- package/dist/modes/interactive/interactive-extension-custom-ui.d.ts +2 -0
- package/dist/modes/interactive/interactive-extension-custom-ui.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-extension-custom-ui.js +208 -0
- package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -0
- package/dist/modes/interactive/interactive-extension-dialogs.d.ts +2 -0
- package/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-extension-dialogs.js +162 -0
- package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -0
- package/dist/modes/interactive/interactive-extension-runtime.d.ts +2 -0
- package/dist/modes/interactive/interactive-extension-runtime.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-extension-runtime.js +179 -0
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -0
- package/dist/modes/interactive/interactive-extension-widgets.d.ts +2 -0
- package/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-extension-widgets.js +113 -0
- package/dist/modes/interactive/interactive-extension-widgets.js.map +1 -0
- package/dist/modes/interactive/interactive-hotkeys-debug.d.ts +2 -0
- package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-hotkeys-debug.js +186 -0
- package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -0
- package/dist/modes/interactive/interactive-input-handling.d.ts +2 -0
- package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-input-handling.js +275 -0
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -0
- package/dist/modes/interactive/interactive-mode-base.d.ts +103 -0
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode-base.js +130 -0
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -0
- package/dist/modes/interactive/interactive-mode-deps.d.ts +81 -0
- package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode-deps.js +74 -0
- package/dist/modes/interactive/interactive-mode-deps.js.map +1 -0
- package/dist/modes/interactive/interactive-mode-helpers.d.ts +21 -0
- package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode-helpers.js +77 -0
- package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -0
- package/dist/modes/interactive/interactive-mode-surface.d.ts +313 -0
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode-surface.js +2 -0
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -0
- package/dist/modes/interactive/interactive-mode-types.d.ts +29 -0
- package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode-types.js +2 -0
- package/dist/modes/interactive/interactive-mode-types.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +30 -404
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +29 -5260
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.d.ts +2 -0
- package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-model-routing.js +269 -0
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -0
- package/dist/modes/interactive/interactive-process-lifecycle.d.ts +2 -0
- package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-process-lifecycle.js +189 -0
- package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -0
- package/dist/modes/interactive/interactive-queueing.d.ts +2 -0
- package/dist/modes/interactive/interactive-queueing.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-queueing.js +163 -0
- package/dist/modes/interactive/interactive-queueing.js.map +1 -0
- package/dist/modes/interactive/interactive-render-chat.d.ts +2 -0
- package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-render-chat.js +170 -0
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -0
- package/dist/modes/interactive/interactive-resource-disclosure.d.ts +2 -0
- package/dist/modes/interactive/interactive-resource-disclosure.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-resource-disclosure.js +101 -0
- package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -0
- package/dist/modes/interactive/interactive-resource-paths.d.ts +2 -0
- package/dist/modes/interactive/interactive-resource-paths.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-resource-paths.js +228 -0
- package/dist/modes/interactive/interactive-resource-paths.js.map +1 -0
- package/dist/modes/interactive/interactive-resource-rendering.d.ts +2 -0
- package/dist/modes/interactive/interactive-resource-rendering.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-resource-rendering.js +181 -0
- package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -0
- package/dist/modes/interactive/interactive-selectors.d.ts +2 -0
- package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-selectors.js +198 -0
- package/dist/modes/interactive/interactive-selectors.js.map +1 -0
- package/dist/modes/interactive/interactive-session-routing.d.ts +2 -0
- package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-session-routing.js +232 -0
- package/dist/modes/interactive/interactive-session-routing.js.map +1 -0
- package/dist/modes/interactive/interactive-session-runtime.d.ts +2 -0
- package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-session-runtime.js +131 -0
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -0
- package/dist/modes/interactive/interactive-slash-commands.d.ts +2 -0
- package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-slash-commands.js +338 -0
- package/dist/modes/interactive/interactive-slash-commands.js.map +1 -0
- package/dist/modes/interactive/interactive-startup.d.ts +2 -0
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-startup.js +348 -0
- package/dist/modes/interactive/interactive-startup.js.map +1 -0
- package/dist/modes/interactive/theme/color-utils.d.ts +20 -0
- package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -0
- package/dist/modes/interactive/theme/color-utils.js +204 -0
- package/dist/modes/interactive/theme/color-utils.js.map +1 -0
- package/dist/modes/interactive/theme/export-colors.d.ts +19 -0
- package/dist/modes/interactive/theme/export-colors.d.ts.map +1 -0
- package/dist/modes/interactive/theme/export-colors.js +69 -0
- package/dist/modes/interactive/theme/export-colors.js.map +1 -0
- package/dist/modes/interactive/theme/global-theme.d.ts +12 -0
- package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/global-theme.js +150 -0
- package/dist/modes/interactive/theme/global-theme.js.map +1 -0
- package/dist/modes/interactive/theme/terminal-detection.d.ts +30 -0
- package/dist/modes/interactive/theme/terminal-detection.d.ts.map +1 -0
- package/dist/modes/interactive/theme/terminal-detection.js +89 -0
- package/dist/modes/interactive/theme/terminal-detection.js.map +1 -0
- package/dist/modes/interactive/theme/theme-class.d.ts +30 -0
- package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-class.js +83 -0
- package/dist/modes/interactive/theme/theme-class.js.map +1 -0
- package/dist/modes/interactive/theme/theme-loading.d.ts +17 -0
- package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-loading.js +155 -0
- package/dist/modes/interactive/theme/theme-loading.js.map +1 -0
- package/dist/modes/interactive/theme/theme-parse.d.ts +5 -0
- package/dist/modes/interactive/theme/theme-parse.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-parse.js +52 -0
- package/dist/modes/interactive/theme/theme-parse.js.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.d.ts +255 -0
- package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.js +78 -0
- package/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/dist/modes/interactive/theme/theme.d.ts +6 -108
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +6 -1065
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/theme/tui-theme.d.ts +15 -0
- package/dist/modes/interactive/theme/tui-theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/tui-theme.js +199 -0
- package/dist/modes/interactive/theme/tui-theme.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +1 -61
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +1 -72
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts +14 -0
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-command-handler.js +226 -0
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -0
- package/dist/modes/rpc/rpc-extension-ui.d.ts +15 -0
- package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-extension-ui.js +196 -0
- package/dist/modes/rpc/rpc-extension-ui.js.map +1 -0
- package/dist/modes/rpc/rpc-input.d.ts +12 -0
- package/dist/modes/rpc/rpc-input.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-input.js +54 -0
- package/dist/modes/rpc/rpc-input.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +43 -607
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-responses.d.ts +8 -0
- package/dist/modes/rpc/rpc-responses.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-responses.js +27 -0
- package/dist/modes/rpc/rpc-responses.js.map +1 -0
- package/dist/modes/rpc/rpc-session-binding.d.ts +25 -0
- package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-session-binding.js +70 -0
- package/dist/modes/rpc/rpc-session-binding.js.map +1 -0
- package/dist/package-manager-cli-parser.d.ts +28 -0
- package/dist/package-manager-cli-parser.d.ts.map +1 -0
- package/dist/package-manager-cli-parser.js +269 -0
- package/dist/package-manager-cli-parser.js.map +1 -0
- package/dist/package-manager-cli.d.ts +0 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +2 -267
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +10 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/version-check.d.ts +1 -0
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +17 -0
- package/dist/utils/version-check.js.map +1 -1
- package/docs/development.md +4 -0
- package/docs/sessions.md +4 -0
- package/docs/workflows.md +13 -7
- package/examples/extensions/custom-provider-anthropic/index.ts +1 -106
- package/examples/extensions/gondolin/index.ts +0 -23
- package/examples/extensions/gondolin/package-lock.json +183 -183
- package/examples/extensions/overlay-qa-animation-components.ts +255 -0
- package/examples/extensions/overlay-qa-focus-components.ts +222 -0
- package/examples/extensions/overlay-qa-position-components.ts +433 -0
- package/examples/extensions/overlay-qa-shared.ts +37 -0
- package/examples/extensions/overlay-qa-streaming-input-components.ts +205 -0
- package/examples/extensions/overlay-qa-tests.ts +17 -1156
- package/examples/extensions/overlay-qa-toggle-passive-components.ts +169 -0
- package/examples/extensions/space-invaders.ts +0 -60
- package/examples/extensions/subagent/display.ts +148 -0
- package/examples/extensions/subagent/index.ts +11 -858
- package/examples/extensions/subagent/render.ts +383 -0
- package/examples/extensions/subagent/runner.ts +252 -0
- package/examples/extensions/subagent/schemas.ts +59 -0
- package/examples/extensions/subagent/types.ts +36 -0
- package/examples/extensions/tic-tac-toe-instructions.ts +65 -0
- package/examples/extensions/tic-tac-toe-rendering.ts +414 -0
- package/examples/extensions/tic-tac-toe-state.ts +158 -0
- package/examples/extensions/tic-tac-toe.ts +92 -754
- package/examples/rpc-extension-ui-components.ts +189 -0
- package/examples/rpc-extension-ui.ts +2 -179
- package/package.json +4 -4
|
@@ -1,34 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* StageChatView — attached workflow-stage chat surface.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* - tool rows use `ToolExecutionComponent` and built-in tool renderers
|
|
10
|
-
* - input reuses the host's custom editor factory when one is installed,
|
|
11
|
-
* otherwise `CustomEditor`; tests/headless fall back to the historical
|
|
12
|
-
* one-line editor
|
|
13
|
-
* - workflow notices render as compact workflow-specific cards because they
|
|
14
|
-
* are not coding-agent chat messages
|
|
4
|
+
* This file is the compatibility facade for the historical
|
|
5
|
+
* `src/tui/stage-chat-view.js` import path. The implementation is split by
|
|
6
|
+
* responsibility into sibling `stage-chat-view-*` modules so each authored
|
|
7
|
+
* source file stays under the repository file-length gate while preserving the
|
|
8
|
+
* same public class, options, detach metadata, and test seams.
|
|
15
9
|
*
|
|
16
10
|
* Behaviour:
|
|
17
|
-
* -
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* -
|
|
23
|
-
* live stages: it requests a controlled pause/abort while keeping the
|
|
24
|
-
* composer active. While paused, Enter calls `handle.resume(text)`.
|
|
25
|
-
* - **Ctrl+D** detaches (back to graph), including while paused;
|
|
26
|
-
* **Escape** closes the popup when idle.
|
|
27
|
-
* - **Blocked** stage: keystrokes absorbed; BLOCKED banner names the
|
|
28
|
-
* upstream awaiter.
|
|
29
|
-
* - **Settled** stage with a live handle remains a normal chat session:
|
|
30
|
-
* Enter sends `handle.prompt(text)` and Escape interrupts any active
|
|
31
|
-
* post-stage response without mutating workflow dependencies.
|
|
11
|
+
* - Idle stage (empty transcript, not streaming, not settled): Enter prompts.
|
|
12
|
+
* - Running live stages: Enter steers, Ctrl+F queues a follow-up, Escape uses
|
|
13
|
+
* the host chat interrupt path.
|
|
14
|
+
* - Paused stages: Enter resumes with composer text; Ctrl+D returns to graph.
|
|
15
|
+
* - Blocked and read-only archive stages absorb mutation keystrokes.
|
|
16
|
+
* - Workflow notices and prompt/custom UI panels keep workflow-specific chrome.
|
|
32
17
|
*
|
|
33
18
|
* cross-ref:
|
|
34
19
|
* - ui/stage-chat-mockup.html (canonical visual)
|
|
@@ -36,682 +21,104 @@
|
|
|
36
21
|
* - src/runs/foreground/stage-control-registry.ts (StageControlHandle)
|
|
37
22
|
* - src/shared/store-types.ts (StageSnapshot.notices, StageNotice)
|
|
38
23
|
* - https://pi.dev/docs/latest/tui (canonical Pi-tui component contract)
|
|
39
|
-
* - node_modules/@earendil-works/pi-tui/src/components/{box,text,spacer}.ts
|
|
40
24
|
*/
|
|
41
25
|
|
|
26
|
+
import type { Component, Focusable } from "@earendil-works/pi-tui";
|
|
27
|
+
import { fitStageChatFrame, planStageChatFrame } from "./stage-chat-layout.js";
|
|
42
28
|
import {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
} from "@bastani/atomic";
|
|
50
|
-
import { Box, Editor, Text } from "@earendil-works/pi-tui";
|
|
51
|
-
import type {
|
|
52
|
-
Component,
|
|
53
|
-
EditorComponent,
|
|
54
|
-
EditorTheme,
|
|
55
|
-
Focusable,
|
|
56
|
-
TUI,
|
|
57
|
-
} from "@earendil-works/pi-tui";
|
|
58
|
-
import type { Store } from "../shared/store.js";
|
|
29
|
+
renderBlockedBody,
|
|
30
|
+
renderPausedBody,
|
|
31
|
+
renderPromptBody,
|
|
32
|
+
renderReadOnlyArchiveBody,
|
|
33
|
+
} from "./stage-chat-view-archive-history.js";
|
|
34
|
+
import { renderCustomUi } from "./stage-chat-view-custom-ui.js";
|
|
59
35
|
import {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
} from "
|
|
66
|
-
import type { PendingPrompt, StageNotice, StageSnapshot, StageStatus } from "../shared/store-types.js";
|
|
67
|
-
import type { GraphTheme } from "./graph-theme.js";
|
|
68
|
-
import type { StageControlHandle } from "../runs/foreground/stage-control-registry.js";
|
|
69
|
-
import { isKeybindingsLike, type KeybindingsLike } from "./keybindings-adapter.js";
|
|
70
|
-
import { BOLD, RESET, hexBg, hexToAnsi, lerpColor } from "./color-utils.js";
|
|
71
|
-
import { renderWorkflowNoticeCard, type WorkflowNoticeTone } from "./workflow-notice-card.js";
|
|
72
|
-
import { Key, matchesKey, truncateToWidth, visibleWidth } from "./text-helpers.js";
|
|
36
|
+
renderFooterWithOrchestratorReturnHint,
|
|
37
|
+
renderHeader,
|
|
38
|
+
sepRule,
|
|
39
|
+
} from "./stage-chat-view-footer-status.js";
|
|
40
|
+
import { handleStageChatInput } from "./stage-chat-view-input.js";
|
|
41
|
+
import { blankLine, takeRows } from "./stage-chat-view-render-helpers.js";
|
|
73
42
|
import {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
43
|
+
currentStage,
|
|
44
|
+
disposeStageChatView,
|
|
45
|
+
initializeStageChatView,
|
|
46
|
+
invalidateStageChatView,
|
|
47
|
+
isBlocked,
|
|
48
|
+
isPaused,
|
|
49
|
+
isReadOnlyArchive,
|
|
50
|
+
syncPromptState,
|
|
51
|
+
viewLineCount,
|
|
52
|
+
} from "./stage-chat-view-state.js";
|
|
53
|
+
import { transcriptDebugEntries } from "./stage-chat-view-transcript.js";
|
|
78
54
|
import {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
function isReadOnlyArchiveStatus(status: StageStatus): boolean {
|
|
93
|
-
return status === "completed" || status === "failed" || status === "skipped";
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export interface StageChatViewOpts {
|
|
97
|
-
store: Store;
|
|
98
|
-
graphTheme: GraphTheme;
|
|
99
|
-
runId: string;
|
|
100
|
-
stageId: string;
|
|
101
|
-
/** The workflow display name, used in the title chrome `<workflow> / <stage>`. */
|
|
102
|
-
workflowName: string;
|
|
103
|
-
/**
|
|
104
|
-
* Live stage-control handle when available. When absent the chat is
|
|
105
|
-
* inspect-only (settled stage with no live handle).
|
|
106
|
-
*/
|
|
107
|
-
handle?: StageControlHandle;
|
|
108
|
-
/** Called when the user presses Ctrl+D (back to graph). */
|
|
109
|
-
onDetach: (reason?: StageChatDetachReason, metadata?: StageChatDetachMetadata) => void;
|
|
110
|
-
/** Called when the user presses Escape (close the whole popup). */
|
|
111
|
-
onClose: () => void;
|
|
112
|
-
/** Request a host TUI repaint after SDK events mutate local chat state. */
|
|
113
|
-
requestRender?: () => void;
|
|
114
|
-
/**
|
|
115
|
-
* Re-assert overlay keyboard focus. Showing a stage custom UI (e.g. the
|
|
116
|
-
* readiness gate) must make the overlay the focused pi-tui component again,
|
|
117
|
-
* otherwise key events keep going elsewhere and the UI looks frozen (#1120).
|
|
118
|
-
*/
|
|
119
|
-
requestFocus?: () => void;
|
|
120
|
-
/** Live pi-tui host objects. When present, stage input uses pi's editor UI. */
|
|
121
|
-
piTui?: TUI;
|
|
122
|
-
piTheme?: unknown;
|
|
123
|
-
piKeybindings?: unknown;
|
|
124
|
-
/** Currently installed host editor factory, inherited from extension `ctx.ui.setEditorComponent()`. */
|
|
125
|
-
piEditorFactory?: (
|
|
126
|
-
tui: TUI,
|
|
127
|
-
theme: EditorTheme,
|
|
128
|
-
keybindings: unknown,
|
|
129
|
-
) => EditorComponent;
|
|
130
|
-
/** Parent chat rendering settings and extension renderers inherited from the host UI. */
|
|
131
|
-
getChatRenderSettings?: () =>
|
|
132
|
-
| Partial<Omit<ChatMessageRenderOptions, "ui" | "cwd">>
|
|
133
|
-
| undefined;
|
|
134
|
-
/** Parent footer data provider inherited from the host UI for core footer/usage rendering. */
|
|
135
|
-
footerData?: ReadonlyFooterDataProvider;
|
|
136
|
-
/**
|
|
137
|
-
* Optional accessor returning the current terminal row count. The chat
|
|
138
|
-
* surface expands its body band to roughly `viewportRows` minus the fixed
|
|
139
|
-
* header / loader / editor / footer rows so the popup fills the
|
|
140
|
-
* terminal under pi-tui's `width: "100%" / maxHeight: "100%"` geometry.
|
|
141
|
-
* Returning `undefined` falls back to the constant 32-row frame.
|
|
142
|
-
*/
|
|
143
|
-
getViewportRows?: () => number | undefined;
|
|
144
|
-
/** Broker that routes stage-local custom UI, such as ask_user_question, into this node. */
|
|
145
|
-
stageUiBroker?: StageUiBroker;
|
|
146
|
-
/**
|
|
147
|
-
* Ownership guard for prompt submission. The attach shell uses this to ensure
|
|
148
|
-
* stale/hidden/non-active stage-chat instances cannot settle a prompt unless
|
|
149
|
-
* the user is currently attached to this exact workflow node.
|
|
150
|
-
*/
|
|
151
|
-
canSubmitPrompt?: (runId: string, stageId: string, promptId: string) => boolean;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Transcript model. Every variant carries a flat `.text` summary so consumers
|
|
156
|
-
* that read `_transcript` (tests, future serialisers) can recover the
|
|
157
|
-
* canonical user-visible string without knowing about the Pi-box payload.
|
|
158
|
-
*/
|
|
159
|
-
export type StageChatDetachReason = "user" | "prompt-resolved";
|
|
160
|
-
|
|
161
|
-
export interface StageChatDetachMetadata {
|
|
162
|
-
readonly suppressNextGraphSubmit?: boolean;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
interface NoticeEntry {
|
|
166
|
-
readonly role: "notice";
|
|
167
|
-
readonly text: string;
|
|
168
|
-
readonly noticeId: string;
|
|
169
|
-
readonly kind: StageNotice["kind"];
|
|
170
|
-
readonly value: string;
|
|
171
|
-
readonly from?: string;
|
|
172
|
-
readonly meta?: string;
|
|
173
|
-
}
|
|
174
|
-
type TranscriptEntry = NoticeEntry | ChatMessageEntry;
|
|
175
|
-
|
|
176
|
-
// ---------------------------------------------------------------------------
|
|
177
|
-
// Frame budget
|
|
178
|
-
// ---------------------------------------------------------------------------
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Default line budget used when the host doesn't surface terminal dimensions
|
|
182
|
-
* (direct unit renders, lightweight test mocks). The mounted overlay
|
|
183
|
-
* overrides this by passing `getViewportRows()`.
|
|
184
|
-
*/
|
|
185
|
-
const VIEW_LINE_COUNT = 32;
|
|
186
|
-
const PROMPT_SCROLL_STEP_ROWS = 4;
|
|
187
|
-
|
|
188
|
-
/** Header strip — ` STAGE wf / stage <meta> ● status` without a leading marker glyph. */
|
|
189
|
-
const HEADER_ROWS = 1;
|
|
190
|
-
/** Single dim rule between header and body. */
|
|
191
|
-
const SEP_ROWS = 1;
|
|
192
|
-
const ITALIC = "\x1b[3m";
|
|
193
|
-
const FG_RESET = "\x1b[39m";
|
|
194
|
-
const WEIGHT_RESET = "\x1b[22m";
|
|
195
|
-
const ITALIC_RESET = "\x1b[23m";
|
|
196
|
-
|
|
197
|
-
// ---------------------------------------------------------------------------
|
|
198
|
-
// StageChatView
|
|
199
|
-
// ---------------------------------------------------------------------------
|
|
55
|
+
HEADER_ROWS,
|
|
56
|
+
SEP_ROWS,
|
|
57
|
+
type StageChatViewContext,
|
|
58
|
+
type StageChatViewOpts,
|
|
59
|
+
type TranscriptDebugEntry,
|
|
60
|
+
} from "./stage-chat-view-types.js";
|
|
61
|
+
|
|
62
|
+
export type {
|
|
63
|
+
StageChatDetachMetadata,
|
|
64
|
+
StageChatDetachReason,
|
|
65
|
+
StageChatViewOpts,
|
|
66
|
+
} from "./stage-chat-view-types.js";
|
|
200
67
|
|
|
201
68
|
export class StageChatView implements Component, Focusable {
|
|
202
69
|
focused = true;
|
|
203
|
-
private store
|
|
204
|
-
private theme
|
|
205
|
-
private runId
|
|
206
|
-
private stageId
|
|
207
|
-
private workflowName
|
|
208
|
-
private handle
|
|
209
|
-
private onDetach
|
|
210
|
-
private onClose
|
|
211
|
-
private requestRender
|
|
212
|
-
private requestFocus
|
|
213
|
-
private focusHoldTimer
|
|
214
|
-
private getViewportRows
|
|
215
|
-
private piTui
|
|
216
|
-
private piTheme
|
|
217
|
-
private piKeybindings
|
|
218
|
-
private piEditorFactory
|
|
219
|
-
private chatHost
|
|
220
|
-
private stageUiBroker
|
|
221
|
-
private canSubmitPrompt
|
|
222
|
-
private mountedCustomUi
|
|
223
|
-
private mountingRequestId
|
|
224
|
-
private promptState
|
|
225
|
-
private promptEditor
|
|
226
|
-
private promptEditorPromptId
|
|
227
|
-
private promptEditorSubmitFromEnter
|
|
228
|
-
private promptScrollOffset
|
|
229
|
-
private promptMaxScroll
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
private
|
|
233
|
-
|
|
234
|
-
private
|
|
235
|
-
|
|
236
|
-
private _unsubscribeStore: (() => void) | null = null;
|
|
237
|
-
private _unsubscribeHandle: (() => void) | null = null;
|
|
238
|
-
private _unregisterStageUiHost: (() => void) | null = null;
|
|
70
|
+
private store!: StageChatViewContext["store"];
|
|
71
|
+
private theme!: StageChatViewContext["theme"];
|
|
72
|
+
private runId!: StageChatViewContext["runId"];
|
|
73
|
+
private stageId!: StageChatViewContext["stageId"];
|
|
74
|
+
private workflowName!: StageChatViewContext["workflowName"];
|
|
75
|
+
private handle!: StageChatViewContext["handle"];
|
|
76
|
+
private onDetach!: StageChatViewContext["onDetach"];
|
|
77
|
+
private onClose!: StageChatViewContext["onClose"];
|
|
78
|
+
private requestRender!: StageChatViewContext["requestRender"];
|
|
79
|
+
private requestFocus!: StageChatViewContext["requestFocus"];
|
|
80
|
+
private focusHoldTimer!: StageChatViewContext["focusHoldTimer"];
|
|
81
|
+
private getViewportRows!: StageChatViewContext["getViewportRows"];
|
|
82
|
+
private piTui!: StageChatViewContext["piTui"];
|
|
83
|
+
private piTheme!: StageChatViewContext["piTheme"];
|
|
84
|
+
private piKeybindings!: StageChatViewContext["piKeybindings"];
|
|
85
|
+
private piEditorFactory!: StageChatViewContext["piEditorFactory"];
|
|
86
|
+
private chatHost!: StageChatViewContext["chatHost"];
|
|
87
|
+
private stageUiBroker!: StageChatViewContext["stageUiBroker"];
|
|
88
|
+
private canSubmitPrompt!: StageChatViewContext["canSubmitPrompt"];
|
|
89
|
+
private mountedCustomUi!: StageChatViewContext["mountedCustomUi"];
|
|
90
|
+
private mountingRequestId!: StageChatViewContext["mountingRequestId"];
|
|
91
|
+
private promptState!: StageChatViewContext["promptState"];
|
|
92
|
+
private promptEditor!: StageChatViewContext["promptEditor"];
|
|
93
|
+
private promptEditorPromptId!: StageChatViewContext["promptEditorPromptId"];
|
|
94
|
+
private promptEditorSubmitFromEnter!: StageChatViewContext["promptEditorSubmitFromEnter"];
|
|
95
|
+
private promptScrollOffset!: StageChatViewContext["promptScrollOffset"];
|
|
96
|
+
private promptMaxScroll!: StageChatViewContext["promptMaxScroll"];
|
|
97
|
+
private localPaused!: StageChatViewContext["localPaused"];
|
|
98
|
+
private seenNoticeIds!: StageChatViewContext["seenNoticeIds"];
|
|
99
|
+
private _unsubscribeStore!: StageChatViewContext["_unsubscribeStore"];
|
|
100
|
+
private _unsubscribeHandle!: StageChatViewContext["_unsubscribeHandle"];
|
|
101
|
+
private _unregisterStageUiHost!: StageChatViewContext["_unregisterStageUiHost"];
|
|
239
102
|
|
|
240
103
|
constructor(opts: StageChatViewOpts) {
|
|
241
|
-
this.
|
|
242
|
-
this.theme = opts.graphTheme;
|
|
243
|
-
this.runId = opts.runId;
|
|
244
|
-
this.stageId = opts.stageId;
|
|
245
|
-
this.workflowName = opts.workflowName;
|
|
246
|
-
this.handle = opts.handle;
|
|
247
|
-
this.onDetach = opts.onDetach;
|
|
248
|
-
this.onClose = opts.onClose;
|
|
249
|
-
this.requestRender = opts.requestRender;
|
|
250
|
-
this.requestFocus = opts.requestFocus;
|
|
251
|
-
// Hold overlay keyboard focus against host focus-steals. pi-tui overlays
|
|
252
|
-
// capture focus on show, but any tui.setFocus() elsewhere (the host editor
|
|
253
|
-
// during background workflow activity) steals it, leaving the gate/composer
|
|
254
|
-
// input-dead. Re-claim it on a short interval — only while NOT streaming, so
|
|
255
|
-
// a mid-turn ask_user_question never refocuses during the agent's
|
|
256
|
-
// continuation (which would stall the stream).
|
|
257
|
-
if (opts.requestFocus) {
|
|
258
|
-
this.focusHoldTimer = setInterval(() => {
|
|
259
|
-
// Hold focus on the overlay whenever there is something to interact
|
|
260
|
-
// with: a mounted custom UI (ask_user_question / readiness gate) must
|
|
261
|
-
// stay answerable even mid-turn, and an idle composer should keep focus.
|
|
262
|
-
// During a pure streaming continuation (no custom UI mounted) we leave
|
|
263
|
-
// focus alone so we never reclaim it out from under the agent's live
|
|
264
|
-
// output. requestFocus is idempotent, so this is a no-op whenever the
|
|
265
|
-
// overlay already owns focus.
|
|
266
|
-
if (this.mountedCustomUi !== null || !this._isStreaming()) this.requestFocus?.();
|
|
267
|
-
}, 150);
|
|
268
|
-
}
|
|
269
|
-
this.getViewportRows = opts.getViewportRows;
|
|
270
|
-
this.piTui = opts.piTui;
|
|
271
|
-
this.piTheme = opts.piTheme;
|
|
272
|
-
this.piKeybindings = opts.piKeybindings;
|
|
273
|
-
this.piEditorFactory = opts.piEditorFactory;
|
|
274
|
-
this.stageUiBroker = opts.stageUiBroker ?? stageUiBroker;
|
|
275
|
-
this.canSubmitPrompt = opts.canSubmitPrompt;
|
|
276
|
-
this.chatHost = new ChatSessionHost<NoticeEntry>({
|
|
277
|
-
style: this._chatHostStyle(),
|
|
278
|
-
commands: {
|
|
279
|
-
ensureAttached: async () => {
|
|
280
|
-
await this._liveHandle()?.ensureAttached();
|
|
281
|
-
},
|
|
282
|
-
prompt: async (text) => {
|
|
283
|
-
const handle = this._liveHandle();
|
|
284
|
-
if (!handle) throw new Error("no live handle on this stage");
|
|
285
|
-
await handle.prompt(text);
|
|
286
|
-
},
|
|
287
|
-
steer: async (text) => {
|
|
288
|
-
const handle = this._liveHandle();
|
|
289
|
-
if (!handle) throw new Error("no live handle on this stage");
|
|
290
|
-
await handle.steer(text);
|
|
291
|
-
},
|
|
292
|
-
followUp: async (text) => {
|
|
293
|
-
const handle = this._liveHandle();
|
|
294
|
-
if (!handle) throw new Error("no live handle on this stage");
|
|
295
|
-
await handle.followUp(text);
|
|
296
|
-
},
|
|
297
|
-
interrupt: async () => {
|
|
298
|
-
const handle = this._liveHandle();
|
|
299
|
-
if (!handle) return;
|
|
300
|
-
const status = this._currentStage()?.status ?? handle.status;
|
|
301
|
-
if (status === "pending" || status === "running" || status === "awaiting_input") {
|
|
302
|
-
await handle.pause();
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
await handle.agentSession?.abort();
|
|
306
|
-
},
|
|
307
|
-
resume: async (message) => {
|
|
308
|
-
const handle = this._liveHandle();
|
|
309
|
-
if (!handle) throw new Error("no live handle on this stage");
|
|
310
|
-
this.localPaused = true;
|
|
311
|
-
await handle.resume(message);
|
|
312
|
-
this.localPaused = false;
|
|
313
|
-
},
|
|
314
|
-
runBash: async (request) => {
|
|
315
|
-
const handle = this._liveHandle();
|
|
316
|
-
if (!handle) throw new Error("no live handle on this stage");
|
|
317
|
-
await handle.ensureAttached();
|
|
318
|
-
const agentSession = handle.agentSession;
|
|
319
|
-
if (!agentSession) throw new Error("no live agent session on this stage");
|
|
320
|
-
return agentSession.executeBash(request.command, request.onChunk, {
|
|
321
|
-
excludeFromContext: request.excludeFromContext,
|
|
322
|
-
});
|
|
323
|
-
},
|
|
324
|
-
abortBash: async () => {
|
|
325
|
-
this._liveHandle()?.agentSession?.abortBash();
|
|
326
|
-
},
|
|
327
|
-
abortCompaction: async () => {
|
|
328
|
-
this._liveHandle()?.agentSession?.abortCompaction();
|
|
329
|
-
},
|
|
330
|
-
handleSlashCommand: async (text) => this._handleSlashCommand(text),
|
|
331
|
-
},
|
|
332
|
-
isBashRunning: () => this._liveHandle()?.agentSession?.isBashRunning === true,
|
|
333
|
-
requestRender: opts.requestRender,
|
|
334
|
-
getAgentSession: () => this._liveHandle()?.agentSession,
|
|
335
|
-
isStreaming: () => this._liveHandle()?.isStreaming === true,
|
|
336
|
-
isPaused: () => this._isPaused(),
|
|
337
|
-
isDisabled: () => this._isBlocked() || !this._liveHandle(),
|
|
338
|
-
tui: opts.piTui,
|
|
339
|
-
keybindings: opts.piKeybindings,
|
|
340
|
-
editorFactory: opts.piEditorFactory,
|
|
341
|
-
editorTheme: editorThemeFromGraphTheme(this.theme),
|
|
342
|
-
getChatRenderSettings: opts.getChatRenderSettings,
|
|
343
|
-
footerData: opts.footerData,
|
|
344
|
-
renderExtraEntry: (entry) => this._noticeRow(entry),
|
|
345
|
-
});
|
|
346
|
-
this._unregisterStageUiHost = this.stageUiBroker.registerHost(this.runId, this.stageId, {
|
|
347
|
-
showCustomUi: (request) => {
|
|
348
|
-
void this._showCustomUi(request);
|
|
349
|
-
},
|
|
350
|
-
hideCustomUi: (request) => {
|
|
351
|
-
this._hideMountedCustomUi(request);
|
|
352
|
-
},
|
|
353
|
-
});
|
|
354
|
-
|
|
355
|
-
// Seed transcript from the live SDK session at attach time, plus any
|
|
356
|
-
// stage notices the workflow body has already recorded.
|
|
357
|
-
this._snapshotMessagesFromHandle();
|
|
358
|
-
const initialStage = this._currentStage();
|
|
359
|
-
this._snapshotMessagesFromSessionFile(initialStage);
|
|
360
|
-
this._absorbStageNotices(initialStage);
|
|
361
|
-
this._syncPromptState(initialStage?.pendingPrompt);
|
|
362
|
-
|
|
363
|
-
this._unsubscribeStore = this.store.subscribe(() => {
|
|
364
|
-
const stage = this._currentStage();
|
|
365
|
-
let changed = false;
|
|
366
|
-
if (stage && stage.status === "paused" && !this.localPaused) {
|
|
367
|
-
this.localPaused = true;
|
|
368
|
-
changed = true;
|
|
369
|
-
} else if (stage && stage.status === "running" && this.localPaused) {
|
|
370
|
-
this.localPaused = false;
|
|
371
|
-
changed = true;
|
|
372
|
-
}
|
|
373
|
-
// Pick up notices recorded after attach (workflow body calling
|
|
374
|
-
// `stage.setModel`, `stage.compact`, …) so they thread through the
|
|
375
|
-
// transcript without a special render path.
|
|
376
|
-
changed = this._absorbStageNotices(stage) || changed;
|
|
377
|
-
const promptChanged = this._syncPromptState(stage?.pendingPrompt);
|
|
378
|
-
changed = promptChanged || changed;
|
|
379
|
-
if (promptChanged && this.promptState && this._canSubmitPrompt(this.promptState.prompt.id)) {
|
|
380
|
-
this.requestFocus?.();
|
|
381
|
-
}
|
|
382
|
-
this.chatHost.syncAnimationTick();
|
|
383
|
-
if (changed) this.requestRender?.();
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
if (this.handle) {
|
|
387
|
-
this._unsubscribeHandle = this.handle.subscribe((event) => {
|
|
388
|
-
this.chatHost.applyAgentEvent(event);
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
this.chatHost.syncAnimationTick();
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
private _chatHostStyle(): ChatSessionHostStyle {
|
|
395
|
-
return {
|
|
396
|
-
dim: (text) => paint(text, this.theme.dim),
|
|
397
|
-
text: (text) => paint(text, this.theme.text),
|
|
398
|
-
textMuted: (text) => paint(text, this.theme.textMuted),
|
|
399
|
-
accent: (text) => paint(text, this.theme.accent),
|
|
400
|
-
accentBold: (text) => paint(text, this.theme.accent, { bold: true }),
|
|
401
|
-
rule: (hex, text) => hexToAnsi(hex) + text + RESET,
|
|
402
|
-
cursor: () => cursorBlock(),
|
|
403
|
-
blank: (width) => this._blank(width),
|
|
404
|
-
editorRuleColor: (disabled, agentSession, state) =>
|
|
405
|
-
this._editorRuleColor(disabled, agentSession, state),
|
|
406
|
-
};
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
private async _showCustomUi(request: StageCustomUiRequest): Promise<void> {
|
|
410
|
-
this.mountedCustomUi?.component.dispose?.();
|
|
411
|
-
this.mountedCustomUi = null;
|
|
412
|
-
// Track the request currently being mounted. `mountStageCustomUi` is async,
|
|
413
|
-
// so the broker can resolve/reject/abort the request (clearing it via
|
|
414
|
-
// `_hideMountedCustomUi`) before we finish awaiting. Without this guard the
|
|
415
|
-
// post-await assignment below would strand a settled gate as a permanent
|
|
416
|
-
// `mountedCustomUi`, hiding the transcript and crashing on the next
|
|
417
|
-
// keystroke routed into the dead component (readiness gate #1099).
|
|
418
|
-
this.mountingRequestId = request.id;
|
|
419
|
-
if (!this.piTui || this.piTheme === undefined || this.piKeybindings === undefined) {
|
|
420
|
-
this.mountingRequestId = null;
|
|
421
|
-
this.stageUiBroker.reject(
|
|
422
|
-
request,
|
|
423
|
-
new Error("atomic-workflows: stage custom UI cannot mount without attached TUI host"),
|
|
424
|
-
);
|
|
425
|
-
return;
|
|
426
|
-
}
|
|
427
|
-
if (request.options?.overlay === true) {
|
|
428
|
-
this.mountingRequestId = null;
|
|
429
|
-
this.stageUiBroker.reject(
|
|
430
|
-
request,
|
|
431
|
-
new Error("atomic-workflows: ctx.ui.custom overlay mode is unavailable in the workflow graph viewer"),
|
|
432
|
-
);
|
|
433
|
-
return;
|
|
434
|
-
}
|
|
435
|
-
try {
|
|
436
|
-
const mounted = await mountStageCustomUi(
|
|
437
|
-
request,
|
|
438
|
-
this.piTui,
|
|
439
|
-
this.piTheme,
|
|
440
|
-
this.piKeybindings,
|
|
441
|
-
this.stageUiBroker,
|
|
442
|
-
() => {
|
|
443
|
-
if (this.mountedCustomUi?.request.id !== request.id) return;
|
|
444
|
-
this.mountedCustomUi.component.dispose?.();
|
|
445
|
-
this.mountedCustomUi = null;
|
|
446
|
-
this.chatHost.focused = this.focused;
|
|
447
|
-
this.chatHost.scrollToBottom();
|
|
448
|
-
this.requestRender?.();
|
|
449
|
-
},
|
|
450
|
-
() => this._canSubmitPrompt(request.id),
|
|
451
|
-
);
|
|
452
|
-
// Settled or superseded while mounting: drop the freshly-built component
|
|
453
|
-
// instead of showing a gate the broker has already torn down.
|
|
454
|
-
if (this.mountingRequestId !== request.id) {
|
|
455
|
-
mounted.component.dispose?.();
|
|
456
|
-
return;
|
|
457
|
-
}
|
|
458
|
-
this.mountingRequestId = null;
|
|
459
|
-
this.mountedCustomUi = mounted;
|
|
460
|
-
// A freshly-shown custom UI (ask_user_question / readiness gate) must own
|
|
461
|
-
// keyboard focus to be answerable — including a question mounted mid-turn
|
|
462
|
-
// while the agent is "streaming" (it is blocked on this very question, and
|
|
463
|
-
// host focus may have drifted off the overlay during the turn, e.g. after a
|
|
464
|
-
// stay-loop composer submit). requestFocus is idempotent (a no-op when the
|
|
465
|
-
// overlay already owns focus), so this never re-runs a redundant focus
|
|
466
|
-
// transition that would stall the stream (#1120).
|
|
467
|
-
this.requestFocus?.();
|
|
468
|
-
this.requestRender?.();
|
|
469
|
-
} catch (error) {
|
|
470
|
-
if (this.mountingRequestId === request.id) this.mountingRequestId = null;
|
|
471
|
-
this.stageUiBroker.reject(request, error);
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
// -------------------------------------------------------------------------
|
|
476
|
-
// Event ingestion
|
|
477
|
-
// -------------------------------------------------------------------------
|
|
478
|
-
|
|
479
|
-
private _snapshotMessagesFromHandle(): void {
|
|
480
|
-
const handle = this._liveHandle();
|
|
481
|
-
if (!handle) return;
|
|
482
|
-
this.chatHost.appendMessages(handle.messages);
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
private _snapshotMessagesFromSessionFile(
|
|
486
|
-
stage: StageSnapshot | undefined,
|
|
487
|
-
): void {
|
|
488
|
-
this.chatHost.loadSessionFile(this._liveHandle()?.sessionFile ?? stage?.sessionFile);
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
private _absorbStageNotices(stage: StageSnapshot | undefined): boolean {
|
|
492
|
-
const notices = stage?.notices;
|
|
493
|
-
if (!notices) return false;
|
|
494
|
-
let changed = false;
|
|
495
|
-
for (const n of notices) {
|
|
496
|
-
if (this.seenNoticeIds.has(n.id)) continue;
|
|
497
|
-
this.seenNoticeIds.add(n.id);
|
|
498
|
-
changed = true;
|
|
499
|
-
this.chatHost.appendExtraEntry({
|
|
500
|
-
role: "notice",
|
|
501
|
-
noticeId: n.id,
|
|
502
|
-
kind: n.kind,
|
|
503
|
-
value: n.to,
|
|
504
|
-
from: n.from,
|
|
505
|
-
meta: n.meta,
|
|
506
|
-
text: noticeSummary(n),
|
|
507
|
-
});
|
|
508
|
-
}
|
|
509
|
-
return changed;
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
private _currentStage(): StageSnapshot | undefined {
|
|
513
|
-
const snap = this.store.snapshot();
|
|
514
|
-
const run = snap.runs.find((r) => r.id === this.runId);
|
|
515
|
-
return run?.stages.find((s) => s.id === this.stageId);
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
private _syncPromptState(prompt: PendingPrompt | undefined): boolean {
|
|
519
|
-
if (!prompt) {
|
|
520
|
-
const hadLivePrompt =
|
|
521
|
-
this.promptState !== null ||
|
|
522
|
-
this.promptEditor !== null ||
|
|
523
|
-
this.promptEditorPromptId !== null;
|
|
524
|
-
if (!hadLivePrompt) return false;
|
|
525
|
-
this.promptState = null;
|
|
526
|
-
this._disposePromptEditor();
|
|
527
|
-
this._resetPromptScroll();
|
|
528
|
-
return true;
|
|
529
|
-
}
|
|
530
|
-
if (!this.promptState || this.promptState.prompt.id !== prompt.id) {
|
|
531
|
-
this.promptState = createPromptCardState(prompt);
|
|
532
|
-
this._seedPromptTextState(prompt);
|
|
533
|
-
this._resetPromptEditor(prompt);
|
|
534
|
-
this._resetPromptScroll();
|
|
535
|
-
return true;
|
|
536
|
-
}
|
|
537
|
-
return false;
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
private _resetPromptScroll(): void {
|
|
541
|
-
this.promptScrollOffset = 0;
|
|
542
|
-
this.promptMaxScroll = 0;
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
private _promptSeedText(prompt: PendingPrompt): string {
|
|
546
|
-
const draft = this.store.getStagePromptDraft(this.runId, this.stageId, prompt.id);
|
|
547
|
-
if (draft !== undefined) return draft;
|
|
548
|
-
return typeof prompt.initial === "string" ? prompt.initial : "";
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
private _seedPromptTextState(prompt: PendingPrompt): void {
|
|
552
|
-
if (prompt.kind !== "input" && prompt.kind !== "editor") return;
|
|
553
|
-
if (!this.promptState || this.promptState.prompt.id !== prompt.id) return;
|
|
554
|
-
const seed = this._promptSeedText(prompt);
|
|
555
|
-
this.promptState.rawText = seed;
|
|
556
|
-
this.promptState.caret = seed.length;
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
private _recordPromptDraft(promptId: string, text: string): void {
|
|
560
|
-
this.store.recordStagePromptDraft(this.runId, this.stageId, promptId, text);
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
private _recordCurrentPromptDraft(): void {
|
|
564
|
-
const state = this.promptState;
|
|
565
|
-
if (!state) return;
|
|
566
|
-
const prompt = state.prompt;
|
|
567
|
-
if (prompt.kind !== "input" && prompt.kind !== "editor") return;
|
|
568
|
-
const text = this.promptEditor && this.promptEditorPromptId === prompt.id
|
|
569
|
-
? this.promptEditor.getText()
|
|
570
|
-
: state.rawText;
|
|
571
|
-
this._recordPromptDraft(prompt.id, text);
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
private _resetPromptEditor(prompt: PendingPrompt): void {
|
|
575
|
-
this._disposePromptEditor();
|
|
576
|
-
if ((prompt.kind !== "input" && prompt.kind !== "editor") || !this.piTui) return;
|
|
577
|
-
const editor = this.piEditorFactory
|
|
578
|
-
? this.piEditorFactory(this.piTui, editorThemeFromGraphTheme(this.theme), this.piKeybindings)
|
|
579
|
-
: new Editor(this.piTui, editorThemeFromGraphTheme(this.theme), { paddingX: 0 });
|
|
580
|
-
editor.setText(this.promptState?.prompt.id === prompt.id ? this.promptState.rawText : this._promptSeedText(prompt));
|
|
581
|
-
setEditorPlaceholder(editor, "Type your response…");
|
|
582
|
-
setEditorBorderColor(editor, (text) => hexToAnsi(this.theme.accent) + text + RESET);
|
|
583
|
-
editor.onChange = (text: string) => {
|
|
584
|
-
if (this.promptState?.prompt.id !== prompt.id) return;
|
|
585
|
-
this.promptState.rawText = text;
|
|
586
|
-
this.promptState.caret = text.length;
|
|
587
|
-
this._recordPromptDraft(prompt.id, text);
|
|
588
|
-
this.requestRender?.();
|
|
589
|
-
};
|
|
590
|
-
editor.onSubmit = (text: string) => {
|
|
591
|
-
this._resolvePromptResponse(prompt.id, text, {
|
|
592
|
-
suppressNextGraphSubmit: this.promptEditorSubmitFromEnter,
|
|
593
|
-
});
|
|
594
|
-
};
|
|
595
|
-
this.promptEditor = editor;
|
|
596
|
-
this.promptEditorPromptId = prompt.id;
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
private _disposePromptEditor(): void {
|
|
600
|
-
const editor = this.promptEditor;
|
|
601
|
-
this.promptEditor = null;
|
|
602
|
-
this.promptEditorPromptId = null;
|
|
603
|
-
const disposable = editor as (EditorComponent & { dispose?: () => void }) | null;
|
|
604
|
-
disposable?.dispose?.();
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
private _resolvePromptResponse(
|
|
608
|
-
promptId: string,
|
|
609
|
-
response: unknown,
|
|
610
|
-
metadata: StageChatDetachMetadata = {},
|
|
611
|
-
): void {
|
|
612
|
-
const prompt = this.promptState?.prompt;
|
|
613
|
-
if (!prompt || prompt.id !== promptId) return;
|
|
614
|
-
if (!this._canSubmitPrompt(promptId)) {
|
|
615
|
-
this.requestRender?.();
|
|
616
|
-
return;
|
|
617
|
-
}
|
|
618
|
-
this.promptState = null;
|
|
619
|
-
this._disposePromptEditor();
|
|
620
|
-
this._resetPromptScroll();
|
|
621
|
-
// A false return means the prompt was already resolved/removed (for
|
|
622
|
-
// example by run abort). The local UI is already stale, so clearing it is
|
|
623
|
-
// the least surprising recovery path, but it must not trigger graph-mode
|
|
624
|
-
// transition side effects for a prompt this view did not actually settle.
|
|
625
|
-
const resolved = this.store.resolveStagePendingPrompt(this.runId, this.stageId, prompt.id, response);
|
|
626
|
-
this.requestRender?.();
|
|
627
|
-
if (resolved) this.onDetach("prompt-resolved", metadata);
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
// -------------------------------------------------------------------------
|
|
631
|
-
// Frame sizing
|
|
632
|
-
// -------------------------------------------------------------------------
|
|
633
|
-
|
|
634
|
-
/**
|
|
635
|
-
* Number of rows the chat surface paints per frame. The mounted overlay
|
|
636
|
-
* passes `terminal.rows` through `getViewportRows`; direct unit renders
|
|
637
|
-
* fall back to the constant `VIEW_LINE_COUNT` so the legacy 32-row frame
|
|
638
|
-
* still applies to lightweight test mocks.
|
|
639
|
-
*/
|
|
640
|
-
private _viewLineCount(): number {
|
|
641
|
-
const reported = this.getViewportRows?.();
|
|
642
|
-
if (typeof reported !== "number" || !Number.isFinite(reported)) {
|
|
643
|
-
return VIEW_LINE_COUNT;
|
|
644
|
-
}
|
|
645
|
-
return resolveStageChatViewportRows(reported, VIEW_LINE_COUNT);
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
private _liveHandle(): StageControlHandle | undefined {
|
|
649
|
-
return this.handle?.isDisposed === true ? undefined : this.handle;
|
|
104
|
+
initializeStageChatView(this._ctx(), opts);
|
|
650
105
|
}
|
|
651
106
|
|
|
652
|
-
private _isStreaming(): boolean {
|
|
653
|
-
return this.chatHost.isStreaming();
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
private _isBlocked(): boolean {
|
|
657
|
-
return this._currentStage()?.status === "blocked";
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
private _isPaused(
|
|
661
|
-
stage: StageSnapshot | undefined = this._currentStage(),
|
|
662
|
-
): boolean {
|
|
663
|
-
return this.localPaused || stage?.status === "paused" || this._liveHandle()?.status === "paused";
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
private _isReadOnlyArchive(stage: StageSnapshot | undefined = this._currentStage()): boolean {
|
|
667
|
-
if (this._liveHandle()) return false;
|
|
668
|
-
if (!stage) return true;
|
|
669
|
-
return isReadOnlyArchiveStatus(stage.status) || Boolean(stage.sessionFile);
|
|
670
|
-
}
|
|
671
|
-
|
|
672
|
-
private async _handleSlashCommand(text: string): Promise<boolean> {
|
|
673
|
-
const [command, ...rest] = text.trim().split(/\s+/);
|
|
674
|
-
switch (command) {
|
|
675
|
-
case "/compact": {
|
|
676
|
-
if (rest.length > 0) return true;
|
|
677
|
-
const handle = this._liveHandle();
|
|
678
|
-
if (!handle) return false;
|
|
679
|
-
await handle.ensureAttached();
|
|
680
|
-
if (!handle.agentSession) return false;
|
|
681
|
-
await handle.agentSession.compact();
|
|
682
|
-
return true;
|
|
683
|
-
}
|
|
684
|
-
case "/quit":
|
|
685
|
-
this.onClose();
|
|
686
|
-
return true;
|
|
687
|
-
default:
|
|
688
|
-
return false;
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
// -------------------------------------------------------------------------
|
|
693
|
-
// Top-level render — composes header / body / usage / editor / footer
|
|
694
|
-
// -------------------------------------------------------------------------
|
|
695
|
-
|
|
696
107
|
render(width: number): string[] {
|
|
108
|
+
const ctx = this._ctx();
|
|
697
109
|
const w = Math.max(40, width);
|
|
698
|
-
const stage =
|
|
699
|
-
const blocked =
|
|
110
|
+
const stage = currentStage(ctx);
|
|
111
|
+
const blocked = isBlocked(ctx);
|
|
700
112
|
|
|
701
113
|
this.chatHost.focused = this.focused;
|
|
702
|
-
const headerLines =
|
|
703
|
-
const sepLines = [
|
|
114
|
+
const headerLines = renderHeader(ctx, w, stage);
|
|
115
|
+
const sepLines = [sepRule(ctx, w)];
|
|
704
116
|
const customUiActive = this.mountedCustomUi !== null;
|
|
705
|
-
|
|
117
|
+
syncPromptState(ctx, stage?.pendingPrompt);
|
|
706
118
|
const promptActive = !customUiActive && this.promptState !== null;
|
|
707
|
-
const readOnlyArchive =
|
|
119
|
+
const readOnlyArchive = isReadOnlyArchive(ctx, stage);
|
|
708
120
|
|
|
709
|
-
|
|
710
|
-
// (in the high-priority composer slot) so the live transcript stays visible
|
|
711
|
-
// and scrollable above it — matching the standalone ask_user_question tool.
|
|
712
|
-
// Structured prompt nodes and read-only archives keep their full-body
|
|
713
|
-
// treatment below.
|
|
714
|
-
const customUiLines = customUiActive ? this._renderCustomUi(w) : [];
|
|
121
|
+
const customUiLines = customUiActive ? renderCustomUi(ctx, w) : [];
|
|
715
122
|
const chatChromeHidden = customUiActive || promptActive || readOnlyArchive;
|
|
716
123
|
const pendingLines = chatChromeHidden ? [] : this.chatHost.renderPendingMessages(w);
|
|
717
124
|
const workingLines = chatChromeHidden ? [] : this.chatHost.renderWorkingStatus(w);
|
|
@@ -719,9 +126,9 @@ export class StageChatView implements Component, Focusable {
|
|
|
719
126
|
const editorLines = chatChromeHidden ? [] : this.chatHost.renderEditor(w);
|
|
720
127
|
const footerLines = chatChromeHidden
|
|
721
128
|
? []
|
|
722
|
-
:
|
|
129
|
+
: renderFooterWithOrchestratorReturnHint(ctx, w, this.chatHost.renderFooter(w));
|
|
723
130
|
|
|
724
|
-
const totalRows =
|
|
131
|
+
const totalRows = viewLineCount(ctx);
|
|
725
132
|
const plan = planStageChatFrame({
|
|
726
133
|
viewportRows: totalRows,
|
|
727
134
|
headerRows: HEADER_ROWS,
|
|
@@ -729,9 +136,6 @@ export class StageChatView implements Component, Focusable {
|
|
|
729
136
|
pendingRows: pendingLines.length,
|
|
730
137
|
workingRows: workingLines.length,
|
|
731
138
|
usageRows: usageLines.length,
|
|
732
|
-
// The custom UI question takes the reserved bottom (composer) slot so the
|
|
733
|
-
// transcript above keeps as much room as possible and the question never
|
|
734
|
-
// clips below the overlay boundary.
|
|
735
139
|
editorRows: customUiActive ? customUiLines.length : editorLines.length,
|
|
736
140
|
footerRows: footerLines.length,
|
|
737
141
|
});
|
|
@@ -748,16 +152,14 @@ export class StageChatView implements Component, Focusable {
|
|
|
748
152
|
if (bodyBudget <= 0) {
|
|
749
153
|
bodyLines = [];
|
|
750
154
|
} else if (promptActive) {
|
|
751
|
-
bodyLines =
|
|
155
|
+
bodyLines = renderPromptBody(ctx, w, bodyBudget);
|
|
752
156
|
} else if (blocked) {
|
|
753
|
-
bodyLines =
|
|
754
|
-
} else if (!readOnlyArchive &&
|
|
755
|
-
bodyLines =
|
|
157
|
+
bodyLines = renderBlockedBody(ctx, w, bodyBudget, stage);
|
|
158
|
+
} else if (!readOnlyArchive && isPaused(ctx, stage)) {
|
|
159
|
+
bodyLines = renderPausedBody(ctx, w, bodyBudget);
|
|
756
160
|
} else if (readOnlyArchive) {
|
|
757
|
-
bodyLines =
|
|
161
|
+
bodyLines = renderReadOnlyArchiveBody(ctx, w, bodyBudget, stage);
|
|
758
162
|
} else {
|
|
759
|
-
// Live transcript. When a custom UI question is active it renders in the
|
|
760
|
-
// composer slot above; the transcript here stays visible and scrollable.
|
|
761
163
|
bodyLines = this.chatHost.renderBody(w, bodyBudget);
|
|
762
164
|
}
|
|
763
165
|
|
|
@@ -771,1123 +173,85 @@ export class StageChatView implements Component, Focusable {
|
|
|
771
173
|
...visibleEditorLines,
|
|
772
174
|
...visibleFooterLines,
|
|
773
175
|
];
|
|
774
|
-
return fitStageChatFrame(lines, totalRows,
|
|
775
|
-
}
|
|
776
|
-
|
|
777
|
-
// -------------------------------------------------------------------------
|
|
778
|
-
// Header
|
|
779
|
-
// -------------------------------------------------------------------------
|
|
780
|
-
|
|
781
|
-
private _renderHeader(
|
|
782
|
-
width: number,
|
|
783
|
-
stage: StageSnapshot | undefined,
|
|
784
|
-
): string[] {
|
|
785
|
-
const t = this.theme;
|
|
786
|
-
const stageName = stage?.name ?? "stage";
|
|
787
|
-
|
|
788
|
-
// Left side: ` STAGE <wf> / <stage>`
|
|
789
|
-
const left =
|
|
790
|
-
paint(" ", t.mauve, { bold: true }) +
|
|
791
|
-
paint("STAGE", t.textMuted, { bold: true }) +
|
|
792
|
-
" " +
|
|
793
|
-
paint(this.workflowName, t.textMuted) +
|
|
794
|
-
paint(" / ", t.dim) +
|
|
795
|
-
paint(stageName, t.text, { bold: true });
|
|
796
|
-
|
|
797
|
-
// Right side: stable session metadata only. Avoid workflow-status chrome
|
|
798
|
-
// in the embedded chat so the surface does not change colour when the
|
|
799
|
-
// workflow stage settles.
|
|
800
|
-
const meta = this._headerMeta(stage);
|
|
801
|
-
const right = meta ? paint(meta, t.dim) + " " : "";
|
|
802
|
-
|
|
803
|
-
const leftW =
|
|
804
|
-
visibleWidth(this.workflowName) +
|
|
805
|
-
visibleWidth(stageName) +
|
|
806
|
-
visibleWidth(" STAGE / ") +
|
|
807
|
-
1;
|
|
808
|
-
const rightW = visibleWidth(meta) + (meta ? 1 : 0);
|
|
809
|
-
const gap = Math.max(1, width - leftW - rightW);
|
|
810
|
-
return [left + " ".repeat(gap) + right];
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
private _headerMeta(stage: StageSnapshot | undefined): string {
|
|
814
|
-
const parts: string[] = [];
|
|
815
|
-
const sid = this.handle?.sessionId ?? stage?.sessionId;
|
|
816
|
-
if (sid) parts.push(`session ${shortenId(sid)}`);
|
|
817
|
-
return parts.join(" · ");
|
|
818
|
-
}
|
|
819
|
-
|
|
820
|
-
private _sepRule(width: number): string {
|
|
821
|
-
return hexToAnsi(this.theme.borderDim) + "─".repeat(width) + RESET;
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
private _renderFooterWithOrchestratorReturnHint(
|
|
825
|
-
width: number,
|
|
826
|
-
footerLines: readonly string[],
|
|
827
|
-
): string[] {
|
|
828
|
-
if (footerLines.length === 0) {
|
|
829
|
-
return [this._mergeOrchestratorReturnHintIntoLine("", width)];
|
|
830
|
-
}
|
|
831
|
-
const lines = [...footerLines];
|
|
832
|
-
const lastIndex = lines.length - 1;
|
|
833
|
-
lines[lastIndex] = this._mergeOrchestratorReturnHintIntoLine(
|
|
834
|
-
lines[lastIndex] ?? "",
|
|
835
|
-
width,
|
|
836
|
-
);
|
|
837
|
-
return lines;
|
|
838
|
-
}
|
|
839
|
-
|
|
840
|
-
private _embedOrchestratorReturnHintInWidget(
|
|
841
|
-
widgetLines: readonly string[],
|
|
842
|
-
width: number,
|
|
843
|
-
): string[] {
|
|
844
|
-
if (widgetLines.length === 0) {
|
|
845
|
-
return [this._mergeOrchestratorReturnHintIntoLine("", width)];
|
|
846
|
-
}
|
|
847
|
-
const lines = [...widgetLines];
|
|
848
|
-
const targetIndex = widgetHintTargetLineIndex(lines);
|
|
849
|
-
lines[targetIndex] = this._mergeOrchestratorReturnHintIntoLine(
|
|
850
|
-
lines[targetIndex] ?? "",
|
|
851
|
-
width,
|
|
852
|
-
{ preserveTrailingBorder: true, rightMargin: 2 },
|
|
853
|
-
);
|
|
854
|
-
return lines;
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
private _mergeOrchestratorReturnHintIntoLine(
|
|
858
|
-
line: string,
|
|
859
|
-
width: number,
|
|
860
|
-
options: { preserveTrailingBorder?: boolean; rightMargin?: number } = {},
|
|
861
|
-
): string {
|
|
862
|
-
const plain = "ctrl+d returns to orchestrator panel";
|
|
863
|
-
const styled =
|
|
864
|
-
paint("ctrl+d", this.theme.text, { bold: true }) +
|
|
865
|
-
paint(" returns to orchestrator panel", this.theme.textMuted);
|
|
866
|
-
const trailingBorder = options.preserveTrailingBorder === true
|
|
867
|
-
? trailingWidgetBorderChar(line)
|
|
868
|
-
: "";
|
|
869
|
-
const suffixWidth = visibleWidth(trailingBorder);
|
|
870
|
-
const hintWidth = visibleWidth(plain);
|
|
871
|
-
const requestedRightMargin = Math.max(
|
|
872
|
-
0,
|
|
873
|
-
Math.floor(options.rightMargin ?? 0),
|
|
874
|
-
);
|
|
875
|
-
const rightMargin = Math.min(
|
|
876
|
-
requestedRightMargin,
|
|
877
|
-
Math.max(0, width - suffixWidth - hintWidth),
|
|
878
|
-
);
|
|
879
|
-
const hintStart = Math.max(0, width - suffixWidth - rightMargin - hintWidth);
|
|
880
|
-
const prefix = truncateToWidth(line, hintStart, "", true);
|
|
881
|
-
const gap = Math.max(0, hintStart - visibleWidth(prefix));
|
|
882
|
-
return prefix + " ".repeat(gap) + styled + " ".repeat(rightMargin) + trailingBorder;
|
|
883
|
-
}
|
|
884
|
-
|
|
885
|
-
// -------------------------------------------------------------------------
|
|
886
|
-
// Body — welcome panel / banner + transcript / blocked
|
|
887
|
-
// -------------------------------------------------------------------------
|
|
888
|
-
|
|
889
|
-
private _renderReadOnlyArchiveBody(
|
|
890
|
-
width: number,
|
|
891
|
-
budget: number,
|
|
892
|
-
stage: StageSnapshot | undefined,
|
|
893
|
-
): string[] {
|
|
894
|
-
if (stage?.promptFootprint) {
|
|
895
|
-
return this._renderReadOnlyPromptArchiveBody(width, budget, stage);
|
|
896
|
-
}
|
|
897
|
-
|
|
898
|
-
const t = this.theme;
|
|
899
|
-
const calloutRows = 6;
|
|
900
|
-
const transcriptBudget = Math.max(1, budget - calloutRows);
|
|
901
|
-
const lines = this.chatHost.renderBody(width, transcriptBudget);
|
|
902
|
-
const callout: string[] = [];
|
|
903
|
-
callout.push(this._blank(width));
|
|
904
|
-
callout.push(
|
|
905
|
-
...this._bannerLines(
|
|
906
|
-
width,
|
|
907
|
-
"info",
|
|
908
|
-
"◌",
|
|
909
|
-
"READ-ONLY SESSION",
|
|
910
|
-
stage?.sessionFile ? "archived transcript" : "no live chat session",
|
|
911
|
-
),
|
|
912
|
-
);
|
|
913
|
-
callout.push(
|
|
914
|
-
...new Text(
|
|
915
|
-
paint("This node is no longer attached to a live chat session.", t.textMuted),
|
|
916
|
-
2,
|
|
917
|
-
0,
|
|
918
|
-
).render(width),
|
|
919
|
-
);
|
|
920
|
-
callout.push(
|
|
921
|
-
...new Text(
|
|
922
|
-
paint("esc", t.accent, { bold: true }) +
|
|
923
|
-
paint(" close", t.textMuted) +
|
|
924
|
-
paint(" · ", t.dim) +
|
|
925
|
-
paint("ctrl+d", t.accent, { bold: true }) +
|
|
926
|
-
paint(" return to graph", t.textMuted),
|
|
927
|
-
2,
|
|
928
|
-
0,
|
|
929
|
-
).render(width),
|
|
930
|
-
);
|
|
931
|
-
lines.push(...callout);
|
|
932
|
-
while (lines.length < budget) lines.push(this._blank(width));
|
|
933
|
-
if (lines.length > budget) lines.length = budget;
|
|
934
|
-
return lines;
|
|
935
|
-
}
|
|
936
|
-
|
|
937
|
-
private _renderReadOnlyPromptArchiveBody(
|
|
938
|
-
width: number,
|
|
939
|
-
budget: number,
|
|
940
|
-
stage: StageSnapshot,
|
|
941
|
-
): string[] {
|
|
942
|
-
const t = this.theme;
|
|
943
|
-
const prompt = stage.promptFootprint;
|
|
944
|
-
if (!prompt) return this._fitBodyLines([], width, budget);
|
|
945
|
-
|
|
946
|
-
const innerWidth = Math.max(2, width - 2);
|
|
947
|
-
const bodyLines: string[] = [];
|
|
948
|
-
const messageBox = new Box(2, 1);
|
|
949
|
-
messageBox.addChild(new Text(paint(prompt.message, t.text), 0, 0));
|
|
950
|
-
bodyLines.push(...messageBox.render(innerWidth));
|
|
951
|
-
bodyLines.push(...new Text(paint("prompt type", t.textMuted, { bold: true }) + paint(` ${prompt.kind}`, t.text), 2, 0).render(innerWidth));
|
|
952
|
-
|
|
953
|
-
if (prompt.kind === "select" && prompt.choices && prompt.choices.length > 0) {
|
|
954
|
-
bodyLines.push(...new Text(paint("choices", t.textMuted, { bold: true }), 2, 0).render(innerWidth));
|
|
955
|
-
for (const choice of prompt.choices) {
|
|
956
|
-
bodyLines.push(...new Text(paint("• ", t.dim) + paint(choice, t.text), 4, 0).render(innerWidth));
|
|
957
|
-
}
|
|
958
|
-
} else if (prompt.kind === "confirm") {
|
|
959
|
-
bodyLines.push(...new Text(paint("choices", t.textMuted, { bold: true }) + paint(" yes / no", t.text), 2, 0).render(innerWidth));
|
|
960
|
-
}
|
|
961
|
-
|
|
962
|
-
if ((prompt.kind === "input" || prompt.kind === "editor") && prompt.initial && prompt.initial.length > 0) {
|
|
963
|
-
bodyLines.push(...new Text(paint("initial value shown", t.textMuted, { bold: true }), 2, 0).render(innerWidth));
|
|
964
|
-
bodyLines.push(...new Text(paint(prompt.initial, t.dim), 4, 0).render(innerWidth));
|
|
965
|
-
}
|
|
966
|
-
|
|
967
|
-
const answer = this._readOnlyPromptAnswer(stage, prompt);
|
|
968
|
-
bodyLines.push("");
|
|
969
|
-
bodyLines.push(...new Text(paint("your response", t.textMuted, { bold: true }), 2, 0).render(innerWidth));
|
|
970
|
-
bodyLines.push(...new Text(paint(answer, answer.startsWith("(") ? t.dim : t.text), 4, 0).render(innerWidth));
|
|
971
|
-
bodyLines.push("");
|
|
972
|
-
bodyLines.push(...new Text(
|
|
973
|
-
paint("esc", t.accent, { bold: true }) +
|
|
974
|
-
paint(" close", t.textMuted) +
|
|
975
|
-
paint(" · ", t.dim) +
|
|
976
|
-
paint("ctrl+d", t.accent, { bold: true }) +
|
|
977
|
-
paint(" return to graph", t.textMuted),
|
|
978
|
-
2,
|
|
979
|
-
0,
|
|
980
|
-
).render(innerWidth));
|
|
981
|
-
|
|
982
|
-
const title = stage.status === "skipped" ? "QUESTION SKIPPED" : "QUESTION ASKED";
|
|
983
|
-
const cardLines = renderRoundedBoxLines({
|
|
984
|
-
title,
|
|
985
|
-
bodyLines,
|
|
986
|
-
width,
|
|
987
|
-
theme: t,
|
|
988
|
-
accent: t.border,
|
|
989
|
-
});
|
|
990
|
-
return this._fitPromptBodyLines(cardLines, width, budget);
|
|
991
|
-
}
|
|
992
|
-
|
|
993
|
-
private _readOnlyPromptAnswer(stage: StageSnapshot, prompt: PendingPrompt): string {
|
|
994
|
-
const answer = this.store.getStagePromptAnswer(this.runId, stage.id);
|
|
995
|
-
if (answer && answer.promptId === prompt.id) {
|
|
996
|
-
return formatReadOnlyPromptAnswer(answer.value, prompt.kind);
|
|
997
|
-
}
|
|
998
|
-
switch (stage.promptAnswerState) {
|
|
999
|
-
case "ambiguous":
|
|
1000
|
-
return "(response replay is ambiguous)";
|
|
1001
|
-
case "unavailable":
|
|
1002
|
-
return "(response unavailable)";
|
|
1003
|
-
case "available":
|
|
1004
|
-
return "(response no longer in live memory)";
|
|
1005
|
-
default:
|
|
1006
|
-
return "(no response saved)";
|
|
1007
|
-
}
|
|
1008
|
-
}
|
|
1009
|
-
|
|
1010
|
-
private _renderPausedBody(width: number, budget: number): string[] {
|
|
1011
|
-
const t = this.theme;
|
|
1012
|
-
const callout: string[] = [];
|
|
1013
|
-
callout.push(this._blank(width));
|
|
1014
|
-
callout.push(
|
|
1015
|
-
...this._bannerLines(
|
|
1016
|
-
width,
|
|
1017
|
-
"warning",
|
|
1018
|
-
"❚❚",
|
|
1019
|
-
"PAUSED",
|
|
1020
|
-
"enter resumes · ctrl+d graph",
|
|
1021
|
-
),
|
|
1022
|
-
);
|
|
1023
|
-
callout.push(
|
|
1024
|
-
...new Text(
|
|
1025
|
-
paint("This workflow stage is paused. Type a message below and press Enter to resume.", t.textMuted),
|
|
1026
|
-
2,
|
|
1027
|
-
0,
|
|
1028
|
-
).render(width),
|
|
1029
|
-
);
|
|
1030
|
-
|
|
1031
|
-
const calloutRows = Math.min(callout.length, Math.max(0, budget - 1));
|
|
1032
|
-
const transcriptBudget = Math.max(1, budget - calloutRows);
|
|
1033
|
-
const lines = this.chatHost.renderBody(width, transcriptBudget);
|
|
1034
|
-
lines.push(...callout.slice(0, calloutRows));
|
|
1035
|
-
while (lines.length < budget) lines.push(this._blank(width));
|
|
1036
|
-
if (lines.length > budget) lines.length = budget;
|
|
1037
|
-
return lines;
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
private _renderBlockedBody(
|
|
1041
|
-
width: number,
|
|
1042
|
-
budget: number,
|
|
1043
|
-
stage: StageSnapshot | undefined,
|
|
1044
|
-
): string[] {
|
|
1045
|
-
const t = this.theme;
|
|
1046
|
-
const upstream = stage?.blockedByStageId ?? "upstream stage";
|
|
1047
|
-
const lines: string[] = [];
|
|
1048
|
-
// Yellow banner — uses the same chrome vocabulary as paused/completed.
|
|
1049
|
-
lines.push(
|
|
1050
|
-
...this._bannerLines(
|
|
1051
|
-
width,
|
|
1052
|
-
"warning",
|
|
1053
|
-
"↑",
|
|
1054
|
-
"BLOCKED",
|
|
1055
|
-
`waiting on ${upstream}`,
|
|
1056
|
-
),
|
|
1057
|
-
);
|
|
1058
|
-
lines.push(this._blank(width));
|
|
1059
|
-
lines.push(
|
|
1060
|
-
...new Text(
|
|
1061
|
-
paint(
|
|
1062
|
-
"This stage is waiting for the upstream stage to resume.",
|
|
1063
|
-
t.textMuted,
|
|
1064
|
-
),
|
|
1065
|
-
2,
|
|
1066
|
-
0,
|
|
1067
|
-
).render(width),
|
|
1068
|
-
);
|
|
1069
|
-
lines.push(
|
|
1070
|
-
...new Text(
|
|
1071
|
-
paint("ctrl+d", t.accent, { bold: true }) +
|
|
1072
|
-
paint(" return to graph", t.textMuted),
|
|
1073
|
-
2,
|
|
1074
|
-
0,
|
|
1075
|
-
).render(width),
|
|
1076
|
-
);
|
|
1077
|
-
while (lines.length < budget) lines.push(this._blank(width));
|
|
1078
|
-
if (lines.length > budget) lines.length = budget;
|
|
1079
|
-
return lines;
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
// Natural-height render of the mounted custom UI (no body padding): it is
|
|
1083
|
-
// placed in the composer slot so the transcript stays scrollable above it.
|
|
1084
|
-
private _renderCustomUi(width: number): string[] {
|
|
1085
|
-
const component = this.mountedCustomUi?.component;
|
|
1086
|
-
if (!component) return [];
|
|
1087
|
-
setComponentFocused(component, this.focused);
|
|
1088
|
-
return this._embedOrchestratorReturnHintInWidget(component.render(width), width);
|
|
1089
|
-
}
|
|
1090
|
-
|
|
1091
|
-
private _renderPromptBody(width: number, budget: number): string[] {
|
|
1092
|
-
const primitiveLines = this._renderPrimitivePromptBody(width);
|
|
1093
|
-
if (primitiveLines) {
|
|
1094
|
-
return this._fitPromptBodyLines(
|
|
1095
|
-
this._embedOrchestratorReturnHintInWidget(primitiveLines, width),
|
|
1096
|
-
width,
|
|
1097
|
-
budget,
|
|
1098
|
-
);
|
|
1099
|
-
}
|
|
1100
|
-
|
|
1101
|
-
const state = this.promptState;
|
|
1102
|
-
const lines = state
|
|
1103
|
-
? renderPromptCard({
|
|
1104
|
-
state,
|
|
1105
|
-
theme: this.theme,
|
|
1106
|
-
width,
|
|
1107
|
-
cursorOn: this.focused,
|
|
1108
|
-
})
|
|
1109
|
-
: [];
|
|
1110
|
-
return this._fitPromptBodyLines(
|
|
1111
|
-
this._embedOrchestratorReturnHintInWidget(lines, width),
|
|
1112
|
-
width,
|
|
1113
|
-
budget,
|
|
1114
|
-
);
|
|
1115
|
-
}
|
|
1116
|
-
|
|
1117
|
-
private _renderPrimitivePromptBody(width: number): string[] | null {
|
|
1118
|
-
const state = this.promptState;
|
|
1119
|
-
const editor = this.promptEditor;
|
|
1120
|
-
if (!state || !editor) return null;
|
|
1121
|
-
setEditorFocused(editor, this.focused);
|
|
1122
|
-
setEditorBorderColor(editor, (text) => hexToAnsi(this.theme.accent) + text + RESET);
|
|
1123
|
-
|
|
1124
|
-
const innerWidth = Math.max(2, width - 2);
|
|
1125
|
-
const bodyLines: string[] = [];
|
|
1126
|
-
const messageBox = new Box(2, 1);
|
|
1127
|
-
messageBox.addChild(new Text(paint(state.prompt.message, this.theme.text), 0, 0));
|
|
1128
|
-
bodyLines.push(...messageBox.render(innerWidth));
|
|
1129
|
-
bodyLines.push(...new Text(paint("response", this.theme.textMuted, { bold: true }), 2, 0).render(innerWidth));
|
|
1130
|
-
for (const line of editor.render(Math.max(20, innerWidth - 4))) {
|
|
1131
|
-
bodyLines.push(" " + line);
|
|
1132
|
-
}
|
|
1133
|
-
bodyLines.push("");
|
|
1134
|
-
bodyLines.push(...new Text(renderHintsForPrompt(state.prompt.kind, this.theme), 2, 0).render(innerWidth));
|
|
1135
|
-
|
|
1136
|
-
return renderRoundedBoxLines({
|
|
1137
|
-
title: "AWAITING INPUT",
|
|
1138
|
-
bodyLines,
|
|
1139
|
-
width,
|
|
1140
|
-
theme: this.theme,
|
|
1141
|
-
accent: this.theme.border,
|
|
1142
|
-
});
|
|
1143
|
-
}
|
|
1144
|
-
|
|
1145
|
-
private _fitPromptBodyLines(lines: readonly string[], width: number, budget: number): string[] {
|
|
1146
|
-
this.promptMaxScroll = Math.max(0, lines.length - budget);
|
|
1147
|
-
this.promptScrollOffset = Math.max(0, Math.min(this.promptScrollOffset, this.promptMaxScroll));
|
|
1148
|
-
const framed = lines.slice(this.promptScrollOffset, this.promptScrollOffset + budget);
|
|
1149
|
-
while (framed.length < budget) framed.push(this._blank(width));
|
|
1150
|
-
return framed;
|
|
1151
|
-
}
|
|
1152
|
-
|
|
1153
|
-
private _fitBodyLines(lines: readonly string[], width: number, budget: number): string[] {
|
|
1154
|
-
const framed = lines.slice(0, budget);
|
|
1155
|
-
while (framed.length < budget) framed.push(this._blank(width));
|
|
1156
|
-
return framed;
|
|
1157
|
-
}
|
|
1158
|
-
|
|
1159
|
-
private _noticeRow(entry: NoticeEntry): Component {
|
|
1160
|
-
const theme = this.theme;
|
|
1161
|
-
return {
|
|
1162
|
-
render(width: number): string[] {
|
|
1163
|
-
return renderWorkflowNoticeCard({
|
|
1164
|
-
...stageNoticeCard(entry),
|
|
1165
|
-
fallbackText: entry.text,
|
|
1166
|
-
width,
|
|
1167
|
-
theme,
|
|
1168
|
-
});
|
|
1169
|
-
},
|
|
1170
|
-
invalidate() {
|
|
1171
|
-
/* notice entries are immutable */
|
|
1172
|
-
},
|
|
1173
|
-
};
|
|
1174
|
-
}
|
|
1175
|
-
|
|
1176
|
-
// -------------------------------------------------------------------------
|
|
1177
|
-
// Banners (paused / completed / failed / blocked)
|
|
1178
|
-
// -------------------------------------------------------------------------
|
|
1179
|
-
|
|
1180
|
-
private _banner(
|
|
1181
|
-
kind: "warning" | "success" | "error" | "info",
|
|
1182
|
-
glyph: string,
|
|
1183
|
-
label: string,
|
|
1184
|
-
meta: string,
|
|
1185
|
-
): Component {
|
|
1186
|
-
const t = this.theme;
|
|
1187
|
-
const fg =
|
|
1188
|
-
kind === "warning"
|
|
1189
|
-
? t.warning
|
|
1190
|
-
: kind === "success"
|
|
1191
|
-
? t.success
|
|
1192
|
-
: kind === "info"
|
|
1193
|
-
? t.info
|
|
1194
|
-
: t.error;
|
|
1195
|
-
const bg = blendBg(t.bg, fg, 0.1);
|
|
1196
|
-
const head =
|
|
1197
|
-
paintOnFill(glyph, fg, { bold: true }) +
|
|
1198
|
-
" " +
|
|
1199
|
-
paintOnFill(label, fg, { bold: true }) +
|
|
1200
|
-
" " +
|
|
1201
|
-
paintOnFill(stripAnsi(meta), t.dim);
|
|
1202
|
-
const box = new Box(2, 0, bgFn(bg));
|
|
1203
|
-
box.addChild(new Text(head, 0, 0));
|
|
1204
|
-
return box;
|
|
1205
|
-
}
|
|
1206
|
-
|
|
1207
|
-
/**
|
|
1208
|
-
* Banner rendered directly as string lines. Used by `_renderBlockedBody`
|
|
1209
|
-
* which builds its body out of raw rows rather than a Component[] stack.
|
|
1210
|
-
*/
|
|
1211
|
-
private _bannerLines(
|
|
1212
|
-
width: number,
|
|
1213
|
-
kind: "warning" | "success" | "error" | "info",
|
|
1214
|
-
glyph: string,
|
|
1215
|
-
label: string,
|
|
1216
|
-
meta: string,
|
|
1217
|
-
): string[] {
|
|
1218
|
-
return this._banner(kind, glyph, label, meta).render(width);
|
|
1219
|
-
}
|
|
1220
|
-
|
|
1221
|
-
private _editorRuleColor(
|
|
1222
|
-
disabled: boolean,
|
|
1223
|
-
agentSession: AgentSession | undefined,
|
|
1224
|
-
state?: { isBashMode: boolean },
|
|
1225
|
-
): string {
|
|
1226
|
-
if (disabled) return this.theme.borderDim;
|
|
1227
|
-
if (state?.isBashMode) return this.theme.warning;
|
|
1228
|
-
const level = agentSession?.state.thinkingLevel ?? "off";
|
|
1229
|
-
switch (level) {
|
|
1230
|
-
case "minimal":
|
|
1231
|
-
return this.theme.borderDim;
|
|
1232
|
-
case "low":
|
|
1233
|
-
return this.theme.info;
|
|
1234
|
-
case "medium":
|
|
1235
|
-
return this.theme.accent;
|
|
1236
|
-
case "high":
|
|
1237
|
-
return this.theme.mauve;
|
|
1238
|
-
case "xhigh":
|
|
1239
|
-
return this.theme.error;
|
|
1240
|
-
case "off":
|
|
1241
|
-
default:
|
|
1242
|
-
return this.theme.border;
|
|
1243
|
-
}
|
|
1244
|
-
}
|
|
1245
|
-
|
|
1246
|
-
// -------------------------------------------------------------------------
|
|
1247
|
-
// Small helpers
|
|
1248
|
-
// -------------------------------------------------------------------------
|
|
1249
|
-
|
|
1250
|
-
private _blank(width: number): string {
|
|
1251
|
-
return " ".repeat(width);
|
|
176
|
+
return fitStageChatFrame(lines, totalRows, blankLine(w));
|
|
1252
177
|
}
|
|
1253
178
|
|
|
1254
179
|
wantsMouseScrollTracking(): boolean {
|
|
1255
180
|
return true;
|
|
1256
181
|
}
|
|
1257
182
|
|
|
1258
|
-
private _promptKeybindings(): KeybindingsLike | undefined {
|
|
1259
|
-
return isKeybindingsLike(this.piKeybindings) ? this.piKeybindings : undefined;
|
|
1260
|
-
}
|
|
1261
|
-
|
|
1262
|
-
private _canSubmitPrompt(promptId: string): boolean {
|
|
1263
|
-
return this.canSubmitPrompt?.(this.runId, this.stageId, promptId) ?? true;
|
|
1264
|
-
}
|
|
1265
|
-
|
|
1266
|
-
private _handlePromptInput(data: string): void {
|
|
1267
|
-
const state = this.promptState;
|
|
1268
|
-
if (!state) return;
|
|
1269
|
-
if (this.promptEditor && this.promptEditorPromptId === state.prompt.id) {
|
|
1270
|
-
if (matchesKey(data, Key.ctrl("c"))) {
|
|
1271
|
-
this._resolvePromptResponse(state.prompt.id, defaultResponseFor(state.prompt), {
|
|
1272
|
-
suppressNextGraphSubmit: false,
|
|
1273
|
-
});
|
|
1274
|
-
return;
|
|
1275
|
-
}
|
|
1276
|
-
if (isPromptEscapeInput(data)) {
|
|
1277
|
-
this.requestRender?.();
|
|
1278
|
-
return;
|
|
1279
|
-
}
|
|
1280
|
-
setEditorFocused(this.promptEditor, this.focused);
|
|
1281
|
-
this.promptEditorSubmitFromEnter = matchesKey(data, Key.enter);
|
|
1282
|
-
try {
|
|
1283
|
-
this.promptEditor.handleInput(data);
|
|
1284
|
-
} finally {
|
|
1285
|
-
this.promptEditorSubmitFromEnter = false;
|
|
1286
|
-
}
|
|
1287
|
-
this.requestRender?.();
|
|
1288
|
-
return;
|
|
1289
|
-
}
|
|
1290
|
-
const action = handlePromptCardInput(data, state, this._promptKeybindings());
|
|
1291
|
-
const prompt = state.prompt;
|
|
1292
|
-
if (prompt.kind === "input" || prompt.kind === "editor") {
|
|
1293
|
-
this._recordPromptDraft(prompt.id, state.rawText);
|
|
1294
|
-
}
|
|
1295
|
-
if (action.kind === "noop") {
|
|
1296
|
-
this.requestRender?.();
|
|
1297
|
-
return;
|
|
1298
|
-
}
|
|
1299
|
-
const response = action.kind === "submit"
|
|
1300
|
-
? action.response
|
|
1301
|
-
: defaultResponseFor(prompt);
|
|
1302
|
-
this._resolvePromptResponse(prompt.id, response, {
|
|
1303
|
-
suppressNextGraphSubmit: action.kind === "submit" && matchesKey(data, Key.enter),
|
|
1304
|
-
});
|
|
1305
|
-
}
|
|
1306
|
-
|
|
1307
|
-
// -------------------------------------------------------------------------
|
|
1308
|
-
// Input
|
|
1309
|
-
// -------------------------------------------------------------------------
|
|
1310
|
-
|
|
1311
183
|
handleInput(data: string): boolean {
|
|
1312
|
-
|
|
1313
|
-
if (!this._canSubmitPrompt(this.mountedCustomUi.request.id)) {
|
|
1314
|
-
this.requestRender?.();
|
|
1315
|
-
return true;
|
|
1316
|
-
}
|
|
1317
|
-
if (matchesKey(data, Key.ctrl("d"))) {
|
|
1318
|
-
// Detach stops *viewing* the stage; it does not cancel a pending
|
|
1319
|
-
// human-input request. Release the local display only — the request
|
|
1320
|
-
// stays pending (the stage remains awaiting_input) and is re-displayed
|
|
1321
|
-
// when the user re-attaches.
|
|
1322
|
-
this._releaseMountedCustomUi();
|
|
1323
|
-
this.onDetach();
|
|
1324
|
-
return true;
|
|
1325
|
-
}
|
|
1326
|
-
if (matchesKey(data, Key.ctrl("c"))) {
|
|
1327
|
-
// Close hides the overlay; the background run — and its pending
|
|
1328
|
-
// human-input request — keep living. Release the local display only.
|
|
1329
|
-
this._releaseMountedCustomUi();
|
|
1330
|
-
this.onClose();
|
|
1331
|
-
return true;
|
|
1332
|
-
}
|
|
1333
|
-
// Let scroll input (mouse wheel / pageUp / pageDown / home / end) reach
|
|
1334
|
-
// the transcript so history stays scrollable while the question is shown,
|
|
1335
|
-
// matching the standalone ask_user_question tool. Navigation keys
|
|
1336
|
-
// (arrows / enter / typing) fall through to the question component.
|
|
1337
|
-
if (this.chatHost.handleScrollInput(data)) {
|
|
1338
|
-
this.requestRender?.();
|
|
1339
|
-
return true;
|
|
1340
|
-
}
|
|
1341
|
-
setComponentFocused(this.mountedCustomUi.component, this.focused);
|
|
1342
|
-
this.mountedCustomUi.component.handleInput?.(data);
|
|
1343
|
-
this.requestRender?.();
|
|
1344
|
-
return true;
|
|
1345
|
-
}
|
|
1346
|
-
const stage = this._currentStage();
|
|
1347
|
-
this._syncPromptState(stage?.pendingPrompt);
|
|
1348
|
-
const readOnlyArchive = this._isReadOnlyArchive(stage);
|
|
1349
|
-
const readOnlyPromptArchive = readOnlyArchive && stage?.promptFootprint !== undefined;
|
|
1350
|
-
if (matchesKey(data, Key.ctrl("d"))) {
|
|
1351
|
-
if (!this.promptState && this.chatHost.hasInputText()) return this.chatHost.handleInput(data);
|
|
1352
|
-
this._recordCurrentPromptDraft();
|
|
1353
|
-
this.onDetach();
|
|
1354
|
-
return true;
|
|
1355
|
-
}
|
|
1356
|
-
if (this.promptState) {
|
|
1357
|
-
if (this._handlePromptScrollInput(data, this.promptEditor === null)) return true;
|
|
1358
|
-
this._handlePromptInput(data);
|
|
1359
|
-
return true;
|
|
1360
|
-
}
|
|
1361
|
-
if (readOnlyPromptArchive && this._handlePromptScrollInput(data, true)) {
|
|
1362
|
-
return true;
|
|
1363
|
-
}
|
|
1364
|
-
if (this.chatHost.handleScrollInput(data)) {
|
|
1365
|
-
return true;
|
|
1366
|
-
}
|
|
1367
|
-
if (matchesKey(data, Key.escape)) {
|
|
1368
|
-
if (
|
|
1369
|
-
this._isStreaming() ||
|
|
1370
|
-
this.chatHost.isBashRunning() ||
|
|
1371
|
-
this.chatHost.isEditingBashCommand()
|
|
1372
|
-
) {
|
|
1373
|
-
return this.chatHost.handleInput(data);
|
|
1374
|
-
}
|
|
1375
|
-
this.onClose();
|
|
1376
|
-
return true;
|
|
1377
|
-
}
|
|
1378
|
-
if (matchesKey(data, Key.ctrl("c"))) {
|
|
1379
|
-
this.onClose();
|
|
1380
|
-
return true;
|
|
1381
|
-
}
|
|
1382
|
-
if (readOnlyArchive) return true;
|
|
1383
|
-
const blocked = this._isBlocked();
|
|
1384
|
-
if (matchesKey(data, Key.ctrl("f"))) {
|
|
1385
|
-
if (blocked) return true;
|
|
1386
|
-
void this.chatHost.submit("followUp");
|
|
1387
|
-
return true;
|
|
1388
|
-
}
|
|
1389
|
-
if (blocked) return true;
|
|
1390
|
-
return this.chatHost.handleInput(data);
|
|
1391
|
-
}
|
|
1392
|
-
|
|
1393
|
-
private _handlePromptScrollInput(data: string, includeKeyboard = true): boolean {
|
|
1394
|
-
const wheelDeltaRows = this._mouseWheelDeltaRows(data);
|
|
1395
|
-
if (wheelDeltaRows !== 0) {
|
|
1396
|
-
this._scrollPromptBy(wheelDeltaRows);
|
|
1397
|
-
return true;
|
|
1398
|
-
}
|
|
1399
|
-
if (this._isMouseSequence(data)) return true;
|
|
1400
|
-
if (!includeKeyboard) return false;
|
|
1401
|
-
if (matchesKey(data, "pageUp")) {
|
|
1402
|
-
this._scrollPromptBy(-this._promptPageSize());
|
|
1403
|
-
return true;
|
|
1404
|
-
}
|
|
1405
|
-
if (matchesKey(data, "pageDown")) {
|
|
1406
|
-
this._scrollPromptBy(this._promptPageSize());
|
|
1407
|
-
return true;
|
|
1408
|
-
}
|
|
1409
|
-
if (!this.promptEditor && matchesKey(data, "home")) {
|
|
1410
|
-
this.promptScrollOffset = 0;
|
|
1411
|
-
this.requestRender?.();
|
|
1412
|
-
return true;
|
|
1413
|
-
}
|
|
1414
|
-
if (!this.promptEditor && matchesKey(data, "end")) {
|
|
1415
|
-
this.promptScrollOffset = this.promptMaxScroll;
|
|
1416
|
-
this.requestRender?.();
|
|
1417
|
-
return true;
|
|
1418
|
-
}
|
|
1419
|
-
return false;
|
|
1420
|
-
}
|
|
1421
|
-
|
|
1422
|
-
private _scrollPromptBy(deltaRows: number): void {
|
|
1423
|
-
this.promptScrollOffset = Math.max(
|
|
1424
|
-
0,
|
|
1425
|
-
Math.min(this.promptMaxScroll, this.promptScrollOffset + deltaRows),
|
|
1426
|
-
);
|
|
1427
|
-
this.requestRender?.();
|
|
1428
|
-
}
|
|
1429
|
-
|
|
1430
|
-
private _promptPageSize(): number {
|
|
1431
|
-
return Math.max(4, this._viewLineCount() - HEADER_ROWS - SEP_ROWS - 2);
|
|
1432
|
-
}
|
|
1433
|
-
|
|
1434
|
-
private _mouseWheelDeltaRows(data: string): number {
|
|
1435
|
-
const sgr = data.match(/^\x1b\[<(\d+);\d+;\d+M$/);
|
|
1436
|
-
if (sgr) return this._wheelDeltaForButtonCode(Number.parseInt(sgr[1]!, 10));
|
|
1437
|
-
if (data.startsWith("\x1b[M") && data.length >= 6) {
|
|
1438
|
-
return this._wheelDeltaForButtonCode(data.charCodeAt(3) - 32);
|
|
1439
|
-
}
|
|
1440
|
-
return 0;
|
|
1441
|
-
}
|
|
1442
|
-
|
|
1443
|
-
private _wheelDeltaForButtonCode(code: number): number {
|
|
1444
|
-
if ((code & 64) === 0) return 0;
|
|
1445
|
-
const direction = code & 3;
|
|
1446
|
-
if (direction === 0) return -PROMPT_SCROLL_STEP_ROWS;
|
|
1447
|
-
if (direction === 1) return PROMPT_SCROLL_STEP_ROWS;
|
|
1448
|
-
return 0;
|
|
1449
|
-
}
|
|
1450
|
-
|
|
1451
|
-
private _isMouseSequence(data: string): boolean {
|
|
1452
|
-
return /^\x1b\[<\d+;\d+;\d+[mM]$/.test(data) || data.startsWith("\x1b[M");
|
|
184
|
+
return handleStageChatInput(this._ctx(), data);
|
|
1453
185
|
}
|
|
1454
186
|
|
|
1455
187
|
invalidate(): void {
|
|
1456
|
-
this.
|
|
1457
|
-
this._syncPromptState(this._currentStage()?.pendingPrompt);
|
|
188
|
+
invalidateStageChatView(this._ctx());
|
|
1458
189
|
}
|
|
1459
190
|
|
|
1460
191
|
dispose(): void {
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
this.
|
|
1469
|
-
this.
|
|
1470
|
-
this.
|
|
1471
|
-
this.
|
|
1472
|
-
this.
|
|
1473
|
-
this.
|
|
192
|
+
disposeStageChatView(this._ctx());
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
private _ctx(): StageChatViewContext {
|
|
196
|
+
// Helper modules operate on the same runtime object; these reads keep the
|
|
197
|
+
// private fields visible to noUnusedLocals while preserving the historical
|
|
198
|
+
// non-public TypeScript surface of StageChatView.
|
|
199
|
+
void this.store;
|
|
200
|
+
void this.theme;
|
|
201
|
+
void this.runId;
|
|
202
|
+
void this.stageId;
|
|
203
|
+
void this.workflowName;
|
|
204
|
+
void this.handle;
|
|
205
|
+
void this.onDetach;
|
|
206
|
+
void this.onClose;
|
|
207
|
+
void this.requestRender;
|
|
208
|
+
void this.requestFocus;
|
|
209
|
+
void this.focusHoldTimer;
|
|
210
|
+
void this.getViewportRows;
|
|
211
|
+
void this.piTui;
|
|
212
|
+
void this.piTheme;
|
|
213
|
+
void this.piKeybindings;
|
|
214
|
+
void this.piEditorFactory;
|
|
215
|
+
void this.stageUiBroker;
|
|
216
|
+
void this.canSubmitPrompt;
|
|
217
|
+
void this.mountingRequestId;
|
|
218
|
+
void this.promptEditor;
|
|
219
|
+
void this.promptEditorPromptId;
|
|
220
|
+
void this.promptEditorSubmitFromEnter;
|
|
221
|
+
void this.promptScrollOffset;
|
|
222
|
+
void this.promptMaxScroll;
|
|
223
|
+
void this.seenNoticeIds;
|
|
224
|
+
void this._unsubscribeStore;
|
|
225
|
+
void this._unsubscribeHandle;
|
|
226
|
+
void this._unregisterStageUiHost;
|
|
227
|
+
return this as unknown as StageChatViewContext;
|
|
1474
228
|
}
|
|
1475
229
|
|
|
1476
|
-
private _hideMountedCustomUi(request: StageCustomUiRequest): void {
|
|
1477
|
-
// Signal any in-flight `_showCustomUi` mount for this request to drop its
|
|
1478
|
-
// component when it finishes — the broker is already tearing it down.
|
|
1479
|
-
if (this.mountingRequestId === request.id) this.mountingRequestId = null;
|
|
1480
|
-
const mounted = this.mountedCustomUi;
|
|
1481
|
-
if (!mounted || mounted.request.id !== request.id) return;
|
|
1482
|
-
this.mountedCustomUi = null;
|
|
1483
|
-
mounted.component.dispose?.();
|
|
1484
|
-
this.chatHost.focused = this.focused;
|
|
1485
|
-
this.chatHost.scrollToBottom();
|
|
1486
|
-
// Returning to the composer after a custom UI resolves (e.g. the readiness
|
|
1487
|
-
// gate -> "stay") must re-assert overlay focus so the composer accepts
|
|
1488
|
-
// input. Guarded for streaming so an answered mid-turn ask_user_question
|
|
1489
|
-
// does not refocus during the agent's continuation (would stall it).
|
|
1490
|
-
if (!this._isStreaming()) this.requestFocus?.();
|
|
1491
|
-
this.requestRender?.();
|
|
1492
|
-
}
|
|
1493
|
-
|
|
1494
|
-
/**
|
|
1495
|
-
* Stop displaying the mounted stage custom UI locally, WITHOUT settling its
|
|
1496
|
-
* broker request. Detaching / closing / disposing the attached chat stops
|
|
1497
|
-
* viewing the stage; it never cancels a pending human-input request. The
|
|
1498
|
-
* request stays pending (the stage remains awaiting_input) so re-attaching
|
|
1499
|
-
* re-displays it. The request is settled only by the user answering (broker
|
|
1500
|
-
* resolve) or the run aborting (its AbortSignal -> broker reject) — those are
|
|
1501
|
-
* the single chokepoints for ending a human-input request.
|
|
1502
|
-
*/
|
|
1503
|
-
private _releaseMountedCustomUi(): void {
|
|
1504
|
-
this.mountingRequestId = null;
|
|
1505
|
-
const mounted = this.mountedCustomUi;
|
|
1506
|
-
if (!mounted) return;
|
|
1507
|
-
this.mountedCustomUi = null;
|
|
1508
|
-
mounted.component.dispose?.();
|
|
1509
|
-
}
|
|
1510
|
-
|
|
1511
|
-
// ---- Test seams ----
|
|
1512
230
|
get _inputBuffer(): string {
|
|
1513
231
|
return this.chatHost.inputText();
|
|
1514
232
|
}
|
|
233
|
+
|
|
1515
234
|
get _transcript(): ReadonlyArray<TranscriptDebugEntry> {
|
|
1516
235
|
return this.chatHost.entries().flatMap((entry) => transcriptDebugEntries(entry));
|
|
1517
236
|
}
|
|
237
|
+
|
|
1518
238
|
get _statusMessage(): string {
|
|
1519
239
|
return this.chatHost.statusText();
|
|
1520
240
|
}
|
|
241
|
+
|
|
1521
242
|
get _isLocalPaused(): boolean {
|
|
1522
243
|
return this.localPaused;
|
|
1523
244
|
}
|
|
245
|
+
|
|
1524
246
|
get _hasAnimationTick(): boolean {
|
|
1525
247
|
return this.chatHost.hasAnimationTick();
|
|
1526
248
|
}
|
|
249
|
+
|
|
1527
250
|
get _bodyScrollFromBottom(): number {
|
|
1528
251
|
return this.chatHost.bodyScrollFromBottom();
|
|
1529
252
|
}
|
|
253
|
+
|
|
1530
254
|
get _lastBodyMaxScroll(): number {
|
|
1531
255
|
return this.chatHost.bodyMaxScroll();
|
|
1532
256
|
}
|
|
1533
257
|
}
|
|
1534
|
-
|
|
1535
|
-
// ---------------------------------------------------------------------------
|
|
1536
|
-
// Module-private helpers
|
|
1537
|
-
// ---------------------------------------------------------------------------
|
|
1538
|
-
|
|
1539
|
-
interface TranscriptDebugEntry {
|
|
1540
|
-
readonly role: string;
|
|
1541
|
-
readonly text: string;
|
|
1542
|
-
readonly toolCallId: string;
|
|
1543
|
-
readonly state: string;
|
|
1544
|
-
readonly output: string;
|
|
1545
|
-
}
|
|
1546
|
-
|
|
1547
|
-
function formatReadOnlyPromptAnswer(value: unknown, kind: PendingPrompt["kind"]): string {
|
|
1548
|
-
if (kind === "confirm") return value === true ? "yes" : "no";
|
|
1549
|
-
if (typeof value === "string") return value.length > 0 ? value : "(empty response)";
|
|
1550
|
-
if (typeof value === "number" || typeof value === "boolean" || value === null) return String(value);
|
|
1551
|
-
try {
|
|
1552
|
-
const encoded = JSON.stringify(value);
|
|
1553
|
-
return encoded ?? String(value);
|
|
1554
|
-
} catch {
|
|
1555
|
-
return String(value);
|
|
1556
|
-
}
|
|
1557
|
-
}
|
|
1558
|
-
|
|
1559
|
-
function transcriptDebugEntries(entry: TranscriptEntry): TranscriptDebugEntry[] {
|
|
1560
|
-
if (isChatMessageEntry(entry) && entry.kind === "assistant") {
|
|
1561
|
-
const entries: TranscriptDebugEntry[] = [];
|
|
1562
|
-
const thinking = extractThinkingText(entry.message.content);
|
|
1563
|
-
const text = extractMessageText(entry.message.content);
|
|
1564
|
-
if (thinking)
|
|
1565
|
-
entries.push({
|
|
1566
|
-
role: "thinking",
|
|
1567
|
-
text: thinking,
|
|
1568
|
-
toolCallId: "",
|
|
1569
|
-
state: "",
|
|
1570
|
-
output: "",
|
|
1571
|
-
});
|
|
1572
|
-
if (text || entries.length === 0)
|
|
1573
|
-
entries.push({ ...entry, text, toolCallId: "", state: "", output: "" });
|
|
1574
|
-
return entries;
|
|
1575
|
-
}
|
|
1576
|
-
return [
|
|
1577
|
-
{
|
|
1578
|
-
...entry,
|
|
1579
|
-
role: entry.role,
|
|
1580
|
-
text: transcriptDebugText(entry),
|
|
1581
|
-
toolCallId: transcriptDebugToolCallId(entry),
|
|
1582
|
-
state: transcriptDebugToolState(entry),
|
|
1583
|
-
output: transcriptDebugToolOutput(entry),
|
|
1584
|
-
},
|
|
1585
|
-
];
|
|
1586
|
-
}
|
|
1587
|
-
|
|
1588
|
-
function transcriptDebugText(entry: TranscriptEntry): string {
|
|
1589
|
-
if ("text" in entry && typeof entry.text === "string") return entry.text;
|
|
1590
|
-
if (isChatMessageEntry(entry)) {
|
|
1591
|
-
switch (entry.kind) {
|
|
1592
|
-
case "assistant":
|
|
1593
|
-
return extractMessageText(entry.message.content);
|
|
1594
|
-
case "tool":
|
|
1595
|
-
return entry.result
|
|
1596
|
-
? extractToolResultText(entry.result)
|
|
1597
|
-
: `${entry.toolName} ${typeof entry.args === "string" ? entry.args : JSON.stringify(entry.args ?? {})}`;
|
|
1598
|
-
case "bashExecution":
|
|
1599
|
-
return entry.message.output || entry.message.command;
|
|
1600
|
-
case "user":
|
|
1601
|
-
case "system":
|
|
1602
|
-
return entry.text;
|
|
1603
|
-
case "custom":
|
|
1604
|
-
return extractMessageText(entry.message.content);
|
|
1605
|
-
case "branchSummary":
|
|
1606
|
-
return entry.message.summary;
|
|
1607
|
-
}
|
|
1608
|
-
}
|
|
1609
|
-
return "";
|
|
1610
|
-
}
|
|
1611
|
-
|
|
1612
|
-
function transcriptDebugToolCallId(entry: TranscriptEntry): string {
|
|
1613
|
-
if (isChatMessageEntry(entry) && entry.kind === "tool")
|
|
1614
|
-
return entry.toolCallId;
|
|
1615
|
-
if ("toolCallId" in entry && typeof entry.toolCallId === "string")
|
|
1616
|
-
return entry.toolCallId;
|
|
1617
|
-
return "";
|
|
1618
|
-
}
|
|
1619
|
-
|
|
1620
|
-
function transcriptDebugToolState(entry: TranscriptEntry): string {
|
|
1621
|
-
if (isChatMessageEntry(entry) && entry.kind === "tool") {
|
|
1622
|
-
if (entry.result?.isError) return "error";
|
|
1623
|
-
return entry.isPartial === false ? "success" : "pending";
|
|
1624
|
-
}
|
|
1625
|
-
if ("state" in entry && typeof entry.state === "string") return entry.state;
|
|
1626
|
-
return "";
|
|
1627
|
-
}
|
|
1628
|
-
|
|
1629
|
-
function transcriptDebugToolOutput(entry: TranscriptEntry): string {
|
|
1630
|
-
if (isChatMessageEntry(entry) && entry.kind === "tool")
|
|
1631
|
-
return entry.result ? extractToolResultText(entry.result) : "";
|
|
1632
|
-
if ("output" in entry && typeof entry.output === "string")
|
|
1633
|
-
return entry.output;
|
|
1634
|
-
return "";
|
|
1635
|
-
}
|
|
1636
|
-
|
|
1637
|
-
function cursorBlock(): string {
|
|
1638
|
-
return "\x1b[7m \x1b[0m";
|
|
1639
|
-
}
|
|
1640
|
-
|
|
1641
|
-
function setComponentFocused(component: Component, focused: boolean): void {
|
|
1642
|
-
const candidate = component as Component & Partial<Focusable>;
|
|
1643
|
-
if ("focused" in candidate) candidate.focused = focused;
|
|
1644
|
-
}
|
|
1645
|
-
|
|
1646
|
-
function setEditorFocused(editor: EditorComponent, focused: boolean): void {
|
|
1647
|
-
setComponentFocused(editor, focused);
|
|
1648
|
-
}
|
|
1649
|
-
|
|
1650
|
-
function setEditorPlaceholder(editor: EditorComponent, placeholder: string | undefined): void {
|
|
1651
|
-
const candidate = editor as EditorComponent & {
|
|
1652
|
-
setPlaceholder?: (value: string | undefined) => void;
|
|
1653
|
-
};
|
|
1654
|
-
candidate.setPlaceholder?.(placeholder);
|
|
1655
|
-
}
|
|
1656
|
-
|
|
1657
|
-
function setEditorBorderColor(
|
|
1658
|
-
editor: EditorComponent,
|
|
1659
|
-
borderColor: (text: string) => string,
|
|
1660
|
-
): void {
|
|
1661
|
-
const candidate = editor as EditorComponent & {
|
|
1662
|
-
borderColor?: (text: string) => string;
|
|
1663
|
-
};
|
|
1664
|
-
if ("borderColor" in candidate) candidate.borderColor = borderColor;
|
|
1665
|
-
}
|
|
1666
|
-
|
|
1667
|
-
function isChatMessageEntry(entry: TranscriptEntry): entry is ChatMessageEntry {
|
|
1668
|
-
return "kind" in entry && entry.role !== "notice";
|
|
1669
|
-
}
|
|
1670
|
-
|
|
1671
|
-
function extractThinkingText(content: unknown): string {
|
|
1672
|
-
if (!Array.isArray(content)) return "";
|
|
1673
|
-
const parts: string[] = [];
|
|
1674
|
-
for (const item of content) {
|
|
1675
|
-
if (item == null || typeof item !== "object") continue;
|
|
1676
|
-
const thinking = (item as { type?: unknown; thinking?: unknown }).thinking;
|
|
1677
|
-
if (
|
|
1678
|
-
(item as { type?: unknown }).type === "thinking" &&
|
|
1679
|
-
typeof thinking === "string"
|
|
1680
|
-
)
|
|
1681
|
-
parts.push(thinking);
|
|
1682
|
-
}
|
|
1683
|
-
return parts.join("\n\n");
|
|
1684
|
-
}
|
|
1685
|
-
|
|
1686
|
-
function extractMessageText(content: unknown): string {
|
|
1687
|
-
if (typeof content === "string") return content;
|
|
1688
|
-
if (!Array.isArray(content)) return "";
|
|
1689
|
-
const parts: string[] = [];
|
|
1690
|
-
for (const item of content) {
|
|
1691
|
-
if (item == null) continue;
|
|
1692
|
-
if (typeof item === "string") {
|
|
1693
|
-
parts.push(item);
|
|
1694
|
-
continue;
|
|
1695
|
-
}
|
|
1696
|
-
const obj = item as { type?: unknown; text?: unknown };
|
|
1697
|
-
if (typeof obj.text === "string") parts.push(obj.text);
|
|
1698
|
-
else if (obj.type === "text" && typeof obj.text === "string")
|
|
1699
|
-
parts.push(obj.text);
|
|
1700
|
-
}
|
|
1701
|
-
return parts.join("");
|
|
1702
|
-
}
|
|
1703
|
-
|
|
1704
|
-
function extractToolResultText(result: unknown): string {
|
|
1705
|
-
if (typeof result === "string") return result;
|
|
1706
|
-
if (result == null || typeof result !== "object") return "";
|
|
1707
|
-
const content = (result as { content?: unknown }).content;
|
|
1708
|
-
return extractMessageText(content);
|
|
1709
|
-
}
|
|
1710
|
-
|
|
1711
|
-
function noticeSummary(n: StageNotice): string {
|
|
1712
|
-
const base = `~ ${n.kind} → ${n.to}`;
|
|
1713
|
-
return n.from ? `${base} (was ${n.from})` : base;
|
|
1714
|
-
}
|
|
1715
|
-
|
|
1716
|
-
function stageNoticeCard(entry: NoticeEntry): {
|
|
1717
|
-
title: string;
|
|
1718
|
-
glyph: string;
|
|
1719
|
-
headline: string;
|
|
1720
|
-
tone: WorkflowNoticeTone;
|
|
1721
|
-
fields: Array<{ label: string; value: string | undefined; tone?: WorkflowNoticeTone | "text" | "muted" }>;
|
|
1722
|
-
} {
|
|
1723
|
-
switch (entry.kind) {
|
|
1724
|
-
case "abort":
|
|
1725
|
-
return {
|
|
1726
|
-
title: "STAGE ABORTED",
|
|
1727
|
-
glyph: "✗",
|
|
1728
|
-
headline: "Stage received an abort notice",
|
|
1729
|
-
tone: "error",
|
|
1730
|
-
fields: stageNoticeFields(entry, "error"),
|
|
1731
|
-
};
|
|
1732
|
-
case "compaction":
|
|
1733
|
-
return {
|
|
1734
|
-
title: "STAGE COMPACTION",
|
|
1735
|
-
glyph: "✓",
|
|
1736
|
-
headline: "Stage context was compacted",
|
|
1737
|
-
tone: "success",
|
|
1738
|
-
fields: stageNoticeFields(entry, "muted"),
|
|
1739
|
-
};
|
|
1740
|
-
case "model":
|
|
1741
|
-
return {
|
|
1742
|
-
title: "STAGE MODEL",
|
|
1743
|
-
glyph: "→",
|
|
1744
|
-
headline: "Stage model changed",
|
|
1745
|
-
tone: "info",
|
|
1746
|
-
fields: stageNoticeFields(entry),
|
|
1747
|
-
};
|
|
1748
|
-
case "thinking":
|
|
1749
|
-
return {
|
|
1750
|
-
title: "STAGE THINKING",
|
|
1751
|
-
glyph: "→",
|
|
1752
|
-
headline: "Stage thinking level changed",
|
|
1753
|
-
tone: "mauve",
|
|
1754
|
-
fields: stageNoticeFields(entry),
|
|
1755
|
-
};
|
|
1756
|
-
case "tree":
|
|
1757
|
-
return {
|
|
1758
|
-
title: "STAGE TREE",
|
|
1759
|
-
glyph: "◆",
|
|
1760
|
-
headline: "Stage branch tree changed",
|
|
1761
|
-
tone: "info",
|
|
1762
|
-
fields: stageNoticeFields(entry, "muted"),
|
|
1763
|
-
};
|
|
1764
|
-
case "mcp":
|
|
1765
|
-
default:
|
|
1766
|
-
return {
|
|
1767
|
-
title: "STAGE NOTICE",
|
|
1768
|
-
glyph: "◆",
|
|
1769
|
-
headline: "Workflow stage notice",
|
|
1770
|
-
tone: "info",
|
|
1771
|
-
fields: stageNoticeFields(entry, "muted"),
|
|
1772
|
-
};
|
|
1773
|
-
}
|
|
1774
|
-
}
|
|
1775
|
-
|
|
1776
|
-
function stageNoticeFields(
|
|
1777
|
-
entry: NoticeEntry,
|
|
1778
|
-
valueTone: WorkflowNoticeTone | "text" | "muted" = "text",
|
|
1779
|
-
): Array<{ label: string; value: string | undefined; tone?: WorkflowNoticeTone | "text" | "muted" }> {
|
|
1780
|
-
return [
|
|
1781
|
-
{ label: "kind", value: entry.kind, tone: "muted" },
|
|
1782
|
-
{ label: "value", value: entry.value, tone: valueTone },
|
|
1783
|
-
{ label: "from", value: entry.from, tone: "muted" },
|
|
1784
|
-
{ label: "meta", value: entry.meta, tone: "muted" },
|
|
1785
|
-
];
|
|
1786
|
-
}
|
|
1787
|
-
|
|
1788
|
-
function shortenId(id: string): string {
|
|
1789
|
-
return id.length > 10 ? id.slice(0, 8) : id;
|
|
1790
|
-
}
|
|
1791
|
-
|
|
1792
|
-
function bgFn(hex: string): (text: string) => string {
|
|
1793
|
-
const open = hexBg(hex);
|
|
1794
|
-
return (text: string) => open + text + RESET;
|
|
1795
|
-
}
|
|
1796
|
-
|
|
1797
|
-
function editorThemeFromGraphTheme(t: GraphTheme): EditorTheme {
|
|
1798
|
-
const selected = (text: string): string =>
|
|
1799
|
-
hexBg(t.backgroundPanel) + hexToAnsi(t.text) + text + RESET;
|
|
1800
|
-
const normal = (text: string): string => hexToAnsi(t.text) + text + RESET;
|
|
1801
|
-
return {
|
|
1802
|
-
borderColor: (text: string) => hexToAnsi(t.border) + text + RESET,
|
|
1803
|
-
selectList: {
|
|
1804
|
-
selectedPrefix: selected,
|
|
1805
|
-
selectedText: selected,
|
|
1806
|
-
description: (text: string) => hexToAnsi(t.dim) + text + RESET,
|
|
1807
|
-
scrollInfo: (text: string) => hexToAnsi(t.dim) + text + RESET,
|
|
1808
|
-
noMatch: (text: string) => hexToAnsi(t.warning) + text + RESET,
|
|
1809
|
-
normal,
|
|
1810
|
-
},
|
|
1811
|
-
} as EditorTheme;
|
|
1812
|
-
}
|
|
1813
|
-
|
|
1814
|
-
function takeRows(lines: readonly string[], rows: number): string[] {
|
|
1815
|
-
return lines.slice(0, rows);
|
|
1816
|
-
}
|
|
1817
|
-
|
|
1818
|
-
function widgetHintTargetLineIndex(lines: readonly string[]): number {
|
|
1819
|
-
for (let index = lines.length - 1; index >= 0; index -= 1) {
|
|
1820
|
-
if (!isWidgetBottomBorderLine(lines[index] ?? "")) return index;
|
|
1821
|
-
}
|
|
1822
|
-
return Math.max(0, lines.length - 1);
|
|
1823
|
-
}
|
|
1824
|
-
|
|
1825
|
-
function isWidgetBottomBorderLine(line: string): boolean {
|
|
1826
|
-
const plain = stripAnsi(line).trim();
|
|
1827
|
-
const chars = Array.from(plain);
|
|
1828
|
-
if (chars.length < 2) return false;
|
|
1829
|
-
const first = chars[0] ?? "";
|
|
1830
|
-
const last = chars.at(-1) ?? "";
|
|
1831
|
-
if (!"╰└+".includes(first) || !"╯┘+".includes(last)) return false;
|
|
1832
|
-
return chars.slice(1, -1).every((char) => "─═- ".includes(char));
|
|
1833
|
-
}
|
|
1834
|
-
|
|
1835
|
-
function trailingWidgetBorderChar(line: string): string {
|
|
1836
|
-
const plain = stripAnsi(line).trimEnd();
|
|
1837
|
-
const last = Array.from(plain).at(-1) ?? "";
|
|
1838
|
-
return "╯┘┤┴│|+".includes(last) ? last : "";
|
|
1839
|
-
}
|
|
1840
|
-
|
|
1841
|
-
interface PaintOpts {
|
|
1842
|
-
bold?: boolean;
|
|
1843
|
-
italic?: boolean;
|
|
1844
|
-
bg?: string;
|
|
1845
|
-
}
|
|
1846
|
-
|
|
1847
|
-
function paint(text: string, fg: string, opts: PaintOpts = {}): string {
|
|
1848
|
-
if (!text) return "";
|
|
1849
|
-
let out = hexToAnsi(fg);
|
|
1850
|
-
if (opts.bold) out += BOLD;
|
|
1851
|
-
if (opts.italic) out += ITALIC;
|
|
1852
|
-
if (opts.bg) out = hexBg(opts.bg) + out;
|
|
1853
|
-
return out + text + RESET;
|
|
1854
|
-
}
|
|
1855
|
-
|
|
1856
|
-
function renderHintsForPrompt(kind: PendingPrompt["kind"], theme: GraphTheme): string {
|
|
1857
|
-
if (kind === "input" || kind === "editor") {
|
|
1858
|
-
return `${paint("enter", theme.textMuted, { bold: true })} Submit · ${paint("ctrl+c", theme.textMuted, { bold: true })} Skip`;
|
|
1859
|
-
}
|
|
1860
|
-
if (kind === "custom") {
|
|
1861
|
-
return `${paint("ctrl+d", theme.textMuted, { bold: true })} Graph · ${paint("ctrl+c", theme.textMuted, { bold: true })} Close`;
|
|
1862
|
-
}
|
|
1863
|
-
return `${paint("enter", theme.textMuted, { bold: true })} Select · ${paint("ctrl+c", theme.textMuted, { bold: true })} Skip`;
|
|
1864
|
-
}
|
|
1865
|
-
|
|
1866
|
-
/**
|
|
1867
|
-
* Foreground styling for text that will be wrapped by a `Box` background.
|
|
1868
|
-
* A normal `RESET` would also clear the parent background, so close only the
|
|
1869
|
-
* inline foreground/weight/italic state and let `bgFn()` reset the row at end.
|
|
1870
|
-
*/
|
|
1871
|
-
function paintOnFill(text: string, fg: string, opts: PaintOpts = {}): string {
|
|
1872
|
-
if (!text) return "";
|
|
1873
|
-
let out = hexToAnsi(fg);
|
|
1874
|
-
if (opts.bold) out += BOLD;
|
|
1875
|
-
if (opts.italic) out += ITALIC;
|
|
1876
|
-
let close = FG_RESET;
|
|
1877
|
-
if (opts.bold) close += WEIGHT_RESET;
|
|
1878
|
-
if (opts.italic) close += ITALIC_RESET;
|
|
1879
|
-
return out + text + close;
|
|
1880
|
-
}
|
|
1881
|
-
|
|
1882
|
-
function stripAnsi(s: string): string {
|
|
1883
|
-
return s.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, "");
|
|
1884
|
-
}
|
|
1885
|
-
|
|
1886
|
-
/**
|
|
1887
|
-
* Approximate a tinted background by mixing the base canvas with a saturated
|
|
1888
|
-
* hue at low alpha. Used for status pills and tool-bar tints. Returns a hex
|
|
1889
|
-
* colour the renderer can feed to `hexBg`.
|
|
1890
|
-
*/
|
|
1891
|
-
function blendBg(baseHex: string, tintHex: string, alpha: number): string {
|
|
1892
|
-
return lerpColor(baseHex, tintHex, Math.max(0, Math.min(1, alpha)));
|
|
1893
|
-
}
|