@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,322 @@
1
+ ---
2
+ title: Run one worker per item
3
+ description: Make a Pool that runs one worker Machine for each item that a Source gives, and run it.
4
+ ---
5
+
6
+ # Run one worker per item
7
+
8
+ Make a [Workflow](../reference/glossary.md#workflow) that runs one worker [Machine](../reference/glossary.md#machine)
9
+ for each item of work, with [`pool()`](../reference/authoring-surface/pool.md) and
10
+ [`source()`](../reference/authoring-surface/source.md).
11
+
12
+ In this example, the items are the open issues of a GitHub [Repo](../reference/glossary.md#repo) that have the label
13
+ `jr2`. The worker is the shipped Machine [`task`](../reference/machines.md#task). Each worker works on one issue in its
14
+ own [Sandbox](../reference/glossary.md#sandbox). Then it waits at a [Gate](../reference/glossary.md#gate) until a person
15
+ approves its work.
16
+
17
+ ## The Workflow
18
+
19
+ The example uses `@jr2/machines`. Add it to the [Instance](../reference/glossary.md#instance) at the
20
+ [Kit version](../reference/glossary.md#kit-version). `<version>` is the version of `@jr2/orchestrator` in your
21
+ `package.json`:
22
+
23
+ ```sh
24
+ npm install --save-exact @jr2/machines@<version>
25
+ ```
26
+
27
+ Save this file as `workflows/issues.ts`. Replace `you/app` with your Repo, in the two places where it occurs.
28
+
29
+ The imports:
30
+
31
+ ```ts
32
+ import { fromPromise } from "xstate";
33
+ import { z } from "zod";
34
+ import { customize, defineEvent, pool, source, type PoolNextInput } from "@jr2/orchestrator";
35
+ import { task } from "@jr2/machines";
36
+ ```
37
+
38
+ The model of the tab:
39
+
40
+ **Anthropic**
41
+
42
+ ```ts
43
+ const model = "anthropic/claude-haiku-5-5";
44
+ ```
45
+
46
+ **Local**
47
+
48
+ ```ts
49
+ const model = "local/qwen3.6-35b-a3b";
50
+ ```
51
+
52
+ The [Source](../reference/glossary.md#source), the worker and the [Pool](../reference/glossary.md#pool):
53
+
54
+ ```ts
55
+ // One work item: an open issue of the Repo.
56
+ type Issue = { number: number; title: string; body: string };
57
+
58
+ // The open issues with the label `jr2`: the first page only, at most 100. The Repo must be public,
59
+ // because the request has no token.
60
+ const ISSUES = "https://api.github.com/repos/you/app/issues?labels=jr2&state=open&per_page=100";
61
+
62
+ // The Source: give the next open issue that no worker has had.
63
+ const issues = source<Issue>({
64
+ next: fromPromise<Issue | null, PoolNextInput>(async ({ input }) => {
65
+ const res = await fetch(ISSUES, { headers: { accept: "application/vnd.github+json" } }).catch(() => undefined);
66
+ if (!res?.ok) {
67
+ // While workers run, look again later. With no worker, stop the run with the error.
68
+ if (input.active.length > 0) return null;
69
+ throw new Error(`GET ${ISSUES} failed: ${res ? res.status : "no answer"}`);
70
+ }
71
+ const open = (await res.json()) as Array<{
72
+ number: number;
73
+ title: string;
74
+ body: string | null;
75
+ pull_request?: unknown;
76
+ }>;
77
+ // The issues API also lists pull requests. Skip them, and skip each issue that a worker has now
78
+ // or that a worker finished.
79
+ const taken = [...input.active, ...input.settled];
80
+ const issue = open.find((i) => i.pull_request === undefined && !taken.includes(`issue-${i.number}`));
81
+ if (!issue) return null;
82
+ return { number: issue.number, title: issue.title, body: issue.body ?? "" };
83
+ }),
84
+ // Send this event to the `source` Gate when you add the label to an issue.
85
+ wake: defineEvent({
86
+ name: "issues_changed",
87
+ description: "An issue got the label jr2. Look for work again.",
88
+ audience: "external",
89
+ input: z.object({}),
90
+ }),
91
+ // While workers run and no issue is ready, look again every 5 minutes.
92
+ pollEvery: 300_000,
93
+ });
94
+
95
+ // The worker: `task`, with its two Open parts bound.
96
+ const fixer = customize(task, {
97
+ repos: { app: { url: "https://github.com/you/app.git" } },
98
+ agents: { coder: { model } },
99
+ });
100
+
101
+ // The run input of the Pool. A worker does not get it.
102
+ const door = z.object({
103
+ workers: z.number().int().min(1).max(4).default(2).describe("How many issues to work on at once."),
104
+ });
105
+
106
+ // The Pool: one `fixer` for each issue, at most `workers` at once.
107
+ export const machine = pool(fixer, {
108
+ id: "issues",
109
+ input: door,
110
+ source: issues,
111
+ itemId: (issue: Issue) => `issue-${issue.number}`,
112
+ cap: ({ input }) => input.workers,
113
+ // A `task` inside a Pool needs a branch. Make one from the issue number.
114
+ itemInput: (issue: Issue) => ({
115
+ prompt: `Fix issue #${issue.number} of this Repo: ${issue.title}\n\n${issue.body}`,
116
+ branch: `jr2/issue-${issue.number}`,
117
+ }),
118
+ });
119
+ ```
120
+
121
+ The file has five parts:
122
+
123
+ - **The Source.** `next` gets the open issues from the GitHub REST API. It gives the first issue that no worker has had.
124
+ When no issue is ready, it gives `null`. The request has no token, so the Repo must be public. Without a token, GitHub
125
+ allows 60 requests in each hour. The example reads only the first page of issues: at most 100. When the request fails
126
+ while workers run, `next` gives `null` in place of the error, so that the failure does not stop the run.
127
+ - **The record of the Source.** The Source keeps no record of its own. `next` skips each issue in `active` and in
128
+ `settled`. The Pool holds both, so they stay across a restart of the
129
+ [Orchestrator](../reference/glossary.md#orchestrator). Each run of the Workflow has its own lists, so a new run can
130
+ give an issue that is still open.
131
+ - **The worker.** `fixer` is `task` with its two [Open](../reference/glossary.md#open) parts bound: the Repo and the
132
+ model of the coder. [Bind a shipped Machine's Open parts](bind-open-parts.md) tells more.
133
+ - **The run input.** `door` is the run input of the Pool. `cap` reads `workers` from it. A worker never gets it.
134
+ - **The Pool.** `itemId` gives the id of each item. `itemInput` makes the input of the worker from the item: the prompt
135
+ and the branch.
136
+
137
+ Run [`jr2 up`](../reference/cli.md#up) to converge the Instance with the new Workflow:
138
+
139
+ ```sh
140
+ jr2 up
141
+ ```
142
+
143
+ ```text
144
+ …
145
+ jr2 up — instance "my-instance" → context kind-jr2 / namespace my-instance
146
+ typecheck: tsc --noEmit (the instance's own compiler)
147
+ …
148
+ effects: workflow "issues" — what it runs outside itself (ADR-0067)
149
+ cut: worktree — 600s, in the Harness
150
+ …
151
+ failures: workflow "issues" — the states that fail the run (ADR-0073)
152
+ issues.failing: invokes fail
153
+ task.noBranch: invokes fail
154
+ task.notCut: invokes fail
155
+ task.lost: invokes fail
156
+ …
157
+ seats: workflow "issues" — who may send what, per state (ADR-0015)
158
+ task.working agent:coder: [finish]
159
+ task.review gate: [approve, request_changes]
160
+ …
161
+ agents: coder, triager (carried by 5 workflow machine(s))
162
+ …
163
+ sandbox nodes: jr2-control-plane
164
+ …
165
+ converged — `jr2 run <workflow>` when ready
166
+ ```
167
+
168
+ The first line, `…`, is the line `→ .env:`, with the keys that the CLI took from `.env`. Each `jr2` command prints it
169
+ first. The output on this page shows `…` in its place.
170
+
171
+ ## Start the run
172
+
173
+ Give the label `jr2` to one open issue or more of your Repo. With no such issue, the run ends at once, as `drained`.
174
+
175
+ Start a run in one terminal. `workers` is the largest number of issues that the run works on at the same time:
176
+
177
+ ```sh
178
+ jr2 run issues --input '{"workers":2}'
179
+ ```
180
+
181
+ ```text
182
+ …
183
+ → context kind-jr2 / namespace my-instance
184
+ run e1effd33-9bf6-4137-ae70-3aa504910784 (issues) — attached
185
+ → active "discovering"
186
+ → active "discovering"
187
+ → active "discovering"
188
+ …
189
+ ```
190
+
191
+ The examples on this page use the Instance `my-instance` in the kubectl context `kind-jr2`. Your run id, instance id and
192
+ `assembly` hash are different. Give each `jr2` command in the Instance folder. Give the commands in the next steps in a
193
+ second terminal. In them, `<run id>` is the run id, or a unique prefix of it, 4 characters or more.
194
+
195
+ [`jr2 run`](../reference/cli.md#run) stays attached until the run ends. The run ends when no issue is ready and no
196
+ worker runs.
197
+
198
+ ## Find the Gates of the workers
199
+
200
+ Run [`jr2 status`](../reference/cli.md#status):
201
+
202
+ ```sh
203
+ jr2 status <run id>
204
+ ```
205
+
206
+ ```text
207
+ …
208
+ → context kind-jr2 / namespace my-instance
209
+ {"runId":"e1effd33-9bf6-4137-ae70-3aa504910784","workflow":"issues",…,"gates":[{"gate":"source",…},{"gate":"issue-3.body.review",…},{"gate":"issue-2.body.review",…}]}
210
+ ```
211
+
212
+ In the JSON that it prints, `gates` holds each open Gate of the run:
213
+
214
+ - `source`: the Gate of the `wake` event of the Source. It is open for the whole run.
215
+ - `issue-<number>.body.review`: the `review` Gate of the worker for that issue. It opens when the coder finishes, or
216
+ when its [Turn](../reference/glossary.md#turn) fails. The id starts with the item id. `body` is the slot of the
217
+ Machine that `task` wraps.
218
+
219
+ The `meta` of a `review` Gate gives the `branch` and the `worktree` of the worker. The name of the Sandbox of a worker
220
+ holds its item id: `ws-<first 8 characters of the run id>-<item id>-<hash>`.
221
+ [Look inside a Sandbox](look-inside-a-sandbox.md) tells how to read the work before you approve it.
222
+
223
+ ## Approve the work of one worker
224
+
225
+ Push the branch before you approve. `approve` ends that worker and removes its Sandbox, and the commits that you did not
226
+ push are lost. [Look inside a Sandbox](look-inside-a-sandbox.md#push-the-branch) tells how to push.
227
+
228
+ Then send `approve` to the Gate of the worker. This example approves issue 2:
229
+
230
+ ```sh
231
+ jr2 send <run id> --gate issue-2.body.review --event approve
232
+ ```
233
+
234
+ ```text
235
+ …
236
+ → context kind-jr2 / namespace my-instance
237
+ delivered approve to gate "issue-2.body.review" on e1effd33-9bf6-4137-ae70-3aa504910784
238
+ ```
239
+
240
+ The Pool then calls `next` again, and starts a worker for the next issue.
241
+
242
+ The `review` Gate also takes `request_changes`, with `--input '{"notes":"<text>"}'`. Then the coder continues with the
243
+ notes, and the Gate opens again when it finishes. [Answer a Gate](answer-a-gate.md) gives the other ways to answer a
244
+ Gate.
245
+
246
+ ## Tell the Pool about new work
247
+
248
+ While workers run and no issue is ready, the Pool waits. When you add the label to an issue, send the `wake` event to
249
+ the `source` Gate. The Pool then calls `next` at once:
250
+
251
+ ```sh
252
+ jr2 send <run id> --gate source --event issues_changed
253
+ ```
254
+
255
+ ```text
256
+ …
257
+ → context kind-jr2 / namespace my-instance
258
+ delivered issues_changed to gate "source" on e1effd33-9bf6-4137-ae70-3aa504910784
259
+ ```
260
+
261
+ Without the event, the Pool calls `next` again when a worker finishes, or after `pollEvery`. A webhook can send the same
262
+ event with [`POST /runs/:runId/gates/:gate/events`](../reference/http-api.md#post-runs-runid-gates-gate-events).
263
+
264
+ ## The end of the run
265
+
266
+ When the last worker finishes and no issue is ready, the run ends. In the first terminal, `jr2 run` prints the last
267
+ state of the Pool, then the status of the run as JSON:
268
+
269
+ ```text
270
+ …
271
+ → active "discovering"
272
+ → done "drained"
273
+ {"runId":"e1effd33-9bf6-4137-ae70-3aa504910784","workflow":"issues","instanceId":"db9712c8-7c19-4d18-8fb1-8c01d326808f","status":"done","value":"drained","context":{"runInput":{"workers":2,"instanceId":"db9712c8-7c19-4d18-8fb1-8c01d326808f"},"cap":2,"active":[],"items":{"issue-2":{"branch":"jr2/issue-2"},"issue-3":{"branch":"jr2/issue-3"},"issue-1":{"branch":"jr2/issue-1"}},"failures":{},"status":"drained"},"children":[],"waiting":[],"held":[],"assembly":"ca3b0e760c85","output":{"status":"drained","items":{"issue-2":{"branch":"jr2/issue-2"},"issue-3":{"branch":"jr2/issue-3"},"issue-1":{"branch":"jr2/issue-1"}},"failures":{}}}
274
+ ```
275
+
276
+ In the JSON, `context.items` holds the output of each worker that finished, by item id. `context.failures` holds the
277
+ [Failure](../reference/glossary.md#failure) of each worker that failed, by item id: here, none. For this Source,
278
+ `context.status` is always `drained`, because `next` never gives `open`.
279
+ [Pools and Sources](../concepts/pools-and-sources.md#how-the-run-ends) tells what each status means.
280
+
281
+ ## Rules
282
+
283
+ - `itemId` must give each item an id of its own, and the same id each time. It is the id of the worker, the key in
284
+ `items`, and the start of the id of each Gate of the worker.
285
+ - `next` must not give an item that a worker has now. jr2 does not refuse the item when `next` gives it. A second worker
286
+ starts in the same Sandbox and the same [Worktree](../reference/glossary.md#worktree) as the first. When the two
287
+ workers register the same Gate or [Agent](../reference/glossary.md#agent), the run stops with the status `error`, and
288
+ its `fault` is `registration address "<address>" is already live (two concurrent registrations share an id)`. For
289
+ `task`, `<address>` is `gate/<run id>/<item id>.body.review` or `agent/<run id>/<item id>.body/coder`.
290
+ - `next` gets `active`, the ids of the items that workers have now, and `settled`, the ids of the finished and failed
291
+ items. It also gets `input`, the input of the Pool. To not give a finished item again, skip each id in `settled`.
292
+ - When a worker fails, for example when the Sandbox of a `task` is lost, the Pool keeps the Failure in `failures` and
293
+ goes on. Only the Sandbox of that worker is deleted. The other workers, and the work in their Sandboxes, stay. A
294
+ defect in a worker is different: the run stops with the status `error`.
295
+ - When the Pool ends with one or more failures, `drained` or `deadlocked`, the run ends `failed`, with the reason
296
+ `<n> of <m> items failed`, and `jr2 run` exits 1. The detail of the Failure is `{ status, items, failures }`. With the
297
+ option `failures: "report"`, the run ends `done`, and the failures are in its output.
298
+ - When `next` rejects, the run stops. Its status is `error`, and its `fault` is the message of the error.
299
+ - `pool()` does not carry the item type of the Source to `itemId` and `itemInput`. Write the type on their parameter, as
300
+ in `(issue: Issue)`.
301
+ - A worker gets its item, or what `itemInput` makes of it. It never gets the run input. `cap` and `itemInput` get the
302
+ run input as `{ input }`, typed by the `input` schema of the Pool.
303
+ - The Orchestrator refuses a run input that does not match the `input` schema of the Pool. `jr2 run` prints
304
+ `error: invalid input for workflow "<workflow>": <reason>`.
305
+ - A `task` inside a Pool needs `branch` in its input. Without it, the run stops with the status `error`, and its `fault`
306
+ starts with ``task: no `branch` on the door and no Instance ID to derive one from``.
307
+ - Without `cap`, one worker runs at a time. Each `task` worker has its own
308
+ [Workspace](../reference/glossary.md#workspace). Thus the run has `cap` Sandboxes or fewer at one time.
309
+ - The Pool takes the `wake` event only while it waits: workers run, and no item is ready. At other times,
310
+ [`jr2 send`](../reference/cli.md#send) refuses it:
311
+ `error: gate "source" is open, and the run does not take "<event>" now: no writing of it would move the run with this payload — not delivered (takes now: nothing)`.
312
+ - `onDrained` takes only `"final"`: the run ends.
313
+
314
+ ## Read next
315
+
316
+ - [Pools and Sources](../concepts/pools-and-sources.md)
317
+ - [Composition](../concepts/composition.md)
318
+ - [Gates](../concepts/gates.md)
319
+ - Reference: [`pool()`](../reference/authoring-surface/pool.md), [`source()`](../reference/authoring-surface/source.md),
320
+ [`PoolSpec`](../reference/authoring-surface/type-poolspec.md),
321
+ [`SourceSpec`](../reference/authoring-surface/type-sourcespec.md), [`task`](../reference/machines.md#task)
322
+ - [ADR-0017](../reference/decisions/0017-pool-over-a-source-port.md): the run loop is a Pool over a Source