@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
package/src/vocabulary.ts CHANGED
@@ -101,6 +101,44 @@ export function inputSchemaOf(machine: AnyStateMachine): z.ZodObject | undefined
101
101
  return inputSchemas.get(machine.config);
102
102
  }
103
103
 
104
+ /**
105
+ * The door of a wrapper under a parent (ADR-0033). No other door reads a parent's input, so the
106
+ * wrapper parses it, and the parsed shape is what it uses: defaults are applied and unknown keys
107
+ * go. A key in `beside` is no one's to send, so it stays out of the parse and rides beside the
108
+ * result. A value that is wrong is a defect of the parent's Machine: a throw, and its `onError`.
109
+ *
110
+ * @param refusal - the start of the error, which says what the refusal saved
111
+ * @internal
112
+ */
113
+ export function parsedNestedDoor(
114
+ door: z.ZodObject,
115
+ value: Record<string, unknown>,
116
+ beside: readonly string[],
117
+ refusal: string,
118
+ ): Record<string, unknown> {
119
+ const kept = Object.entries(value).filter(([key, v]) => beside.includes(key) && v !== undefined);
120
+ const parsed = door.safeParse(Object.fromEntries(Object.entries(value).filter(([key]) => !beside.includes(key))));
121
+ if (!parsed.success) throw new Error(`${refusal}: ${parsed.error.message}`);
122
+ return { ...(parsed.data as Record<string, unknown>), ...Object.fromEntries(kept) };
123
+ }
124
+
125
+ /** A zod schema, by its shape: the Instance can resolve a zod of its own, so `instanceof` does not
126
+ * tell. */
127
+ export function isZodSchema(value: unknown): boolean {
128
+ return (
129
+ typeof value === "object" &&
130
+ value !== null &&
131
+ "_zod" in value &&
132
+ typeof (value as { safeParse?: unknown }).safeParse === "function"
133
+ );
134
+ }
135
+
136
+ /** The run input that a machine declares: the door that `jr2Setup` attached, or a zod `input` on
137
+ * its `createMachine` config that no door reads (a machine that `setup()` made). */
138
+ export function declaresRunInput(machine: AnyStateMachine): boolean {
139
+ return inputSchemaOf(machine) !== undefined || isZodSchema((machine.config as { input?: unknown }).input);
140
+ }
141
+
104
142
  // Who may send what, per state (ADR-0015): the seats the menu-derivation walk computed. Same key
105
143
  // choice as the vocabulary, for the same reasons. The Machine's doc carries them; `jr2 up` and the
106
144
  // Console show them, so an author reads the audience rule's answer for their own Machine.
@@ -144,22 +182,58 @@ export function loadWarningsOf(machine: AnyStateMachine): string[] {
144
182
  return loadWarnings.get(machine.config) ?? [];
145
183
  }
146
184
 
185
+ // What the HOST adds to the input of the machine a run STARTS with, beside the door
186
+ // (`RunHost.start`). One field today: the run's seed Instance ID, minted with the run and
187
+ // reported by `jr2 status`. It names the RUN, never a conversation — jr2 mints every Agent
188
+ // Instance ID in the input mapper (ADR-0016, ADR-0057), and a Machine cannot pass one in.
189
+ //
190
+ // It is deliberately NOT door material (ADR-0033): no caller sends it — `start` overwrites
191
+ // whatever arrived, after the parse — and it is never served as JSON Schema, so putting it in a
192
+ // door schema would publish it and demand of every caller a field the host supplies anyway.
193
+ //
194
+ // It is also PLACEMENT-DEPENDENT: only the ROOT machine is started with it. A machine invoked
195
+ // further down is fed by its parent, which passes what it chooses. No type can see where a machine
196
+ // sits, so the one contract that must reason about this — `workspace()`'s body guard — takes the
197
+ // permissive answer and counts these keys as PROVIDED, which lets a body declare the field
198
+ // honestly. Counting them as provided (rather than subtracting them from what the body demands)
199
+ // is what keeps their TYPE checked: `instanceId` is a string, and a body asking for anything else
200
+ // is still rejected.
147
201
  /**
148
- * What the HOST adds to the input of the machine a run STARTS with, beside the door
149
- * (`RunHost.start`). One field today: the run's seed Instance ID, minted with the run and
150
- * reported by `jr2 status`. It names the RUN, never a conversation — jr2 mints every Agent
151
- * Instance ID in the input mapper (ADR-0016, ADR-0057), and a Machine cannot pass one in.
202
+ * The fields that jr2 adds to the input of the Machine that a run starts, beside the input that
203
+ * the caller sent. Today it is one field: `instanceId`, an id that jr2 makes for the run.
204
+ *
205
+ * Add it to the type of your root Machine's input when the Machine reads it:
206
+ * `HostInjectedInput & RunInput`. Do not put it in the `input` schema that a run starts with. No
207
+ * caller sends it. jr2 writes it over any value that a caller sends.
208
+ *
209
+ * Only the root Machine of a run gets it. A Machine that another Machine invokes gets the input
210
+ * that its parent gives it. A `workspace()` passes its input to its body, so the body of a root
211
+ * `workspace()` gets it too: `Workspaced<HostInjectedInput & RunInput, "app">`. For example, a cut
212
+ * can name a branch for each run: `` branch: `fix/${context.instanceId}` ``.
213
+ *
214
+ * It is not the run id. Use it, for example, to give each run a branch of its own.
215
+ *
216
+ * @example
217
+ * ```ts
218
+ * import { z } from "zod";
219
+ * import { jr2Setup, type HostInjectedInput } from "@jr2/orchestrator";
220
+ *
221
+ * const runInput = z.object({ ticket: z.string() });
222
+ * type Input = HostInjectedInput & z.infer<typeof runInput>;
152
223
  *
153
- * It is deliberately NOT door material (ADR-0033): no caller sends it — `start` overwrites
154
- * whatever arrived, after the parse — and it is never served as JSON Schema, so putting it in a
155
- * door schema would publish it and demand of every caller a field the host supplies anyway.
224
+ * export const machine = jr2Setup({
225
+ * types: {} as { input: Input; context: Input; output: { run: string; ticket: string } },
226
+ * }).createMachine({
227
+ * id: "ticket",
228
+ * input: runInput,
229
+ * context: ({ input }) => input,
230
+ * initial: "done",
231
+ * states: { done: { type: "final" } },
232
+ * output: ({ context }) => ({ run: context.instanceId, ticket: context.ticket }),
233
+ * });
234
+ * ```
156
235
  *
157
- * It is also PLACEMENT-DEPENDENT: only the ROOT machine is started with it. A machine invoked
158
- * further down is fed by its parent, which passes what it chooses. No type can see where a machine
159
- * sits, so the one contract that must reason about this — `workspace()`'s body guard — takes the
160
- * permissive answer and counts these keys as PROVIDED, which lets a body declare the field
161
- * honestly. Counting them as provided (rather than subtracting them from what the body demands)
162
- * is what keeps their TYPE checked: `instanceId` is a string, and a body asking for anything else
163
- * is still rejected.
236
+ * @see docs/guides/write-a-workflow.md
237
+ * @see docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md
164
238
  */
165
239
  export type HostInjectedInput = { instanceId: string };
package/src/wire.ts CHANGED
@@ -13,19 +13,35 @@
13
13
  // asserts each shape here is mutually assignable with `@jr2/harness/wire`'s, and `@jr2/harness`
14
14
  // stays a devDependency so that file — and only that file — can see the server's copy.
15
15
 
16
- /** How a Submission ends (ADR-0024/0027): `completed` (the prompt resolved), `failed` (the turn
17
- * threw — provider failure after retries, or the Menu connect/list failed), `aborted` (swept). */
18
- export type SettlementOutcome = "completed" | "failed" | "aborted";
19
-
20
- /** The error payload a non-`completed` Settlement carries. */
16
+ /** How a Submission ends (ADR-0024/0027). The Orchestrator is the one judge of how a Turn ended:
17
+ * `completed` (the run returned, and the Turn is still open — the Agent actor asks again,
18
+ * ADR-0016), `ended` (the Turn's own pick ended the Turn, from this Submission or an earlier one of
19
+ * the same Turn, and the sweep said `cause: "pick"`),
20
+ * `failed` (the turn threw — provider failure after retries, the Menu connect/list failed, a
21
+ * Runaway), `aborted` (something else ended the Turn, no sweep came in time, or it was over before
22
+ * it started — ADR-0026). */
23
+ export type SettlementOutcome = "completed" | "ended" | "failed" | "aborted";
24
+
25
+ /** The error payload a `failed` or `aborted` Settlement carries. A `completed` or an `ended` one
26
+ * carries none. */
21
27
  export type SettlementError = { type: string; message?: string };
22
28
 
23
29
  /** `SettlementError.type` for a swept Submission (ADR-0024/0025). */
24
30
  export const SUBMISSION_ABORTED = "submission_aborted";
25
31
 
26
- /** `SettlementError.type` for a Turn the Harness ended as a Runaway (ADR-0035) — no fourth
27
- * `SettlementOutcome`; the typed error on a `failed` settlement is what lets the Agent actor switch
28
- * on the class (one fresh-conversation reroll) without parsing prose. */
32
+ /** Why the Orchestrator sweeps a conversation (ADR-0024): `pick` — the Turn's own pick ended it, so
33
+ * the running Submission settles `ended`. Any other end sends no cause, and the sweep settles
34
+ * `aborted`. */
35
+ export type AbortCause = "pick";
36
+
37
+ /** The body of `POST /agents/:name/:id/abort`. `submissionId` names the Submission the cause is
38
+ * about: the last one ledgered for the Turn, which the Harness settles `ended` only while it is the
39
+ * running one (ADR-0024). */
40
+ export type AbortRequest = { cause?: AbortCause; submissionId?: string };
41
+
42
+ /** `SettlementError.type` for a Turn the Harness ended as a Runaway (ADR-0035). A Runaway is a kind
43
+ * of failure, so it has no outcome of its own: the typed error on a `failed` settlement is what lets
44
+ * the Agent actor switch on the class (one fresh-conversation reroll) without parsing prose. */
29
45
  export const SUBMISSION_RUNAWAY = "runaway";
30
46
 
31
47
  /** `SettlementError.type` for a Submission the Harness admitted but had not settled when it
@@ -33,11 +49,18 @@ export const SUBMISSION_RUNAWAY = "runaway";
33
49
  * Settlement, not a 404. The Agent actor switches on this type, never on the message's prose. */
34
50
  export const SUBMISSION_HARNESS_RESTARTED = "harness_restarted";
35
51
 
36
- /** One settled Submission, in the shape `?view=history`'s `settlements` reports. */
52
+ /** What a Submission's model answers spent, summed: tokens, and the cost in US dollars from the
53
+ * model's catalog rates (0 for a model with no rates). */
54
+ export type SubmissionUsage = { input: number; output: number; cacheRead: number; cacheWrite: number; cost: number };
55
+
56
+ /** One settled Submission, in the shape `?view=history`'s `settlements` reports. `usage` is absent
57
+ * when no model answer reported one, or when the Submission was lost with a restarted Harness. The
58
+ * Orchestrator does not read it yet: the @model tier records it per trial (ADR-0066). */
37
59
  export type Settlement = {
38
60
  submissionId: string;
39
61
  outcome: SettlementOutcome;
40
62
  error?: SettlementError;
63
+ usage?: SubmissionUsage;
41
64
  };
42
65
 
43
66
  /** Where a chunk sits on the durable stream. Ordering only (`batch`, then `index`); the Harness
@@ -59,10 +82,16 @@ export type SubmissionSettledEvent = StreamChunk<"submission-settled"> & Settlem
59
82
  /**
60
83
  * The Harness's memory guard killed the Agent's processes (ADR-0061, layer 4), on the stream of the
61
84
  * conversation whose Turn was running. The Agent heard it in its `bash` answer; this is how the
62
- * Orchestrator hears it, so the next Turn in the Workspace is told (ADR-0062). `peak` and `limit`
63
- * are the guard's own spellings — carried to the notice as they are, never parsed.
85
+ * Orchestrator hears it, so the next Turn in the Workspace is told (ADR-0062). `id` is the kill's:
86
+ * the same on every stream that carries it and in `GET /memory-kills`, so one kill is one notice.
87
+ * `peak` and `limit` are the guard's own spellings — carried to the notice as they are, never parsed.
64
88
  */
65
- export type MemoryLimitEvent = StreamChunk<"memory-limit"> & { peak: string; limit: string };
89
+ export type MemoryLimitEvent = StreamChunk<"memory-limit"> & {
90
+ /** Absent from an older Harness's event, which had none. */
91
+ id?: string;
92
+ peak: string;
93
+ limit: string;
94
+ };
66
95
 
67
96
  /** One event on the durable stream (`GET ?offset=…&view=updates` → 200 JSON array). */
68
97
  export type StreamEvent = MessageAppendedEvent | SubmissionSettledEvent | MemoryLimitEvent;
@@ -73,14 +102,16 @@ export type StreamEvent = MessageAppendedEvent | SubmissionSettledEvent | Memory
73
102
  // Harness writes every word of the Briefing's Turn part from them.
74
103
 
75
104
  /** The Sandbox's processes were killed at its memory limit during `agent`'s Turn — by the
76
- * Harness's guard (`peak` known) or by the kernel (`peak` unknown). Workspace scope: the next Turn
77
- * of any Agent in that Workspace. */
105
+ * Harness's guard (`peak` known) or by the kernel (`peak` unknown). `agent` is absent for every
106
+ * kill read from the pod's list, which cannot say whose Turn a kill ended. Workspace scope: the next
107
+ * Turn of any Agent in that Workspace. */
78
108
  export type MemoryLimitNotice = {
79
109
  kind: "memory-limit";
80
110
  scope: "workspace";
81
- agent: string;
111
+ agent?: string;
82
112
  peak?: string;
83
- limit: string;
113
+ /** Absent with `peak` when the sizes read were not sizes: the notice says no sizes. */
114
+ limit?: string;
84
115
  };
85
116
 
86
117
  /** This conversation is new; earlier context is gone. Conversation scope: that Agent's next
@@ -147,6 +178,49 @@ export type LiveSetRequest = { live: LiveConversation[] };
147
178
  /** What `PUT /agents` answers (200): how many conversations this statement freed. */
148
179
  export type LiveSetResponse = { freed: number };
149
180
 
181
+ /** What a Harness answers (404) to an admission with `kept: true` when it keeps no such
182
+ * conversation (ADR-0062). The client takes a 404 as "not kept" only with `kept: false` on it: a
183
+ * 404 from anything else is a failed admission. */
184
+ export type NotKeptResponse = { error: string; kept: false };
185
+
186
+ // ---- The pod's guard kills (`GET /memory-kills` — ADR-0061, ADR-0062) -------------------------
187
+ // Every guard kill, kept by the Harness pod-scoped. A stream is read only while the Agent actor
188
+ // waits on a Submission, and that wait stops when the Agent's state exits — so a kill while no
189
+ // Submission runs, or after the wait stopped, has no reader there. The actor reads this list before
190
+ // it admits a Turn into the Workspace. The read is idempotent: the notice ledger keeps each `id` it
191
+ // raised (`seen`), whichever path it came by.
192
+
193
+ /** One guard kill: `id` unique for the pod's life and the stream events' `id`, `at` when the guard
194
+ * fired, the guard's own `peak` and `limit`, and `told` — the conversations with a `bash` call
195
+ * running then, whose answer told the Agent of the kill. None when no call ran. */
196
+ export type PodMemoryKill = {
197
+ id: string;
198
+ at: string;
199
+ /** Absent, with `limit`, when the pod could not keep the sizes as sizes. */
200
+ peak?: string;
201
+ limit?: string;
202
+ told: LiveConversation[];
203
+ };
204
+
205
+ /** What `GET /memory-kills` answers (200): the newest kills, oldest first. */
206
+ export type MemoryKillsResponse = { kills: PodMemoryKill[] };
207
+
208
+ // The bounds of the list, the same on the two sides of the wire (ADR-0062). The Agent's uid can
209
+ // write the file the list is read from, so the Harness keeps no kill, and no `told` entry, that the
210
+ // Orchestrator drops. With these bounds the largest answer is 149,259 bytes, under the
211
+ // Orchestrator's read of 256 KiB: 16 kills of 208 bytes and 32 `told` entries of 284 bytes each.
212
+
213
+ /** How many kills the pod keeps. A guard kill is rare; a burst of them is one piece of news. */
214
+ export const KEPT_KILLS = 16;
215
+ /** The most conversations one kill's `told` holds: far more Agents than a Workspace runs. */
216
+ export const MAX_TOLD = 32;
217
+ /** The longest `id` and `at` of a kill. A minted id and an ISO time are less than half of it. */
218
+ export const MAX_KILL_STAMP = 64;
219
+ /** The longest `agent` and `instanceId` of a `told` entry. */
220
+ export const MAX_KILL_NAME = 128;
221
+ /** The most of `GET /memory-kills` the Orchestrator reads, in bytes. */
222
+ export const MAX_KILLS_BODY = 256 * 1024;
223
+
150
224
  // ---- The run-narrative echo (`POST /echo` — ADR-0023) ------------------------------------------
151
225
  // "Print these events": the Orchestrator — the observation feed's one subscriber (ADR-0022) — tees
152
226
  // the owning run's feed to the enclosing Workspace's Harness, which renders it into its own pod log.
@@ -193,18 +267,18 @@ export type EchoRequest = { events: EchoEvent[] };
193
267
  /** One Repo Slot to attach. The Orchestrator resolves the Repo's `identity` and cache `key`
194
268
  * (repo-identity.ts) — the Harness never re-derives them, so the cache it clones from and the node
195
269
  * cache the operator mounted agree by construction (ADR-0051). `url` is the Binding's own spelling,
196
- * the push url (ADR-0005); `ref` is the base the branch starts from, omitted for the Repo's default
197
- * branch. */
270
+ * the push url (ADR-0005); `ref` is the base that `default/` stays on and a new branch starts from,
271
+ * omitted for the Repo's default branch. */
198
272
  export type AttachSlot = { slot: string; url: string; identity: string; key: string; ref?: string };
199
273
 
200
- /** What `POST /attach` accepts: the slots in declaration order, the Workspace's branch, and — for a
201
- * reviewer's seat — the sha the detached review worktree is forced to (ADR-0028). */
202
- export type AttachRequest = { slots: AttachSlot[]; branch: string; reviewSha?: string };
274
+ /** What `POST /attach` accepts: the slots in declaration order. The Workspace only clones, so the
275
+ * request names no branch and no commit (ADR-0075). */
276
+ export type AttachRequest = { slots: AttachSlot[] };
203
277
 
204
- /** What `POST /attach` answers (200): the branch worktree per slot, and the review worktree per
205
- * slot when the request named a `reviewSha`. Freshness is the operator's verdict on the Sandbox,
206
- * which the Orchestrator reads itself — never the Harness's to report. */
207
- export type AttachResponse = { repos: Record<string, string>; review?: Record<string, string> };
278
+ /** What `POST /attach` answers (200): the folder of each slot, and the base that each slot's
279
+ * `default/` holds. Freshness is the operator's verdict on the Sandbox, which the Orchestrator
280
+ * reads itself — never the Harness's to report. */
281
+ export type AttachResponse = { repos: Record<string, string>; bases: Record<string, string> };
208
282
 
209
283
  /** What a failed attach answers: 400 for a body that is not an `AttachRequest`, 500 when a step
210
284
  * failed — `slot` names the Repo Slot, and `error` carries the step and git's own stderr. */
@@ -238,7 +312,7 @@ export type SyncAnswer =
238
312
 
239
313
  /** What `POST /exec/:id` accepts: argv (never shell text), an absolute `cwd` or none, the timeout,
240
314
  * and how many characters of the stream's end the output keeps. */
241
- export type ExecRequest = { argv: string[]; cwd?: string; timeoutMs: number; tail: number };
315
+ export type ExecRequest = { argv: string[]; cwd?: string; root?: true; timeoutMs: number; tail: number };
242
316
 
243
317
  /** How an exec ended. Every one is output; none is a fault. */
244
318
  export type ExecOutcome =