@jr2/orchestrator 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/README.md +20 -2
  2. package/console/components/app.ts +2 -0
  3. package/console/components/fleet.ts +14 -1
  4. package/console/components/machine-pane.ts +41 -2
  5. package/console/main.ts +13 -1
  6. package/console/store.ts +102 -6
  7. package/console/style.css +21 -0
  8. package/docs/agents-block.md +5 -0
  9. package/docs/concepts/agents-and-turns.md +478 -0
  10. package/docs/concepts/architecture.md +243 -0
  11. package/docs/concepts/charts.md +146 -0
  12. package/docs/concepts/composition.md +357 -0
  13. package/docs/concepts/converge.md +257 -0
  14. package/docs/concepts/durable-runs.md +189 -0
  15. package/docs/concepts/effects.md +658 -0
  16. package/docs/concepts/gates.md +208 -0
  17. package/docs/concepts/machines-and-workflows.md +298 -0
  18. package/docs/concepts/pools-and-sources.md +230 -0
  19. package/docs/concepts/secrets-and-trust.md +306 -0
  20. package/docs/concepts/the-menu.md +381 -0
  21. package/docs/concepts/workspaces.md +756 -0
  22. package/docs/get-started/a-model-decides.md +563 -0
  23. package/docs/get-started/an-agent-in-a-sandbox.md +383 -0
  24. package/docs/get-started/connect-a-model.md +248 -0
  25. package/docs/get-started/create-an-instance.md +194 -0
  26. package/docs/get-started/have-your-assistant-write-a-machine.md +993 -0
  27. package/docs/get-started/install.md +130 -0
  28. package/docs/guides/add-tools-to-the-sandbox.md +308 -0
  29. package/docs/guides/answer-a-gate.md +304 -0
  30. package/docs/guides/bind-open-parts.md +224 -0
  31. package/docs/guides/cancel-a-run.md +146 -0
  32. package/docs/guides/clean-up.md +206 -0
  33. package/docs/guides/cut-a-worktree.md +560 -0
  34. package/docs/guides/fix-a-failed-converge.md +361 -0
  35. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  36. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  37. package/docs/guides/let-an-agent-write-a-chart.md +230 -0
  38. package/docs/guides/look-inside-a-sandbox.md +177 -0
  39. package/docs/guides/mirror-the-kit-images.md +176 -0
  40. package/docs/guides/move-from-kind-to-a-shared-cluster.md +318 -0
  41. package/docs/guides/open-the-console.md +91 -0
  42. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  43. package/docs/guides/push-and-sign-a-branch.md +532 -0
  44. package/docs/guides/run-a-chart-by-name.md +270 -0
  45. package/docs/guides/run-a-command-or-call-a-url.md +587 -0
  46. package/docs/guides/run-one-worker-per-item.md +322 -0
  47. package/docs/guides/set-an-agents-access-and-dials.md +420 -0
  48. package/docs/guides/size-a-workspace.md +217 -0
  49. package/docs/guides/start-a-run-from-a-run.md +237 -0
  50. package/docs/guides/start-a-run.md +207 -0
  51. package/docs/guides/upgrade-the-kit-version.md +240 -0
  52. package/docs/guides/use-a-hosted-provider.md +214 -0
  53. package/docs/guides/use-a-local-model.md +313 -0
  54. package/docs/guides/watch-a-run.md +349 -0
  55. package/docs/guides/write-a-workflow.md +318 -0
  56. package/docs/index.md +44 -0
  57. package/docs/llms.txt +237 -0
  58. package/docs/reference/authoring-surface/agent.md +151 -0
  59. package/docs/reference/authoring-surface/answer.md +156 -0
  60. package/docs/reference/authoring-surface/arg.md +82 -0
  61. package/docs/reference/authoring-surface/basic.md +62 -0
  62. package/docs/reference/authoring-surface/bearer.md +53 -0
  63. package/docs/reference/authoring-surface/branchname.md +15 -0
  64. package/docs/reference/authoring-surface/chartschema.md +23 -0
  65. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  66. package/docs/reference/authoring-surface/command.md +206 -0
  67. package/docs/reference/authoring-surface/customize.md +64 -0
  68. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  69. package/docs/reference/authoring-surface/defineevent.md +114 -0
  70. package/docs/reference/authoring-surface/dispatch.md +126 -0
  71. package/docs/reference/authoring-surface/fail.md +96 -0
  72. package/docs/reference/authoring-surface/file.md +142 -0
  73. package/docs/reference/authoring-surface/frompick.md +277 -0
  74. package/docs/reference/authoring-surface/http.md +259 -0
  75. package/docs/reference/authoring-surface/isfailure.md +58 -0
  76. package/docs/reference/authoring-surface/isready.md +14 -0
  77. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  78. package/docs/reference/authoring-surface/open.md +105 -0
  79. package/docs/reference/authoring-surface/openbody.md +86 -0
  80. package/docs/reference/authoring-surface/paramsof.md +143 -0
  81. package/docs/reference/authoring-surface/pool.md +186 -0
  82. package/docs/reference/authoring-surface/push.md +130 -0
  83. package/docs/reference/authoring-surface/readyof.md +21 -0
  84. package/docs/reference/authoring-surface/secret.md +139 -0
  85. package/docs/reference/authoring-surface/sentby.md +83 -0
  86. package/docs/reference/authoring-surface/source.md +51 -0
  87. package/docs/reference/authoring-surface/text.md +62 -0
  88. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  89. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  90. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  91. package/docs/reference/authoring-surface/type-agentslots.md +15 -0
  92. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  93. package/docs/reference/authoring-surface/type-anyframepath.md +14 -0
  94. package/docs/reference/authoring-surface/type-anyworktreepath.md +15 -0
  95. package/docs/reference/authoring-surface/type-arg.md +19 -0
  96. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  97. package/docs/reference/authoring-surface/type-bindactors.md +14 -0
  98. package/docs/reference/authoring-surface/type-binding.md +61 -0
  99. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  100. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  101. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  102. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  103. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  104. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  105. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  106. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  107. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  108. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  109. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  110. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  111. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  112. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  113. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  114. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  115. package/docs/reference/authoring-surface/type-childat.md +12 -0
  116. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  117. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  118. package/docs/reference/authoring-surface/type-commandinput.md +20 -0
  119. package/docs/reference/authoring-surface/type-commandoptions.md +56 -0
  120. package/docs/reference/authoring-surface/type-commandoutput.md +122 -0
  121. package/docs/reference/authoring-surface/type-customize.md +111 -0
  122. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  123. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  124. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  125. package/docs/reference/authoring-surface/type-dispatchoutput.md +72 -0
  126. package/docs/reference/authoring-surface/type-doorlessinput.md +19 -0
  127. package/docs/reference/authoring-surface/type-duration.md +15 -0
  128. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  129. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  130. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  131. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  132. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  133. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  134. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  135. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  136. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  137. package/docs/reference/authoring-surface/type-failure.md +19 -0
  138. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  139. package/docs/reference/authoring-surface/type-filebody.md +37 -0
  140. package/docs/reference/authoring-surface/type-framepath.md +14 -0
  141. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  142. package/docs/reference/authoring-surface/type-hostinjectedinput.md +56 -0
  143. package/docs/reference/authoring-surface/type-httpdefinition.md +104 -0
  144. package/docs/reference/authoring-surface/type-httpfileinput.md +20 -0
  145. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  146. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  147. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  148. package/docs/reference/authoring-surface/type-httpoutput.md +95 -0
  149. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  150. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  151. package/docs/reference/authoring-surface/type-lateroutcome.md +21 -0
  152. package/docs/reference/authoring-surface/type-lends.md +38 -0
  153. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  154. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  155. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  156. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  157. package/docs/reference/authoring-surface/type-namestart.md +77 -0
  158. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +27 -0
  159. package/docs/reference/authoring-surface/type-notworktreekeys.md +12 -0
  160. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  161. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  162. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  163. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  164. package/docs/reference/authoring-surface/type-opencommandinput.md +22 -0
  165. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  166. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  167. package/docs/reference/authoring-surface/type-openof.md +12 -0
  168. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  169. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  170. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +26 -0
  171. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +27 -0
  172. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  173. package/docs/reference/authoring-surface/type-poolnextinput.md +22 -0
  174. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  175. package/docs/reference/authoring-surface/type-pushinput.md +34 -0
  176. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  177. package/docs/reference/authoring-surface/type-pushoutput.md +149 -0
  178. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  179. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  180. package/docs/reference/authoring-surface/type-reached.md +12 -0
  181. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  182. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  183. package/docs/reference/authoring-surface/type-sandboxoptions.md +84 -0
  184. package/docs/reference/authoring-surface/type-secret.md +25 -0
  185. package/docs/reference/authoring-surface/type-sender.md +19 -0
  186. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  187. package/docs/reference/authoring-surface/type-size.md +85 -0
  188. package/docs/reference/authoring-surface/type-slothandles.md +24 -0
  189. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  190. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  191. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  192. package/docs/reference/authoring-surface/type-text.md +19 -0
  193. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  194. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  195. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  196. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  197. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  198. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  199. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  200. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  201. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  202. package/docs/reference/authoring-surface/type-workspaced.md +115 -0
  203. package/docs/reference/authoring-surface/type-workspacehandles.md +22 -0
  204. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  205. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  206. package/docs/reference/authoring-surface/type-workspaceoptions.md +27 -0
  207. package/docs/reference/authoring-surface/type-worktreefound.md +16 -0
  208. package/docs/reference/authoring-surface/type-worktreeinput.md +56 -0
  209. package/docs/reference/authoring-surface/type-worktreekey.md +14 -0
  210. package/docs/reference/authoring-surface/type-worktreeoptions.md +29 -0
  211. package/docs/reference/authoring-surface/type-worktreeoutput.md +45 -0
  212. package/docs/reference/authoring-surface/type-worktreepath.md +16 -0
  213. package/docs/reference/authoring-surface/type-worktreeready.md +37 -0
  214. package/docs/reference/authoring-surface/type-worktreerefused.md +21 -0
  215. package/docs/reference/authoring-surface/workspace.md +287 -0
  216. package/docs/reference/authoring-surface/worktree.md +71 -0
  217. package/docs/reference/authoring-surface.md +217 -0
  218. package/docs/reference/cli.md +433 -0
  219. package/docs/reference/config.md +765 -0
  220. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +114 -0
  221. package/docs/reference/decisions/0002-duplex-streaming-actor.md +117 -0
  222. package/docs/reference/decisions/0004-worktree-provisioning-model.md +130 -0
  223. package/docs/reference/decisions/0005-sandbox-pod-composition.md +240 -0
  224. package/docs/reference/decisions/0006-agent-control-surface.md +50 -0
  225. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  226. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  227. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  228. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  229. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  230. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  231. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +175 -0
  232. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  233. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +271 -0
  234. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +126 -0
  235. package/docs/reference/decisions/0017-pool-over-a-source-port.md +71 -0
  236. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  237. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +287 -0
  238. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  239. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +101 -0
  240. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  241. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +175 -0
  242. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +436 -0
  243. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  244. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  245. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +245 -0
  246. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +90 -0
  247. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  248. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  249. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +193 -0
  250. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  251. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +126 -0
  252. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  253. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  254. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  255. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  256. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  257. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  258. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  259. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  260. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  261. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  262. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  263. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  264. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  265. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  266. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  267. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  268. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +238 -0
  269. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +86 -0
  270. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +123 -0
  271. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  272. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  273. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  274. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  275. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +108 -0
  276. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +427 -0
  277. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  278. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  279. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +239 -0
  280. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +82 -0
  281. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  282. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  283. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +552 -0
  284. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +458 -0
  285. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +475 -0
  286. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  287. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +334 -0
  288. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  289. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  290. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  291. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  292. package/docs/reference/decisions/0075-a-machine-cuts-a-worktree-and-the-workspace-only-clones.md +295 -0
  293. package/docs/reference/decisions/0076-an-agents-control-credential-lives-only-where-no-workspace-code-runs.md +320 -0
  294. package/docs/reference/decisions/0077-jr2-requires-landlock-on-every-sandbox-node.md +79 -0
  295. package/docs/reference/decisions.md +86 -0
  296. package/docs/reference/glossary.md +687 -0
  297. package/docs/reference/http-api.md +1386 -0
  298. package/docs/reference/machines.md +189 -0
  299. package/docs/reference/mechanism-events.md +72 -0
  300. package/docs/why.md +207 -0
  301. package/package.json +5 -3
  302. package/src/actor.ts +694 -106
  303. package/src/agent.ts +114 -38
  304. package/src/ambient.ts +3 -4
  305. package/src/assembly-checks.ts +189 -7
  306. package/src/cause.ts +234 -0
  307. package/src/chart.ts +345 -46
  308. package/src/charts.ts +43 -8
  309. package/src/config.ts +440 -178
  310. package/src/custodian.lua +17 -5
  311. package/src/custodian.ts +325 -99
  312. package/src/customize.ts +199 -49
  313. package/src/dispatch-effect.ts +945 -0
  314. package/src/door-compat.ts +217 -0
  315. package/src/durability.ts +11 -4
  316. package/src/effect-checks.ts +50 -3
  317. package/src/effect.ts +641 -128
  318. package/src/effector-wire.ts +165 -13
  319. package/src/fail.ts +222 -0
  320. package/src/harness-client.ts +587 -50
  321. package/src/harness-env.ts +33 -0
  322. package/src/held-secrets.ts +125 -16
  323. package/src/holds.ts +3 -0
  324. package/src/http-effect.ts +556 -58
  325. package/src/http.ts +480 -30
  326. package/src/index.ts +74 -82
  327. package/src/instance.ts +68 -8
  328. package/src/internal.ts +85 -0
  329. package/src/kube-client.ts +6 -3
  330. package/src/machine-doc.ts +24 -7
  331. package/src/mechanism-routes.ts +168 -0
  332. package/src/model-keys.generated.ts +53 -0
  333. package/src/model-keys.ts +42 -58
  334. package/src/names.ts +19 -6
  335. package/src/notices.ts +483 -41
  336. package/src/open-body.ts +242 -40
  337. package/src/open-effect.ts +81 -8
  338. package/src/open.ts +90 -6
  339. package/src/parts.ts +213 -30
  340. package/src/party.ts +101 -2
  341. package/src/pick.ts +497 -11
  342. package/src/pool.ts +282 -50
  343. package/src/registration.ts +133 -12
  344. package/src/repo-identity.ts +7 -3
  345. package/src/repos.ts +22 -3
  346. package/src/run-host.ts +665 -45
  347. package/src/run-output.ts +38 -0
  348. package/src/sandbox-effect.ts +457 -71
  349. package/src/sandbox-kube.ts +66 -17
  350. package/src/secret-placement.ts +59 -17
  351. package/src/server.ts +3 -0
  352. package/src/setup.ts +325 -62
  353. package/src/size.ts +121 -9
  354. package/src/snapshot-store.ts +54 -10
  355. package/src/stub-harness.ts +44 -16
  356. package/src/timers.ts +14 -1
  357. package/src/tokens.ts +107 -32
  358. package/src/vocabulary.ts +88 -14
  359. package/src/wire.ts +100 -26
  360. package/src/workspace.ts +771 -238
  361. package/src/worktree.ts +249 -0
@@ -0,0 +1,287 @@
1
+ ---
2
+ title: workspace
3
+ description: "Run a body Machine in a Sandbox: a pod of its own, with a clone of each Repo Slot."
4
+ ---
5
+
6
+ # `workspace`
7
+
8
+ Function, in `@jr2/orchestrator/src/workspace.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Workspaces and Repos.
9
+
10
+ ## Overload 1
11
+
12
+ ```ts
13
+ function workspace<
14
+ TSchema extends z.ZodObject,
15
+ TBody extends AnyStateMachine,
16
+ TSlots extends string = never,
17
+ >(
18
+ body: TBody & BodyAcceptsDoor<TBody, z.infer<TSchema>, TSlots>,
19
+ options: WorkspaceOptions<TSchema, TSlots> | NoSlotWorkspaceOptions<TSchema>,
20
+ ): WorkspaceMachine<WithoutEmptyIndex<z.infer<TSchema>>, OutputFrom<TBody>, TBody, TSlots>
21
+ ```
22
+
23
+ Run a body Machine in a Sandbox: a pod of its own, with a clone of each Repo Slot. The result is
24
+ a Machine. Register it as a Workflow, or invoke it from another Machine as
25
+ an actor slot.
26
+
27
+ When a run enters it, the Workspace makes the Sandbox and waits for room on a node, with no
28
+ deadline. It clones each Repo Slot to `/work/<slot>/default`, on the Binding's base, and makes no
29
+ Worktree: the body cuts each Worktree that it needs with `worktree()`. A slot that is only read
30
+ needs no cut. No work happens in `default/`. Then it runs the body with the run input plus
31
+ `workspace`, the handles (see [`Workspaced`](type-workspaced.md)). The Agents with Working tools and the `command` Effects in the body run in that Sandbox. An Agent
32
+ with `workspace: "none"` runs on the Instance Harness. When the body reaches a final state, the
33
+ Workspace deletes the Sandbox, and its output is the body's output. Push each branch before
34
+ then: jr2 deletes the Sandbox's commits with it.
35
+
36
+ The author chooses how many Agents work in a Workspace. Agents in one Worktree share git, as
37
+ people in one checkout do. Each coder that needs its own branch gets its own Worktree of the one
38
+ clone.
39
+
40
+ Leave out `repos` for a Workspace with no Repo Slot: its Agents and `command` Effects share
41
+ `/work`, as the steps of one job share a folder. The body's input is then `Workspaced<RunInput, never>`. An `http` Effect sends a
42
+ file of `/work` with `file(path)`. A `worktree()`, a `push`, and a `command` with an Effect secret in its
43
+ `env`, need a Repo Slot, so jr2 refuses them there. jr2 deletes `/work` with the Sandbox: send what
44
+ must stay before the body ends.
45
+
46
+ Give each run a different branch, so that two runs do not push to one branch. Make it from a
47
+ field of the run input, or from `instanceId` when the run input has no field that is different
48
+ for each run: ``branch: `fix/${context.instanceId}` `` in the input of the cut. Add
49
+ `HostInjectedInput` to the body's input type to read it. Only a root `workspace()` gets `instanceId` from jr2. A `workspace()` that a different Machine invokes gets
50
+ it only when its parent gives it.
51
+
52
+ The Sandbox is Lost when its pod is evicted or its node goes. Then the body gets the event
53
+ `workspace.lost`, and the body decides what to do. jr2 does not make the Lost Sandbox again.
54
+
55
+ When the body fails (it invokes a `fail()` slot), the Workspace deletes the Sandbox, and then the
56
+ same Failure goes up to the parent. With no parent to catch it, the run ends `failed`. When the
57
+ body has a defect (an error that is not a Failure), the run faults: it ends `error`, and the
58
+ Sandbox stays for you to inspect, until jr2's operator removes it after an idle timeout.
59
+
60
+ Give the run input to `input`, not to the body: a body with an `input` schema of its own is
61
+ refused. The types refuse a body whose input does not accept the run input plus the handles,
62
+ with the message `the body's declared input must accept the door plus the injected handles`.
63
+
64
+ It refuses, when you call it:
65
+ - a body with a state that is not final, when that state and each state above it have no
66
+ `workspace.lost` route: ``workspace(): the body "<id>" has a state "<state>" that is not final,
67
+ and no route for "workspace.lost" is on it or on a state above — jr2 sends workspace.lost to the
68
+ body when its Sandbox is gone, and with no route the run faults: route it on the body's root,
69
+ as on: { "workspace.lost": "<the state that handles it>" } (ADR-0074)``
70
+ - a body with its own `input`: ``workspace(): the body "<id>" declares its own run input, which
71
+ nothing will ever serve or enforce — the wrapper feeds the body the run input PLUS the injected
72
+ `workspace` handles, so the body's schema is not the door. Move it to the wrapper:
73
+ workspace(body, { input }) (ADR-0033).``
74
+ - an empty `image`: ``workspace(): `image` must be a non-empty string (got <value>) — either a
75
+ `file:` URL to a docker context this module ships (`import.meta.resolve("./image")`) or a
76
+ registry ref (ADR-0037).``
77
+ - an empty `repos`: ``workspace(): `repos: {}` names no Repo Slot — leave `repos` out for a
78
+ Workspace with no Repo Slot, or name a slot: `repos: { app: "https://…" }` (ADR-0051).``
79
+ - a `repos` that is not a map or `open`: ``workspace(): `repos` must be a map of Repo Slots —
80
+ `repos: { app: "https://…" }` — or `open` whole, for a map the consumer names; leave it out
81
+ for a Workspace with no Repo Slot (ADR-0051).``
82
+ - a bad Repo Slot name or value (see [`RepoSlot`](type-reposlot.md))
83
+ - a `workGroup` that is not a gid: ``workspace(): `workGroup` must be a gid (got <value>)``
84
+ - a bad `secrets` list: ``workspace(): `secrets` must be a list of distinct names from
85
+ jr2.config.ts's `secrets` list (got <value>) — secrets: ["JIRA_TOKEN"] (ADR-0059).``
86
+ - a bad `effector`: ``workspace(): `effector` is { image } — a `file:` URL to a docker context
87
+ or a registry ref (got <value>) — effector: { image: import.meta.resolve("./effector") }
88
+ (ADR-0068).``
89
+ - a `user` that is not an image or `{ image, resources? }`: ``workspace(): `user` must be a
90
+ non-empty string (an image), or { image, resources? } (got <value>) — either a `file:` URL to a
91
+ docker context this module ships (`import.meta.resolve("./image")`) or a registry ref
92
+ (ADR-0037, ADR-0060).``, or ``workspace(): user.<key> is not accepted — the User Container is {
93
+ image, resources? } (ADR-0005, ADR-0060)`` (see [`UserContainer`](type-usercontainer.md))
94
+ - a `resources` key other than `limits` or `requests`: ``workspace(): resources.<key> is not accepted — a
95
+ Size is { limits: { memory?, cpu? } } and nothing else — Agent Substrate's template size
96
+ (ADR-0060)``, or the same text for `resources.limits.<key>`. The other texts are in
97
+ [`Size`](type-size.md).
98
+
99
+ And when a run enters it, a per-run Repo Slot's mapper that gives no `url`, or a bad `ref`:
100
+ ``workspace invalid: repos.<slot> mapper returned <fields> — the mapper derives from run
101
+ input; does `jr2 run --input` carry every field this workflow's workspace() slot reads?``
102
+
103
+ **Parameters**
104
+
105
+ - `body`: The Machine to run in the Sandbox. Its input is `Workspaced<RunInput, Slots>`.
106
+ - `options` ([`WorkspaceOptions`](type-workspaceoptions.md) | [`NoSlotWorkspaceOptions`](type-noslotworkspaceoptions.md)): What the Sandbox is made of (`image`, `user`, `resources`, `effector`), the
107
+ Repo Slots it clones (`repos`), the Held secrets it can use (`secrets`), the pod's `fsGroup`
108
+ (`workGroup`), and the run input (`input`).
109
+
110
+ **Returns**: A Machine whose input is the run input and whose output is the body's output.
111
+
112
+ **Example**
113
+
114
+ ```ts
115
+ import { z } from "zod";
116
+ import {
117
+ command,
118
+ fail,
119
+ isReady,
120
+ jr2Setup,
121
+ workspace,
122
+ worktree,
123
+ type CommandOutput,
124
+ type Workspaced,
125
+ } from "@jr2/orchestrator";
126
+
127
+ const runInput = z.object({ ticket: z.string(), repo: z.string() });
128
+ type BodyInput = Workspaced<z.infer<typeof runInput>, "app" | "docs">;
129
+
130
+ // The Worktree of this run. An Agent or a command that only reads `docs` uses `/work/docs/default`.
131
+ const buildTree = (context: BodyInput) => `${context.workspace.repos.app}/build` as const;
132
+
133
+ const passed = (output: CommandOutput): boolean =>
134
+ output.outcome === "exited" && output.code === 0;
135
+
136
+ const body = jr2Setup({
137
+ types: {} as { input: BodyInput; context: BodyInput },
138
+ actors: {
139
+ cut: worktree(),
140
+ build: command(["npm", "run", "build"]),
141
+ fail: fail(),
142
+ },
143
+ }).createMachine({
144
+ id: "build",
145
+ context: ({ input }) => input,
146
+ on: { "workspace.lost": ".lost" },
147
+ initial: "cutting",
148
+ states: {
149
+ cutting: {
150
+ invoke: {
151
+ src: "cut",
152
+ input: ({ context }) => ({ path: buildTree(context), branch: `fix/${context.ticket}` }),
153
+ onDone: [{ guard: ({ event }) => isReady(event.output), target: "building" }, { target: "notCut" }],
154
+ },
155
+ },
156
+ building: {
157
+ invoke: {
158
+ src: "build",
159
+ input: ({ context }) => ({ worktree: buildTree(context) }),
160
+ onDone: [
161
+ { guard: ({ event }) => passed(event.output), target: "built" },
162
+ { target: "broken" },
163
+ ],
164
+ },
165
+ },
166
+ built: { type: "final" },
167
+ broken: { invoke: { src: "fail", input: { reason: "npm run build did not pass" } } },
168
+ notCut: { invoke: { src: "fail", input: { reason: "the Worktree was not cut" } } },
169
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
170
+ },
171
+ });
172
+
173
+ export const machine = workspace(body, {
174
+ input: runInput,
175
+ image: "docker.io/library/node:24",
176
+ resources: { limits: { memory: "4Gi", cpu: "2" } },
177
+ repos: {
178
+ app: ({ input }) => input.repo,
179
+ docs: { url: "https://github.com/you/docs.git", ref: "main" },
180
+ },
181
+ });
182
+ ```
183
+
184
+ **Example**
185
+
186
+ ```ts
187
+ import { z } from "zod";
188
+ import {
189
+ command,
190
+ fail,
191
+ isReady,
192
+ jr2Setup,
193
+ workspace,
194
+ worktree,
195
+ type CommandOutput,
196
+ type HostInjectedInput,
197
+ type Workspaced,
198
+ } from "@jr2/orchestrator";
199
+
200
+ const passed = (output: CommandOutput): boolean =>
201
+ output.outcome === "exited" && output.code === 0;
202
+
203
+ // The run input has no field that is different for each run, so the branch comes from
204
+ // `instanceId`.
205
+ const runInput = z.object({});
206
+ type BodyInput = Workspaced<z.infer<typeof runInput> & HostInjectedInput, "app">;
207
+
208
+ const nightlyTree = (context: BodyInput) => `${context.workspace.repos.app}/nightly` as const;
209
+
210
+ const body = jr2Setup({
211
+ types: {} as { input: BodyInput; context: BodyInput },
212
+ actors: { cut: worktree(), test: command(["npm", "test"]), fail: fail() },
213
+ }).createMachine({
214
+ id: "nightly",
215
+ context: ({ input }) => input,
216
+ on: { "workspace.lost": ".lost" },
217
+ initial: "cutting",
218
+ states: {
219
+ cutting: {
220
+ invoke: {
221
+ src: "cut",
222
+ input: ({ context }) => ({ path: nightlyTree(context), branch: `nightly/${context.instanceId}` }),
223
+ onDone: [{ guard: ({ event }) => isReady(event.output), target: "testing" }, { target: "notCut" }],
224
+ },
225
+ },
226
+ testing: {
227
+ invoke: {
228
+ src: "test",
229
+ input: ({ context }) => ({ worktree: nightlyTree(context) }),
230
+ onDone: [
231
+ { guard: ({ event }) => passed(event.output), target: "tested" },
232
+ { target: "red" },
233
+ ],
234
+ },
235
+ },
236
+ tested: { type: "final" },
237
+ red: { invoke: { src: "fail", input: { reason: "npm test did not pass" } } },
238
+ notCut: { invoke: { src: "fail", input: { reason: "the Worktree was not cut" } } },
239
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
240
+ },
241
+ });
242
+
243
+ export const machine = workspace(body, {
244
+ input: runInput,
245
+ image: "docker.io/library/node:24",
246
+ repos: { app: "https://github.com/you/app.git" },
247
+ });
248
+ ```
249
+
250
+ **See also**
251
+
252
+ - [Workspaces](../../concepts/workspaces.md)
253
+ - [Write a Workflow](../../guides/write-a-workflow.md)
254
+ - [Size a Workspace](../../guides/size-a-workspace.md)
255
+ - [Add tools to the Sandbox](../../guides/add-tools-to-the-sandbox.md)
256
+ - [ADR-0012: `workspace()` wraps a body Machine and owns only Sandbox lifecycle](../decisions/0012-workspace-wrapper-machine.md)
257
+ - [ADR-0051: A Repo is a slot on the `workspace()` and a cache on the node](../decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md)
258
+
259
+ ## Overload 2
260
+
261
+ ```ts
262
+ function workspace<
263
+ TBody extends AnyStateMachine,
264
+ TSlots extends string = never,
265
+ TInput = DoorlessInput<TBody>,
266
+ >(
267
+ body: TBody & BodyAcceptsSlots<TBody, TSlots>,
268
+ options: PermissiveWorkspaceOptions<TSlots, Exclude<TInput, undefined>> | PermissiveNoSlotWorkspaceOptions,
269
+ ): WorkspaceMachine<TInput, OutputFrom<TBody>, TBody, TSlots>
270
+ ```
271
+
272
+ Run a body Machine in a Sandbox, with no `input` schema: the Workspace starts with any input. Use
273
+ it for a Workspace that a Pool or another Machine starts. `workspace` tells the rest, and
274
+ what it refuses.
275
+
276
+ **Parameters**
277
+
278
+ - `body`: The Machine to run in the Sandbox. Its input is the input of the Workspace plus
279
+ `workspace`, the handles.
280
+ - `options` ([`PermissiveWorkspaceOptions`](type-permissiveworkspaceoptions.md) | [`PermissiveNoSlotWorkspaceOptions`](type-permissivenoslotworkspaceoptions.md)): The options of the Sandbox. There is no `input`.
281
+
282
+ **Returns**: A Machine whose input is the run input and whose output is the body's output.
283
+
284
+ **See also**
285
+
286
+ - [Workspaces](../../concepts/workspaces.md)
287
+ - [ADR-0033: A Machine declares the input that starts it](../decisions/0033-a-machine-declares-the-input-that-starts-it.md)
@@ -0,0 +1,71 @@
1
+ ---
2
+ title: worktree
3
+ description: "Make a `worktree` Effect: it cuts a Worktree of a Repo Slot, or reads the one that is there."
4
+ ---
5
+
6
+ # `worktree`
7
+
8
+ Function, in `@jr2/orchestrator/src/worktree.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ```ts
11
+ function worktree(options: WorktreeOptions = {}): EffectLogic<WorktreeInput, WorktreeOutput>
12
+ ```
13
+
14
+ Make a `worktree` Effect: it cuts a Worktree of a Repo Slot, or reads the one that is there. Put it
15
+ in `actors`, and invoke it from a `workspace()` body.
16
+
17
+ With `{ path, branch, from? }`, the branch resolves in this order, after a fetch: a local branch;
18
+ `origin/<branch>`, tracked; a new branch from `from` or the Binding's base, with no upstream. With
19
+ `{ path, detach }`, the Worktree is forced to that commit and cleaned, each time. `path` is exactly
20
+ `/work/<slot>/<name>`. Each outcome is output: `ready`, `refused`, `unknown`.
21
+
22
+ `expect` says if the branch can exist: `worktree({ expect: "new" })` refuses a branch that exists,
23
+ and `worktree({ expect: "existing" })` refuses a branch that does not exist. A run cannot change it.
24
+
25
+ A cut needs a Repo Slot. Under a Workspace with no Repo Slot, `jr2 up` refuses it, and the invoke
26
+ fails with `worktree "<slot>" runs under a Workspace with no Repo Slot: a cut makes a Worktree of a
27
+ Repo Slot, and there is none — declare one: repos: { app: "<url>" } (ADR-0075)`.
28
+
29
+ **Parameters**
30
+
31
+ - `options` ([`WorktreeOptions`](type-worktreeoptions.md)): Optional. `expect`, and `timeout`, how long the fetch and the cut can take.
32
+ Default: `"10m"`.
33
+
34
+ **Returns**: The actor logic of the Effect's slot. Its output is a [`WorktreeOutput`](type-worktreeoutput.md).
35
+
36
+ **Example**
37
+
38
+ ```ts
39
+ import { fail, isReady, jr2Setup, worktree, type Workspaced } from "@jr2/orchestrator";
40
+
41
+ type BodyInput = Workspaced<{ branch: string }, "app">;
42
+ const tree = (context: BodyInput) => `${context.workspace.repos.app}/fix` as const;
43
+
44
+ export const body = jr2Setup({
45
+ types: {} as { input: BodyInput; context: BodyInput },
46
+ actors: { cut: worktree({ expect: "new" }), fail: fail() },
47
+ }).createMachine({
48
+ context: ({ input }) => input,
49
+ on: { "workspace.lost": ".notCut" },
50
+ initial: "cutting",
51
+ states: {
52
+ cutting: {
53
+ invoke: {
54
+ src: "cut",
55
+ input: ({ context }) => ({ path: tree(context), branch: context.branch }),
56
+ // The last arm has no guard: it takes `refused`, `unknown` and each later outcome.
57
+ onDone: [{ guard: ({ event }) => isReady(event.output), target: "done" }, { target: "notCut" }],
58
+ },
59
+ },
60
+ done: { type: "final" },
61
+ notCut: { invoke: { src: "fail", input: { reason: "the Worktree was not cut" } } },
62
+ },
63
+ });
64
+ ```
65
+
66
+ **See also**
67
+
68
+ - [Cut a Worktree](../../guides/cut-a-worktree.md)
69
+ - [Workspaces](../../concepts/workspaces.md)
70
+ - [Effects](../../concepts/effects.md)
71
+ - [ADR-0075: A Machine cuts a Worktree, and the Workspace only clones](../decisions/0075-a-machine-cuts-a-worktree-and-the-workspace-only-clones.md)
@@ -0,0 +1,217 @@
1
+ ---
2
+ title: Authoring surface
3
+ description: "Every name that @jr2/orchestrator exports from its root, by group, with a link to its page: its signature, its TSDoc, and an example."
4
+ ---
5
+
6
+ # Authoring surface
7
+
8
+ The [Authoring surface](glossary.md#authoring-surface) is every name that `@jr2/orchestrator` exports from its root, and nothing else: a workflow module and `jr2.config.ts` import only these names. The groups and their order are those of the root's `src/index.ts`. This page gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in `authoring-surface/`, with the file that declares it, its signature, and its TSDoc.
9
+
10
+ ## Machine and events
11
+
12
+ The setup a workflow writes its Machine with, the events its parties send, and the guard that makes a writing decline other senders ([ADR-0011](decisions/0011-workflow-defined-events.md), [ADR-0015](decisions/0015-authoring-surface-absorbs-the-mechanism.md)).
13
+
14
+ - [`defineEvent`](authoring-surface/defineevent.md) (function): Define one workflow event: an event that an Agent or the caller of a Gate may send into your Machine.
15
+ - [`jr2Setup`](authoring-surface/jr2setup.md) (function): Set up a Machine that takes workflow events: the jr2 form of xstate's `setup()`.
16
+ - [`sentBy`](authoring-surface/sentby.md) (function): A guard that is true for an event that one party sent, and false for an event that another party sent: `guard: sentBy("coder")`.
17
+ - [`HostInjectedInput`](authoring-surface/type-hostinjectedinput.md) (type): The fields that jr2 adds to the input of the Machine that a run starts, beside the input that the caller sent.
18
+
19
+ ## Failure
20
+
21
+ The Part a Machine invokes to fail its run, and the guard that tells a Failure from a defect in an `onError` ([ADR-0073](decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md)).
22
+
23
+ - [`fail`](authoring-surface/fail.md) (function): Fail the run: the Part a Machine invokes to end work that did not succeed.
24
+ - [`isFailure`](authoring-surface/isfailure.md) (function): Is this error a Failure, which a state invoked `fail` to make?
25
+
26
+ ## Agents
27
+
28
+ An Agent slot and the definition it carries ([ADR-0028](decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md), [ADR-0049](decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md)).
29
+
30
+ - [`agent`](authoring-surface/agent.md) (function): Make an Agent: an actor slot that runs one Turn of a model each time a state invokes it.
31
+ - [`AgentDefinition`](authoring-surface/type-agentdefinition.md) (type): An Agent's definition: which model it runs, its instructions, and what it may do to the Workspace.
32
+ - [`ThinkingLevel`](authoring-surface/type-thinkinglevel.md) (type): How hard the model thinks before it answers: `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"` or `"xhigh"`.
33
+
34
+ ## Workspaces and Repos
35
+
36
+ A Sandbox and the Repo Slots it binds ([ADR-0012](decisions/0012-workspace-wrapper-machine.md), [ADR-0051](decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md)).
37
+
38
+ - [`workspace`](authoring-surface/workspace.md) (function): Run a body Machine in a Sandbox: a pod of its own, with a clone of each Repo Slot.
39
+ - [`Workspaced`](authoring-surface/type-workspaced.md) (type): The input of a `workspace()` body: the run input, plus `workspace`, the handles that the Workspace adds (`workspace.repos`, the folder of each Repo Slot).
40
+ - [`Binding`](authoring-surface/type-binding.md) (type): The repository of a Repo Slot: `{ url, ref }`.
41
+ - [`RepoSlot`](authoring-surface/type-reposlot.md) (type): The value of one Repo Slot in `workspace({ repos })`.
42
+
43
+ ## Effects
44
+
45
+ Work a Machine does outside itself, as an actor slot ([ADR-0067](decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md), [ADR-0068](decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md), [ADR-0071](decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md)), and what an author writes between a pick and that work.
46
+
47
+ - [`arg`](authoring-surface/arg.md) (constant): Mark one argv entry of a `command` that the input of the Effect fills.
48
+ - [`CommandOutput`](authoring-surface/type-commandoutput.md) (type): The output of a `command` Effect: what the `onDone` of its state gets as `event.output`.
49
+ - [`LaterOutcome`](authoring-surface/type-lateroutcome.md) (type): A value of `outcome` that this kit does not give.
50
+ - [`command`](authoring-surface/command.md) (function): Make a `command` Effect: an actor slot that runs one program in the Workspace's Sandbox when a state invokes it.
51
+ - [`basic`](authoring-surface/basic.md) (function): Make the `auth` of an `http` Effect that sends `Authorization: Basic <value>`, where the value is the base64 of `user:password`.
52
+ - [`bearer`](authoring-surface/bearer.md) (function): Make the `auth` of an `http` Effect that sends `Authorization: Bearer <value>`, with the value of an Effect secret.
53
+ - [`file`](authoring-surface/file.md) (function): Make a Worktree file the body of an `http` Effect: `body: file("dist/report.pdf")`.
54
+ - [`http`](authoring-surface/http.md) (function): Make an `http` Effect: a call to a URL, with Effect secrets that the Agent never reads.
55
+ - [`secret`](authoring-surface/secret.md) (function): Name an Effect secret: `secret("jira")`.
56
+ - [`text`](authoring-surface/text.md) (function): Make a string from literal text and Effect secrets, as a tagged template: `` text`Token ${secret("x")}` ``.
57
+ - [`HttpOutput`](authoring-surface/type-httpoutput.md) (type): The output of an `http` Effect: what the `onDone` of its state gets as `event.output`.
58
+ - [`push`](authoring-surface/push.md) (function): Make a `push` Effect: it pushes the branch of a Worktree to the Binding of its Repo Slot.
59
+ - [`PushOutput`](authoring-surface/type-pushoutput.md) (type): The output of a `push` Effect: what the `onDone` of its state gets as `event.output`.
60
+ - [`branchName`](authoring-surface/branchname.md) (constant): A kit schema for a pick param that names a branch.
61
+ - [`isReady`](authoring-surface/isready.md) (constant): Is it `ready`?
62
+ - [`readyOf`](authoring-surface/readyof.md) (function): The `ready` output of an `onDone` arm that `isReady` guards.
63
+ - [`worktree`](authoring-surface/worktree.md) (function): Make a `worktree` Effect: it cuts a Worktree of a Repo Slot, or reads the one that is there.
64
+ - [`AnyFramePath`](authoring-surface/type-anyframepath.md) (type): A Turn's Frame: a Worktree, or `/work`, stated.
65
+ - [`AnyWorktreePath`](authoring-surface/type-anyworktreepath.md) (type): A Worktree of any Repo Slot: what a kit factory states, before `jr2Setup` narrows it to the slots of the body.
66
+ - [`FramePath`](authoring-surface/type-framepath.md) (type): A Turn's Frame in a Workspace with the Repo Slots `S`.
67
+ - [`WorktreeFound`](authoring-surface/type-worktreefound.md) (type): What a cut found: `held`, a cut made this Worktree earlier, so what is in it is earlier work; `local`, a local branch; `remote`, `origin/<branch>`, now tracked; `none`, a new branch with no upstream; `commit`, a detached cut.
68
+ - [`WorktreeInput`](authoring-surface/type-worktreeinput.md) (type): The input of a `worktree()`: a branch Worktree, or a detached one.
69
+ - [`WorktreeOptions`](authoring-surface/type-worktreeoptions.md) (type): The options of `worktree()`.
70
+ - [`WorktreeOutput`](authoring-surface/type-worktreeoutput.md) (type): The output of a `worktree()`.
71
+ - [`WorktreePath`](authoring-surface/type-worktreepath.md) (type): A Worktree of the Repo Slots `S`.
72
+ - [`WorktreeReady`](authoring-surface/type-worktreeready.md) (type)
73
+ - [`WorktreeRefused`](authoring-surface/type-worktreerefused.md) (type): No Worktree, and nothing changed: a bad path, a name git or the push refuses, a re-cut that does not agree with the first, a branch that another Worktree holds, an `expect` that does not hold, or a name that the remote cannot confirm.
74
+ - [`dispatch`](authoring-surface/dispatch.md) (function): Make a `dispatch` Effect: it starts a run of a Workflow.
75
+ - [`DispatchOutput`](authoring-surface/type-dispatchoutput.md) (type): The output of a `dispatch` Effect.
76
+ - [`answer`](authoring-surface/answer.md) (function): Set what the Agent reads when jr2 answers its pick.
77
+ - [`fromPick`](authoring-surface/frompick.md) (function): Make the `input` of the invoke of a state that a pick enters: the params of the pick go to the input of the invoked actor by name.
78
+ - [`paramsOf`](authoring-surface/paramsof.md) (function): Read the params of a pick from the event that entered the state.
79
+
80
+ ## Composition
81
+
82
+ A part left Open, a Machine's parts retuned, a Pool over a Source ([ADR-0017](decisions/0017-pool-over-a-source-port.md), [ADR-0049](decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md), [ADR-0054](decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md), [ADR-0060](decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md)).
83
+
84
+ - [`open`](authoring-surface/open.md) (constant): Leave a part of a Machine Open: for the Instance that registers the Machine to bind with `customize()`.
85
+ - [`customize`](authoring-surface/customize.md) (function): Retune the parts that a Machine carries, without a change to the module that exports it.
86
+ - [`Customize`](authoring-surface/type-customize.md) (type): The parts of one Machine that `customize()` can retune: its Agents, its Open Effects, the Machines it composes, and the Sandbox of its `workspace()`.
87
+ - [`EffectBinding`](authoring-surface/type-effectbinding.md) (type): The values that bind the Open parts of one Effect.
88
+ - [`Size`](authoring-surface/type-size.md) (type): The Size of a Workspace: the most memory and cpu that its whole Sandbox can use.
89
+ - [`UserContainer`](authoring-surface/type-usercontainer.md) (type): The User Container in its object form: its image, and its part of the Workspace's Size.
90
+ - [`pool`](authoring-surface/pool.md) (function): Make a Pool: a Machine that runs one worker Machine for each item that a Source gives, with at most `cap` workers at once.
91
+ - [`source`](authoring-surface/source.md) (function): Declare a Source: where a `pool()` gets its work items, one at a time.
92
+ - [`PoolNextInput`](authoring-surface/type-poolnextinput.md) (type): The input of a Source's `next`: the ids of the items that workers have now, the ids of the items that settled, and the Pool's input.
93
+
94
+ ## Charts
95
+
96
+ The Open body a Chart wrapper places in `actors`, and the grammar a planner's pick declares, whole or narrowed to one wrapper ([ADR-0070](decisions/0070-a-machine-lends-its-parts-to-a-chart.md)).
97
+
98
+ - [`openBody`](authoring-surface/openbody.md) (function): Make an Open body: the actor slot that a Chart binds.
99
+ - [`OpenBodyDeclaration`](authoring-surface/type-openbodydeclaration.md) (type): What an Open body declares: the parts that it lends a Chart, what the Agents of a Chart can have, and the limits of a Chart.
100
+ - [`OpenBodyOutput`](authoring-surface/type-openbodyoutput.md) (type): The output of an Open body.
101
+ - [`chartSchema`](authoring-surface/chartschema.md) (constant): The Chart grammar, as a zod schema.
102
+ - [`chartSchemaFor`](authoring-surface/chartschemafor.md) (function): The Chart grammar for one Open body, as a zod schema.
103
+
104
+ ## Config
105
+
106
+ `jr2.config.ts`, the deployment facts a Machine cannot carry ([ADR-0050](decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md)).
107
+
108
+ - [`defineConfig`](authoring-surface/defineconfig.md) (function): Declare the config of an Instance: the default export of `jr2.config.ts`.
109
+ - [`JR2Config`](authoring-surface/type-jr2config.md) (type): The shape of `jr2.config.ts`: the deployment facts of an Instance, which a Machine cannot carry.
110
+
111
+ ## Types these signatures name
112
+
113
+ The signature of an export, or a type here, names each of these types. They are not exports of `@jr2/orchestrator`, so a workflow module does not import them by name.
114
+
115
+ - [`EventSemantics`](authoring-surface/type-eventsemantics.md): How the party that sends an event gets its answer.
116
+ - [`EventAudience`](authoring-surface/type-eventaudience.md): Who may send an event: `"agent"` (an Agent, as a pick from its Menu), `"external"` (the caller of a Gate), or `"any"` (both).
117
+ - [`EventDef`](authoring-surface/type-eventdef.md): A workflow event, as `defineEvent` gives it back: plain, frozen data and a zod schema, safe to import anywhere.
118
+ - [`WorkflowEvent`](authoring-surface/type-workflowevent.md): The type of `event` in a Machine that `jr2Setup` makes: each workflow event in its `events`, and each Mechanism event.
119
+ - [`FailSlot`](authoring-surface/type-failslot.md): The logic `fail()` returns: `failLogic` with the brand the walk reads.
120
+ - [`Failure`](authoring-surface/type-failure.md): A Failure as `isFailure` narrows an error to it: the payload's fields, on the error itself.
121
+ - [`AgentDeclaration`](authoring-surface/type-agentdeclaration.md): What `agent()` takes: an `AgentDefinition`, except that `model` can also be `open`.
122
+ - [`WorkspaceAccess`](authoring-surface/type-workspaceaccess.md): What an Agent may do to the Workspace: `"write"`, `"read"` or `"none"`.
123
+ - [`WorkspaceOptions`](authoring-surface/type-workspaceoptions.md): The options of a `workspace()` that declares the input that starts a run.
124
+ - [`NoSlotWorkspaceOptions`](authoring-surface/type-noslotworkspaceoptions.md): The options of a `workspace()` with no Repo Slot that declares the input that starts a run.
125
+ - [`WithoutEmptyIndex`](authoring-surface/type-withoutemptyindex.md): The fields of the run input `T`.
126
+ - [`PermissiveWorkspaceOptions`](authoring-surface/type-permissiveworkspaceoptions.md): The options of a `workspace()` with no `input`: it starts with any input.
127
+ - [`PermissiveNoSlotWorkspaceOptions`](authoring-surface/type-permissivenoslotworkspaceoptions.md): The options of a `workspace()` with no Repo Slot and no `input`: it starts with any input.
128
+ - [`WorkspaceHandles`](authoring-surface/type-workspacehandles.md): What the body of a `workspace()` gets as `input.workspace`: the folder of each Repo Slot.
129
+ - [`ExecOutcome`](authoring-surface/type-execoutcome.md): How an exec ended.
130
+ - [`Unknown`](authoring-surface/type-unknown.md): The output `{ outcome: "unknown", reason }`: the Effect may have acted, and jr2 cannot tell.
131
+ - [`Arg`](authoring-surface/type-arg.md): One entry of a command's argv that the input of the Effect fills, as `arg("name")` makes it.
132
+ - [`CommandOptions`](authoring-surface/type-commandoptions.md): 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.
133
+ - [`CommandInput`](authoring-surface/type-commandinput.md): A command's input: one string per argv slot, and with `pin` the approved commit (`{ sha }`); none when there is neither.
134
+ - [`OpenCommandInput`](authoring-surface/type-opencommandinput.md): The input of a `command(open)`: a string for each `arg()` of the argv that the Instance binds, and with `pin`, the commit (`{ sha }`).
135
+ - [`Secret`](authoring-surface/type-secret.md): What `secret("name")` gives: an Effect secret, by its name in the `secrets` list of `jr2.config.ts`.
136
+ - [`Text`](authoring-surface/type-text.md): What the `text` template gives: a string of literal text and Effect secrets, in order.
137
+ - [`FromInput`](authoring-surface/type-frominput.md): A value of a file body's part: as written, or from the Effect's input.
138
+ - [`FileBody`](authoring-surface/type-filebody.md): `file(path, { segments?, contentType? })`: a Worktree file as an `http` body.
139
+ - [`HttpDefinition`](authoring-surface/type-httpdefinition.md): An `http` Effect's definition.
140
+ - [`HttpFileInput`](authoring-surface/type-httpfileinput.md): The input of an `http` Effect with a Worktree file as its body.
141
+ - [`OpenSecret`](authoring-surface/type-opensecret.md): `secret(open)`: a secret a packaged Machine names in its auth, a header or a command's env, and leaves for its composer to name (ADR-0054).
142
+ - [`PushOptions`](authoring-surface/type-pushoptions.md): The options of `push()`.
143
+ - [`PushInput`](authoring-surface/type-pushinput.md): The input of a `push` Effect: the Worktree that a cut made, `{ sha }` with `pin`, and `{ message }` with `squash`.
144
+ - [`Duration`](authoring-surface/type-duration.md): A length of time: a positive number and a unit, `s`, `m` or `h`.
145
+ - [`NameStart`](authoring-surface/type-namestart.md): What a Worktree's name may start with: neither `.` nor `-`, and not the end of the path.
146
+ - [`DispatchDefinition`](authoring-surface/type-dispatchdefinition.md): The definition of a `dispatch` Effect (ADR-0071).
147
+ - [`DispatchInput`](authoring-surface/type-dispatchinput.md): A dispatch's input: the run's body — the slot's schema's type, or any JSON object.
148
+ - [`DispatchOpenParts`](authoring-surface/type-dispatchopenparts.md): The Open part a dispatch definition states: its target, when it is `open`.
149
+ - [`ChainLink`](authoring-surface/type-chainlink.md): One reply since the pick, as the author reads it: an invoked actor's output, typed by its slot (`src`); or an event that answered a state below the Agent's — a Gate's answer, a nested Agent's pick — typed by the Machine's events.
150
+ - [`Quantity`](authoring-surface/type-quantity.md): A Kubernetes quantity: `"2Gi"`, `"1500m"`, `"2"`, or a plain number (`2` cpus, bytes of memory).
151
+ - [`PoolSpec`](authoring-surface/type-poolspec.md): What you pass to `pool()`: where the items come from, how many workers run at once, and what each worker gets.
152
+ - [`SourceSpec`](authoring-surface/type-sourcespec.md): Where a Pool gets its work items: the Source.
153
+ - [`OpenBodyLogic`](authoring-surface/type-openbodylogic.md): The logic `openBody()` returns: actor logic that carries the brand.
154
+ - [`Lends`](authoring-surface/type-lends.md): The parts of the Chart wrapper that a Chart can use, by their keys in `actors`, `guards`, `actions` and `delays`.
155
+ - [`Ceilings`](authoring-surface/type-ceilings.md): The limits that an Open body sets on its Chart.
156
+ - [`ChartText`](authoring-surface/type-charttext.md): The Chart text (ADR-0070).
157
+ - [`Sender`](authoring-surface/type-sender.md): Who delivered an event: an Agent by its slot, or a Gate by its invoke id (ADR-0015).
158
+ - [`FailureInput`](authoring-surface/type-failureinput.md): What a Failure carries: `reason`, text for a person, and `detail`, optional JSON for a machine reader.
159
+ - [`SandboxOptions`](authoring-surface/type-sandboxoptions.md): The options of a `workspace()` that say what its Sandbox is made of and which Repos it clones.
160
+ - [`SlotHandles`](authoring-surface/type-slothandles.md): The handles of a Workspace that declares Repo Slots.
161
+ - [`CommandEnv`](authoring-surface/type-commandenv.md): 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.
162
+ - [`TextPart`](authoring-surface/type-textpart.md): One part of a `Text`: `{ text }`, literal text, or `{ secret }`, the name of an Effect secret.
163
+ - [`HttpMethod`](authoring-surface/type-httpmethod.md): The method of an `http` Effect: `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE` or `OPTIONS`.
164
+ - [`HttpRequestParts`](authoring-surface/type-httprequestparts.md): What the `request` of an `http` definition returns: the part of the request that changes for each run.
165
+ - [`NamedSecret`](authoring-surface/type-namedsecret.md): A named secret, never `secret(open)`: where a definition's Open part is a whole that holds a secret — a dispatch's target (ADR-0071) — the secret is bound with it, to a name, so the mark `secret(open)` carries may not be present.
166
+ - [`SourceNextResult`](authoring-surface/type-sourcenextresult.md): What the `next` of a Source resolves to: an item, to claim it; `null`, when no item is ready now; or `{ item, open }`, where `open` is the number of items that exist but are not ready.
167
+ - [`OpenBodySlot`](authoring-surface/type-openbodyslot.md): The brand an Open body slot carries, as `definition` marks an Agent slot (ADR-0049).
168
+ - [`ChartJson`](authoring-surface/type-chartjson.md): Plain JSON.
169
+ - [`ChartEvent`](authoring-surface/type-chartevent.md): An event a Chart mints: its payload is a JSON Schema object, built into zod at admission.
170
+ - [`ChartAgent`](authoring-surface/type-chartagent.md): An Agent a Chart mints: the plain fields of an Agent definition (ADR-0049).
171
+ - [`ChartState`](authoring-surface/type-chartstate.md): A state node.
172
+ - [`ChartValue`](authoring-surface/type-chartvalue.md): A value whose strings may hold `{{<root>.<path>}}` placeholders and whose objects may be `{ "$ref": "<root>.<path>" }`.
173
+ - [`ChartInvoke`](authoring-surface/type-chartinvoke.md): An invoke: a lent Agent, Effect or Machine, a minted Agent, or the kit's `gate` or `fail`.
174
+ - [`ChartTransitions`](authoring-surface/type-charttransitions.md): One transition or a list, in xstate's order.
175
+ - [`ChartAction`](authoring-surface/type-chartaction.md): An action.
176
+ - [`ChartTransition`](authoring-surface/type-charttransition.md): A transition: a target alone, or the object form.
177
+ - [`ChartGuard`](authoring-surface/type-chartguard.md): A guard: a lent guard by name, with or without params, `jr2.sentBy`, `jr2.failure`, or `not`/`and`/`or`.
178
+
179
+ **Type plumbing.** These types compute a type from the types of a Machine or of its parts. A workflow module does not write them. Each has a page with its declaration:
180
+
181
+ - [`ToProvidedActor`](authoring-surface/type-toprovidedactor.md)
182
+ - [`MergedActors`](authoring-surface/type-mergedactors.md)
183
+ - [`ToParameterizedObject`](authoring-surface/type-toparameterizedobject.md)
184
+ - [`BindActors`](authoring-surface/type-bindactors.md)
185
+ - [`SentByGuards`](authoring-surface/type-sentbyguards.md)
186
+ - [`AgentLogic`](authoring-surface/type-agentlogic.md)
187
+ - [`BodyAcceptsDoor`](authoring-surface/type-bodyacceptsdoor.md)
188
+ - [`WorkspaceMachine`](authoring-surface/type-workspacemachine.md)
189
+ - [`DoorlessInput`](authoring-surface/type-doorlessinput.md)
190
+ - [`BodyAcceptsSlots`](authoring-surface/type-bodyacceptsslots.md)
191
+ - [`EffectLogic`](authoring-surface/type-effectlogic.md)
192
+ - [`OpenOf`](authoring-surface/type-openof.md)
193
+ - [`EnvOpenParts`](authoring-surface/type-envopenparts.md)
194
+ - [`OpenEffect`](authoring-surface/type-openeffect.md)
195
+ - [`MarkedIf`](authoring-surface/type-markedif.md)
196
+ - [`HttpOpenParts`](authoring-surface/type-httpopenparts.md)
197
+ - [`HttpInput`](authoring-surface/type-httpinput.md)
198
+ - [`PushWireOutput`](authoring-surface/type-pushwireoutput.md)
199
+ - [`SyncState`](authoring-surface/type-syncstate.md)
200
+ - [`AnswerAction`](authoring-surface/type-answeraction.md)
201
+ - [`AgentSlots`](authoring-surface/type-agentslots.md)
202
+ - [`Reached`](authoring-surface/type-reached.md)
203
+ - [`OpenEffectSlots`](authoring-surface/type-openeffectslots.md)
204
+ - [`BindingOf`](authoring-surface/type-bindingof.md)
205
+ - [`LogicAt`](authoring-surface/type-logicat.md)
206
+ - [`ChildSlots`](authoring-surface/type-childslots.md)
207
+ - [`ChildAt`](authoring-surface/type-childat.md)
208
+ - [`RepoSlotsOf`](authoring-surface/type-reposlotsof.md)
209
+ - [`WorkspaceOf`](authoring-surface/type-workspaceof.md)
210
+ - [`PoolMachine`](authoring-surface/type-poolmachine.md)
211
+ - [`EventFrom`](authoring-surface/type-eventfrom.md)
212
+ - [`ArgNames`](authoring-surface/type-argnames.md)
213
+ - [`WorktreeKey`](authoring-surface/type-worktreekey.md)
214
+ - [`NotWorktreeKeys`](authoring-surface/type-notworktreekeys.md)
215
+ - [`OpenSecretMark`](authoring-surface/type-opensecretmark.md)
216
+
217
+ These names come from a dependency: from `zod`, `z.ZodObject`, `z.infer`, `z.ZodType`; from `xstate`, `MachineContext`, `UnknownActorLogic`, `ParameterizedObject`, `NonReducibleUnknown`, `EventObject`, `MetaObject`, `ActionFunction`, `GuardPredicate`, `DelayConfig`, `SetupReturn`, `AnyStateMachine`, `OutputFrom`, `ProvidedActor`, `AnyActorRef`, `InputFrom`, `PromiseActorLogic`.