@jr2/orchestrator 0.4.1 → 0.6.0

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 (361) hide show
  1. package/README.md +20 -2
  2. package/console/components/app.ts +2 -0
  3. package/console/components/fleet.ts +14 -1
  4. package/console/components/machine-pane.ts +41 -2
  5. package/console/main.ts +13 -1
  6. package/console/store.ts +102 -6
  7. package/console/style.css +21 -0
  8. package/docs/agents-block.md +5 -0
  9. package/docs/concepts/agents-and-turns.md +478 -0
  10. package/docs/concepts/architecture.md +243 -0
  11. package/docs/concepts/charts.md +146 -0
  12. package/docs/concepts/composition.md +357 -0
  13. package/docs/concepts/converge.md +257 -0
  14. package/docs/concepts/durable-runs.md +189 -0
  15. package/docs/concepts/effects.md +658 -0
  16. package/docs/concepts/gates.md +208 -0
  17. package/docs/concepts/machines-and-workflows.md +298 -0
  18. package/docs/concepts/pools-and-sources.md +230 -0
  19. package/docs/concepts/secrets-and-trust.md +306 -0
  20. package/docs/concepts/the-menu.md +381 -0
  21. package/docs/concepts/workspaces.md +756 -0
  22. package/docs/get-started/a-model-decides.md +563 -0
  23. package/docs/get-started/an-agent-in-a-sandbox.md +383 -0
  24. package/docs/get-started/connect-a-model.md +248 -0
  25. package/docs/get-started/create-an-instance.md +194 -0
  26. package/docs/get-started/have-your-assistant-write-a-machine.md +993 -0
  27. package/docs/get-started/install.md +130 -0
  28. package/docs/guides/add-tools-to-the-sandbox.md +308 -0
  29. package/docs/guides/answer-a-gate.md +304 -0
  30. package/docs/guides/bind-open-parts.md +224 -0
  31. package/docs/guides/cancel-a-run.md +146 -0
  32. package/docs/guides/clean-up.md +206 -0
  33. package/docs/guides/cut-a-worktree.md +560 -0
  34. package/docs/guides/fix-a-failed-converge.md +361 -0
  35. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  36. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  37. package/docs/guides/let-an-agent-write-a-chart.md +230 -0
  38. package/docs/guides/look-inside-a-sandbox.md +177 -0
  39. package/docs/guides/mirror-the-kit-images.md +176 -0
  40. package/docs/guides/move-from-kind-to-a-shared-cluster.md +318 -0
  41. package/docs/guides/open-the-console.md +91 -0
  42. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  43. package/docs/guides/push-and-sign-a-branch.md +532 -0
  44. package/docs/guides/run-a-chart-by-name.md +270 -0
  45. package/docs/guides/run-a-command-or-call-a-url.md +587 -0
  46. package/docs/guides/run-one-worker-per-item.md +322 -0
  47. package/docs/guides/set-an-agents-access-and-dials.md +420 -0
  48. package/docs/guides/size-a-workspace.md +217 -0
  49. package/docs/guides/start-a-run-from-a-run.md +237 -0
  50. package/docs/guides/start-a-run.md +207 -0
  51. package/docs/guides/upgrade-the-kit-version.md +240 -0
  52. package/docs/guides/use-a-hosted-provider.md +214 -0
  53. package/docs/guides/use-a-local-model.md +313 -0
  54. package/docs/guides/watch-a-run.md +349 -0
  55. package/docs/guides/write-a-workflow.md +318 -0
  56. package/docs/index.md +44 -0
  57. package/docs/llms.txt +237 -0
  58. package/docs/reference/authoring-surface/agent.md +151 -0
  59. package/docs/reference/authoring-surface/answer.md +156 -0
  60. package/docs/reference/authoring-surface/arg.md +82 -0
  61. package/docs/reference/authoring-surface/basic.md +62 -0
  62. package/docs/reference/authoring-surface/bearer.md +53 -0
  63. package/docs/reference/authoring-surface/branchname.md +15 -0
  64. package/docs/reference/authoring-surface/chartschema.md +23 -0
  65. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  66. package/docs/reference/authoring-surface/command.md +206 -0
  67. package/docs/reference/authoring-surface/customize.md +64 -0
  68. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  69. package/docs/reference/authoring-surface/defineevent.md +114 -0
  70. package/docs/reference/authoring-surface/dispatch.md +126 -0
  71. package/docs/reference/authoring-surface/fail.md +96 -0
  72. package/docs/reference/authoring-surface/file.md +142 -0
  73. package/docs/reference/authoring-surface/frompick.md +277 -0
  74. package/docs/reference/authoring-surface/http.md +259 -0
  75. package/docs/reference/authoring-surface/isfailure.md +58 -0
  76. package/docs/reference/authoring-surface/isready.md +14 -0
  77. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  78. package/docs/reference/authoring-surface/open.md +105 -0
  79. package/docs/reference/authoring-surface/openbody.md +86 -0
  80. package/docs/reference/authoring-surface/paramsof.md +143 -0
  81. package/docs/reference/authoring-surface/pool.md +186 -0
  82. package/docs/reference/authoring-surface/push.md +130 -0
  83. package/docs/reference/authoring-surface/readyof.md +21 -0
  84. package/docs/reference/authoring-surface/secret.md +139 -0
  85. package/docs/reference/authoring-surface/sentby.md +83 -0
  86. package/docs/reference/authoring-surface/source.md +51 -0
  87. package/docs/reference/authoring-surface/text.md +62 -0
  88. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  89. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  90. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  91. package/docs/reference/authoring-surface/type-agentslots.md +15 -0
  92. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  93. package/docs/reference/authoring-surface/type-anyframepath.md +14 -0
  94. package/docs/reference/authoring-surface/type-anyworktreepath.md +15 -0
  95. package/docs/reference/authoring-surface/type-arg.md +19 -0
  96. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  97. package/docs/reference/authoring-surface/type-bindactors.md +14 -0
  98. package/docs/reference/authoring-surface/type-binding.md +61 -0
  99. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  100. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  101. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  102. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  103. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  104. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  105. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  106. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  107. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  108. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  109. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  110. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  111. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  112. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  113. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  114. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  115. package/docs/reference/authoring-surface/type-childat.md +12 -0
  116. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  117. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  118. package/docs/reference/authoring-surface/type-commandinput.md +20 -0
  119. package/docs/reference/authoring-surface/type-commandoptions.md +56 -0
  120. package/docs/reference/authoring-surface/type-commandoutput.md +122 -0
  121. package/docs/reference/authoring-surface/type-customize.md +111 -0
  122. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  123. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  124. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  125. package/docs/reference/authoring-surface/type-dispatchoutput.md +72 -0
  126. package/docs/reference/authoring-surface/type-doorlessinput.md +19 -0
  127. package/docs/reference/authoring-surface/type-duration.md +15 -0
  128. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  129. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  130. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  131. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  132. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  133. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  134. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  135. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  136. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  137. package/docs/reference/authoring-surface/type-failure.md +19 -0
  138. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  139. package/docs/reference/authoring-surface/type-filebody.md +37 -0
  140. package/docs/reference/authoring-surface/type-framepath.md +14 -0
  141. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  142. package/docs/reference/authoring-surface/type-hostinjectedinput.md +56 -0
  143. package/docs/reference/authoring-surface/type-httpdefinition.md +104 -0
  144. package/docs/reference/authoring-surface/type-httpfileinput.md +20 -0
  145. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  146. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  147. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  148. package/docs/reference/authoring-surface/type-httpoutput.md +95 -0
  149. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  150. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  151. package/docs/reference/authoring-surface/type-lateroutcome.md +21 -0
  152. package/docs/reference/authoring-surface/type-lends.md +38 -0
  153. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  154. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  155. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  156. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  157. package/docs/reference/authoring-surface/type-namestart.md +77 -0
  158. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +27 -0
  159. package/docs/reference/authoring-surface/type-notworktreekeys.md +12 -0
  160. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  161. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  162. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  163. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  164. package/docs/reference/authoring-surface/type-opencommandinput.md +22 -0
  165. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  166. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  167. package/docs/reference/authoring-surface/type-openof.md +12 -0
  168. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  169. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  170. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +26 -0
  171. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +27 -0
  172. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  173. package/docs/reference/authoring-surface/type-poolnextinput.md +22 -0
  174. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  175. package/docs/reference/authoring-surface/type-pushinput.md +34 -0
  176. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  177. package/docs/reference/authoring-surface/type-pushoutput.md +149 -0
  178. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  179. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  180. package/docs/reference/authoring-surface/type-reached.md +12 -0
  181. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  182. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  183. package/docs/reference/authoring-surface/type-sandboxoptions.md +84 -0
  184. package/docs/reference/authoring-surface/type-secret.md +25 -0
  185. package/docs/reference/authoring-surface/type-sender.md +19 -0
  186. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  187. package/docs/reference/authoring-surface/type-size.md +85 -0
  188. package/docs/reference/authoring-surface/type-slothandles.md +24 -0
  189. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  190. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  191. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  192. package/docs/reference/authoring-surface/type-text.md +19 -0
  193. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  194. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  195. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  196. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  197. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  198. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  199. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  200. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  201. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  202. package/docs/reference/authoring-surface/type-workspaced.md +115 -0
  203. package/docs/reference/authoring-surface/type-workspacehandles.md +22 -0
  204. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  205. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  206. package/docs/reference/authoring-surface/type-workspaceoptions.md +27 -0
  207. package/docs/reference/authoring-surface/type-worktreefound.md +16 -0
  208. package/docs/reference/authoring-surface/type-worktreeinput.md +56 -0
  209. package/docs/reference/authoring-surface/type-worktreekey.md +14 -0
  210. package/docs/reference/authoring-surface/type-worktreeoptions.md +29 -0
  211. package/docs/reference/authoring-surface/type-worktreeoutput.md +45 -0
  212. package/docs/reference/authoring-surface/type-worktreepath.md +16 -0
  213. package/docs/reference/authoring-surface/type-worktreeready.md +37 -0
  214. package/docs/reference/authoring-surface/type-worktreerefused.md +21 -0
  215. package/docs/reference/authoring-surface/workspace.md +287 -0
  216. package/docs/reference/authoring-surface/worktree.md +71 -0
  217. package/docs/reference/authoring-surface.md +217 -0
  218. package/docs/reference/cli.md +433 -0
  219. package/docs/reference/config.md +765 -0
  220. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +114 -0
  221. package/docs/reference/decisions/0002-duplex-streaming-actor.md +117 -0
  222. package/docs/reference/decisions/0004-worktree-provisioning-model.md +130 -0
  223. package/docs/reference/decisions/0005-sandbox-pod-composition.md +240 -0
  224. package/docs/reference/decisions/0006-agent-control-surface.md +50 -0
  225. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  226. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  227. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  228. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  229. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  230. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  231. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +175 -0
  232. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  233. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +271 -0
  234. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +126 -0
  235. package/docs/reference/decisions/0017-pool-over-a-source-port.md +71 -0
  236. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  237. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +287 -0
  238. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  239. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +101 -0
  240. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  241. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +175 -0
  242. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +436 -0
  243. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  244. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  245. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +245 -0
  246. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +90 -0
  247. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  248. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  249. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +193 -0
  250. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  251. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +126 -0
  252. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  253. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  254. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  255. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  256. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  257. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  258. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  259. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  260. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  261. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  262. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  263. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  264. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  265. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  266. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  267. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  268. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +238 -0
  269. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +86 -0
  270. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +123 -0
  271. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  272. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  273. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  274. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  275. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +108 -0
  276. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +427 -0
  277. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  278. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  279. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +239 -0
  280. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +82 -0
  281. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  282. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  283. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +552 -0
  284. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +458 -0
  285. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +475 -0
  286. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  287. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +334 -0
  288. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  289. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  290. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  291. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  292. package/docs/reference/decisions/0075-a-machine-cuts-a-worktree-and-the-workspace-only-clones.md +295 -0
  293. package/docs/reference/decisions/0076-an-agents-control-credential-lives-only-where-no-workspace-code-runs.md +320 -0
  294. package/docs/reference/decisions/0077-jr2-requires-landlock-on-every-sandbox-node.md +79 -0
  295. package/docs/reference/decisions.md +86 -0
  296. package/docs/reference/glossary.md +687 -0
  297. package/docs/reference/http-api.md +1386 -0
  298. package/docs/reference/machines.md +189 -0
  299. package/docs/reference/mechanism-events.md +72 -0
  300. package/docs/why.md +207 -0
  301. package/package.json +5 -3
  302. package/src/actor.ts +694 -106
  303. package/src/agent.ts +114 -38
  304. package/src/ambient.ts +3 -4
  305. package/src/assembly-checks.ts +189 -7
  306. package/src/cause.ts +234 -0
  307. package/src/chart.ts +345 -46
  308. package/src/charts.ts +43 -8
  309. package/src/config.ts +440 -178
  310. package/src/custodian.lua +17 -5
  311. package/src/custodian.ts +325 -99
  312. package/src/customize.ts +199 -49
  313. package/src/dispatch-effect.ts +945 -0
  314. package/src/door-compat.ts +217 -0
  315. package/src/durability.ts +11 -4
  316. package/src/effect-checks.ts +50 -3
  317. package/src/effect.ts +641 -128
  318. package/src/effector-wire.ts +165 -13
  319. package/src/fail.ts +222 -0
  320. package/src/harness-client.ts +587 -50
  321. package/src/harness-env.ts +33 -0
  322. package/src/held-secrets.ts +125 -16
  323. package/src/holds.ts +3 -0
  324. package/src/http-effect.ts +556 -58
  325. package/src/http.ts +480 -30
  326. package/src/index.ts +74 -82
  327. package/src/instance.ts +68 -8
  328. package/src/internal.ts +85 -0
  329. package/src/kube-client.ts +6 -3
  330. package/src/machine-doc.ts +24 -7
  331. package/src/mechanism-routes.ts +168 -0
  332. package/src/model-keys.generated.ts +53 -0
  333. package/src/model-keys.ts +42 -58
  334. package/src/names.ts +19 -6
  335. package/src/notices.ts +483 -41
  336. package/src/open-body.ts +242 -40
  337. package/src/open-effect.ts +81 -8
  338. package/src/open.ts +90 -6
  339. package/src/parts.ts +213 -30
  340. package/src/party.ts +101 -2
  341. package/src/pick.ts +497 -11
  342. package/src/pool.ts +282 -50
  343. package/src/registration.ts +133 -12
  344. package/src/repo-identity.ts +7 -3
  345. package/src/repos.ts +22 -3
  346. package/src/run-host.ts +665 -45
  347. package/src/run-output.ts +38 -0
  348. package/src/sandbox-effect.ts +457 -71
  349. package/src/sandbox-kube.ts +66 -17
  350. package/src/secret-placement.ts +59 -17
  351. package/src/server.ts +3 -0
  352. package/src/setup.ts +325 -62
  353. package/src/size.ts +121 -9
  354. package/src/snapshot-store.ts +54 -10
  355. package/src/stub-harness.ts +44 -16
  356. package/src/timers.ts +14 -1
  357. package/src/tokens.ts +107 -32
  358. package/src/vocabulary.ts +88 -14
  359. package/src/wire.ts +100 -26
  360. package/src/workspace.ts +771 -238
  361. package/src/worktree.ts +249 -0
package/src/setup.ts CHANGED
@@ -29,6 +29,7 @@ import { randomUUID } from "node:crypto";
29
29
  import {
30
30
  setup,
31
31
  type ActionFunction,
32
+ type ActorLogic,
32
33
  type AnyActorRef,
33
34
  type AnyStateMachine,
34
35
  type DelayConfig,
@@ -39,6 +40,7 @@ import {
39
40
  type NonReducibleUnknown,
40
41
  type ParameterizedObject,
41
42
  type SetupReturn,
43
+ type Snapshot,
42
44
  type UnknownActorLogic,
43
45
  } from "xstate";
44
46
  import type { z } from "zod";
@@ -46,38 +48,65 @@ import { eventMap, type EventDef, type EventFrom, type Sender } from "@jr2/agent
46
48
  import type { AgentRunInput, AgentTurnInput, FaultTelemetry } from "./actor.ts";
47
49
  import { isAgent } from "./agent.ts";
48
50
  import { isEffect } from "./effect.ts";
49
- import { effectChecks } from "./effect-checks.ts";
51
+ import type { AnyFramePath, FramePath, WorktreePath, WorktreeReady } from "./worktree.ts";
52
+ import { effectChecks, refuseUnroutedOutcome } from "./effect-checks.ts";
50
53
  import { gate } from "./gate.ts";
51
54
  import { attachLent, isOpenBody, openBodyDeclarationOf, type LentParts } from "./open-body.ts";
52
55
  import { refuseInlineParts } from "./parts.ts";
53
- import { partyWarnings, refuseUnknownSentBy, SENT_BY, sentByGuard } from "./party.ts";
56
+ import { partyWarnings, refuseSlotActiveTwice, refuseUnknownSentBy, SENT_BY, sentByGuard } from "./party.ts";
57
+ import { refuseLostOutput } from "./run-output.ts";
58
+ import { refuseUnroutedAgentFault } from "./mechanism-routes.ts";
54
59
  import { boundEpoch, boundRunId, continuedIid } from "./registration.ts";
55
60
  import { attachInputSchema, attachLoadWarnings, attachSeats, attachVocabulary } from "./vocabulary.ts";
56
61
 
57
62
  /**
58
- * The events jr2's own mechanism delivers into any workflow machine, injected into every jr2Setup
59
- * union. Dotted names by construction (`NAME_RE` forbids dots in workflow event names), so they
60
- * can never collide with a def.
63
+ * The marker that `compileChart` puts on the config of a Chart's Machine (ADR-0070). In a Chart the
64
+ * `agent.fault` route is optional: the Open body sends an `agent.fault` that no transition takes to
65
+ * the Machine that invoked it, so `createMachine` does not refuse a Chart state with no route. Not on the Authoring
66
+ * surface (index.ts). The load walk (`partsOf`) refuses an author's Machine with no route, with or
67
+ * without the marker (ADR-0074).
61
68
  */
69
+ export const COMPILED_CHART: unique symbol = Symbol("jr2.compiledChart");
70
+
71
+ // Injected into every jr2Setup union. Dotted names by construction (`NAME_RE` forbids dots in
72
+ // workflow event names), so they can never collide with a def.
73
+ /** The events that jr2 itself sends into each Machine that `jr2Setup` makes. A Mechanism event's
74
+ * name has a dot, and a workflow event's name cannot, so the two never collide. */
62
75
  export type MechanismEvent = FaultTelemetry | WorkspaceLost;
63
76
 
77
+ // A Workspace's Continuity broke (ADR-0021): its Sandbox is gone, or Lost. `reason` and `message`
78
+ // are for a body whose policy tells the causes apart, or only reports them; no policy needs them.
64
79
  /**
65
- * A Workspace's Continuity broke (ADR-0021): its Sandbox is gone, or Lost. `reason` and `message`
66
- * say why — the pod's own reason (`Evicted`, `NodeShutdown`, ...) or the operator's (`PodDeleted`,
67
- * `NodeLost`), or `Deleted` for a Sandbox that is gone — for a body whose policy tells them apart,
68
- * or only reports them. Optional: the body's policy never needs them to act.
80
+ * jr2 sends `workspace.lost` to the body of a `workspace()` when its Sandbox is gone: its pod was
81
+ * evicted or deleted, or its node went. jr2 does not make the Sandbox again, and the commits that
82
+ * were not pushed go with it. The body decides what to do next: route the event with
83
+ * `on: { "workspace.lost": … }`, usually once, on the body's root. `workspace()` refuses a body
84
+ * with a state that is not final and has no route for it on itself or on a state above. When the
85
+ * event comes and no transition takes it (the route's guard is false), the run ends `error`, with
86
+ * the event, the state and the reason in its fault.
69
87
  */
70
- export type WorkspaceLost = { type: "workspace.lost"; reason?: string; message?: string };
88
+ export type WorkspaceLost = {
89
+ type: "workspace.lost";
90
+ /** Why the Sandbox is gone, for a person or a log: the pod's reason (`Evicted`, `NodeShutdown`),
91
+ * the operator's (`PodDeleted`, `NodeLost`), or `Deleted`. A body can act without it. */
92
+ reason?: string;
93
+ /** More text about the loss, when jr2 has it. */
94
+ message?: string;
95
+ };
71
96
 
72
- /** The full event union a jr2Setup machine sees: the defs' derived types plus the mechanism's. A
73
- * workflow event a party delivered carries its `sender` (ADR-0015); the Machine's own events
74
- * (`raise`, `sendTo` itself) carry none. */
97
+ // The defs' derived types plus the mechanism's (ADR-0015).
98
+ /** The type of `event` in a Machine that `jr2Setup` makes: each workflow event in its `events`,
99
+ * and each Mechanism event. A workflow event that an Agent or a Gate sent has `event.sender`. An
100
+ * event that the Machine sent to itself (`raise`, `sendTo`) has no `sender`. */
75
101
  export type WorkflowEvent<TDefs extends readonly EventDef[]> =
76
102
  | (EventFrom<TDefs[number]> & { readonly sender?: Sender })
77
103
  | MechanismEvent;
78
104
 
79
105
  /** The guard jr2Setup registers for every Machine — `sentBy(id)` (ADR-0015) — in the typed guard
80
- * map, so `sentBy("coder")` and `and([sentBy("coder"), "ready"])` type-check with no cast. */
106
+ * map, so `sentBy("coder")` and `and([sentBy("coder"), "ready"])` type-check with no cast.
107
+ *
108
+ * @internal
109
+ */
81
110
  type SentByGuards = { [SENT_BY]: { id: string } };
82
111
 
83
112
  /** The jr2 actor every workflow can invoke by name without listing it (ADR-0015). `gate` is the
@@ -86,25 +115,222 @@ type SentByGuards = { [SENT_BY]: { id: string } };
86
115
  const jr2Actors = { gate };
87
116
  type JR2Actors = typeof jr2Actors;
88
117
 
89
- /** Consumer actors merge OVER the pre-registered set: same name → the consumer's logic wins. */
118
+ /**
119
+ * Consumer actors merge OVER the pre-registered set: same name → the consumer's logic wins.
120
+ *
121
+ * @internal
122
+ */
90
123
  type MergedActors<TActors extends Record<string, UnknownActorLogic>> = Omit<JR2Actors, keyof TActors> & TActors;
91
124
 
92
125
  // Local equivalents of xstate's non-exported setup() mapped helpers (setup.d.ts) — same shapes,
93
126
  // so the declared signature below composes with the public `ActionFunction`/`GuardPredicate`.
127
+ /** @internal */
94
128
  type ToParameterizedObject<T extends Record<string, ParameterizedObject["params"] | undefined>> = {
95
129
  [K in keyof T & string]: { type: K; params: T[K] };
96
130
  }[keyof T & string];
131
+ /** @internal */
97
132
  type ToProvidedActor<TActors extends Record<string, UnknownActorLogic>> = {
98
133
  [K in keyof TActors & string]: { src: K; logic: TActors[K]; id: string | undefined };
99
134
  }[keyof TActors & string];
100
135
 
136
+ // The types below carry the body's Repo Slots to every Worktree input.
137
+ /** @internal */
138
+ type NoHandles = { readonly noHandles: true };
139
+ /** `S`, the slots of the body, or {@link NoHandles} when its input and context hold no handles.
140
+ * @internal */
141
+ type RepoSlotsOf<TInput, TContext> = TInput extends { workspace: { repos: infer R } }
142
+ ? keyof R & string
143
+ : TContext extends { workspace: { repos: infer R } }
144
+ ? keyof R & string
145
+ : NoHandles;
146
+ /** The Worktrees of the slots `S` that this key takes: a `push({ slot })` keeps to its own slot.
147
+ * @internal */
148
+ type PathIn<W, S> = S extends string ? (`/work/${S}/x` extends NonNullable<W> ? WorktreePath<S> : never) : never;
149
+ /** One arm of an input. A key that names a Worktree or a Frame is REQUIRED under a body with Repo
150
+ * Slots, so that no mix of `cwd`, `worktree` and `path` lands in `/work`. Under a body with none,
151
+ * `worktree` goes: there is no Worktree. A Turn's arm that carries no kit path (the run's own form)
152
+ * and every other key stay.
153
+ * @internal */
154
+ type BindArm<I, S> = I extends object
155
+ ? "worktree" extends keyof I
156
+ ? [S] extends [never]
157
+ ? Omit<I, "worktree"> & { worktree?: never }
158
+ : Omit<I, "worktree"> & { worktree: PathIn<I["worktree"], S> }
159
+ : "cwd" extends keyof I
160
+ ? [NonNullable<I["cwd"]>] extends [AnyFramePath]
161
+ ? [S] extends [never]
162
+ ? I
163
+ : Omit<I, "cwd"> & { cwd: FramePath<S & string> }
164
+ : I
165
+ : "path" extends keyof I
166
+ ? [S] extends [never]
167
+ ? I
168
+ : Omit<I, "path"> & { path: PathIn<I["path"], S> }
169
+ : I
170
+ : I;
171
+ /** Does this input name a Worktree? @internal */
172
+ type NamesWorktree<I> = I extends object ? ("worktree" extends keyof I ? true : never) : never;
173
+ /** @internal */
174
+ type BindInput<I, S> = [NamesWorktree<I>] extends [never]
175
+ ? BindArm<I, S>
176
+ : [S] extends [never]
177
+ ? BindArm<I, S>
178
+ : Exclude<BindArm<I, S>, void | undefined>;
179
+ /** A cut's `ready` output with the body's slots. @internal */
180
+ type BindOutput<O, S> = O extends WorktreeReady ? WorktreeReady<S & string> : O;
181
+ /** @internal */
182
+ type BindSnapshot<Snap, S> = Snap extends { output: infer O }
183
+ ? [O] extends [BindOutput<O, S>]
184
+ ? Snap
185
+ : Omit<Snap, "output"> & { output: BindOutput<O, S> }
186
+ : Snap;
187
+ /** @internal */
188
+ type BindLogic<L extends UnknownActorLogic, S> = L extends AnyStateMachine
189
+ ? L
190
+ : ([S] extends [never] ? false : [S] extends [NoHandles] ? true : false) extends true
191
+ ? L
192
+ : L extends { readonly definition: { readonly workspace: "none" } }
193
+ ? L
194
+ : L extends ActorLogic<infer Snap, infer Ev, infer I, infer Sys, infer Em>
195
+ ? BindSnapshot<Snap, S> extends infer B extends Snapshot<unknown>
196
+ ? Omit<L, keyof ActorLogic<Snap, Ev, I, Sys, Em>> & ActorLogic<B, Ev, BindInput<I, S>, any, Em>
197
+ : never
198
+ : L;
199
+ /** @internal */
200
+ type BindActors<A extends Record<string, UnknownActorLogic>, TInput, TContext> = {
201
+ [K in keyof A]: BindLogic<A[K], RepoSlotsOf<TInput, TContext>>;
202
+ };
203
+
101
204
  /**
102
- * Author a workflow machine (ADR-0015). Like `setup()`, but `types.events` is gone: the event
103
- * union derives from `events` (defineEvent defs, taken as values) plus the mechanism events.
205
+ * Set up a Machine that takes workflow events: the jr2 form of xstate's `setup()`. Write a Machine
206
+ * with it when an Agent or a Gate sends events into the Machine, or when the Machine declares a
207
+ * door. Call `.createMachine(config)` on the result, as with `setup()`. The Machine you get is a
208
+ * plain xstate Machine.
209
+ *
210
+ * What it adds to `setup()`:
211
+ * - `events` replaces `types.events`. The event type of the Machine comes from the
212
+ * `defineEvent` events you list, plus the events jr2 itself sends (`agent.fault`,
213
+ * `workspace.lost`). An event that a party sent has `event.sender`. A Machine that takes no
214
+ * workflow event leaves out `events`.
215
+ * - The `gate` actor is ready to invoke by name: `invoke: { src: "gate" }`.
216
+ * - Each Agent slot (`actors: { coder: agent(…) }`) gets its Menu from the states that invoke it.
217
+ * - The `sentBy(id)` guard is ready to use.
218
+ * - `createMachine` also takes `input`: a zod object for the input that starts a run. jr2 checks
219
+ * each start against it. Without it, a run can start with any input. The `setup()` of xstate
220
+ * does not read this `input`, so a Machine with a door uses `jr2Setup`, also when it takes no
221
+ * workflow event. `jr2 up` and the publish door refuse a registered Machine that has a zod
222
+ * `input` if `jr2Setup` did not make the Machine: ``workflow "<name>": machine "<id>" has a zod `input` on
223
+ * createMachine, but jr2Setup did not make this Machine, so no door reads that input …``
224
+ *
225
+ * The output of a run is the root `output` of `createMachine`, beside `id` and `states`, as in
226
+ * xstate v5. xstate does not read the `output` of a final state as the output of the Machine. It
227
+ * gives that output to the root `output` as `event.output`. Write
228
+ * `output: ({ event }) => event.output as Output` at the root, or make the output from `context`
229
+ * there. `createMachine` refuses an `output` on a final state directly below the root when the root
230
+ * has no `output` (see the list below).
231
+ *
232
+ * `createMachine` refuses a Machine that it cannot run as written. Among the refusals:
233
+ * - an `on` key that no listed event has: ``machine "<id>" handles event "<key>", which no def in
234
+ * jr2Setup({ events }) declares (declared: <names>) — a typo, or a missing defineEvent``
235
+ * - a listed event that no state takes: ``machine "<id>" declares "<name>", which no state handles
236
+ * — a pick no state takes is on no Menu and no Gate: handle it, or drop it from
237
+ * jr2Setup({ events })``
238
+ * - an entry of `events` that `defineEvent` did not make, or one name listed twice:
239
+ * ``machine "<id>": `events` entry is not a defineEvent() def: <entry>``,
240
+ * ``machine "<id>": duplicate event "<name>" in `events` ``
241
+ * - an `agent()`, an Effect or a `workspace()` written on `invoke.src` instead of under `actors`:
242
+ * ``machine "<id>": state "<state>" invokes <part> inline — a Part is a key of actors, so it has
243
+ * a name that the ledger, the report and customize() share: actors: { <name>: <factory>(...) },
244
+ * then invoke: { src: "<name>" }``. `<part>` is `an Agent`, `an Effect` or `a Workspace`.
245
+ * `<factory>` is `agent`, the Effect's kind (such as `command`), or `workspace`.
246
+ * - an `output` on a final state directly below the root, when the root has no `output`:
247
+ * ``machine "<id>": final state "<state>" declares an output, and the root has no output — xstate
248
+ * v5 gives a run only its root output, so this output reaches nothing and the run ends with none:
249
+ * write it at the root, as output: ({ context }) => ..., or keep it on the final state and pass it
250
+ * on with output: ({ event }) => event.output at the root``. With more than one such final state,
251
+ * it names each one and puts the words in the plural: ``final states "<state>", "<state>"
252
+ * declare an output``, ``these outputs reach nothing``, ``write one at the root`` and ``keep
253
+ * them on the final states and pass them on``. An `output` on a
254
+ * final state inside a compound state is legal: the `onDone` of that compound state gets it as
255
+ * `event.output`.
256
+ * - a parallel state at or below a state that invokes an Agent: ``machine "<id>": state "<state>"
257
+ * is parallel, at or below Agent "<slot>"'s state "<state>" — a parallel region below an Agent's
258
+ * state is reserved for picks the Agent does not wait for, which jr2 does not build; background
259
+ * work goes above the Agent's state``
260
+ * - a state below an Agent's state that invokes something and that nothing enters: ``machine
261
+ * "<id>": state "<state>" below Agent "<slot>"'s state "<state>" is entered by nothing, so what
262
+ * it invokes (<src>) never runs — target it from a pick or a route, or delete it``
263
+ * - a state that invokes an Agent when that state and each state above it have no `agent.fault`
264
+ * route: ``machine "<id>": state "<state>" invokes an Agent, and no route for "agent.fault" is
265
+ * on it or on a state above — jr2 sends agent.fault when the Agent's Turn cannot go on, and with
266
+ * no route the run faults: route it on that state or on a state above it, as on: {
267
+ * "agent.fault": "<the state that handles it>" } (ADR-0074)``. A state that invokes an Open body
268
+ * that lends an Agent or allows a model gets the same line, with `invokes an Open body that can
269
+ * run an Agent`: the body sends it a Chart's unrouted `agent.fault`. When both kinds have no route,
270
+ * one line names both, joined by `, and`. One route on the root is a route for each state. A
271
+ * Chart's Machine does not get this refusal: in a Chart the route is optional (ADR-0070).
272
+ *
273
+ * It also refuses a `sentBy` that names no party (see `sentBy`). It refuses a pick param that
274
+ * nothing reads, where the pick enters a state that invokes an Effect (see `fromPick`). Shapes that
275
+ * are legal but probably not what you mean, such as a mode that nothing enters, are warnings that
276
+ * `jr2 up` prints.
277
+ *
278
+ * @param def - What `setup()` takes, with `events` in place of `types.events`. A Machine that
279
+ * needs none of it calls `jr2Setup()`.
280
+ * @returns What `setup()` returns. Call `.createMachine(config)` on it.
281
+ *
282
+ * @example
283
+ * ```ts
284
+ * import { z } from "zod";
285
+ * import { agent, defineEvent, fail, jr2Setup } from "@jr2/orchestrator";
286
+ *
287
+ * const proposed = defineEvent({
288
+ * name: "proposed",
289
+ * description: "Call this with your plan.",
290
+ * input: z.object({ plan: z.string() }),
291
+ * });
292
+ * const approve = defineEvent({ name: "approve", input: z.object({}) });
293
+ * const reject = defineEvent({ name: "reject", input: z.object({ reason: z.string() }) });
294
+ *
295
+ * export const machine = jr2Setup({
296
+ * types: {} as { input: { goal: string }; context: { goal: string } },
297
+ * events: [proposed, approve, reject],
298
+ * actors: {
299
+ * planner: agent({
300
+ * model: "anthropic/claude-haiku-5-5",
301
+ * instructions: "You plan small releases.",
302
+ * workspace: "none",
303
+ * }),
304
+ * fail: fail(),
305
+ * },
306
+ * }).createMachine({
307
+ * id: "plan",
308
+ * input: z.object({ goal: z.string() }),
309
+ * context: ({ input }) => ({ goal: input.goal }),
310
+ * on: { "agent.fault": ".failed" },
311
+ * initial: "planning",
312
+ * states: {
313
+ * planning: {
314
+ * invoke: { src: "planner", input: ({ context }) => ({ prompt: `Plan this: ${context.goal}` }) },
315
+ * on: { proposed: "review" },
316
+ * },
317
+ * review: {
318
+ * invoke: { src: "gate" },
319
+ * on: { approve: "approved", reject: "planning" },
320
+ * },
321
+ * approved: { type: "final" },
322
+ * failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
323
+ * },
324
+ * });
325
+ * ```
326
+ *
327
+ * @see docs/guides/write-a-workflow.md
328
+ * @see docs/concepts/machines-and-workflows.md
329
+ * @see docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md
104
330
  */
105
331
  export function jr2Setup<
106
332
  TContext extends MachineContext = MachineContext,
107
- const TDefs extends readonly EventDef[] = readonly EventDef[],
333
+ const TDefs extends readonly EventDef[] = readonly [],
108
334
  TActors extends Record<string, UnknownActorLogic> = {},
109
335
  TActions extends Record<string, ParameterizedObject["params"] | undefined> = {},
110
336
  TGuards extends Record<string, ParameterizedObject["params"] | undefined> = {},
@@ -114,47 +340,59 @@ export function jr2Setup<
114
340
  TOutput extends NonReducibleUnknown = NonReducibleUnknown,
115
341
  TEmitted extends EventObject = EventObject,
116
342
  TMeta extends MetaObject = MetaObject,
117
- >(def: {
118
- /** context/input/output/tags/emitted/meta — never `events`; the union is derived. */
119
- types?: {
120
- context?: TContext;
121
- input?: TInput;
122
- output?: TOutput;
123
- tags?: TTag;
124
- emitted?: TEmitted;
125
- meta?: TMeta;
126
- };
127
- /** This Machine's vocabulary, as values — the single source for types, validation, delivery. */
128
- events: TDefs;
129
- actors?: TActors;
130
- actions?: {
131
- [K in keyof TActions]: ActionFunction<
132
- TContext,
133
- WorkflowEvent<TDefs>,
134
- WorkflowEvent<TDefs>,
135
- TActions[K],
136
- ToProvidedActor<MergedActors<TActors>>,
137
- ToParameterizedObject<TActions>,
138
- ToParameterizedObject<TGuards>,
139
- TDelay,
140
- TEmitted
141
- >;
142
- };
143
- guards?: {
144
- [K in keyof TGuards]: GuardPredicate<TContext, WorkflowEvent<TDefs>, TGuards[K], ToParameterizedObject<TGuards>>;
145
- };
146
- delays?: {
147
- [K in TDelay]: DelayConfig<
148
- TContext,
149
- WorkflowEvent<TDefs>,
150
- ToParameterizedObject<TActions>["params"],
151
- WorkflowEvent<TDefs>
152
- >;
153
- };
154
- }): SetupReturn<
343
+ >(
344
+ def: {
345
+ /** The types of the Machine, as in `setup()`: `context`, `input`, `output`, `tags`, `emitted`
346
+ * and `meta`. Not `events`: the event type comes from `events`. */
347
+ types?: {
348
+ context?: TContext;
349
+ input?: TInput;
350
+ output?: TOutput;
351
+ tags?: TTag;
352
+ emitted?: TEmitted;
353
+ meta?: TMeta;
354
+ };
355
+ // The single source for types, validation and delivery.
356
+ /** The workflow events this Machine takes: each one made by `defineEvent`. Leave it out when the
357
+ * Machine takes none. Each listed event must be the name of an `on` key. Each `on` key must be
358
+ * listed, if it is not a jr2 or xstate event (an event with a `.` in its name). */
359
+ events?: TDefs;
360
+ /** The actors the states invoke by name, as in `setup()`: Agent slots (`agent(…)`), Effects
361
+ * (`command(…)`, `http(…)`, `push(…)`), child Machines, `workspace(…)` and plain xstate logic.
362
+ * The key is the slot's name. An actor named `gate` replaces jr2's Gate. */
363
+ actors?: TActors;
364
+ /** Named actions, as in `setup()`. Their `event` has the type of this Machine's events. */
365
+ actions?: {
366
+ [K in keyof TActions]: ActionFunction<
367
+ TContext,
368
+ WorkflowEvent<TDefs>,
369
+ WorkflowEvent<TDefs>,
370
+ TActions[K],
371
+ ToProvidedActor<MergedActors<TActors>>,
372
+ ToParameterizedObject<TActions>,
373
+ ToParameterizedObject<TGuards>,
374
+ TDelay,
375
+ TEmitted
376
+ >;
377
+ };
378
+ /** Named guards, as in `setup()`. `sentBy` is there already; do not name a guard `jr2.sentBy`. */
379
+ guards?: {
380
+ [K in keyof TGuards]: GuardPredicate<TContext, WorkflowEvent<TDefs>, TGuards[K], ToParameterizedObject<TGuards>>;
381
+ };
382
+ /** Named delays, as in `setup()`. */
383
+ delays?: {
384
+ [K in TDelay]: DelayConfig<
385
+ TContext,
386
+ WorkflowEvent<TDefs>,
387
+ ToParameterizedObject<TActions>["params"],
388
+ WorkflowEvent<TDefs>
389
+ >;
390
+ };
391
+ } = {},
392
+ ): SetupReturn<
155
393
  TContext,
156
394
  WorkflowEvent<TDefs>,
157
- MergedActors<TActors>,
395
+ MergedActors<BindActors<TActors, TInput, TContext>>,
158
396
  {},
159
397
  TActions,
160
398
  TGuards & SentByGuards,
@@ -165,6 +403,8 @@ export function jr2Setup<
165
403
  TEmitted,
166
404
  TMeta
167
405
  > {
406
+ // Like `setup()`, but `types.events` is gone (ADR-0015): the event union derives from `events`
407
+ // (defineEvent defs, taken as values) plus the mechanism events.
168
408
  const inner = setup({
169
409
  types: def.types,
170
410
  actors: { ...jr2Actors, ...(def.actors ?? {}) },
@@ -179,11 +419,16 @@ export function jr2Setup<
179
419
  // machine receives at creation — and is pulled OFF before xstate sees it: a zod schema is
180
420
  // not machine structure, and it must never reach the fingerprint/serialization paths that
181
421
  // read `machine.config`. It is attached beside the vocabulary below.
182
- const { input: inputSchema, ...machineConfig } = config as { input?: z.ZodObject } & Record<string, unknown>;
422
+ // A compiled Chart (ADR-0070) is marked, and the marker is pulled off as `input` is.
423
+ const {
424
+ input: inputSchema,
425
+ [COMPILED_CHART]: compiledChart,
426
+ ...machineConfig
427
+ } = config as { input?: z.ZodObject; [COMPILED_CHART]?: true } & Record<string, unknown>;
183
428
 
184
429
  // Resolve the defs first (duplicates and reserved semantics fail HERE, naming the machine —
185
430
  // the same loud failure `eventMap` gave the manifest, moved to machine-build time)…
186
- const defs = eventMap((machineConfig as { id?: string }).id ?? "(machine)", def.events);
431
+ const defs = eventMap((machineConfig as { id?: string }).id ?? "(machine)", def.events ?? []);
187
432
 
188
433
  // Every Open body slot (ADR-0070), found by its brand: each name it lends resolves against THIS
189
434
  // setup's own parts, or the Machine is refused naming it. The resolved set is stamped on the slot,
@@ -231,13 +476,26 @@ export function jr2Setup<
231
476
 
232
477
  // A Part written inline has no name (ADR-0049, ADR-0067): refused, with the slot form.
233
478
  refuseInlineParts(machine);
479
+ // A final state's output with no root output (ADR-0015): the run would end with none.
480
+ refuseLostOutput(machine);
481
+ // A state that invokes an Agent, or an Open body that can run one, with no `agent.fault` route
482
+ // (ADR-0074): the run would wait for ever. Not in a compiled Chart: there the route is optional,
483
+ // and the Open body sends the event that no transition takes to the Machine that invoked it (ADR-0070).
484
+ if (compiledChart !== true) refuseUnroutedAgentFault(machine);
485
+ // An Effect's `onDone` with no last arm that always matches (ADR-0075): the run would stay in the
486
+ // state and show no fault. A compiled Chart comes here too, so the door refuses it.
487
+ refuseUnroutedOutcome(machine);
234
488
  refuseParallelBelowAgents(machine, def.actors ?? {});
489
+ // One slot, two Turns at once (ADR-0015): one sender and one conversation cannot hold both.
490
+ refuseSlotActiveTwice(machine);
235
491
  refuseUnknownSentBy(machine);
236
492
  // Before the Effect checks: they ask who may send a writing (`mayTake`), which reads its audience.
237
493
  attachVocabulary(machine, defs);
238
494
  // The Effect checks (ADR-0067): a pick param nothing reads, a `fill` that overwrites one, a
239
495
  // `fromPick` of another pick — refused; a mapper the probe cannot run — warned.
240
- const effects = effectChecks(machine, def.actors ?? {}, defs);
496
+ // A Chart's door reads each reference itself (rule 7), and it refuses every load warning: the
497
+ // walk's "I could not run this" says nothing of a Chart's `{{...}}` mapper or its `set`.
498
+ const effects = effectChecks(machine, def.actors ?? {}, defs, compiledChart === true);
241
499
  if (effects.errors.length) throw new Error(`machine "${machine.id}": ${effects.errors.join("; ")}`);
242
500
 
243
501
  const idOf = (path: readonly string[]): string => stateAt(machine, path).id;
@@ -261,7 +519,7 @@ export function jr2Setup<
261
519
  return { ...inner, createMachine } as unknown as SetupReturn<
262
520
  TContext,
263
521
  WorkflowEvent<TDefs>,
264
- MergedActors<TActors>,
522
+ MergedActors<BindActors<TActors, TInput, TContext>>,
265
523
  {},
266
524
  TActions,
267
525
  TGuards & SentByGuards,
@@ -886,7 +1144,7 @@ function refuseUnknownKeys(consumer: object, agentName: string): void {
886
1144
  /** Wrap an Agent slot's invoke input: name the Agent (the slot key), append the state's derived set
887
1145
  * and the Agent's Menu, and finalize the mechanism fields. */
888
1146
  function wrapAgentInput(orig: unknown, derived: string[], agentName: string, menuOf: (agentName: string) => string[]) {
889
- return (args: InputArgs): AgentRunInput => {
1147
+ const wrapped = (args: InputArgs): AgentRunInput => {
890
1148
  const consumer = resolveInput(orig, args) as Partial<AgentTurnInput & AgentRunInput>;
891
1149
  refuseUnknownKeys(consumer, agentName);
892
1150
  return {
@@ -894,6 +1152,9 @@ function wrapAgentInput(orig: unknown, derived: string[], agentName: string, men
894
1152
  // jr2 mints every id (ADR-0016, ADR-0057): the Turn's input carries no id to honor, so
895
1153
  // nothing a Machine writes can address a conversation jr2 did not derive.
896
1154
  instanceId: mintIid(consumer, agentName, args.self),
1155
+ // One per invocation (ADR-0016): two Turns that continue one conversation share the iid, the
1156
+ // admission ledger's key, and a restore must not re-attach one Turn to the other's admission.
1157
+ turnId: randomUUID(),
897
1158
  endpoint: consumer.endpoint,
898
1159
  sandbox: consumer.sandbox,
899
1160
  prompt: consumer.prompt,
@@ -914,6 +1175,8 @@ function wrapAgentInput(orig: unknown, derived: string[], agentName: string, men
914
1175
  menu: menuOf(agentName),
915
1176
  };
916
1177
  };
1178
+ // The walk reads what the author wrote: `workspace()`, for a literal `cwd`.
1179
+ return Object.assign(wrapped, { consumerInput: orig });
917
1180
  }
918
1181
 
919
1182
  /** Wrap a gate invoke input: append the derived accepted set. */