@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.
Files changed (762) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +3 -3
  3. package/dist/builtin/intercom/package.json +2 -2
  4. package/dist/builtin/mcp/package.json +3 -3
  5. package/dist/builtin/subagents/CHANGELOG.md +14 -0
  6. package/dist/builtin/subagents/README.md +6 -4
  7. package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
  8. package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
  9. package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
  10. package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
  11. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
  12. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
  13. package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
  14. package/dist/builtin/subagents/agents/debugger.md +1 -1
  15. package/dist/builtin/subagents/agents/worker.md +1 -1
  16. package/dist/builtin/subagents/package.json +6 -5
  17. package/dist/builtin/subagents/src/agents/agent-discovery.ts +17 -11
  18. package/dist/builtin/subagents/src/agents/agent-loaders.ts +115 -43
  19. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +10 -8
  20. package/dist/builtin/subagents/src/agents/agent-management.ts +8 -7
  21. package/dist/builtin/subagents/src/agents/agent-overrides.ts +2 -2
  22. package/dist/builtin/subagents/src/agents/agent-scope.ts +1 -1
  23. package/dist/builtin/subagents/src/agents/agent-selection.ts +1 -1
  24. package/dist/builtin/subagents/src/agents/agent-serializer.ts +24 -3
  25. package/dist/builtin/subagents/src/agents/agent-types.ts +3 -1
  26. package/dist/builtin/subagents/src/agents/agents.ts +7 -5
  27. package/dist/builtin/subagents/src/agents/frontmatter.ts +67 -22
  28. package/dist/builtin/subagents/src/agents/identity.ts +1 -1
  29. package/dist/builtin/subagents/src/agents/skills-paths.ts +1 -1
  30. package/dist/builtin/subagents/src/agents/skills.ts +64 -6
  31. package/dist/builtin/subagents/src/extension/config.ts +1 -1
  32. package/dist/builtin/subagents/src/extension/control-notices.ts +2 -2
  33. package/dist/builtin/subagents/src/extension/doctor.ts +15 -5
  34. package/dist/builtin/subagents/src/extension/fanout-child.ts +12 -12
  35. package/dist/builtin/subagents/src/extension/index.ts +23 -23
  36. package/dist/builtin/subagents/src/extension/notification-content.ts +1 -1
  37. package/dist/builtin/subagents/src/extension/schemas.ts +1 -1
  38. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +3 -3
  39. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +3 -3
  40. package/dist/builtin/subagents/src/intercom/result-intercom.ts +1 -1
  41. package/dist/builtin/subagents/src/intercom/supervisor-authorization.ts +1 -1
  42. package/dist/builtin/subagents/src/runs/foreground/completion-notification.ts +2 -2
  43. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +1 -1
  44. package/dist/builtin/subagents/src/runs/foreground/execution-intercom-detach.ts +3 -3
  45. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +1 -1
  46. package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +2 -2
  47. package/dist/builtin/subagents/src/runs/foreground/execution-utils.ts +1 -1
  48. package/dist/builtin/subagents/src/runs/foreground/execution.ts +2 -2
  49. package/dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts +27 -11
  50. package/dist/builtin/subagents/src/runs/foreground/notify.ts +3 -3
  51. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +11 -11
  52. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +3 -3
  53. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +15 -14
  54. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +19 -19
  55. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +2 -2
  56. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +14 -13
  57. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +9 -9
  58. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +7 -7
  59. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +6 -6
  60. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +24 -23
  61. package/dist/builtin/subagents/src/runs/inprocess/control-registry.ts +1 -1
  62. package/dist/builtin/subagents/src/runs/inprocess/control-status.ts +3 -3
  63. package/dist/builtin/subagents/src/runs/inprocess/index.ts +3 -3
  64. package/dist/builtin/subagents/src/runs/inprocess/prompt-behavior.ts +17 -8
  65. package/dist/builtin/subagents/src/runs/inprocess/runner.ts +60 -12
  66. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-api.ts +8 -8
  67. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-control.ts +3 -3
  68. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-core.ts +4 -4
  69. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-projection.ts +4 -4
  70. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-registry.ts +5 -5
  71. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-rendering.ts +3 -3
  72. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-sanitize.ts +3 -3
  73. package/dist/builtin/subagents/src/runs/inprocess.ts +1 -1
  74. package/dist/builtin/subagents/src/runs/shared/long-running-guard.ts +1 -1
  75. package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -1
  76. package/dist/builtin/subagents/src/runs/shared/model-candidate-filter.ts +3 -3
  77. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +2 -2
  78. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +1 -1
  79. package/dist/builtin/subagents/src/runs/shared/single-output.ts +1 -1
  80. package/dist/builtin/subagents/src/runs/shared/subagent-control.ts +1 -1
  81. package/dist/builtin/subagents/src/shared/artifacts.ts +2 -2
  82. package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +1 -1
  83. package/dist/builtin/subagents/src/shared/fast-mode.ts +1 -1
  84. package/dist/builtin/subagents/src/shared/formatters.ts +2 -2
  85. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -1
  86. package/dist/builtin/subagents/src/shared/model-resolution.ts +1 -1
  87. package/dist/builtin/subagents/src/shared/session-tokens.ts +1 -1
  88. package/dist/builtin/subagents/src/shared/settings.ts +4 -4
  89. package/dist/builtin/subagents/src/shared/status-format.ts +1 -1
  90. package/dist/builtin/subagents/src/shared/types-config.ts +16 -4
  91. package/dist/builtin/subagents/src/shared/types-depth.ts +1 -1
  92. package/dist/builtin/subagents/src/shared/types-nested.ts +1 -1
  93. package/dist/builtin/subagents/src/shared/types-output.ts +1 -1
  94. package/dist/builtin/subagents/src/shared/types-results.ts +1 -1
  95. package/dist/builtin/subagents/src/shared/types-runtime.ts +1 -1
  96. package/dist/builtin/subagents/src/shared/types.ts +6 -6
  97. package/dist/builtin/subagents/src/shared/utils.ts +3 -3
  98. package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +1 -1
  99. package/dist/builtin/subagents/src/slash/slash-bridge.ts +3 -3
  100. package/dist/builtin/subagents/src/slash/slash-commands.ts +6 -6
  101. package/dist/builtin/subagents/src/slash/slash-live-state.ts +3 -3
  102. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -2
  103. package/dist/builtin/subagents/src/tui/render-layout.ts +1 -1
  104. package/dist/builtin/subagents/src/tui/render-progress.ts +2 -2
  105. package/dist/builtin/subagents/src/tui/render-result-compact.ts +7 -7
  106. package/dist/builtin/subagents/src/tui/render-result.ts +10 -10
  107. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -1
  108. package/dist/builtin/subagents/src/tui/render-status-progress.ts +5 -5
  109. package/dist/builtin/subagents/src/tui/render.ts +4 -4
  110. package/dist/builtin/web-access/package.json +2 -2
  111. package/dist/builtin/workflows/CHANGELOG.md +57 -0
  112. package/dist/builtin/workflows/README.md +39 -8
  113. package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +16 -5
  114. package/dist/builtin/workflows/builtin/adversarial-verification.ts +4 -0
  115. package/dist/builtin/workflows/builtin/classify-and-act.ts +4 -0
  116. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +4 -0
  117. package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +12 -4
  118. package/dist/builtin/workflows/builtin/generate-and-filter.ts +4 -0
  119. package/dist/builtin/workflows/builtin/goal-models.ts +8 -10
  120. package/dist/builtin/workflows/builtin/goal.ts +4 -0
  121. package/dist/builtin/workflows/builtin/index.d.ts +0 -4
  122. package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +4 -2
  123. package/dist/builtin/workflows/builtin/loop-until-done.ts +4 -0
  124. package/dist/builtin/workflows/builtin/open-claude-design-live-protocol.ts +305 -0
  125. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +115 -171
  126. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +9 -25
  127. package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +19 -86
  128. package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +0 -6
  129. package/dist/builtin/workflows/builtin/open-claude-design.d.ts +0 -5
  130. package/dist/builtin/workflows/builtin/open-claude-design.ts +11 -15
  131. package/dist/builtin/workflows/builtin/ralph-models.ts +24 -29
  132. package/dist/builtin/workflows/builtin/ralph.ts +4 -0
  133. package/dist/builtin/workflows/builtin/tournament-runner.ts +6 -3
  134. package/dist/builtin/workflows/builtin/tournament.ts +4 -0
  135. package/dist/builtin/workflows/package.json +2 -2
  136. package/dist/builtin/workflows/skills/impeccable/SKILL.md +3 -3
  137. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_asset_producer.toml +25 -31
  138. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_documenter.toml +1 -0
  139. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_finish_reviewer.toml +16 -10
  140. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_manual_edit_applier.toml +2 -2
  141. package/dist/builtin/workflows/skills/impeccable/reference/android.md +6 -0
  142. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +3 -0
  143. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +3 -1
  144. package/dist/builtin/workflows/skills/impeccable/reference/craft-floor.md +6 -1
  145. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +18 -2
  146. package/dist/builtin/workflows/skills/impeccable/reference/degraded/asset-producer.md +24 -30
  147. package/dist/builtin/workflows/skills/impeccable/reference/degraded/documenter.md +1 -0
  148. package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +16 -10
  149. package/dist/builtin/workflows/skills/impeccable/reference/degraded/manual-edit-applier.md +2 -2
  150. package/dist/builtin/workflows/skills/impeccable/reference/distill.md +1 -1
  151. package/dist/builtin/workflows/skills/impeccable/reference/doctor.md +1 -0
  152. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  153. package/dist/builtin/workflows/skills/impeccable/reference/extract.md +1 -1
  154. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +12 -6
  155. package/dist/builtin/workflows/skills/impeccable/reference/init.md +12 -3
  156. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +6 -0
  157. package/dist/builtin/workflows/skills/impeccable/reference/live-setup.md +102 -0
  158. package/dist/builtin/workflows/skills/impeccable/reference/live.md +113 -521
  159. package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +39 -26
  160. package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +1 -1
  161. package/dist/builtin/workflows/skills/impeccable/reference/polish.md +3 -3
  162. package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +1 -1
  163. package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +25 -11
  164. package/dist/builtin/workflows/skills/impeccable/scripts/concept-seed.mjs +332 -221
  165. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +10 -19
  166. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +91 -38
  167. package/dist/builtin/workflows/skills/impeccable/scripts/critique-storage.mjs +19 -10
  168. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +56 -6
  169. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +10 -16
  170. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +140 -2
  171. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +1174 -694
  172. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns.mjs +1 -0
  173. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +5 -1
  174. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +431 -45
  175. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +10 -1
  176. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +47 -6
  177. package/dist/builtin/workflows/skills/impeccable/scripts/detector/node/file-system.mjs +23 -22
  178. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +0 -10
  179. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +384 -384
  180. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/color.mjs +466 -2
  181. package/dist/builtin/workflows/skills/impeccable/scripts/doctor.mjs +2 -0
  182. package/dist/builtin/workflows/skills/impeccable/scripts/embed-prompt.mjs +270 -0
  183. package/dist/builtin/workflows/skills/impeccable/scripts/generate-image.mjs +51 -6
  184. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +70 -10
  185. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +336 -90
  186. package/dist/builtin/workflows/skills/impeccable/scripts/lib/composition-catalog.mjs +38 -3
  187. package/dist/builtin/workflows/skills/impeccable/scripts/lib/concept-catalog.mjs +77 -11
  188. package/dist/builtin/workflows/skills/impeccable/scripts/lib/design-parser.mjs +102 -19
  189. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +44 -59
  190. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +3 -0
  191. package/dist/builtin/workflows/skills/impeccable/scripts/lib/open-system-browser.mjs +57 -0
  192. package/dist/builtin/workflows/skills/impeccable/scripts/lib/roll-selection.mjs +369 -0
  193. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness-deep.mjs +31 -3
  194. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness.mjs +73 -2
  195. package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-css.mjs +617 -0
  196. package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-verify.mjs +71 -0
  197. package/dist/builtin/workflows/skills/impeccable/scripts/live/browser-script-parts.mjs +29 -2
  198. package/dist/builtin/workflows/skills/impeccable/scripts/live/event-validation.mjs +54 -7
  199. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/astro.mjs +47 -0
  200. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/detect-utils.mjs +157 -0
  201. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/index.mjs +143 -0
  202. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/journal.mjs +205 -0
  203. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
  204. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nuxt.mjs +170 -0
  205. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/script-src.mjs +26 -0
  206. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
  207. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
  208. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
  209. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
  210. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
  211. package/dist/builtin/workflows/skills/impeccable/scripts/live/instructions.mjs +169 -0
  212. package/dist/builtin/workflows/skills/impeccable/scripts/live/roots.mjs +670 -0
  213. package/dist/builtin/workflows/skills/impeccable/scripts/live/session-store.mjs +232 -35
  214. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-ast.mjs +969 -0
  215. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +621 -74
  216. package/dist/builtin/workflows/skills/impeccable/scripts/live/sveltekit-adapter.mjs +66 -28
  217. package/dist/builtin/workflows/skills/impeccable/scripts/live/tanstack-adapter.mjs +12 -12
  218. package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-surfaces.mjs +75 -0
  219. package/dist/builtin/workflows/skills/impeccable/scripts/live/vocabulary.mjs +135 -0
  220. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +23 -37
  221. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +945 -115
  222. package/dist/builtin/workflows/skills/impeccable/scripts/live-complete.mjs +33 -1
  223. package/dist/builtin/workflows/skills/impeccable/scripts/live-copy-edit-agent.mjs +132 -15
  224. package/dist/builtin/workflows/skills/impeccable/scripts/live-inject.mjs +173 -425
  225. package/dist/builtin/workflows/skills/impeccable/scripts/live-insert.mjs +2 -0
  226. package/dist/builtin/workflows/skills/impeccable/scripts/live-poll.mjs +16 -3
  227. package/dist/builtin/workflows/skills/impeccable/scripts/live-resume.mjs +39 -10
  228. package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +194 -27
  229. package/dist/builtin/workflows/skills/impeccable/scripts/live-status.mjs +10 -4
  230. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +50 -31
  231. package/dist/builtin/workflows/skills/impeccable/scripts/live.mjs +91 -28
  232. package/dist/builtin/workflows/skills/impeccable/scripts/pin.mjs +8 -5
  233. package/dist/builtin/workflows/skills/impeccable/scripts/serve-question.mjs +759 -109
  234. package/dist/builtin/workflows/src/authoring/workflow.ts +9 -0
  235. package/dist/builtin/workflows/src/authoring.d.ts +3 -0
  236. package/dist/builtin/workflows/src/durable/completed-catalog.ts +23 -2
  237. package/dist/builtin/workflows/src/durable/dbos-backend.ts +30 -17
  238. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +14 -0
  239. package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +60 -57
  240. package/dist/builtin/workflows/src/durable/dbos-process-owner.ts +87 -0
  241. package/dist/builtin/workflows/src/durable/dbos-registration-diagnostics.ts +113 -0
  242. package/dist/builtin/workflows/src/durable/factory.ts +11 -8
  243. package/dist/builtin/workflows/src/durable/tool-failure-checkpoint.ts +5 -0
  244. package/dist/builtin/workflows/src/durable/tool-primitive.ts +186 -20
  245. package/dist/builtin/workflows/src/durable/types.ts +4 -0
  246. package/dist/builtin/workflows/src/durable/workflow-heartbeat-anchor.ts +153 -0
  247. package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +28 -0
  248. package/dist/builtin/workflows/src/engine/run-tool-control-registry.ts +9 -1
  249. package/dist/builtin/workflows/src/engine/run.ts +1 -0
  250. package/dist/builtin/workflows/src/extension/adopt-session-run-state.ts +20 -0
  251. package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +9 -30
  252. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  253. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +28 -10
  254. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +138 -0
  255. package/dist/builtin/workflows/src/extension/index.bundle.mjs +3365 -1341
  256. package/dist/builtin/workflows/src/extension/workflow-heartbeat-delivery.ts +197 -0
  257. package/dist/builtin/workflows/src/extension/workflow-heartbeat-notice.ts +115 -0
  258. package/dist/builtin/workflows/src/extension/workflow-heartbeat-scheduler.ts +962 -0
  259. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +4 -1
  260. package/dist/builtin/workflows/src/extension/workflow-schema.ts +29 -5
  261. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +32 -1
  262. package/dist/builtin/workflows/src/runs/background/cancellation-registry.ts +10 -1
  263. package/dist/builtin/workflows/src/runs/background/job-tracker.ts +10 -1
  264. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +16 -11
  265. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +31 -1
  266. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +41 -10
  267. package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +48 -0
  268. package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +4 -1
  269. package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +45 -12
  270. package/dist/builtin/workflows/src/sdk-surface.ts +9 -0
  271. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +10 -0
  272. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +10 -0
  273. package/dist/builtin/workflows/src/shared/graph-store-snapshot.ts +14 -2
  274. package/dist/builtin/workflows/src/shared/persistence-restore.ts +12 -0
  275. package/dist/builtin/workflows/src/shared/prompt-answer.ts +130 -0
  276. package/dist/builtin/workflows/src/shared/session-scoped-singleton.ts +98 -0
  277. package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +9 -1
  278. package/dist/builtin/workflows/src/shared/store-factory.ts +9 -1
  279. package/dist/builtin/workflows/src/shared/store-public-types.ts +2 -1
  280. package/dist/builtin/workflows/src/shared/store-tool-node-methods.ts +7 -0
  281. package/dist/builtin/workflows/src/shared/store-types.ts +18 -1
  282. package/dist/builtin/workflows/src/shared/tool-payload-bounds.ts +576 -0
  283. package/dist/builtin/workflows/src/shared/workflow-authoring-types.d.ts +1 -0
  284. package/dist/builtin/workflows/src/shared/workflow-authoring-types.ts +1 -0
  285. package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.d.ts +21 -0
  286. package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.ts +25 -0
  287. package/dist/builtin/workflows/src/tui/graph-theme.ts +8 -1
  288. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +11 -0
  289. package/dist/builtin/workflows/src/tui/graph-view-input.ts +100 -5
  290. package/dist/builtin/workflows/src/tui/graph-view-layout.ts +42 -11
  291. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +55 -6
  292. package/dist/builtin/workflows/src/tui/graph-view-render.ts +71 -6
  293. package/dist/builtin/workflows/src/tui/graph-view-state.ts +43 -0
  294. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +2 -0
  295. package/dist/builtin/workflows/src/tui/node-card.ts +5 -1
  296. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +11 -2
  297. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +36 -10
  298. package/dist/builtin/workflows/src/tui/switcher.ts +11 -4
  299. package/dist/builtin/workflows/src/tui/tool-detail.ts +348 -0
  300. package/dist/builtin/workflows/src/tui/workflow-status.ts +5 -2
  301. package/dist/cli/args.d.ts +1 -0
  302. package/dist/cli/args.d.ts.map +1 -1
  303. package/dist/cli/args.js +11 -0
  304. package/dist/cli/args.js.map +1 -1
  305. package/dist/cli/auth-check.d.ts +1 -1
  306. package/dist/cli/auth-check.js.map +1 -1
  307. package/dist/cli/credential-print.d.ts +1 -1
  308. package/dist/cli/credential-print.js.map +1 -1
  309. package/dist/cli/list-models.d.ts +1 -1
  310. package/dist/cli/list-models.js.map +1 -1
  311. package/dist/cli/startup-ui.d.ts +9 -0
  312. package/dist/cli/startup-ui.d.ts.map +1 -1
  313. package/dist/cli/startup-ui.js +7 -1
  314. package/dist/cli/startup-ui.js.map +1 -1
  315. package/dist/core/agent-session-custom-message-commit.js +2 -2
  316. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  317. package/dist/core/agent-session-export.d.ts +6 -1
  318. package/dist/core/agent-session-export.d.ts.map +1 -1
  319. package/dist/core/agent-session-export.js +6 -3
  320. package/dist/core/agent-session-export.js.map +1 -1
  321. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  322. package/dist/core/agent-session-extension-bindings.js +6 -4
  323. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  324. package/dist/core/agent-session-methods.d.ts +5 -2
  325. package/dist/core/agent-session-methods.d.ts.map +1 -1
  326. package/dist/core/agent-session-methods.js.map +1 -1
  327. package/dist/core/agent-session-prompt.d.ts +12 -1
  328. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  329. package/dist/core/agent-session-prompt.js +31 -10
  330. package/dist/core/agent-session-prompt.js.map +1 -1
  331. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  332. package/dist/core/agent-session-services.d.ts +1 -1
  333. package/dist/core/agent-session-services.js.map +1 -1
  334. package/dist/core/agent-session-skill-block.d.ts +1 -0
  335. package/dist/core/agent-session-skill-block.d.ts.map +1 -1
  336. package/dist/core/agent-session-skill-block.js +18 -2
  337. package/dist/core/agent-session-skill-block.js.map +1 -1
  338. package/dist/core/agent-session-state.d.ts.map +1 -1
  339. package/dist/core/agent-session-state.js +2 -1
  340. package/dist/core/agent-session-state.js.map +1 -1
  341. package/dist/core/agent-session-types.d.ts +2 -1
  342. package/dist/core/agent-session-types.d.ts.map +1 -1
  343. package/dist/core/agent-session-types.js.map +1 -1
  344. package/dist/core/agent-session.d.ts +1 -1
  345. package/dist/core/agent-session.js.map +1 -1
  346. package/dist/core/atomic-guide-command.js +2 -2
  347. package/dist/core/atomic-guide-command.js.map +1 -1
  348. package/dist/core/builtin-packages.d.ts.map +1 -1
  349. package/dist/core/builtin-packages.js +0 -6
  350. package/dist/core/builtin-packages.js.map +1 -1
  351. package/dist/core/cloudflare-gateway-binding.d.ts +11 -0
  352. package/dist/core/cloudflare-gateway-binding.d.ts.map +1 -0
  353. package/dist/core/cloudflare-gateway-binding.js +11 -0
  354. package/dist/core/cloudflare-gateway-binding.js.map +1 -0
  355. package/dist/core/codex-fast-mode-transport.d.ts +12 -0
  356. package/dist/core/codex-fast-mode-transport.d.ts.map +1 -0
  357. package/dist/core/codex-fast-mode-transport.js +130 -0
  358. package/dist/core/codex-fast-mode-transport.js.map +1 -0
  359. package/dist/core/codex-fast-mode.d.ts +20 -6
  360. package/dist/core/codex-fast-mode.d.ts.map +1 -1
  361. package/dist/core/codex-fast-mode.js +111 -3
  362. package/dist/core/codex-fast-mode.js.map +1 -1
  363. package/dist/core/diagnostics.d.ts +4 -0
  364. package/dist/core/diagnostics.d.ts.map +1 -1
  365. package/dist/core/diagnostics.js.map +1 -1
  366. package/dist/core/event-bus.d.ts +12 -0
  367. package/dist/core/event-bus.d.ts.map +1 -1
  368. package/dist/core/event-bus.js +22 -0
  369. package/dist/core/event-bus.js.map +1 -1
  370. package/dist/core/experimental.d.ts +25 -0
  371. package/dist/core/experimental.d.ts.map +1 -1
  372. package/dist/core/experimental.js +24 -0
  373. package/dist/core/experimental.js.map +1 -1
  374. package/dist/core/export-html/template-js/tree-filter-render.js +4 -3
  375. package/dist/core/export-html/template.js +4 -3
  376. package/dist/core/extension-session-state.d.ts +28 -0
  377. package/dist/core/extension-session-state.d.ts.map +1 -0
  378. package/dist/core/extension-session-state.js +55 -0
  379. package/dist/core/extension-session-state.js.map +1 -0
  380. package/dist/core/extensions/api-types.d.ts +6 -0
  381. package/dist/core/extensions/api-types.d.ts.map +1 -1
  382. package/dist/core/extensions/api-types.js.map +1 -1
  383. package/dist/core/extensions/context-types.d.ts +4 -0
  384. package/dist/core/extensions/context-types.d.ts.map +1 -1
  385. package/dist/core/extensions/context-types.js.map +1 -1
  386. package/dist/core/extensions/index.d.ts +1 -0
  387. package/dist/core/extensions/index.d.ts.map +1 -1
  388. package/dist/core/extensions/index.js +1 -0
  389. package/dist/core/extensions/index.js.map +1 -1
  390. package/dist/core/extensions/loader-api.d.ts +1 -1
  391. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  392. package/dist/core/extensions/loader-api.js +16 -10
  393. package/dist/core/extensions/loader-api.js.map +1 -1
  394. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  395. package/dist/core/extensions/loader-virtual-modules.js +12 -1
  396. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  397. package/dist/core/extensions/runner-context.d.ts +2 -0
  398. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  399. package/dist/core/extensions/runner-context.js +8 -0
  400. package/dist/core/extensions/runner-context.js.map +1 -1
  401. package/dist/core/extensions/runner.d.ts +1 -0
  402. package/dist/core/extensions/runner.d.ts.map +1 -1
  403. package/dist/core/extensions/runner.js +3 -0
  404. package/dist/core/extensions/runner.js.map +1 -1
  405. package/dist/core/extensions/runtime-types.d.ts +3 -0
  406. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  407. package/dist/core/extensions/runtime-types.js.map +1 -1
  408. package/dist/core/extensions/ui-types.d.ts +26 -0
  409. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  410. package/dist/core/extensions/ui-types.js +17 -1
  411. package/dist/core/extensions/ui-types.js.map +1 -1
  412. package/dist/core/http-dispatcher.d.ts.map +1 -1
  413. package/dist/core/http-dispatcher.js +5 -0
  414. package/dist/core/http-dispatcher.js.map +1 -1
  415. package/dist/core/keybindings.d.ts +24 -0
  416. package/dist/core/keybindings.d.ts.map +1 -1
  417. package/dist/core/keybindings.js +6 -0
  418. package/dist/core/keybindings.js.map +1 -1
  419. package/dist/core/model-config.d.ts +5 -0
  420. package/dist/core/model-config.d.ts.map +1 -1
  421. package/dist/core/model-config.js +1 -0
  422. package/dist/core/model-config.js.map +1 -1
  423. package/dist/core/model-registry.d.ts +1 -1
  424. package/dist/core/model-registry.js.map +1 -1
  425. package/dist/core/model-resolver-cli.d.ts +1 -1
  426. package/dist/core/model-resolver-cli.js.map +1 -1
  427. package/dist/core/model-resolver-defaults.js +3 -3
  428. package/dist/core/model-resolver-defaults.js.map +1 -1
  429. package/dist/core/model-resolver-initial.d.ts +1 -1
  430. package/dist/core/model-resolver-initial.js.map +1 -1
  431. package/dist/core/model-resolver-scope.d.ts +1 -1
  432. package/dist/core/model-resolver-scope.js.map +1 -1
  433. package/dist/core/model-runtime.d.ts +54 -0
  434. package/dist/core/model-runtime.d.ts.map +1 -1
  435. package/dist/core/model-runtime.js +96 -13
  436. package/dist/core/model-runtime.js.map +1 -1
  437. package/dist/core/oauth-login.js.map +1 -1
  438. package/dist/core/project-trust.d.ts +10 -0
  439. package/dist/core/project-trust.d.ts.map +1 -1
  440. package/dist/core/project-trust.js +12 -0
  441. package/dist/core/project-trust.js.map +1 -1
  442. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  443. package/dist/core/resource-loader-assets.js +14 -5
  444. package/dist/core/resource-loader-assets.js.map +1 -1
  445. package/dist/core/resource-loader-core.d.ts +3 -0
  446. package/dist/core/resource-loader-core.d.ts.map +1 -1
  447. package/dist/core/resource-loader-core.js +5 -0
  448. package/dist/core/resource-loader-core.js.map +1 -1
  449. package/dist/core/resource-loader-internals.d.ts +2 -0
  450. package/dist/core/resource-loader-internals.d.ts.map +1 -1
  451. package/dist/core/resource-loader-internals.js.map +1 -1
  452. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  453. package/dist/core/resource-loader-reload.js +2 -0
  454. package/dist/core/resource-loader-reload.js.map +1 -1
  455. package/dist/core/resource-loader-types.d.ts +2 -0
  456. package/dist/core/resource-loader-types.d.ts.map +1 -1
  457. package/dist/core/resource-loader-types.js.map +1 -1
  458. package/dist/core/resource-loader.d.ts +2 -0
  459. package/dist/core/resource-loader.d.ts.map +1 -1
  460. package/dist/core/resource-loader.js +1 -0
  461. package/dist/core/resource-loader.js.map +1 -1
  462. package/dist/core/sdk-types.d.ts +7 -6
  463. package/dist/core/sdk-types.d.ts.map +1 -1
  464. package/dist/core/sdk-types.js.map +1 -1
  465. package/dist/core/sdk.d.ts.map +1 -1
  466. package/dist/core/sdk.js +17 -6
  467. package/dist/core/sdk.js.map +1 -1
  468. package/dist/core/session-manager-core.d.ts +7 -1
  469. package/dist/core/session-manager-core.d.ts.map +1 -1
  470. package/dist/core/session-manager-core.js +11 -2
  471. package/dist/core/session-manager-core.js.map +1 -1
  472. package/dist/core/session-manager-entries.d.ts +2 -2
  473. package/dist/core/session-manager-entries.d.ts.map +1 -1
  474. package/dist/core/session-manager-entries.js +6 -4
  475. package/dist/core/session-manager-entries.js.map +1 -1
  476. package/dist/core/session-manager-list.d.ts.map +1 -1
  477. package/dist/core/session-manager-list.js +5 -1
  478. package/dist/core/session-manager-list.js.map +1 -1
  479. package/dist/core/session-manager-types.d.ts +25 -2
  480. package/dist/core/session-manager-types.d.ts.map +1 -1
  481. package/dist/core/session-manager-types.js.map +1 -1
  482. package/dist/core/session-manager.d.ts +1 -1
  483. package/dist/core/session-manager.d.ts.map +1 -1
  484. package/dist/core/session-manager.js.map +1 -1
  485. package/dist/core/settings-manager-basic-accessors.d.ts +1 -0
  486. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  487. package/dist/core/settings-manager-basic-accessors.js +8 -0
  488. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  489. package/dist/core/settings-manager-ui-accessors.d.ts +3 -1
  490. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  491. package/dist/core/settings-manager-ui-accessors.js +9 -0
  492. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  493. package/dist/core/settings-manager.d.ts +1 -1
  494. package/dist/core/settings-manager.d.ts.map +1 -1
  495. package/dist/core/settings-manager.js.map +1 -1
  496. package/dist/core/settings-types.d.ts +4 -0
  497. package/dist/core/settings-types.d.ts.map +1 -1
  498. package/dist/core/settings-types.js.map +1 -1
  499. package/dist/core/skill-catalog.d.ts +35 -0
  500. package/dist/core/skill-catalog.d.ts.map +1 -0
  501. package/dist/core/skill-catalog.js +264 -0
  502. package/dist/core/skill-catalog.js.map +1 -0
  503. package/dist/core/skills-async.d.ts.map +1 -1
  504. package/dist/core/skills-async.js +12 -6
  505. package/dist/core/skills-async.js.map +1 -1
  506. package/dist/core/skills.d.ts +2 -0
  507. package/dist/core/skills.d.ts.map +1 -1
  508. package/dist/core/skills.js +8 -5
  509. package/dist/core/skills.js.map +1 -1
  510. package/dist/core/slash-commands.d.ts.map +1 -1
  511. package/dist/core/slash-commands.js +1 -5
  512. package/dist/core/slash-commands.js.map +1 -1
  513. package/dist/core/system-prompt.js +2 -2
  514. package/dist/core/system-prompt.js.map +1 -1
  515. package/dist/core/tools/ask-user-question/ask-user-question.d.ts +25 -2
  516. package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
  517. package/dist/core/tools/ask-user-question/ask-user-question.js +47 -18
  518. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
  519. package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts.map +1 -1
  520. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js +5 -2
  521. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -1
  522. package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts.map +1 -1
  523. package/dist/core/tools/ask-user-question/view/components/submit-picker.js +3 -1
  524. package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -1
  525. package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts.map +1 -1
  526. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +8 -1
  527. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -1
  528. package/dist/core/tools/bash.d.ts.map +1 -1
  529. package/dist/core/tools/bash.js +2 -0
  530. package/dist/core/tools/bash.js.map +1 -1
  531. package/dist/core/tools/edit.d.ts.map +1 -1
  532. package/dist/core/tools/edit.js +2 -0
  533. package/dist/core/tools/edit.js.map +1 -1
  534. package/dist/core/tools/find.d.ts.map +1 -1
  535. package/dist/core/tools/find.js +3 -1
  536. package/dist/core/tools/find.js.map +1 -1
  537. package/dist/core/tools/grep.js +1 -1
  538. package/dist/core/tools/grep.js.map +1 -1
  539. package/dist/core/tools/hashline-engine/format.d.ts +2 -0
  540. package/dist/core/tools/hashline-engine/format.d.ts.map +1 -1
  541. package/dist/core/tools/hashline-engine/format.js +4 -2
  542. package/dist/core/tools/hashline-engine/format.js.map +1 -1
  543. package/dist/core/tools/hashline-engine/messages.d.ts +2 -0
  544. package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -1
  545. package/dist/core/tools/hashline-engine/messages.js +4 -2
  546. package/dist/core/tools/hashline-engine/messages.js.map +1 -1
  547. package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -1
  548. package/dist/core/tools/hashline-engine/parser.js +16 -4
  549. package/dist/core/tools/hashline-engine/parser.js.map +1 -1
  550. package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -1
  551. package/dist/core/tools/hashline-engine/tokenizer.js +37 -27
  552. package/dist/core/tools/hashline-engine/tokenizer.js.map +1 -1
  553. package/dist/core/tools/hashline.d.ts.map +1 -1
  554. package/dist/core/tools/hashline.js +8 -2
  555. package/dist/core/tools/hashline.js.map +1 -1
  556. package/dist/core/tools/ls.d.ts.map +1 -1
  557. package/dist/core/tools/ls.js +2 -0
  558. package/dist/core/tools/ls.js.map +1 -1
  559. package/dist/core/tools/read.d.ts.map +1 -1
  560. package/dist/core/tools/read.js +8 -1
  561. package/dist/core/tools/read.js.map +1 -1
  562. package/dist/core/tools/search.d.ts.map +1 -1
  563. package/dist/core/tools/search.js +2 -0
  564. package/dist/core/tools/search.js.map +1 -1
  565. package/dist/core/tools/todos.d.ts +3 -12
  566. package/dist/core/tools/todos.d.ts.map +1 -1
  567. package/dist/core/tools/todos.js +19 -4
  568. package/dist/core/tools/todos.js.map +1 -1
  569. package/dist/core/tools/write.d.ts.map +1 -1
  570. package/dist/core/tools/write.js +2 -0
  571. package/dist/core/tools/write.js.map +1 -1
  572. package/dist/index-extensions.d.ts +1 -1
  573. package/dist/index-extensions.d.ts.map +1 -1
  574. package/dist/index-extensions.js +1 -1
  575. package/dist/index-extensions.js.map +1 -1
  576. package/dist/index.d.ts +8 -5
  577. package/dist/index.d.ts.map +1 -1
  578. package/dist/index.js +6 -2
  579. package/dist/index.js.map +1 -1
  580. package/dist/main-runtime-api-key.d.ts +1 -1
  581. package/dist/main-runtime-api-key.js.map +1 -1
  582. package/dist/main-session-options.d.ts +1 -1
  583. package/dist/main-session-options.js.map +1 -1
  584. package/dist/main.d.ts.map +1 -1
  585. package/dist/main.js +10 -2
  586. package/dist/main.js.map +1 -1
  587. package/dist/modes/interactive/components/chat-session-host-rendering.js +1 -1
  588. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  589. package/dist/modes/interactive/components/chat-session-host-state.d.ts +8 -0
  590. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
  591. package/dist/modes/interactive/components/chat-session-host-state.js +8 -0
  592. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  593. package/dist/modes/interactive/components/chat-session-host.d.ts +26 -0
  594. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  595. package/dist/modes/interactive/components/chat-session-host.js +38 -0
  596. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  597. package/dist/modes/interactive/components/chat-transcript.d.ts +37 -0
  598. package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
  599. package/dist/modes/interactive/components/chat-transcript.js +54 -1
  600. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  601. package/dist/modes/interactive/components/fast-mode-selector.js +1 -1
  602. package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -1
  603. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  604. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  605. package/dist/modes/interactive/components/model-selector.js +2 -1
  606. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  607. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  608. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  609. package/dist/modes/interactive/components/reserved-bottom-overlay.d.ts +95 -0
  610. package/dist/modes/interactive/components/reserved-bottom-overlay.d.ts.map +1 -0
  611. package/dist/modes/interactive/components/reserved-bottom-overlay.js +234 -0
  612. package/dist/modes/interactive/components/reserved-bottom-overlay.js.map +1 -0
  613. package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
  614. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  615. package/dist/modes/interactive/components/session-selector-search.js +4 -0
  616. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  617. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  618. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  619. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  620. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  621. package/dist/modes/interactive/components/settings-selector-items.js +7 -0
  622. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  623. package/dist/modes/interactive/components/settings-selector-types.d.ts +3 -1
  624. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  625. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  626. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  627. package/dist/modes/interactive/components/tool-execution.js +12 -1
  628. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  629. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  630. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  631. package/dist/modes/interactive/interactive-autocomplete.js +5 -4
  632. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  633. package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -1
  634. package/dist/modes/interactive/interactive-bash-compact.js +2 -2
  635. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  636. package/dist/modes/interactive/interactive-extension-custom-ui.js +94 -6
  637. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  638. package/dist/modes/interactive/interactive-mode-base.d.ts +41 -3
  639. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  640. package/dist/modes/interactive/interactive-mode-base.js +80 -11
  641. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  642. package/dist/modes/interactive/interactive-mode-surface.d.ts +9 -1
  643. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  644. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  645. package/dist/modes/interactive/interactive-mode-types.d.ts +2 -0
  646. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  647. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  648. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts +8 -1
  649. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts.map +1 -1
  650. package/dist/modes/interactive/interactive-model-catalog-startup.js +13 -3
  651. package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
  652. package/dist/modes/interactive/interactive-model-routing.js +3 -4
  653. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  654. package/dist/modes/interactive/interactive-render-chat.js +6 -0
  655. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  656. package/dist/modes/interactive/interactive-resource-disclosure.js +2 -2
  657. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  658. package/dist/modes/interactive/interactive-selectors.js +7 -3
  659. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  660. package/dist/modes/interactive/interactive-session-runtime.js +7 -1
  661. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  662. package/dist/modes/interactive/interactive-slash-commands.js +2 -2
  663. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  664. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  665. package/dist/modes/interactive/interactive-startup.js +34 -9
  666. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  667. package/dist/modes/interactive/interactive-tui.d.ts +21 -1
  668. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  669. package/dist/modes/interactive/interactive-tui.js +140 -38
  670. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  671. package/dist/modes/interactive/model-catalog-refresh.d.ts +17 -0
  672. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  673. package/dist/modes/interactive/model-catalog-refresh.js +84 -0
  674. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  675. package/dist/modes/interactive/theme/dark.json +2 -0
  676. package/dist/modes/interactive/theme/light.json +2 -0
  677. package/dist/modes/interactive/theme/theme-class.d.ts +12 -3
  678. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  679. package/dist/modes/interactive/theme/theme-class.js +6 -1
  680. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  681. package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
  682. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  683. package/dist/modes/interactive/theme/theme-controller.js +23 -10
  684. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  685. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  686. package/dist/modes/interactive/theme/theme-loading.js +1 -0
  687. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  688. package/dist/modes/interactive/theme/theme-schema.d.ts +8 -0
  689. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  690. package/dist/modes/interactive/theme/theme-schema.js +3 -1
  691. package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  692. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  693. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +2 -0
  694. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  695. package/dist/modes/interactive-engine/engine-custom-ui.js +1 -0
  696. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  697. package/dist/modes/interactive-engine/protocol.d.ts +1 -0
  698. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  699. package/dist/modes/interactive-engine/protocol.js +1 -0
  700. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  701. package/dist/modes/interactive-engine/remote-component.d.ts +3 -1
  702. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
  703. package/dist/modes/interactive-engine/remote-component.js +3 -2
  704. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  705. package/dist/modes/json-event.d.ts +6 -1
  706. package/dist/modes/json-event.d.ts.map +1 -1
  707. package/dist/modes/json-event.js +17 -2
  708. package/dist/modes/json-event.js.map +1 -1
  709. package/dist/modes/rpc/rpc-client.js.map +1 -1
  710. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  711. package/dist/modes/rpc/rpc-command-handler.js +5 -4
  712. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  713. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  714. package/dist/modes/rpc/rpc-responses.js.map +1 -1
  715. package/dist/modes/rpc/rpc-types.d.ts +1 -1
  716. package/dist/modes/rpc/rpc-types.js.map +1 -1
  717. package/dist/package-manager-cli.js.map +1 -1
  718. package/dist/server/create-harness.d.ts.map +1 -1
  719. package/dist/server/create-harness.js +11 -0
  720. package/dist/server/create-harness.js.map +1 -1
  721. package/dist/utils/abort.d.ts +9 -0
  722. package/dist/utils/abort.d.ts.map +1 -0
  723. package/dist/utils/abort.js +19 -0
  724. package/dist/utils/abort.js.map +1 -0
  725. package/dist/utils/tools-manager.d.ts +16 -1
  726. package/dist/utils/tools-manager.d.ts.map +1 -1
  727. package/dist/utils/tools-manager.js +19 -19
  728. package/dist/utils/tools-manager.js.map +1 -1
  729. package/docs/custom-provider.md +9 -8
  730. package/docs/development.md +0 -1
  731. package/docs/docs.json +0 -1
  732. package/docs/environment-variables.md +3 -0
  733. package/docs/extensions.md +100 -2
  734. package/docs/json.md +3 -1
  735. package/docs/keybindings.md +8 -3
  736. package/docs/models/artificial-analysis-index.md +2 -2
  737. package/docs/models/model-selection.md +32 -23
  738. package/docs/models/pareto-efficiency.md +25 -24
  739. package/docs/providers.md +95 -2
  740. package/docs/quickstart.md +4 -2
  741. package/docs/rpc.md +21 -7
  742. package/docs/sdk.md +26 -1
  743. package/docs/session-format.md +5 -2
  744. package/docs/settings.md +34 -3
  745. package/docs/skills.md +16 -1
  746. package/docs/terminal-setup.md +15 -2
  747. package/docs/themes.md +22 -4
  748. package/docs/tools.md +3 -1
  749. package/docs/tui.md +2 -0
  750. package/docs/usage.md +5 -4
  751. package/docs/workflows.md +96 -19
  752. package/npm-shrinkwrap.json +211 -232
  753. package/package.json +8 -8
  754. package/dist/builtin/i-have-adhd/CHANGELOG.md +0 -30
  755. package/dist/builtin/i-have-adhd/LICENSE +0 -21
  756. package/dist/builtin/i-have-adhd/README.md +0 -18
  757. package/dist/builtin/i-have-adhd/index.ts +0 -238
  758. package/dist/builtin/i-have-adhd/package.json +0 -56
  759. package/dist/builtin/i-have-adhd/skills/i-have-adhd/SKILL.md +0 -140
  760. package/dist/builtin/workflows/builtin/open-claude-design-feedback.ts +0 -359
  761. package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-core.mjs +0 -180
  762. package/docs/i-have-adhd.md +0 -36
@@ -17,6 +17,7 @@ import type {
17
17
  WorkflowOutputsFromSchemas,
18
18
  WorkflowProvidedInputsFromSchemas,
19
19
  } from "../shared/workflow-authoring-types.js";
20
+ import { DEFAULT_WORKFLOW_HEARTBEAT_INTERVAL_MINUTES } from "../shared/workflow-heartbeat-contract.js";
20
21
  import { normalizeWorkflowName } from "../workflows/identity.js";
21
22
 
22
23
  export type {
@@ -158,6 +159,13 @@ export function workflow<
158
159
  ) {
159
160
  throw new TypeError("workflow: inputs must be a schema map");
160
161
  }
162
+ const heartbeatIntervalMinutes =
163
+ spec.heartbeatIntervalMinutes === undefined
164
+ ? DEFAULT_WORKFLOW_HEARTBEAT_INTERVAL_MINUTES
165
+ : spec.heartbeatIntervalMinutes;
166
+ if (!Number.isFinite(heartbeatIntervalMinutes) || heartbeatIntervalMinutes < 0) {
167
+ throw new TypeError("workflow: heartbeatIntervalMinutes must be a non-negative finite number");
168
+ }
161
169
 
162
170
  const name = resolveWorkflowName(spec.name);
163
171
  const normalizedName = normalizeWorkflowName(name);
@@ -174,6 +182,7 @@ export function workflow<
174
182
  normalizedName,
175
183
  description: spec.description,
176
184
  ...(spec.autoAttach === true ? { autoAttach: true } : {}),
185
+ heartbeatIntervalMinutes,
177
186
  inputs: frozenInputs,
178
187
  outputs: frozenOutputs,
179
188
  ...(inputBindings !== undefined ? { inputBindings } : {}),
@@ -4,6 +4,7 @@ export type { AgentSessionAdapter, CompleteAdapter, CompleteStageOpts, GitWorktr
4
4
  import type * as AuthoringContract from "./shared/authoring-contract.js";
5
5
  import type { AuthoredWorkflowSpec as SharedAuthoredWorkflowSpec, WorkflowInputsFromSchemas, WorkflowOutputsFromSchemas, WorkflowProvidedInputsFromSchemas } from "./shared/workflow-authoring-types.js";
6
6
  export type { WorkflowInputsFromSchemas, WorkflowOutputsFromSchemas, WorkflowProvidedInputsFromSchemas, } from "./shared/workflow-authoring-types.js";
7
+ export type { WorkflowHeartbeatEvent, WorkflowHeartbeatEventDetails, WorkflowHeartbeatIdentity, } from "./shared/workflow-heartbeat-contract.js";
7
8
  import type { GitWorktreeSetupOptions, GitWorktreeSetupResult, ResolvedInputs, RunResult, RunStatus, StageSnapshot, WorkflowDefinition as WorkflowContractDefinition, WorkflowExecutionPolicy, WorkflowInputSchemaMap, WorkflowInputValues, WorkflowOutputSchemaMap, WorkflowOutputValues, WorkflowSerializableObject } from "./shared/authoring-contract.js";
8
9
  declare const workflowDefinitionBrand: unique symbol;
9
10
  type WorkflowDefinitionBrand = {
@@ -55,6 +56,8 @@ export declare function workflow<const TInputs extends WorkflowInputSchemaMap =
55
56
  export declare function keepContext(text: string): string;
56
57
  export declare const KEEP_CONTEXT_OPEN_TAG: string;
57
58
  export declare const KEEP_CONTEXT_CLOSE_TAG: string;
59
+ export declare const DEFAULT_WORKFLOW_HEARTBEAT_INTERVAL_MINUTES: 15;
60
+ export declare const WORKFLOW_HEARTBEAT_CUSTOM_TYPE: "workflows:workflow-heartbeat";
58
61
  export declare function createRegistry<TDefinitions extends readonly AnyWorkflowDefinition[] = readonly AnyWorkflowDefinition[]>(initial?: TDefinitions): WorkflowRegistry;
59
62
  export declare function normalizeWorkflowName(name: string): string;
60
63
  export declare function workflowNamesEqual(a: string, b: string): boolean;
@@ -1,6 +1,7 @@
1
1
  import { flattenTruncatedString } from "../shared/flat-string.js";
2
2
  import { isReopenableSessionTranscript } from "../shared/session-transcript.js";
3
3
  import type { RunSnapshot, StageSnapshot, ToolNodeSnapshot } from "../shared/store-types.js";
4
+ import { boundedToolPayload, boundedToolPayloadRecord, boundedToolText } from "../shared/tool-payload-bounds.js";
4
5
  import type { WorkflowInputValues, WorkflowSerializableValue } from "../shared/types.js";
5
6
  import type { DurableWorkflowBackend } from "./backend.js";
6
7
  import {
@@ -23,6 +24,17 @@ import {
23
24
  import { isDurableWorkflowResumable } from "./resume-eligibility.js";
24
25
  import { resolveDurableEntry } from "./resume-runtime.js";
25
26
  import { priorRunElapsedMs, RUN_TIMING_CHECKPOINT_NAME } from "./run-timing.js";
27
+ import { WORKFLOW_HEARTBEAT_ANCHOR_CHECKPOINT_NAME } from "./workflow-heartbeat-anchor.js";
28
+
29
+ /**
30
+ * Reserved run-level tool checkpoints that carry no graph node. They round-trip
31
+ * through the durable envelope like any tool checkpoint, so reconstruction has
32
+ * to skip them or they surface as phantom cached tool nodes.
33
+ */
34
+ function isReservedRunCheckpointHash(argsHash: string): boolean {
35
+ return argsHash === RUN_TIMING_CHECKPOINT_NAME || argsHash === WORKFLOW_HEARTBEAT_ANCHOR_CHECKPOINT_NAME;
36
+ }
37
+
26
38
  import {
27
39
  directChildTopologyError,
28
40
  groupByDurableStageKey,
@@ -218,7 +230,7 @@ function checkpointDrafts(checkpoints: readonly DurableCheckpoint[]): Reconstruc
218
230
  stageByReplayKey.set(checkpoint.replayKey, mergeStageDraft(existing, checkpoint, sequence));
219
231
  return;
220
232
  }
221
- if (checkpoint.kind !== "tool" || checkpoint.argsHash === RUN_TIMING_CHECKPOINT_NAME) return;
233
+ if (checkpoint.kind !== "tool" || isReservedRunCheckpointHash(checkpoint.argsHash)) return;
222
234
  if (!firstToolSequenceByHash.has(checkpoint.argsHash)) {
223
235
  firstToolSequenceByHash.set(checkpoint.argsHash, sequence);
224
236
  }
@@ -255,6 +267,11 @@ function completedToolNodes(
255
267
  kind: "tool" as const,
256
268
  id: topology?.nodeId ?? checkpoint.checkpointId,
257
269
  name: checkpoint.name,
270
+ // Restored nodes are recorded into the live store, which session and
271
+ // status surfaces clone and re-serialize, so these inspection copies
272
+ // are bounded. `checkpoint.output` itself stays exact for replay.
273
+ ...(checkpoint.args !== undefined ? { args: boundedToolPayloadRecord(checkpoint.args) } : {}),
274
+ ...(checkpoint.source !== undefined ? { source: boundedToolText(checkpoint.source) } : {}),
258
275
  argsHash: checkpoint.argsHash,
259
276
  ordinal: topology?.ordinal ?? index + 1,
260
277
  parentIds: Object.freeze(
@@ -266,6 +283,10 @@ function completedToolNodes(
266
283
  executionOrder: topology?.order ?? firstSequenceByHash.get(checkpoint.argsHash)!,
267
284
  ...(topology?.startedAt !== undefined ? { startedAt: topology.startedAt } : {}),
268
285
  endedAt: topology?.endedAt ?? checkpoint.completedAt,
286
+ ...(topology?.startedAt !== undefined
287
+ ? { durationMs: Math.max(0, (topology?.endedAt ?? checkpoint.completedAt) - topology.startedAt) }
288
+ : {}),
289
+ ...(checkpoint.throwingFailureError === undefined ? { result: boundedToolPayload(checkpoint.output) } : {}),
269
290
  ...(failed
270
291
  ? { error: failureError ?? "Invalid durable ctx.tool failure outcome" }
271
292
  : { resultSummary: summarizeCompletedToolResult(checkpoint.output) }),
@@ -390,7 +411,7 @@ function runSnapshotsFromCheckpoints(
390
411
  const supportedNonGraphState = checkpoints.every(
391
412
  (checkpoint) =>
392
413
  checkpoint.kind === "ui" ||
393
- (checkpoint.kind === "tool" && checkpoint.argsHash === RUN_TIMING_CHECKPOINT_NAME),
414
+ (checkpoint.kind === "tool" && isReservedRunCheckpointHash(checkpoint.argsHash)),
394
415
  );
395
416
  if (policy.failClosed && supportedNonGraphState) {
396
417
  return [emptyGraphRun(rootRunId, rootRunName, fallbackCompletedAt)];
@@ -81,6 +81,7 @@ export interface DbosStepRecord {
81
81
  readonly completedAt?: number;
82
82
  }
83
83
 
84
+ import { getDbosProcessOwner } from "./dbos-process-owner.js";
84
85
  import { createRealDbosHandle, type DbosLogger, type DbosStatic, getAtomicExecutorId } from "./dbos-sdk-handle.js";
85
86
  // ---------------------------------------------------------------------------
86
87
  // Real SDK handle factory (lazy import, no top-level dependency)
@@ -118,23 +119,35 @@ export async function configureDbosDurableBackend(config?: {
118
119
  readonly systemDatabaseUrl?: string;
119
120
  }): Promise<ConfiguredDbosDurability> {
120
121
  const sdk = await importDbosSdk();
121
- const url = effectiveSystemDatabaseUrl(config?.systemDatabaseUrl);
122
- sdk.setConfig({
123
- name: "atomic-workflows",
124
- ...(url === undefined ? {} : { systemDatabaseUrl: url }),
125
- runAdminServer: false,
126
- // Unique per process: concurrent Atomic sessions share one database, and
127
- // DBOS-level pending-workflow recovery must stay scoped to the owner.
128
- executorID: getAtomicExecutorId(),
129
- logger: SILENT_DBOS_LOGGER,
130
- });
131
- const mainWorkflow = sdk.registerWorkflow(async (_name: string, inputs: DurableInputs) => inputs, {
132
- name: "atomicWorkflowHandle",
133
- });
134
- const checkpointWorkflow = sdk.registerWorkflow(
135
- async (_workflowId: string, _stepName: string, output: WorkflowSerializableValue) => output,
136
- { name: "atomicWorkflowCheckpoint" },
137
- );
122
+ const owner = getDbosProcessOwner();
123
+ const existing = owner.wrappers;
124
+ // The SDK forbids setConfig after launch. Recover original wrappers first.
125
+ if (existing === undefined) {
126
+ const url = effectiveSystemDatabaseUrl(config?.systemDatabaseUrl);
127
+ sdk.setConfig({
128
+ name: "atomic-workflows",
129
+ ...(url === undefined ? {} : { systemDatabaseUrl: url }),
130
+ runAdminServer: false,
131
+ // Unique per process: concurrent Atomic sessions share one database, and
132
+ // DBOS-level pending-workflow recovery must stay scoped to the owner.
133
+ executorID: getAtomicExecutorId(),
134
+ logger: SILENT_DBOS_LOGGER,
135
+ });
136
+ }
137
+ const mainWorkflow =
138
+ existing?.mainWorkflow ??
139
+ sdk.registerWorkflow(async (_name: string, inputs: DurableInputs) => inputs, {
140
+ name: "atomicWorkflowHandle",
141
+ });
142
+ const checkpointWorkflow =
143
+ existing?.checkpointWorkflow ??
144
+ sdk.registerWorkflow(
145
+ async (_workflowId: string, _stepName: string, output: WorkflowSerializableValue) => output,
146
+ { name: "atomicWorkflowCheckpoint" },
147
+ );
148
+ if (existing === undefined) {
149
+ owner.wrappers = { mainWorkflow, checkpointWorkflow };
150
+ }
138
151
  return {
139
152
  backend: new DbosDurableBackend(createRealDbosHandle(sdk, mainWorkflow, checkpointWorkflow)),
140
153
  launch: () => sdk.launch(),
@@ -47,6 +47,8 @@ export interface DbosCheckpointEnvelope extends WorkflowSerializableObject {
47
47
  readonly kind: DurableCheckpointKind;
48
48
  readonly checkpointId: string;
49
49
  readonly name?: string;
50
+ readonly args?: WorkflowSerializableValue;
51
+ readonly source?: string;
50
52
  readonly argsHash?: string;
51
53
  readonly promptKind?: UiPromptKind;
52
54
  readonly outcomeKind?: "return_success" | "return_failure";
@@ -99,6 +101,8 @@ export function encodeCheckpoint(checkpoint: DurableCheckpoint): DbosCheckpointE
99
101
  return {
100
102
  ...base,
101
103
  name: t.name,
104
+ ...(t.args !== undefined ? { args: t.args } : {}),
105
+ ...(t.source !== undefined ? { source: t.source } : {}),
102
106
  argsHash: t.argsHash,
103
107
  ...(t.outcomeKind !== undefined ? { outcomeKind: t.outcomeKind } : {}),
104
108
  ...(t.throwingFailureError !== undefined ? { throwingFailureError: t.throwingFailureError } : {}),
@@ -218,6 +222,10 @@ function decodeEnvelope(workflowId: string, env: DbosCheckpointEnvelope): Durabl
218
222
  return undefined;
219
223
  const common = { workflowId, checkpointId: env.checkpointId, completedAt: env.completedAt };
220
224
  if (env.kind === "tool") {
225
+ // An inspection-only field must never invalidate durable state: one
226
+ // rejected checkpoint suppresses the whole workflow and re-runs completed
227
+ // side effects. `args` and `source` are therefore ignored when they are
228
+ // not the expected shape, while the replayable fields stay strict.
221
229
  if (
222
230
  typeof env.argsHash !== "string" ||
223
231
  env.output === undefined ||
@@ -227,6 +235,10 @@ function decodeEnvelope(workflowId: string, env: DbosCheckpointEnvelope): Durabl
227
235
  (env.throwingFailureError !== undefined && typeof env.throwingFailureError !== "string")
228
236
  )
229
237
  return undefined;
238
+ const inspectionArgs =
239
+ typeof env.args === "object" && env.args !== null && !Array.isArray(env.args)
240
+ ? (env.args as Readonly<Record<string, WorkflowSerializableValue>>)
241
+ : undefined;
230
242
  const outcome = env.outcomeKind === undefined ? undefined : workflowToolOutcomeFromValue(env.output);
231
243
  if (
232
244
  (env.outcomeKind === "return_success" && outcome?.ok !== true) ||
@@ -239,6 +251,8 @@ function decodeEnvelope(workflowId: string, env: DbosCheckpointEnvelope): Durabl
239
251
  kind: "tool",
240
252
  ...common,
241
253
  name: env.name ?? "tool",
254
+ ...(inspectionArgs !== undefined ? { args: inspectionArgs } : {}),
255
+ ...(typeof env.source === "string" ? { source: env.source } : {}),
242
256
  argsHash: env.argsHash,
243
257
  output: env.output,
244
258
  ...(env.outcomeKind !== undefined ? { outcomeKind: env.outcomeKind } : {}),
@@ -4,6 +4,8 @@ import {
4
4
  resolveDbosSystemDatabaseUrl,
5
5
  shouldProvisionLocalDbos,
6
6
  } from "./dbos-local-postgres.js";
7
+ import { getDbosProcessOwner, resetDbosProcessOwner } from "./dbos-process-owner.js";
8
+ import { classifyDbosDurabilityFailure, readDbosFailureDetail } from "./dbos-registration-diagnostics.js";
7
9
 
8
10
  export type DbosLifecycleState =
9
11
  | "uninitialized"
@@ -52,49 +54,51 @@ const defaultConfigurator: DbosConfigurator = async () => {
52
54
  let configureDurability: DbosConfigurator = defaultConfigurator;
53
55
  let provisionLocalDbos: LocalDbosProvisioner = provisionResolvedLocalDbos;
54
56
 
55
- let state: DbosLifecycleState = "uninitialized";
56
- let configured: Promise<ConfiguredDbosDurability> | undefined;
57
- let active: ConfiguredDbosDurability | undefined;
58
- let launchPromise: Promise<void> | undefined;
59
- let shutdownPromise: Promise<void> | undefined;
60
- let failure: DbosDurabilityError | undefined;
61
-
62
- function durabilityFailure(action: string, error: unknown): DbosDurabilityError {
63
- const detail = error instanceof Error ? error.message : String(error);
64
- return new DbosDurabilityError(
65
- `DBOS workflow durability ${action} failed: ${detail}. Set DBOS_SYSTEM_DATABASE_URL to an existing Postgres when local provisioning is unavailable.`,
66
- error instanceof Error ? { cause: error } : undefined,
67
- );
57
+ function owner(): ReturnType<typeof getDbosProcessOwner> {
58
+ return getDbosProcessOwner();
59
+ }
60
+
61
+ async function durabilityFailure(action: string, error: unknown): Promise<DbosDurabilityError> {
62
+ const detail = readDbosFailureDetail(error);
63
+ const kind = await classifyDbosDurabilityFailure(error);
64
+ const guidance =
65
+ kind === "duplicate_registration"
66
+ ? "A duplicate DBOS operation registration caused this failure; changing the database URL will not resolve it."
67
+ : "Set DBOS_SYSTEM_DATABASE_URL to an existing Postgres when local provisioning is unavailable.";
68
+ const cause = error instanceof Error ? { cause: error } : undefined;
69
+ return new DbosDurabilityError(`DBOS workflow durability ${action} failed: ${detail}. ${guidance}`, cause);
68
70
  }
69
71
 
70
72
  export async function configureDbosOnce(): Promise<ConfiguredDbosDurability> {
71
- if (failure !== undefined) throw failure;
72
- configured ??= configureDurability()
73
+ const slot = owner();
74
+ if (slot.failure !== undefined) throw slot.failure;
75
+ slot.configured ??= configureDurability()
73
76
  .then((value) => {
74
- active = value;
75
- state = "configured";
77
+ slot.active = value;
78
+ slot.state = "configured";
76
79
  return value;
77
80
  })
78
- .catch((error: unknown) => {
79
- failure = durabilityFailure("configuration", error);
80
- state = "failed";
81
- throw failure;
81
+ .catch(async (error: unknown) => {
82
+ slot.failure = await durabilityFailure("configuration", error);
83
+ slot.state = "failed";
84
+ throw slot.failure;
82
85
  });
83
- return await configured;
86
+ return await slot.configured;
84
87
  }
85
88
 
86
89
  export async function launchDbosOnce(): Promise<void> {
87
- if (failure !== undefined) throw failure;
90
+ const slot = owner();
91
+ if (slot.failure !== undefined) throw slot.failure;
88
92
  // The executor is process-scoped and stops exactly once, at process exit.
89
93
  // Post-shutdown launches must fail loudly instead of returning a backend
90
94
  // whose SDK launched marker has been cleared.
91
- if (state === "shutting_down" || state === "shut_down") throw new DbosShutdownError();
95
+ if (slot.state === "shutting_down" || slot.state === "shut_down") throw new DbosShutdownError();
92
96
  const durability = await configureDbosOnce();
93
- launchPromise ??= (async () => {
94
- state = "launching";
97
+ slot.launchPromise ??= (async () => {
98
+ slot.state = "launching";
95
99
  try {
96
100
  await durability.launch();
97
- state = "ready";
101
+ slot.state = "ready";
98
102
  } catch (error) {
99
103
  if (shouldProvisionLocalDbos(error)) {
100
104
  try {
@@ -103,54 +107,57 @@ export async function launchDbosOnce(): Promise<void> {
103
107
  await durability.shutdown();
104
108
  await provisionLocalDbos();
105
109
  await durability.launch();
106
- state = "ready";
110
+ slot.state = "ready";
107
111
  return;
108
112
  } catch (provisionError) {
109
- failure = durabilityFailure("local Postgres startup", provisionError);
113
+ slot.failure = await durabilityFailure("local Postgres startup", provisionError);
110
114
  }
111
115
  } else {
112
- failure = durabilityFailure("launch", error);
116
+ slot.failure = await durabilityFailure("launch", error);
113
117
  }
114
- state = "failed";
115
- throw failure;
118
+ slot.state = "failed";
119
+ throw slot.failure;
116
120
  }
117
121
  })();
118
- await launchPromise;
122
+ await slot.launchPromise;
119
123
  }
120
124
 
121
125
  export async function getReadyDbosBackend(): Promise<DbosDurableBackend> {
122
126
  await launchDbosOnce();
123
- if (state !== "ready" || active === undefined) throw failure ?? new DbosNotReadyError();
124
- return active.backend;
127
+ const slot = owner();
128
+ if (slot.state !== "ready" || slot.active === undefined) throw slot.failure ?? new DbosNotReadyError();
129
+ return slot.active.backend;
125
130
  }
126
131
 
127
132
  export function getReadyDbosBackendSync(): DbosDurableBackend | undefined {
128
- return state === "ready" ? active?.backend : undefined;
133
+ const slot = owner();
134
+ return slot.state === "ready" ? slot.active?.backend : undefined;
129
135
  }
130
136
 
131
137
  export async function shutdownDbos(): Promise<void> {
132
- if (shutdownPromise !== undefined) return await shutdownPromise;
133
- const configuredPromise = configured;
138
+ const slot = owner();
139
+ if (slot.shutdownPromise !== undefined) return await slot.shutdownPromise;
140
+ const configuredPromise = slot.configured;
134
141
  if (configuredPromise === undefined) return;
135
- shutdownPromise = (async () => {
142
+ slot.shutdownPromise = (async () => {
136
143
  // A backend that never reached "ready" has nothing to flush or stop.
137
144
  // `configured`/`launchPromise` memoize rejections, so re-awaiting them
138
145
  // unguarded would rethrow the original provisioning failure out of every
139
146
  // session dispose — crashing otherwise-successful runs at process exit.
140
147
  const durability = await configuredPromise.catch(() => undefined);
141
148
  if (durability === undefined) return;
142
- if (launchPromise !== undefined) await launchPromise.catch(() => undefined);
143
- if (state !== "ready") return;
144
- state = "shutting_down";
149
+ if (slot.launchPromise !== undefined) await slot.launchPromise.catch(() => undefined);
150
+ if (slot.state !== "ready") return;
151
+ slot.state = "shutting_down";
145
152
  await durability.backend.flush();
146
153
  await durability.shutdown();
147
- state = "shut_down";
148
- })().catch((error: unknown) => {
149
- failure = durabilityFailure("shutdown", error);
150
- state = "failed";
151
- throw failure;
154
+ slot.state = "shut_down";
155
+ })().catch(async (error: unknown) => {
156
+ slot.failure = await durabilityFailure("shutdown", error);
157
+ slot.state = "failed";
158
+ throw slot.failure;
152
159
  });
153
- await shutdownPromise;
160
+ await slot.shutdownPromise;
154
161
  }
155
162
 
156
163
  /**
@@ -159,12 +166,13 @@ export async function shutdownDbos(): Promise<void> {
159
166
  * `/fork`, `/reload`) where the DBOS executor must stay launched.
160
167
  */
161
168
  export async function flushDbos(): Promise<void> {
162
- if (state !== "ready" || active === undefined) return;
163
- await active.backend.flush();
169
+ const slot = owner();
170
+ if (slot.state !== "ready" || slot.active === undefined) return;
171
+ await slot.active.backend.flush();
164
172
  }
165
173
 
166
174
  export function dbosLifecycleState(): DbosLifecycleState {
167
- return state;
175
+ return owner().state;
168
176
  }
169
177
 
170
178
  /** Reset the process singleton with an explicit configurator for unit tests. */
@@ -172,12 +180,7 @@ export function resetDbosLifecycleForTests(
172
180
  configurator: DbosConfigurator = defaultConfigurator,
173
181
  provisioner: LocalDbosProvisioner = provisionResolvedLocalDbos,
174
182
  ): void {
175
- state = "uninitialized";
176
- configured = undefined;
177
- active = undefined;
178
- launchPromise = undefined;
179
- shutdownPromise = undefined;
180
- failure = undefined;
183
+ resetDbosProcessOwner();
181
184
  configureDurability = configurator;
182
185
  provisionLocalDbos = provisioner;
183
186
  }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Process-global owner for DBOS lifecycle state and registered wrappers.
3
+ *
4
+ * `@dbos-inc/dbos-sdk` keeps a process-global operation registry that #1958
5
+ * leaves alive across session replacement. The workflows bundle is re-evaluated
6
+ * on `/reload` and the other process-preserving boundaries, so module-local
7
+ * variables restart at `uninitialized` and `configureDbosDurableBackend` would
8
+ * register `atomicWorkflowHandle` / `atomicWorkflowCheckpoint` a second time.
9
+ * The second registration throws and the replacement session degrades to
10
+ * `InMemoryDurableBackend` (#2022).
11
+ *
12
+ * Session scope is the wrong lifetime: the SDK registry is process-global, so
13
+ * a session-scoped owner would re-register per session and reproduce the bug.
14
+ * This slot lives on `globalThis` under `Symbol.for` so every load generation
15
+ * of the bundle — and a second copy of the module reached through a different
16
+ * specifier — shares one owner.
17
+ *
18
+ * The `@1` suffix is the shape version. Bump it when these fields change so a
19
+ * new generation declines an incompatible predecessor instead of reading it.
20
+ */
21
+
22
+ import type { WorkflowSerializableValue } from "../shared/types.js";
23
+ import type { ConfiguredDbosDurability } from "./dbos-backend.js";
24
+ import type { DbosDurabilityError, DbosLifecycleState } from "./dbos-lifecycle.js";
25
+
26
+ export const DBOS_PROCESS_OWNER_KEY = Symbol.for("atomic-workflows/dbos-process-owner@1");
27
+
28
+ export interface DbosRegisteredWrappers {
29
+ readonly mainWorkflow: (
30
+ name: string,
31
+ inputs: Record<string, WorkflowSerializableValue>,
32
+ ) => Promise<WorkflowSerializableValue>;
33
+ readonly checkpointWorkflow: (
34
+ workflowId: string,
35
+ stepName: string,
36
+ output: WorkflowSerializableValue,
37
+ ) => Promise<WorkflowSerializableValue>;
38
+ }
39
+
40
+ export interface DbosProcessOwner {
41
+ readonly version: 1;
42
+ state: DbosLifecycleState;
43
+ configured: Promise<ConfiguredDbosDurability> | undefined;
44
+ active: ConfiguredDbosDurability | undefined;
45
+ launchPromise: Promise<void> | undefined;
46
+ shutdownPromise: Promise<void> | undefined;
47
+ failure: DbosDurabilityError | undefined;
48
+ wrappers: DbosRegisteredWrappers | undefined;
49
+ }
50
+
51
+ function emptyOwner(): DbosProcessOwner {
52
+ return {
53
+ version: 1,
54
+ state: "uninitialized",
55
+ configured: undefined,
56
+ active: undefined,
57
+ launchPromise: undefined,
58
+ shutdownPromise: undefined,
59
+ failure: undefined,
60
+ wrappers: undefined,
61
+ };
62
+ }
63
+
64
+ function ownerBag(): Record<symbol, DbosProcessOwner | undefined> {
65
+ return globalThis as typeof globalThis & Record<symbol, DbosProcessOwner | undefined>;
66
+ }
67
+
68
+ export function getDbosProcessOwner(): DbosProcessOwner {
69
+ const bag = ownerBag();
70
+ const existing = bag[DBOS_PROCESS_OWNER_KEY];
71
+ if (existing !== undefined && existing.version === 1) return existing;
72
+ const created = emptyOwner();
73
+ bag[DBOS_PROCESS_OWNER_KEY] = created;
74
+ return created;
75
+ }
76
+
77
+ /** Reset every field on the process-global slot. Used by durability tests. */
78
+ export function resetDbosProcessOwner(): void {
79
+ const owner = getDbosProcessOwner();
80
+ owner.state = "uninitialized";
81
+ owner.configured = undefined;
82
+ owner.active = undefined;
83
+ owner.launchPromise = undefined;
84
+ owner.shutdownPromise = undefined;
85
+ owner.failure = undefined;
86
+ owner.wrappers = undefined;
87
+ }
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Classify DBOS durability failures so a duplicate operation registration
3
+ * is not described as a Postgres provisioning problem (#2022 / #2462).
4
+ *
5
+ * Uses the SDK `Error` namespace (`DBOSConflictingRegistrationError` and
6
+ * `getDBOSErrorCode`). The SDK is loaded lazily so this module never
7
+ * statically imports `@dbos-inc/dbos-sdk`. `instanceof` is not used: two
8
+ * resolved copies of the SDK would make it fail.
9
+ */
10
+
11
+ export type DbosDurabilityFailureKind = "duplicate_registration" | "other";
12
+
13
+ interface DbosSdkErrorModule {
14
+ readonly DBOSConflictingRegistrationError?: new (msg: string) => object;
15
+ readonly getDBOSErrorCode?: (error: Error) => number | undefined;
16
+ }
17
+
18
+ let cachedErrorModule: DbosSdkErrorModule | undefined;
19
+ let errorModuleLoad: Promise<DbosSdkErrorModule | undefined> | undefined;
20
+
21
+ async function loadDbosErrorModule(): Promise<DbosSdkErrorModule | undefined> {
22
+ if (cachedErrorModule !== undefined) return cachedErrorModule;
23
+ errorModuleLoad ??= (async () => {
24
+ const spec = "@dbos-inc/dbos-sdk";
25
+ try {
26
+ const mod = (await import(spec)) as { readonly Error?: DbosSdkErrorModule };
27
+ cachedErrorModule = mod.Error;
28
+ return cachedErrorModule;
29
+ } catch {
30
+ return undefined;
31
+ }
32
+ })();
33
+ return await errorModuleLoad;
34
+ }
35
+
36
+ function conflictingRegistrationCode(errors: DbosSdkErrorModule | undefined): number | undefined {
37
+ const ctor = errors?.DBOSConflictingRegistrationError;
38
+ if (ctor === undefined) return undefined;
39
+ try {
40
+ const code = Reflect.get(new ctor(""), "dbosErrorCode");
41
+ return typeof code === "number" ? code : undefined;
42
+ } catch {
43
+ return undefined;
44
+ }
45
+ }
46
+
47
+ function isDuplicateRegistration(value: object, errors: DbosSdkErrorModule | undefined): boolean {
48
+ const expected = conflictingRegistrationCode(errors);
49
+ const code = readOwn(value, "dbosErrorCode");
50
+ if (typeof code === "number" && typeof expected === "number" && code === expected) return true;
51
+ if (errors?.getDBOSErrorCode !== undefined && value instanceof Error) {
52
+ try {
53
+ if (errors.getDBOSErrorCode(value) === expected) return true;
54
+ } catch {
55
+ /* keep walking */
56
+ }
57
+ }
58
+ const name = readOwn(value, "name");
59
+ const className = errors?.DBOSConflictingRegistrationError?.name;
60
+ return typeof name === "string" && typeof className === "string" && name === className;
61
+ }
62
+
63
+ function classifyWith(error: unknown, errors: DbosSdkErrorModule | undefined): DbosDurabilityFailureKind {
64
+ try {
65
+ const seen = new Set<object>();
66
+ let current: unknown = error;
67
+ while (current !== undefined && current !== null) {
68
+ if (typeof current !== "object") return "other";
69
+ if (seen.has(current)) return "other";
70
+ seen.add(current);
71
+ if (isDuplicateRegistration(current, errors)) return "duplicate_registration";
72
+ current = readOwn(current, "cause");
73
+ }
74
+ } catch {
75
+ return "other";
76
+ }
77
+ return "other";
78
+ }
79
+
80
+ /**
81
+ * Async classification used at the durability boundary so the first failure
82
+ * can load the SDK error classes before deciding. Subsequent sync callers
83
+ * reuse the cached module.
84
+ */
85
+ export async function classifyDbosDurabilityFailure(error: unknown): Promise<DbosDurabilityFailureKind> {
86
+ const errors = await loadDbosErrorModule();
87
+ return classifyWith(error, errors);
88
+ }
89
+
90
+ /**
91
+ * Read an error's display detail without letting a throwing `message` getter
92
+ * escape the durability wrapper. `String(error)` is the last-resort fallback
93
+ * and is itself guarded: some `toString` implementations also throw.
94
+ */
95
+ export function readDbosFailureDetail(error: unknown): string {
96
+ if (typeof error === "object" && error !== null) {
97
+ const message = readOwn(error, "message");
98
+ if (typeof message === "string" && message !== "") return message;
99
+ }
100
+ try {
101
+ return String(error);
102
+ } catch {
103
+ return "unknown error";
104
+ }
105
+ }
106
+
107
+ function readOwn(value: object, key: string): unknown {
108
+ try {
109
+ return Reflect.get(value, key);
110
+ } catch {
111
+ return undefined;
112
+ }
113
+ }
@@ -8,6 +8,7 @@ import {
8
8
  getReadyDbosBackend,
9
9
  getReadyDbosBackendSync,
10
10
  } from "./dbos-lifecycle.js";
11
+ import { classifyDbosDurabilityFailure, readDbosFailureDetail } from "./dbos-registration-diagnostics.js";
11
12
 
12
13
  let injectedBackend: DurableWorkflowBackend | undefined;
13
14
  let initializedBackend: DurableWorkflowBackend | undefined;
@@ -65,12 +66,9 @@ export async function initializeDurableBackend(): Promise<DurableWorkflowBackend
65
66
  initializing = undefined;
66
67
  }
67
68
  initializing ??= getReadyDbosBackend()
68
- .catch((error: unknown) => {
69
- // Post-shutdown initialization is a process-exit race, not a
70
- // provisioning failure: fail loudly instead of silently degrading to a
71
- // non-durable backend.
69
+ .catch(async (error: unknown) => {
72
70
  if (error instanceof DbosShutdownError) throw error;
73
- return degradeToNonDurableBackend(error);
71
+ return await degradeToNonDurableBackend(error);
74
72
  })
75
73
  .then((backend) => {
76
74
  initializedBackend = backend;
@@ -79,12 +77,17 @@ export async function initializeDurableBackend(): Promise<DurableWorkflowBackend
79
77
  return await initializing;
80
78
  }
81
79
 
82
- function degradeToNonDurableBackend(error: unknown): DurableWorkflowBackend {
83
- const detail = error instanceof Error ? error.message : String(error);
80
+ async function degradeToNonDurableBackend(error: unknown): Promise<DurableWorkflowBackend> {
81
+ const detail = readDbosFailureDetail(error);
82
+ const kind = await classifyDbosDurabilityFailure(error);
83
+ const restore =
84
+ kind === "duplicate_registration"
85
+ ? `Restore durability by resolving the duplicate DBOS operation registration: ${detail}`
86
+ : `Restore durability by fixing Postgres provisioning: ${detail}`;
84
87
  console.error(
85
88
  "atomic-workflows: durable backend unavailable — continuing NON-DURABLY with an in-memory backend. " +
86
89
  "Workflow runs will execute, but their state will not survive this process and `/workflow resume` " +
87
- `after exit will not work. Restore durability by fixing Postgres provisioning: ${detail}`,
90
+ `after exit will not work. ${restore}`,
88
91
  );
89
92
  return new InMemoryDurableBackend();
90
93
  }