@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
@@ -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"> & Partial<Pick<ToolNodeSnapshot, "endedAt" | "resultSummary" | "error">>,
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: Date.now(),
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
- return runCallback({ kind: "workflow.ctx_tool", name, runId: input.workflowId }, () =>
306
- fn({ signal: toolSignal }),
307
- ).catch((error: unknown) => {
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 cancellation = invocationCancellation(input, toolSignal);
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: Date.now(),
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, { status: "failed", endedAt: failure.failedAt, error: failure.message });
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: Date.now(),
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, { status: "failed", endedAt: completedAt, error: outcome.error.message });
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
- input.onFailureObserved?.(error, node.id);
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
- error,
587
+ { name, args, ...(source !== undefined ? { source } : {}), argsHash, ordinal, startedAt },
588
+ reportedFailure,
437
589
  attempts,
438
590
  );
439
- input.onNodeEnd?.(node.id, { status: "failed", endedAt: failure.failedAt, error: failure.message });
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 error;
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
- { name: live.name, argsHash: live.argsHash, ordinal: live.ordinal, startedAt },
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
- export const toolControlRegistry: ToolControlRegistry = createToolControlRegistry();
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
+ }