@bastani/atomic 0.9.9 → 0.9.10-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +66 -0
- package/README.md +2 -0
- package/dist/builtin/cursor/CHANGELOG.md +6 -0
- package/dist/builtin/cursor/package.json +3 -3
- package/dist/builtin/intercom/CHANGELOG.md +15 -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 +11 -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 +21 -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 +11 -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 +77 -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
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedded Postgres for DBOS workflow durability.
|
|
3
|
+
*
|
|
4
|
+
* When no `DBOS_SYSTEM_DATABASE_URL` is configured, Atomic runs DBOS against
|
|
5
|
+
* its own Postgres instance built from npm-distributed binaries
|
|
6
|
+
* (`@embedded-postgres/<platform>-<arch>`, installed as an optional dependency
|
|
7
|
+
* of `embedded-postgres`). No Docker daemon or system Postgres is required.
|
|
8
|
+
*
|
|
9
|
+
* The cluster lives under `~/.atomic/postgres/v<major>` on a dedicated port and
|
|
10
|
+
* is started with `pg_ctl`, which daemonizes the server into its own session:
|
|
11
|
+
* it survives Atomic exiting and is shared by every concurrent Atomic session.
|
|
12
|
+
* Atomic never stops it.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { chmodSync, copyFileSync, existsSync, mkdirSync, readFileSync, rmSync, statSync, symlinkSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { homedir, tmpdir } from "node:os";
|
|
17
|
+
import { dirname, join, relative } from "node:path";
|
|
18
|
+
import { commandFailureDetail, delay, runLocalCommand, tcpReachable } from "./local-command.js";
|
|
19
|
+
|
|
20
|
+
const EMBEDDED_HOST = "127.0.0.1";
|
|
21
|
+
const EMBEDDED_PORT = 5439;
|
|
22
|
+
const EMBEDDED_USER = "postgres";
|
|
23
|
+
const EMBEDDED_PASSWORD = "atomic";
|
|
24
|
+
const EMBEDDED_PG_MAJOR = 18;
|
|
25
|
+
const READY_ATTEMPTS = 120;
|
|
26
|
+
const READY_DELAY_MS = 250;
|
|
27
|
+
const SETUP_LOCK_STALE_MS = 120_000;
|
|
28
|
+
|
|
29
|
+
export const EMBEDDED_DBOS_SYSTEM_DATABASE_URL =
|
|
30
|
+
`postgresql://${EMBEDDED_USER}:${EMBEDDED_PASSWORD}@${EMBEDDED_HOST}:${EMBEDDED_PORT}/atomic_workflows_dbos_sys?connect_timeout=10&sslmode=disable`;
|
|
31
|
+
|
|
32
|
+
interface EmbeddedPostgresBinaries {
|
|
33
|
+
readonly pg_ctl: string;
|
|
34
|
+
readonly initdb: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let ensured: Promise<void> | undefined;
|
|
38
|
+
|
|
39
|
+
/** Start or attach to the shared embedded DBOS Postgres exactly once per process. */
|
|
40
|
+
export function ensureEmbeddedDbosPostgres(): Promise<void> {
|
|
41
|
+
ensured ??= ensure().catch((error: unknown) => {
|
|
42
|
+
ensured = undefined;
|
|
43
|
+
throw error;
|
|
44
|
+
});
|
|
45
|
+
return ensured;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function ensure(): Promise<void> {
|
|
49
|
+
if (await tcpReachable(EMBEDDED_HOST, EMBEDDED_PORT)) return;
|
|
50
|
+
const binaries = await loadEmbeddedPostgresBinaries();
|
|
51
|
+
hydrateBinaryLibraryLinks(binaries.pg_ctl);
|
|
52
|
+
const root = join(homedir(), ".atomic", "postgres");
|
|
53
|
+
const dataDir = join(root, `v${EMBEDDED_PG_MAJOR}`);
|
|
54
|
+
const logFile = join(root, `v${EMBEDDED_PG_MAJOR}.log`);
|
|
55
|
+
mkdirSync(root, { recursive: true, mode: 0o700 });
|
|
56
|
+
|
|
57
|
+
await withSetupLock(join(root, `v${EMBEDDED_PG_MAJOR}.setup-lock`), async () => {
|
|
58
|
+
if (await tcpReachable(EMBEDDED_HOST, EMBEDDED_PORT)) return;
|
|
59
|
+
if (!existsSync(join(dataDir, "PG_VERSION"))) await initializeCluster(binaries.initdb, dataDir);
|
|
60
|
+
await startCluster(binaries.pg_ctl, dataDir, logFile);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
for (let attempt = 0; attempt < READY_ATTEMPTS; attempt += 1) {
|
|
64
|
+
if (await tcpReachable(EMBEDDED_HOST, EMBEDDED_PORT)) return;
|
|
65
|
+
await delay(READY_DELAY_MS);
|
|
66
|
+
}
|
|
67
|
+
throw new Error(`Embedded Postgres started but never accepted connections on ${EMBEDDED_HOST}:${EMBEDDED_PORT}; see ${logFile}.`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function initializeCluster(initdb: string, dataDir: string): Promise<void> {
|
|
71
|
+
const passwordFile = join(tmpdir(), `atomic-pg-pw-${process.pid}-${crypto.randomUUID().slice(0, 8)}`);
|
|
72
|
+
writeFileSync(passwordFile, `${EMBEDDED_PASSWORD}\n`, { mode: 0o600 });
|
|
73
|
+
try {
|
|
74
|
+
const result = await runLocalCommand(initdb, [
|
|
75
|
+
"-D", dataDir,
|
|
76
|
+
"-U", EMBEDDED_USER,
|
|
77
|
+
"-A", "password",
|
|
78
|
+
`--pwfile=${passwordFile}`,
|
|
79
|
+
"-E", "UTF8",
|
|
80
|
+
"--no-locale",
|
|
81
|
+
]);
|
|
82
|
+
if (result.exitCode !== 0) {
|
|
83
|
+
throw new Error(`Could not initialize the embedded Postgres cluster: ${commandFailureDetail(result)}`);
|
|
84
|
+
}
|
|
85
|
+
} finally {
|
|
86
|
+
rmSync(passwordFile, { force: true });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function startCluster(pgCtl: string, dataDir: string, logFile: string): Promise<void> {
|
|
91
|
+
const result = await runLocalCommand(pgCtl, [
|
|
92
|
+
"-D", dataDir,
|
|
93
|
+
"-l", logFile,
|
|
94
|
+
"-o", `-p ${EMBEDDED_PORT} -c listen_addresses=${EMBEDDED_HOST}`,
|
|
95
|
+
"-w", "-t", "60",
|
|
96
|
+
"start",
|
|
97
|
+
]);
|
|
98
|
+
if (result.exitCode === 0) return;
|
|
99
|
+
// A concurrent session may have won the start race; readiness polling in the
|
|
100
|
+
// caller decides. Only fail here when nothing is coming up on the port.
|
|
101
|
+
if (await tcpReachable(EMBEDDED_HOST, EMBEDDED_PORT, 3_000)) return;
|
|
102
|
+
throw new Error(
|
|
103
|
+
`Could not start the embedded Postgres cluster: ${commandFailureDetail(result)}${logTail(logFile)}`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* The npm platform packages ship `native/lib` symlinks (e.g.
|
|
109
|
+
* `libicudata.dylib → libicudata.77.1.dylib`) through a `pg-symlinks.json`
|
|
110
|
+
* manifest plus a postinstall script, because npm tarballs cannot contain
|
|
111
|
+
* symlinks. Bun and `--ignore-scripts` installs skip postinstall, so hydrate
|
|
112
|
+
* the links at runtime; fall back to copying when symlinks are unavailable.
|
|
113
|
+
*/
|
|
114
|
+
function hydrateBinaryLibraryLinks(pgCtlPath: string): void {
|
|
115
|
+
const packageRoot = dirname(dirname(dirname(pgCtlPath)));
|
|
116
|
+
let manifest: readonly { readonly source: string; readonly target: string }[];
|
|
117
|
+
try {
|
|
118
|
+
manifest = JSON.parse(readFileSync(join(packageRoot, "native", "pg-symlinks.json"), "utf8")) as typeof manifest;
|
|
119
|
+
} catch {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
for (const { source, target } of manifest) {
|
|
123
|
+
const absoluteSource = join(packageRoot, source);
|
|
124
|
+
const absoluteTarget = join(packageRoot, target);
|
|
125
|
+
if (existsSync(absoluteTarget) || !existsSync(absoluteSource)) continue;
|
|
126
|
+
try {
|
|
127
|
+
symlinkSync(relative(dirname(absoluteTarget), absoluteSource), absoluteTarget);
|
|
128
|
+
} catch {
|
|
129
|
+
try {
|
|
130
|
+
copyFileSync(absoluteSource, absoluteTarget);
|
|
131
|
+
} catch {
|
|
132
|
+
// Missing optional libraries surface as an initdb/pg_ctl failure with detail.
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async function loadEmbeddedPostgresBinaries(): Promise<EmbeddedPostgresBinaries> {
|
|
139
|
+
const platform = process.platform === "win32" ? "windows" : process.platform;
|
|
140
|
+
const packageName = `@embedded-postgres/${platform}-${process.arch}`;
|
|
141
|
+
let binaries: Partial<EmbeddedPostgresBinaries>;
|
|
142
|
+
try {
|
|
143
|
+
binaries = await import(packageName) as Partial<EmbeddedPostgresBinaries>;
|
|
144
|
+
} catch (error) {
|
|
145
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
146
|
+
throw new Error(`Embedded Postgres binaries are unavailable for ${process.platform}/${process.arch} (${packageName}): ${detail}`);
|
|
147
|
+
}
|
|
148
|
+
if (typeof binaries.pg_ctl !== "string" || typeof binaries.initdb !== "string") {
|
|
149
|
+
throw new Error(`Embedded Postgres package ${packageName} did not export pg_ctl/initdb paths.`);
|
|
150
|
+
}
|
|
151
|
+
for (const binary of [binaries.pg_ctl, binaries.initdb, join(dirname(binaries.pg_ctl), process.platform === "win32" ? "postgres.exe" : "postgres")]) {
|
|
152
|
+
ensureExecutable(binary);
|
|
153
|
+
}
|
|
154
|
+
return { pg_ctl: binaries.pg_ctl, initdb: binaries.initdb };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** npm can strip executable bits; restore them only when actually missing. */
|
|
158
|
+
function ensureExecutable(filePath: string): void {
|
|
159
|
+
try {
|
|
160
|
+
const mode = statSync(filePath).mode;
|
|
161
|
+
if ((mode & 0o111) !== 0o111) chmodSync(filePath, mode | 0o555);
|
|
162
|
+
} catch {
|
|
163
|
+
// A genuinely missing binary surfaces as a spawn failure with detail.
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Serialize initdb/start across concurrent Atomic processes on this machine. */
|
|
168
|
+
async function withSetupLock(lockDir: string, fn: () => Promise<void>): Promise<void> {
|
|
169
|
+
for (let attempt = 0; attempt < READY_ATTEMPTS; attempt += 1) {
|
|
170
|
+
try {
|
|
171
|
+
mkdirSync(lockDir);
|
|
172
|
+
break;
|
|
173
|
+
} catch {
|
|
174
|
+
if (lockIsStale(lockDir)) {
|
|
175
|
+
rmSync(lockDir, { recursive: true, force: true });
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
await delay(READY_DELAY_MS);
|
|
179
|
+
if (attempt === READY_ATTEMPTS - 1) throw new Error(`Timed out waiting for another Atomic process to finish Postgres setup (${lockDir}).`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
await fn();
|
|
184
|
+
} finally {
|
|
185
|
+
rmSync(lockDir, { recursive: true, force: true });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function lockIsStale(lockDir: string): boolean {
|
|
189
|
+
try {
|
|
190
|
+
return Date.now() - statSync(lockDir).mtimeMs > SETUP_LOCK_STALE_MS;
|
|
191
|
+
} catch {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function logTail(logFile: string): string {
|
|
197
|
+
try {
|
|
198
|
+
const lines = readFileSync(logFile, "utf8").trimEnd().split("\n");
|
|
199
|
+
return `\nPostgres log tail:\n${lines.slice(-5).join("\n")}`;
|
|
200
|
+
} catch {
|
|
201
|
+
return "";
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export function resetEmbeddedDbosPostgresForTests(): void {
|
|
206
|
+
ensured = undefined;
|
|
207
|
+
}
|
|
@@ -8,22 +8,21 @@
|
|
|
8
8
|
* the synchronous replay reads (`getToolOutput`, `getUiResponse`,
|
|
9
9
|
* `getStageOutput`) cannot reconstruct their lookup keys.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
* the envelope marker) are treated as generic stage outputs during hydration.
|
|
13
|
-
*
|
|
14
|
-
* cross-ref: issue #1498 — DBOS read-side hydration.
|
|
11
|
+
* Payloads without the current envelope marker and version are rejected.
|
|
15
12
|
*/
|
|
16
13
|
|
|
17
14
|
import type { WorkflowSerializableObject, WorkflowSerializableValue } from "../shared/types.js";
|
|
18
|
-
import
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
15
|
+
import {
|
|
16
|
+
DURABLE_STAGE_TOPOLOGY_VERSION,
|
|
17
|
+
type DurableCheckpoint,
|
|
18
|
+
type DurableCheckpointKind,
|
|
19
|
+
type DurableStageCheckpoint,
|
|
20
|
+
type DurableStageTopology,
|
|
21
|
+
type DurableToolCheckpoint,
|
|
22
|
+
type DurableUiCheckpoint,
|
|
23
|
+
type UiPromptKind,
|
|
25
24
|
} from "./types.js";
|
|
26
|
-
import {
|
|
25
|
+
import { isCurrentDurableFormat, DURABLE_FORMAT_VERSION } from "./format-version.js";
|
|
27
26
|
|
|
28
27
|
/** Envelope schema version. */
|
|
29
28
|
export const DBOS_ENVELOPE_VERSION = DURABLE_FORMAT_VERSION;
|
|
@@ -60,12 +59,28 @@ export interface DbosCheckpointEnvelope extends WorkflowSerializableObject {
|
|
|
60
59
|
readonly fastMode?: boolean;
|
|
61
60
|
readonly attemptedModels?: WorkflowSerializableValue;
|
|
62
61
|
readonly modelAttempts?: WorkflowSerializableValue;
|
|
62
|
+
readonly topology?: WorkflowSerializableValue;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Stage-kind checkpoints from older session-timing writers may omit
|
|
67
|
+
* topology. The current format requires it, so default at every write
|
|
68
|
+
* boundary — persisted records must match the normalized in-memory mirror or
|
|
69
|
+
* a fresh process would reject them as foreign.
|
|
70
|
+
*/
|
|
71
|
+
export function withCurrentStageTopology(cp: DurableCheckpoint): DurableCheckpoint {
|
|
72
|
+
if (cp.kind !== "stage" || cp.topology !== undefined) return cp;
|
|
73
|
+
return {
|
|
74
|
+
...cp,
|
|
75
|
+
topology: { version: DURABLE_STAGE_TOPOLOGY_VERSION, stageId: cp.checkpointId, parentIds: [] },
|
|
76
|
+
};
|
|
63
77
|
}
|
|
64
78
|
|
|
65
79
|
/**
|
|
66
80
|
* Encode a durable checkpoint into a DBOS step-output envelope.
|
|
67
81
|
*/
|
|
68
|
-
export function encodeCheckpoint(
|
|
82
|
+
export function encodeCheckpoint(checkpoint: DurableCheckpoint): DbosCheckpointEnvelope {
|
|
83
|
+
const cp = withCurrentStageTopology(checkpoint);
|
|
69
84
|
const output = checkpointOutputValue(cp);
|
|
70
85
|
const base: DbosCheckpointEnvelope = {
|
|
71
86
|
__dbos_checkpoint__: ENVELOPE_MARKER,
|
|
@@ -89,6 +104,7 @@ export function encodeCheckpoint(cp: DurableCheckpoint): DbosCheckpointEnvelope
|
|
|
89
104
|
...base,
|
|
90
105
|
name: s.name,
|
|
91
106
|
replayKey: s.replayKey,
|
|
107
|
+
...(s.topology !== undefined ? { topology: { version: s.topology.version, stageId: s.topology.stageId, parentIds: [...s.topology.parentIds] } } : {}),
|
|
92
108
|
...(s.sessionId !== undefined ? { sessionId: s.sessionId } : {}),
|
|
93
109
|
...(s.sessionFile !== undefined ? { sessionFile: s.sessionFile } : {}),
|
|
94
110
|
...(s.startedAt !== undefined ? { startedAt: s.startedAt } : {}),
|
|
@@ -116,7 +132,6 @@ function hasCheckpointEnvelopeMarker(value: WorkflowSerializableValue | undefine
|
|
|
116
132
|
}
|
|
117
133
|
export type DbosCheckpointCompatibility =
|
|
118
134
|
| { readonly kind: "current"; readonly checkpoint: DurableCheckpoint }
|
|
119
|
-
| { readonly kind: "legacy" }
|
|
120
135
|
| { readonly kind: "unknown" };
|
|
121
136
|
|
|
122
137
|
/** Classify and decode one DBOS checkpoint payload without reinterpreting marked formats. */
|
|
@@ -125,9 +140,7 @@ export function classifyCheckpointPayload(
|
|
|
125
140
|
stepName: string,
|
|
126
141
|
value: WorkflowSerializableValue,
|
|
127
142
|
): DbosCheckpointCompatibility {
|
|
128
|
-
if (!hasCheckpointEnvelopeMarker(value)) return { kind: "
|
|
129
|
-
const compatibility = classifyDurableFormatVersion(value.v);
|
|
130
|
-
if (compatibility !== "current") return { kind: compatibility };
|
|
143
|
+
if (!hasCheckpointEnvelopeMarker(value) || !isCurrentDurableFormat(value.v)) return { kind: "unknown" };
|
|
131
144
|
const hasOutput = value["hasOutput"];
|
|
132
145
|
const containsOutput = value["output"] !== undefined;
|
|
133
146
|
if (value["checkpointId"] !== stepName || typeof hasOutput !== "boolean" || hasOutput !== containsOutput) {
|
|
@@ -137,15 +150,7 @@ export function classifyCheckpointPayload(
|
|
|
137
150
|
return checkpoint === undefined ? { kind: "unknown" } : { kind: "current", checkpoint };
|
|
138
151
|
}
|
|
139
152
|
|
|
140
|
-
/**
|
|
141
|
-
* Decode a DBOS step output into a durable checkpoint.
|
|
142
|
-
*
|
|
143
|
-
* - Envelope payloads reconstruct the full checkpoint with original metadata.
|
|
144
|
-
* - Non-envelope payloads (legacy/simple) produce a generic stage checkpoint
|
|
145
|
-
* so the output is still discoverable during replay.
|
|
146
|
-
*
|
|
147
|
-
* Returns `undefined` if the payload cannot be interpreted.
|
|
148
|
-
*/
|
|
153
|
+
/** Decode one current DBOS checkpoint envelope. */
|
|
149
154
|
export function decodeToCheckpoint(
|
|
150
155
|
workflowId: string,
|
|
151
156
|
stepName: string,
|
|
@@ -183,7 +188,8 @@ function decodeEnvelope(workflowId: string, env: DbosCheckpointEnvelope): Durabl
|
|
|
183
188
|
response: env.output,
|
|
184
189
|
} as DurableUiCheckpoint;
|
|
185
190
|
}
|
|
186
|
-
|
|
191
|
+
const topology = stageTopology(env.topology);
|
|
192
|
+
if (env.kind !== "stage" || topology === undefined
|
|
187
193
|
|| (env.replayKey !== undefined && typeof env.replayKey !== "string")
|
|
188
194
|
|| (env.sessionId !== undefined && typeof env.sessionId !== "string")
|
|
189
195
|
|| (env.sessionFile !== undefined && typeof env.sessionFile !== "string")
|
|
@@ -201,6 +207,7 @@ function decodeEnvelope(workflowId: string, env: DbosCheckpointEnvelope): Durabl
|
|
|
201
207
|
name: env.name ?? "stage",
|
|
202
208
|
replayKey: env.replayKey ?? env.checkpointId,
|
|
203
209
|
...(env.hasOutput !== false && env.output !== undefined ? { output: env.output } : {}),
|
|
210
|
+
topology,
|
|
204
211
|
...(env.sessionId !== undefined ? { sessionId: env.sessionId } : {}),
|
|
205
212
|
...(env.sessionFile !== undefined ? { sessionFile: env.sessionFile } : {}),
|
|
206
213
|
...(typeof env.startedAt === "number" ? { startedAt: env.startedAt } : {}),
|
|
@@ -215,6 +222,14 @@ function decodeEnvelope(workflowId: string, env: DbosCheckpointEnvelope): Durabl
|
|
|
215
222
|
}
|
|
216
223
|
|
|
217
224
|
|
|
225
|
+
function stageTopology(value: WorkflowSerializableValue | undefined): DurableStageTopology | undefined {
|
|
226
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return undefined;
|
|
227
|
+
const record = value as Record<string, WorkflowSerializableValue>;
|
|
228
|
+
if (record["version"] !== DURABLE_STAGE_TOPOLOGY_VERSION
|
|
229
|
+
|| typeof record["stageId"] !== "string" || !isStringArray(record["parentIds"])) return undefined;
|
|
230
|
+
return { version: DURABLE_STAGE_TOPOLOGY_VERSION, stageId: record["stageId"], parentIds: record["parentIds"] };
|
|
231
|
+
}
|
|
232
|
+
|
|
218
233
|
function isModelAttempts(value: WorkflowSerializableValue | undefined): boolean {
|
|
219
234
|
return Array.isArray(value) && value.every((attempt) => {
|
|
220
235
|
if (typeof attempt !== "object" || attempt === null || Array.isArray(attempt)) return false;
|
|
@@ -251,21 +266,6 @@ function isOptionalFiniteNumber(value: WorkflowSerializableValue | undefined): b
|
|
|
251
266
|
function isStringArray(value: WorkflowSerializableValue | undefined): value is readonly string[] {
|
|
252
267
|
return Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
253
268
|
}
|
|
254
|
-
function decodeLegacy(
|
|
255
|
-
workflowId: string,
|
|
256
|
-
stepName: string,
|
|
257
|
-
output: WorkflowSerializableValue,
|
|
258
|
-
): DurableStageCheckpoint {
|
|
259
|
-
return {
|
|
260
|
-
kind: "stage",
|
|
261
|
-
workflowId,
|
|
262
|
-
checkpointId: `stage:${stepName}`,
|
|
263
|
-
name: stepName,
|
|
264
|
-
replayKey: stepName,
|
|
265
|
-
output,
|
|
266
|
-
completedAt: Date.now(),
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
269
|
|
|
270
270
|
function checkpointOutputValue(cp: DurableCheckpoint): WorkflowSerializableValue | undefined {
|
|
271
271
|
if (cp.kind === "tool") return (cp as DurableToolCheckpoint).output;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import {
|
|
2
|
+
configureDbosDurableBackend,
|
|
3
|
+
type ConfiguredDbosDurability,
|
|
4
|
+
type DbosDurableBackend,
|
|
5
|
+
} from "./dbos-backend.js";
|
|
6
|
+
import {
|
|
7
|
+
provisionResolvedLocalDbos,
|
|
8
|
+
resolveDbosSystemDatabaseUrl,
|
|
9
|
+
shouldProvisionLocalDbos,
|
|
10
|
+
} from "./dbos-local-postgres.js";
|
|
11
|
+
|
|
12
|
+
export type DbosLifecycleState =
|
|
13
|
+
| "uninitialized"
|
|
14
|
+
| "configured"
|
|
15
|
+
| "launching"
|
|
16
|
+
| "ready"
|
|
17
|
+
| "failed"
|
|
18
|
+
| "shutting_down";
|
|
19
|
+
|
|
20
|
+
export class DbosDurabilityError extends Error {
|
|
21
|
+
constructor(message: string, options?: ErrorOptions) {
|
|
22
|
+
super(message, options);
|
|
23
|
+
this.name = "DbosDurabilityError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class DbosNotReadyError extends DbosDurabilityError {
|
|
28
|
+
constructor() {
|
|
29
|
+
super("DBOS workflow durability is not ready. Await initializeDurableBackend() before accessing workflows.");
|
|
30
|
+
this.name = "DbosNotReadyError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
type DbosConfigurator = () => Promise<ConfiguredDbosDurability>;
|
|
34
|
+
type LocalDbosProvisioner = () => Promise<void>;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Default path: resolve the local database first (explicit env URL, embedded
|
|
38
|
+
* Postgres, or the Docker fallback), then configure DBOS against it.
|
|
39
|
+
*/
|
|
40
|
+
const defaultConfigurator: DbosConfigurator = async () => {
|
|
41
|
+
const systemDatabaseUrl = await resolveDbosSystemDatabaseUrl();
|
|
42
|
+
return await configureDbosDurableBackend(
|
|
43
|
+
systemDatabaseUrl === undefined ? undefined : { systemDatabaseUrl },
|
|
44
|
+
);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
let configureDurability: DbosConfigurator = defaultConfigurator;
|
|
48
|
+
let provisionLocalDbos: LocalDbosProvisioner = provisionResolvedLocalDbos;
|
|
49
|
+
|
|
50
|
+
let state: DbosLifecycleState = "uninitialized";
|
|
51
|
+
let configured: Promise<ConfiguredDbosDurability> | undefined;
|
|
52
|
+
let active: ConfiguredDbosDurability | undefined;
|
|
53
|
+
let launchPromise: Promise<void> | undefined;
|
|
54
|
+
let shutdownPromise: Promise<void> | undefined;
|
|
55
|
+
let failure: DbosDurabilityError | undefined;
|
|
56
|
+
|
|
57
|
+
function durabilityFailure(action: string, error: unknown): DbosDurabilityError {
|
|
58
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
59
|
+
return new DbosDurabilityError(
|
|
60
|
+
`DBOS workflow durability ${action} failed: ${detail}. Set DBOS_SYSTEM_DATABASE_URL to an existing Postgres when local provisioning is unavailable.`,
|
|
61
|
+
error instanceof Error ? { cause: error } : undefined,
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function configureDbosOnce(): Promise<ConfiguredDbosDurability> {
|
|
66
|
+
if (failure !== undefined) throw failure;
|
|
67
|
+
configured ??= configureDurability().then((value) => {
|
|
68
|
+
active = value;
|
|
69
|
+
state = "configured";
|
|
70
|
+
return value;
|
|
71
|
+
}).catch((error: unknown) => {
|
|
72
|
+
failure = durabilityFailure("configuration", error);
|
|
73
|
+
state = "failed";
|
|
74
|
+
throw failure;
|
|
75
|
+
});
|
|
76
|
+
return await configured;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export async function launchDbosOnce(): Promise<void> {
|
|
80
|
+
if (failure !== undefined) throw failure;
|
|
81
|
+
const durability = await configureDbosOnce();
|
|
82
|
+
launchPromise ??= (async () => {
|
|
83
|
+
state = "launching";
|
|
84
|
+
try {
|
|
85
|
+
await durability.launch();
|
|
86
|
+
state = "ready";
|
|
87
|
+
} catch (error) {
|
|
88
|
+
if (shouldProvisionLocalDbos(error)) {
|
|
89
|
+
try {
|
|
90
|
+
// DBOS creates an executor before testing connectivity. Tear down the
|
|
91
|
+
// failed executor so retry does not leak a pool or hang shutdown.
|
|
92
|
+
await durability.shutdown();
|
|
93
|
+
await provisionLocalDbos();
|
|
94
|
+
await durability.launch();
|
|
95
|
+
state = "ready";
|
|
96
|
+
return;
|
|
97
|
+
} catch (provisionError) {
|
|
98
|
+
failure = durabilityFailure("local Postgres startup", provisionError);
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
failure = durabilityFailure("launch", error);
|
|
102
|
+
}
|
|
103
|
+
state = "failed";
|
|
104
|
+
throw failure;
|
|
105
|
+
}
|
|
106
|
+
})();
|
|
107
|
+
await launchPromise;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export async function getReadyDbosBackend(): Promise<DbosDurableBackend> {
|
|
111
|
+
await launchDbosOnce();
|
|
112
|
+
if (state !== "ready" || active === undefined) throw failure ?? new DbosNotReadyError();
|
|
113
|
+
return active.backend;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function getReadyDbosBackendSync(): DbosDurableBackend | undefined {
|
|
117
|
+
return state === "ready" ? active?.backend : undefined;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export async function shutdownDbos(): Promise<void> {
|
|
121
|
+
if (shutdownPromise !== undefined) return await shutdownPromise;
|
|
122
|
+
if (configured === undefined) return;
|
|
123
|
+
shutdownPromise = (async () => {
|
|
124
|
+
const durability = await configured;
|
|
125
|
+
if (launchPromise !== undefined) await launchPromise;
|
|
126
|
+
if (state !== "ready") return;
|
|
127
|
+
state = "shutting_down";
|
|
128
|
+
await durability.backend.flush();
|
|
129
|
+
await durability.shutdown();
|
|
130
|
+
})().catch((error: unknown) => {
|
|
131
|
+
failure = durabilityFailure("shutdown", error);
|
|
132
|
+
state = "failed";
|
|
133
|
+
throw failure;
|
|
134
|
+
});
|
|
135
|
+
await shutdownPromise;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function dbosLifecycleState(): DbosLifecycleState {
|
|
139
|
+
return state;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** Reset the process singleton with an explicit configurator for unit tests. */
|
|
143
|
+
export function resetDbosLifecycleForTests(
|
|
144
|
+
configurator: DbosConfigurator = defaultConfigurator,
|
|
145
|
+
provisioner: LocalDbosProvisioner = provisionResolvedLocalDbos,
|
|
146
|
+
): void {
|
|
147
|
+
state = "uninitialized";
|
|
148
|
+
configured = undefined;
|
|
149
|
+
active = undefined;
|
|
150
|
+
launchPromise = undefined;
|
|
151
|
+
shutdownPromise = undefined;
|
|
152
|
+
failure = undefined;
|
|
153
|
+
configureDurability = configurator;
|
|
154
|
+
provisionLocalDbos = provisioner;
|
|
155
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local DBOS database resolution.
|
|
3
|
+
*
|
|
4
|
+
* Without `DBOS_SYSTEM_DATABASE_URL`, Atomic never guesses at a user-managed
|
|
5
|
+
* Postgres (a reachable 5432 with foreign credentials is indistinguishable
|
|
6
|
+
* from a misconfiguration). The order is deterministic:
|
|
7
|
+
*
|
|
8
|
+
* 1. `DBOS_SYSTEM_DATABASE_URL` — the user's explicit database.
|
|
9
|
+
* 2. Atomic's embedded Postgres (npm-distributed binaries, no Docker).
|
|
10
|
+
* 3. DBOS's reusable `dbos-db` Docker container, only when the embedded
|
|
11
|
+
* binaries are unavailable for this platform and Docker exists.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
EMBEDDED_DBOS_SYSTEM_DATABASE_URL,
|
|
16
|
+
ensureEmbeddedDbosPostgres,
|
|
17
|
+
} from "./dbos-embedded-postgres.js";
|
|
18
|
+
import { commandFailureDetail, delay, runLocalCommand, tcpReachable } from "./local-command.js";
|
|
19
|
+
|
|
20
|
+
const DOCKER_CONTAINER = "dbos-db";
|
|
21
|
+
const DOCKER_IMAGE = "pgvector/pgvector:pg16";
|
|
22
|
+
const DOCKER_READY_ATTEMPTS = 60;
|
|
23
|
+
const DOCKER_READY_DELAY_MS = 500;
|
|
24
|
+
|
|
25
|
+
type LocalDbosProvider = () => Promise<void>;
|
|
26
|
+
|
|
27
|
+
let resolution: Promise<string | undefined> | undefined;
|
|
28
|
+
let resolvedProvider: LocalDbosProvider | undefined;
|
|
29
|
+
let embeddedProvider: LocalDbosProvider = ensureEmbeddedDbosPostgres;
|
|
30
|
+
let dockerProvider: LocalDbosProvider = ensureDockerDbosPostgres;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the system database URL for this process and make its database
|
|
34
|
+
* reachable. `undefined` defers to the environment/DBOS defaults (explicit
|
|
35
|
+
* user URL or the Docker container that matches them).
|
|
36
|
+
*/
|
|
37
|
+
export function resolveDbosSystemDatabaseUrl(): Promise<string | undefined> {
|
|
38
|
+
resolution ??= resolve().catch((error: unknown) => {
|
|
39
|
+
resolution = undefined;
|
|
40
|
+
throw error;
|
|
41
|
+
});
|
|
42
|
+
return resolution;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Re-ensure the previously resolved local database (launch-retry safety net). */
|
|
46
|
+
export async function provisionResolvedLocalDbos(): Promise<void> {
|
|
47
|
+
await (resolvedProvider ?? embeddedProvider)();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function shouldProvisionLocalDbos(error: unknown): boolean {
|
|
51
|
+
if (process.env.DBOS_SYSTEM_DATABASE_URL?.trim()) return false;
|
|
52
|
+
const message = error instanceof Error ? `${error.message}\n${error.cause ?? ""}` : String(error);
|
|
53
|
+
return /ECONNREFUSED|server not reachable|connect failed|connection refused|unable to connect to system database/i.test(message);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function resolve(): Promise<string | undefined> {
|
|
57
|
+
const explicit = process.env.DBOS_SYSTEM_DATABASE_URL?.trim();
|
|
58
|
+
if (explicit) return undefined;
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
await embeddedProvider();
|
|
62
|
+
resolvedProvider = embeddedProvider;
|
|
63
|
+
return EMBEDDED_DBOS_SYSTEM_DATABASE_URL;
|
|
64
|
+
} catch (embeddedError) {
|
|
65
|
+
try {
|
|
66
|
+
await dockerProvider();
|
|
67
|
+
resolvedProvider = dockerProvider;
|
|
68
|
+
// The container matches DBOS's documented default URL; defer to it.
|
|
69
|
+
return undefined;
|
|
70
|
+
} catch (dockerError) {
|
|
71
|
+
const embeddedDetail = embeddedError instanceof Error ? embeddedError.message : String(embeddedError);
|
|
72
|
+
const dockerDetail = dockerError instanceof Error ? dockerError.message : String(dockerError);
|
|
73
|
+
throw new Error(
|
|
74
|
+
`No usable Postgres for workflow durability. Embedded Postgres: ${embeddedDetail} Docker fallback: ${dockerDetail} `
|
|
75
|
+
+ "Set DBOS_SYSTEM_DATABASE_URL to an existing Postgres to proceed.",
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Start DBOS's canonical reusable local Postgres container. */
|
|
82
|
+
async function ensureDockerDbosPostgres(): Promise<void> {
|
|
83
|
+
const docker = await runLocalCommand("docker", ["version", "--format", "{{.Server.Version}}"]).catch(() => undefined);
|
|
84
|
+
if (docker === undefined || docker.exitCode !== 0) {
|
|
85
|
+
throw new Error("Docker is unavailable.");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const inspection = await runLocalCommand("docker", ["inspect", "--format", "{{.State.Running}}", DOCKER_CONTAINER]);
|
|
89
|
+
if (inspection.exitCode === 0) {
|
|
90
|
+
if (inspection.stdout.trim() !== "true") {
|
|
91
|
+
await requireDockerSuccess("start existing DBOS Postgres", ["start", DOCKER_CONTAINER]);
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
await requireDockerSuccess("create DBOS Postgres", [
|
|
95
|
+
"run", "-d",
|
|
96
|
+
"--name", DOCKER_CONTAINER,
|
|
97
|
+
"-e", "POSTGRES_PASSWORD=dbos",
|
|
98
|
+
"-e", "PGDATA=/var/lib/postgresql/data",
|
|
99
|
+
"-p", "127.0.0.1:5432:5432",
|
|
100
|
+
"-v", "dbos-db-data:/var/lib/postgresql/data",
|
|
101
|
+
DOCKER_IMAGE,
|
|
102
|
+
]);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
for (let attempt = 0; attempt < DOCKER_READY_ATTEMPTS; attempt += 1) {
|
|
106
|
+
if (await tcpReachable("127.0.0.1", 5432)) return;
|
|
107
|
+
await delay(DOCKER_READY_DELAY_MS);
|
|
108
|
+
}
|
|
109
|
+
throw new Error("The DBOS Postgres container started but did not become ready within 30 seconds.");
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function requireDockerSuccess(action: string, args: string[]): Promise<void> {
|
|
113
|
+
const result = await runLocalCommand("docker", args);
|
|
114
|
+
if (result.exitCode === 0) return;
|
|
115
|
+
throw new Error(`Could not ${action}: ${commandFailureDetail(result)}`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function resetLocalDbosProvisioningForTests(
|
|
119
|
+
embedded: LocalDbosProvider = ensureEmbeddedDbosPostgres,
|
|
120
|
+
docker: LocalDbosProvider = ensureDockerDbosPostgres,
|
|
121
|
+
): void {
|
|
122
|
+
resolution = undefined;
|
|
123
|
+
resolvedProvider = undefined;
|
|
124
|
+
embeddedProvider = embedded;
|
|
125
|
+
dockerProvider = docker;
|
|
126
|
+
}
|