@bastani/atomic 0.9.9 → 0.9.10
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 +132 -0
- package/README.md +2 -0
- package/dist/builtin/cursor/CHANGELOG.md +12 -0
- package/dist/builtin/cursor/package.json +3 -3
- package/dist/builtin/intercom/CHANGELOG.md +30 -0
- package/dist/builtin/intercom/README.md +12 -4
- package/dist/builtin/intercom/broker/broker.ts +96 -14
- package/dist/builtin/intercom/broker/client-message-validation.ts +39 -0
- package/dist/builtin/intercom/broker/client.ts +101 -92
- package/dist/builtin/intercom/broker/group-isolation.ts +28 -0
- package/dist/builtin/intercom/broker/send-handler.ts +62 -10
- package/dist/builtin/intercom/broker/send-signature.ts +3 -0
- package/dist/builtin/intercom/broker/supervisor-channel.ts +126 -0
- package/dist/builtin/intercom/closed-workflow-stage-message.ts +66 -0
- package/dist/builtin/intercom/config.ts +10 -0
- package/dist/builtin/intercom/contact-supervisor-tool.ts +14 -10
- package/dist/builtin/intercom/foreground-detach-handoff.ts +12 -2
- package/dist/builtin/intercom/group.ts +46 -0
- package/dist/builtin/intercom/inbound-message-admission.ts +79 -0
- package/dist/builtin/intercom/incoming-message-delivery.ts +49 -0
- package/dist/builtin/intercom/index-heavy.ts +148 -94
- package/dist/builtin/intercom/index.ts +66 -4
- package/dist/builtin/intercom/intercom-test-seams.ts +6 -0
- package/dist/builtin/intercom/intercom-tool.ts +71 -20
- package/dist/builtin/intercom/intercom-utils.ts +15 -2
- package/dist/builtin/intercom/late-stage-message-router.ts +148 -0
- package/dist/builtin/intercom/lifecycle.ts +10 -4
- package/dist/builtin/intercom/package.json +2 -2
- package/dist/builtin/intercom/reconnect-backoff.ts +6 -0
- package/dist/builtin/intercom/reply-tracker.ts +8 -0
- package/dist/builtin/intercom/skills/intercom/SKILL.md +2 -0
- package/dist/builtin/intercom/stable-delivery-retry.ts +32 -0
- package/dist/builtin/intercom/subagent-relay.ts +67 -14
- package/dist/builtin/intercom/supervisor-authorization-registry.ts +22 -0
- package/dist/builtin/intercom/terminal-ordering-barrier.ts +144 -25
- package/dist/builtin/intercom/types.ts +18 -5
- package/dist/builtin/intercom/workflow-reply-tracker.ts +19 -0
- package/dist/builtin/intercom/workflow-stage-admission.ts +43 -0
- package/dist/builtin/intercom/workflow-stage-delivery-failure.ts +77 -0
- package/dist/builtin/mcp/CHANGELOG.md +22 -0
- package/dist/builtin/mcp/README.md +6 -2
- package/dist/builtin/mcp/config.ts +8 -8
- package/dist/builtin/mcp/direct-tool-executor.ts +7 -6
- package/dist/builtin/mcp/package.json +3 -3
- package/dist/builtin/mcp/proxy-call.ts +5 -4
- package/dist/builtin/mcp/sampling-handler.ts +7 -2
- package/dist/builtin/mcp/tool-call-timeout.ts +101 -0
- package/dist/builtin/mcp/tool-result-renderer.ts +3 -2
- package/dist/builtin/mcp/types.ts +5 -0
- package/dist/builtin/mcp/ui-server.ts +3 -2
- package/dist/builtin/subagents/CHANGELOG.md +42 -0
- package/dist/builtin/subagents/README.md +6 -3
- package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
- package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
- package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
- package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
- package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
- package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
- package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
- package/dist/builtin/subagents/agents/debugger.md +1 -1
- package/dist/builtin/subagents/agents/worker.md +1 -1
- package/dist/builtin/subagents/package.json +4 -4
- package/dist/builtin/subagents/skills/subagent/SKILL.md +1 -1
- package/dist/builtin/subagents/src/extension/index.ts +37 -61
- package/dist/builtin/subagents/src/extension/notification-content.ts +80 -0
- package/dist/builtin/subagents/src/extension/schemas.ts +9 -0
- package/dist/builtin/subagents/src/extension/tool-description.ts +1 -0
- package/dist/builtin/subagents/src/intercom/supervisor-authorization.ts +23 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +4 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +2 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +4 -0
- package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +75 -13
- package/dist/builtin/subagents/src/runs/background/async-status.ts +19 -0
- package/dist/builtin/subagents/src/runs/background/completion-notification.ts +4 -3
- package/dist/builtin/subagents/src/runs/background/notify.ts +76 -15
- package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +1 -1
- package/dist/builtin/subagents/src/runs/background/subagent-runner-dynamic.ts +13 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel.ts +1 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-sequential.ts +1 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +2 -1
- package/dist/builtin/subagents/src/runs/background/subagent-runner-types.ts +4 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +13 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +19 -2
- package/dist/builtin/subagents/src/runs/foreground/detached-cleanup-barrier.ts +26 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +19 -30
- package/dist/builtin/subagents/src/runs/foreground/execution-intercom-detach.ts +47 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +60 -2
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +21 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +21 -2
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +6 -1
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/intercom-group.ts +50 -0
- package/dist/builtin/subagents/src/runs/shared/pi-args.ts +16 -0
- package/dist/builtin/subagents/src/runs/shared/worktree-post-create.ts +75 -0
- package/dist/builtin/subagents/src/runs/shared/worktree-root.ts +51 -0
- package/dist/builtin/subagents/src/runs/shared/worktree.ts +69 -77
- package/dist/builtin/subagents/src/shared/types-config.ts +6 -0
- package/dist/builtin/subagents/src/slash/slash-commands.ts +3 -2
- package/dist/builtin/subagents/src/tui/render-result-compact.ts +5 -3
- package/dist/builtin/subagents/src/tui/render-result.ts +5 -3
- package/dist/builtin/subagents/src/tui/render-widget-graph.ts +7 -4
- package/dist/builtin/web-access/CHANGELOG.md +22 -0
- package/dist/builtin/web-access/extract-frames.ts +14 -13
- package/dist/builtin/web-access/extract.ts +2 -2
- package/dist/builtin/web-access/gemini-api.ts +0 -3
- package/dist/builtin/web-access/gemini-web-config.ts +1 -3
- package/dist/builtin/web-access/gemini-web.ts +1 -0
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/web-access/perplexity.ts +0 -3
- package/dist/builtin/web-access/result-renderers.ts +7 -5
- package/dist/builtin/web-access/subprocess.ts +100 -0
- package/dist/builtin/web-access/summary-review.ts +14 -3
- package/dist/builtin/web-access/video-extract.ts +12 -17
- package/dist/builtin/web-access/web-search-browser.ts +18 -10
- package/dist/builtin/web-access/web-search-summary.ts +9 -2
- package/dist/builtin/web-access/youtube-extract.ts +22 -25
- package/dist/builtin/workflows/CHANGELOG.md +153 -0
- package/dist/builtin/workflows/README.md +76 -38
- package/dist/builtin/workflows/ambient.d.ts +30 -0
- package/dist/builtin/workflows/builtin/adversarial-verification-prompts.ts +15 -0
- package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +93 -0
- package/dist/builtin/workflows/builtin/adversarial-verification.d.ts +11 -0
- package/dist/builtin/workflows/builtin/adversarial-verification.ts +24 -0
- package/dist/builtin/workflows/builtin/classify-and-act-prompts.ts +11 -0
- package/dist/builtin/workflows/builtin/classify-and-act-runner.ts +110 -0
- package/dist/builtin/workflows/builtin/classify-and-act.d.ts +24 -0
- package/dist/builtin/workflows/builtin/classify-and-act.ts +35 -0
- package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +8 -2
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize-prompts.ts +11 -0
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize-runner.ts +96 -0
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize.d.ts +23 -0
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +32 -0
- package/dist/builtin/workflows/builtin/generate-and-filter-prompts.ts +15 -0
- package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +75 -0
- package/dist/builtin/workflows/builtin/generate-and-filter.d.ts +11 -0
- package/dist/builtin/workflows/builtin/generate-and-filter.ts +26 -0
- package/dist/builtin/workflows/builtin/goal-models.ts +72 -0
- package/dist/builtin/workflows/builtin/goal-runner.ts +2 -64
- package/dist/builtin/workflows/builtin/index.d.ts +44 -0
- package/dist/builtin/workflows/builtin/index.ts +6 -0
- package/dist/builtin/workflows/builtin/loop-until-done-prompts.ts +79 -0
- package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +189 -0
- package/dist/builtin/workflows/builtin/loop-until-done.d.ts +34 -0
- package/dist/builtin/workflows/builtin/loop-until-done.ts +31 -0
- package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +6 -1
- package/dist/builtin/workflows/builtin/pattern-artifact-root.ts +28 -0
- package/dist/builtin/workflows/builtin/ralph-models.ts +26 -5
- package/dist/builtin/workflows/builtin/ralph-runner.ts +1 -0
- package/dist/builtin/workflows/builtin/tournament-prompts.ts +79 -0
- package/dist/builtin/workflows/builtin/tournament-runner.ts +188 -0
- package/dist/builtin/workflows/builtin/tournament.d.ts +33 -0
- package/dist/builtin/workflows/builtin/tournament.ts +34 -0
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/src/authoring.d.ts +2 -6
- package/dist/builtin/workflows/src/durable/backend.ts +163 -120
- package/dist/builtin/workflows/src/durable/completed-catalog.ts +37 -64
- package/dist/builtin/workflows/src/durable/completed-inspection.ts +4 -72
- package/dist/builtin/workflows/src/durable/dbos-backend.ts +242 -195
- package/dist/builtin/workflows/src/durable/dbos-embedded-postgres.ts +207 -0
- package/dist/builtin/workflows/src/durable/dbos-envelope.ts +42 -42
- package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +155 -0
- package/dist/builtin/workflows/src/durable/dbos-local-postgres.ts +126 -0
- package/dist/builtin/workflows/src/durable/dbos-metadata.ts +105 -58
- package/dist/builtin/workflows/src/durable/dbos-prompt-reservations.ts +320 -0
- package/dist/builtin/workflows/src/durable/dbos-sdk-handle.ts +161 -0
- package/dist/builtin/workflows/src/durable/dbos-status-transition.ts +62 -0
- package/dist/builtin/workflows/src/durable/dbos-tombstone.ts +2 -2
- package/dist/builtin/workflows/src/durable/durable-hash.ts +20 -0
- package/dist/builtin/workflows/src/durable/factory.ts +23 -83
- package/dist/builtin/workflows/src/durable/format-version.ts +4 -10
- package/dist/builtin/workflows/src/durable/index.ts +16 -20
- package/dist/builtin/workflows/src/durable/local-command.ts +63 -0
- package/dist/builtin/workflows/src/durable/prompt-reservation-state.ts +177 -0
- package/dist/builtin/workflows/src/durable/prompt-reservations.ts +36 -0
- package/dist/builtin/workflows/src/durable/resume-catalog.ts +2 -200
- package/dist/builtin/workflows/src/durable/resume-eligibility.ts +42 -2
- package/dist/builtin/workflows/src/durable/resume-runtime.ts +121 -118
- package/dist/builtin/workflows/src/durable/retention-policy.ts +42 -0
- package/dist/builtin/workflows/src/durable/run-timing.ts +98 -0
- package/dist/builtin/workflows/src/durable/scoped-backend.ts +62 -14
- package/dist/builtin/workflows/src/durable/stage-primitive.ts +15 -2
- package/dist/builtin/workflows/src/durable/tool-primitive.ts +11 -7
- package/dist/builtin/workflows/src/durable/types.ts +25 -18
- package/dist/builtin/workflows/src/durable/ui-primitive.ts +117 -29
- package/dist/builtin/workflows/src/durable/workflow-status-transition.ts +30 -0
- package/dist/builtin/workflows/src/engine/primitives/parallel.ts +20 -5
- package/dist/builtin/workflows/src/engine/primitives/task.ts +3 -2
- package/dist/builtin/workflows/src/engine/primitives/ui.ts +6 -3
- package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +14 -22
- package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +14 -14
- package/dist/builtin/workflows/src/engine/run.ts +35 -37
- package/dist/builtin/workflows/src/engine/runtime.ts +3 -0
- package/dist/builtin/workflows/src/engine/workflow-activity.ts +9 -0
- package/dist/builtin/workflows/src/extension/completed-stage-intercom-ask.ts +155 -0
- package/dist/builtin/workflows/src/extension/config-file-loader.ts +13 -0
- package/dist/builtin/workflows/src/extension/config-loader.ts +20 -0
- package/dist/builtin/workflows/src/extension/dispatcher.ts +56 -17
- package/dist/builtin/workflows/src/extension/extension-factory.ts +13 -10
- package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +37 -59
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +16 -18
- package/dist/builtin/workflows/src/extension/lifecycle-notification-delivery.ts +83 -0
- package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +80 -41
- package/dist/builtin/workflows/src/extension/postmortem-deps.ts +73 -0
- package/dist/builtin/workflows/src/extension/public-types.ts +11 -51
- package/dist/builtin/workflows/src/extension/render-call.ts +3 -9
- package/dist/builtin/workflows/src/extension/render-result.ts +22 -7
- package/dist/builtin/workflows/src/extension/runtime-active-block-claim.ts +78 -0
- package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +50 -29
- package/dist/builtin/workflows/src/extension/runtime.ts +70 -219
- package/dist/builtin/workflows/src/extension/ui-surface.ts +107 -3
- package/dist/builtin/workflows/src/extension/wiring.ts +76 -7
- package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +10 -5
- package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +27 -5
- package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +49 -19
- package/dist/builtin/workflows/src/extension/workflow-prompts.ts +8 -8
- package/dist/builtin/workflows/src/extension/workflow-resume-picker-rows.ts +81 -0
- package/dist/builtin/workflows/src/extension/workflow-resume-shadow.ts +55 -0
- package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +193 -145
- package/dist/builtin/workflows/src/extension/workflow-schema.ts +9 -133
- package/dist/builtin/workflows/src/extension/workflow-status-summary.ts +189 -0
- package/dist/builtin/workflows/src/extension/workflow-targets.ts +1 -1
- package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +78 -3
- package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +185 -89
- package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +92 -11
- package/dist/builtin/workflows/src/extension/workflow-tool.ts +18 -24
- package/dist/builtin/workflows/src/runs/background/durable-resume-transition.ts +63 -0
- package/dist/builtin/workflows/src/runs/background/quit.ts +139 -29
- package/dist/builtin/workflows/src/runs/background/resume-acknowledgements.ts +97 -0
- package/dist/builtin/workflows/src/runs/background/run-inspect.ts +111 -0
- package/dist/builtin/workflows/src/runs/background/runner.ts +46 -17
- package/dist/builtin/workflows/src/runs/background/startup-admission.ts +77 -0
- package/dist/builtin/workflows/src/runs/background/status.ts +133 -224
- package/dist/builtin/workflows/src/runs/background/workflow-lifecycle-aggregate.ts +44 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +57 -256
- package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +7 -4
- package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +12 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +39 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-queued-user-message.ts +75 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +44 -12
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +63 -12
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +30 -4
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +3 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +4 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +0 -67
- package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +6 -0
- package/dist/builtin/workflows/src/runs/foreground/executor.ts +0 -1
- package/dist/builtin/workflows/src/runs/foreground/postmortem-stage-chat.ts +169 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +38 -1
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-candidate.ts +21 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +21 -3
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +85 -84
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-message-admission.ts +195 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +12 -5
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-replacement.ts +42 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-send-user-message.ts +100 -8
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-session-options.ts +51 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-session.ts +19 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +28 -2
- package/dist/builtin/workflows/src/runs/shared/prompt-callsite.ts +4 -6
- package/dist/builtin/workflows/src/runs/shared/worktree-git-runner.ts +89 -0
- package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +29 -133
- package/dist/builtin/workflows/src/runs/shared/worktree-post-create.ts +130 -0
- package/dist/builtin/workflows/src/runs/shared/worktree-root.ts +84 -0
- package/dist/builtin/workflows/src/runs/shared/worktree-setup.ts +77 -63
- package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +4 -0
- package/dist/builtin/workflows/src/sdk-surface.ts +1 -1
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +29 -22
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +26 -24
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +5 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +5 -0
- package/dist/builtin/workflows/src/shared/intercom-group.ts +51 -0
- package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +6 -0
- package/dist/builtin/workflows/src/shared/persistence-restore.ts +4 -0
- package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +3 -0
- package/dist/builtin/workflows/src/shared/prompt-callsite-context.ts +13 -0
- package/dist/builtin/workflows/src/shared/returned-run-status.ts +2 -1
- package/dist/builtin/workflows/src/shared/session-transcript.ts +74 -0
- package/dist/builtin/workflows/src/shared/store-stage-methods.ts +1 -0
- package/dist/builtin/workflows/src/shared/store-types.ts +8 -0
- package/dist/builtin/workflows/src/shared/timing.ts +4 -1
- package/dist/builtin/workflows/src/shared/types.ts +2 -6
- package/dist/builtin/workflows/src/tui/chat-surface-message.ts +2 -42
- package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +2 -2
- package/dist/builtin/workflows/src/tui/graph-view-constants.ts +7 -3
- package/dist/builtin/workflows/src/tui/graph-view-input.ts +29 -67
- package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +15 -10
- package/dist/builtin/workflows/src/tui/graph-view-state.ts +0 -2
- package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -9
- package/dist/builtin/workflows/src/tui/host-input-form.ts +62 -0
- package/dist/builtin/workflows/src/tui/mouse-input.ts +63 -0
- package/dist/builtin/workflows/src/tui/node-card.ts +1 -0
- package/dist/builtin/workflows/src/tui/overlay-adapter.ts +67 -42
- package/dist/builtin/workflows/src/tui/overlay-terminal-modes.ts +49 -0
- package/dist/builtin/workflows/src/tui/session-overlays.ts +3 -104
- package/dist/builtin/workflows/src/tui/session-picker.ts +3 -12
- package/dist/builtin/workflows/src/tui/stage-chat-composer-drafts.ts +19 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +30 -10
- package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +19 -9
- package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +25 -38
- package/dist/builtin/workflows/src/tui/stage-chat-view-render-helpers.ts +1 -1
- package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +7 -6
- package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +7 -1
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +3 -1
- package/dist/builtin/workflows/src/tui/store-widget-installer.ts +19 -20
- package/dist/builtin/workflows/src/tui/switcher.ts +4 -4
- package/dist/builtin/workflows/src/tui/widget.ts +46 -33
- package/dist/builtin/workflows/src/tui/workflow-attach-pane-handle.ts +26 -0
- package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +14 -2
- package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +26 -27
- package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +208 -69
- package/dist/bun/cli.js +3 -0
- package/dist/bun/cli.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +3 -0
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.js +19 -2
- package/dist/core/agent-session-auto-compaction.js.map +1 -1
- package/dist/core/agent-session-compaction.js +2 -2
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-events.js +5 -3
- package/dist/core/agent-session-events.js.map +1 -1
- package/dist/core/agent-session-export.js +1 -1
- package/dist/core/agent-session-export.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts +2 -4
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +9 -2
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-message-queue.d.ts +6 -0
- package/dist/core/agent-session-message-queue.d.ts.map +1 -1
- package/dist/core/agent-session-message-queue.js +107 -36
- package/dist/core/agent-session-message-queue.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +18 -7
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-models.d.ts +3 -1
- package/dist/core/agent-session-models.d.ts.map +1 -1
- package/dist/core/agent-session-models.js +1 -1
- package/dist/core/agent-session-models.js.map +1 -1
- package/dist/core/agent-session-post-tool-compaction.d.ts +16 -0
- package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -0
- package/dist/core/agent-session-post-tool-compaction.js +113 -0
- package/dist/core/agent-session-post-tool-compaction.js.map +1 -0
- package/dist/core/agent-session-prompt.d.ts +12 -1
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +22 -5
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +3 -0
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
- package/dist/core/agent-session-tool-hooks.js +21 -0
- package/dist/core/agent-session-tool-hooks.js.map +1 -1
- package/dist/core/agent-session-tree.d.ts.map +1 -1
- package/dist/core/agent-session-tree.js +2 -1
- package/dist/core/agent-session-tree.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +7 -0
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +6 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +18 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/async/job-manager.d.ts +1 -0
- package/dist/core/async/job-manager.d.ts.map +1 -1
- package/dist/core/async/job-manager.js +29 -5
- package/dist/core/async/job-manager.js.map +1 -1
- package/dist/core/async/session-manager.d.ts +2 -4
- package/dist/core/async/session-manager.d.ts.map +1 -1
- package/dist/core/async/session-manager.js +5 -32
- package/dist/core/async/session-manager.js.map +1 -1
- package/dist/core/atomic-guide-command.d.ts.map +1 -1
- package/dist/core/atomic-guide-command.js +2 -0
- package/dist/core/atomic-guide-command.js.map +1 -1
- package/dist/core/auth-storage.d.ts +20 -10
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +151 -92
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/callback-activity.d.ts +27 -0
- package/dist/core/callback-activity.d.ts.map +1 -0
- package/dist/core/callback-activity.js +44 -0
- package/dist/core/callback-activity.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +4 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +4 -3
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction-boundary.d.ts +1 -1
- package/dist/core/compaction/compaction-boundary.d.ts.map +1 -1
- package/dist/core/compaction/compaction-boundary.js +10 -23
- package/dist/core/compaction/compaction-boundary.js.map +1 -1
- package/dist/core/compaction/compaction-runner.d.ts +4 -1
- package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
- package/dist/core/compaction/compaction-runner.js +1 -1
- package/dist/core/compaction/compaction-runner.js.map +1 -1
- package/dist/core/compaction/compaction-types.d.ts +3 -2
- package/dist/core/compaction/compaction-types.d.ts.map +1 -1
- package/dist/core/compaction/compaction-types.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +6 -6
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +12 -9
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/index.d.ts +1 -0
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/index.js +1 -0
- package/dist/core/compaction/index.js.map +1 -1
- package/dist/core/compaction/range-planner-diagnostics.d.ts +101 -0
- package/dist/core/compaction/range-planner-diagnostics.d.ts.map +1 -0
- package/dist/core/compaction/range-planner-diagnostics.js +116 -0
- package/dist/core/compaction/range-planner-diagnostics.js.map +1 -0
- package/dist/core/compaction/range-planner.d.ts +13 -3
- package/dist/core/compaction/range-planner.d.ts.map +1 -1
- package/dist/core/compaction/range-planner.js +117 -68
- package/dist/core/compaction/range-planner.js.map +1 -1
- package/dist/core/compaction/truncated-range-recovery.d.ts +47 -0
- package/dist/core/compaction/truncated-range-recovery.d.ts.map +1 -0
- package/dist/core/compaction/truncated-range-recovery.js +112 -0
- package/dist/core/compaction/truncated-range-recovery.js.map +1 -0
- package/dist/core/extensions/api-types.d.ts +2 -2
- package/dist/core/extensions/api-types.d.ts.map +1 -1
- package/dist/core/extensions/api-types.js.map +1 -1
- package/dist/core/extensions/context-types.d.ts +23 -1
- 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 +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader-api.js +2 -2
- package/dist/core/extensions/loader-api.js.map +1 -1
- package/dist/core/extensions/loader-core.d.ts.map +1 -1
- package/dist/core/extensions/loader-core.js +8 -1
- package/dist/core/extensions/loader-core.js.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +9 -6
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/extensions/message-types.d.ts +17 -0
- package/dist/core/extensions/message-types.d.ts.map +1 -1
- package/dist/core/extensions/message-types.js.map +1 -1
- package/dist/core/extensions/provider-types.d.ts +3 -0
- package/dist/core/extensions/provider-types.d.ts.map +1 -1
- package/dist/core/extensions/provider-types.js.map +1 -1
- package/dist/core/extensions/runner-events.d.ts.map +1 -1
- package/dist/core/extensions/runner-events.js +11 -10
- package/dist/core/extensions/runner-events.js.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts +2 -2
- package/dist/core/extensions/runtime-types.d.ts.map +1 -1
- package/dist/core/extensions/runtime-types.js.map +1 -1
- package/dist/core/extensions/ui-types.d.ts +78 -0
- package/dist/core/extensions/ui-types.d.ts.map +1 -1
- package/dist/core/extensions/ui-types.js.map +1 -1
- package/dist/core/model-registry-auth.d.ts +2 -1
- package/dist/core/model-registry-auth.d.ts.map +1 -1
- package/dist/core/model-registry-auth.js +25 -6
- package/dist/core/model-registry-auth.js.map +1 -1
- package/dist/core/model-registry-builtins.d.ts +3 -2
- package/dist/core/model-registry-builtins.d.ts.map +1 -1
- package/dist/core/model-registry-builtins.js +12 -6
- package/dist/core/model-registry-builtins.js.map +1 -1
- package/dist/core/model-registry-dynamic.d.ts +1 -0
- package/dist/core/model-registry-dynamic.d.ts.map +1 -1
- package/dist/core/model-registry-dynamic.js +53 -13
- package/dist/core/model-registry-dynamic.js.map +1 -1
- package/dist/core/model-registry-loader.d.ts +2 -1
- package/dist/core/model-registry-loader.d.ts.map +1 -1
- package/dist/core/model-registry-loader.js +2 -2
- package/dist/core/model-registry-loader.js.map +1 -1
- package/dist/core/model-registry-types.d.ts +10 -3
- package/dist/core/model-registry-types.d.ts.map +1 -1
- package/dist/core/model-registry-types.js.map +1 -1
- package/dist/core/model-registry.d.ts +15 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +214 -30
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/models-store.d.ts +25 -0
- package/dist/core/models-store.d.ts.map +1 -0
- package/dist/core/models-store.js +73 -0
- package/dist/core/models-store.js.map +1 -0
- package/dist/core/oauth-compat.d.ts +17 -0
- package/dist/core/oauth-compat.d.ts.map +1 -0
- package/dist/core/oauth-compat.js +2 -0
- package/dist/core/oauth-compat.js.map +1 -0
- package/dist/core/oauth-provider-bridge.d.ts +40 -0
- package/dist/core/oauth-provider-bridge.d.ts.map +1 -0
- package/dist/core/oauth-provider-bridge.js +169 -0
- package/dist/core/oauth-provider-bridge.js.map +1 -0
- package/dist/core/output-guard.d.ts +2 -0
- package/dist/core/output-guard.d.ts.map +1 -1
- package/dist/core/output-guard.js +14 -0
- package/dist/core/output-guard.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts +5 -0
- package/dist/core/remote-catalog-provider.d.ts.map +1 -0
- package/dist/core/remote-catalog-provider.js +138 -0
- package/dist/core/remote-catalog-provider.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +8 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-core.d.ts +1 -1
- package/dist/core/session-manager-core.d.ts.map +1 -1
- package/dist/core/session-manager-core.js +1 -1
- package/dist/core/session-manager-core.js.map +1 -1
- package/dist/core/session-manager-entries.d.ts +1 -1
- package/dist/core/session-manager-entries.d.ts.map +1 -1
- package/dist/core/session-manager-entries.js.map +1 -1
- package/dist/core/session-manager-history.d.ts +2 -2
- package/dist/core/session-manager-history.js +2 -2
- package/dist/core/session-manager-history.js.map +1 -1
- package/dist/core/session-manager-list.d.ts.map +1 -1
- package/dist/core/session-manager-list.js +65 -23
- package/dist/core/session-manager-list.js.map +1 -1
- package/dist/core/session-manager-types.d.ts +3 -2
- package/dist/core/session-manager-types.d.ts.map +1 -1
- package/dist/core/session-manager-types.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +9 -5
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +2 -3
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/find.js +2 -2
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.js +2 -2
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.js +2 -2
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +4 -3
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/todos-render.d.ts.map +1 -1
- package/dist/core/tools/todos-render.js +3 -2
- package/dist/core/tools/todos-render.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +3 -2
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/write.js +2 -2
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/workflow-stage-admission.d.ts +29 -0
- package/dist/core/workflow-stage-admission.d.ts.map +1 -0
- package/dist/core/workflow-stage-admission.js +81 -0
- package/dist/core/workflow-stage-admission.js.map +1 -0
- package/dist/index-extensions.d.ts +1 -1
- package/dist/index-extensions.d.ts.map +1 -1
- package/dist/index-extensions.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/main-types.d.ts +13 -0
- package/dist/main-types.d.ts.map +1 -0
- package/dist/main-types.js +2 -0
- package/dist/main-types.js.map +1 -0
- package/dist/main.d.ts +2 -5
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +25 -17
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +17 -12
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/atomic-banner.d.ts +7 -0
- package/dist/modes/interactive/components/atomic-banner.d.ts.map +1 -1
- package/dist/modes/interactive/components/atomic-banner.js +20 -0
- package/dist/modes/interactive/components/atomic-banner.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +5 -3
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +3 -4
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.d.ts +4 -0
- package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.js +4 -0
- package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.js +79 -8
- package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.js +4 -2
- package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.d.ts +1 -0
- package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.js +4 -1
- package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.js +3 -4
- package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
- package/dist/modes/interactive/components/host-input-form-mount.d.ts +14 -0
- package/dist/modes/interactive/components/host-input-form-mount.d.ts.map +1 -0
- package/dist/modes/interactive/components/host-input-form-mount.js +79 -0
- package/dist/modes/interactive/components/host-input-form-mount.js.map +1 -0
- package/dist/modes/interactive/components/host-input-form.d.ts +52 -0
- package/dist/modes/interactive/components/host-input-form.d.ts.map +1 -0
- package/dist/modes/interactive/components/host-input-form.js +278 -0
- package/dist/modes/interactive/components/host-input-form.js.map +1 -0
- package/dist/modes/interactive/components/host-session-picker.d.ts +46 -0
- package/dist/modes/interactive/components/host-session-picker.d.ts.map +1 -0
- package/dist/modes/interactive/components/host-session-picker.js +183 -0
- package/dist/modes/interactive/components/host-session-picker.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +2 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +12 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +3 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +8 -2
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +7 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +57 -10
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +15 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +35 -3
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +3 -2
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +9 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.js +24 -10
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-login.js +7 -1
- package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-routing.js +3 -3
- package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.js +49 -0
- package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/dist/modes/interactive/interactive-bash-compact.js +2 -0
- package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-context.js +14 -0
- package/dist/modes/interactive/interactive-extension-context.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-global-clear.d.ts +13 -0
- package/dist/modes/interactive/interactive-global-clear.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-global-clear.js +11 -0
- package/dist/modes/interactive/interactive-global-clear.js.map +1 -0
- package/dist/modes/interactive/interactive-input-handling.js +17 -10
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +6 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +25 -2
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.d.ts +4 -3
- package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.js +2 -2
- package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-helpers.d.ts +4 -1
- package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-helpers.js +14 -1
- package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +3 -2
- 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-types.d.ts +3 -0
- package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.js +7 -4
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-queueing.js +2 -2
- package/dist/modes/interactive/interactive-queueing.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +25 -4
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-session-routing.js +3 -0
- package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-slash-commands.js +5 -2
- package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +22 -9
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-terminal-title.d.ts +6 -0
- package/dist/modes/interactive/interactive-terminal-title.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-terminal-title.js +7 -0
- package/dist/modes/interactive/interactive-terminal-title.js.map +1 -0
- package/dist/modes/interactive-engine/activity-watchdog.d.ts +45 -0
- package/dist/modes/interactive-engine/activity-watchdog.d.ts.map +1 -0
- package/dist/modes/interactive-engine/activity-watchdog.js +74 -0
- package/dist/modes/interactive-engine/activity-watchdog.js.map +1 -0
- package/dist/modes/interactive-engine/create-isolated-runtime.d.ts +14 -0
- package/dist/modes/interactive-engine/create-isolated-runtime.d.ts.map +1 -0
- package/dist/modes/interactive-engine/create-isolated-runtime.js +56 -0
- package/dist/modes/interactive-engine/create-isolated-runtime.js.map +1 -0
- package/dist/modes/interactive-engine/engine-args.d.ts +10 -0
- package/dist/modes/interactive-engine/engine-args.d.ts.map +1 -0
- package/dist/modes/interactive-engine/engine-args.js +55 -0
- package/dist/modes/interactive-engine/engine-args.js.map +1 -0
- package/dist/modes/interactive-engine/engine-child-liveness.d.ts +7 -0
- package/dist/modes/interactive-engine/engine-child-liveness.d.ts.map +1 -0
- package/dist/modes/interactive-engine/engine-child-liveness.js +50 -0
- package/dist/modes/interactive-engine/engine-child-liveness.js.map +1 -0
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts +47 -0
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -0
- package/dist/modes/interactive-engine/engine-custom-ui.js +276 -0
- package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -0
- package/dist/modes/interactive-engine/engine-input-form.d.ts +13 -0
- package/dist/modes/interactive-engine/engine-input-form.d.ts.map +1 -0
- package/dist/modes/interactive-engine/engine-input-form.js +49 -0
- package/dist/modes/interactive-engine/engine-input-form.js.map +1 -0
- package/dist/modes/interactive-engine/engine-monitor.d.ts +18 -0
- package/dist/modes/interactive-engine/engine-monitor.d.ts.map +1 -0
- package/dist/modes/interactive-engine/engine-monitor.js +63 -0
- package/dist/modes/interactive-engine/engine-monitor.js.map +1 -0
- package/dist/modes/interactive-engine/engine-render-service.d.ts +17 -0
- package/dist/modes/interactive-engine/engine-render-service.d.ts.map +1 -0
- package/dist/modes/interactive-engine/engine-render-service.js +150 -0
- package/dist/modes/interactive-engine/engine-render-service.js.map +1 -0
- package/dist/modes/interactive-engine/engine-session-picker.d.ts +22 -0
- package/dist/modes/interactive-engine/engine-session-picker.d.ts.map +1 -0
- package/dist/modes/interactive-engine/engine-session-picker.js +106 -0
- package/dist/modes/interactive-engine/engine-session-picker.js.map +1 -0
- package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +23 -0
- package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -0
- package/dist/modes/interactive-engine/extension-ui-bridge.js +126 -0
- package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -0
- package/dist/modes/interactive-engine/input-form-host.d.ts +15 -0
- package/dist/modes/interactive-engine/input-form-host.d.ts.map +1 -0
- package/dist/modes/interactive-engine/input-form-host.js +44 -0
- package/dist/modes/interactive-engine/input-form-host.js.map +1 -0
- package/dist/modes/interactive-engine/isolated-runtime.d.ts +75 -0
- package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -0
- package/dist/modes/interactive-engine/isolated-runtime.js +448 -0
- package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -0
- package/dist/modes/interactive-engine/protocol.d.ts +184 -0
- package/dist/modes/interactive-engine/protocol.d.ts.map +1 -0
- package/dist/modes/interactive-engine/protocol.js +254 -0
- package/dist/modes/interactive-engine/protocol.js.map +1 -0
- package/dist/modes/interactive-engine/remote-command-catalog.d.ts +33 -0
- package/dist/modes/interactive-engine/remote-command-catalog.d.ts.map +1 -0
- package/dist/modes/interactive-engine/remote-command-catalog.js +51 -0
- package/dist/modes/interactive-engine/remote-command-catalog.js.map +1 -0
- package/dist/modes/interactive-engine/remote-component.d.ts +16 -0
- package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -0
- package/dist/modes/interactive-engine/remote-component.js +209 -0
- package/dist/modes/interactive-engine/remote-component.js.map +1 -0
- package/dist/modes/interactive-engine/remote-frame-clamp.d.ts +25 -0
- package/dist/modes/interactive-engine/remote-frame-clamp.d.ts.map +1 -0
- package/dist/modes/interactive-engine/remote-frame-clamp.js +43 -0
- package/dist/modes/interactive-engine/remote-frame-clamp.js.map +1 -0
- package/dist/modes/interactive-engine/remote-renderer.d.ts +59 -0
- package/dist/modes/interactive-engine/remote-renderer.d.ts.map +1 -0
- package/dist/modes/interactive-engine/remote-renderer.js +123 -0
- package/dist/modes/interactive-engine/remote-renderer.js.map +1 -0
- package/dist/modes/interactive-engine/session-picker-host.d.ts +25 -0
- package/dist/modes/interactive-engine/session-picker-host.d.ts.map +1 -0
- package/dist/modes/interactive-engine/session-picker-host.js +75 -0
- package/dist/modes/interactive-engine/session-picker-host.js.map +1 -0
- package/dist/modes/interactive-engine/terminal-mode-controller.d.ts +43 -0
- package/dist/modes/interactive-engine/terminal-mode-controller.d.ts.map +1 -0
- package/dist/modes/interactive-engine/terminal-mode-controller.js +109 -0
- package/dist/modes/interactive-engine/terminal-mode-controller.js.map +1 -0
- package/dist/modes/rpc/bounded-writer.d.ts +27 -0
- package/dist/modes/rpc/bounded-writer.d.ts.map +1 -0
- package/dist/modes/rpc/bounded-writer.js +103 -0
- package/dist/modes/rpc/bounded-writer.js.map +1 -0
- package/dist/modes/rpc/jsonl.d.ts +15 -12
- package/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/dist/modes/rpc/jsonl.js +102 -28
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/modes/rpc/rpc-client-api.d.ts +83 -0
- package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client-api.js +64 -0
- package/dist/modes/rpc/rpc-client-api.js.map +1 -0
- package/dist/modes/rpc/rpc-client-process.d.ts +19 -0
- package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client-process.js +79 -0
- package/dist/modes/rpc/rpc-client-process.js.map +1 -0
- package/dist/modes/rpc/rpc-client-waits.d.ts +8 -0
- package/dist/modes/rpc/rpc-client-waits.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client-waits.js +33 -0
- package/dist/modes/rpc/rpc-client-waits.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +48 -124
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +295 -249
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts +5 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.js +79 -3
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-event-buffer.d.ts +11 -0
- package/dist/modes/rpc/rpc-event-buffer.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-event-buffer.js +30 -0
- package/dist/modes/rpc/rpc-event-buffer.js.map +1 -0
- package/dist/modes/rpc/rpc-extension-ui.d.ts +7 -1
- package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-extension-ui.js +54 -32
- package/dist/modes/rpc/rpc-extension-ui.js.map +1 -1
- package/dist/modes/rpc/rpc-input-scheduler.d.ts +16 -0
- package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-input-scheduler.js +69 -0
- package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -0
- package/dist/modes/rpc/rpc-input.d.ts +2 -1
- package/dist/modes/rpc/rpc-input.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-input.js +4 -9
- package/dist/modes/rpc/rpc-input.js.map +1 -1
- package/dist/modes/rpc/rpc-keybindings-reload.d.ts +27 -0
- package/dist/modes/rpc/rpc-keybindings-reload.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-keybindings-reload.js +69 -0
- package/dist/modes/rpc/rpc-keybindings-reload.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +63 -8
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-output-buffer.d.ts +10 -0
- package/dist/modes/rpc/rpc-output-buffer.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-output-buffer.js +70 -0
- package/dist/modes/rpc/rpc-output-buffer.js.map +1 -0
- package/dist/modes/rpc/rpc-session-binding.d.ts +16 -1
- package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-session-binding.js +16 -3
- package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +109 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli-parser.d.ts +2 -0
- package/dist/package-manager-cli-parser.d.ts.map +1 -1
- package/dist/package-manager-cli-parser.js +24 -5
- package/dist/package-manager-cli-parser.js.map +1 -1
- package/dist/package-manager-cli.d.ts +7 -0
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +65 -1
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/shell.d.ts +1 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +46 -0
- package/dist/utils/shell.js.map +1 -1
- package/docs/changelog.mdx +11 -0
- package/docs/compaction.md +53 -17
- package/docs/custom-provider.md +24 -5
- package/docs/development.md +9 -7
- package/docs/docs.json +1 -0
- package/docs/extensions.md +30 -16
- package/docs/intercom.md +489 -0
- package/docs/json.md +1 -1
- package/docs/keybindings.md +1 -1
- package/docs/packages.md +1 -0
- package/docs/quickstart.md +11 -5
- package/docs/rpc.md +9 -7
- package/docs/sdk.md +6 -0
- package/docs/session-format.md +7 -6
- package/docs/sessions.md +4 -2
- package/docs/settings.md +2 -2
- package/docs/subagents.md +7 -2
- package/docs/tui.md +61 -2
- package/docs/usage.md +6 -5
- package/docs/workflows.md +2572 -1379
- package/examples/extensions/handoff.ts +1 -1
- package/examples/extensions/qna.ts +1 -1
- package/examples/extensions/summarize.ts +1 -1
- package/npm-shrinkwrap.json +225 -76
- package/package.json +7 -6
- package/dist/builtin/workflows/src/durable/file-backend.ts +0 -439
- package/dist/builtin/workflows/src/durable/file-lock.ts +0 -153
- package/dist/builtin/workflows/src/durable/file-state.ts +0 -104
- package/dist/builtin/workflows/src/extension/runtime-direct.ts +0 -96
- package/dist/builtin/workflows/src/extension/workflow-tool-helpers.ts +0 -66
- package/dist/builtin/workflows/src/runs/foreground/executor-direct-output.ts +0 -91
- package/dist/builtin/workflows/src/runs/foreground/executor-direct.ts +0 -282
- package/dist/builtin/workflows/src/shared/resumable-workflow-notices.ts +0 -43
- package/dist/builtin/workflows/src/tui/session-confirm.ts +0 -299
|
@@ -3,22 +3,24 @@ import { quitAllRuns } from "../runs/background/quit.js";
|
|
|
3
3
|
import { cancellationRegistry } from "../runs/background/cancellation-registry.js";
|
|
4
4
|
import { stageControlRegistry } from "../runs/foreground/stage-control-registry.js";
|
|
5
5
|
import { store } from "../shared/store.js";
|
|
6
|
-
import { restoreOnSessionStart } from "../shared/persistence-restore.js";
|
|
7
|
-
import { findResumableWorkflowNotices } from "../shared/resumable-workflow-notices.js";
|
|
8
6
|
import { installCompactionHook } from "../shared/persistence-compaction-policy.js";
|
|
9
7
|
import { clearForms } from "../tui/inline-form-store.js";
|
|
10
8
|
import { installStoreWidget } from "../tui/store-widget-installer.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
resetWorkflowLifecycleNotificationState,
|
|
14
|
-
seedWorkflowLifecycleNotificationState,
|
|
15
|
-
withWorkflowLifecycleNotificationsSuppressed,
|
|
16
|
-
} from "./lifecycle-notifications.js";
|
|
9
|
+
import { resetWorkflowLifecycleNotificationState } from "./lifecycle-notifications.js";
|
|
17
10
|
import { resetWorkflowHilAnswerNotificationState } from "./hil-answer-notifications.js";
|
|
18
11
|
import type { ExtensionAPI } from "./public-types.js";
|
|
19
12
|
import type { WorkflowExtensionRuntimeState } from "./extension-runtime-state.js";
|
|
20
13
|
import { deAdvertiseAskUserQuestionWhenHeadless, formatStartupDiagnostics } from "./workflow-command-surfaces.js";
|
|
21
14
|
import { inFlightRunCount } from "./workflow-targets.js";
|
|
15
|
+
import { shutdownDbos } from "../durable/dbos-lifecycle.js";
|
|
16
|
+
|
|
17
|
+
let processShutdownInstalled = false;
|
|
18
|
+
|
|
19
|
+
function installDbosProcessShutdown(): void {
|
|
20
|
+
if (processShutdownInstalled) return;
|
|
21
|
+
processShutdownInstalled = true;
|
|
22
|
+
process.once("beforeExit", () => shutdownDbos());
|
|
23
|
+
}
|
|
22
24
|
|
|
23
25
|
export interface WorkflowLifecycleRegistrationDeps {
|
|
24
26
|
runtimeState: WorkflowExtensionRuntimeState;
|
|
@@ -31,6 +33,7 @@ export function registerWorkflowLifecycleHandlers(
|
|
|
31
33
|
deps: WorkflowLifecycleRegistrationDeps,
|
|
32
34
|
): void {
|
|
33
35
|
if (typeof pi.on !== "function") return;
|
|
36
|
+
installDbosProcessShutdown();
|
|
34
37
|
const { runtimeState } = deps;
|
|
35
38
|
pi.on("session_before_switch", async (event, ctx) => {
|
|
36
39
|
const reason = typeof event === "object" && event !== null && "reason" in event
|
|
@@ -58,7 +61,7 @@ export function registerWorkflowLifecycleHandlers(
|
|
|
58
61
|
return { cancel: true };
|
|
59
62
|
});
|
|
60
63
|
|
|
61
|
-
pi.on("session_start", async (
|
|
64
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
62
65
|
runtimeState.resetWorkflowDiscoveryForSession();
|
|
63
66
|
deAdvertiseAskUserQuestionWhenHeadless(pi, ctx?.hasUI);
|
|
64
67
|
await runtimeState.ensureWorkflowConfigLoaded();
|
|
@@ -68,7 +71,7 @@ export function registerWorkflowLifecycleHandlers(
|
|
|
68
71
|
resetWorkflowLifecycleNotificationState(runtimeState.lifecycleNotificationState);
|
|
69
72
|
resetWorkflowHilAnswerNotificationState(runtimeState.hilAnswerNotificationState);
|
|
70
73
|
stageControlRegistry.clear();
|
|
71
|
-
|
|
74
|
+
// Named workflows publish lifecycle notices through the normal notification path.
|
|
72
75
|
runtimeState.setNotificationsActive(true);
|
|
73
76
|
runtimeState.startWorkflowDiscoveryWarmup(() => {
|
|
74
77
|
if (!ctx?.ui) return;
|
|
@@ -81,70 +84,45 @@ export function registerWorkflowLifecycleHandlers(
|
|
|
81
84
|
deps.storeWidgetRef.current?.();
|
|
82
85
|
deps.storeWidgetRef.current = installStoreWidget({ ui: ctx.ui }, store);
|
|
83
86
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const cfg = runtimeState.configLoadRef.current?.config;
|
|
88
|
-
withWorkflowLifecycleNotificationsSuppressed(runtimeState.lifecycleNotificationState, () => {
|
|
89
|
-
try {
|
|
90
|
-
restoreOnSessionStart(
|
|
91
|
-
sessionManager,
|
|
92
|
-
{
|
|
93
|
-
resumeInFlight: cfg?.resumeInFlight ?? "ask",
|
|
94
|
-
persistRuns: cfg?.persistRuns ?? true,
|
|
95
|
-
},
|
|
96
|
-
store,
|
|
97
|
-
);
|
|
98
|
-
} catch {
|
|
99
|
-
// Host session-entry failures must not prevent the session from starting.
|
|
100
|
-
}
|
|
101
|
-
seedWorkflowLifecycleNotificationState(runtimeState.lifecycleNotificationState, store.snapshot());
|
|
102
|
-
});
|
|
103
|
-
const reason = typeof event === "object" && event !== null && "reason" in event
|
|
104
|
-
? (event as { readonly reason?: string }).reason
|
|
105
|
-
: undefined;
|
|
106
|
-
if (reason === "startup" || reason === "resume") {
|
|
107
|
-
const getEntries = sessionManager.getEntries;
|
|
108
|
-
if (typeof getEntries === "function") {
|
|
109
|
-
let authoritativeCatalog: Awaited<ReturnType<typeof runtimeState.runtimeProxy.prepareDurableResumable>> = [];
|
|
110
|
-
try {
|
|
111
|
-
authoritativeCatalog = await runtimeState.runtimeProxy.prepareDurableResumable();
|
|
112
|
-
} catch {
|
|
113
|
-
// A resume-catalog failure must not prevent the host session from starting.
|
|
114
|
-
}
|
|
115
|
-
try {
|
|
116
|
-
const resumable = findResumableWorkflowNotices(getEntries.call(sessionManager), authoritativeCatalog);
|
|
117
|
-
if (resumable.length > 0) {
|
|
118
|
-
const commands = resumable
|
|
119
|
-
.map((workflow) => `\`${workflow.name}\` (${workflow.workflowId.slice(0, 8)}): /workflow resume ${workflow.workflowId}`)
|
|
120
|
-
.join("\n");
|
|
121
|
-
ctx?.ui?.notify?.(`This session has resumable workflows:\n${commands}`, "info");
|
|
122
|
-
}
|
|
123
|
-
} catch {
|
|
124
|
-
// Host session-entry failures must not prevent the session from starting.
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
87
|
+
// Session JSONL contains chat transcripts only. Workflow state is loaded
|
|
88
|
+
// from DBOS on the first workflow command or run, never during startup.
|
|
89
|
+
runtimeState.updateHostStageSessionDir(ctx?.sessionManager ?? pi.sessionManager);
|
|
129
90
|
});
|
|
130
91
|
|
|
131
92
|
installCompactionHook(pi, store);
|
|
132
|
-
pi.on("session_shutdown", (event) => {
|
|
93
|
+
pi.on("session_shutdown", async (event) => {
|
|
133
94
|
const reason = typeof event === "object" && event !== null && "reason" in event
|
|
134
95
|
? (event as { readonly reason?: string }).reason
|
|
135
96
|
: undefined;
|
|
136
97
|
deps.intercomControlRef.current?.();
|
|
137
98
|
deps.intercomControlRef.current = null;
|
|
138
99
|
if (reason === "quit") {
|
|
139
|
-
// CLI/orchestrator quit is a resumable process boundary, not
|
|
140
|
-
//
|
|
100
|
+
// CLI/orchestrator quit is a resumable process boundary, not destructive
|
|
101
|
+
// cancellation. Durable-progress workflows stay available through
|
|
141
102
|
// `/workflow resume`; stage handles are disposed after being paused.
|
|
142
|
-
|
|
103
|
+
try {
|
|
104
|
+
const results = await quitAllRuns({ store, stageControlRegistry });
|
|
105
|
+
const failures = results.filter((result) => !result.ok);
|
|
106
|
+
if (failures.length > 0) {
|
|
107
|
+
console.error(
|
|
108
|
+
"atomic-workflows: session shutdown could not gracefully quit every run:",
|
|
109
|
+
failures.map((result) =>
|
|
110
|
+
`${result.runId}: ${result.reason}${"message" in result ? ` (${result.message})` : ""}`
|
|
111
|
+
).join(", "),
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
} finally {
|
|
115
|
+
stageControlRegistry.clear();
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
// Every non-quit host-session boundary invalidates detached lazy handles
|
|
119
|
+
// synchronously, before they can attach to the replacement session.
|
|
143
120
|
stageControlRegistry.clear();
|
|
144
121
|
}
|
|
145
122
|
deps.storeWidgetRef.current?.();
|
|
146
123
|
deps.storeWidgetRef.current = null;
|
|
147
124
|
runtimeState.resetWorkflowDiscoveryForSession();
|
|
148
125
|
runtimeState.setNotificationsActive(false);
|
|
126
|
+
await shutdownDbos();
|
|
149
127
|
});
|
|
150
128
|
}
|
|
@@ -58,13 +58,15 @@ export interface WorkflowExtensionRuntimeState {
|
|
|
58
58
|
startWorkflowDiscoveryWarmup(onSettled?: () => void): void;
|
|
59
59
|
runWithLifecycleSuppressedForPolicy<T>(policy: WorkflowExecutionPolicy, fn: () => Promise<T>): Promise<T>;
|
|
60
60
|
setNotificationsActive(active: boolean): void;
|
|
61
|
-
setIntercomParentSession(session: string | null): void;
|
|
62
61
|
updateHostStageSessionDir(sessionManager: SessionManager | undefined): void;
|
|
62
|
+
/** Current default stage session directory, when the host set a non-default one. */
|
|
63
|
+
resolveDefaultStageSessionDir(): string | undefined;
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
export function createWorkflowExtensionRuntimeState(
|
|
66
67
|
pi: ExtensionAPI,
|
|
67
68
|
adapters: StageAdapters,
|
|
69
|
+
resolveCwd: () => string = () => pi.sessionManager?.getCwd?.() ?? process.cwd(),
|
|
68
70
|
): WorkflowExtensionRuntimeState {
|
|
69
71
|
const persistenceRef = { current: makePersistencePort(pi, WORKFLOW_CONFIG_DEFAULTS.persistRuns) };
|
|
70
72
|
const mcpPort = makeMcpPort(pi);
|
|
@@ -75,6 +77,7 @@ export function createWorkflowExtensionRuntimeState(
|
|
|
75
77
|
persistRuns: WORKFLOW_CONFIG_DEFAULTS.persistRuns,
|
|
76
78
|
statusFile: WORKFLOW_CONFIG_DEFAULTS.statusFile,
|
|
77
79
|
resumeInFlight: WORKFLOW_CONFIG_DEFAULTS.resumeInFlight,
|
|
80
|
+
worktree: WORKFLOW_CONFIG_DEFAULTS.worktree,
|
|
78
81
|
},
|
|
79
82
|
};
|
|
80
83
|
let statusWriterRef: StatusWriter = createStatusWriter(store, runtimeConfigRef.current);
|
|
@@ -119,25 +122,17 @@ export function createWorkflowExtensionRuntimeState(
|
|
|
119
122
|
});
|
|
120
123
|
};
|
|
121
124
|
|
|
122
|
-
let intercomParentSession: string | null = null;
|
|
123
|
-
const intercomPort = {
|
|
124
|
-
emit: typeof pi.events?.emit === "function"
|
|
125
|
-
? (event: string, payload: Record<string, unknown>) => pi.events!.emit!(event, payload)
|
|
126
|
-
: undefined,
|
|
127
|
-
parentSession: () => intercomParentSession ?? undefined,
|
|
128
|
-
};
|
|
129
125
|
const hostStageSessionDir: { current: string | undefined } = { current: undefined };
|
|
130
126
|
const resolveDefaultStageSessionDir = (): string | undefined => hostStageSessionDir.current;
|
|
131
127
|
const startupDiscovery = discoverStartupWorkflowsSync();
|
|
132
128
|
const runtimeRef: { current: ExtensionRuntime } = {
|
|
133
129
|
current: createExtensionRuntime({
|
|
134
130
|
registry: startupDiscovery.registry,
|
|
135
|
-
cwd:
|
|
131
|
+
cwd: resolveCwd(),
|
|
136
132
|
adapters,
|
|
137
133
|
cancellation: cancellationRegistry,
|
|
138
134
|
persistence: persistenceRef.current,
|
|
139
135
|
mcp: mcpPort,
|
|
140
|
-
intercom: intercomPort,
|
|
141
136
|
config: runtimeConfigRef.current,
|
|
142
137
|
resolveDefaultStageSessionDir,
|
|
143
138
|
}),
|
|
@@ -147,11 +142,15 @@ export function createWorkflowExtensionRuntimeState(
|
|
|
147
142
|
const runtimeProxy: ExtensionRuntime = {
|
|
148
143
|
get registry() { return runtimeRef.current.registry; },
|
|
149
144
|
dispatch(args, options) { return runtimeRef.current.dispatch(args, options); },
|
|
150
|
-
runDirect(args, options) { return runtimeRef.current.runDirect(args, options); },
|
|
151
145
|
resumeFailedRun(sourceRunId, stageId, options) { return runtimeRef.current.resumeFailedRun(sourceRunId, stageId, options); },
|
|
152
146
|
resumeDurableWorkflow(workflowIdOrPrefix, options) { return runtimeRef.current.resumeDurableWorkflow(workflowIdOrPrefix, options); },
|
|
153
|
-
listDurableResumable(
|
|
154
|
-
prepareDurableResumable(workflowIdOrPrefix
|
|
147
|
+
listDurableResumable() { return runtimeRef.current.listDurableResumable(); },
|
|
148
|
+
prepareDurableResumable(workflowIdOrPrefix) { return runtimeRef.current.prepareDurableResumable(workflowIdOrPrefix); },
|
|
149
|
+
prepareDurableResumableForIds(workflowIds) {
|
|
150
|
+
const targeted = runtimeRef.current.prepareDurableResumableForIds;
|
|
151
|
+
if (targeted !== undefined) return targeted.call(runtimeRef.current, workflowIds);
|
|
152
|
+
return runtimeRef.current.prepareDurableResumable();
|
|
153
|
+
},
|
|
155
154
|
prepareCompletedDurable() {
|
|
156
155
|
return runtimeRef.current.prepareCompletedDurable?.() ?? Promise.resolve([]);
|
|
157
156
|
},
|
|
@@ -190,12 +189,11 @@ export function createWorkflowExtensionRuntimeState(
|
|
|
190
189
|
if (models === undefined) return runtimeProxy;
|
|
191
190
|
return createExtensionRuntime({
|
|
192
191
|
registry: runtimeRef.current.registry,
|
|
193
|
-
cwd:
|
|
192
|
+
cwd: resolveCwd(),
|
|
194
193
|
adapters,
|
|
195
194
|
cancellation: cancellationRegistry,
|
|
196
195
|
persistence: persistenceRef.current,
|
|
197
196
|
mcp: mcpPort,
|
|
198
|
-
intercom: intercomPort,
|
|
199
197
|
config: runtimeConfigRef.current,
|
|
200
198
|
models,
|
|
201
199
|
resolveDefaultStageSessionDir,
|
|
@@ -218,6 +216,7 @@ export function createWorkflowExtensionRuntimeState(
|
|
|
218
216
|
persistRuns: effectiveConfig.persistRuns,
|
|
219
217
|
statusFile: effectiveConfig.statusFile,
|
|
220
218
|
resumeInFlight: effectiveConfig.resumeInFlight,
|
|
219
|
+
worktree: effectiveConfig.worktree,
|
|
221
220
|
};
|
|
222
221
|
lifecycleNotificationConfigRef.current = effectiveConfig.workflowNotifications;
|
|
223
222
|
reinstallLifecycleNotifications();
|
|
@@ -229,12 +228,11 @@ export function createWorkflowExtensionRuntimeState(
|
|
|
229
228
|
function rebuildRuntime(registry = runtimeRef.current.registry): void {
|
|
230
229
|
runtimeRef.current = createExtensionRuntime({
|
|
231
230
|
registry,
|
|
232
|
-
cwd:
|
|
231
|
+
cwd: resolveCwd(),
|
|
233
232
|
adapters,
|
|
234
233
|
cancellation: cancellationRegistry,
|
|
235
234
|
persistence: persistenceRef.current,
|
|
236
235
|
mcp: mcpPort,
|
|
237
|
-
intercom: intercomPort,
|
|
238
236
|
config: runtimeConfigRef.current,
|
|
239
237
|
resolveDefaultStageSessionDir,
|
|
240
238
|
});
|
|
@@ -432,7 +430,6 @@ export function createWorkflowExtensionRuntimeState(
|
|
|
432
430
|
reinstallLifecycleNotifications();
|
|
433
431
|
reinstallHilAnswerNotifications();
|
|
434
432
|
},
|
|
435
|
-
setIntercomParentSession(session) { intercomParentSession = session; },
|
|
436
433
|
updateHostStageSessionDir(sessionManager) {
|
|
437
434
|
try {
|
|
438
435
|
hostStageSessionDir.current = sessionManager?.usesDefaultSessionDir?.() === false
|
|
@@ -442,5 +439,6 @@ export function createWorkflowExtensionRuntimeState(
|
|
|
442
439
|
hostStageSessionDir.current = undefined;
|
|
443
440
|
}
|
|
444
441
|
},
|
|
442
|
+
resolveDefaultStageSessionDir,
|
|
445
443
|
};
|
|
446
444
|
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
WorkflowLifecycleNotificationState,
|
|
3
|
+
WorkflowLifecycleNoticeDetails,
|
|
4
|
+
} from "./lifecycle-notifications.js";
|
|
5
|
+
|
|
6
|
+
interface LifecycleNoticeDeliveryOptions {
|
|
7
|
+
readonly state: WorkflowLifecycleNotificationState;
|
|
8
|
+
readonly emit: (details: WorkflowLifecycleNoticeDetails) => boolean | Promise<boolean>;
|
|
9
|
+
/** Whether this installation is configured to deliver the given notice kind. */
|
|
10
|
+
readonly eligible: (details: WorkflowLifecycleNoticeDetails) => boolean;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Owns terminal-notice admission with capped-backoff retry. Delivery state lives
|
|
15
|
+
* on the shared notification state, so a pending admission started under one
|
|
16
|
+
* configuration installation is not re-sent by a later reinstall: the shared
|
|
17
|
+
* pending token remains authoritative until its original send settles. If that
|
|
18
|
+
* send later fails, the failed payload is handed to whichever installation is
|
|
19
|
+
* currently active through the shared retry-observer set, preserving exactly
|
|
20
|
+
* once main-chat delivery across config reload and session-preserving reinstall.
|
|
21
|
+
*/
|
|
22
|
+
export function createLifecycleNoticeDelivery(options: LifecycleNoticeDeliveryOptions): {
|
|
23
|
+
deliver(key: string, details: WorkflowLifecycleNoticeDetails): void;
|
|
24
|
+
dispose(): void;
|
|
25
|
+
} {
|
|
26
|
+
const retryTimers = new Set<ReturnType<typeof setTimeout>>();
|
|
27
|
+
const attempts = new Map<string, number>();
|
|
28
|
+
let active = true;
|
|
29
|
+
|
|
30
|
+
const deliver = (key: string, details: WorkflowLifecycleNoticeDetails): void => {
|
|
31
|
+
// A disposed installation never starts a new send; an active one refuses to
|
|
32
|
+
// duplicate an already-delivered or still-pending admission.
|
|
33
|
+
if (!active) return;
|
|
34
|
+
if (options.state.deliveredTerminalRuns.has(key) || options.state.pendingTerminalRuns.has(key)) return;
|
|
35
|
+
const token = Symbol(key);
|
|
36
|
+
options.state.pendingTerminalRuns.set(key, token);
|
|
37
|
+
const attempt = (attempts.get(key) ?? 0) + 1;
|
|
38
|
+
attempts.set(key, attempt);
|
|
39
|
+
const settle = (delivered: boolean): void => {
|
|
40
|
+
// Another installation may have superseded this pending admission.
|
|
41
|
+
if (options.state.pendingTerminalRuns.get(key) !== token) return;
|
|
42
|
+
options.state.pendingTerminalRuns.delete(key);
|
|
43
|
+
if (delivered) {
|
|
44
|
+
options.state.deliveredTerminalRuns.add(key);
|
|
45
|
+
options.state.retryableTerminalRuns.delete(key);
|
|
46
|
+
options.state.retryableTerminalNotices.delete(key);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
options.state.retryableTerminalRuns.add(key);
|
|
50
|
+
options.state.retryableTerminalNotices.set(key, details);
|
|
51
|
+
if (active) {
|
|
52
|
+
const timer = setTimeout(() => {
|
|
53
|
+
retryTimers.delete(timer);
|
|
54
|
+
if (active) deliver(key, details);
|
|
55
|
+
}, Math.min(20 * (2 ** (attempt - 1)), 1_000));
|
|
56
|
+
retryTimers.add(timer);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// This installation was disposed while its admission was in flight; hand
|
|
60
|
+
// the failed payload to a currently-active installation, if any.
|
|
61
|
+
for (const observer of options.state.retryObservers) observer(key, details);
|
|
62
|
+
};
|
|
63
|
+
const result = options.emit(details);
|
|
64
|
+
if (typeof result === "boolean") settle(result);
|
|
65
|
+
else void result.then(settle);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const retryObserver = (key: string, details: WorkflowLifecycleNoticeDetails): void => {
|
|
69
|
+
if (active && options.eligible(details)) deliver(key, details);
|
|
70
|
+
};
|
|
71
|
+
options.state.retryObservers.add(retryObserver);
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
deliver,
|
|
75
|
+
dispose() {
|
|
76
|
+
active = false;
|
|
77
|
+
options.state.retryObservers.delete(retryObserver);
|
|
78
|
+
for (const timer of retryTimers) clearTimeout(timer);
|
|
79
|
+
// Do not clear pending tokens or mark them retryable: an in-flight
|
|
80
|
+
// admission remains authoritative and settles into the shared state.
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
} from "../shared/returned-run-status.js";
|
|
25
25
|
import { deriveGraphThemeFromPiTheme, type GraphTheme } from "../tui/graph-theme.js";
|
|
26
26
|
import { renderWorkflowNoticeCard, type WorkflowNoticeTone } from "../tui/workflow-notice-card.js";
|
|
27
|
+
import { createLifecycleNoticeDelivery } from "./lifecycle-notification-delivery.js";
|
|
27
28
|
|
|
28
29
|
export const LIFECYCLE_NOTICE_CUSTOM_TYPE = "workflows:lifecycle-notice";
|
|
29
30
|
export const LIFECYCLE_NOTICE_SNIPPET_LIMIT = 240;
|
|
@@ -56,11 +57,16 @@ export interface WorkflowLifecycleNoticeDetails {
|
|
|
56
57
|
readonly error?: string;
|
|
57
58
|
readonly failedStageId?: string;
|
|
58
59
|
readonly durationMs?: number;
|
|
60
|
+
readonly active?: boolean;
|
|
59
61
|
readonly createdAt: number;
|
|
60
62
|
}
|
|
61
63
|
|
|
62
64
|
export interface WorkflowLifecycleNotificationState {
|
|
63
65
|
readonly deliveredTerminalRuns: Set<string>;
|
|
66
|
+
readonly retryableTerminalNotices: Map<string, WorkflowLifecycleNoticeDetails>;
|
|
67
|
+
readonly pendingTerminalRuns: Map<string, symbol>;
|
|
68
|
+
readonly retryableTerminalRuns: Set<string>;
|
|
69
|
+
readonly retryObservers: Set<(key: string, details: WorkflowLifecycleNoticeDetails) => void>;
|
|
64
70
|
readonly deliveredInputPrompts: Set<string>;
|
|
65
71
|
suppressionDepth: number;
|
|
66
72
|
}
|
|
@@ -76,23 +82,28 @@ export interface WorkflowLifecycleNotificationOptions {
|
|
|
76
82
|
}
|
|
77
83
|
|
|
78
84
|
type RawRenderer = PiMessageRenderer;
|
|
79
|
-
|
|
80
|
-
// Process-lifetime registration dedupe: extension hosts are object identities
|
|
81
|
-
// and may be garbage-collected, but renderer registrations are not unregistered.
|
|
82
85
|
const rendererRegisteredHosts = new WeakSet<object>();
|
|
83
|
-
|
|
84
86
|
export function createWorkflowLifecycleNotificationState(): WorkflowLifecycleNotificationState {
|
|
85
87
|
return {
|
|
86
88
|
deliveredTerminalRuns: new Set<string>(),
|
|
89
|
+
pendingTerminalRuns: new Map<string, symbol>(),
|
|
90
|
+
retryableTerminalNotices: new Map<string, WorkflowLifecycleNoticeDetails>(),
|
|
91
|
+
retryableTerminalRuns: new Set<string>(),
|
|
92
|
+
retryObservers: new Set<(key: string, details: WorkflowLifecycleNoticeDetails) => void>(),
|
|
87
93
|
deliveredInputPrompts: new Set<string>(),
|
|
88
94
|
suppressionDepth: 0,
|
|
89
95
|
};
|
|
90
96
|
}
|
|
91
97
|
|
|
98
|
+
/** Reset all prior-session lifecycle delivery and dedupe state. */
|
|
92
99
|
export function resetWorkflowLifecycleNotificationState(
|
|
93
100
|
state: WorkflowLifecycleNotificationState,
|
|
94
101
|
): void {
|
|
95
102
|
state.deliveredTerminalRuns.clear();
|
|
103
|
+
state.pendingTerminalRuns.clear();
|
|
104
|
+
state.retryableTerminalRuns.clear();
|
|
105
|
+
state.retryableTerminalNotices.clear();
|
|
106
|
+
state.retryObservers.clear();
|
|
96
107
|
state.deliveredInputPrompts.clear();
|
|
97
108
|
state.suppressionDepth = 0;
|
|
98
109
|
}
|
|
@@ -104,8 +115,11 @@ export function seedWorkflowLifecycleNotificationState(
|
|
|
104
115
|
for (const run of snapshot.runs) {
|
|
105
116
|
if (!isTopLevelWorkflowRun(run)) continue;
|
|
106
117
|
const noticeKind = terminalNoticeKind(run);
|
|
107
|
-
if (noticeKind !== undefined && run
|
|
108
|
-
|
|
118
|
+
if (noticeKind !== undefined && lifecycleOccurrenceAt(run, noticeKind) !== undefined) {
|
|
119
|
+
const key = terminalRunKey(noticeKind, run);
|
|
120
|
+
if (!state.pendingTerminalRuns.has(key) && !state.retryableTerminalRuns.has(key)) {
|
|
121
|
+
state.deliveredTerminalRuns.add(key);
|
|
122
|
+
}
|
|
109
123
|
}
|
|
110
124
|
if (run.pendingPrompt !== undefined) {
|
|
111
125
|
state.deliveredInputPrompts.add(runAwaitingInputKey(run.id, run.pendingPrompt));
|
|
@@ -166,30 +180,25 @@ export function installWorkflowLifecycleNotifications(
|
|
|
166
180
|
|
|
167
181
|
const notifyOn = new Set<WorkflowLifecycleNoticeKind>(options.config.notifyOn);
|
|
168
182
|
const state = options.state ?? createWorkflowLifecycleNotificationState();
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}
|
|
183
|
+
let delivery!: ReturnType<typeof createLifecycleNoticeDelivery>;
|
|
184
|
+
if (options.seedExisting !== false) seedWorkflowLifecycleNotificationState(state, options.store.snapshot());
|
|
172
185
|
|
|
173
|
-
const emit = (details: WorkflowLifecycleNoticeDetails):
|
|
174
|
-
const content = formatWorkflowLifecycleNoticeText(details);
|
|
175
|
-
const deliveryOptions = { triggerTurn: true, deliverAs: "steer" as const };
|
|
186
|
+
const emit = (details: WorkflowLifecycleNoticeDetails): boolean | Promise<boolean> => {
|
|
176
187
|
try {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
),
|
|
189
|
-
).catch((error: unknown) => warnLifecycleSendFailure(error));
|
|
188
|
+
const result = send({
|
|
189
|
+
customType: LIFECYCLE_NOTICE_CUSTOM_TYPE,
|
|
190
|
+
content: formatWorkflowLifecycleNoticeText(details),
|
|
191
|
+
display: true,
|
|
192
|
+
details,
|
|
193
|
+
}, { triggerTurn: true, deliverAs: "steer", persistWhenStreaming: true });
|
|
194
|
+
if (result === undefined) return true;
|
|
195
|
+
return Promise.resolve(result).then(() => true, (error: unknown) => {
|
|
196
|
+
warnLifecycleSendFailure(error);
|
|
197
|
+
return false;
|
|
198
|
+
});
|
|
190
199
|
} catch (error) {
|
|
191
200
|
warnLifecycleSendFailure(error);
|
|
192
|
-
|
|
201
|
+
return false;
|
|
193
202
|
}
|
|
194
203
|
};
|
|
195
204
|
|
|
@@ -198,16 +207,19 @@ export function installWorkflowLifecycleNotifications(
|
|
|
198
207
|
kind: "completed" | "failed" | "blocked",
|
|
199
208
|
): void => {
|
|
200
209
|
const noticeKind = terminalNoticeKind(run);
|
|
201
|
-
if (noticeKind !== kind || run
|
|
210
|
+
if (noticeKind !== kind || lifecycleOccurrenceAt(run, kind) === undefined || !notifyOn.has(kind)) {
|
|
202
211
|
return;
|
|
203
212
|
}
|
|
204
213
|
|
|
205
|
-
const key = terminalRunKey(kind, run
|
|
206
|
-
if (state.deliveredTerminalRuns.has(key)) return;
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
214
|
+
const key = terminalRunKey(kind, run);
|
|
215
|
+
if (state.deliveredTerminalRuns.has(key) || state.pendingTerminalRuns.has(key)) return;
|
|
216
|
+
if (state.suppressionDepth > 0) {
|
|
217
|
+
state.deliveredTerminalRuns.add(key);
|
|
218
|
+
state.retryableTerminalRuns.delete(key);
|
|
219
|
+
state.retryableTerminalNotices.delete(key);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
delivery.deliver(key, makeTerminalNotice(run, kind));
|
|
211
223
|
};
|
|
212
224
|
|
|
213
225
|
const emitStageAwaitingInputNoticeOnce = (
|
|
@@ -250,8 +262,17 @@ export function installWorkflowLifecycleNotifications(
|
|
|
250
262
|
}
|
|
251
263
|
}
|
|
252
264
|
};
|
|
265
|
+
delivery = createLifecycleNoticeDelivery({ state, emit, eligible: (details) => notifyOn.has(details.kind) });
|
|
266
|
+
for (const [key, details] of state.retryableTerminalNotices) {
|
|
267
|
+
if (notifyOn.has(details.kind)) delivery.deliver(key, details);
|
|
268
|
+
}
|
|
253
269
|
|
|
254
|
-
|
|
270
|
+
const unsubscribe = options.store.subscribe(inspect);
|
|
271
|
+
inspect(options.store.snapshot());
|
|
272
|
+
return () => {
|
|
273
|
+
unsubscribe();
|
|
274
|
+
delivery.dispose();
|
|
275
|
+
};
|
|
255
276
|
}
|
|
256
277
|
|
|
257
278
|
export function registerLifecycleNoticeRenderer(
|
|
@@ -286,7 +307,8 @@ export function formatWorkflowLifecycleNoticeText(details: WorkflowLifecycleNoti
|
|
|
286
307
|
}
|
|
287
308
|
if (details.kind === "blocked") {
|
|
288
309
|
const errorText = details.error ? `: ${details.error}` : "";
|
|
289
|
-
|
|
310
|
+
const stateText = details.active === true ? "is blocked" : "ended blocked";
|
|
311
|
+
return `! Workflow "${workflowName}" ${stateText} (run ${details.runId})${errorText}. Inspect: /workflow status ${details.runId}`;
|
|
290
312
|
}
|
|
291
313
|
const prompt = details.promptMessage ? ` Prompt: ${details.promptMessage}` : "";
|
|
292
314
|
if (details.scope === "run") {
|
|
@@ -306,19 +328,22 @@ function makeTerminalNotice(
|
|
|
306
328
|
const failedStage = run.failedStageId
|
|
307
329
|
? run.stages.find((stage) => stage.id === run.failedStageId)
|
|
308
330
|
: undefined;
|
|
309
|
-
const
|
|
331
|
+
const activeBlocked = kind === "blocked" && isActiveRecoverableBlockedRun(run);
|
|
332
|
+
const error = activeBlocked
|
|
333
|
+
? run.failureMessage ?? structuredRecoverableWorkflowFailureText(run) ?? run.error
|
|
334
|
+
: run.error ?? returnedNoticeError(run, kind) ?? (kind === "blocked" ? run.exitReason : undefined);
|
|
310
335
|
return {
|
|
311
336
|
kind,
|
|
312
337
|
scope: "run",
|
|
313
338
|
runId: run.id,
|
|
314
339
|
workflowName: run.name,
|
|
315
340
|
status: effectiveRunStatus(run),
|
|
341
|
+
...(activeBlocked ? { active: true } : {}),
|
|
316
342
|
...(error ? { error: truncateSnippet(error) } : {}),
|
|
317
343
|
...(run.failedStageId ? { failedStageId: run.failedStageId } : {}),
|
|
318
344
|
...(failedStage ? { stageId: failedStage.id, stageName: failedStage.name } : {}),
|
|
319
345
|
...(run.durationMs !== undefined ? { durationMs: run.durationMs } : {}),
|
|
320
|
-
|
|
321
|
-
createdAt: run.endedAt ?? Date.now(),
|
|
346
|
+
createdAt: lifecycleOccurrenceAt(run, kind) ?? Date.now(),
|
|
322
347
|
};
|
|
323
348
|
}
|
|
324
349
|
|
|
@@ -337,12 +362,25 @@ function jsonString(value: string): string {
|
|
|
337
362
|
}
|
|
338
363
|
|
|
339
364
|
function terminalNoticeKind(run: RunSnapshot): "completed" | "failed" | "blocked" | undefined {
|
|
365
|
+
if (isActiveRecoverableBlockedRun(run)) return "blocked";
|
|
340
366
|
const status = effectiveRunStatus(run);
|
|
341
367
|
if (status === "failed" || status === "blocked") return status;
|
|
342
368
|
if (status !== "completed") return undefined;
|
|
343
369
|
return "completed";
|
|
344
370
|
}
|
|
345
371
|
|
|
372
|
+
function isActiveRecoverableBlockedRun(run: RunSnapshot): boolean {
|
|
373
|
+
return run.blockedAt !== undefined && structuredRecoverableWorkflowFailureText(run) !== undefined;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function lifecycleOccurrenceAt(
|
|
377
|
+
run: RunSnapshot,
|
|
378
|
+
kind: "completed" | "failed" | "blocked",
|
|
379
|
+
): number | undefined {
|
|
380
|
+
if (kind === "blocked" && isActiveRecoverableBlockedRun(run)) return run.blockedAt;
|
|
381
|
+
return run.endedAt;
|
|
382
|
+
}
|
|
383
|
+
|
|
346
384
|
function returnedNoticeError(run: RunSnapshot, kind: "completed" | "failed" | "blocked"): string | undefined {
|
|
347
385
|
const structuredFailureText = structuredRecoverableWorkflowFailureText(run);
|
|
348
386
|
if (kind === "blocked" && structuredFailureText !== undefined) return structuredFailureText;
|
|
@@ -353,8 +391,9 @@ function returnedNoticeError(run: RunSnapshot, kind: "completed" | "failed" | "b
|
|
|
353
391
|
return undefined;
|
|
354
392
|
}
|
|
355
393
|
|
|
356
|
-
function terminalRunKey(kind: "completed" | "failed" | "blocked",
|
|
357
|
-
|
|
394
|
+
function terminalRunKey(kind: "completed" | "failed" | "blocked", run: RunSnapshot): string {
|
|
395
|
+
const occurrence = kind === "blocked" ? run.blockedAt ?? lifecycleOccurrenceAt(run, kind) : "";
|
|
396
|
+
return occurrence === undefined ? `${kind}:${run.id}` : `${kind}:${run.id}:${occurrence}`;
|
|
358
397
|
}
|
|
359
398
|
|
|
360
399
|
function awaitingInputKey(runId: string, stage: StageSnapshot): string {
|
|
@@ -413,7 +452,7 @@ function renderLifecycleNoticeCard(
|
|
|
413
452
|
: details.kind === "awaiting_input"
|
|
414
453
|
? `Workflow "${details.workflowName}" needs input`
|
|
415
454
|
: details.kind === "blocked"
|
|
416
|
-
? `Workflow "${details.workflowName}" ended blocked`
|
|
455
|
+
? `Workflow "${details.workflowName}" ${details.active === true ? "is blocked" : "ended blocked"}`
|
|
417
456
|
: `Workflow "${details.workflowName}" completed`;
|
|
418
457
|
return renderWorkflowNoticeCard({
|
|
419
458
|
title,
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension-side wiring for the shared post-mortem stage-chat resolver.
|
|
3
|
+
*
|
|
4
|
+
* Builds `PostMortemStageChatDeps` from live extension runtime surfaces
|
|
5
|
+
* (stage adapters, durable per-run cwd, and the default stage session dir after
|
|
6
|
+
* a host restart) so both the TUI attach pane and `workflow send` revive an
|
|
7
|
+
* eligible terminal agent stage through the same detached, single-flight
|
|
8
|
+
* resolver instead of process-local handle presence alone.
|
|
9
|
+
*
|
|
10
|
+
* cross-ref:
|
|
11
|
+
* - src/runs/foreground/postmortem-stage-chat.ts (resolver)
|
|
12
|
+
* - src/tui/overlay-adapter.ts (attach pane wiring)
|
|
13
|
+
* - src/extension/workflow-tool-send.ts (send parity)
|
|
14
|
+
*/
|
|
15
|
+
import { store } from "../shared/store.js";
|
|
16
|
+
import { getDurableBackend } from "../durable/factory.js";
|
|
17
|
+
import {
|
|
18
|
+
ensurePostMortemStageHandle,
|
|
19
|
+
type EnsurePostMortemStageHandleResult,
|
|
20
|
+
type PostMortemStageChatDeps,
|
|
21
|
+
} from "../runs/foreground/postmortem-stage-chat.js";
|
|
22
|
+
import { stageControlRegistry } from "../runs/foreground/stage-control-registry.js";
|
|
23
|
+
import type { StageAdapters } from "../runs/foreground/stage-runner.js";
|
|
24
|
+
|
|
25
|
+
export interface PostMortemResolverDeps {
|
|
26
|
+
readonly adapters: StageAdapters;
|
|
27
|
+
readonly resolveDefaultStageSessionDir: () => string | undefined;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Persisted original/resolved cwd for a durable run tree, when still available. */
|
|
31
|
+
function resolveStageCwd(runId: string): string | undefined {
|
|
32
|
+
try {
|
|
33
|
+
const backend = getDurableBackend();
|
|
34
|
+
const owningHandle = backend.getWorkflow(runId);
|
|
35
|
+
const run = store.snapshot().runs.find((candidate) => candidate.id === runId);
|
|
36
|
+
const rootRunId = run?.rootRunId ?? owningHandle?.rootWorkflowId;
|
|
37
|
+
const cwdHandle = rootRunId === undefined
|
|
38
|
+
? owningHandle
|
|
39
|
+
: backend.getWorkflow(rootRunId) ?? owningHandle;
|
|
40
|
+
return cwdHandle?.workflowCwd ?? cwdHandle?.invocationCwd ?? undefined;
|
|
41
|
+
} catch {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Resolver deps for a specific run, keyed so revived handles use the real run cwd. */
|
|
47
|
+
export function postMortemDepsForRun(
|
|
48
|
+
runId: string,
|
|
49
|
+
deps: PostMortemResolverDeps,
|
|
50
|
+
): PostMortemStageChatDeps {
|
|
51
|
+
return {
|
|
52
|
+
registry: stageControlRegistry,
|
|
53
|
+
adapters: deps.adapters,
|
|
54
|
+
cwd: resolveStageCwd(runId),
|
|
55
|
+
defaultSessionDir: deps.resolveDefaultStageSessionDir(),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Build a `(runId, stageId) => result | undefined` resolver for the attach pane.
|
|
61
|
+
* Unknown stages return `undefined`; known but non-revivable stages retain the
|
|
62
|
+
* resolver's explicit reason so the pane can explain why chat is unavailable.
|
|
63
|
+
*/
|
|
64
|
+
export function createPostMortemHandleResolver(
|
|
65
|
+
deps: PostMortemResolverDeps,
|
|
66
|
+
): (runId: string, stageId: string) => EnsurePostMortemStageHandleResult | undefined {
|
|
67
|
+
return (runId, stageId) => {
|
|
68
|
+
const run = store.snapshot().runs.find((candidate) => candidate.id === runId);
|
|
69
|
+
const stage = run?.stages.find((candidate) => candidate.id === stageId);
|
|
70
|
+
if (stage === undefined) return undefined;
|
|
71
|
+
return ensurePostMortemStageHandle(runId, stage, postMortemDepsForRun(runId, deps));
|
|
72
|
+
};
|
|
73
|
+
}
|