@bastani/atomic 0.9.2 → 0.9.3-alpha.2
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 +66 -0
- package/README.md +2 -2
- package/dist/builtin/cursor/CHANGELOG.md +15 -0
- package/dist/builtin/cursor/README.md +2 -1
- package/dist/builtin/cursor/package.json +2 -2
- package/dist/builtin/cursor/src/cursor-models-raw.json +2 -9
- package/dist/builtin/cursor/src/model-mapper.ts +14 -3
- package/dist/builtin/cursor/src/proto/protobuf-codec-base64.ts +22 -0
- package/dist/builtin/cursor/src/proto/protobuf-codec-request.ts +53 -13
- package/dist/builtin/cursor/src/proto/protobuf-codec-wire.ts +24 -7
- package/dist/builtin/cursor/src/proto/protobuf-codec.ts +3 -2
- package/dist/builtin/cursor/src/stream.ts +5 -11
- package/dist/builtin/cursor/src/transport-types.ts +3 -0
- package/dist/builtin/cursor/src/transport.ts +1 -0
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/mcp/CHANGELOG.md +6 -0
- package/dist/builtin/mcp/direct-tools.ts +4 -2
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/mcp/proxy-call.ts +3 -1
- package/dist/builtin/mcp/utils.ts +18 -7
- package/dist/builtin/subagents/CHANGELOG.md +20 -0
- package/dist/builtin/subagents/README.md +6 -6
- package/dist/builtin/subagents/agents/code-simplifier.md +7 -6
- package/dist/builtin/subagents/agents/codebase-analyzer.md +5 -4
- package/dist/builtin/subagents/agents/codebase-locator.md +3 -3
- package/dist/builtin/subagents/agents/codebase-online-researcher.md +10 -10
- package/dist/builtin/subagents/agents/codebase-pattern-finder.md +4 -4
- package/dist/builtin/subagents/agents/codebase-research-analyzer.md +3 -3
- package/dist/builtin/subagents/agents/codebase-research-locator.md +4 -4
- package/dist/builtin/subagents/agents/debugger.md +5 -5
- package/dist/builtin/subagents/agents/worker.md +56 -0
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/subagents/skills/subagent/SKILL.md +11 -11
- package/dist/builtin/subagents/src/agents/agent-loaders.ts +3 -5
- package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +3 -3
- package/dist/builtin/subagents/src/extension/fanout-child.ts +1 -0
- package/dist/builtin/subagents/src/extension/index.ts +6 -3
- package/dist/builtin/subagents/src/extension/schemas.ts +2 -7
- package/dist/builtin/subagents/src/intercom/result-intercom.ts +4 -3
- package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +1 -4
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +15 -1
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +35 -1
- package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/nested-render.ts +2 -2
- package/dist/builtin/subagents/src/runs/shared/pi-args.ts +2 -1
- package/dist/builtin/subagents/src/runs/shared/subagent-prompt-runtime.ts +4 -2
- package/dist/builtin/subagents/src/shared/types-async.ts +1 -0
- package/dist/builtin/subagents/src/shared/types-depth.ts +5 -5
- package/dist/builtin/subagents/src/shared/types-runtime.ts +2 -1
- package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +27 -5
- package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -2
- package/dist/builtin/subagents/src/tui/render-layout.ts +27 -4
- package/dist/builtin/subagents/src/tui/render-result-animation.ts +22 -31
- package/dist/builtin/subagents/src/tui/render-result-compact.ts +6 -6
- package/dist/builtin/subagents/src/tui/render-result.ts +20 -19
- package/dist/builtin/subagents/src/tui/render-status-progress.ts +3 -3
- package/dist/builtin/subagents/src/tui/render-widget.ts +46 -7
- package/dist/builtin/subagents/src/tui/render.ts +2 -2
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/CHANGELOG.md +56 -0
- package/dist/builtin/workflows/README.md +3 -3
- package/dist/builtin/workflows/builtin/goal-artifacts.ts +11 -6
- package/dist/builtin/workflows/builtin/goal-ledger.ts +33 -1
- package/dist/builtin/workflows/builtin/goal-prompts.ts +23 -28
- package/dist/builtin/workflows/builtin/goal-reducer.ts +2 -2
- package/dist/builtin/workflows/builtin/goal-reports.ts +2 -5
- package/dist/builtin/workflows/builtin/goal-review.ts +1 -1
- package/dist/builtin/workflows/builtin/goal-runner.ts +10 -17
- package/dist/builtin/workflows/builtin/open-claude-design-feedback.ts +3 -3
- package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +1 -3
- package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +1 -1
- package/dist/builtin/workflows/builtin/ralph-core.ts +7 -17
- package/dist/builtin/workflows/builtin/ralph-runner.ts +11 -18
- package/dist/builtin/workflows/builtin/shared-prompts.ts +1 -1
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/builtin/workflows/src/authoring.d.ts +1 -1
- package/dist/builtin/workflows/src/durable/backend.ts +343 -0
- package/dist/builtin/workflows/src/durable/child-primitive.ts +79 -0
- package/dist/builtin/workflows/src/durable/dbos-backend.ts +421 -0
- package/dist/builtin/workflows/src/durable/dbos-envelope.ts +171 -0
- package/dist/builtin/workflows/src/durable/factory.ts +96 -0
- package/dist/builtin/workflows/src/durable/file-backend.ts +433 -0
- package/dist/builtin/workflows/src/durable/index.ts +73 -0
- package/dist/builtin/workflows/src/durable/resume-catalog.ts +217 -0
- package/dist/builtin/workflows/src/durable/resume-runtime.ts +299 -0
- package/dist/builtin/workflows/src/durable/scoped-backend.ts +171 -0
- package/dist/builtin/workflows/src/durable/stage-primitive.ts +284 -0
- package/dist/builtin/workflows/src/durable/tool-primitive.ts +180 -0
- package/dist/builtin/workflows/src/durable/types.ts +168 -0
- package/dist/builtin/workflows/src/durable/ui-primitive.ts +96 -0
- package/dist/builtin/workflows/src/engine/options.ts +3 -0
- package/dist/builtin/workflows/src/engine/primitives/parallel.ts +2 -2
- package/dist/builtin/workflows/src/engine/primitives/task.ts +4 -4
- package/dist/builtin/workflows/src/engine/primitives/ui.ts +22 -8
- package/dist/builtin/workflows/src/engine/primitives/workflow.ts +8 -0
- package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +69 -0
- package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +31 -0
- package/dist/builtin/workflows/src/engine/run.ts +148 -6
- package/dist/builtin/workflows/src/engine/runtime.ts +8 -2
- package/dist/builtin/workflows/src/extension/config-loader.ts +35 -15
- package/dist/builtin/workflows/src/extension/discovery.ts +20 -8
- package/dist/builtin/workflows/src/extension/extension-factory.ts +6 -12
- package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +5 -1
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +4 -2
- package/dist/builtin/workflows/src/extension/runtime.ts +48 -9
- package/dist/builtin/workflows/src/extension/wiring.ts +1 -1
- package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +143 -4
- package/dist/builtin/workflows/src/runs/background/quit.ts +61 -0
- package/dist/builtin/workflows/src/runs/background/status.ts +1 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +5 -5
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +74 -33
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-context.ts +20 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +8 -7
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +1 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +1 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +19 -2
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +4 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +10 -10
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +5 -1
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-send-user-message.ts +25 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +3 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +16 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +20 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +23 -1
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +30 -1
- package/dist/builtin/workflows/src/shared/store-public-types.ts +6 -2
- package/dist/builtin/workflows/src/shared/store-run-methods.ts +12 -6
- package/dist/builtin/workflows/src/shared/types.ts +55 -0
- package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +11 -10
- package/dist/builtin/workflows/src/tui/graph-view-constants.ts +1 -1
- package/dist/builtin/workflows/src/tui/graph-view-graph-render.ts +41 -0
- package/dist/builtin/workflows/src/tui/graph-view-input.ts +82 -24
- package/dist/builtin/workflows/src/tui/graph-view-render.ts +7 -0
- package/dist/builtin/workflows/src/tui/graph-view-state.ts +22 -2
- package/dist/builtin/workflows/src/tui/graph-view-types.ts +4 -5
- package/dist/builtin/workflows/src/tui/overlay-adapter.ts +9 -11
- package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +9 -3
- package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +11 -2
- package/dist/builtin/workflows/src/tui/stage-chat-view-live-events.ts +35 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +51 -17
- package/dist/builtin/workflows/src/tui/stage-chat-view-status.ts +36 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +5 -1
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +3 -1
- package/dist/builtin/workflows/src/tui/status-list.ts +14 -2
- package/dist/builtin/workflows/src/tui/widget.ts +23 -8
- package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +5 -4
- package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +8 -8
- package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +151 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +9 -9
- package/dist/cli/args.js.map +1 -1
- package/dist/config-self-update.d.ts.map +1 -1
- package/dist/config-self-update.js +3 -4
- package/dist/config-self-update.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -5
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-bash.d.ts +1 -0
- package/dist/core/agent-session-bash.d.ts.map +1 -1
- package/dist/core/agent-session-bash.js +1 -0
- package/dist/core/agent-session-bash.js.map +1 -1
- package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
- package/dist/core/agent-session-tool-registry.js +23 -0
- package/dist/core/agent-session-tool-registry.js.map +1 -1
- package/dist/core/bash-executor.d.ts +2 -0
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +1 -0
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +29 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +36 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/context-compaction-metrics.d.ts +14 -2
- package/dist/core/compaction/context-compaction-metrics.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction-metrics.js +50 -1
- package/dist/core/compaction/context-compaction-metrics.js.map +1 -1
- package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction-prompt.js +2 -0
- package/dist/core/compaction/context-compaction-prompt.js.map +1 -1
- package/dist/core/compaction/context-compaction-runner.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction-runner.js +1 -1
- package/dist/core/compaction/context-compaction-runner.js.map +1 -1
- package/dist/core/compaction/context-deletion-application.d.ts.map +1 -1
- package/dist/core/compaction/context-deletion-application.js +5 -5
- package/dist/core/compaction/context-deletion-application.js.map +1 -1
- package/dist/core/compaction/context-deletion-targets.d.ts +2 -0
- package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -1
- package/dist/core/compaction/context-deletion-targets.js +23 -3
- package/dist/core/compaction/context-deletion-targets.js.map +1 -1
- package/dist/core/compaction/context-deletion-tool-definitions.d.ts +6 -0
- package/dist/core/compaction/context-deletion-tool-definitions.d.ts.map +1 -1
- package/dist/core/compaction/context-deletion-tool-definitions.js.map +1 -1
- package/dist/core/compaction/context-deletion-tools.d.ts.map +1 -1
- package/dist/core/compaction/context-deletion-tools.js +18 -10
- package/dist/core/compaction/context-deletion-tools.js.map +1 -1
- package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -1
- package/dist/core/compaction/context-transcript-analysis.js +2 -4
- package/dist/core/compaction/context-transcript-analysis.js.map +1 -1
- package/dist/core/copilot-gemini-tool-arguments.d.ts.map +1 -1
- package/dist/core/copilot-gemini-tool-arguments.js +2 -60
- package/dist/core/copilot-gemini-tool-arguments.js.map +1 -1
- package/dist/core/extensions/context-types.d.ts +2 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/index.d.ts +2 -2
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +57 -32
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/extensions/runner-context.d.ts.map +1 -1
- package/dist/core/extensions/runner-context.js +11 -0
- package/dist/core/extensions/runner-context.js.map +1 -1
- package/dist/core/extensions/tool-events.d.ts +13 -13
- package/dist/core/extensions/tool-events.d.ts.map +1 -1
- package/dist/core/extensions/tool-events.js +3 -3
- package/dist/core/extensions/tool-events.js.map +1 -1
- package/dist/core/extensions/types.d.ts +1 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/flattened-tool-arguments.d.ts +18 -0
- package/dist/core/flattened-tool-arguments.d.ts.map +1 -1
- package/dist/core/flattened-tool-arguments.js +104 -0
- package/dist/core/flattened-tool-arguments.js.map +1 -1
- package/dist/core/messages.d.ts +1 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +46 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/sdk-exports.d.ts +1 -1
- package/dist/core/sdk-exports.d.ts.map +1 -1
- package/dist/core/sdk-exports.js +1 -1
- package/dist/core/sdk-exports.js.map +1 -1
- package/dist/core/sdk-types.d.ts +2 -2
- package/dist/core/sdk-types.d.ts.map +1 -1
- package/dist/core/sdk-types.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +12 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-core.d.ts +15 -7
- package/dist/core/session-manager-core.d.ts.map +1 -1
- package/dist/core/session-manager-core.js +20 -9
- package/dist/core/session-manager-core.js.map +1 -1
- package/dist/core/session-manager-entries.d.ts +2 -2
- package/dist/core/session-manager-entries.d.ts.map +1 -1
- package/dist/core/session-manager-entries.js +9 -3
- package/dist/core/session-manager-entries.js.map +1 -1
- package/dist/core/session-manager-history.d.ts.map +1 -1
- package/dist/core/session-manager-history.js +2 -1
- package/dist/core/session-manager-history.js.map +1 -1
- package/dist/core/session-manager-list.d.ts +3 -3
- package/dist/core/session-manager-list.d.ts.map +1 -1
- package/dist/core/session-manager-list.js +27 -8
- package/dist/core/session-manager-list.js.map +1 -1
- package/dist/core/session-manager-storage.d.ts +3 -1
- package/dist/core/session-manager-storage.d.ts.map +1 -1
- package/dist/core/session-manager-storage.js +55 -12
- package/dist/core/session-manager-storage.js.map +1 -1
- package/dist/core/session-manager-tool-dependencies.d.ts +10 -0
- package/dist/core/session-manager-tool-dependencies.d.ts.map +1 -0
- package/dist/core/session-manager-tool-dependencies.js +133 -0
- package/dist/core/session-manager-tool-dependencies.js.map +1 -0
- package/dist/core/session-manager-types.d.ts +22 -0
- package/dist/core/session-manager-types.d.ts.map +1 -1
- package/dist/core/session-manager-types.js.map +1 -1
- package/dist/core/session-manager.d.ts +2 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +1 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts +4 -0
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-basic-accessors.js +18 -0
- package/dist/core/settings-manager-basic-accessors.js.map +1 -1
- package/dist/core/settings-manager-resource-accessors.d.ts +4 -0
- package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-resource-accessors.js +15 -0
- package/dist/core/settings-manager-resource-accessors.js.map +1 -1
- package/dist/core/settings-types.d.ts +11 -0
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/system-prompt.d.ts +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +3 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/artifact-protocol.d.ts +11 -0
- package/dist/core/tools/artifact-protocol.d.ts.map +1 -0
- package/dist/core/tools/artifact-protocol.js +76 -0
- package/dist/core/tools/artifact-protocol.js.map +1 -0
- package/dist/core/tools/artifacts.d.ts +18 -0
- package/dist/core/tools/artifacts.d.ts.map +1 -0
- package/dist/core/tools/artifacts.js +90 -0
- package/dist/core/tools/artifacts.js.map +1 -0
- package/dist/core/tools/bash-async-jobs.d.ts +20 -0
- package/dist/core/tools/bash-async-jobs.d.ts.map +1 -0
- package/dist/core/tools/bash-async-jobs.js +59 -0
- package/dist/core/tools/bash-async-jobs.js.map +1 -0
- package/dist/core/tools/bash-async-output.d.ts +10 -0
- package/dist/core/tools/bash-async-output.d.ts.map +1 -0
- package/dist/core/tools/bash-async-output.js +80 -0
- package/dist/core/tools/bash-async-output.js.map +1 -0
- package/dist/core/tools/bash-interceptor.d.ts +10 -0
- package/dist/core/tools/bash-interceptor.d.ts.map +1 -0
- package/dist/core/tools/bash-interceptor.js +39 -0
- package/dist/core/tools/bash-interceptor.js.map +1 -0
- package/dist/core/tools/bash-leading-cd.d.ts +7 -0
- package/dist/core/tools/bash-leading-cd.d.ts.map +1 -0
- package/dist/core/tools/bash-leading-cd.js +59 -0
- package/dist/core/tools/bash-leading-cd.js.map +1 -0
- package/dist/core/tools/bash-pty-native.d.ts +14 -0
- package/dist/core/tools/bash-pty-native.d.ts.map +1 -0
- package/dist/core/tools/bash-pty-native.js +71 -0
- package/dist/core/tools/bash-pty-native.js.map +1 -0
- package/dist/core/tools/bash.d.ts +28 -17
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +152 -35
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/block-resolver.d.ts +16 -0
- package/dist/core/tools/block-resolver.d.ts.map +1 -0
- package/dist/core/tools/block-resolver.js +74 -0
- package/dist/core/tools/block-resolver.js.map +1 -0
- package/dist/core/tools/conflict-registry.d.ts +16 -0
- package/dist/core/tools/conflict-registry.d.ts.map +1 -0
- package/dist/core/tools/conflict-registry.js +44 -0
- package/dist/core/tools/conflict-registry.js.map +1 -0
- package/dist/core/tools/directory-tree.d.ts +13 -0
- package/dist/core/tools/directory-tree.d.ts.map +1 -0
- package/dist/core/tools/directory-tree.js +81 -0
- package/dist/core/tools/directory-tree.js.map +1 -0
- package/dist/core/tools/edit.d.ts +4 -29
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +136 -228
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/fetch-url.d.ts +74 -0
- package/dist/core/tools/fetch-url.d.ts.map +1 -0
- package/dist/core/tools/fetch-url.js +518 -0
- package/dist/core/tools/fetch-url.js.map +1 -0
- package/dist/core/tools/find.d.ts +27 -9
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +400 -176
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/glob-path-utils.d.ts +8 -0
- package/dist/core/tools/glob-path-utils.d.ts.map +1 -0
- package/dist/core/tools/glob-path-utils.js +26 -0
- package/dist/core/tools/glob-path-utils.js.map +1 -0
- package/dist/core/tools/grep.d.ts +12 -0
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +141 -17
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/hashline-engine/apply.d.ts +11 -0
- package/dist/core/tools/hashline-engine/apply.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/apply.js +752 -0
- package/dist/core/tools/hashline-engine/apply.js.map +1 -0
- package/dist/core/tools/hashline-engine/block.d.ts +40 -0
- package/dist/core/tools/hashline-engine/block.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/block.js +117 -0
- package/dist/core/tools/hashline-engine/block.js.map +1 -0
- package/dist/core/tools/hashline-engine/diff-preview.d.ts +15 -0
- package/dist/core/tools/hashline-engine/diff-preview.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/diff-preview.js +98 -0
- package/dist/core/tools/hashline-engine/diff-preview.js.map +1 -0
- package/dist/core/tools/hashline-engine/format.d.ts +71 -0
- package/dist/core/tools/hashline-engine/format.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/format.js +178 -0
- package/dist/core/tools/hashline-engine/format.js.map +1 -0
- package/dist/core/tools/hashline-engine/fs.d.ts +81 -0
- package/dist/core/tools/hashline-engine/fs.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/fs.js +143 -0
- package/dist/core/tools/hashline-engine/fs.js.map +1 -0
- package/dist/core/tools/hashline-engine/index.d.ts +18 -0
- package/dist/core/tools/hashline-engine/index.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/index.js +20 -0
- package/dist/core/tools/hashline-engine/index.js.map +1 -0
- package/dist/core/tools/hashline-engine/input.d.ts +101 -0
- package/dist/core/tools/hashline-engine/input.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/input.js +398 -0
- package/dist/core/tools/hashline-engine/input.js.map +1 -0
- package/dist/core/tools/hashline-engine/messages.d.ts +99 -0
- package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/messages.js +144 -0
- package/dist/core/tools/hashline-engine/messages.js.map +1 -0
- package/dist/core/tools/hashline-engine/mismatch.d.ts +45 -0
- package/dist/core/tools/hashline-engine/mismatch.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/mismatch.js +90 -0
- package/dist/core/tools/hashline-engine/mismatch.js.map +1 -0
- package/dist/core/tools/hashline-engine/normalize.d.ts +21 -0
- package/dist/core/tools/hashline-engine/normalize.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/normalize.js +33 -0
- package/dist/core/tools/hashline-engine/normalize.js.map +1 -0
- package/dist/core/tools/hashline-engine/parser.d.ts +24 -0
- package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/parser.js +381 -0
- package/dist/core/tools/hashline-engine/parser.js.map +1 -0
- package/dist/core/tools/hashline-engine/patcher.d.ts +118 -0
- package/dist/core/tools/hashline-engine/patcher.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/patcher.js +341 -0
- package/dist/core/tools/hashline-engine/patcher.js.map +1 -0
- package/dist/core/tools/hashline-engine/prefixes.d.ts +43 -0
- package/dist/core/tools/hashline-engine/prefixes.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/prefixes.js +135 -0
- package/dist/core/tools/hashline-engine/prefixes.js.map +1 -0
- package/dist/core/tools/hashline-engine/recovery.d.ts +41 -0
- package/dist/core/tools/hashline-engine/recovery.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/recovery.js +168 -0
- package/dist/core/tools/hashline-engine/recovery.js.map +1 -0
- package/dist/core/tools/hashline-engine/snapshots.d.ts +65 -0
- package/dist/core/tools/hashline-engine/snapshots.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/snapshots.js +108 -0
- package/dist/core/tools/hashline-engine/snapshots.js.map +1 -0
- package/dist/core/tools/hashline-engine/stream.d.ts +3 -0
- package/dist/core/tools/hashline-engine/stream.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/stream.js +111 -0
- package/dist/core/tools/hashline-engine/stream.js.map +1 -0
- package/dist/core/tools/hashline-engine/tokenizer.d.ts +69 -0
- package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/tokenizer.js +430 -0
- package/dist/core/tools/hashline-engine/tokenizer.js.map +1 -0
- package/dist/core/tools/hashline-engine/types.d.ts +166 -0
- package/dist/core/tools/hashline-engine/types.d.ts.map +1 -0
- package/dist/core/tools/hashline-engine/types.js +9 -0
- package/dist/core/tools/hashline-engine/types.js.map +1 -0
- package/dist/core/tools/hashline.d.ts +29 -0
- package/dist/core/tools/hashline.d.ts.map +1 -0
- package/dist/core/tools/hashline.js +110 -0
- package/dist/core/tools/hashline.js.map +1 -0
- package/dist/core/tools/index.d.ts +6 -4
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +52 -35
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/notebook.d.ts +38 -0
- package/dist/core/tools/notebook.d.ts.map +1 -0
- package/dist/core/tools/notebook.js +125 -0
- package/dist/core/tools/notebook.js.map +1 -0
- package/dist/core/tools/read-document-extract.d.ts +9 -0
- package/dist/core/tools/read-document-extract.d.ts.map +1 -0
- package/dist/core/tools/read-document-extract.js +212 -0
- package/dist/core/tools/read-document-extract.js.map +1 -0
- package/dist/core/tools/read-selectors.d.ts +24 -0
- package/dist/core/tools/read-selectors.d.ts.map +1 -0
- package/dist/core/tools/read-selectors.js +277 -0
- package/dist/core/tools/read-selectors.js.map +1 -0
- package/dist/core/tools/read-url.d.ts +37 -0
- package/dist/core/tools/read-url.d.ts.map +1 -0
- package/dist/core/tools/read-url.js +39 -0
- package/dist/core/tools/read-url.js.map +1 -0
- package/dist/core/tools/read.d.ts +11 -11
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +224 -94
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/resource-selectors.d.ts +44 -0
- package/dist/core/tools/resource-selectors.d.ts.map +1 -0
- package/dist/core/tools/resource-selectors.js +808 -0
- package/dist/core/tools/resource-selectors.js.map +1 -0
- package/dist/core/tools/search-details.d.ts +26 -0
- package/dist/core/tools/search-details.d.ts.map +1 -0
- package/dist/core/tools/search-details.js +24 -0
- package/dist/core/tools/search-details.js.map +1 -0
- package/dist/core/tools/search-line-ranges.d.ts +11 -0
- package/dist/core/tools/search-line-ranges.d.ts.map +1 -0
- package/dist/core/tools/search-line-ranges.js +65 -0
- package/dist/core/tools/search-line-ranges.js.map +1 -0
- package/dist/core/tools/search-native.d.ts +97 -0
- package/dist/core/tools/search-native.d.ts.map +1 -0
- package/dist/core/tools/search-native.js +27 -0
- package/dist/core/tools/search-native.js.map +1 -0
- package/dist/core/tools/search.d.ts +24 -0
- package/dist/core/tools/search.d.ts.map +1 -0
- package/dist/core/tools/search.js +573 -0
- package/dist/core/tools/search.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +4 -4
- package/dist/core/tools/truncate.d.ts.map +1 -1
- package/dist/core/tools/truncate.js +3 -3
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/tools/url-ip-guards.d.ts +4 -0
- package/dist/core/tools/url-ip-guards.d.ts.map +1 -0
- package/dist/core/tools/url-ip-guards.js +126 -0
- package/dist/core/tools/url-ip-guards.js.map +1 -0
- package/dist/core/tools/write.d.ts +12 -2
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +166 -14
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +2 -3
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/index-extensions.d.ts +2 -2
- package/dist/index-extensions.d.ts.map +1 -1
- package/dist/index-extensions.js +1 -1
- package/dist/index-extensions.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-runtime.d.ts +1 -0
- package/dist/modes/interactive/components/chat-session-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-runtime.js +12 -0
- package/dist/modes/interactive/components/chat-session-host-runtime.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.d.ts +4 -0
- package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.d.ts.map +1 -0
- package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.js +131 -0
- package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.js.map +1 -0
- package/dist/modes/interactive/components/chat-session-host.d.ts +2 -0
- package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.js +7 -1
- package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.js +15 -4
- package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +9 -2
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
- package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js +7 -0
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts +2 -0
- package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +3 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +26 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector-content.js +0 -5
- package/dist/modes/interactive/components/tree-selector-content.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-auth-login.js +1 -0
- package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.js +80 -2
- package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-hotkeys-debug.js +3 -0
- package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +51 -0
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +5 -0
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +5 -0
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +12 -0
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.js +4 -1
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-onboarding.d.ts +11 -0
- package/dist/modes/interactive/interactive-onboarding.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-onboarding.js +220 -0
- package/dist/modes/interactive/interactive-onboarding.js.map +1 -0
- package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +4 -0
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-session-routing.js +6 -0
- package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-slash-commands.js +9 -4
- package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +28 -0
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/child-process.js +21 -1
- package/dist/utils/child-process.js.map +1 -1
- package/dist/utils/markit.d.ts +8 -0
- package/dist/utils/markit.d.ts.map +1 -0
- package/dist/utils/markit.js +53 -0
- package/dist/utils/markit.js.map +1 -0
- package/dist/utils/paths.d.ts +2 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +14 -1
- package/dist/utils/paths.js.map +1 -1
- package/docs/compaction.md +18 -1
- package/docs/containerization.md +1 -1
- package/docs/docs.json +1 -0
- package/docs/extensions.md +25 -36
- package/docs/models.md +1 -1
- package/docs/providers.md +2 -1
- package/docs/quickstart.md +11 -6
- package/docs/sdk.md +5 -5
- package/docs/session-format.md +6 -0
- package/docs/sessions.md +6 -0
- package/docs/settings.md +7 -0
- package/docs/subagents.md +3 -2
- package/docs/tools.md +49 -0
- package/docs/usage.md +3 -3
- package/docs/workflows.md +112 -8
- package/examples/extensions/subagent/README.md +5 -5
- package/examples/extensions/subagent/agents/planner.md +1 -1
- package/examples/extensions/subagent/agents/reviewer.md +1 -1
- package/examples/extensions/subagent/agents/scout.md +2 -2
- package/examples/extensions/subagent/display.ts +3 -3
- package/examples/sdk/05-tools.ts +3 -3
- package/examples/sdk/README.md +1 -1
- package/package.json +5 -3
|
@@ -55,6 +55,18 @@ export interface WorkflowModelFallbackFields {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
export type WorkflowModelValue = string | object;
|
|
58
|
+
// Standalone authoring contract mirror of shared/types.ts StageUserMessageContent,
|
|
59
|
+
// whose runtime source of truth is derived from AgentSession["sendUserMessage"].
|
|
60
|
+
export interface StageTextContent {
|
|
61
|
+
readonly type: "text";
|
|
62
|
+
readonly text: string;
|
|
63
|
+
}
|
|
64
|
+
export interface StageImageContent {
|
|
65
|
+
readonly type: "image";
|
|
66
|
+
readonly data: string;
|
|
67
|
+
readonly mimeType: string;
|
|
68
|
+
}
|
|
69
|
+
export type StageUserMessageContent = string | readonly (StageTextContent | StageImageContent)[];
|
|
58
70
|
export type WorkflowStageResult<TSchemaDef extends TSchema | undefined = undefined> = [TSchemaDef] extends [TSchema]
|
|
59
71
|
? Static<TSchemaDef>
|
|
60
72
|
: string;
|
|
@@ -223,6 +235,7 @@ export interface WorkflowPersistencePort {
|
|
|
223
235
|
|
|
224
236
|
export interface StageSessionRuntime {
|
|
225
237
|
prompt(text: string, options?: PromptOptions): Promise<string | void>;
|
|
238
|
+
sendUserMessage?(content: StageUserMessageContent, options?: StageSendUserMessageOptions): Promise<void>;
|
|
226
239
|
steer(text: string): Promise<void>;
|
|
227
240
|
followUp(text: string): Promise<void>;
|
|
228
241
|
subscribe(listener: (event: never) => void): () => void;
|
|
@@ -284,10 +297,17 @@ export interface StageAdapters {
|
|
|
284
297
|
readonly complete?: CompleteAdapter;
|
|
285
298
|
}
|
|
286
299
|
|
|
300
|
+
export type StageUserMessageDelivery = "steer" | "followUp";
|
|
301
|
+
|
|
302
|
+
export interface StageSendUserMessageOptions {
|
|
303
|
+
readonly deliverAs?: StageUserMessageDelivery;
|
|
304
|
+
}
|
|
305
|
+
|
|
287
306
|
export interface StageContext<TSchemaDef extends TSchema | undefined = undefined> {
|
|
288
307
|
readonly name: string;
|
|
289
308
|
prompt(text: string, options?: StagePromptOptions): Promise<WorkflowStageResult<TSchemaDef>>;
|
|
290
309
|
complete(text: string, options?: CompleteStageOpts): Promise<string>;
|
|
310
|
+
sendUserMessage(content: StageUserMessageContent, options?: StageSendUserMessageOptions): Promise<void>;
|
|
291
311
|
steer(text: string): Promise<void>;
|
|
292
312
|
followUp(text: string): Promise<void>;
|
|
293
313
|
subscribe(listener: (event: never) => void): () => void;
|
|
@@ -57,6 +57,28 @@ export interface WorkflowRunContext<TInputs extends WorkflowInputValues = Workfl
|
|
|
57
57
|
parallel(steps: readonly WorkflowTaskStep[], options?: WorkflowParallelOptions): Promise<WorkflowTaskResult[]>;
|
|
58
58
|
workflow<TChildInputs extends WorkflowInputValues, TChildOutputs extends WorkflowOutputValues, TChildRunInputs extends WorkflowInputValues = TChildInputs>(definition: WorkflowDefinition<TChildInputs, TChildOutputs, TChildRunInputs> & TDefinitionBrand, ...args: WorkflowRunChildArgs<TChildRunInputs>): Promise<WorkflowChildResult<TChildOutputs>>;
|
|
59
59
|
readonly ui: WorkflowUIContext;
|
|
60
|
+
/**
|
|
61
|
+
* Durable cached tool execution. Runs arbitrary TypeScript code and caches
|
|
62
|
+
* the result durably so completed side effects are not repeated on resume.
|
|
63
|
+
* Only `ctx.*` blocks (tool, ui, stage, task, chain, parallel, workflow)
|
|
64
|
+
* produce durable checkpoints.
|
|
65
|
+
*
|
|
66
|
+
* cross-ref: issue #1498 — DBOS-backed cross-session resumability.
|
|
67
|
+
*/
|
|
68
|
+
tool: WorkflowToolPrimitive;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* `ctx.tool` primitive signature. Runs an async function and caches the result.
|
|
72
|
+
*/
|
|
73
|
+
export interface WorkflowToolPrimitive {
|
|
74
|
+
<TValue extends WorkflowSerializableValue>(name: string, args: Readonly<Record<string, WorkflowSerializableValue>>, fn: () => Promise<TValue>, options?: WorkflowToolOptions): Promise<TValue>;
|
|
75
|
+
}
|
|
76
|
+
/** Options for `ctx.tool`. */
|
|
77
|
+
export interface WorkflowToolOptions {
|
|
78
|
+
readonly retriesAllowed?: boolean;
|
|
79
|
+
readonly maxAttempts?: number;
|
|
80
|
+
readonly intervalMs?: number;
|
|
81
|
+
readonly backoffRate?: number;
|
|
60
82
|
}
|
|
61
83
|
export type WorkflowRunFn<TInputs extends WorkflowInputValues = WorkflowInputValues, TOutputs extends WorkflowOutputValues = WorkflowOutputValues, TDefinitionBrand extends object = {}> = (ctx: WorkflowRunContext<TInputs, TDefinitionBrand, TOutputs>) => Promise<TOutputs> | TOutputs;
|
|
62
84
|
export interface WorkflowRuntimeConfig {
|
|
@@ -140,7 +162,7 @@ export interface RunOpts {
|
|
|
140
162
|
readonly parentRun?: WorkflowParentRunLink;
|
|
141
163
|
readonly onRunStart?: (snapshot: RunSnapshot) => void;
|
|
142
164
|
readonly onStageStart?: (runId: string, snapshot: StageSnapshot) => void;
|
|
143
|
-
readonly onStageEnd?: (runId: string, snapshot: StageSnapshot) =>
|
|
165
|
+
readonly onStageEnd?: (runId: string, snapshot: StageSnapshot) => unknown;
|
|
144
166
|
readonly onRunEnd?: (runId: string, status: RunStatus, result?: WorkflowOutputValues, error?: string, exitReason?: string) => void;
|
|
145
167
|
}
|
|
146
168
|
export interface WorkflowProgressSummary extends WorkflowSerializableObject {
|
|
@@ -104,6 +104,35 @@ export interface WorkflowRunContext<
|
|
|
104
104
|
...args: WorkflowRunChildArgs<TChildRunInputs>
|
|
105
105
|
): Promise<WorkflowChildResult<TChildOutputs>>;
|
|
106
106
|
readonly ui: WorkflowUIContext;
|
|
107
|
+
/**
|
|
108
|
+
* Durable cached tool execution. Runs arbitrary TypeScript code and caches
|
|
109
|
+
* the result durably so completed side effects are not repeated on resume.
|
|
110
|
+
* Only `ctx.*` blocks (tool, ui, stage, task, chain, parallel, workflow)
|
|
111
|
+
* produce durable checkpoints.
|
|
112
|
+
*
|
|
113
|
+
* cross-ref: issue #1498 — DBOS-backed cross-session resumability.
|
|
114
|
+
*/
|
|
115
|
+
tool: WorkflowToolPrimitive;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* `ctx.tool` primitive signature. Runs an async function and caches the result.
|
|
120
|
+
*/
|
|
121
|
+
export interface WorkflowToolPrimitive {
|
|
122
|
+
<TValue extends WorkflowSerializableValue>(
|
|
123
|
+
name: string,
|
|
124
|
+
args: Readonly<Record<string, WorkflowSerializableValue>>,
|
|
125
|
+
fn: () => Promise<TValue>,
|
|
126
|
+
options?: WorkflowToolOptions,
|
|
127
|
+
): Promise<TValue>;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Options for `ctx.tool`. */
|
|
131
|
+
export interface WorkflowToolOptions {
|
|
132
|
+
readonly retriesAllowed?: boolean;
|
|
133
|
+
readonly maxAttempts?: number;
|
|
134
|
+
readonly intervalMs?: number;
|
|
135
|
+
readonly backoffRate?: number;
|
|
107
136
|
}
|
|
108
137
|
|
|
109
138
|
export type WorkflowRunFn<
|
|
@@ -206,7 +235,7 @@ export interface RunOpts {
|
|
|
206
235
|
readonly parentRun?: WorkflowParentRunLink;
|
|
207
236
|
readonly onRunStart?: (snapshot: RunSnapshot) => void;
|
|
208
237
|
readonly onStageStart?: (runId: string, snapshot: StageSnapshot) => void;
|
|
209
|
-
readonly onStageEnd?: (runId: string, snapshot: StageSnapshot) =>
|
|
238
|
+
readonly onStageEnd?: (runId: string, snapshot: StageSnapshot) => unknown;
|
|
210
239
|
readonly onRunEnd?: (runId: string, status: RunStatus, result?: WorkflowOutputValues, error?: string, exitReason?: string) => void;
|
|
211
240
|
}
|
|
212
241
|
|
|
@@ -30,6 +30,10 @@ export interface RunEndMetadata {
|
|
|
30
30
|
readonly exitReason?: string;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
export interface RunPauseMetadata {
|
|
34
|
+
readonly resumable?: boolean;
|
|
35
|
+
readonly exitReason?: string;
|
|
36
|
+
}
|
|
33
37
|
export interface RunBlockedMetadata extends RunEndMetadata {
|
|
34
38
|
readonly failureRecoverability: "recoverable";
|
|
35
39
|
readonly failedStageId: string;
|
|
@@ -204,8 +208,8 @@ export interface Store {
|
|
|
204
208
|
recordStageBlocked(runId: string, stageId: string, blockedBy: string): boolean;
|
|
205
209
|
recordStageUnblocked(runId: string, stageId: string): boolean;
|
|
206
210
|
recordStageNotice(runId: string, stageId: string, notice: StageNotice): boolean;
|
|
207
|
-
/** Mark a run as `paused`. */
|
|
208
|
-
recordRunPaused(runId: string, pausedAt?: number): boolean;
|
|
211
|
+
/** Mark a run as `paused`. Optional metadata can annotate resumable quit/detach state. */
|
|
212
|
+
recordRunPaused(runId: string, pausedAt?: number, metadata?: RunPauseMetadata): boolean;
|
|
209
213
|
/** Restore a run from `paused` back to `running`. */
|
|
210
214
|
recordRunResumed(runId: string, resumedAt?: number): boolean;
|
|
211
215
|
/** Drop every run and notice. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { WorkflowOutputValues } from "./types.js";
|
|
2
|
-
import type { Store, RunBlockedMetadata, RunEndMetadata } from "./store-public-types.js";
|
|
2
|
+
import type { Store, RunBlockedMetadata, RunEndMetadata, RunPauseMetadata } from "./store-public-types.js";
|
|
3
3
|
import type { RunSnapshot, RunStatus, StoreSnapshot, WorkflowNotice } from "./store-types.js";
|
|
4
4
|
import { accumulatePausedDurationMs, elapsedRunMs } from "./timing.js";
|
|
5
5
|
import { isTopLevelWorkflowRun } from "./run-visibility.js";
|
|
@@ -164,14 +164,19 @@ export function createRunStoreMethods(context: StoreContext): RunStoreMethods {
|
|
|
164
164
|
return true;
|
|
165
165
|
},
|
|
166
166
|
|
|
167
|
-
recordRunPaused(runId: string, pausedAt?: number): boolean {
|
|
167
|
+
recordRunPaused(runId: string, pausedAt?: number, metadata?: RunPauseMetadata): boolean {
|
|
168
168
|
const run = context.findRun(runId);
|
|
169
169
|
if (!run) return false;
|
|
170
170
|
if (TERMINAL_STATUSES.has(run.status)) return false;
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
171
|
+
const wasPaused = run.status === "paused";
|
|
172
|
+
if (!wasPaused) {
|
|
173
|
+
run.status = "paused";
|
|
174
|
+
run.pausedAt = pausedAt ?? Date.now();
|
|
175
|
+
run.resumedAt = undefined;
|
|
176
|
+
}
|
|
177
|
+
if (metadata?.resumable !== undefined) run.resumable = metadata.resumable;
|
|
178
|
+
if (metadata?.exitReason !== undefined) run.exitReason = metadata.exitReason;
|
|
179
|
+
if (wasPaused && metadata === undefined) return false;
|
|
175
180
|
context.bumpAndNotify();
|
|
176
181
|
return true;
|
|
177
182
|
},
|
|
@@ -186,6 +191,7 @@ export function createRunStoreMethods(context: StoreContext): RunStoreMethods {
|
|
|
186
191
|
run.pausedDurationMs = accumulatePausedDurationMs(run.pausedDurationMs, run.pausedAt, resumedTs);
|
|
187
192
|
run.resumedAt = resumedTs;
|
|
188
193
|
run.pausedAt = undefined;
|
|
194
|
+
delete run.exitReason;
|
|
189
195
|
context.bumpAndNotify();
|
|
190
196
|
return true;
|
|
191
197
|
},
|
|
@@ -21,6 +21,15 @@ export type { TSchema };
|
|
|
21
21
|
|
|
22
22
|
export type { AgentSessionEvent, ContextCompactionResult, ModelCycleResult, PromptOptions };
|
|
23
23
|
|
|
24
|
+
export type StageUserMessageContent = Parameters<AgentSession["sendUserMessage"]>[0];
|
|
25
|
+
|
|
26
|
+
export type StageUserMessageDelivery = "steer" | "followUp";
|
|
27
|
+
|
|
28
|
+
export interface StageSendUserMessageOptions {
|
|
29
|
+
/** Delivery mode to use when the stage session is already streaming. Defaults to followUp. */
|
|
30
|
+
readonly deliverAs?: StageUserMessageDelivery;
|
|
31
|
+
}
|
|
32
|
+
|
|
24
33
|
export type WorkflowModelValue = NonNullable<CreateAgentSessionOptions["model"]> | string;
|
|
25
34
|
export type WorkflowModelUsage = AuthoringContract.WorkflowModelUsage;
|
|
26
35
|
export type WorkflowModelAttempt = AuthoringContract.WorkflowModelAttempt;
|
|
@@ -178,6 +187,10 @@ export interface StageOptions<TSchemaDef extends TSchema | undefined = TSchema |
|
|
|
178
187
|
scopedModels?: CreateAgentSessionOptions["scopedModels"];
|
|
179
188
|
sessionManager?: SessionManager;
|
|
180
189
|
settingsManager?: SettingsManager;
|
|
190
|
+
/** Internal durable resume hook: reopen this exact Atomic/Pi session file instead of forking. */
|
|
191
|
+
resumeFromSessionFile?: string;
|
|
192
|
+
/** Internal durable replay key used to map a live LM session to durable resume state. */
|
|
193
|
+
durableReplayKey?: string;
|
|
181
194
|
}
|
|
182
195
|
|
|
183
196
|
// ---------------------------------------------------------------------------
|
|
@@ -299,6 +312,15 @@ export interface StageContext<TSchemaDef extends TSchema | undefined = undefined
|
|
|
299
312
|
prompt(text: string, options?: StagePromptOptions): Promise<WorkflowStageResult<TSchemaDef>>;
|
|
300
313
|
complete(text: string, options?: CompleteStageOpts): Promise<string>;
|
|
301
314
|
|
|
315
|
+
/**
|
|
316
|
+
* Send a user-authored follow-on message to this stage session.
|
|
317
|
+
*
|
|
318
|
+
* When the session is idle this starts a new user turn immediately. When the
|
|
319
|
+
* session is streaming, the message is queued as a follow-up by default, or
|
|
320
|
+
* as steering when `deliverAs: "steer"` is provided.
|
|
321
|
+
*/
|
|
322
|
+
sendUserMessage(content: StageUserMessageContent, options?: StageSendUserMessageOptions): Promise<void>;
|
|
323
|
+
|
|
302
324
|
/** Queue messages during streaming. */
|
|
303
325
|
steer(text: string): Promise<void>;
|
|
304
326
|
followUp(text: string): Promise<void>;
|
|
@@ -381,6 +403,39 @@ export interface WorkflowRunContext<
|
|
|
381
403
|
): Promise<WorkflowChildResult<TChildOutputs>>;
|
|
382
404
|
/** HIL primitives for user interaction during a run. */
|
|
383
405
|
readonly ui: WorkflowUIContext;
|
|
406
|
+
/**
|
|
407
|
+
* Durable cached tool execution. Runs arbitrary TypeScript code and caches
|
|
408
|
+
* the result so completed side effects are not repeated on resume.
|
|
409
|
+
* Only `ctx.*` blocks produce durable checkpoints.
|
|
410
|
+
*
|
|
411
|
+
* cross-ref: issue #1498 — DBOS-backed cross-session resumability.
|
|
412
|
+
*/
|
|
413
|
+
tool: WorkflowToolPrimitive;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* `ctx.tool` primitive signature. Runs an async function and caches the result
|
|
418
|
+
* durably via the durable workflow backend.
|
|
419
|
+
*/
|
|
420
|
+
export interface WorkflowToolPrimitive {
|
|
421
|
+
<TValue extends WorkflowSerializableValue>(
|
|
422
|
+
name: string,
|
|
423
|
+
args: Readonly<Record<string, WorkflowSerializableValue>>,
|
|
424
|
+
fn: () => Promise<TValue>,
|
|
425
|
+
options?: WorkflowToolOptions,
|
|
426
|
+
): Promise<TValue>;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/** Options for `ctx.tool`. */
|
|
430
|
+
export interface WorkflowToolOptions {
|
|
431
|
+
/** When true, the tool function is retried on failure. Default false. */
|
|
432
|
+
readonly retriesAllowed?: boolean;
|
|
433
|
+
/** Max retry attempts when retriesAllowed is true. Default 3. */
|
|
434
|
+
readonly maxAttempts?: number;
|
|
435
|
+
/** Initial retry interval in ms. Default 1000. */
|
|
436
|
+
readonly intervalMs?: number;
|
|
437
|
+
/** Backoff multiplier. Default 2. */
|
|
438
|
+
readonly backoffRate?: number;
|
|
384
439
|
}
|
|
385
440
|
|
|
386
441
|
// ---------------------------------------------------------------------------
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
* - One status-coloured rounded run card:
|
|
8
8
|
* title: runId8 · workflowName · ● running
|
|
9
9
|
* body: compact `k=v · k=v · +N more` input summary when present
|
|
10
|
-
* - One hint
|
|
10
|
+
* - One compact next-step hint:
|
|
11
|
+
* ▸ /workflow connect <id> watch, attach & steer
|
|
11
12
|
*
|
|
12
13
|
* What we deliberately do NOT emit (was in the legacy 7-row layout):
|
|
13
14
|
* - the `✓ submitted · /workflow <name>` echo line — pi already shows
|
|
@@ -19,9 +20,9 @@
|
|
|
19
20
|
* an 8-char hex string visually communicates "identifier";
|
|
20
21
|
* - the `status starting…` body row — the `● running` badge on row 1
|
|
21
22
|
* occupies the same semantic slot;
|
|
22
|
-
* - the second hint row `▸ /workflow status` — that is a separate
|
|
23
|
-
*
|
|
24
|
-
*
|
|
23
|
+
* - the second hint row `▸ /workflow status` — that is a separate intent
|
|
24
|
+
* (list other in-flight runs), already discoverable from a bare `/workflow`
|
|
25
|
+
* invocation and the picker's confirm panel.
|
|
25
26
|
*
|
|
26
27
|
* Plain mode drops ANSI; the rounded panel/card layout shape is preserved.
|
|
27
28
|
*
|
|
@@ -70,8 +71,7 @@ export interface RenderDispatchConfirmOpts {
|
|
|
70
71
|
/**
|
|
71
72
|
* Render the post-dispatch confirmation: one rounded panel containing a
|
|
72
73
|
* rounded run card with runId, workflow name, inputs summary, and a
|
|
73
|
-
* `● running` status badge, followed by
|
|
74
|
-
* `/workflow connect <id>`.
|
|
74
|
+
* `● running` status badge, followed by a workflow-control hint.
|
|
75
75
|
*/
|
|
76
76
|
export function renderDispatchConfirm(opts: RenderDispatchConfirmOpts): string {
|
|
77
77
|
const width = effectiveWidth(opts.width);
|
|
@@ -142,10 +142,11 @@ export function renderDispatchConfirm(opts: RenderDispatchConfirmOpts): string {
|
|
|
142
142
|
: [` ${titleSuffix ?? "started in background"} `];
|
|
143
143
|
const titleLine = ` ● ${tag} ${opts.workflowName} ${trailing.text} `;
|
|
144
144
|
|
|
145
|
-
const hints = renderHintRows(
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
145
|
+
const hints = renderHintRows([
|
|
146
|
+
{ command: `/workflow connect ${tag}`, hint: "watch, attach & steer" },
|
|
147
|
+
], theme)
|
|
148
|
+
.split("\n")
|
|
149
|
+
.map((line) => ` ${line} `);
|
|
149
150
|
|
|
150
151
|
return renderRoundedBox({
|
|
151
152
|
title: "DISPATCHED",
|
|
@@ -16,6 +16,8 @@ export abstract class GraphViewGraphRenderer extends GraphViewRenderHelpers {
|
|
|
16
16
|
protected _renderGraph(width: number): string[] {
|
|
17
17
|
const run = this._getCurrentRun();
|
|
18
18
|
if (!run || this.cachedLayout.length === 0) {
|
|
19
|
+
this.lastGraphViewport = null;
|
|
20
|
+
this.graphNodeHitRects = [];
|
|
19
21
|
const dim = hexToAnsi(this.graphTheme.dim);
|
|
20
22
|
return [
|
|
21
23
|
this._centerCanvasContent(
|
|
@@ -40,6 +42,7 @@ export abstract class GraphViewGraphRenderer extends GraphViewRenderHelpers {
|
|
|
40
42
|
);
|
|
41
43
|
const viewportWidth = Math.max(1, width - leftMargin);
|
|
42
44
|
const fullCanvasWidth = Math.max(canvasWidth, viewportWidth);
|
|
45
|
+
this.lastGraphViewport = { leftMargin, viewportWidth };
|
|
43
46
|
this._clampGraphHorizontalScroll(fullCanvasWidth, viewportWidth);
|
|
44
47
|
if (this.pendingEnsureFocusedVisible) {
|
|
45
48
|
this._scrollFocusedColumnIntoView(viewportWidth, fullCanvasWidth);
|
|
@@ -129,6 +132,44 @@ export abstract class GraphViewGraphRenderer extends GraphViewRenderHelpers {
|
|
|
129
132
|
});
|
|
130
133
|
}
|
|
131
134
|
|
|
135
|
+
protected _recordGraphNodeHitRects(
|
|
136
|
+
graphStartRow: number,
|
|
137
|
+
visibleRowCount: number,
|
|
138
|
+
): void {
|
|
139
|
+
const viewport = this.lastGraphViewport;
|
|
140
|
+
if (!viewport || visibleRowCount <= 0) {
|
|
141
|
+
this.graphNodeHitRects = [];
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const visibleTop = graphStartRow;
|
|
146
|
+
const visibleBottom = graphStartRow + visibleRowCount;
|
|
147
|
+
const viewportLeft = viewport.leftMargin;
|
|
148
|
+
const viewportRight = viewport.leftMargin + viewport.viewportWidth;
|
|
149
|
+
const rects: typeof this.graphNodeHitRects = [];
|
|
150
|
+
|
|
151
|
+
for (let index = 0; index < this.cachedLayout.length; index++) {
|
|
152
|
+
const node = this.cachedLayout[index]!;
|
|
153
|
+
const top = graphStartRow + node.y - this.graphScrollOffset;
|
|
154
|
+
const bottom = top + NODE_H;
|
|
155
|
+
const left = viewport.leftMargin + node.x - this.graphScrollColOffset;
|
|
156
|
+
const right = left + NODE_W;
|
|
157
|
+
const clippedTop = Math.max(visibleTop, top);
|
|
158
|
+
const clippedBottom = Math.min(visibleBottom, bottom);
|
|
159
|
+
const clippedLeft = Math.max(viewportLeft, left);
|
|
160
|
+
const clippedRight = Math.min(viewportRight, right);
|
|
161
|
+
if (clippedTop >= clippedBottom || clippedLeft >= clippedRight) continue;
|
|
162
|
+
rects.push({
|
|
163
|
+
index,
|
|
164
|
+
top: clippedTop,
|
|
165
|
+
bottom: clippedBottom,
|
|
166
|
+
left: clippedLeft,
|
|
167
|
+
right: clippedRight,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
this.graphNodeHitRects = rects;
|
|
171
|
+
}
|
|
172
|
+
|
|
132
173
|
protected _visibleGraphLines(
|
|
133
174
|
graphLines: string[],
|
|
134
175
|
frameWidth: number,
|
|
@@ -11,6 +11,13 @@ import {
|
|
|
11
11
|
import { filterStages, type SwitcherState } from "./switcher.js";
|
|
12
12
|
import { Key, matchesKey } from "./text-helpers.js";
|
|
13
13
|
|
|
14
|
+
interface SgrMouseEvent {
|
|
15
|
+
buttonCode: number;
|
|
16
|
+
col: number;
|
|
17
|
+
row: number;
|
|
18
|
+
final: "M" | "m";
|
|
19
|
+
}
|
|
20
|
+
|
|
14
21
|
/** Keyboard, mouse, switcher, prompt, and focus navigation handling. */
|
|
15
22
|
export abstract class GraphViewInputController extends GraphViewRenderer {
|
|
16
23
|
/** Returns true if consumed. */
|
|
@@ -80,6 +87,15 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
|
|
|
80
87
|
return true;
|
|
81
88
|
}
|
|
82
89
|
|
|
90
|
+
const clickedNodeIndex = this._graphNodeIndexForClick(data);
|
|
91
|
+
if (clickedNodeIndex !== undefined) {
|
|
92
|
+
if (clickedNodeIndex !== null) {
|
|
93
|
+
this._setFocusedIndex(clickedNodeIndex);
|
|
94
|
+
this._activateFocusedNode();
|
|
95
|
+
}
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
|
|
83
99
|
// Vertical-graph navigation: up/down step between depth levels
|
|
84
100
|
// (col), left/right step between siblings at the same depth (row).
|
|
85
101
|
// j/k preserved as a flat-order fallback for muscle memory.
|
|
@@ -115,12 +131,7 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
|
|
|
115
131
|
return true;
|
|
116
132
|
}
|
|
117
133
|
if (matchesKey(data, Key.enter)) {
|
|
118
|
-
|
|
119
|
-
// attach shell swaps in the stage-chat view without remounting
|
|
120
|
-
// the overlay; without a callback, fall back to the legacy
|
|
121
|
-
// expand/collapse toggle so non-attach hosts still work.
|
|
122
|
-
if (this._attachFocusedStage()) return true;
|
|
123
|
-
this.detailsExpanded = !this.detailsExpanded;
|
|
134
|
+
this._activateFocusedNode();
|
|
124
135
|
return true;
|
|
125
136
|
}
|
|
126
137
|
// `ctrl+d` detaches the whole popup (host hides the overlay). This
|
|
@@ -133,16 +144,13 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
|
|
|
133
144
|
}
|
|
134
145
|
return true;
|
|
135
146
|
}
|
|
136
|
-
// `q`
|
|
137
|
-
// the
|
|
147
|
+
// `q` quits/detaches the orchestrator view without authoritatively
|
|
148
|
+
// killing the workflow. The workflow remains resumable via
|
|
149
|
+
// `/workflow resume`; use `/workflow kill` for non-resumable disposal.
|
|
138
150
|
if (matchesKey(data, "q")) {
|
|
139
151
|
const run = this._getCurrentRun();
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
? this.currentSnapshot?.runs.find((candidate) => candidate.id === targetRunId)
|
|
143
|
-
: undefined;
|
|
144
|
-
if (targetRun && targetRun.endedAt === undefined && this.onKill) {
|
|
145
|
-
this.onKill(targetRun.id);
|
|
152
|
+
if (run && run.endedAt === undefined && this.onQuit) {
|
|
153
|
+
this.onQuit(run.id);
|
|
146
154
|
}
|
|
147
155
|
this.onClose?.();
|
|
148
156
|
return true;
|
|
@@ -265,6 +273,15 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
|
|
|
265
273
|
return true;
|
|
266
274
|
}
|
|
267
275
|
|
|
276
|
+
private _activateFocusedNode(): void {
|
|
277
|
+
// Enter and direct node clicks attach the popup interior to the focused
|
|
278
|
+
// stage. The attach shell swaps in the stage-chat view without remounting
|
|
279
|
+
// the overlay; without a callback, fall back to the legacy expand/collapse
|
|
280
|
+
// toggle so non-attach hosts still work.
|
|
281
|
+
if (this._attachFocusedStage()) return;
|
|
282
|
+
this.detailsExpanded = !this.detailsExpanded;
|
|
283
|
+
}
|
|
284
|
+
|
|
268
285
|
private _attachFocusedStage(): boolean {
|
|
269
286
|
if (!this.onStageAttach) return false;
|
|
270
287
|
const node = this.cachedLayout[this.focusedIndex];
|
|
@@ -278,13 +295,6 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
|
|
|
278
295
|
return true;
|
|
279
296
|
}
|
|
280
297
|
|
|
281
|
-
private _focusedStageTarget(): { runId: string; stageId: string } | undefined {
|
|
282
|
-
const node = this.cachedLayout[this.focusedIndex];
|
|
283
|
-
if (!node) return undefined;
|
|
284
|
-
const target = expandedStageTarget(this.expandedGraph, node.stage.id);
|
|
285
|
-
return target ? { runId: target.runId, stageId: target.stageId } : undefined;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
298
|
private _setFocusedIndex(index: number): void {
|
|
289
299
|
const max = Math.max(0, this.cachedLayout.length - 1);
|
|
290
300
|
const next = Math.max(0, Math.min(index, max));
|
|
@@ -298,10 +308,55 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
|
|
|
298
308
|
this.graphScrollOffset = Math.max(0, this.graphScrollOffset + deltaRows);
|
|
299
309
|
}
|
|
300
310
|
|
|
311
|
+
private _graphNodeIndexForClick(data: string): number | null | undefined {
|
|
312
|
+
const click = this._sgrLeftMousePress(data);
|
|
313
|
+
if (!click) return undefined;
|
|
314
|
+
if (this.mode !== "overlay") return undefined;
|
|
315
|
+
if (this.cachedLayout.length === 0) return null;
|
|
316
|
+
|
|
317
|
+
for (const rect of this.graphNodeHitRects) {
|
|
318
|
+
if (
|
|
319
|
+
click.row >= rect.top &&
|
|
320
|
+
click.row < rect.bottom &&
|
|
321
|
+
click.col >= rect.left &&
|
|
322
|
+
click.col < rect.right
|
|
323
|
+
) {
|
|
324
|
+
return rect.index;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
private _parseSgrMouse(data: string): SgrMouseEvent | null {
|
|
331
|
+
const sgr = data.match(/^\x1b\[<(\d+);(\d+);(\d+)([Mm])$/);
|
|
332
|
+
if (!sgr) return null;
|
|
333
|
+
const oneBasedCol = Number.parseInt(sgr[2]!, 10);
|
|
334
|
+
const oneBasedRow = Number.parseInt(sgr[3]!, 10);
|
|
335
|
+
const final = sgr[4];
|
|
336
|
+
if (oneBasedCol < 1 || oneBasedRow < 1) return null;
|
|
337
|
+
if (final !== "M" && final !== "m") return null;
|
|
338
|
+
return {
|
|
339
|
+
buttonCode: Number.parseInt(sgr[1]!, 10),
|
|
340
|
+
col: oneBasedCol - 1,
|
|
341
|
+
row: oneBasedRow - 1,
|
|
342
|
+
final,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
private _sgrLeftMousePress(data: string): { col: number; row: number } | null {
|
|
347
|
+
const sgr = this._parseSgrMouse(data);
|
|
348
|
+
if (!sgr || sgr.final !== "M") return null;
|
|
349
|
+
const buttonCode = sgr.buttonCode;
|
|
350
|
+
if ((buttonCode & 64) !== 0 || (buttonCode & 32) !== 0 || (buttonCode & 3) !== 0) {
|
|
351
|
+
return null;
|
|
352
|
+
}
|
|
353
|
+
return { col: sgr.col, row: sgr.row };
|
|
354
|
+
}
|
|
355
|
+
|
|
301
356
|
private _mouseWheelDeltaRows(data: string): number {
|
|
302
|
-
const sgr =
|
|
303
|
-
if (sgr) {
|
|
304
|
-
return this._wheelDeltaForButtonCode(
|
|
357
|
+
const sgr = this._parseSgrMouse(data);
|
|
358
|
+
if (sgr && sgr.final === "M") {
|
|
359
|
+
return this._wheelDeltaForButtonCode(sgr.buttonCode);
|
|
305
360
|
}
|
|
306
361
|
if (data.startsWith("\x1b[M") && data.length >= 6) {
|
|
307
362
|
return this._wheelDeltaForButtonCode(data.charCodeAt(3) - 32);
|
|
@@ -330,4 +385,7 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
|
|
|
330
385
|
get _graphScrollOffset(): number {
|
|
331
386
|
return this.graphScrollOffset;
|
|
332
387
|
}
|
|
388
|
+
get _graphScrollColOffset(): number {
|
|
389
|
+
return this.graphScrollColOffset;
|
|
390
|
+
}
|
|
333
391
|
}
|
|
@@ -37,6 +37,7 @@ export abstract class GraphViewRenderer extends GraphViewGraphRenderer {
|
|
|
37
37
|
|
|
38
38
|
protected _renderOverlay(width: number): string[] {
|
|
39
39
|
const frameWidth = Math.max(40, width);
|
|
40
|
+
this.lastOverlayFrameWidth = frameWidth;
|
|
40
41
|
const lines: string[] = [];
|
|
41
42
|
const run = this._getCurrentRun();
|
|
42
43
|
|
|
@@ -58,6 +59,10 @@ export abstract class GraphViewRenderer extends GraphViewGraphRenderer {
|
|
|
58
59
|
frameWidth,
|
|
59
60
|
bodyTarget,
|
|
60
61
|
);
|
|
62
|
+
this._recordGraphNodeHitRects(
|
|
63
|
+
this._overlayVerticalMarginRows() + 3 + visibleGraph.topPad,
|
|
64
|
+
visibleGraph.lines.length,
|
|
65
|
+
);
|
|
61
66
|
for (let i = 0; i < visibleGraph.topPad; i++)
|
|
62
67
|
lines.push(this._blankRow(frameWidth));
|
|
63
68
|
for (const line of visibleGraph.lines) {
|
|
@@ -78,6 +83,8 @@ export abstract class GraphViewRenderer extends GraphViewGraphRenderer {
|
|
|
78
83
|
}
|
|
79
84
|
|
|
80
85
|
protected _renderEmptyState(width: number): string[] {
|
|
86
|
+
this.graphNodeHitRects = [];
|
|
87
|
+
this.lastGraphViewport = null;
|
|
81
88
|
const t = this.graphTheme;
|
|
82
89
|
const muted = hexToAnsi(t.textMuted);
|
|
83
90
|
const dim = hexToAnsi(t.dim);
|
|
@@ -34,6 +34,19 @@ export interface GraphStageCounts {
|
|
|
34
34
|
skipped: number;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
interface GraphNodeHitRect {
|
|
38
|
+
index: number;
|
|
39
|
+
top: number;
|
|
40
|
+
bottom: number;
|
|
41
|
+
left: number;
|
|
42
|
+
right: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
interface GraphViewportGeometry {
|
|
46
|
+
leftMargin: number;
|
|
47
|
+
viewportWidth: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
37
50
|
/** Expansion, focus, prompt, and store-backed layout state for GraphView. */
|
|
38
51
|
export abstract class GraphViewState {
|
|
39
52
|
protected mode: GraphViewMode;
|
|
@@ -41,7 +54,7 @@ export abstract class GraphViewState {
|
|
|
41
54
|
protected store: Store;
|
|
42
55
|
protected graphTheme: GraphTheme;
|
|
43
56
|
protected onClose?: () => void;
|
|
44
|
-
protected
|
|
57
|
+
protected onQuit?: (runId: string) => void;
|
|
45
58
|
protected onHide?: () => void;
|
|
46
59
|
protected onPromptResolve?: (runId: string, promptId: string, response: unknown) => void;
|
|
47
60
|
protected onStageAttach?: (runId: string, stageId: string) => void;
|
|
@@ -64,6 +77,9 @@ export abstract class GraphViewState {
|
|
|
64
77
|
protected currentSnapshot: StoreSnapshot | null = null;
|
|
65
78
|
protected graphScrollOffset = 0;
|
|
66
79
|
protected graphScrollColOffset = 0;
|
|
80
|
+
protected graphNodeHitRects: GraphNodeHitRect[] = [];
|
|
81
|
+
protected lastGraphViewport: GraphViewportGeometry | null = null;
|
|
82
|
+
protected lastOverlayFrameWidth = 80;
|
|
67
83
|
protected pendingEnsureFocusedVisible = true;
|
|
68
84
|
protected lastAutoFocusedAwaitingInputKey: string | null = null;
|
|
69
85
|
|
|
@@ -77,7 +93,7 @@ export abstract class GraphViewState {
|
|
|
77
93
|
this.store = opts.store;
|
|
78
94
|
this.graphTheme = opts.graphTheme;
|
|
79
95
|
this.onClose = opts.onClose;
|
|
80
|
-
this.
|
|
96
|
+
this.onQuit = opts.onQuit;
|
|
81
97
|
this.onHide = opts.onHide;
|
|
82
98
|
this.onPromptResolve = opts.onPromptResolve;
|
|
83
99
|
this.onStageAttach = opts.onStageAttach;
|
|
@@ -121,6 +137,8 @@ export abstract class GraphViewState {
|
|
|
121
137
|
this.focusedIndex = 0;
|
|
122
138
|
this.graphScrollOffset = 0;
|
|
123
139
|
this.graphScrollColOffset = 0;
|
|
140
|
+
this.graphNodeHitRects = [];
|
|
141
|
+
this.lastGraphViewport = null;
|
|
124
142
|
this.pendingEnsureFocusedVisible = true;
|
|
125
143
|
this.promptState = null;
|
|
126
144
|
return;
|
|
@@ -130,6 +148,8 @@ export abstract class GraphViewState {
|
|
|
130
148
|
const graphStages = this._graphStages(run);
|
|
131
149
|
const nextLayout = computeLayout(graphStages, { orientation: "vertical" });
|
|
132
150
|
this.cachedLayout = nextLayout;
|
|
151
|
+
this.graphNodeHitRects = [];
|
|
152
|
+
this.lastGraphViewport = null;
|
|
133
153
|
|
|
134
154
|
let focusNeedsReveal = this.pendingEnsureFocusedVisible;
|
|
135
155
|
// One-shot: if the host passed `initialFocusedStageId`, snap the
|
|
@@ -10,12 +10,11 @@ export interface GraphViewOpts {
|
|
|
10
10
|
graphTheme: GraphTheme;
|
|
11
11
|
onClose?: () => void;
|
|
12
12
|
/**
|
|
13
|
-
* Invoked when the user presses `q` inside the pane
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* current run.
|
|
13
|
+
* Invoked when the user presses `q` inside the pane. This quits/detaches
|
|
14
|
+
* the orchestrator view and leaves the workflow resumable; it must not use
|
|
15
|
+
* the `/workflow kill` terminal path.
|
|
17
16
|
*/
|
|
18
|
-
|
|
17
|
+
onQuit?: (runId: string) => void;
|
|
19
18
|
/**
|
|
20
19
|
* Invoked when the user presses `h` inside the pane. Hides without
|
|
21
20
|
* unmounting (overlay-adapter calls `setHidden(true)`). Re-open via
|