@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,15 @@
1
+ ---
2
+ title: CommandEnv
3
+ description: "The `env` of a `command`: for each variable, `secret(\"name\")` for the value of an Effect secret, or `secret(\"name\").path` for the path of a file that holds it."
4
+ ---
5
+
6
+ # `CommandEnv`
7
+
8
+ Type, in `@jr2/orchestrator/src/sandbox-effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type CommandEnv = Readonly<Record<string, { readonly secret: string; readonly path: unknown }>>;
12
+ ```
13
+
14
+ The `env` of a `command`: for each variable, `secret("name")` for the value of an Effect
15
+ secret, or `secret("name").path` for the path of a file that holds it.
@@ -0,0 +1,19 @@
1
+ ---
2
+ title: CommandInput
3
+ description: "A command's input: one string per argv slot, and with `pin` the approved commit (`{ sha }`); none when there is neither."
4
+ ---
5
+
6
+ # `CommandInput`
7
+
8
+ Type, in `@jr2/orchestrator/src/effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type CommandInput<A extends readonly unknown[], P = false> = [
12
+ ArgNames<A> | ([P] extends [true] ? "sha" : never),
13
+ ] extends [never]
14
+ ? void
15
+ : { [K in ArgNames<A> | ([P] extends [true] ? "sha" : never)]: string };
16
+ ```
17
+
18
+ A command's input: one string per argv slot, and with `pin` the approved commit (`{ sha }`);
19
+ none when there is neither.
@@ -0,0 +1,78 @@
1
+ ---
2
+ title: CommandOptions
3
+ description: "The options of `command()`: the Repo Slot it runs in, how long it can run, how much of its output it keeps, its Effect secrets, and the commit it runs against."
4
+ ---
5
+
6
+ # `CommandOptions`
7
+
8
+ Type, in `@jr2/orchestrator/src/effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type CommandOptions = {
12
+ slot?: string;
13
+ timeout?: Duration;
14
+ tail?: number;
15
+ env?: CommandEnv;
16
+ pin?: boolean;
17
+ };
18
+ ```
19
+
20
+ The options of `command()`: the Repo Slot it runs in, how long it can run, how much of its
21
+ output it keeps, its Effect secrets, and the commit it runs against.
22
+
23
+ **Fields**
24
+
25
+ - `slot` (optional): `string`
26
+
27
+ The Repo Slot whose Worktree is the working directory of the command. Write it only when the
28
+ Workspace has more than one Repo Slot. In a Workspace with no Repo Slot, the command starts in
29
+ `/work`, the folder that the steps of the Workspace share.
30
+
31
+ The command starts in the root of that Worktree. To run it in a subfolder, give the path as an
32
+ argument, or write `["sh", "-c", "cd <dir> && <program>"]`.
33
+
34
+ When it starts, it refuses:
35
+ - no `slot` under a Workspace with more than one Repo Slot: `command "<slot>" runs under a
36
+ Workspace carrying more than one Repo Slot (<slots>) and names none — say which Worktree it
37
+ runs in: command(argv, { slot: "<slot>" }) (ADR-0051)`. When `env` names an Effect secret,
38
+ the text is `command "<slot>" runs under a Workspace carrying more than one Repo Slot
39
+ (<slots>) — say which: { slot: "<slot>" } (ADR-0051)`.
40
+ - with an Effect secret in `env`, a Workspace with no Repo Slot: `command "<slot>" runs under
41
+ a Workspace with no Repo Slot: a command with an Effect secret runs against one commit of a
42
+ Repo Slot's branch, and there is none — declare a Repo Slot, or name no secret in its env, and
43
+ it runs in /work beside the Agent (ADR-0051)`.
44
+ - a `slot` that the Workspace does not have: `command "<slot>" names Repo Slot "<name>", which
45
+ its Workspace does not carry (<slots>)`.
46
+ - `timeout` (optional): [`Duration`](type-duration.md)
47
+
48
+ How long the command can run: a number and a unit, such as `"90s"`, `"10m"` or `"1h"`.
49
+ Default `"10m"`. When the time ends, jr2 kills the process group, and the output is
50
+ `timeout`. It refuses a value that is not a positive duration: `command: timeout "<timeout>"
51
+ is not a positive duration (like "90s", "10m", "1h")`.
52
+ - `tail` (optional): `number`
53
+
54
+ The number of characters that `tail` keeps from the end of what the command wrote. Default
55
+ 4096.
56
+ - `env` (optional): [`CommandEnv`](type-commandenv.md)
57
+
58
+ The environment variables of the command, each an Effect secret. `secret("x")` gives the
59
+ value, and `secret("x").path` gives the path of a file that holds the value. When `env` names
60
+ one, the command runs in the Sandbox Effector against one commit, not in the Worktree that the
61
+ Agent changes. Without `env`, it runs in the Harness container, beside the Agent.
62
+
63
+ It refuses a name that is not a variable name, and `PATH`, `HOME` and `TMPDIR`: ``command(argv,
64
+ { env }): "<name>" is not a variable the author sets — PATH, HOME and TMPDIR are the
65
+ Effector's (ADR-0067)``.
66
+ - `pin` (optional): `boolean`
67
+
68
+ Only for a command whose `env` names an Effect secret. `true`: the input of the Effect names
69
+ the commit to run against (`{ sha }`, a full commit id, for example one that a Gate approved).
70
+ Default: the tip of the Agent's branch when the Effect starts.
71
+
72
+ It refuses `pin: true` on a command that names no Effect secret: ``command(argv, { pin: true
73
+ }) names no secret in its env: `pin` chooses the commit a credentialed command runs against in
74
+ the Sandbox Effector, and a command that names no secret runs in the live Worktree (ADR-0067)
75
+ — name its secret, command(argv, { env: { NAME: secret("x") }, pin: true }), or drop `pin` ``.
76
+
77
+ When it starts, it refuses an input `sha` that is not a full commit id: `command "<slot>"
78
+ (pin): its input's sha is not a full commit id`.
@@ -0,0 +1,104 @@
1
+ ---
2
+ title: CommandOutput
3
+ description: "The output of a `command` Effect: what the `onDone` of its state gets as `event.output`."
4
+ ---
5
+
6
+ # `CommandOutput`
7
+
8
+ Type, in `@jr2/orchestrator/src/effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ```ts
11
+ type CommandOutput = (ExecOutcome & { dirty?: boolean }) | Unknown;
12
+ ```
13
+
14
+ The output of a `command` Effect: what the `onDone` of its state gets as `event.output`. Every
15
+ outcome is output. A failed program is output too. Route on `outcome`:
16
+
17
+ - `exited`: the program ended. `code` is its exit code. A program that the container does not
18
+ have is `exited` with code 127.
19
+ - `timeout`: the command ran past its `timeout`, and jr2 killed it.
20
+ - `killed`: a signal ended it. `signal` names the signal.
21
+ - `unknown`: jr2 cannot tell what the command did, for example because the Harness restarted
22
+ while it ran. `reason` tells why. jr2 does not run it again.
23
+
24
+ `tail` is the end of what the command wrote, at most the `tail` option of `command` in
25
+ characters. `dirty` is `true` when a command that names an Effect secret ran against a commit,
26
+ and the Worktree held changes that it did not see.
27
+
28
+ **Forms**: it is one of these objects.
29
+
30
+ - Form 1: `outcome`, `code`, `tail`, `dirty`
31
+
32
+ - `outcome`: `"exited"`
33
+ - `code`: `number`
34
+ - `tail`: `string`
35
+ - `dirty` (optional): `boolean`
36
+ - Form 2: `outcome`, `tail`, `dirty`
37
+
38
+ - `outcome`: `"timeout"`
39
+ - `tail`: `string`
40
+ - `dirty` (optional): `boolean`
41
+ - Form 3: `outcome`, `signal`, `tail`, `dirty`
42
+
43
+ - `outcome`: `"killed"`
44
+ - `signal`: `string`
45
+ - `tail`: `string`
46
+ - `dirty` (optional): `boolean`
47
+ - Form 4: `outcome`, `reason`
48
+
49
+ - `outcome`: `"unknown"`
50
+ - `reason`: `string`
51
+
52
+ **Example**
53
+
54
+ ```ts
55
+ import {
56
+ command,
57
+ type CommandOutput,
58
+ fail,
59
+ jr2Setup,
60
+ workspace,
61
+ type Workspaced,
62
+ } from "@jr2/orchestrator";
63
+
64
+ type Input = Workspaced<{}, "app">;
65
+
66
+ const passed = (output: CommandOutput): boolean =>
67
+ output.outcome === "exited" && output.code === 0;
68
+
69
+ const body = jr2Setup({
70
+ types: {} as { context: Input; input: Input },
71
+ actors: { tests: command(["npm", "test"], { timeout: "15m" }), fail: fail() },
72
+ }).createMachine({
73
+ id: "tests",
74
+ context: ({ input }) => input,
75
+ on: { "workspace.lost": ".lost" },
76
+ initial: "testing",
77
+ states: {
78
+ testing: {
79
+ invoke: {
80
+ src: "tests",
81
+ onDone: [
82
+ { guard: ({ event }) => passed(event.output), target: "green" },
83
+ { target: "red" },
84
+ ],
85
+ },
86
+ },
87
+ green: { type: "final" },
88
+ // Not a final state: a final state means `done`, and the run ends `failed` here.
89
+ red: { invoke: { src: "fail", input: { reason: "npm test did not pass" } } },
90
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
91
+ },
92
+ });
93
+
94
+ export const machine = workspace(body, {
95
+ repos: { app: { url: "https://github.com/you/app.git" } },
96
+ spec: () => ({ branch: "tests" }),
97
+ });
98
+ ```
99
+
100
+ **See also**
101
+
102
+ - [Effects](../../concepts/effects.md)
103
+ - [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
104
+ - [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)
@@ -0,0 +1,109 @@
1
+ ---
2
+ title: Customize
3
+ description: "The parts of one Machine that `customize()` can retune: its Agents, its Open Effects, the Machines it composes, and the Sandbox of its `workspace()`."
4
+ ---
5
+
6
+ # `Customize`
7
+
8
+ Type, in `@jr2/orchestrator/src/customize.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
9
+
10
+ ```ts
11
+ type Customize<M extends AnyStateMachine> = {
12
+ agents?: [AgentSlots<Reached<M>>] extends [never]
13
+ ? never
14
+ : { [K in AgentSlots<Reached<M>>]?: Partial<AgentDefinition> };
15
+ effects?: [OpenEffectSlots<Reached<M>>] extends [never]
16
+ ? never
17
+ : { [K in OpenEffectSlots<Reached<M>>]?: BindingOf<LogicAt<Reached<M>, K>> };
18
+ actors?: [ChildSlots<Reached<M>>] extends [never]
19
+ ? never
20
+ : { [K in ChildSlots<Reached<M>>]?: Customize<ChildAt<Reached<M>, K>> };
21
+ image?: string;
22
+ user?: string | UserContainer;
23
+ resources?: Size;
24
+ repos?: [RepoSlotsOf<M>] extends [never] ? never : { [K in RepoSlotsOf<M>]?: RepoSlot<InputFrom<WorkspaceOf<M>>> };
25
+ };
26
+ ```
27
+
28
+ The parts of one Machine that `customize()` can retune: its Agents, its Open Effects, the
29
+ Machines it composes, and the Sandbox of its `workspace()`. The type comes from the Machine
30
+ itself, so it offers only the parts that the Machine declares. A key for a part the Machine does
31
+ not declare does not compile. The `agents`, `effects`, `actors` and `repos` keys take no value
32
+ when the Machine has no such part. `image`, `user` and `resources` compile on every Machine, and
33
+ `customize()` refuses them when the Machine composes no `workspace()`.
34
+
35
+ Every key is optional. Write only what you change.
36
+
37
+ **Fields**
38
+
39
+ - `agents` (optional): `[ AgentSlots<Reached<M>> ] extends [ never ] ? never : { [K in AgentSlots<Reached<M>>]?: Partial<AgentDefinition>; }`
40
+
41
+ Retune the Agents that this Machine carries, by slot name: `{ coder: { model } }`. Each
42
+ override goes over the definition that the author wrote, field by field, so `{ model }` alone
43
+ keeps the author's instructions. When the author left the model Open, this is where you bind
44
+ it. Allowed fields: the fields of an `agent()` definition. At run time, `customize()` refuses a
45
+ slot that holds no Agent: `customize(): machine "<id>" carries no Agent slot "<slot>" — its
46
+ Agents are: <slots>`.
47
+ - `effects` (optional): `[ OpenEffectSlots<Reached<M>> ] extends [ never ] ? never : { [K in OpenEffectSlots<Reached<M>>]?: BindingOf<LogicAt<Reached<M>, K>>; }`
48
+
49
+ Bind the Open parts of this Machine's Effects, by slot name: `{ url }` for an `http` Effect
50
+ whose url is Open, `{ argv }` for a `command` whose argv is Open, `{ secret }` for an Effect
51
+ that names `secret(open)`, `{ target: { url, token: secret("<name>") } }` for a `dispatch`
52
+ whose target is Open. For an Effect with two Open parts, one object holds both keys, and
53
+ a binding that leaves one out does not compile. Only Effects with an Open part are offered.
54
+ See [`EffectBinding`](type-effectbinding.md) for the values and the refusals.
55
+ - `actors` (optional): `[ ChildSlots<Reached<M>> ] extends [ never ] ? never : { [K in ChildSlots<Reached<M>>]?: Customize<ChildAt<Reached<M>, K>>; }`
56
+
57
+ Retune a Machine that this Machine composes, by slot name. The value has the same shape as
58
+ these parts, one level down. At run time, `customize()` refuses a slot that holds no Machine:
59
+ `customize(): machine "<id>" composes no Machine under "<slot>"`.
60
+ - `image` (optional): `string`
61
+
62
+ The Sandbox Image: a `file:` URL to a docker context that your module ships
63
+ (`import.meta.resolve("./image")`), which `jr2 up` builds, or a registry ref. It replaces the
64
+ image of the `workspace()`. When the Machine composes no `workspace()`, `customize()` refuses it
65
+ at run time.
66
+ - `user` (optional): `string | UserContainer`
67
+
68
+ The User Container: its image, as a `file:` URL or a registry ref, or a
69
+ [`UserContainer`](type-usercontainer.md) that also gives its part of the Size. It replaces the whole User
70
+ Container, its part of the Size included. When the Machine composes no `workspace()`,
71
+ `customize()` refuses it at run time.
72
+ - `resources` (optional): [`Size`](type-size.md)
73
+
74
+ The Size, layered field by field over the Size of the `workspace()`: `{ limits: { memory } }`
75
+ keeps the author's cpu. Only `limits.memory` and `limits.cpu`. See [`Size`](type-size.md). Only for a
76
+ Machine that composes a `workspace()`.
77
+ - `repos` (optional): `[ RepoSlotsOf<M> ] extends [ never ] ? never : { [K in RepoSlotsOf<M>]?: RepoSlot<InputFrom<WorkspaceOf<M>>>; }`
78
+
79
+ Bind the Repo Slots of the `workspace()`, by slot name. Each value is one of these:
80
+
81
+ - a url
82
+ - a Binding `{ url, ref? }`
83
+ - a function `({ input }) => url | { url, ref? }` over the run input
84
+ - `open`, to leave the slot for the next composer to bind
85
+
86
+ You can bind an Open slot, or give a bound or per-run slot a different Binding. A slot that
87
+ the Machine does not declare does not compile. Some Machines, such as `task`, leave their
88
+ whole slot map Open. Then you name every slot, and at least one. The keys are your names for
89
+ the Repos, and the Machine says what their order means.
90
+
91
+ **Example**
92
+
93
+ ```ts
94
+ import { customize, type Customize } from "@jr2/orchestrator";
95
+ import { task } from "@jr2/machines";
96
+
97
+ const parts: Customize<typeof task> = {
98
+ repos: { app: { url: "https://github.com/you/app.git", ref: "main" } },
99
+ agents: { coder: { model: "anthropic/claude-haiku-5-5", thinkingLevel: "high" } },
100
+ };
101
+
102
+ export const machine = customize(task, parts);
103
+ ```
104
+
105
+ **See also**
106
+
107
+ - [Bind a shipped Machine's Open parts](../../guides/bind-open-parts.md)
108
+ - [Composition](../../concepts/composition.md)
109
+ - [ADR-0049: A Machine carries its parts and composes by invoke](../decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md)
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: DispatchDefinition
3
+ description: The definition of a `dispatch` Effect (ADR-0071).
4
+ ---
5
+
6
+ # `DispatchDefinition`
7
+
8
+ Type, in `@jr2/orchestrator/src/dispatch-effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type DispatchDefinition<S extends z.ZodObject | undefined = undefined> = {
12
+ input?: S;
13
+ wait?: boolean;
14
+ timeout?: Duration;
15
+ target?: { url: string; token: NamedSecret } | typeof open;
16
+ };
17
+ ```
18
+
19
+ The definition of a `dispatch` Effect ([ADR-0071](../decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md)). Every field is optional.
20
+
21
+ **Fields**
22
+
23
+ - `input` (optional): `S`
24
+
25
+ A zod schema of the run input of the Workflow. It types the `input` of the invoke and
26
+ `fromPick`, and `jr2 up` compares it with the input that the Workflow declares. Without it,
27
+ only the Workflow checks the input.
28
+ - `wait` (optional): `boolean`
29
+
30
+ `true`: end when the new run ends (`settled`). `false`, the default: end when the
31
+ Orchestrator accepts the run (`started`).
32
+ - `timeout` (optional): [`Duration`](type-duration.md)
33
+
34
+ How long the Effect waits: by default 30s for the start, and 10m with `wait`.
35
+ - `target` (optional): `{ url: string; token: NamedSecret; } | typeof open`
36
+
37
+ A different Orchestrator: `url` is its origin, and `token` is the secret that holds its
38
+ Instance token. Or `open`, which the composer binds with `customize(<import>, { effects: {
39
+ <slot>: { target: { url, token } } } })`. Without it, the run starts in this Orchestrator.
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: DispatchInput
3
+ description: "A dispatch's input: the run's body — the slot's schema's type, or any JSON object."
4
+ ---
5
+
6
+ # `DispatchInput`
7
+
8
+ Type, in `@jr2/orchestrator/src/dispatch-effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type DispatchInput<S> = S extends z.ZodObject ? z.infer<S> : Record<string, unknown>;
12
+ ```
13
+
14
+ A dispatch's input: the run's body — the slot's schema's type, or any JSON object.
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: DispatchOpenParts
3
+ description: "The Open part a dispatch definition states: its target, when it is `open`."
4
+ ---
5
+
6
+ # `DispatchOpenParts`
7
+
8
+ Type, in `@jr2/orchestrator/src/dispatch-effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type DispatchOpenParts<T> = T extends typeof open ? "target" : never;
12
+ ```
13
+
14
+ The Open part a dispatch definition states: its target, when it is `open`.
@@ -0,0 +1,65 @@
1
+ ---
2
+ title: DispatchOutput
3
+ description: The output of a `dispatch` Effect.
4
+ ---
5
+
6
+ # `DispatchOutput`
7
+
8
+ Type, in `@jr2/orchestrator/src/effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ```ts
11
+ type DispatchOutput =
12
+ | { outcome: "started"; run: string }
13
+ | {
14
+ outcome: "settled";
15
+ run: string;
16
+ status: "done" | "failed" | "error" | "cancelled" | "lost" | "drifted" | "live";
17
+ output?: unknown;
18
+ }
19
+ | { outcome: "refused"; status: number; report: string[] }
20
+ | { outcome: "unreachable"; reason: string }
21
+ | Unknown;
22
+ ```
23
+
24
+ The output of a `dispatch` Effect. Route on `outcome`:
25
+
26
+ - `started`: the Orchestrator accepted the new run. `run` is its id.
27
+ - `settled`: with `wait`, the new run ended. `status` is `done`, `failed`, `error`, `cancelled`,
28
+ `lost` or `drifted`, and `output` is the output of its Machine. For `failed`, `output` is the
29
+ Failure, `{ reason, detail? }`. `status` is `live` when the timeout came first, and the run
30
+ continues.
31
+ - `refused`: the Orchestrator started no run. `status` is the HTTP status: 400 for an input that
32
+ the Workflow does not take, 404 for a Workflow that it does not have, 409 for a named Chart that
33
+ cannot run now, 422 for a Chart that it refuses. `report` holds the lines of the refusal.
34
+ - `unreachable`: the Orchestrator of the target did not answer. No run started.
35
+ - `unknown`: jr2 cannot tell if a run started.
36
+
37
+ **Forms**: it is one of these objects.
38
+
39
+ - Form 1: `outcome`, `reason`
40
+
41
+ - `outcome`: `"unknown"`
42
+ - `reason`: `string`
43
+ - Form 2: `outcome`, `run`
44
+
45
+ - `outcome`: `"started"`
46
+ - `run`: `string`
47
+ - Form 3: `outcome`, `run`, `status`, `output`
48
+
49
+ - `outcome`: `"settled"`
50
+ - `run`: `string`
51
+ - `status`: `"done" | "failed" | "error" | "cancelled" | "lost" | "drifted" | "live"`
52
+ - `output` (optional): `unknown`
53
+ - Form 4: `outcome`, `status`, `report`
54
+
55
+ - `outcome`: `"refused"`
56
+ - `status`: `number`
57
+ - `report`: `string[]`
58
+ - Form 5: `outcome`, `reason`
59
+
60
+ - `outcome`: `"unreachable"`
61
+ - `reason`: `string`
62
+
63
+ **See also**
64
+
65
+ - [Effects](../../concepts/effects.md)
@@ -0,0 +1,15 @@
1
+ ---
2
+ title: Duration
3
+ description: "A length of time: a positive number and a unit, `s`, `m` or `h`."
4
+ ---
5
+
6
+ # `Duration`
7
+
8
+ Type, in `@jr2/orchestrator/src/effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type Duration = `${number}s` | `${number}m` | `${number}h`;
12
+ ```
13
+
14
+ A length of time: a positive number and a unit, `s`, `m` or `h`. For example `"90s"`, `"10m"`
15
+ or `"1h"`.
@@ -0,0 +1,93 @@
1
+ ---
2
+ title: EffectBinding
3
+ description: The values that bind the Open parts of one Effect.
4
+ ---
5
+
6
+ # `EffectBinding`
7
+
8
+ Type, in `@jr2/orchestrator/src/open-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
9
+
10
+ ```ts
11
+ type EffectBinding = {
12
+ readonly url?: string | Text;
13
+ readonly argv?: readonly (string | Arg)[];
14
+ readonly secret?: string;
15
+ readonly target?: { readonly url: string; readonly token: Secret };
16
+ };
17
+ ```
18
+
19
+ The values that bind the Open parts of one Effect. A packaged Machine leaves a part of an Effect
20
+ Open when it cannot know it. That part is the url of an `http` Effect, the argv of a `command`,
21
+ the name of a secret, written `secret(open)`, or the target of a `dispatch`: the url of another
22
+ Orchestrator and the secret that holds its Instance token, bound as one. You bind it once, where you register the
23
+ Machine, with `customize(machine, { effects: { <slot>: binding } })`. Each key binds one Open
24
+ part. For an Effect with two Open parts, one object holds both keys.
25
+
26
+ The binding is a value, never a function of the run: no run chooses an Effect's url, argv or
27
+ secret. `customize()` builds the Effect again with the bound parts, so a bound part gets every
28
+ check that a part written in the definition gets.
29
+
30
+ `customize()` refuses:
31
+ - an empty binding, or a key for a part that is not Open: `customize(): the <kind> Effect
32
+ "<slot>" leaves its <parts> Open — bind it with <binding> (ADR-0054)`
33
+ - an Effect with no Open part: ``customize(): the <kind> Effect "<slot>" of machine "<id>"
34
+ leaves nothing Open — its parts are fixed in its definition, and only a part a package left
35
+ `open` is bound, once (ADR-0054).``
36
+ - `open` as a value: ``customize(): the <kind> Effect "<slot>"'s <part> is bound once, to a
37
+ value — not `open` again: no run chooses an Effect's <part> (ADR-0054)``. A function as a
38
+ value gives the same text, with `a function of the run` for `` `open` again ``.
39
+ - a secret that is not a string: `customize(): the <kind> Effect "<slot>"'s secret is bound to
40
+ a secret's name, a string — the file the Effector reads it from: { secret: "<name>" }
41
+ (ADR-0054, ADR-0068)`
42
+
43
+ `jr2 up` refuses a registered Machine with an Open part that nobody bound, and prints the
44
+ `customize` line that binds it.
45
+
46
+ **Fields**
47
+
48
+ - `url` (optional): `string | Text`
49
+
50
+ The url of an `http` Effect whose url is Open: a string, or a `text` template with a secret
51
+ in its path, such as `` text`https://hooks.example.com/services/${secret("hook")}` ``. Its
52
+ scheme and host must be literal.
53
+ - `argv` (optional): `readonly (string | Arg)[]`
54
+
55
+ The argv of a `command` whose argv is Open: one entry for each argument, never shell text.
56
+ An entry is a string or an `arg("<param>")` that the invoke's input fills. It must not be
57
+ empty.
58
+ - `secret` (optional): `string`
59
+
60
+ The name of the secret that `secret(open)` stands for: an entry of `secrets` in
61
+ `jr2.config.ts`. The Effector reads it from a file of that name.
62
+ - `target` (optional): `object`
63
+
64
+ - `url`: `string`
65
+ - `token`: [`Secret`](type-secret.md)
66
+
67
+ **Example**
68
+
69
+ ```ts
70
+ import { customize, http, jr2Setup, open, type EffectBinding } from "@jr2/orchestrator";
71
+
72
+ const notifier = jr2Setup({
73
+ actors: { notify: http({ method: "POST", url: open }) },
74
+ }).createMachine({
75
+ id: "notifier",
76
+ initial: "sending",
77
+ states: {
78
+ sending: { invoke: { src: "notify", onDone: "done" } },
79
+ done: { type: "final" },
80
+ },
81
+ });
82
+
83
+ const notify = { url: "https://hooks.example.com/build" } satisfies EffectBinding;
84
+
85
+ export const machine = customize(notifier, { effects: { notify } });
86
+ ```
87
+
88
+ **See also**
89
+
90
+ - [Bind a shipped Machine's Open parts](../../guides/bind-open-parts.md)
91
+ - [Effects](../../concepts/effects.md)
92
+ - [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)
93
+ - [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)
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: EffectLogic
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `EffectLogic`
7
+
8
+ Type, in `@jr2/orchestrator/src/effect.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type EffectLogic<I, O> = ActorLogic<EffectSnapshot<O, I>, EventObject, I> & EffectSlot;
12
+ ```
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: EnvOpenParts
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `EnvOpenParts`
7
+
8
+ Type, in `@jr2/orchestrator/src/effect.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type EnvOpenParts<Opt> = Opt extends { readonly env: infer E }
12
+ ? OpenSecretIn<E extends Readonly<Record<string, infer V>> ? V : never>
13
+ : never;
14
+ ```
@@ -0,0 +1,27 @@
1
+ ---
2
+ title: EventAudience
3
+ description: "Who may send an event: `\"agent\"` (an Agent, as a pick from its Menu), `\"external\"` (the caller of a Gate), or `\"any\"` (both)."
4
+ ---
5
+
6
+ # `EventAudience`
7
+
8
+ Type, in `src/define-event.ts` of `@jr2/agent-protocol`, a dependency of `@jr2/orchestrator`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type EventAudience = "agent" | "external" | "any";
12
+ ```
13
+
14
+ Who may send an event: `"agent"` (an Agent, as a pick from its Menu), `"external"` (the caller of
15
+ a Gate), or `"any"` (both).
16
+
17
+ Leave it unset in most cases. Then the position of each `on` key decides: the event belongs to
18
+ the party that its state, or the nearest state above it, invokes. An `on` key on a state that
19
+ invokes no party, with no such state above it, belongs to both. Set an audience only to give an
20
+ event to the other party too (`"any"`). Or set it to keep an event on the root from one party
21
+ (`"agent"` or `"external"`).
22
+
23
+ **See also**
24
+
25
+ - [The Menu](../../concepts/the-menu.md)
26
+ - [Gates](../../concepts/gates.md)
27
+ - [ADR-0015: Workflows are authored through `jr2Setup`; vocabulary and agent menus derive from the machine](../decisions/0015-authoring-surface-absorbs-the-mechanism.md)