@jr2/orchestrator 0.3.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/README.md +20 -2
  2. package/bin/server.ts +7 -4
  3. package/console/canvas.ts +27 -14
  4. package/console/components/app.ts +12 -1
  5. package/console/components/fleet.ts +52 -6
  6. package/console/components/machine-pane.ts +128 -2
  7. package/console/components/nav.ts +1 -1
  8. package/console/components/schema-form.ts +12 -4
  9. package/console/json-field.ts +23 -0
  10. package/console/main.ts +122 -39
  11. package/console/store.ts +321 -21
  12. package/console/style.css +111 -0
  13. package/docs/agents-block.md +5 -0
  14. package/docs/concepts/agents-and-turns.md +442 -0
  15. package/docs/concepts/architecture.md +230 -0
  16. package/docs/concepts/charts.md +143 -0
  17. package/docs/concepts/composition.md +357 -0
  18. package/docs/concepts/converge.md +254 -0
  19. package/docs/concepts/durable-runs.md +189 -0
  20. package/docs/concepts/effects.md +603 -0
  21. package/docs/concepts/gates.md +208 -0
  22. package/docs/concepts/machines-and-workflows.md +289 -0
  23. package/docs/concepts/pools-and-sources.md +230 -0
  24. package/docs/concepts/secrets-and-trust.md +222 -0
  25. package/docs/concepts/the-menu.md +378 -0
  26. package/docs/concepts/workspaces.md +678 -0
  27. package/docs/get-started/a-model-decides.md +563 -0
  28. package/docs/get-started/an-agent-in-a-sandbox.md +381 -0
  29. package/docs/get-started/connect-a-model.md +248 -0
  30. package/docs/get-started/create-an-instance.md +194 -0
  31. package/docs/get-started/have-your-assistant-write-a-machine.md +922 -0
  32. package/docs/get-started/install.md +126 -0
  33. package/docs/guides/add-tools-to-the-sandbox.md +295 -0
  34. package/docs/guides/answer-a-gate.md +304 -0
  35. package/docs/guides/bind-open-parts.md +223 -0
  36. package/docs/guides/cancel-a-run.md +146 -0
  37. package/docs/guides/clean-up.md +206 -0
  38. package/docs/guides/fix-a-failed-converge.md +361 -0
  39. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  40. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  41. package/docs/guides/let-an-agent-write-a-chart.md +226 -0
  42. package/docs/guides/look-inside-a-sandbox.md +174 -0
  43. package/docs/guides/mirror-the-kit-images.md +176 -0
  44. package/docs/guides/move-from-kind-to-a-shared-cluster.md +302 -0
  45. package/docs/guides/open-the-console.md +91 -0
  46. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  47. package/docs/guides/push-and-sign-a-branch.md +486 -0
  48. package/docs/guides/run-a-chart-by-name.md +270 -0
  49. package/docs/guides/run-a-command-or-call-a-url.md +544 -0
  50. package/docs/guides/run-one-worker-per-item.md +321 -0
  51. package/docs/guides/set-an-agents-access-and-dials.md +375 -0
  52. package/docs/guides/size-a-workspace.md +204 -0
  53. package/docs/guides/start-a-run-from-a-run.md +237 -0
  54. package/docs/guides/start-a-run.md +207 -0
  55. package/docs/guides/upgrade-the-kit-version.md +240 -0
  56. package/docs/guides/use-a-hosted-provider.md +208 -0
  57. package/docs/guides/use-a-local-model.md +313 -0
  58. package/docs/guides/watch-a-run.md +326 -0
  59. package/docs/guides/write-a-workflow.md +318 -0
  60. package/docs/index.md +44 -0
  61. package/docs/llms.txt +216 -0
  62. package/docs/reference/authoring-surface/agent.md +128 -0
  63. package/docs/reference/authoring-surface/answer.md +140 -0
  64. package/docs/reference/authoring-surface/arg.md +60 -0
  65. package/docs/reference/authoring-surface/basic.md +62 -0
  66. package/docs/reference/authoring-surface/bearer.md +53 -0
  67. package/docs/reference/authoring-surface/chartschema.md +23 -0
  68. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  69. package/docs/reference/authoring-surface/command.md +191 -0
  70. package/docs/reference/authoring-surface/customize.md +64 -0
  71. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  72. package/docs/reference/authoring-surface/defineevent.md +114 -0
  73. package/docs/reference/authoring-surface/dispatch.md +126 -0
  74. package/docs/reference/authoring-surface/fail.md +83 -0
  75. package/docs/reference/authoring-surface/file.md +122 -0
  76. package/docs/reference/authoring-surface/frompick.md +277 -0
  77. package/docs/reference/authoring-surface/http.md +159 -0
  78. package/docs/reference/authoring-surface/isfailure.md +58 -0
  79. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  80. package/docs/reference/authoring-surface/open.md +74 -0
  81. package/docs/reference/authoring-surface/openbody.md +86 -0
  82. package/docs/reference/authoring-surface/paramsof.md +125 -0
  83. package/docs/reference/authoring-surface/pool.md +186 -0
  84. package/docs/reference/authoring-surface/push.md +112 -0
  85. package/docs/reference/authoring-surface/secret.md +118 -0
  86. package/docs/reference/authoring-surface/sentby.md +83 -0
  87. package/docs/reference/authoring-surface/source.md +51 -0
  88. package/docs/reference/authoring-surface/text.md +62 -0
  89. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  90. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  91. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  92. package/docs/reference/authoring-surface/type-agentslots.md +12 -0
  93. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  94. package/docs/reference/authoring-surface/type-arg.md +19 -0
  95. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  96. package/docs/reference/authoring-surface/type-binding.md +62 -0
  97. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  98. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  99. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  100. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  101. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  102. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  103. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  104. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  105. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  106. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  107. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  108. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  109. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  110. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  111. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  112. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  113. package/docs/reference/authoring-surface/type-childat.md +12 -0
  114. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  115. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  116. package/docs/reference/authoring-surface/type-commandinput.md +19 -0
  117. package/docs/reference/authoring-surface/type-commandoptions.md +78 -0
  118. package/docs/reference/authoring-surface/type-commandoutput.md +104 -0
  119. package/docs/reference/authoring-surface/type-customize.md +109 -0
  120. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  121. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  122. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  123. package/docs/reference/authoring-surface/type-dispatchoutput.md +65 -0
  124. package/docs/reference/authoring-surface/type-duration.md +15 -0
  125. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  126. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  127. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  128. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  129. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  130. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  131. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  132. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  133. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  134. package/docs/reference/authoring-surface/type-failure.md +19 -0
  135. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  136. package/docs/reference/authoring-surface/type-filebody.md +41 -0
  137. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  138. package/docs/reference/authoring-surface/type-hostinjectedinput.md +58 -0
  139. package/docs/reference/authoring-surface/type-httpdefinition.md +101 -0
  140. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  141. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  142. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  143. package/docs/reference/authoring-surface/type-httpoutput.md +89 -0
  144. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  145. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  146. package/docs/reference/authoring-surface/type-lends.md +38 -0
  147. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  148. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  149. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  150. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  151. package/docs/reference/authoring-surface/type-noslotspec.md +26 -0
  152. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +32 -0
  153. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  154. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  155. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  156. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  157. package/docs/reference/authoring-surface/type-opencommandinput.md +17 -0
  158. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  159. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  160. package/docs/reference/authoring-surface/type-openof.md +12 -0
  161. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  162. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  163. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +31 -0
  164. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +32 -0
  165. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  166. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  167. package/docs/reference/authoring-surface/type-pushinput.md +15 -0
  168. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  169. package/docs/reference/authoring-surface/type-pushoutput.md +124 -0
  170. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  171. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  172. package/docs/reference/authoring-surface/type-reached.md +12 -0
  173. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  174. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  175. package/docs/reference/authoring-surface/type-sandboxoptions.md +77 -0
  176. package/docs/reference/authoring-surface/type-secret.md +25 -0
  177. package/docs/reference/authoring-surface/type-sender.md +19 -0
  178. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  179. package/docs/reference/authoring-surface/type-size.md +85 -0
  180. package/docs/reference/authoring-surface/type-slothandles.md +32 -0
  181. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  182. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  183. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  184. package/docs/reference/authoring-surface/type-text.md +19 -0
  185. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  186. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  187. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  188. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  189. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  190. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  191. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  192. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  193. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  194. package/docs/reference/authoring-surface/type-workspaced.md +94 -0
  195. package/docs/reference/authoring-surface/type-workspacehandles.md +23 -0
  196. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  197. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  198. package/docs/reference/authoring-surface/type-workspaceoptions.md +39 -0
  199. package/docs/reference/authoring-surface/type-workspacespec.md +37 -0
  200. package/docs/reference/authoring-surface/workspace.md +259 -0
  201. package/docs/reference/authoring-surface.md +197 -0
  202. package/docs/reference/cli.md +433 -0
  203. package/docs/reference/config.md +756 -0
  204. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +113 -0
  205. package/docs/reference/decisions/0002-duplex-streaming-actor.md +110 -0
  206. package/docs/reference/decisions/0004-worktree-provisioning-model.md +124 -0
  207. package/docs/reference/decisions/0005-sandbox-pod-composition.md +230 -0
  208. package/docs/reference/decisions/0006-agent-control-surface.md +47 -0
  209. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  210. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  211. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  212. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  213. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  214. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  215. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +157 -0
  216. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  217. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +265 -0
  218. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +124 -0
  219. package/docs/reference/decisions/0017-pool-over-a-source-port.md +69 -0
  220. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  221. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +275 -0
  222. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  223. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +100 -0
  224. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  225. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +176 -0
  226. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +439 -0
  227. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  228. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  229. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +237 -0
  230. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +89 -0
  231. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  232. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  233. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +190 -0
  234. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  235. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +127 -0
  236. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  237. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  238. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  239. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  240. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  241. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  242. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  243. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  244. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  245. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  246. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  247. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  248. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  249. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  250. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  251. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  252. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +227 -0
  253. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +81 -0
  254. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +111 -0
  255. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  256. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  257. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  258. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  259. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +106 -0
  260. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +384 -0
  261. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  262. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  263. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +212 -0
  264. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +83 -0
  265. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  266. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  267. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +550 -0
  268. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +430 -0
  269. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +464 -0
  270. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  271. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +323 -0
  272. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  273. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  274. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  275. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  276. package/docs/reference/decisions.md +83 -0
  277. package/docs/reference/glossary.md +648 -0
  278. package/docs/reference/http-api.md +1348 -0
  279. package/docs/reference/machines.md +190 -0
  280. package/docs/reference/mechanism-events.md +72 -0
  281. package/docs/why.md +206 -0
  282. package/package.json +6 -4
  283. package/src/actor.ts +976 -61
  284. package/src/agent.ts +114 -38
  285. package/src/ambient.ts +4 -1
  286. package/src/assembly-checks.ts +347 -0
  287. package/src/assembly-tar.ts +494 -0
  288. package/src/assembly.ts +721 -0
  289. package/src/cause.ts +234 -0
  290. package/src/chart.ts +2182 -0
  291. package/src/charts.ts +748 -0
  292. package/src/config.ts +520 -162
  293. package/src/content-hash.ts +105 -0
  294. package/src/custodian.lua +6 -5
  295. package/src/custodian.ts +143 -39
  296. package/src/customize.ts +388 -55
  297. package/src/dispatch-effect.ts +945 -0
  298. package/src/door-compat.ts +217 -0
  299. package/src/durability.ts +11 -4
  300. package/src/effect-checks.ts +557 -0
  301. package/src/effect.ts +1202 -0
  302. package/src/effector-wire.ts +674 -0
  303. package/src/fail.ts +209 -0
  304. package/src/fingerprint.ts +4 -3
  305. package/src/gate.ts +8 -0
  306. package/src/git-clone.ts +65 -0
  307. package/src/git-push.ts +336 -0
  308. package/src/harness-client.ts +764 -48
  309. package/src/held-secrets.ts +82 -26
  310. package/src/holds.ts +156 -0
  311. package/src/http-effect.ts +1423 -0
  312. package/src/http.ts +916 -113
  313. package/src/images.ts +47 -21
  314. package/src/index.ts +62 -43
  315. package/src/instance.ts +505 -59
  316. package/src/internal.ts +84 -0
  317. package/src/kube-client.ts +333 -0
  318. package/src/machine-doc.ts +106 -6
  319. package/src/mechanism-routes.ts +168 -0
  320. package/src/model-keys.generated.ts +53 -0
  321. package/src/model-keys.ts +18 -58
  322. package/src/mount-digest.ts +53 -0
  323. package/src/names.ts +66 -8
  324. package/src/notices.ts +141 -0
  325. package/src/open-body.ts +1580 -0
  326. package/src/open-effect.ts +217 -0
  327. package/src/open.ts +59 -6
  328. package/src/parts.ts +709 -41
  329. package/src/party.ts +534 -0
  330. package/src/pick.ts +761 -0
  331. package/src/pool.ts +248 -37
  332. package/src/registration.ts +382 -19
  333. package/src/repo-fetch.ts +60 -85
  334. package/src/repos.ts +65 -75
  335. package/src/rest.ts +133 -0
  336. package/src/run-host.ts +2383 -115
  337. package/src/run-output.ts +38 -0
  338. package/src/sandbox-effect.ts +1126 -0
  339. package/src/sandbox-effector.ts +111 -0
  340. package/src/sandbox-kube.ts +1721 -0
  341. package/src/sandbox-watch.ts +260 -0
  342. package/src/secret-placement.ts +529 -0
  343. package/src/server.ts +284 -84
  344. package/src/setup.ts +819 -117
  345. package/src/size.ts +454 -0
  346. package/src/snapshot-store.ts +115 -20
  347. package/src/stub-harness.ts +49 -16
  348. package/src/sync-client.ts +54 -0
  349. package/src/timers.ts +191 -0
  350. package/src/tokens.ts +35 -4
  351. package/src/vocabulary.ts +135 -15
  352. package/src/wire.ts +238 -10
  353. package/src/workspace.ts +1195 -338
  354. package/src/sandbox-kubectl.ts +0 -1108
@@ -0,0 +1,237 @@
1
+ ---
2
+ title: jr2Setup
3
+ description: "Set up a Machine that takes workflow events: the jr2 form of xstate's `setup()`."
4
+ ---
5
+
6
+ # `jr2Setup`
7
+
8
+ Function, in `@jr2/orchestrator/src/setup.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Machine and events.
9
+
10
+ ```ts
11
+ function jr2Setup<
12
+ TContext extends MachineContext = MachineContext,
13
+ const TDefs extends readonly EventDef[] = readonly [],
14
+ TActors extends Record<string, UnknownActorLogic> = {},
15
+ TActions extends Record<string, ParameterizedObject["params"] | undefined> = {},
16
+ TGuards extends Record<string, ParameterizedObject["params"] | undefined> = {},
17
+ TDelay extends string = never,
18
+ TTag extends string = string,
19
+ TInput = NonReducibleUnknown,
20
+ TOutput extends NonReducibleUnknown = NonReducibleUnknown,
21
+ TEmitted extends EventObject = EventObject,
22
+ TMeta extends MetaObject = MetaObject,
23
+ >(
24
+ def: {
25
+ types?: {
26
+ context?: TContext;
27
+ input?: TInput;
28
+ output?: TOutput;
29
+ tags?: TTag;
30
+ emitted?: TEmitted;
31
+ meta?: TMeta;
32
+ };
33
+ events?: TDefs;
34
+ actors?: TActors;
35
+ actions?: {
36
+ [K in keyof TActions]: ActionFunction<
37
+ TContext,
38
+ WorkflowEvent<TDefs>,
39
+ WorkflowEvent<TDefs>,
40
+ TActions[K],
41
+ ToProvidedActor<MergedActors<TActors>>,
42
+ ToParameterizedObject<TActions>,
43
+ ToParameterizedObject<TGuards>,
44
+ TDelay,
45
+ TEmitted
46
+ >;
47
+ };
48
+ guards?: {
49
+ [K in keyof TGuards]: GuardPredicate<TContext, WorkflowEvent<TDefs>, TGuards[K], ToParameterizedObject<TGuards>>;
50
+ };
51
+ delays?: {
52
+ [K in TDelay]: DelayConfig<
53
+ TContext,
54
+ WorkflowEvent<TDefs>,
55
+ ToParameterizedObject<TActions>["params"],
56
+ WorkflowEvent<TDefs>
57
+ >;
58
+ };
59
+ } = {},
60
+ ): SetupReturn<
61
+ TContext,
62
+ WorkflowEvent<TDefs>,
63
+ MergedActors<TActors>,
64
+ {},
65
+ TActions,
66
+ TGuards & SentByGuards,
67
+ TDelay,
68
+ TTag,
69
+ TInput,
70
+ TOutput,
71
+ TEmitted,
72
+ TMeta
73
+ >
74
+ ```
75
+
76
+ Set up a Machine that takes workflow events: the jr2 form of xstate's `setup()`. Write a Machine
77
+ with it when an Agent or a Gate sends events into the Machine, or when the Machine declares a
78
+ door. Call `.createMachine(config)` on the result, as with `setup()`. The Machine you get is a
79
+ plain xstate Machine.
80
+
81
+ What it adds to `setup()`:
82
+ - `events` replaces `types.events`. The event type of the Machine comes from the
83
+ `defineEvent` events you list, plus the events jr2 itself sends (`agent.fault`,
84
+ `workspace.lost`). An event that a party sent has `event.sender`. A Machine that takes no
85
+ workflow event leaves out `events`.
86
+ - The `gate` actor is ready to invoke by name: `invoke: { src: "gate" }`.
87
+ - Each Agent slot (`actors: { coder: agent(…) }`) gets its Menu from the states that invoke it.
88
+ - The `sentBy(id)` guard is ready to use.
89
+ - `createMachine` also takes `input`: a zod object for the input that starts a run. jr2 checks
90
+ each start against it. Without it, a run can start with any input. The `setup()` of xstate
91
+ does not read this `input`, so a Machine with a door uses `jr2Setup`, also when it takes no
92
+ workflow event. `jr2 up` and the publish door refuse a registered Machine that has a zod
93
+ `input` if `jr2Setup` did not make the Machine: ``workflow "<name>": machine "<id>" has a zod `input` on
94
+ createMachine, but jr2Setup did not make this Machine, so no door reads that input …``
95
+
96
+ The output of a run is the root `output` of `createMachine`, beside `id` and `states`, as in
97
+ xstate v5. xstate does not read the `output` of a final state as the output of the Machine. It
98
+ gives that output to the root `output` as `event.output`. Write
99
+ `output: ({ event }) => event.output as Output` at the root, or make the output from `context`
100
+ there. `createMachine` refuses an `output` on a final state directly below the root when the root
101
+ has no `output` (see the list below).
102
+
103
+ `createMachine` refuses a Machine that it cannot run as written. Among the refusals:
104
+ - an `on` key that no listed event has: ``machine "<id>" handles event "<key>", which no def in
105
+ jr2Setup({ events }) declares (declared: <names>) — a typo, or a missing defineEvent``
106
+ - a listed event that no state takes: ``machine "<id>" declares "<name>", which no state handles
107
+ — a pick no state takes is on no Menu and no Gate: handle it, or drop it from
108
+ jr2Setup({ events })``
109
+ - an entry of `events` that `defineEvent` did not make, or one name listed twice:
110
+ ``machine "<id>": `events` entry is not a defineEvent() def: <entry>``,
111
+ ``machine "<id>": duplicate event "<name>" in `events` ``
112
+ - an `agent()`, an Effect or a `workspace()` written on `invoke.src` instead of under `actors`:
113
+ ``machine "<id>": state "<state>" invokes <part> inline — a Part is a key of actors, so it has
114
+ a name that the ledger, the report and customize() share: actors: { <name>: <factory>(...) },
115
+ then invoke: { src: "<name>" }``. `<part>` is `an Agent`, `an Effect` or `a Workspace`.
116
+ `<factory>` is `agent`, the Effect's kind (such as `command`), or `workspace`.
117
+ - an `output` on a final state directly below the root, when the root has no `output`:
118
+ ``machine "<id>": final state "<state>" declares an output, and the root has no output — xstate
119
+ v5 gives a run only its root output, so this output reaches nothing and the run ends with none:
120
+ write it at the root, as output: ({ context }) => ..., or keep it on the final state and pass it
121
+ on with output: ({ event }) => event.output at the root``. With more than one such final state,
122
+ it names each one and puts the words in the plural: ``final states "<state>", "<state>"
123
+ declare an output``, ``these outputs reach nothing``, ``write one at the root`` and ``keep
124
+ them on the final states and pass them on``. An `output` on a
125
+ final state inside a compound state is legal: the `onDone` of that compound state gets it as
126
+ `event.output`.
127
+ - a parallel state at or below a state that invokes an Agent: ``machine "<id>": state "<state>"
128
+ is parallel, at or below Agent "<slot>"'s state "<state>" — a parallel region below an Agent's
129
+ state is reserved for picks the Agent does not wait for, which jr2 does not build; background
130
+ work goes above the Agent's state``
131
+ - a state below an Agent's state that invokes something and that nothing enters: ``machine
132
+ "<id>": state "<state>" below Agent "<slot>"'s state "<state>" is entered by nothing, so what
133
+ it invokes (<src>) never runs — target it from a pick or a route, or delete it``
134
+ - a state that invokes an Agent when that state and each state above it have no `agent.fault`
135
+ route: ``machine "<id>": state "<state>" invokes an Agent, and no route for "agent.fault" is
136
+ on it or on a state above — jr2 sends agent.fault when the Agent's Turn cannot go on, and with
137
+ no route the run faults: route it on that state or on a state above it, as on: {
138
+ "agent.fault": "<the state that handles it>" } (ADR-0074)``. A state that invokes an Open body
139
+ that lends an Agent or allows a model gets the same line, with `invokes an Open body that can
140
+ run an Agent`: the body sends it a Chart's unrouted `agent.fault`. When both kinds have no route,
141
+ one line names both, joined by `, and`. One route on the root is a route for each state. A
142
+ Chart's Machine does not get this refusal: in a Chart the route is optional ([ADR-0070](../decisions/0070-a-machine-lends-its-parts-to-a-chart.md)).
143
+
144
+ It also refuses a `sentBy` that names no party (see `sentBy`). It refuses a pick param that
145
+ nothing reads, where the pick enters a state that invokes an Effect (see `fromPick`). Shapes that
146
+ are legal but probably not what you mean, such as a mode that nothing enters, are warnings that
147
+ `jr2 up` prints.
148
+
149
+ **Parameters**
150
+
151
+ - `def`: What `setup()` takes, with `events` in place of `types.events`. A Machine that
152
+ needs none of it calls `jr2Setup()`.
153
+
154
+ - `types` (optional): `object`
155
+
156
+ The types of the Machine, as in `setup()`: `context`, `input`, `output`, `tags`, `emitted`
157
+ and `meta`. Not `events`: the event type comes from `events`.
158
+
159
+ - `context` (optional): `TContext`
160
+ - `input` (optional): `TInput`
161
+ - `output` (optional): `TOutput`
162
+ - `tags` (optional): `TTag`
163
+ - `emitted` (optional): `TEmitted`
164
+ - `meta` (optional): `TMeta`
165
+ - `events` (optional): `TDefs`
166
+
167
+ The workflow events this Machine takes: each one made by `defineEvent`. Leave it out when the
168
+ Machine takes none. Each listed event must be the name of an `on` key. Each `on` key must be
169
+ listed, if it is not a jr2 or xstate event (an event with a `.` in its name).
170
+ - `actors` (optional): `TActors`
171
+
172
+ The actors the states invoke by name, as in `setup()`: Agent slots (`agent(…)`), Effects
173
+ (`command(…)`, `http(…)`, `push(…)`), child Machines, `workspace(…)` and plain xstate logic.
174
+ The key is the slot's name. An actor named `gate` replaces jr2's Gate.
175
+ - `actions` (optional): `{ [K in keyof TActions]: ActionFunction<TContext, WorkflowEvent<TDefs>, WorkflowEvent<TDefs>, TActions[K], ToProvidedActor<MergedActors<TActors>>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TEmitted>; }`
176
+
177
+ Named actions, as in `setup()`. Their `event` has the type of this Machine's events.
178
+ - `guards` (optional): `{ [K in keyof TGuards]: GuardPredicate<TContext, WorkflowEvent<TDefs>, TGuards[K], ToParameterizedObject<TGuards>>; }`
179
+
180
+ Named guards, as in `setup()`. `sentBy` is there already; do not name a guard `jr2.sentBy`.
181
+ - `delays` (optional): `{ [K in TDelay]: DelayConfig<TContext, WorkflowEvent<TDefs>, ToParameterizedObject<TActions>["params"], WorkflowEvent<TDefs>>; }`
182
+
183
+ Named delays, as in `setup()`.
184
+
185
+ **Returns**: What `setup()` returns. Call `.createMachine(config)` on it.
186
+
187
+ **Example**
188
+
189
+ ```ts
190
+ import { z } from "zod";
191
+ import { agent, defineEvent, fail, jr2Setup } from "@jr2/orchestrator";
192
+
193
+ const proposed = defineEvent({
194
+ name: "proposed",
195
+ description: "Call this with your plan.",
196
+ input: z.object({ plan: z.string() }),
197
+ });
198
+ const approve = defineEvent({ name: "approve", input: z.object({}) });
199
+ const reject = defineEvent({ name: "reject", input: z.object({ reason: z.string() }) });
200
+
201
+ export const machine = jr2Setup({
202
+ types: {} as { input: { goal: string }; context: { goal: string } },
203
+ events: [proposed, approve, reject],
204
+ actors: {
205
+ planner: agent({
206
+ model: "anthropic/claude-haiku-5-5",
207
+ instructions: "You plan small releases.",
208
+ workspace: "none",
209
+ }),
210
+ fail: fail(),
211
+ },
212
+ }).createMachine({
213
+ id: "plan",
214
+ input: z.object({ goal: z.string() }),
215
+ context: ({ input }) => ({ goal: input.goal }),
216
+ on: { "agent.fault": ".failed" },
217
+ initial: "planning",
218
+ states: {
219
+ planning: {
220
+ invoke: { src: "planner", input: ({ context }) => ({ prompt: `Plan this: ${context.goal}` }) },
221
+ on: { proposed: "review" },
222
+ },
223
+ review: {
224
+ invoke: { src: "gate" },
225
+ on: { approve: "approved", reject: "planning" },
226
+ },
227
+ approved: { type: "final" },
228
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
229
+ },
230
+ });
231
+ ```
232
+
233
+ **See also**
234
+
235
+ - [Write a Workflow](../../guides/write-a-workflow.md)
236
+ - [Machines and Workflows](../../concepts/machines-and-workflows.md)
237
+ - [ADR-0015: Workflows are authored through `jr2Setup`; vocabulary and agent menus derive from the machine](../decisions/0015-authoring-surface-absorbs-the-mechanism.md)
@@ -0,0 +1,74 @@
1
+ ---
2
+ title: open
3
+ description: "Leave a part of a Machine Open: for the Instance that registers the Machine to bind with `customize()`."
4
+ ---
5
+
6
+ # `open`
7
+
8
+ Constant, in `@jr2/orchestrator/src/open.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
9
+
10
+ ```ts
11
+ const open: unique symbol
12
+ ```
13
+
14
+ Leave a part of a Machine Open: for the Instance that registers the Machine to bind with
15
+ `customize()`. Write it where a value goes, in a Machine that you publish as a package, for a
16
+ part that the package cannot know or pay for:
17
+ - a Repo Slot: `repos: { app: open }`, or the whole map: `repos: open`;
18
+ - an Agent's model: `agent({ model: open, … })`;
19
+ - an Effect's url or argv: `http({ url: open, … })`, `command(open)`;
20
+ - the secret of an Effect's auth, of a header, or of a command's `env`: `secret(open)`.
21
+
22
+ `jr2 up` refuses a Workflow with an Open part that nobody bound, and prints the `customize()`
23
+ line that binds it: ``refusing: workflow "<name>" leaves <part> open — bind it where the Machine
24
+ is registered: export const machine = customize(<import>, …) (<adr>)``. A run never sees an
25
+ Open part.
26
+
27
+ **Example**
28
+
29
+ ```ts
30
+ import { z } from "zod";
31
+ import { agent, customize, defineEvent, fail, jr2Setup, open, workspace } from "@jr2/orchestrator";
32
+
33
+ const finish = defineEvent({
34
+ name: "finish",
35
+ description: "Call this when `node --test` passes.",
36
+ input: z.object({}),
37
+ });
38
+
39
+ const body = jr2Setup({
40
+ events: [finish],
41
+ actors: { coder: agent({ model: open, instructions: "You fix the failing test." }), fail: fail() },
42
+ }).createMachine({
43
+ id: "fix",
44
+ on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
45
+ initial: "coding",
46
+ states: {
47
+ coding: {
48
+ invoke: { src: "coder", input: { prompt: "Make `node --test` pass." } },
49
+ on: { finish: "done" },
50
+ },
51
+ done: { type: "final" },
52
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
53
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
54
+ },
55
+ });
56
+
57
+ // What a package exports: the repository and the model are Open.
58
+ export const fix = workspace(body, {
59
+ repos: { app: open },
60
+ spec: () => ({ branch: "jr2/fix" }),
61
+ });
62
+
63
+ // What an Instance's `workflows/fix.ts` exports: the same Machine, its Open parts bound.
64
+ export const machine = customize(fix, {
65
+ repos: { app: { url: "https://github.com/you/app.git" } },
66
+ agents: { coder: { model: "anthropic/claude-haiku-5-5" } },
67
+ });
68
+ ```
69
+
70
+ **See also**
71
+
72
+ - [Bind a shipped Machine's Open parts](../../guides/bind-open-parts.md)
73
+ - [Composition](../../concepts/composition.md)
74
+ - [ADR-0054: The kit ships Machines, and a shipped Machine leaves its parts Open](../decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md)
@@ -0,0 +1,86 @@
1
+ ---
2
+ title: openBody
3
+ description: "Make an Open body: the actor slot that a Chart binds."
4
+ ---
5
+
6
+ # `openBody`
7
+
8
+ Function, in `@jr2/orchestrator/src/open-body.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Charts.
9
+
10
+ ```ts
11
+ function openBody(decl: OpenBodyDeclaration): OpenBodyLogic
12
+ ```
13
+
14
+ Make an Open body: the actor slot that a Chart binds. Put it in `actors`, and invoke it from a
15
+ state with `{ chart, ...input }`. `chart` is the text of a Chart, or `{ name }` for a named
16
+ Chart of this wrapper. The other keys are the input of the Chart, which it reads as
17
+ `{{input.<key>}}`. A Machine with an Open body is a Chart wrapper.
18
+
19
+ Each Agent Turn of the Chart runs where the Open body runs: in the Sandbox of its `workspace()`,
20
+ or on the Instance Harness. The Open body ends with an [`OpenBodyOutput`](type-openbodyoutput.md).
21
+
22
+ It refuses a declaration that is not correct: `openBody: <problem>; <problem>`, for example
23
+ `ceilings.turns: missing; an Open body states every ceiling`. `createMachine` refuses a lent
24
+ name that the Machine does not have: `machine "<id>": Open body "<slot>": lends.agents: "<name>"
25
+ is no actor slot of this Machine; its actors: <slots>`.
26
+
27
+ **Parameters**
28
+
29
+ - `decl`: What a Chart can use, and its limits (see [`OpenBodyDeclaration`](type-openbodydeclaration.md)).
30
+
31
+ **Returns**: The actor logic of the slot.
32
+
33
+ **Example**
34
+
35
+ ```ts
36
+ import { assign } from "xstate";
37
+ import { z } from "zod";
38
+ import { agent, chartSchema, fail, jr2Setup, openBody, type OpenBodyOutput } from "@jr2/orchestrator";
39
+
40
+ // `chart` is a Chart, so a run input can carry one, and Charts can have names.
41
+ const door = z.object({ topic: z.string(), chart: chartSchema });
42
+ type Input = z.infer<typeof door>;
43
+ type Context = Input & { result?: OpenBodyOutput };
44
+
45
+ export const machine = jr2Setup({
46
+ types: {} as { context: Context; input: Input },
47
+ actors: {
48
+ writer: agent({
49
+ model: "anthropic/claude-haiku-5-5",
50
+ workspace: "none",
51
+ instructions: "You write clear, short text for engineers.",
52
+ }),
53
+ body: openBody({
54
+ lends: { agents: ["writer"] },
55
+ allows: { models: [], workspace: [] },
56
+ ceilings: { turns: 6, wallClock: "15m", transitions: 200, fanOut: 1, size: 65536 },
57
+ }),
58
+ fail: fail(),
59
+ },
60
+ }).createMachine({
61
+ id: "notes",
62
+ input: door,
63
+ context: ({ input }) => ({ ...input }),
64
+ // The fault of `writer` when a Chart does not route it: the Open body sends it here.
65
+ on: { "agent.fault": ".failed" },
66
+ initial: "running",
67
+ states: {
68
+ running: {
69
+ invoke: {
70
+ src: "body",
71
+ input: ({ context }: { context: Context }) => ({ chart: context.chart, topic: context.topic }),
72
+ onDone: { target: "done", actions: assign({ result: ({ event }) => event.output as OpenBodyOutput }) },
73
+ },
74
+ },
75
+ done: { type: "final" },
76
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
77
+ },
78
+ });
79
+ ```
80
+
81
+ **See also**
82
+
83
+ - [Charts](../../concepts/charts.md)
84
+ - [Run a Chart by name](../../guides/run-a-chart-by-name.md)
85
+ - [Let an Agent write a Chart](../../guides/let-an-agent-write-a-chart.md)
86
+ - [ADR-0070: A Machine lends its parts to a Chart](../decisions/0070-a-machine-lends-its-parts-to-a-chart.md)
@@ -0,0 +1,125 @@
1
+ ---
2
+ title: paramsOf
3
+ description: Read the params of a pick from the event that entered the state.
4
+ ---
5
+
6
+ # `paramsOf`
7
+
8
+ Function, in `@jr2/orchestrator/src/pick.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ```ts
11
+ function paramsOf<
12
+ N extends string,
13
+ I extends z.ZodObject,
14
+ >(
15
+ event: EventObject,
16
+ def: EventDef<N, I>,
17
+ ): z.infer<I>
18
+ ```
19
+
20
+ Read the params of a pick from the event that entered the state. Use it in a plain `input`
21
+ mapper when the Machine must change a param before the invoked actor gets it. When the params go
22
+ to the input as they are, use `fromPick`.
23
+
24
+ It parses the params with the `input` schema of the pick. It refuses an event that is not this
25
+ pick: `state entered by "<event>", but its input reads the params of pick "<pick>"`.
26
+
27
+ `createMachine` calls each mapper one time to see which params it reads. When the mapper throws
28
+ there, `jr2 up` prints a warning before a run starts: `pick "<pick>" enters state "<state>"
29
+ (Effect "<slot>"): could not probe the input mapper (<error>); its params are unchecked`.
30
+
31
+ `createMachine` refuses a param of a pick that enters a state that invokes an Effect, when
32
+ nothing reads the param: `machine "<id>": pick "<pick>" enters state "<state>" (Effect
33
+ "<slot>"), which never reads "<param>": the Agent supplies it and nothing uses it — map it in an
34
+ invoke's input, store it with assign, or drop it from the def`.
35
+
36
+ **Parameters**
37
+
38
+ - `event`: The event that entered the state: the `event` that the mapper gets.
39
+ - `def` ([`EventDef`](type-eventdef.md)): The pick, as `defineEvent` made it.
40
+
41
+ **Returns**: The params of the pick, typed by its `input` schema.
42
+
43
+ **Example**
44
+
45
+ ```ts
46
+ import { z } from "zod";
47
+ import {
48
+ agent,
49
+ arg,
50
+ command,
51
+ defineEvent,
52
+ fail,
53
+ jr2Setup,
54
+ paramsOf,
55
+ workspace,
56
+ type Workspaced,
57
+ } from "@jr2/orchestrator";
58
+
59
+ const runTest = defineEvent({
60
+ name: "run_test",
61
+ description: "Run the tests of one module.",
62
+ input: z.object({ module: z.string() }),
63
+ });
64
+
65
+ const finished = defineEvent({
66
+ name: "finished",
67
+ description: "Say that all the tests pass.",
68
+ input: z.object({}),
69
+ });
70
+
71
+ type Input = Workspaced<{}, "app">;
72
+
73
+ const body = jr2Setup({
74
+ types: {} as { context: Input; input: Input },
75
+ events: [runTest, finished],
76
+ actors: {
77
+ coder: agent({
78
+ model: "anthropic/claude-haiku-5-5",
79
+ instructions: "You are a careful engineer.",
80
+ }),
81
+ test: command(["node", "--test", arg("file")]),
82
+ fail: fail(),
83
+ },
84
+ }).createMachine({
85
+ id: "fix-tests",
86
+ context: ({ input }) => input,
87
+ on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
88
+ initial: "coding",
89
+ states: {
90
+ coding: {
91
+ invoke: {
92
+ src: "coder",
93
+ input: { prompt: "Make the tests pass. Run the tests of one module at a time." },
94
+ },
95
+ on: { finished: "done" },
96
+ initial: "ready",
97
+ states: {
98
+ ready: { on: { run_test: "testing" } },
99
+ testing: {
100
+ invoke: {
101
+ src: "test",
102
+ // A plain mapper: the Machine makes the file name from the pick's `module`.
103
+ input: ({ event }) => ({ file: `test/${paramsOf(event, runTest).module}.test.js` }),
104
+ onDone: "ready",
105
+ },
106
+ },
107
+ },
108
+ },
109
+ done: { type: "final" },
110
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
111
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
112
+ },
113
+ });
114
+
115
+ export const machine = workspace(body, {
116
+ repos: { app: { url: "https://github.com/you/app.git" } },
117
+ spec: () => ({ branch: "fix-tests" }),
118
+ });
119
+ ```
120
+
121
+ **See also**
122
+
123
+ - [Effects](../../concepts/effects.md)
124
+ - [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
125
+ - [ADR-0067: An Effect is an actor slot, and runs at most once unless marked idempotent](../decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md)