@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,84 @@
1
+ ---
2
+ title: SandboxOptions
3
+ description: The options of a `workspace()` that say what its Sandbox is made of and which Repos it clones.
4
+ ---
5
+
6
+ # `SandboxOptions`
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 SandboxOptions<TSlots extends string, TInput = unknown> = {
12
+ image?: string;
13
+ workGroup?: number;
14
+ user?: string | UserContainer;
15
+ resources?: Size;
16
+ repos: Record<TSlots, RepoSlot<TInput>> | typeof open;
17
+ secrets?: readonly string[];
18
+ effector?: { image: string };
19
+ };
20
+ ```
21
+
22
+ The options of a `workspace()` that say what its Sandbox is made of and which Repos it
23
+ clones. They are the same for each run.
24
+
25
+ **Fields**
26
+
27
+ - `image` (optional): `string`
28
+
29
+ The Sandbox Image: the image of the container where the Agent's Working tools and
30
+ `command` Effects run. A `file:` URL to a docker context that your module ships
31
+ (`import.meta.resolve("./image")`), which `jr2 up` builds, or a registry ref. Its floor is
32
+ glibc and git; jr2 adds its own runtime at `/opt/jr2`. Default: the Instance's
33
+ `images/default`, then jr2's Harness image.
34
+ - `workGroup` (optional): `number`
35
+
36
+ The group id that owns the files in `/work`. Default: 2000. A non-negative integer.
37
+ - `user` (optional): `string | UserContainer`
38
+
39
+ The User Container: a third container in the Sandbox, for a service that must run beside the
40
+ Agent, such as an sshd. Its image, in the same two forms as `image`, or `{ image, resources }`
41
+ to give it a part of the Size. It runs its own entrypoint, with `/work` mounted. jr2 adds
42
+ nothing to it. Default: none. Without `resources`, it has no limit of its own and shares the
43
+ Size of the Sandbox.
44
+ - `resources` (optional): [`Size`](type-size.md)
45
+
46
+ The Size: the memory and cpu limit of the whole Sandbox, `{ limits: { memory, cpu } }`, such as
47
+ `{ limits: { memory: "4Gi", cpu: "2" } }`. jr2 reserves all of it on the node: each request
48
+ equals its limit. jr2 also enforces the cpu limit. Only `limits`,
49
+ and in it only `memory` and `cpu`, are accepted. Default: the Instance's `sandbox.resources`,
50
+ then 2Gi and 1 cpu. Under a Size that you give, a field you leave out takes the kit's value,
51
+ not the Instance's. The Instance that registers the Machine can change it with
52
+ `customize(machine, { resources })`.
53
+ - `repos`: `Record<TSlots, RepoSlot<TInput>> | typeof open`
54
+
55
+ The Repo Slots: the repositories that the Sandbox clones, each under a name of your Machine's
56
+ choice. The name is the key of `workspace.repos` in the body and the directory under `/work`.
57
+ At least one slot. Leave `repos` out for a Workspace with no Repo Slot (see
58
+ [`NoSlotWorkspaceOptions`](type-noslotworkspaceoptions.md)). Each value is one of:
59
+ - a url, or `{ url, ref }`, where `ref` is the branch, the tag or the commit that the clone
60
+ stays on, and that a new branch starts from (default: the Repo's default branch);
61
+ - `open`, for the Instance that registers the Machine to bind with `customize()`;
62
+ - a function of the run input, `({ input }) => url` or `{ url, ref }`, when each run chooses.
63
+
64
+ Or `repos: open` for the whole map: the Machine names no slot, and the Instance that registers
65
+ it names each one with `customize()`. The body's input is then `Workspaced<RunInput, string>`.
66
+ - `secrets` (optional): `readonly string[]`
67
+
68
+ The Held secrets that this Sandbox can use: names from the `secrets` list in `jr2.config.ts`.
69
+ The Sandbox's Custodian holds each value and puts it into requests to the hosts of that Held
70
+ secret. Listing a name also gives its Stand-in to the Agent's programs — each `bash` call, test,
71
+ build and `command` — in their env under that name, so code in `/work` can spend it ([ADR-0076](../decisions/0076-an-agents-control-credential-lives-only-where-no-workspace-code-runs.md)).
72
+ You need not list the model key of an Agent that runs here: its provider claims it, and the
73
+ Harness gives it to the model calls alone. List the model key only when code in `/work` must
74
+ call the model itself: such a call is outside the Turn's usage record. Each name once.
75
+ - `effector` (optional): `object`
76
+
77
+ The image of the Sandbox Effector. This container runs three kinds of Effect for this
78
+ Workspace: a `push`, an `http` Effect with a Worktree file as its body, and a `command` with an
79
+ Effect secret in its `env`. It gets the Effect secrets that those Effects name. Give an image
80
+ when those Effects need tools or credentials that you keep out of the Sandbox Image, such as
81
+ `terraform`. A `file:` URL or a registry ref, as for `image`. Default: the Sandbox Image,
82
+ which already holds `git`.
83
+
84
+ - `image`: `string`
@@ -0,0 +1,25 @@
1
+ ---
2
+ title: Secret
3
+ description: "What `secret(\"name\")` gives: an Effect secret, by its name in the `secrets` list of `jr2.config.ts`."
4
+ ---
5
+
6
+ # `Secret`
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 Secret = { readonly secret: string; readonly path: { readonly secret: string; readonly path: true } };
12
+ ```
13
+
14
+ What `secret("name")` gives: an Effect secret, by its name in the `secrets` list of
15
+ `jr2.config.ts`. Put it in an Effect's `auth`, a header, a `text` or a command's `env`. Its
16
+ `.path` is the path of a file that holds the value. The value stays in the Effector, so the
17
+ Machine and the Agent never see it.
18
+
19
+ **Fields**
20
+
21
+ - `secret`: `string`
22
+ - `path`: `object`
23
+
24
+ - `secret`: `string`
25
+ - `path`: `true`
@@ -0,0 +1,19 @@
1
+ ---
2
+ title: Sender
3
+ description: "Who delivered an event: an Agent by its slot, or a Gate by its invoke id (ADR-0015)."
4
+ ---
5
+
6
+ # `Sender`
7
+
8
+ Type, in `src/define-event.ts` of `@jr2/agent-protocol`, a dependency of `@jr2/orchestrator`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type Sender = { readonly party: "agent" | "gate"; readonly id: string };
12
+ ```
13
+
14
+ Who delivered an event: an Agent by its slot, or a Gate by its invoke id ([ADR-0015](../decisions/0015-authoring-surface-absorbs-the-mechanism.md)).
15
+
16
+ **Fields**
17
+
18
+ - `party`: `"agent" | "gate"`
19
+ - `id`: `string`
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: SentByGuards
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `SentByGuards`
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 SentByGuards = { [SENT_BY]: { id: string } };
12
+ ```
@@ -0,0 +1,85 @@
1
+ ---
2
+ title: Size
3
+ description: "The Size of a Workspace: the most memory and cpu that its whole Sandbox can use."
4
+ ---
5
+
6
+ # `Size`
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 Size = {
12
+ limits: {
13
+ memory?: Quantity;
14
+ cpu?: Quantity;
15
+ };
16
+ };
17
+ ```
18
+
19
+ The Size of a Workspace: the most memory and cpu that its whole Sandbox can use. jr2 reserves
20
+ all of it on the node. Thus a Sandbox never gets less than its Size and never uses more.
21
+
22
+ Write it as `{ limits: { memory, cpu } }`. You can write it in three places: the `resources`
23
+ option of `workspace()`, `customize(machine, { resources })`, and `sandbox.resources` in
24
+ `jr2.config.ts`. The Size is a fact of the Machine. The Instance's `sandbox.resources` applies
25
+ only to a Workspace that states no Size. A field that neither states comes from the kit default:
26
+ memory `2Gi`, cpu `1`.
27
+
28
+ The same shape is the User Container's part of the Size, in `user: { image, resources }`. There,
29
+ a field you leave out gives the User Container no limit of its own: it shares the pod's budget.
30
+
31
+ It refuses any key but `limits.memory` and `limits.cpu`, where you write it. The message names
32
+ the field: `<where>` is where you wrote the Size, for example `workspace(): resources`.
33
+
34
+ - `<where>.requests is not accepted — jr2 reserves the whole Size, so every request equals its
35
+ limit — a Size is { limits: { memory?, cpu? } } and nothing else — Agent Substrate's template
36
+ size (ADR-0060)`
37
+ - `<where>.<key> is not accepted — a Size is { limits: { memory?, cpu? } } and nothing else —
38
+ Agent Substrate's template size (ADR-0060)`
39
+ - `<where>.limits.<key> is not accepted — a Size is { limits: { memory?, cpu? } } and nothing
40
+ else — Agent Substrate's template size (ADR-0060)`
41
+ - `<where>.limits.memory: <value> is not a positive quantity (e.g. "2Gi", "512Mi")`, and for
42
+ cpu, `<where>.limits.cpu: <value> is not a positive quantity (e.g. "2", "1500m")`
43
+
44
+ `jr2 up` also refuses a Size that leaves the Harness container less than its floor. The message
45
+ starts with `the Size leaves the Harness container <memory> memory, below its 256Mi floor:` or
46
+ with `the Size leaves the Harness container no cpu:`. The text that follows names each number
47
+ and where it came from.
48
+
49
+ **Fields**
50
+
51
+ - `limits`: `object`
52
+
53
+ The two limits. Write `limits: {}` to state no field: each field then comes from the next
54
+ source.
55
+
56
+ - `memory` (optional): [`Quantity`](type-quantity.md)
57
+
58
+ The memory limit, as a Kubernetes quantity: `"4Gi"`, `"512Mi"`, or a number of bytes.
59
+ It must be more than zero. When you leave it out, it comes from the next source, as above.
60
+ - `cpu` (optional): [`Quantity`](type-quantity.md)
61
+
62
+ The cpu limit, as a Kubernetes quantity: `"2"`, `"1500m"`, or a number of cpus. It must be
63
+ more than zero. jr2 enforces it. When you leave it out, it comes from the next source, as
64
+ above.
65
+
66
+ **Example**
67
+
68
+ ```ts
69
+ import { customize, type Size } from "@jr2/orchestrator";
70
+ import { task } from "@jr2/machines";
71
+
72
+ const size: Size = { limits: { memory: "4Gi", cpu: "2" } };
73
+
74
+ export const machine = customize(task, {
75
+ repos: { app: { url: "https://github.com/you/app.git" } },
76
+ agents: { coder: { model: "anthropic/claude-haiku-5-5" } },
77
+ resources: size,
78
+ });
79
+ ```
80
+
81
+ **See also**
82
+
83
+ - [Size a Workspace](../../guides/size-a-workspace.md)
84
+ - [Workspaces](../../concepts/workspaces.md)
85
+ - [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,24 @@
1
+ ---
2
+ title: SlotHandles
3
+ description: The handles of a Workspace that declares Repo Slots.
4
+ ---
5
+
6
+ # `SlotHandles`
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 SlotHandles<TSlots extends string> = {
12
+ repos: { [K in TSlots]: `/work/${K}` };
13
+ };
14
+ ```
15
+
16
+ The handles of a Workspace that declares Repo Slots. @internal
17
+
18
+ **Fields**
19
+
20
+ - `repos`: ``{ [K in TSlots]: `/work/${K}`; }``
21
+
22
+ The folder of each Repo Slot, `/work/<slot>`, in the order that `repos` declares the slots.
23
+ `${handle}/default` is the clone, on the Binding's base. Any other Worktree is one the Machine
24
+ cut with `worktree()`.
@@ -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, TInput = unknown> = {
12
+ next:
13
+ | PromiseActorLogic<SourceNextResult<T>, PoolNextInput<TInput>>
14
+ | PromiseActorLogic<{ item: T | null; open: number }, PoolNextInput<TInput>>
15
+ | PromiseActorLogic<T | null, PoolNextInput<TInput>>
16
+ | PromiseActorLogic<null, PoolNextInput<TInput>>;
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>, PoolNextInput<TInput>> | PromiseActorLogic<{ item: T | null; open: number; }, PoolNextInput<TInput>> | PromiseActorLogic<T | null, PoolNextInput<TInput>> | PromiseActorLogic<null, PoolNextInput<TInput>>`
27
+
28
+ Claim the next ready item. Write it as an xstate promise actor,
29
+ `fromPromise(async ({ input }) => …)`. Its input is [`PoolNextInput`](type-poolnextinput.md): `active`, the ids of
30
+ the items that workers have now, `settled`, the ids of the items that finished or failed, and
31
+ `input`, the Pool's input. It must not give again an item in `active` or `settled`. It resolves
32
+ to a [`SourceNextResult`](type-sourcenextresult.md). The Pool calls it when the run 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.