@bastani/atomic 0.9.13 → 0.9.14-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/README.md +3 -3
- package/dist/builtin/intercom/package.json +2 -2
- package/dist/builtin/mcp/package.json +3 -3
- package/dist/builtin/subagents/CHANGELOG.md +14 -0
- package/dist/builtin/subagents/README.md +6 -4
- 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 +6 -5
- package/dist/builtin/subagents/src/agents/agent-discovery.ts +17 -11
- package/dist/builtin/subagents/src/agents/agent-loaders.ts +115 -43
- package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +10 -8
- package/dist/builtin/subagents/src/agents/agent-management.ts +8 -7
- package/dist/builtin/subagents/src/agents/agent-overrides.ts +2 -2
- package/dist/builtin/subagents/src/agents/agent-scope.ts +1 -1
- package/dist/builtin/subagents/src/agents/agent-selection.ts +1 -1
- package/dist/builtin/subagents/src/agents/agent-serializer.ts +24 -3
- package/dist/builtin/subagents/src/agents/agent-types.ts +3 -1
- package/dist/builtin/subagents/src/agents/agents.ts +7 -5
- package/dist/builtin/subagents/src/agents/frontmatter.ts +67 -22
- package/dist/builtin/subagents/src/agents/identity.ts +1 -1
- package/dist/builtin/subagents/src/agents/skills-paths.ts +1 -1
- package/dist/builtin/subagents/src/agents/skills.ts +64 -6
- package/dist/builtin/subagents/src/extension/config.ts +1 -1
- package/dist/builtin/subagents/src/extension/control-notices.ts +2 -2
- package/dist/builtin/subagents/src/extension/doctor.ts +15 -5
- package/dist/builtin/subagents/src/extension/fanout-child.ts +12 -12
- package/dist/builtin/subagents/src/extension/index.ts +23 -23
- package/dist/builtin/subagents/src/extension/notification-content.ts +1 -1
- package/dist/builtin/subagents/src/extension/schemas.ts +1 -1
- package/dist/builtin/subagents/src/extension/startup-maintenance.ts +3 -3
- package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +3 -3
- package/dist/builtin/subagents/src/intercom/result-intercom.ts +1 -1
- package/dist/builtin/subagents/src/intercom/supervisor-authorization.ts +1 -1
- package/dist/builtin/subagents/src/runs/foreground/completion-notification.ts +2 -2
- package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +1 -1
- package/dist/builtin/subagents/src/runs/foreground/execution-intercom-detach.ts +3 -3
- package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +1 -1
- package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +2 -2
- package/dist/builtin/subagents/src/runs/foreground/execution-utils.ts +1 -1
- package/dist/builtin/subagents/src/runs/foreground/execution.ts +2 -2
- package/dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts +27 -11
- package/dist/builtin/subagents/src/runs/foreground/notify.ts +3 -3
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +11 -11
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +3 -3
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +15 -14
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +19 -19
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +2 -2
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +14 -13
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +9 -9
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +7 -7
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +6 -6
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +24 -23
- package/dist/builtin/subagents/src/runs/inprocess/control-registry.ts +1 -1
- package/dist/builtin/subagents/src/runs/inprocess/control-status.ts +3 -3
- package/dist/builtin/subagents/src/runs/inprocess/index.ts +3 -3
- package/dist/builtin/subagents/src/runs/inprocess/prompt-behavior.ts +17 -8
- package/dist/builtin/subagents/src/runs/inprocess/runner.ts +60 -12
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-api.ts +8 -8
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-control.ts +3 -3
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-core.ts +4 -4
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-projection.ts +4 -4
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-registry.ts +5 -5
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-rendering.ts +3 -3
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-sanitize.ts +3 -3
- package/dist/builtin/subagents/src/runs/inprocess.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/long-running-guard.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/model-candidate-filter.ts +3 -3
- package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +2 -2
- package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/single-output.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/subagent-control.ts +1 -1
- package/dist/builtin/subagents/src/shared/artifacts.ts +2 -2
- package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +1 -1
- package/dist/builtin/subagents/src/shared/fast-mode.ts +1 -1
- package/dist/builtin/subagents/src/shared/formatters.ts +2 -2
- package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -1
- package/dist/builtin/subagents/src/shared/model-resolution.ts +1 -1
- package/dist/builtin/subagents/src/shared/session-tokens.ts +1 -1
- package/dist/builtin/subagents/src/shared/settings.ts +4 -4
- package/dist/builtin/subagents/src/shared/status-format.ts +1 -1
- package/dist/builtin/subagents/src/shared/types-config.ts +16 -4
- package/dist/builtin/subagents/src/shared/types-depth.ts +1 -1
- package/dist/builtin/subagents/src/shared/types-nested.ts +1 -1
- package/dist/builtin/subagents/src/shared/types-output.ts +1 -1
- package/dist/builtin/subagents/src/shared/types-results.ts +1 -1
- package/dist/builtin/subagents/src/shared/types-runtime.ts +1 -1
- package/dist/builtin/subagents/src/shared/types.ts +6 -6
- package/dist/builtin/subagents/src/shared/utils.ts +3 -3
- package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +1 -1
- package/dist/builtin/subagents/src/slash/slash-bridge.ts +3 -3
- package/dist/builtin/subagents/src/slash/slash-commands.ts +6 -6
- package/dist/builtin/subagents/src/slash/slash-live-state.ts +3 -3
- package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -2
- package/dist/builtin/subagents/src/tui/render-layout.ts +1 -1
- package/dist/builtin/subagents/src/tui/render-progress.ts +2 -2
- package/dist/builtin/subagents/src/tui/render-result-compact.ts +7 -7
- package/dist/builtin/subagents/src/tui/render-result.ts +10 -10
- package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -1
- package/dist/builtin/subagents/src/tui/render-status-progress.ts +5 -5
- package/dist/builtin/subagents/src/tui/render.ts +4 -4
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/workflows/CHANGELOG.md +57 -0
- package/dist/builtin/workflows/README.md +39 -8
- package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +16 -5
- package/dist/builtin/workflows/builtin/adversarial-verification.ts +4 -0
- package/dist/builtin/workflows/builtin/classify-and-act.ts +4 -0
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +4 -0
- package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +12 -4
- package/dist/builtin/workflows/builtin/generate-and-filter.ts +4 -0
- package/dist/builtin/workflows/builtin/goal-models.ts +8 -10
- package/dist/builtin/workflows/builtin/goal.ts +4 -0
- package/dist/builtin/workflows/builtin/index.d.ts +0 -4
- package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +4 -2
- package/dist/builtin/workflows/builtin/loop-until-done.ts +4 -0
- package/dist/builtin/workflows/builtin/open-claude-design-live-protocol.ts +305 -0
- package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +115 -171
- package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +9 -25
- package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +19 -86
- package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +0 -6
- package/dist/builtin/workflows/builtin/open-claude-design.d.ts +0 -5
- package/dist/builtin/workflows/builtin/open-claude-design.ts +11 -15
- package/dist/builtin/workflows/builtin/ralph-models.ts +24 -29
- package/dist/builtin/workflows/builtin/ralph.ts +4 -0
- package/dist/builtin/workflows/builtin/tournament-runner.ts +6 -3
- package/dist/builtin/workflows/builtin/tournament.ts +4 -0
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/skills/impeccable/SKILL.md +3 -3
- package/dist/builtin/workflows/skills/impeccable/agents/impeccable_asset_producer.toml +25 -31
- package/dist/builtin/workflows/skills/impeccable/agents/impeccable_documenter.toml +1 -0
- package/dist/builtin/workflows/skills/impeccable/agents/impeccable_finish_reviewer.toml +16 -10
- package/dist/builtin/workflows/skills/impeccable/agents/impeccable_manual_edit_applier.toml +2 -2
- package/dist/builtin/workflows/skills/impeccable/reference/android.md +6 -0
- package/dist/builtin/workflows/skills/impeccable/reference/animate.md +3 -0
- package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +3 -1
- package/dist/builtin/workflows/skills/impeccable/reference/craft-floor.md +6 -1
- package/dist/builtin/workflows/skills/impeccable/reference/critique.md +18 -2
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/asset-producer.md +24 -30
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/documenter.md +1 -0
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +16 -10
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/manual-edit-applier.md +2 -2
- package/dist/builtin/workflows/skills/impeccable/reference/distill.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/doctor.md +1 -0
- package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/extract.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +12 -6
- package/dist/builtin/workflows/skills/impeccable/reference/init.md +12 -3
- package/dist/builtin/workflows/skills/impeccable/reference/ios.md +6 -0
- package/dist/builtin/workflows/skills/impeccable/reference/live-setup.md +102 -0
- package/dist/builtin/workflows/skills/impeccable/reference/live.md +113 -521
- package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +39 -26
- package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/polish.md +3 -3
- package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +25 -11
- package/dist/builtin/workflows/skills/impeccable/scripts/concept-seed.mjs +332 -221
- package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +10 -19
- package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +91 -38
- package/dist/builtin/workflows/skills/impeccable/scripts/critique-storage.mjs +19 -10
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +56 -6
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +10 -16
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +140 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +1174 -694
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns.mjs +1 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +5 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +431 -45
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +10 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +47 -6
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/node/file-system.mjs +23 -22
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +0 -10
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +384 -384
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/color.mjs +466 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/doctor.mjs +2 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/embed-prompt.mjs +270 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/generate-image.mjs +51 -6
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +70 -10
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +336 -90
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/composition-catalog.mjs +38 -3
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/concept-catalog.mjs +77 -11
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/design-parser.mjs +102 -19
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +44 -59
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +3 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/open-system-browser.mjs +57 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/roll-selection.mjs +369 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness-deep.mjs +31 -3
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness.mjs +73 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-css.mjs +617 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-verify.mjs +71 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/browser-script-parts.mjs +29 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/live/event-validation.mjs +54 -7
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/astro.mjs +47 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/detect-utils.mjs +157 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/index.mjs +143 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/journal.mjs +205 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nuxt.mjs +170 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/script-src.mjs +26 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/instructions.mjs +169 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/roots.mjs +670 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/session-store.mjs +232 -35
- package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-ast.mjs +969 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +621 -74
- package/dist/builtin/workflows/skills/impeccable/scripts/live/sveltekit-adapter.mjs +66 -28
- package/dist/builtin/workflows/skills/impeccable/scripts/live/tanstack-adapter.mjs +12 -12
- package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-surfaces.mjs +75 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/vocabulary.mjs +135 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +23 -37
- package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +945 -115
- package/dist/builtin/workflows/skills/impeccable/scripts/live-complete.mjs +33 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/live-copy-edit-agent.mjs +132 -15
- package/dist/builtin/workflows/skills/impeccable/scripts/live-inject.mjs +173 -425
- package/dist/builtin/workflows/skills/impeccable/scripts/live-insert.mjs +2 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-poll.mjs +16 -3
- package/dist/builtin/workflows/skills/impeccable/scripts/live-resume.mjs +39 -10
- package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +194 -27
- package/dist/builtin/workflows/skills/impeccable/scripts/live-status.mjs +10 -4
- package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +50 -31
- package/dist/builtin/workflows/skills/impeccable/scripts/live.mjs +91 -28
- package/dist/builtin/workflows/skills/impeccable/scripts/pin.mjs +8 -5
- package/dist/builtin/workflows/skills/impeccable/scripts/serve-question.mjs +759 -109
- package/dist/builtin/workflows/src/authoring/workflow.ts +9 -0
- package/dist/builtin/workflows/src/authoring.d.ts +3 -0
- package/dist/builtin/workflows/src/durable/completed-catalog.ts +23 -2
- package/dist/builtin/workflows/src/durable/dbos-backend.ts +30 -17
- package/dist/builtin/workflows/src/durable/dbos-envelope.ts +14 -0
- package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +60 -57
- package/dist/builtin/workflows/src/durable/dbos-process-owner.ts +87 -0
- package/dist/builtin/workflows/src/durable/dbos-registration-diagnostics.ts +113 -0
- package/dist/builtin/workflows/src/durable/factory.ts +11 -8
- package/dist/builtin/workflows/src/durable/tool-failure-checkpoint.ts +5 -0
- package/dist/builtin/workflows/src/durable/tool-primitive.ts +186 -20
- package/dist/builtin/workflows/src/durable/types.ts +4 -0
- package/dist/builtin/workflows/src/durable/workflow-heartbeat-anchor.ts +153 -0
- package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +28 -0
- package/dist/builtin/workflows/src/engine/run-tool-control-registry.ts +9 -1
- package/dist/builtin/workflows/src/engine/run.ts +1 -0
- package/dist/builtin/workflows/src/extension/adopt-session-run-state.ts +20 -0
- package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +9 -30
- package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
- package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +28 -10
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +138 -0
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +3365 -1341
- package/dist/builtin/workflows/src/extension/workflow-heartbeat-delivery.ts +197 -0
- package/dist/builtin/workflows/src/extension/workflow-heartbeat-notice.ts +115 -0
- package/dist/builtin/workflows/src/extension/workflow-heartbeat-scheduler.ts +962 -0
- package/dist/builtin/workflows/src/extension/workflow-prompts.ts +4 -1
- package/dist/builtin/workflows/src/extension/workflow-schema.ts +29 -5
- package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +32 -1
- package/dist/builtin/workflows/src/runs/background/cancellation-registry.ts +10 -1
- package/dist/builtin/workflows/src/runs/background/job-tracker.ts +10 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +16 -11
- package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +31 -1
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +41 -10
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +48 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +4 -1
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +45 -12
- package/dist/builtin/workflows/src/sdk-surface.ts +9 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +10 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +10 -0
- package/dist/builtin/workflows/src/shared/graph-store-snapshot.ts +14 -2
- package/dist/builtin/workflows/src/shared/persistence-restore.ts +12 -0
- package/dist/builtin/workflows/src/shared/prompt-answer.ts +130 -0
- package/dist/builtin/workflows/src/shared/session-scoped-singleton.ts +98 -0
- package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +9 -1
- package/dist/builtin/workflows/src/shared/store-factory.ts +9 -1
- package/dist/builtin/workflows/src/shared/store-public-types.ts +2 -1
- package/dist/builtin/workflows/src/shared/store-tool-node-methods.ts +7 -0
- package/dist/builtin/workflows/src/shared/store-types.ts +18 -1
- package/dist/builtin/workflows/src/shared/tool-payload-bounds.ts +576 -0
- package/dist/builtin/workflows/src/shared/workflow-authoring-types.d.ts +1 -0
- package/dist/builtin/workflows/src/shared/workflow-authoring-types.ts +1 -0
- package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.d.ts +21 -0
- package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.ts +25 -0
- package/dist/builtin/workflows/src/tui/graph-theme.ts +8 -1
- package/dist/builtin/workflows/src/tui/graph-view-constants.ts +11 -0
- package/dist/builtin/workflows/src/tui/graph-view-input.ts +100 -5
- package/dist/builtin/workflows/src/tui/graph-view-layout.ts +42 -11
- package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +55 -6
- package/dist/builtin/workflows/src/tui/graph-view-render.ts +71 -6
- package/dist/builtin/workflows/src/tui/graph-view-state.ts +43 -0
- package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +2 -0
- package/dist/builtin/workflows/src/tui/node-card.ts +5 -1
- package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +11 -2
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +36 -10
- package/dist/builtin/workflows/src/tui/switcher.ts +11 -4
- package/dist/builtin/workflows/src/tui/tool-detail.ts +348 -0
- package/dist/builtin/workflows/src/tui/workflow-status.ts +5 -2
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +11 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.d.ts +1 -1
- package/dist/cli/auth-check.js.map +1 -1
- package/dist/cli/credential-print.d.ts +1 -1
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/cli/list-models.d.ts +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/startup-ui.d.ts +9 -0
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +7 -1
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/core/agent-session-custom-message-commit.js +2 -2
- package/dist/core/agent-session-custom-message-commit.js.map +1 -1
- package/dist/core/agent-session-export.d.ts +6 -1
- package/dist/core/agent-session-export.d.ts.map +1 -1
- package/dist/core/agent-session-export.js +6 -3
- package/dist/core/agent-session-export.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +6 -4
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +5 -2
- 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-prompt.d.ts +12 -1
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +31 -10
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-runtime-auth.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-skill-block.d.ts +1 -0
- package/dist/core/agent-session-skill-block.d.ts.map +1 -1
- package/dist/core/agent-session-skill-block.js +18 -2
- package/dist/core/agent-session-skill-block.js.map +1 -1
- package/dist/core/agent-session-state.d.ts.map +1 -1
- package/dist/core/agent-session-state.js +2 -1
- package/dist/core/agent-session-state.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +2 -1
- 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 +1 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/atomic-guide-command.js +2 -2
- package/dist/core/atomic-guide-command.js.map +1 -1
- package/dist/core/builtin-packages.d.ts.map +1 -1
- package/dist/core/builtin-packages.js +0 -6
- package/dist/core/builtin-packages.js.map +1 -1
- package/dist/core/cloudflare-gateway-binding.d.ts +11 -0
- package/dist/core/cloudflare-gateway-binding.d.ts.map +1 -0
- package/dist/core/cloudflare-gateway-binding.js +11 -0
- package/dist/core/cloudflare-gateway-binding.js.map +1 -0
- package/dist/core/codex-fast-mode-transport.d.ts +12 -0
- package/dist/core/codex-fast-mode-transport.d.ts.map +1 -0
- package/dist/core/codex-fast-mode-transport.js +130 -0
- package/dist/core/codex-fast-mode-transport.js.map +1 -0
- package/dist/core/codex-fast-mode.d.ts +20 -6
- package/dist/core/codex-fast-mode.d.ts.map +1 -1
- package/dist/core/codex-fast-mode.js +111 -3
- package/dist/core/codex-fast-mode.js.map +1 -1
- package/dist/core/diagnostics.d.ts +4 -0
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/diagnostics.js.map +1 -1
- package/dist/core/event-bus.d.ts +12 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +22 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/experimental.d.ts +25 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +24 -0
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/export-html/template-js/tree-filter-render.js +4 -3
- package/dist/core/export-html/template.js +4 -3
- package/dist/core/extension-session-state.d.ts +28 -0
- package/dist/core/extension-session-state.d.ts.map +1 -0
- package/dist/core/extension-session-state.js +55 -0
- package/dist/core/extension-session-state.js.map +1 -0
- package/dist/core/extensions/api-types.d.ts +6 -0
- 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 +4 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -0
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +1 -0
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader-api.d.ts +1 -1
- package/dist/core/extensions/loader-api.d.ts.map +1 -1
- package/dist/core/extensions/loader-api.js +16 -10
- package/dist/core/extensions/loader-api.js.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +12 -1
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/extensions/runner-context.d.ts +2 -0
- package/dist/core/extensions/runner-context.d.ts.map +1 -1
- package/dist/core/extensions/runner-context.js +8 -0
- package/dist/core/extensions/runner-context.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +3 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts +3 -0
- 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 +26 -0
- package/dist/core/extensions/ui-types.d.ts.map +1 -1
- package/dist/core/extensions/ui-types.js +17 -1
- package/dist/core/extensions/ui-types.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +5 -0
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/keybindings.d.ts +24 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +6 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-config.d.ts +5 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +1 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver-cli.d.ts +1 -1
- package/dist/core/model-resolver-cli.js.map +1 -1
- package/dist/core/model-resolver-defaults.js +3 -3
- package/dist/core/model-resolver-defaults.js.map +1 -1
- package/dist/core/model-resolver-initial.d.ts +1 -1
- package/dist/core/model-resolver-initial.js.map +1 -1
- package/dist/core/model-resolver-scope.d.ts +1 -1
- package/dist/core/model-resolver-scope.js.map +1 -1
- package/dist/core/model-runtime.d.ts +54 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +96 -13
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/oauth-login.js.map +1 -1
- package/dist/core/project-trust.d.ts +10 -0
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js +12 -0
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/resource-loader-assets.d.ts.map +1 -1
- package/dist/core/resource-loader-assets.js +14 -5
- package/dist/core/resource-loader-assets.js.map +1 -1
- package/dist/core/resource-loader-core.d.ts +3 -0
- package/dist/core/resource-loader-core.d.ts.map +1 -1
- package/dist/core/resource-loader-core.js +5 -0
- package/dist/core/resource-loader-core.js.map +1 -1
- package/dist/core/resource-loader-internals.d.ts +2 -0
- package/dist/core/resource-loader-internals.d.ts.map +1 -1
- package/dist/core/resource-loader-internals.js.map +1 -1
- package/dist/core/resource-loader-reload.d.ts.map +1 -1
- package/dist/core/resource-loader-reload.js +2 -0
- package/dist/core/resource-loader-reload.js.map +1 -1
- package/dist/core/resource-loader-types.d.ts +2 -0
- package/dist/core/resource-loader-types.d.ts.map +1 -1
- package/dist/core/resource-loader-types.js.map +1 -1
- package/dist/core/resource-loader.d.ts +2 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +1 -0
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk-types.d.ts +7 -6
- package/dist/core/sdk-types.d.ts.map +1 -1
- package/dist/core/sdk-types.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +17 -6
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-core.d.ts +7 -1
- package/dist/core/session-manager-core.d.ts.map +1 -1
- package/dist/core/session-manager-core.js +11 -2
- package/dist/core/session-manager-core.js.map +1 -1
- package/dist/core/session-manager-entries.d.ts +2 -2
- package/dist/core/session-manager-entries.d.ts.map +1 -1
- package/dist/core/session-manager-entries.js +6 -4
- package/dist/core/session-manager-entries.js.map +1 -1
- package/dist/core/session-manager-list.d.ts.map +1 -1
- package/dist/core/session-manager-list.js +5 -1
- package/dist/core/session-manager-list.js.map +1 -1
- package/dist/core/session-manager-types.d.ts +25 -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/session-manager.d.ts +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts +1 -0
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-basic-accessors.js +8 -0
- package/dist/core/settings-manager-basic-accessors.js.map +1 -1
- package/dist/core/settings-manager-ui-accessors.d.ts +3 -1
- package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-ui-accessors.js +9 -0
- package/dist/core/settings-manager-ui-accessors.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-types.d.ts +4 -0
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/skill-catalog.d.ts +35 -0
- package/dist/core/skill-catalog.d.ts.map +1 -0
- package/dist/core/skill-catalog.js +264 -0
- package/dist/core/skill-catalog.js.map +1 -0
- package/dist/core/skills-async.d.ts.map +1 -1
- package/dist/core/skills-async.js +12 -6
- package/dist/core/skills-async.js.map +1 -1
- package/dist/core/skills.d.ts +2 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +8 -5
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -5
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.js +2 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/ask-user-question/ask-user-question.d.ts +25 -2
- package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/ask-user-question.js +47 -18
- package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.js +5 -2
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/submit-picker.js +3 -1
- package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +8 -1
- package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +2 -0
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +2 -0
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +3 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/hashline-engine/format.d.ts +2 -0
- package/dist/core/tools/hashline-engine/format.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/format.js +4 -2
- package/dist/core/tools/hashline-engine/format.js.map +1 -1
- package/dist/core/tools/hashline-engine/messages.d.ts +2 -0
- package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/messages.js +4 -2
- package/dist/core/tools/hashline-engine/messages.js.map +1 -1
- package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/parser.js +16 -4
- package/dist/core/tools/hashline-engine/parser.js.map +1 -1
- package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/tokenizer.js +37 -27
- package/dist/core/tools/hashline-engine/tokenizer.js.map +1 -1
- package/dist/core/tools/hashline.d.ts.map +1 -1
- package/dist/core/tools/hashline.js +8 -2
- package/dist/core/tools/hashline.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +2 -0
- 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 +8 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/search.d.ts.map +1 -1
- package/dist/core/tools/search.js +2 -0
- package/dist/core/tools/search.js.map +1 -1
- package/dist/core/tools/todos.d.ts +3 -12
- package/dist/core/tools/todos.d.ts.map +1 -1
- package/dist/core/tools/todos.js +19 -4
- package/dist/core/tools/todos.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +2 -0
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index-extensions.d.ts +1 -1
- package/dist/index-extensions.d.ts.map +1 -1
- package/dist/index-extensions.js +1 -1
- package/dist/index-extensions.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/main-runtime-api-key.d.ts +1 -1
- package/dist/main-runtime-api-key.js.map +1 -1
- package/dist/main-session-options.d.ts +1 -1
- package/dist/main-session-options.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +10 -2
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.js +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.d.ts +8 -0
- package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.js +8 -0
- package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.d.ts +26 -0
- package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.js +38 -0
- package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.d.ts +37 -0
- package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.js +54 -1
- package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
- package/dist/modes/interactive/components/fast-mode-selector.js +1 -1
- package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +2 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/reserved-bottom-overlay.d.ts +95 -0
- package/dist/modes/interactive/components/reserved-bottom-overlay.d.ts.map +1 -0
- package/dist/modes/interactive/components/reserved-bottom-overlay.js +234 -0
- package/dist/modes/interactive/components/reserved-bottom-overlay.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js +4 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
- package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js +7 -0
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +12 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.js +5 -4
- package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-bash-compact.js +2 -2
- package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-custom-ui.js +94 -6
- package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +41 -3
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +80 -11
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +9 -1
- 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 +2 -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-catalog-startup.d.ts +8 -1
- package/dist/modes/interactive/interactive-model-catalog-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-model-catalog-startup.js +13 -3
- package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.js +3 -4
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +6 -0
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-resource-disclosure.js +2 -2
- package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +7 -3
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +7 -1
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-slash-commands.js +2 -2
- package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +34 -9
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-tui.d.ts +21 -1
- package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-tui.js +140 -38
- package/dist/modes/interactive/interactive-tui.js.map +1 -1
- package/dist/modes/interactive/model-catalog-refresh.d.ts +17 -0
- package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
- package/dist/modes/interactive/model-catalog-refresh.js +84 -0
- package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +2 -0
- package/dist/modes/interactive/theme/light.json +2 -0
- package/dist/modes/interactive/theme/theme-class.d.ts +12 -3
- package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-class.js +6 -1
- package/dist/modes/interactive/theme/theme-class.js.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +23 -10
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.js +1 -0
- package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.d.ts +8 -0
- package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.js +3 -1
- package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +9 -1
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts +2 -0
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.js +1 -0
- package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
- package/dist/modes/interactive-engine/protocol.d.ts +1 -0
- package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
- package/dist/modes/interactive-engine/protocol.js +1 -0
- package/dist/modes/interactive-engine/protocol.js.map +1 -1
- package/dist/modes/interactive-engine/remote-component.d.ts +3 -1
- package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
- package/dist/modes/interactive-engine/remote-component.js +3 -2
- package/dist/modes/interactive-engine/remote-component.js.map +1 -1
- package/dist/modes/json-event.d.ts +6 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +17 -2
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.js +5 -4
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
- package/dist/modes/rpc/rpc-responses.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/server/create-harness.d.ts.map +1 -1
- package/dist/server/create-harness.js +11 -0
- package/dist/server/create-harness.js.map +1 -1
- package/dist/utils/abort.d.ts +9 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +19 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +16 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +19 -19
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/custom-provider.md +9 -8
- package/docs/development.md +0 -1
- package/docs/docs.json +0 -1
- package/docs/environment-variables.md +3 -0
- package/docs/extensions.md +100 -2
- package/docs/json.md +3 -1
- package/docs/keybindings.md +8 -3
- package/docs/models/artificial-analysis-index.md +2 -2
- package/docs/models/model-selection.md +32 -23
- package/docs/models/pareto-efficiency.md +25 -24
- package/docs/providers.md +95 -2
- package/docs/quickstart.md +4 -2
- package/docs/rpc.md +21 -7
- package/docs/sdk.md +26 -1
- package/docs/session-format.md +5 -2
- package/docs/settings.md +34 -3
- package/docs/skills.md +16 -1
- package/docs/terminal-setup.md +15 -2
- package/docs/themes.md +22 -4
- package/docs/tools.md +3 -1
- package/docs/tui.md +2 -0
- package/docs/usage.md +5 -4
- package/docs/workflows.md +96 -19
- package/npm-shrinkwrap.json +211 -232
- package/package.json +8 -8
- package/dist/builtin/i-have-adhd/CHANGELOG.md +0 -30
- package/dist/builtin/i-have-adhd/LICENSE +0 -21
- package/dist/builtin/i-have-adhd/README.md +0 -18
- package/dist/builtin/i-have-adhd/index.ts +0 -238
- package/dist/builtin/i-have-adhd/package.json +0 -56
- package/dist/builtin/i-have-adhd/skills/i-have-adhd/SKILL.md +0 -140
- package/dist/builtin/workflows/builtin/open-claude-design-feedback.ts +0 -359
- package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-core.mjs +0 -180
- package/docs/i-have-adhd.md +0 -36
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ToolNodeSnapshot } from "../shared/store-types.js";
|
|
2
|
+
import type { WorkflowSerializableValue } from "../shared/types.js";
|
|
2
3
|
import type { DurableWorkflowBackend } from "./backend.js";
|
|
3
4
|
import { workflowToolFailure } from "./tool-outcome.js";
|
|
4
5
|
import { DURABLE_TOOL_TOPOLOGY_VERSION, type DurableStageRunTopology } from "./types.js";
|
|
@@ -16,6 +17,8 @@ export async function recordThrowingToolFailure(
|
|
|
16
17
|
node: ToolNodeSnapshot,
|
|
17
18
|
identity: {
|
|
18
19
|
readonly name: string;
|
|
20
|
+
readonly args?: Readonly<Record<string, WorkflowSerializableValue>>;
|
|
21
|
+
readonly source?: string;
|
|
19
22
|
readonly argsHash: string;
|
|
20
23
|
readonly ordinal: number;
|
|
21
24
|
readonly startedAt: number;
|
|
@@ -30,6 +33,8 @@ export async function recordThrowingToolFailure(
|
|
|
30
33
|
workflowId: input.workflowId,
|
|
31
34
|
checkpointId: `tool-failure:${identity.argsHash}:${input.nextCheckpointId()}`,
|
|
32
35
|
name: identity.name,
|
|
36
|
+
...(identity.args !== undefined ? { args: identity.args } : {}),
|
|
37
|
+
...(identity.source !== undefined ? { source: identity.source } : {}),
|
|
33
38
|
argsHash: identity.argsHash,
|
|
34
39
|
output: null,
|
|
35
40
|
throwingFailureError: message,
|
|
@@ -19,6 +19,7 @@ import { runCallback } from "@bastani/atomic";
|
|
|
19
19
|
import { sleepOrAbort } from "../runs/shared/retry.js";
|
|
20
20
|
import { flattenTruncatedString } from "../shared/flat-string.js";
|
|
21
21
|
import type { ToolNodeSnapshot } from "../shared/store-types.js";
|
|
22
|
+
import { boundedToolPayloadRecord, boundedToolText } from "../shared/tool-payload-bounds.js";
|
|
22
23
|
import type {
|
|
23
24
|
WorkflowSerializableValue,
|
|
24
25
|
WorkflowToolContext,
|
|
@@ -109,12 +110,41 @@ export interface CreateToolPrimitiveInput {
|
|
|
109
110
|
readonly onNodeRunning?: (nodeId: string, startedAt: number) => void;
|
|
110
111
|
readonly onNodeEnd?: (
|
|
111
112
|
nodeId: string,
|
|
112
|
-
update: Pick<ToolNodeSnapshot, "status"> &
|
|
113
|
+
update: Pick<ToolNodeSnapshot, "status"> &
|
|
114
|
+
Partial<Pick<ToolNodeSnapshot, "endedAt" | "durationMs" | "result" | "resultSummary" | "error">>,
|
|
113
115
|
) => void;
|
|
114
116
|
readonly onNodeSettle?: (nodeId: string) => void;
|
|
115
117
|
readonly runTopology?: DurableStageRunTopology;
|
|
116
118
|
}
|
|
117
119
|
|
|
120
|
+
function cloneToolArgs(
|
|
121
|
+
args: Readonly<Record<string, WorkflowSerializableValue>>,
|
|
122
|
+
): Readonly<Record<string, WorkflowSerializableValue>> {
|
|
123
|
+
// Bounded, hostile-input safe, and always a plain object: author args may be
|
|
124
|
+
// cyclic, may throw on property access, may be arbitrarily large, and may
|
|
125
|
+
// carry a `toJSON` that would otherwise collapse the record to a scalar in a
|
|
126
|
+
// durable checkpoint. `argsHash` still hashes the raw args, so cache identity
|
|
127
|
+
// is unaffected by this inspection copy.
|
|
128
|
+
return boundedToolPayloadRecord(args);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Capture the callback's own source for read-only inspection.
|
|
133
|
+
*
|
|
134
|
+
* `Function.prototype.toString` reads text the runtime already holds: it never
|
|
135
|
+
* invokes the callback, never touches the filesystem, and never reaches any
|
|
136
|
+
* data beyond the function passed to this call. A host that refuses the read
|
|
137
|
+
* simply yields no source row.
|
|
138
|
+
*/
|
|
139
|
+
function captureCallbackSource(fn: unknown): string | undefined {
|
|
140
|
+
if (typeof fn !== "function") return undefined;
|
|
141
|
+
try {
|
|
142
|
+
return boundedToolText(Function.prototype.toString.call(fn));
|
|
143
|
+
} catch {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
118
148
|
/**
|
|
119
149
|
* Create the `ctx.tool` primitive wired to a durable backend.
|
|
120
150
|
*/
|
|
@@ -155,7 +185,7 @@ export function createToolPrimitive(input: CreateToolPrimitiveInput): WorkflowTo
|
|
|
155
185
|
noteCancelled: () => admission?.noteCancelled?.(),
|
|
156
186
|
releaseAdmission: () => lease?.release(),
|
|
157
187
|
};
|
|
158
|
-
void executeToolInvocation(input, ordinals, name, args, fn, options, control)
|
|
188
|
+
void executeToolInvocation(input, ordinals, name, args, fn, options, control, captureCallbackSource(fn))
|
|
159
189
|
// Backstop for a throw before either explicit release point; the lease
|
|
160
190
|
// release itself is idempotent.
|
|
161
191
|
.finally(() => lease?.release())
|
|
@@ -172,6 +202,7 @@ async function executeToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
172
202
|
fn: (toolCtx: WorkflowToolContext) => Promise<T>,
|
|
173
203
|
options: WorkflowToolOptions | undefined,
|
|
174
204
|
control: ToolInvocationAdmissionControl,
|
|
205
|
+
source: string | undefined,
|
|
175
206
|
): Promise<WorkflowToolInvocationResult<T>> {
|
|
176
207
|
input.throwIfCancelled();
|
|
177
208
|
if (
|
|
@@ -181,6 +212,9 @@ async function executeToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
181
212
|
) {
|
|
182
213
|
throw new RangeError("atomic-workflows: ctx.tool maxAttempts must be a positive integer");
|
|
183
214
|
}
|
|
215
|
+
if (options?.timeoutMs !== undefined && (!Number.isFinite(options.timeoutMs) || options.timeoutMs <= 0)) {
|
|
216
|
+
throw new RangeError("atomic-workflows: ctx.tool timeoutMs must be a positive finite number");
|
|
217
|
+
}
|
|
184
218
|
const returnFailure = options?.failureMode === "return";
|
|
185
219
|
const identityMode = returnFailure ? { failureMode: "return" as const } : {};
|
|
186
220
|
const callKey = durableHash({ name, args, ...identityMode });
|
|
@@ -189,10 +223,13 @@ async function executeToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
189
223
|
const argsHash = durableHash({ name, args, ordinal, ...identityMode });
|
|
190
224
|
|
|
191
225
|
const cached = input.backend.getToolCheckpoint(input.workflowId, argsHash);
|
|
226
|
+
const capturedSource = cached?.source ?? source;
|
|
192
227
|
const node: ToolNodeSnapshot = {
|
|
193
228
|
kind: "tool",
|
|
194
229
|
id: cached?.topology?.nodeId ?? `tool:${argsHash}`,
|
|
195
230
|
name,
|
|
231
|
+
args: cloneToolArgs(cached?.args ?? args),
|
|
232
|
+
...(capturedSource !== undefined ? { source: capturedSource } : {}),
|
|
196
233
|
argsHash,
|
|
197
234
|
ordinal: cached?.topology?.ordinal ?? ordinal,
|
|
198
235
|
parentIds: Object.freeze(cached?.topology?.parentIds ?? []),
|
|
@@ -223,6 +260,8 @@ async function executeToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
223
260
|
input.onNodeEnd?.(node.id, {
|
|
224
261
|
status: failed ? "failed" : "cached",
|
|
225
262
|
endedAt,
|
|
263
|
+
...(node.startedAt !== undefined ? { durationMs: Math.max(0, endedAt - node.startedAt) } : {}),
|
|
264
|
+
result: output,
|
|
226
265
|
...(failed && returnedOutcome?.ok === false
|
|
227
266
|
? { error: returnedOutcome.error.message }
|
|
228
267
|
: { resultSummary: summarizeToolResult(output) }),
|
|
@@ -233,9 +272,11 @@ async function executeToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
233
272
|
const cancelled = input.signal?.aborted === true;
|
|
234
273
|
if (cancelled) control.noteCancelled();
|
|
235
274
|
else input.onFailureObserved?.(error, node.id);
|
|
275
|
+
const endedAt = Date.now();
|
|
236
276
|
input.onNodeEnd?.(node.id, {
|
|
237
277
|
status: cancelled ? "cancelled" : "failed",
|
|
238
|
-
endedAt
|
|
278
|
+
endedAt,
|
|
279
|
+
...(node.startedAt !== undefined ? { durationMs: Math.max(0, endedAt - node.startedAt) } : {}),
|
|
239
280
|
error: error instanceof Error ? error.message : String(error),
|
|
240
281
|
});
|
|
241
282
|
input.onNodeSettle?.(node.id);
|
|
@@ -246,6 +287,8 @@ async function executeToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
246
287
|
input,
|
|
247
288
|
node,
|
|
248
289
|
name,
|
|
290
|
+
args: node.args ?? args,
|
|
291
|
+
...(capturedSource !== undefined ? { source: capturedSource } : {}),
|
|
249
292
|
argsHash,
|
|
250
293
|
ordinal,
|
|
251
294
|
fn,
|
|
@@ -259,6 +302,8 @@ interface LiveToolInvocation<T extends WorkflowSerializableValue> {
|
|
|
259
302
|
readonly input: CreateToolPrimitiveInput;
|
|
260
303
|
readonly node: ToolNodeSnapshot;
|
|
261
304
|
readonly name: string;
|
|
305
|
+
readonly args: Readonly<Record<string, WorkflowSerializableValue>>;
|
|
306
|
+
readonly source?: string;
|
|
262
307
|
readonly argsHash: string;
|
|
263
308
|
readonly ordinal: number;
|
|
264
309
|
readonly fn: (toolCtx: WorkflowToolContext) => Promise<T>;
|
|
@@ -266,6 +311,86 @@ interface LiveToolInvocation<T extends WorkflowSerializableValue> {
|
|
|
266
311
|
readonly control: ToolInvocationAdmissionControl;
|
|
267
312
|
readonly returnFailure: boolean;
|
|
268
313
|
}
|
|
314
|
+
class WorkflowToolTimeoutError extends Error {
|
|
315
|
+
constructor(toolName: string, timeoutMs: number) {
|
|
316
|
+
super(`atomic-workflows: ctx.tool ${toolName} timed out after ${timeoutMs}ms`);
|
|
317
|
+
this.name = "TimeoutError";
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const MAX_HOST_TIMER_MS = 2_147_483_647;
|
|
322
|
+
|
|
323
|
+
/** Schedule a finite deadline without triggering host timer overflow clamping. */
|
|
324
|
+
function scheduleDeadline(callback: () => void, timeoutMs: number): () => void {
|
|
325
|
+
let remainingMs = timeoutMs;
|
|
326
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
327
|
+
const scheduleNextChunk = () => {
|
|
328
|
+
const chunkMs = Math.min(remainingMs, MAX_HOST_TIMER_MS);
|
|
329
|
+
timer = setTimeout(() => {
|
|
330
|
+
remainingMs -= chunkMs;
|
|
331
|
+
if (remainingMs > 0) scheduleNextChunk();
|
|
332
|
+
else callback();
|
|
333
|
+
}, chunkMs);
|
|
334
|
+
};
|
|
335
|
+
scheduleNextChunk();
|
|
336
|
+
return () => {
|
|
337
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
type ToolCallbackAttemptResult<T> =
|
|
342
|
+
| { readonly kind: "value"; readonly value: T }
|
|
343
|
+
| { readonly kind: "error"; readonly error: unknown };
|
|
344
|
+
|
|
345
|
+
function abortReason(signal: AbortSignal): Error {
|
|
346
|
+
return signal.reason instanceof Error ? signal.reason : new Error("atomic-workflows: workflow cancelled");
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/** Run one callback attempt with a fresh signal and deadline. */
|
|
350
|
+
async function executeTimedToolAttempt<T extends WorkflowSerializableValue>(
|
|
351
|
+
toolName: string,
|
|
352
|
+
runId: string,
|
|
353
|
+
fn: (toolCtx: WorkflowToolContext) => Promise<T>,
|
|
354
|
+
baseSignal: AbortSignal,
|
|
355
|
+
timeoutMs: number,
|
|
356
|
+
): Promise<T> {
|
|
357
|
+
const timeoutController = new AbortController();
|
|
358
|
+
const attemptSignal = AbortSignal.any([baseSignal, timeoutController.signal]);
|
|
359
|
+
return runCallback({ kind: "workflow.ctx_tool", name: toolName, runId }, async () => {
|
|
360
|
+
const callbackResult: Promise<ToolCallbackAttemptResult<T>> = Promise.resolve()
|
|
361
|
+
.then(() => fn({ signal: attemptSignal }))
|
|
362
|
+
.then(
|
|
363
|
+
(value) => ({ kind: "value" as const, value }),
|
|
364
|
+
(error: unknown) => ({ kind: "error" as const, error }),
|
|
365
|
+
);
|
|
366
|
+
let cancelDeadline: (() => void) | undefined;
|
|
367
|
+
let onAbort: (() => void) | undefined;
|
|
368
|
+
let timeoutError: WorkflowToolTimeoutError | undefined;
|
|
369
|
+
const timeoutResult = new Promise<never>((_, reject) => {
|
|
370
|
+
cancelDeadline = scheduleDeadline(() => {
|
|
371
|
+
if (baseSignal.aborted) return;
|
|
372
|
+
timeoutError = new WorkflowToolTimeoutError(toolName, timeoutMs);
|
|
373
|
+
timeoutController.abort(timeoutError);
|
|
374
|
+
reject(timeoutError);
|
|
375
|
+
}, timeoutMs);
|
|
376
|
+
});
|
|
377
|
+
const cancellationResult = new Promise<never>((_, reject) => {
|
|
378
|
+
onAbort = () => {
|
|
379
|
+
if (timeoutError === undefined) reject(abortReason(baseSignal));
|
|
380
|
+
};
|
|
381
|
+
if (baseSignal.aborted) onAbort();
|
|
382
|
+
else baseSignal.addEventListener("abort", onAbort, { once: true });
|
|
383
|
+
});
|
|
384
|
+
try {
|
|
385
|
+
const result = await Promise.race([callbackResult, timeoutResult, cancellationResult]);
|
|
386
|
+
if (result.kind === "value") return result.value;
|
|
387
|
+
throw result.error;
|
|
388
|
+
} finally {
|
|
389
|
+
cancelDeadline?.();
|
|
390
|
+
if (onAbort !== undefined) baseSignal.removeEventListener("abort", onAbort);
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
}
|
|
269
394
|
|
|
270
395
|
/**
|
|
271
396
|
* Execute one uncached tool call under its own abort controller.
|
|
@@ -278,7 +403,7 @@ interface LiveToolInvocation<T extends WorkflowSerializableValue> {
|
|
|
278
403
|
async function executeLiveToolInvocation<T extends WorkflowSerializableValue>(
|
|
279
404
|
live: LiveToolInvocation<T>,
|
|
280
405
|
): Promise<WorkflowToolInvocationResult<T>> {
|
|
281
|
-
const { input, node, name, argsHash, ordinal, fn, options, control, returnFailure } = live;
|
|
406
|
+
const { input, node, name, args, source, argsHash, ordinal, fn, options, control, returnFailure } = live;
|
|
282
407
|
const nodeController = new AbortController();
|
|
283
408
|
const toolSignal =
|
|
284
409
|
input.signal === undefined ? nodeController.signal : AbortSignal.any([input.signal, nodeController.signal]);
|
|
@@ -302,9 +427,13 @@ async function executeLiveToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
302
427
|
const result = await executeWithRetries(
|
|
303
428
|
() => {
|
|
304
429
|
attempts += 1;
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
430
|
+
const callback =
|
|
431
|
+
options?.timeoutMs === undefined
|
|
432
|
+
? runCallback({ kind: "workflow.ctx_tool", name, runId: input.workflowId }, () =>
|
|
433
|
+
fn({ signal: toolSignal }),
|
|
434
|
+
)
|
|
435
|
+
: executeTimedToolAttempt(name, input.workflowId, fn, toolSignal, options.timeoutMs);
|
|
436
|
+
return callback.catch((error: unknown) => {
|
|
308
437
|
callbackError = error;
|
|
309
438
|
throw error;
|
|
310
439
|
});
|
|
@@ -328,6 +457,8 @@ async function executeLiveToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
328
457
|
workflowId: input.workflowId,
|
|
329
458
|
checkpointId: `tool:${argsHash}`,
|
|
330
459
|
name,
|
|
460
|
+
args: cloneToolArgs(args),
|
|
461
|
+
...(source !== undefined ? { source } : {}),
|
|
331
462
|
argsHash,
|
|
332
463
|
output,
|
|
333
464
|
...(returnFailure ? { outcomeKind: "return_success" as const } : {}),
|
|
@@ -347,12 +478,15 @@ async function executeLiveToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
347
478
|
input.onNodeEnd?.(node.id, {
|
|
348
479
|
status: "completed",
|
|
349
480
|
endedAt: completedAt,
|
|
481
|
+
durationMs: Math.max(0, completedAt - startedAt),
|
|
482
|
+
result: output,
|
|
350
483
|
resultSummary: summarizeToolResult(output),
|
|
351
484
|
});
|
|
352
485
|
input.onNodeSettle?.(node.id);
|
|
353
486
|
return output;
|
|
354
487
|
} catch (error) {
|
|
355
|
-
const
|
|
488
|
+
const timeoutFailure = error instanceof WorkflowToolTimeoutError;
|
|
489
|
+
const cancellation = timeoutFailure ? undefined : invocationCancellation(input, toolSignal);
|
|
356
490
|
if (cancellation !== undefined) {
|
|
357
491
|
control.noteCancelled();
|
|
358
492
|
// A cancelled call never writes a replayable `tool:` checkpoint and never
|
|
@@ -366,9 +500,11 @@ async function executeLiveToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
366
500
|
if (returnFailure) {
|
|
367
501
|
await recordCancelledToolInspection(live, startedAt, cancellation, attempts);
|
|
368
502
|
}
|
|
503
|
+
const endedAt = Date.now();
|
|
369
504
|
input.onNodeEnd?.(node.id, {
|
|
370
505
|
status: "cancelled",
|
|
371
|
-
endedAt
|
|
506
|
+
endedAt,
|
|
507
|
+
durationMs: Math.max(0, endedAt - startedAt),
|
|
372
508
|
error: cancellation.message,
|
|
373
509
|
});
|
|
374
510
|
input.onNodeSettle?.(node.id);
|
|
@@ -380,11 +516,16 @@ async function executeLiveToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
380
516
|
const failure = await recordThrowingToolFailure(
|
|
381
517
|
input,
|
|
382
518
|
node,
|
|
383
|
-
{ name, argsHash, ordinal, startedAt },
|
|
519
|
+
{ name, args, ...(source !== undefined ? { source } : {}), argsHash, ordinal, startedAt },
|
|
384
520
|
callbackFailure,
|
|
385
521
|
attempts,
|
|
386
522
|
);
|
|
387
|
-
input.onNodeEnd?.(node.id, {
|
|
523
|
+
input.onNodeEnd?.(node.id, {
|
|
524
|
+
status: "failed",
|
|
525
|
+
endedAt: failure.failedAt,
|
|
526
|
+
durationMs: Math.max(0, failure.failedAt - startedAt),
|
|
527
|
+
error: failure.message,
|
|
528
|
+
});
|
|
388
529
|
input.onNodeSettle?.(node.id);
|
|
389
530
|
throw callbackFailure;
|
|
390
531
|
}
|
|
@@ -396,6 +537,8 @@ async function executeLiveToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
396
537
|
workflowId: input.workflowId,
|
|
397
538
|
checkpointId: `tool:${argsHash}`,
|
|
398
539
|
name,
|
|
540
|
+
args: cloneToolArgs(args),
|
|
541
|
+
...(source !== undefined ? { source } : {}),
|
|
399
542
|
argsHash,
|
|
400
543
|
output: outcome,
|
|
401
544
|
outcomeKind: "return_failure",
|
|
@@ -415,30 +558,44 @@ async function executeLiveToolInvocation<T extends WorkflowSerializableValue>(
|
|
|
415
558
|
await recordCheckpointDurably(input.backend, checkpoint);
|
|
416
559
|
} catch (persistenceError) {
|
|
417
560
|
input.onFailureObserved?.(persistenceError, node.id);
|
|
561
|
+
const endedAt = Date.now();
|
|
418
562
|
input.onNodeEnd?.(node.id, {
|
|
419
563
|
status: "failed",
|
|
420
|
-
endedAt
|
|
564
|
+
endedAt,
|
|
565
|
+
durationMs: Math.max(0, endedAt - startedAt),
|
|
421
566
|
error: persistenceError instanceof Error ? persistenceError.message : String(persistenceError),
|
|
422
567
|
});
|
|
423
568
|
input.onNodeSettle?.(node.id);
|
|
424
569
|
throw persistenceError;
|
|
425
570
|
}
|
|
426
|
-
input.onNodeEnd?.(node.id, {
|
|
571
|
+
input.onNodeEnd?.(node.id, {
|
|
572
|
+
status: "failed",
|
|
573
|
+
endedAt: completedAt,
|
|
574
|
+
durationMs: Math.max(0, completedAt - startedAt),
|
|
575
|
+
result: outcome,
|
|
576
|
+
error: outcome.error.message,
|
|
577
|
+
});
|
|
427
578
|
input.onNodeSettle?.(node.id);
|
|
428
|
-
throwIfInvocationCancelled(input, toolSignal);
|
|
579
|
+
if (!timeoutFailure) throwIfInvocationCancelled(input, toolSignal);
|
|
429
580
|
return outcome;
|
|
430
581
|
}
|
|
431
|
-
|
|
582
|
+
const reportedFailure = timeoutFailure ? callbackError : error;
|
|
583
|
+
input.onFailureObserved?.(reportedFailure, node.id);
|
|
432
584
|
const failure = await recordThrowingToolFailure(
|
|
433
585
|
input,
|
|
434
586
|
node,
|
|
435
|
-
{ name, argsHash, ordinal, startedAt },
|
|
436
|
-
|
|
587
|
+
{ name, args, ...(source !== undefined ? { source } : {}), argsHash, ordinal, startedAt },
|
|
588
|
+
reportedFailure,
|
|
437
589
|
attempts,
|
|
438
590
|
);
|
|
439
|
-
input.onNodeEnd?.(node.id, {
|
|
591
|
+
input.onNodeEnd?.(node.id, {
|
|
592
|
+
status: "failed",
|
|
593
|
+
endedAt: failure.failedAt,
|
|
594
|
+
durationMs: Math.max(0, failure.failedAt - startedAt),
|
|
595
|
+
error: failure.message,
|
|
596
|
+
});
|
|
440
597
|
input.onNodeSettle?.(node.id);
|
|
441
|
-
throw
|
|
598
|
+
throw reportedFailure;
|
|
442
599
|
} finally {
|
|
443
600
|
settlement.resolve();
|
|
444
601
|
unregisterControl?.();
|
|
@@ -464,7 +621,14 @@ async function recordCancelledToolInspection<T extends WorkflowSerializableValue
|
|
|
464
621
|
await recordThrowingToolFailure(
|
|
465
622
|
live.input,
|
|
466
623
|
live.node,
|
|
467
|
-
{
|
|
624
|
+
{
|
|
625
|
+
name: live.name,
|
|
626
|
+
args: live.args,
|
|
627
|
+
...(live.source !== undefined ? { source: live.source } : {}),
|
|
628
|
+
argsHash: live.argsHash,
|
|
629
|
+
ordinal: live.ordinal,
|
|
630
|
+
startedAt,
|
|
631
|
+
},
|
|
468
632
|
cancellation,
|
|
469
633
|
attempts,
|
|
470
634
|
);
|
|
@@ -606,6 +770,8 @@ async function recordReplayedToolTopology(
|
|
|
606
770
|
workflowId: input.workflowId,
|
|
607
771
|
checkpointId: `tool-replay-meta:${durableHash({ argsHash, topology })}`,
|
|
608
772
|
name: node.name,
|
|
773
|
+
...(cached.args !== undefined ? { args: cached.args } : {}),
|
|
774
|
+
...(cached.source !== undefined ? { source: cached.source } : {}),
|
|
609
775
|
argsHash,
|
|
610
776
|
output: cached.output,
|
|
611
777
|
...(cached.outcomeKind !== undefined ? { outcomeKind: cached.outcomeKind } : {}),
|
|
@@ -112,6 +112,10 @@ export interface DurableToolCheckpoint {
|
|
|
112
112
|
readonly checkpointId: string;
|
|
113
113
|
/** Tool name for display/debugging. */
|
|
114
114
|
readonly name: string;
|
|
115
|
+
/** Exact invocation arguments retained for read-only inspection. */
|
|
116
|
+
readonly args?: Readonly<Record<string, WorkflowSerializableValue>>;
|
|
117
|
+
/** Callback source captured at registration for read-only inspection. */
|
|
118
|
+
readonly source?: string;
|
|
115
119
|
/** Deterministic hash of the tool arguments for idempotency. */
|
|
116
120
|
readonly argsHash: string;
|
|
117
121
|
/** Cached tool output (JSON-serializable). */
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable workflow-heartbeat cadence anchor.
|
|
3
|
+
*
|
|
4
|
+
* The heartbeat cadence is `anchorAt + n × interval`. Every input to that is
|
|
5
|
+
* already persisted except one: the *original* run start time. A durable resume
|
|
6
|
+
* re-dispatches under the original workflow id but mints a fresh
|
|
7
|
+
* `RunSnapshot.startedAt` (`engine/run.ts`), and that fresh value is passed to
|
|
8
|
+
* `registerWorkflow` as `createdAt`, which the backend overwrites
|
|
9
|
+
* unconditionally (`durable/backend.ts`). Checkpoints are the only per-run state
|
|
10
|
+
* that survives re-registration, so this record is the sole surviving carrier of
|
|
11
|
+
* the original start — which is what keeps a resumed run on its original
|
|
12
|
+
* cadence rather than starting a fresh series.
|
|
13
|
+
*
|
|
14
|
+
* Storage shape: a reserved tool-kind checkpoint (name/argsHash
|
|
15
|
+
* `workflow-heartbeat-anchor`), following `run-timing.ts`. Its `checkpointId` is
|
|
16
|
+
* that same constant with no suffix, so `recordCheckpoint`'s duplicate-key early
|
|
17
|
+
* return makes the record **write-once and exactly one row per run** rather than
|
|
18
|
+
* one row per boundary.
|
|
19
|
+
*
|
|
20
|
+
* Three properties this shape is chosen for:
|
|
21
|
+
*
|
|
22
|
+
* - **It cannot manufacture resumability.** `recordCheckpoint` sets
|
|
23
|
+
* `completedCheckpoints = checkpoints.size`, and `isDurableWorkflowResumable`
|
|
24
|
+
* gates a running or paused run on `completedCheckpoints > 0`. Writing for a
|
|
25
|
+
* run with no durable progress of its own would make it look resumable, so the
|
|
26
|
+
* write is skipped until the run has at least one other checkpoint — the same
|
|
27
|
+
* guard, and the same reason, as `run-timing.ts`.
|
|
28
|
+
* - **It cannot walk liveness backwards.** `recordCheckpoint` copies
|
|
29
|
+
* `completedAt` onto the handle as `updatedAt`, which the foreign-liveness
|
|
30
|
+
* window reads, so `completedAt` is the write time and never a cadence
|
|
31
|
+
* boundary.
|
|
32
|
+
* - **It cannot move a boundary forward.** It is read as
|
|
33
|
+
* `min(run.startedAt, anchorAt)`, so it can only restore the original anchor,
|
|
34
|
+
* never advance it. Recovery still floors at `now`, so no missed boundary is
|
|
35
|
+
* ever replayed.
|
|
36
|
+
*
|
|
37
|
+
* The record has no per-checkpoint deletion — `DurableWorkflowBackend` removes
|
|
38
|
+
* whole workflows only — so terminal cleanup (issue #1975) invalidates it on the
|
|
39
|
+
* read side instead: the scheduler neither reads nor writes an anchor for a run
|
|
40
|
+
* it observes as terminal, and drops the in-memory memo of it. A leftover row is
|
|
41
|
+
* therefore inert, and cannot put a finished run back on a cadence.
|
|
42
|
+
*
|
|
43
|
+
* cross-ref: packages/workflows/src/extension/workflow-heartbeat-scheduler.ts
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
import type { DurableWorkflowBackend } from "./backend.js";
|
|
47
|
+
import type { DurableToolCheckpoint } from "./types.js";
|
|
48
|
+
|
|
49
|
+
/** Reserved checkpoint name, args-hash, AND checkpoint id for cadence anchors. */
|
|
50
|
+
export const WORKFLOW_HEARTBEAT_ANCHOR_CHECKPOINT_NAME = "workflow-heartbeat-anchor";
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* What a run launched with: its original start time, and the cadence its own
|
|
54
|
+
* definition declared.
|
|
55
|
+
*
|
|
56
|
+
* `intervalMinutes` is absent on records written before it was added, so a
|
|
57
|
+
* reader must treat that as "unknown" and fall back to the live definition —
|
|
58
|
+
* never as `0`.
|
|
59
|
+
*/
|
|
60
|
+
export interface WorkflowHeartbeatAnchorRecord {
|
|
61
|
+
readonly anchorAt: number;
|
|
62
|
+
readonly intervalMinutes?: number;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The stored checkpoint payload, before validation.
|
|
67
|
+
*
|
|
68
|
+
* `getToolOutput` returns whatever a previous process wrote, so the fields are
|
|
69
|
+
* declared optional and validated below rather than trusted. Naming the shape
|
|
70
|
+
* keeps the decode free of inline casts while leaving the trust boundary
|
|
71
|
+
* explicit.
|
|
72
|
+
*/
|
|
73
|
+
interface PersistedAnchorOutput {
|
|
74
|
+
readonly anchorAt?: number;
|
|
75
|
+
readonly intervalMinutes?: number;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function asPersistedAnchorOutput(output: unknown): PersistedAnchorOutput | undefined {
|
|
79
|
+
if (typeof output !== "object" || output === null || Array.isArray(output)) return undefined;
|
|
80
|
+
const { anchorAt, intervalMinutes } = output as Partial<Record<keyof PersistedAnchorOutput, unknown>>;
|
|
81
|
+
return {
|
|
82
|
+
...(typeof anchorAt === "number" ? { anchorAt } : {}),
|
|
83
|
+
...(typeof intervalMinutes === "number" ? { intervalMinutes } : {}),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** The persisted launch anchor for a run, or undefined when absent or malformed. */
|
|
88
|
+
export function readWorkflowHeartbeatAnchor(
|
|
89
|
+
backend: DurableWorkflowBackend,
|
|
90
|
+
workflowId: string,
|
|
91
|
+
): WorkflowHeartbeatAnchorRecord | undefined {
|
|
92
|
+
const record = asPersistedAnchorOutput(backend.getToolOutput(workflowId, WORKFLOW_HEARTBEAT_ANCHOR_CHECKPOINT_NAME));
|
|
93
|
+
if (record === undefined) return undefined;
|
|
94
|
+
const { anchorAt, intervalMinutes } = record;
|
|
95
|
+
if (anchorAt === undefined || !Number.isFinite(anchorAt)) return undefined;
|
|
96
|
+
// Only a positive finite cadence is carried: a disabled run never writes a
|
|
97
|
+
// record at all, so a non-positive value here is corrupt rather than meaningful.
|
|
98
|
+
return intervalMinutes !== undefined && Number.isFinite(intervalMinutes) && intervalMinutes > 0
|
|
99
|
+
? { anchorAt, intervalMinutes }
|
|
100
|
+
: { anchorAt };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Persist what a run launched with, once.
|
|
105
|
+
*
|
|
106
|
+
* Uses `recordAdditiveCheckpointBestEffort` rather than the synchronous
|
|
107
|
+
* `recordCheckpoint`, because the DBOS backend updates its in-memory mirror
|
|
108
|
+
* *before* the real write is queued: a synchronous read-back therefore proves
|
|
109
|
+
* only that the mirror holds the row, and would let a rejected storage write be
|
|
110
|
+
* remembered as a success that is never retried. The best-effort path awaits
|
|
111
|
+
* `recordStepOutput` and updates the mirror only after it resolves, and turns a
|
|
112
|
+
* storage rejection into `false` instead of a fatal flush error.
|
|
113
|
+
*
|
|
114
|
+
* Returns `true` only when the record is durably written *and* readable — the
|
|
115
|
+
* backend silently drops a checkpoint for a workflow it has never registered,
|
|
116
|
+
* so the read-back stays as well.
|
|
117
|
+
*/
|
|
118
|
+
export async function recordWorkflowHeartbeatAnchor(
|
|
119
|
+
backend: DurableWorkflowBackend,
|
|
120
|
+
record: {
|
|
121
|
+
readonly runId: string;
|
|
122
|
+
readonly anchorAt: number;
|
|
123
|
+
readonly intervalMinutes: number;
|
|
124
|
+
readonly now: number;
|
|
125
|
+
},
|
|
126
|
+
): Promise<boolean> {
|
|
127
|
+
if (!Number.isFinite(record.anchorAt)) return false;
|
|
128
|
+
// A run launched with heartbeats disabled writes no record at all, so this
|
|
129
|
+
// path is never reached for a non-positive cadence. Guarding it here keeps
|
|
130
|
+
// that invariant local to the writer as well as to its caller.
|
|
131
|
+
if (!Number.isFinite(record.intervalMinutes) || record.intervalMinutes <= 0) return false;
|
|
132
|
+
const existing = readWorkflowHeartbeatAnchor(backend, record.runId);
|
|
133
|
+
// Write-once: the first record stands. A later write cannot move the anchor
|
|
134
|
+
// forward, and it cannot retro-fit an edited cadence onto a run in flight.
|
|
135
|
+
if (existing !== undefined) return true;
|
|
136
|
+
// A record for a run with no durable progress of its own would make that run
|
|
137
|
+
// look resumable; the anchor is worth nothing on a run that cannot resume.
|
|
138
|
+
if (backend.listCheckpoints(record.runId).length === 0) return false;
|
|
139
|
+
const checkpoint: DurableToolCheckpoint = {
|
|
140
|
+
kind: "tool",
|
|
141
|
+
workflowId: record.runId,
|
|
142
|
+
checkpointId: WORKFLOW_HEARTBEAT_ANCHOR_CHECKPOINT_NAME,
|
|
143
|
+
name: WORKFLOW_HEARTBEAT_ANCHOR_CHECKPOINT_NAME,
|
|
144
|
+
argsHash: WORKFLOW_HEARTBEAT_ANCHOR_CHECKPOINT_NAME,
|
|
145
|
+
output: { anchorAt: record.anchorAt, intervalMinutes: record.intervalMinutes },
|
|
146
|
+
// Write time, never the boundary: this lands on the handle as `updatedAt`,
|
|
147
|
+
// which the foreign-liveness window reads.
|
|
148
|
+
completedAt: record.now,
|
|
149
|
+
};
|
|
150
|
+
const stored = await backend.recordAdditiveCheckpointBestEffort(checkpoint);
|
|
151
|
+
if (!stored) return false;
|
|
152
|
+
return readWorkflowHeartbeatAnchor(backend, record.runId) !== undefined;
|
|
153
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { recordRunTimingCheckpointAsync } from "../durable/run-timing.js";
|
|
2
2
|
import { type DurableStageDeps, recordStageSessionCheckpoint } from "../durable/stage-primitive.js";
|
|
3
|
+
import { recordWorkflowHeartbeatAnchor } from "../durable/workflow-heartbeat-anchor.js";
|
|
3
4
|
import type { StageSessionCheckpointOptions } from "../runs/foreground/executor-types.js";
|
|
4
5
|
import type { RunSnapshot, StageSnapshot } from "../shared/store-types.js";
|
|
5
6
|
|
|
@@ -18,6 +19,8 @@ export interface DurableStageSessionRecorderInput {
|
|
|
18
19
|
* only tracked for the root workflow.
|
|
19
20
|
*/
|
|
20
21
|
readonly runSnapshot?: RunSnapshot;
|
|
22
|
+
/** Cadence declared by the live definition that minted `runSnapshot`. */
|
|
23
|
+
readonly heartbeatIntervalMinutes: number;
|
|
21
24
|
}
|
|
22
25
|
|
|
23
26
|
export function createDurableStageSessionRecorder(
|
|
@@ -30,6 +33,31 @@ export function createDurableStageSessionRecorder(
|
|
|
30
33
|
await recordRunTimingCheckpointAsync(input.deps.backend, input.runSnapshot, {
|
|
31
34
|
debounce: options?.forceDurable !== true,
|
|
32
35
|
});
|
|
36
|
+
// Any checkpoint above can be the first one that makes the run
|
|
37
|
+
// resumable, and the scheduler's own launch-record write is
|
|
38
|
+
// asynchronous and best-effort: it is guarded against runs with no
|
|
39
|
+
// durable progress, so it can only be issued *after* resumability
|
|
40
|
+
// already exists. A process that exits inside that window leaves a
|
|
41
|
+
// resumable run with no record of what it launched with, and the next
|
|
42
|
+
// process then reads a freshly minted `startedAt` and whatever cadence
|
|
43
|
+
// the definition currently declares — shifting both phase and cadence
|
|
44
|
+
// under a run already in flight.
|
|
45
|
+
//
|
|
46
|
+
// Awaiting the write here closes that window: the record is durable
|
|
47
|
+
// before this checkpoint is acknowledged to its caller. It is
|
|
48
|
+
// write-once and returns early once present, so later passes cost one
|
|
49
|
+
// mirror read. A forced pause/quit capture additionally has no further
|
|
50
|
+
// active schedule pass to retry in, which is why this must not be
|
|
51
|
+
// limited to the ordinary path either.
|
|
52
|
+
const intervalMinutes = input.heartbeatIntervalMinutes;
|
|
53
|
+
if (Number.isFinite(intervalMinutes * 60_000)) {
|
|
54
|
+
await recordWorkflowHeartbeatAnchor(input.deps.backend, {
|
|
55
|
+
runId: input.runId,
|
|
56
|
+
anchorAt: input.runSnapshot.startedAt,
|
|
57
|
+
intervalMinutes,
|
|
58
|
+
now: input.deps.now?.() ?? Date.now(),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
33
61
|
}
|
|
34
62
|
}
|
|
35
63
|
await input.onStageSession?.(stageRunId, snapshot, options);
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* cross-ref: issue #2078; src/runs/foreground/stage-control-registry.ts
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { createSessionScopedSingleton } from "../shared/session-scoped-singleton.js";
|
|
16
17
|
import type { WorkflowToolNodeIdentity } from "../shared/types.js";
|
|
17
18
|
import type { ToolAdmissionBoundary } from "./run-tool-admission-boundary.js";
|
|
18
19
|
import { WorkflowToolAbortError, type WorkflowToolAbortScope } from "./workflow-tool-abort.js";
|
|
@@ -130,7 +131,14 @@ export function createToolControlRegistry(): ToolControlRegistry {
|
|
|
130
131
|
* through `RunOpts.toolControlRegistry`; the singleton is the default consumer
|
|
131
132
|
* surface used by the extension factory.
|
|
132
133
|
*/
|
|
133
|
-
|
|
134
|
+
const SESSION_KEY = "workflows:tool-control:v1";
|
|
135
|
+
const singleton = createSessionScopedSingleton(SESSION_KEY, createToolControlRegistry);
|
|
136
|
+
|
|
137
|
+
export const toolControlRegistry: ToolControlRegistry = singleton.facade;
|
|
138
|
+
|
|
139
|
+
export function adoptToolControlRegistry(scope: object): ToolControlRegistry {
|
|
140
|
+
return singleton.adopt(scope);
|
|
141
|
+
}
|
|
134
142
|
|
|
135
143
|
/**
|
|
136
144
|
* Await settlement of aborted tool handles up to `timeoutMs` and report the
|
|
@@ -296,6 +296,7 @@ export async function run<TInputs extends WorkflowInputValues, TRunInputs extend
|
|
|
296
296
|
deps: durableStageDeps,
|
|
297
297
|
onStageSession: opts.onStageSession,
|
|
298
298
|
...(opts.parentRun === undefined ? { runSnapshot } : {}),
|
|
299
|
+
heartbeatIntervalMinutes: def.heartbeatIntervalMinutes,
|
|
299
300
|
});
|
|
300
301
|
const stageOptions: EngineStageRuntimeOptions = {
|
|
301
302
|
continuation: opts.continuation,
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { adoptToolControlRegistry } from "../engine/run-tool-control-registry.js";
|
|
2
|
+
import { adoptCancellationRegistry } from "../runs/background/cancellation-registry.js";
|
|
3
|
+
import { adoptJobTracker } from "../runs/background/job-tracker.js";
|
|
4
|
+
import { adoptStageControlRegistry } from "../runs/foreground/stage-control-registry.js";
|
|
5
|
+
import { adoptStageUiBroker } from "../shared/stage-ui-broker.js";
|
|
6
|
+
import { adoptStore } from "../shared/store-factory.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Re-bind every run-scoped singleton to host session state for `scope`.
|
|
10
|
+
* No-op when the host has not supplied a scope (unit tests, embedded SDK).
|
|
11
|
+
*/
|
|
12
|
+
export function adoptWorkflowSessionRunState(scope: object | undefined): void {
|
|
13
|
+
if (scope === undefined) return;
|
|
14
|
+
adoptStore(scope);
|
|
15
|
+
adoptStageControlRegistry(scope);
|
|
16
|
+
adoptCancellationRegistry(scope);
|
|
17
|
+
adoptToolControlRegistry(scope);
|
|
18
|
+
adoptJobTracker(scope);
|
|
19
|
+
adoptStageUiBroker(scope);
|
|
20
|
+
}
|