@jr2/orchestrator 0.4.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) 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 +442 -0
  10. package/docs/concepts/architecture.md +230 -0
  11. package/docs/concepts/charts.md +143 -0
  12. package/docs/concepts/composition.md +357 -0
  13. package/docs/concepts/converge.md +254 -0
  14. package/docs/concepts/durable-runs.md +189 -0
  15. package/docs/concepts/effects.md +603 -0
  16. package/docs/concepts/gates.md +208 -0
  17. package/docs/concepts/machines-and-workflows.md +289 -0
  18. package/docs/concepts/pools-and-sources.md +230 -0
  19. package/docs/concepts/secrets-and-trust.md +222 -0
  20. package/docs/concepts/the-menu.md +378 -0
  21. package/docs/concepts/workspaces.md +678 -0
  22. package/docs/get-started/a-model-decides.md +563 -0
  23. package/docs/get-started/an-agent-in-a-sandbox.md +381 -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 +922 -0
  27. package/docs/get-started/install.md +126 -0
  28. package/docs/guides/add-tools-to-the-sandbox.md +295 -0
  29. package/docs/guides/answer-a-gate.md +304 -0
  30. package/docs/guides/bind-open-parts.md +223 -0
  31. package/docs/guides/cancel-a-run.md +146 -0
  32. package/docs/guides/clean-up.md +206 -0
  33. package/docs/guides/fix-a-failed-converge.md +361 -0
  34. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  35. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  36. package/docs/guides/let-an-agent-write-a-chart.md +226 -0
  37. package/docs/guides/look-inside-a-sandbox.md +174 -0
  38. package/docs/guides/mirror-the-kit-images.md +176 -0
  39. package/docs/guides/move-from-kind-to-a-shared-cluster.md +302 -0
  40. package/docs/guides/open-the-console.md +91 -0
  41. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  42. package/docs/guides/push-and-sign-a-branch.md +486 -0
  43. package/docs/guides/run-a-chart-by-name.md +270 -0
  44. package/docs/guides/run-a-command-or-call-a-url.md +544 -0
  45. package/docs/guides/run-one-worker-per-item.md +321 -0
  46. package/docs/guides/set-an-agents-access-and-dials.md +375 -0
  47. package/docs/guides/size-a-workspace.md +204 -0
  48. package/docs/guides/start-a-run-from-a-run.md +237 -0
  49. package/docs/guides/start-a-run.md +207 -0
  50. package/docs/guides/upgrade-the-kit-version.md +240 -0
  51. package/docs/guides/use-a-hosted-provider.md +208 -0
  52. package/docs/guides/use-a-local-model.md +313 -0
  53. package/docs/guides/watch-a-run.md +326 -0
  54. package/docs/guides/write-a-workflow.md +318 -0
  55. package/docs/index.md +44 -0
  56. package/docs/llms.txt +216 -0
  57. package/docs/reference/authoring-surface/agent.md +128 -0
  58. package/docs/reference/authoring-surface/answer.md +140 -0
  59. package/docs/reference/authoring-surface/arg.md +60 -0
  60. package/docs/reference/authoring-surface/basic.md +62 -0
  61. package/docs/reference/authoring-surface/bearer.md +53 -0
  62. package/docs/reference/authoring-surface/chartschema.md +23 -0
  63. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  64. package/docs/reference/authoring-surface/command.md +191 -0
  65. package/docs/reference/authoring-surface/customize.md +64 -0
  66. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  67. package/docs/reference/authoring-surface/defineevent.md +114 -0
  68. package/docs/reference/authoring-surface/dispatch.md +126 -0
  69. package/docs/reference/authoring-surface/fail.md +83 -0
  70. package/docs/reference/authoring-surface/file.md +122 -0
  71. package/docs/reference/authoring-surface/frompick.md +277 -0
  72. package/docs/reference/authoring-surface/http.md +159 -0
  73. package/docs/reference/authoring-surface/isfailure.md +58 -0
  74. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  75. package/docs/reference/authoring-surface/open.md +74 -0
  76. package/docs/reference/authoring-surface/openbody.md +86 -0
  77. package/docs/reference/authoring-surface/paramsof.md +125 -0
  78. package/docs/reference/authoring-surface/pool.md +186 -0
  79. package/docs/reference/authoring-surface/push.md +112 -0
  80. package/docs/reference/authoring-surface/secret.md +118 -0
  81. package/docs/reference/authoring-surface/sentby.md +83 -0
  82. package/docs/reference/authoring-surface/source.md +51 -0
  83. package/docs/reference/authoring-surface/text.md +62 -0
  84. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  85. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  86. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  87. package/docs/reference/authoring-surface/type-agentslots.md +12 -0
  88. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  89. package/docs/reference/authoring-surface/type-arg.md +19 -0
  90. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  91. package/docs/reference/authoring-surface/type-binding.md +62 -0
  92. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  93. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  94. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  95. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  96. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  97. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  98. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  99. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  100. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  101. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  102. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  103. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  104. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  105. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  106. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  107. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  108. package/docs/reference/authoring-surface/type-childat.md +12 -0
  109. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  110. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  111. package/docs/reference/authoring-surface/type-commandinput.md +19 -0
  112. package/docs/reference/authoring-surface/type-commandoptions.md +78 -0
  113. package/docs/reference/authoring-surface/type-commandoutput.md +104 -0
  114. package/docs/reference/authoring-surface/type-customize.md +109 -0
  115. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  116. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  117. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  118. package/docs/reference/authoring-surface/type-dispatchoutput.md +65 -0
  119. package/docs/reference/authoring-surface/type-duration.md +15 -0
  120. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  121. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  122. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  123. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  124. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  125. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  126. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  127. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  128. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  129. package/docs/reference/authoring-surface/type-failure.md +19 -0
  130. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  131. package/docs/reference/authoring-surface/type-filebody.md +41 -0
  132. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  133. package/docs/reference/authoring-surface/type-hostinjectedinput.md +58 -0
  134. package/docs/reference/authoring-surface/type-httpdefinition.md +101 -0
  135. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  136. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  137. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  138. package/docs/reference/authoring-surface/type-httpoutput.md +89 -0
  139. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  140. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  141. package/docs/reference/authoring-surface/type-lends.md +38 -0
  142. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  143. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  144. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  145. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  146. package/docs/reference/authoring-surface/type-noslotspec.md +26 -0
  147. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +32 -0
  148. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  149. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  150. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  151. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  152. package/docs/reference/authoring-surface/type-opencommandinput.md +17 -0
  153. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  154. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  155. package/docs/reference/authoring-surface/type-openof.md +12 -0
  156. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  157. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  158. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +31 -0
  159. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +32 -0
  160. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  161. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  162. package/docs/reference/authoring-surface/type-pushinput.md +15 -0
  163. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  164. package/docs/reference/authoring-surface/type-pushoutput.md +124 -0
  165. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  166. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  167. package/docs/reference/authoring-surface/type-reached.md +12 -0
  168. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  169. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  170. package/docs/reference/authoring-surface/type-sandboxoptions.md +77 -0
  171. package/docs/reference/authoring-surface/type-secret.md +25 -0
  172. package/docs/reference/authoring-surface/type-sender.md +19 -0
  173. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  174. package/docs/reference/authoring-surface/type-size.md +85 -0
  175. package/docs/reference/authoring-surface/type-slothandles.md +32 -0
  176. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  177. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  178. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  179. package/docs/reference/authoring-surface/type-text.md +19 -0
  180. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  181. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  182. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  183. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  184. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  185. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  186. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  187. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  188. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  189. package/docs/reference/authoring-surface/type-workspaced.md +94 -0
  190. package/docs/reference/authoring-surface/type-workspacehandles.md +23 -0
  191. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  192. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  193. package/docs/reference/authoring-surface/type-workspaceoptions.md +39 -0
  194. package/docs/reference/authoring-surface/type-workspacespec.md +37 -0
  195. package/docs/reference/authoring-surface/workspace.md +259 -0
  196. package/docs/reference/authoring-surface.md +197 -0
  197. package/docs/reference/cli.md +433 -0
  198. package/docs/reference/config.md +756 -0
  199. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +113 -0
  200. package/docs/reference/decisions/0002-duplex-streaming-actor.md +110 -0
  201. package/docs/reference/decisions/0004-worktree-provisioning-model.md +124 -0
  202. package/docs/reference/decisions/0005-sandbox-pod-composition.md +230 -0
  203. package/docs/reference/decisions/0006-agent-control-surface.md +47 -0
  204. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  205. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  206. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  207. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  208. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  209. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  210. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +157 -0
  211. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  212. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +265 -0
  213. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +124 -0
  214. package/docs/reference/decisions/0017-pool-over-a-source-port.md +69 -0
  215. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  216. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +275 -0
  217. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  218. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +100 -0
  219. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  220. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +176 -0
  221. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +439 -0
  222. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  223. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  224. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +237 -0
  225. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +89 -0
  226. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  227. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  228. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +190 -0
  229. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  230. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +127 -0
  231. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  232. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  233. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  234. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  235. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  236. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  237. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  238. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  239. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  240. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  241. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  242. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  243. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  244. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  245. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  246. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  247. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +227 -0
  248. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +81 -0
  249. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +111 -0
  250. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  251. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  252. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  253. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  254. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +106 -0
  255. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +384 -0
  256. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  257. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  258. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +212 -0
  259. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +83 -0
  260. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  261. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  262. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +550 -0
  263. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +430 -0
  264. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +464 -0
  265. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  266. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +323 -0
  267. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  268. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  269. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  270. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  271. package/docs/reference/decisions.md +83 -0
  272. package/docs/reference/glossary.md +648 -0
  273. package/docs/reference/http-api.md +1348 -0
  274. package/docs/reference/machines.md +190 -0
  275. package/docs/reference/mechanism-events.md +72 -0
  276. package/docs/why.md +206 -0
  277. package/package.json +5 -3
  278. package/src/actor.ts +541 -79
  279. package/src/agent.ts +114 -38
  280. package/src/ambient.ts +2 -1
  281. package/src/assembly-checks.ts +189 -7
  282. package/src/cause.ts +234 -0
  283. package/src/chart.ts +169 -37
  284. package/src/charts.ts +34 -6
  285. package/src/config.ts +430 -178
  286. package/src/custodian.ts +74 -22
  287. package/src/customize.ts +188 -46
  288. package/src/dispatch-effect.ts +945 -0
  289. package/src/door-compat.ts +217 -0
  290. package/src/durability.ts +11 -4
  291. package/src/effect.ts +341 -44
  292. package/src/effector-wire.ts +160 -11
  293. package/src/fail.ts +209 -0
  294. package/src/harness-client.ts +541 -47
  295. package/src/http-effect.ts +495 -53
  296. package/src/http.ts +427 -16
  297. package/src/index.ts +60 -82
  298. package/src/instance.ts +68 -8
  299. package/src/internal.ts +84 -0
  300. package/src/machine-doc.ts +21 -3
  301. package/src/mechanism-routes.ts +168 -0
  302. package/src/model-keys.generated.ts +53 -0
  303. package/src/model-keys.ts +18 -58
  304. package/src/notices.ts +66 -13
  305. package/src/open-body.ts +159 -23
  306. package/src/open-effect.ts +81 -8
  307. package/src/open.ts +59 -6
  308. package/src/parts.ts +184 -13
  309. package/src/party.ts +68 -2
  310. package/src/pick.ts +463 -11
  311. package/src/pool.ts +247 -36
  312. package/src/registration.ts +83 -4
  313. package/src/repos.ts +2 -1
  314. package/src/run-host.ts +565 -31
  315. package/src/run-output.ts +38 -0
  316. package/src/sandbox-effect.ts +273 -38
  317. package/src/sandbox-kube.ts +3 -1
  318. package/src/secret-placement.ts +52 -17
  319. package/src/server.ts +3 -0
  320. package/src/setup.ts +239 -56
  321. package/src/size.ts +121 -9
  322. package/src/snapshot-store.ts +54 -10
  323. package/src/stub-harness.ts +44 -16
  324. package/src/timers.ts +14 -1
  325. package/src/vocabulary.ts +69 -14
  326. package/src/wire.ts +90 -16
  327. package/src/workspace.ts +697 -175
@@ -0,0 +1,17 @@
1
+ ---
2
+ title: SourceNextResult
3
+ description: "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."
4
+ ---
5
+
6
+ # `SourceNextResult`
7
+
8
+ Type, in `@jr2/orchestrator/src/pool.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type SourceNextResult<T> = T | null | { item: T | null; open: number };
12
+ ```
13
+
14
+ What the `next` of a Source resolves to: an item, to claim it; `null`, when no item is ready
15
+ now; or `{ item, open }`, where `open` is the number of items that exist but are not ready.
16
+ When no worker runs and `next` gives no item, the Pool ends: `drained` when `open` is 0 or
17
+ absent, `deadlocked` when `open` is more than 0.
@@ -0,0 +1,44 @@
1
+ ---
2
+ title: SourceSpec
3
+ description: "Where a Pool gets its work items: the Source."
4
+ ---
5
+
6
+ # `SourceSpec`
7
+
8
+ Type, in `@jr2/orchestrator/src/pool.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type SourceSpec<T> = {
12
+ next:
13
+ | PromiseActorLogic<SourceNextResult<T>, { active: string[] }>
14
+ | PromiseActorLogic<{ item: T | null; open: number }, { active: string[] }>
15
+ | PromiseActorLogic<T | null, { active: string[] }>
16
+ | PromiseActorLogic<null, { active: string[] }>;
17
+ wake?: EventDef;
18
+ pollEvery?: number;
19
+ };
20
+ ```
21
+
22
+ Where a Pool gets its work items: the Source. Make one with [`source`](source.md).
23
+
24
+ **Fields**
25
+
26
+ - `next`: `PromiseActorLogic<SourceNextResult<T>, { active: string[]; }> | PromiseActorLogic<{ item: T | null; open: number; }, { active: string[]; }> | PromiseActorLogic<T | null, { active: string[]; }> | PromiseActorLogic<null, { active: string[]; }>`
27
+
28
+ Claim the next ready item. Write it as an xstate promise actor,
29
+ `fromPromise(async ({ input }) => …)`. Its input is `{ active }`: the ids of the items that
30
+ workers have now, which it must not give again. It must also not give again an item that a
31
+ worker finished. It resolves to a [`SourceNextResult`](type-sourcenextresult.md). The Pool calls it when the run
32
+ starts, after each claim, and when a worker settles. While workers run and no item is ready, it
33
+ also calls it on `wake` and every `pollEvery`.
34
+ - `wake` (optional): [`EventDef`](type-eventdef.md)
35
+
36
+ An external event, made with `defineEvent`, that tells the Pool that new work is ready, for
37
+ example from a webhook or `jr2 send`. While workers run and no item is ready, it makes the Pool
38
+ call `next` at once. The Pool serves it as a Gate named `source` for the whole run
39
+ (`<path>.source` when the Pool is composed in another Machine). Default: none.
40
+ - `pollEvery` (optional): `number`
41
+
42
+ While workers run and no item is ready, call `next` again after this many milliseconds. Use
43
+ it for a Source whose items change while the run waits. Default: none, so the Pool calls
44
+ `next` again only when a worker settles or `wake` comes.
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: SyncState
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `SyncState`
7
+
8
+ Type, in `@jr2/orchestrator/src/sandbox-effect.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type SyncState = SyncAnswer["sync"];
12
+ ```
@@ -0,0 +1,19 @@
1
+ ---
2
+ title: Text
3
+ description: "What the `text` template gives: a string of literal text and Effect secrets, in order."
4
+ ---
5
+
6
+ # `Text`
7
+
8
+ Type, in `@jr2/orchestrator/src/http-effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type Text = { readonly text: readonly TextPart[] };
12
+ ```
13
+
14
+ What the `text` template gives: a string of literal text and Effect secrets, in order. The
15
+ Effector builds the string, so the Machine never sees the value of a secret.
16
+
17
+ **Fields**
18
+
19
+ - `text`: `readonly TextPart[]`
@@ -0,0 +1,24 @@
1
+ ---
2
+ title: TextPart
3
+ description: "One part of a `Text`: `{ text }`, literal text, or `{ secret }`, the name of an Effect secret."
4
+ ---
5
+
6
+ # `TextPart`
7
+
8
+ Type, in `@jr2/orchestrator/src/effector-wire.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type TextPart = z.infer<typeof TextPartShape>;
12
+ ```
13
+
14
+ One part of a [`Text`](type-text.md): `{ text }`, literal text, or `{ secret }`, the name of an Effect
15
+ secret. The `text` template makes the parts.
16
+
17
+ **Forms**: it is one of these objects.
18
+
19
+ - Form 1: `text`
20
+
21
+ - `text`: `string`
22
+ - Form 2: `secret`
23
+
24
+ - `secret`: `string`
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: ThinkingLevel
3
+ description: "How hard the model thinks before it answers: `\"off\"`, `\"minimal\"`, `\"low\"`, `\"medium\"`, `\"high\"` or `\"xhigh\"`."
4
+ ---
5
+
6
+ # `ThinkingLevel`
7
+
8
+ Type, in `@jr2/orchestrator/src/agent.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Agents.
9
+
10
+ ```ts
11
+ type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
12
+ ```
13
+
14
+ How hard the model thinks before it answers: `"off"`, `"minimal"`, `"low"`, `"medium"`,
15
+ `"high"` or `"xhigh"`. Set it on an Agent's definition (`thinkingLevel`), or for one Turn in the
16
+ invoke's `input`.
17
+
18
+ A model can lack a level. Claude Sonnet 5.5 has no `"off"`, and at `"off"` the Harness's request
19
+ then sends effort `"high"`. The Harness does not refuse such a level: it runs the Turn, and the
20
+ printed conversation names the level that the model ran at.
21
+
22
+ **Example**
23
+
24
+ ```ts
25
+ import { agent, type ThinkingLevel } from "@jr2/orchestrator";
26
+
27
+ const effort: ThinkingLevel = "high";
28
+
29
+ export const reviewer = agent({
30
+ model: "anthropic/claude-haiku-5-5",
31
+ instructions: "You review diffs for correctness.",
32
+ thinkingLevel: effort,
33
+ });
34
+ ```
35
+
36
+ **See also**
37
+
38
+ - [Set an Agent's access and Dials](../../guides/set-an-agents-access-and-dials.md)
39
+ - [ADR-0018: The instance authors Agent definitions; jr2 assembles the Harness](../decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md)
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: ToParameterizedObject
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `ToParameterizedObject`
7
+
8
+ Type, in `@jr2/orchestrator/src/setup.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type ToParameterizedObject<T extends Record<string, ParameterizedObject["params"] | undefined>> = {
12
+ [K in keyof T & string]: { type: K; params: T[K] };
13
+ }[keyof T & string];
14
+ ```
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: ToProvidedActor
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `ToProvidedActor`
7
+
8
+ Type, in `@jr2/orchestrator/src/setup.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type ToProvidedActor<TActors extends Record<string, UnknownActorLogic>> = {
12
+ [K in keyof TActors & string]: { src: K; logic: TActors[K]; id: string | undefined };
13
+ }[keyof TActors & string];
14
+ ```
@@ -0,0 +1,21 @@
1
+ ---
2
+ title: Unknown
3
+ description: "The output `{ outcome: \"unknown\", reason }`: the Effect may have acted, and jr2 cannot tell."
4
+ ---
5
+
6
+ # `Unknown`
7
+
8
+ Type, in `@jr2/orchestrator/src/effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type Unknown = { outcome: "unknown"; reason: string };
12
+ ```
13
+
14
+ The output `{ outcome: "unknown", reason }`: the Effect may have acted, and jr2 cannot tell.
15
+ For example, the Harness lost the exec, or its state exited while it ran. Route on it. jr2 does
16
+ not run the Effect again.
17
+
18
+ **Fields**
19
+
20
+ - `outcome`: `"unknown"`
21
+ - `reason`: `string`
@@ -0,0 +1,77 @@
1
+ ---
2
+ title: UserContainer
3
+ description: "The User Container in its object form: its image, and its part of the Workspace's Size."
4
+ ---
5
+
6
+ # `UserContainer`
7
+
8
+ Type, in `@jr2/orchestrator/src/size.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
9
+
10
+ ```ts
11
+ type UserContainer = {
12
+ image: string;
13
+ resources?: Size;
14
+ };
15
+ ```
16
+
17
+ The User Container in its object form: its image, and its part of the Workspace's Size. The User
18
+ Container is an optional container of your own in the Sandbox pod. It runs its own entrypoint
19
+ with `/work` mounted, and jr2 never builds into it, probes it or sends it commands. Use it for a
20
+ service that must run without an Agent, such as an sshd.
21
+
22
+ Write it in the `user` option of `workspace()` or of `customize()`. That option also takes the
23
+ image as a string; use this object form only to give the User Container a part of the Size. A
24
+ `customize()` that names `user` replaces the whole User Container, its part of the Size
25
+ included.
26
+
27
+ It refuses, where you write it. `<where>` is `workspace()` or `customize()`:
28
+
29
+ - an image that is not a non-empty string. The message starts with
30
+ `` <where>: `user` must be a non-empty string (an image), or { image, resources? } ``.
31
+ - `<where>: user.<key> is not accepted — the User Container is { image, resources? } (ADR-0005,
32
+ ADR-0060)`
33
+
34
+ `resources` is checked as a [`Size`](type-size.md), with the same refusals.
35
+
36
+ `jr2 up` refuses a part that leaves the Harness container less than its floor. The message starts
37
+ with `the Size leaves the Harness container <memory> memory, below its 256Mi floor:` or with
38
+ `the Size leaves the Harness container no cpu:`. The text that follows names each number and
39
+ where it came from.
40
+
41
+ **Fields**
42
+
43
+ - `image`: `string`
44
+
45
+ The image: a `file:` URL to a docker context that your module ships
46
+ (`import.meta.resolve("./sshd")`), which `jr2 up` builds, or a registry ref. It must not be
47
+ empty.
48
+ - `resources` (optional): [`Size`](type-size.md)
49
+
50
+ This container's part of the Workspace's Size, as a Size. jr2 takes it from the Harness
51
+ container's part. A field you leave out gives this container no limit of its own for it: it
52
+ shares the pod's budget. Default: no part.
53
+
54
+ **Example**
55
+
56
+ ```ts
57
+ import { customize, type UserContainer } from "@jr2/orchestrator";
58
+ import { task } from "@jr2/machines";
59
+
60
+ const sshd: UserContainer = {
61
+ image: "registry.example.com/sshd:1.0",
62
+ resources: { limits: { memory: "256Mi", cpu: "250m" } },
63
+ };
64
+
65
+ export const machine = customize(task, {
66
+ repos: { app: { url: "https://github.com/you/app.git" } },
67
+ agents: { coder: { model: "anthropic/claude-haiku-5-5" } },
68
+ user: sshd,
69
+ });
70
+ ```
71
+
72
+ **See also**
73
+
74
+ - [Workspaces](../../concepts/workspaces.md)
75
+ - [Size a Workspace](../../guides/size-a-workspace.md)
76
+ - [ADR-0005: The Sandbox pod's containers: Harness, Custodian, an optional User Container, and an optional Sandbox Effector](../decisions/0005-sandbox-pod-composition.md)
77
+ - [ADR-0060: A Workspace states its Size, and jr2 reserves all of it](../decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md)
@@ -0,0 +1,20 @@
1
+ ---
2
+ title: WithoutEmptyIndex
3
+ description: The fields of the run input `T`.
4
+ ---
5
+
6
+ # `WithoutEmptyIndex`
7
+
8
+ Type, in `@jr2/orchestrator/src/workspace.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type WithoutEmptyIndex<T> = string extends keyof T
12
+ ? [T[string & keyof T]] extends [never]
13
+ ? { [K in keyof T as string extends K ? never : number extends K ? never : K]: T[K] }
14
+ : T
15
+ : T;
16
+ ```
17
+
18
+ The fields of the run input `T`. A string index signature whose value is `never` is not one of
19
+ them: `z.infer` gives `Record<string, never>` for `z.object({})`, and this type makes it `{}`. The
20
+ named fields of `T` stay. A different `T` does not change.
@@ -0,0 +1,46 @@
1
+ ---
2
+ title: WorkflowEvent
3
+ description: "The type of `event` in a Machine that `jr2Setup` makes: each workflow event in its `events`, and each Mechanism event."
4
+ ---
5
+
6
+ # `WorkflowEvent`
7
+
8
+ Type, in `@jr2/orchestrator/src/setup.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type WorkflowEvent<TDefs extends readonly EventDef[]> =
12
+ | (EventFrom<TDefs[number]> & { readonly sender?: Sender })
13
+ | MechanismEvent;
14
+ ```
15
+
16
+ The type of `event` in a Machine that `jr2Setup` makes: each workflow event in its `events`,
17
+ and each Mechanism event. A workflow event that an Agent or a Gate sent has `event.sender`. An
18
+ event that the Machine sent to itself (`raise`, `sendTo`) has no `sender`.
19
+
20
+ **Forms**: it is one of these objects.
21
+
22
+ - Form 1: `type`, `sender`
23
+
24
+ - `type`: `N`
25
+ - `sender` (optional): [`Sender`](type-sender.md)
26
+ - Form 2: `type`, `instanceId`, `reason`
27
+
28
+ - `type`: `"agent.fault"`
29
+ - `instanceId`: `string`
30
+
31
+ The Instance ID of the Agent's conversation that failed: the same id on each Turn that
32
+ continues it.
33
+ - `reason`: `string`
34
+
35
+ Why the Turn failed, as text for a person or a log: the Harness's error, or that the Agent
36
+ ended its Turns without a pick after every nudge. Route on the event, not on this text.
37
+ - Form 3: `type`, `reason`, `message`
38
+
39
+ - `type`: `"workspace.lost"`
40
+ - `reason` (optional): `string`
41
+
42
+ Why the Sandbox is gone, for a person or a log: the pod's reason (`Evicted`, `NodeShutdown`),
43
+ the operator's (`PodDeleted`, `NodeLost`), or `Deleted`. A body can act without it.
44
+ - `message` (optional): `string`
45
+
46
+ More text about the loss, when jr2 has it.
@@ -0,0 +1,16 @@
1
+ ---
2
+ title: WorkspaceAccess
3
+ description: "What an Agent may do to the Workspace: `\"write\"`, `\"read\"` or `\"none\"`."
4
+ ---
5
+
6
+ # `WorkspaceAccess`
7
+
8
+ Type, in `@jr2/orchestrator/src/agent.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type WorkspaceAccess = "write" | "read" | "none";
12
+ ```
13
+
14
+ What an Agent may do to the Workspace: `"write"`, `"read"` or `"none"`. With `"none"`, its Turn
15
+ runs on the Instance Harness, not in a Sandbox. The `workspace` field of [`AgentDefinition`](type-agentdefinition.md)
16
+ tells what each value gives.
@@ -0,0 +1,94 @@
1
+ ---
2
+ title: Workspaced
3
+ description: "The input of a `workspace()` body: the run input, plus `workspace`, the handles that the Workspace adds (`workspace.repos`, `workspace.branch`, `workspace.review`)."
4
+ ---
5
+
6
+ # `Workspaced`
7
+
8
+ Type, 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
+ ```ts
11
+ type Workspaced<TInput, TSlots extends string> = WithoutEmptyIndex<TInput> & {
12
+ workspace: WorkspaceHandles<TSlots>;
13
+ };
14
+ ```
15
+
16
+ The input of a `workspace()` body: the run input, plus `workspace`, the handles that the
17
+ Workspace adds (`workspace.repos`, `workspace.branch`, `workspace.review`). Use it as the type of
18
+ the body's input.
19
+
20
+ The first argument is the run input: the `input` schema of the `workspace()`. The second is the
21
+ Repo Slots that the body reads, by name (`"app"` or `"app" | "docs"`). Under `repos: open`, write
22
+ `string`: the body cannot know the names, so it reads the slots in order. For a `workspace()`
23
+ with no `repos`, write `never`. The second argument has no default.
24
+
25
+ A body under a root `workspace()` also gets the fields of `HostInjectedInput`. Add them when the
26
+ body reads them: `Workspaced<HostInjectedInput & RunInput, "app">`.
27
+
28
+ Its fields are the fields of the run input, and `workspace`. The run input can have no fields:
29
+ `Workspaced<z.infer<typeof door>, "app">` for the door `z.object({})` holds only `workspace`.
30
+
31
+ **Fields**: each field of [`WithoutEmptyIndex`](type-withoutemptyindex.md), and these:
32
+
33
+ - `workspace`: `WorkspaceHandles<TSlots>`
34
+
35
+ **Example**
36
+
37
+ ```ts
38
+ import { z } from "zod";
39
+ import { agent, defineEvent, fail, jr2Setup, workspace, type Workspaced } from "@jr2/orchestrator";
40
+
41
+ const done = defineEvent({
42
+ name: "done",
43
+ description: "Call this when REVIEW.md is written.",
44
+ input: z.object({}),
45
+ });
46
+ const runInput = z.object({ branch: z.string(), sha: z.string() });
47
+ type BodyInput = Workspaced<z.infer<typeof runInput>, "app">;
48
+
49
+ const body = jr2Setup({
50
+ types: {} as { input: BodyInput; context: BodyInput },
51
+ events: [done],
52
+ actors: {
53
+ reviewer: agent({
54
+ model: "anthropic/claude-haiku-5-5",
55
+ instructions: "You review one commit and write REVIEW.md.",
56
+ workspace: "read",
57
+ }),
58
+ fail: fail(),
59
+ },
60
+ }).createMachine({
61
+ id: "review",
62
+ context: ({ input }) => input,
63
+ on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
64
+ initial: "reviewing",
65
+ states: {
66
+ reviewing: {
67
+ invoke: {
68
+ src: "reviewer",
69
+ input: ({ context }) => ({
70
+ prompt: `Review commit ${context.sha} on ${context.workspace.branch}.`,
71
+ cwd: context.workspace.review?.app ?? context.workspace.repos.app,
72
+ }),
73
+ },
74
+ on: { done: "finished" },
75
+ },
76
+ finished: { type: "final" },
77
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
78
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
79
+ },
80
+ });
81
+
82
+ export const machine = workspace(body, {
83
+ input: runInput,
84
+ repos: { app: "https://github.com/you/app.git" },
85
+ spec: ({ input }) => ({ branch: input.branch, reviewSha: input.sha }),
86
+ });
87
+ ```
88
+
89
+ **See also**
90
+
91
+ - [Workspaces](../../concepts/workspaces.md)
92
+ - [Write a Workflow](../../guides/write-a-workflow.md)
93
+ - [ADR-0012: `workspace()` wraps a body Machine and owns only Sandbox lifecycle](../decisions/0012-workspace-wrapper-machine.md)
94
+ - [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)
@@ -0,0 +1,23 @@
1
+ ---
2
+ title: WorkspaceHandles
3
+ description: "What the body of a `workspace()` gets as `input.workspace`: the path of each Worktree, and the branch."
4
+ ---
5
+
6
+ # `WorkspaceHandles`
7
+
8
+ Type, in `@jr2/orchestrator/src/workspace.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type WorkspaceHandles<TSlots extends string> = [TSlots] extends [never]
12
+ ? { repos: Record<never, string> }
13
+ : SlotHandles<TSlots>;
14
+ ```
15
+
16
+ What the body of a `workspace()` gets as `input.workspace`: the path of each Worktree, and the
17
+ branch. A path is correct in each Instance that registers the Machine.
18
+
19
+ `TSlots` is the names of the Repo Slots that the body reads. `workspace()` refuses a body that
20
+ names a slot that the Workspace does not have. Write `string` for a body that names no slot and
21
+ reads the Worktrees in the order of `repos`, as under `repos: open`. Write `never` for a
22
+ Workspace with no Repo Slot: its handles are `{ repos: {} }`, with no branch, and its Agents work
23
+ in `/work`.
@@ -0,0 +1,29 @@
1
+ ---
2
+ title: WorkspaceMachine
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `WorkspaceMachine`
7
+
8
+ Type, in `@jr2/orchestrator/src/workspace.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type WorkspaceMachine<TInput, TOutput, TBody extends AnyStateMachine, TSlots extends string> = StateMachine<
12
+ any,
13
+ any,
14
+ any,
15
+ WrapperActors<"body", TBody, "place" | "provision" | "attach" | "registrar" | "lease" | "destroy" | "fail">,
16
+ any,
17
+ any,
18
+ any,
19
+ any,
20
+ any,
21
+ TInput,
22
+ TOutput,
23
+ any,
24
+ any,
25
+ any
26
+ > &
27
+ JR2Wrapper<TBody> &
28
+ JR2Repos<TSlots>;
29
+ ```
@@ -0,0 +1,13 @@
1
+ ---
2
+ title: WorkspaceOf
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `WorkspaceOf`
7
+
8
+ Type, in `@jr2/orchestrator/src/customize.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type WorkspaceOf<M extends AnyStateMachine> =
12
+ M extends JR2Repos<any> ? M : M extends JR2Wrapper<infer TBody> ? WorkspaceOf<TBody> : never;
13
+ ```
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: WorkspaceOptions
3
+ description: The options of a `workspace()` that declares the input that starts a run.
4
+ ---
5
+
6
+ # `WorkspaceOptions`
7
+
8
+ Type, in `@jr2/orchestrator/src/workspace.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type WorkspaceOptions<TSchema extends z.ZodObject, TSlots extends string> = SandboxOptions<
12
+ TSlots,
13
+ z.infer<TSchema>
14
+ > & {
15
+ input: TSchema;
16
+ spec: (args: { input: WithoutEmptyIndex<z.infer<TSchema>> & HostInjectedInput }) => WorkspaceSpec;
17
+ };
18
+ ```
19
+
20
+ The options of a `workspace()` that declares the input that starts a run.
21
+
22
+ **Fields**: each field of [`SandboxOptions`](type-sandboxoptions.md), and these:
23
+
24
+ - `input`: `TSchema`
25
+
26
+ The input that starts a run, as a `z.object`. jr2 checks each start against it. It also types
27
+ the `input` of `spec` and of a per-run Repo Slot, and the body must accept it plus the
28
+ `workspace` handles. Write it here, not on the body.
29
+ - `spec`: `(args: { input: WithoutEmptyIndex<z.infer<TSchema>> & HostInjectedInput; }) => WorkspaceSpec`
30
+
31
+ A function from the run input to the Workspace's [`WorkspaceSpec`](type-workspacespec.md): the `branch` it works
32
+ on, and optionally `reviewSha` and `workGroup`. jr2 calls it when the run enters the
33
+ Workspace.
34
+
35
+ The input of `spec` also holds `instanceId`, the seed Instance ID of the run (see
36
+ [`HostInjectedInput`](type-hostinjectedinput.md)). Use it to give each run a branch of its own:
37
+ ``spec: ({ input }) => ({ branch: `fix/${input.instanceId}` })``. Only a root `workspace()` gets
38
+ it from jr2. A `workspace()` that a different Machine invokes gets only the input that its
39
+ parent gives it, so that parent must give `instanceId` when `spec` reads it.
@@ -0,0 +1,37 @@
1
+ ---
2
+ title: WorkspaceSpec
3
+ description: "What the `spec` of a `workspace()` returns: the branch that the Workspace works on, and two optional fields."
4
+ ---
5
+
6
+ # `WorkspaceSpec`
7
+
8
+ Type, in `@jr2/orchestrator/src/workspace.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type WorkspaceSpec = {
12
+ branch: string;
13
+ workGroup?: number;
14
+ reviewSha?: string;
15
+ };
16
+ ```
17
+
18
+ What the `spec` of a `workspace()` returns: the branch that the Workspace works on, and two
19
+ optional fields. jr2 calls `spec` with the run input when the run enters the Workspace.
20
+
21
+ **Fields**
22
+
23
+ - `branch`: `string`
24
+
25
+ The branch that the Workspace works on: each Repo Slot gets a Worktree for it, at
26
+ `/work/<slot>/<branch>`, with each `/` in the branch written as `-`. Required, and not
27
+ `default`, which is the directory of the clone. Your Machine decides its name.
28
+ - `workGroup` (optional): `number`
29
+
30
+ The group id that owns the files in `/work`. With it, the Sandbox Image and the User
31
+ Container can both write those files when they run as different users. Default: 2000. Set it
32
+ to a group id that the User Container's sessions already have, for example when a root sshd
33
+ builds their groups from `/etc/group`. A non-negative integer.
34
+ - `reviewSha` (optional): `string`
35
+
36
+ A commit to check out in a second, detached Worktree beside each branch Worktree, for a
37
+ reviewer: `/work/<slot>/<branch>-review`. The body gets its paths as `workspace.review`.