@jr2/orchestrator 0.5.1 → 0.7.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 (350) hide show
  1. package/console/components/app.ts +55 -15
  2. package/console/components/bottom-drawer.ts +259 -0
  3. package/console/components/drawer.ts +14 -6
  4. package/console/components/fleet.ts +36 -13
  5. package/console/components/machine-pane.ts +61 -5
  6. package/console/components/nav.ts +54 -8
  7. package/console/conversation.ts +161 -0
  8. package/console/login.ts +123 -0
  9. package/console/main.ts +600 -60
  10. package/console/store.ts +611 -64
  11. package/console/style.css +231 -0
  12. package/docs/agents-block.md +2 -2
  13. package/docs/concepts/agents-and-turns.md +142 -29
  14. package/docs/concepts/architecture.md +60 -34
  15. package/docs/concepts/callers-and-hooks.md +205 -0
  16. package/docs/concepts/charts.md +13 -8
  17. package/docs/concepts/composition.md +10 -1
  18. package/docs/concepts/converge.md +7 -2
  19. package/docs/concepts/durable-runs.md +43 -16
  20. package/docs/concepts/effects.md +133 -50
  21. package/docs/concepts/gates.md +95 -25
  22. package/docs/concepts/machines-and-workflows.md +14 -4
  23. package/docs/concepts/pools-and-sources.md +193 -17
  24. package/docs/concepts/secrets-and-trust.md +186 -62
  25. package/docs/concepts/the-menu.md +14 -0
  26. package/docs/concepts/workspaces.md +135 -56
  27. package/docs/get-started/a-model-decides.md +14 -13
  28. package/docs/get-started/an-agent-in-a-sandbox.md +46 -35
  29. package/docs/get-started/connect-a-model.md +1 -1
  30. package/docs/get-started/create-an-instance.md +17 -14
  31. package/docs/get-started/have-your-assistant-write-a-machine.md +111 -40
  32. package/docs/get-started/install.md +4 -0
  33. package/docs/guides/add-tools-to-the-sandbox.md +72 -15
  34. package/docs/guides/answer-a-gate-from-a-forge.md +304 -0
  35. package/docs/guides/answer-a-gate.md +74 -37
  36. package/docs/guides/bind-open-parts.md +29 -12
  37. package/docs/guides/call-an-mcp-tool-from-a-machine.md +572 -0
  38. package/docs/guides/cancel-a-run.md +26 -16
  39. package/docs/guides/cut-a-worktree.md +560 -0
  40. package/docs/guides/fix-a-failed-converge.md +19 -7
  41. package/docs/guides/give-a-caller-a-scope.md +203 -0
  42. package/docs/guides/give-an-agent-mcp-tools.md +422 -0
  43. package/docs/guides/iterate-on-a-machine-on-kind.md +10 -9
  44. package/docs/guides/let-an-agent-write-a-chart.md +14 -7
  45. package/docs/guides/look-inside-a-sandbox.md +115 -42
  46. package/docs/guides/move-from-kind-to-a-shared-cluster.md +16 -0
  47. package/docs/guides/open-the-console.md +63 -14
  48. package/docs/guides/push-and-sign-a-branch.md +67 -21
  49. package/docs/guides/read-a-conversation.md +225 -0
  50. package/docs/guides/run-a-chart-by-name.md +17 -16
  51. package/docs/guides/run-a-command-or-call-a-url.md +84 -41
  52. package/docs/guides/run-one-worker-per-item.md +34 -27
  53. package/docs/guides/set-an-agents-access-and-dials.md +69 -22
  54. package/docs/guides/size-a-workspace.md +19 -6
  55. package/docs/guides/start-a-run-for-each-alert.md +290 -0
  56. package/docs/guides/start-a-run-from-a-run.md +18 -16
  57. package/docs/guides/start-a-run.md +24 -18
  58. package/docs/guides/steer-an-agent.md +332 -0
  59. package/docs/guides/use-a-hosted-provider.md +7 -1
  60. package/docs/guides/watch-a-run.md +146 -117
  61. package/docs/guides/write-a-hook-kind.md +238 -0
  62. package/docs/guides/write-a-tool-as-an-mcp-server.md +351 -0
  63. package/docs/guides/write-a-workflow.md +18 -8
  64. package/docs/llms.txt +110 -23
  65. package/docs/reference/authoring-surface/agent.md +35 -12
  66. package/docs/reference/authoring-surface/answer.md +20 -4
  67. package/docs/reference/authoring-surface/arg.md +28 -6
  68. package/docs/reference/authoring-surface/basic.md +1 -1
  69. package/docs/reference/authoring-surface/bearer.md +1 -1
  70. package/docs/reference/authoring-surface/branchname.md +15 -0
  71. package/docs/reference/authoring-surface/carry.md +23 -0
  72. package/docs/reference/authoring-surface/chartschema.md +1 -1
  73. package/docs/reference/authoring-surface/chartschemafor.md +1 -1
  74. package/docs/reference/authoring-surface/command.md +37 -22
  75. package/docs/reference/authoring-surface/customize.md +4 -1
  76. package/docs/reference/authoring-surface/defineconfig.md +1 -1
  77. package/docs/reference/authoring-surface/defineevent.md +1 -1
  78. package/docs/reference/authoring-surface/dispatch.md +5 -4
  79. package/docs/reference/authoring-surface/fail.md +18 -5
  80. package/docs/reference/authoring-surface/file.md +37 -17
  81. package/docs/reference/authoring-surface/frompick.md +1 -1
  82. package/docs/reference/authoring-surface/gate.md +118 -0
  83. package/docs/reference/authoring-surface/group-agents.md +15 -0
  84. package/docs/reference/authoring-surface/group-charts.md +16 -0
  85. package/docs/reference/authoring-surface/group-composition.md +25 -0
  86. package/docs/reference/authoring-surface/group-config.md +17 -0
  87. package/docs/reference/authoring-surface/group-effects.md +48 -0
  88. package/docs/reference/authoring-surface/group-failure.md +13 -0
  89. package/docs/reference/authoring-surface/group-gates.md +16 -0
  90. package/docs/reference/authoring-surface/group-machine-and-events.md +15 -0
  91. package/docs/reference/authoring-surface/group-steering.md +12 -0
  92. package/docs/reference/authoring-surface/group-types-these-signatures-name.md +137 -0
  93. package/docs/reference/authoring-surface/group-workspaces-and-repos.md +15 -0
  94. package/docs/reference/authoring-surface/http.md +109 -9
  95. package/docs/reference/authoring-surface/isfailure.md +1 -1
  96. package/docs/reference/authoring-surface/isready.md +14 -0
  97. package/docs/reference/authoring-surface/jr2setup.md +14 -4
  98. package/docs/reference/authoring-surface/mcp.md +107 -0
  99. package/docs/reference/authoring-surface/open.md +41 -8
  100. package/docs/reference/authoring-surface/openbody.md +1 -1
  101. package/docs/reference/authoring-surface/paramsof.md +23 -5
  102. package/docs/reference/authoring-surface/pool.md +79 -11
  103. package/docs/reference/authoring-surface/push.md +31 -13
  104. package/docs/reference/authoring-surface/readyof.md +21 -0
  105. package/docs/reference/authoring-surface/reread.md +19 -0
  106. package/docs/reference/authoring-surface/secret.md +26 -5
  107. package/docs/reference/authoring-surface/sentby.md +1 -1
  108. package/docs/reference/authoring-surface/skip.md +22 -0
  109. package/docs/reference/authoring-surface/source.md +59 -4
  110. package/docs/reference/authoring-surface/steer.md +93 -0
  111. package/docs/reference/authoring-surface/text.md +1 -1
  112. package/docs/reference/authoring-surface/type-agentdefinition.md +16 -3
  113. package/docs/reference/authoring-surface/type-agentmcpserver.md +54 -0
  114. package/docs/reference/authoring-surface/type-agentslots.md +4 -1
  115. package/docs/reference/authoring-surface/type-anyframepath.md +14 -0
  116. package/docs/reference/authoring-surface/type-anyworktreepath.md +15 -0
  117. package/docs/reference/authoring-surface/type-bindactors.md +14 -0
  118. package/docs/reference/authoring-surface/type-binding.md +6 -7
  119. package/docs/reference/authoring-surface/type-caller.md +40 -0
  120. package/docs/reference/authoring-surface/type-callerrecord.md +32 -0
  121. package/docs/reference/authoring-surface/type-carry.md +19 -0
  122. package/docs/reference/authoring-surface/type-chainlink.md +3 -3
  123. package/docs/reference/authoring-surface/type-commandinput.md +4 -3
  124. package/docs/reference/authoring-surface/type-commandoptions.md +0 -22
  125. package/docs/reference/authoring-surface/type-commandoutput.md +23 -5
  126. package/docs/reference/authoring-surface/type-customize.md +20 -3
  127. package/docs/reference/authoring-surface/type-delivered.md +17 -0
  128. package/docs/reference/authoring-surface/type-deliveredevent.md +18 -0
  129. package/docs/reference/authoring-surface/type-dispatchdefinition.md +4 -3
  130. package/docs/reference/authoring-surface/type-dispatchoutput.md +9 -2
  131. package/docs/reference/authoring-surface/type-doorlessinput.md +19 -0
  132. package/docs/reference/authoring-surface/type-effectbinding.md +12 -2
  133. package/docs/reference/authoring-surface/type-filebody.md +4 -8
  134. package/docs/reference/authoring-surface/type-framepath.md +14 -0
  135. package/docs/reference/authoring-surface/type-gatebinding.md +15 -0
  136. package/docs/reference/authoring-surface/type-gatehooks.md +12 -0
  137. package/docs/reference/authoring-surface/type-gatelook.md +37 -0
  138. package/docs/reference/authoring-surface/type-gateoutcome.md +32 -0
  139. package/docs/reference/authoring-surface/type-gatereply.md +19 -0
  140. package/docs/reference/authoring-surface/type-gateslot.md +21 -0
  141. package/docs/reference/authoring-surface/type-gateslotinput.md +13 -0
  142. package/docs/reference/authoring-surface/type-gateslotparts.md +18 -0
  143. package/docs/reference/authoring-surface/type-gateslots.md +12 -0
  144. package/docs/reference/authoring-surface/type-gatetypesat.md +13 -0
  145. package/docs/reference/authoring-surface/type-hostinjectedinput.md +3 -5
  146. package/docs/reference/authoring-surface/type-httpdefinition.md +6 -3
  147. package/docs/reference/authoring-surface/type-httpfileinput.md +20 -0
  148. package/docs/reference/authoring-surface/type-httpoutput.md +8 -2
  149. package/docs/reference/authoring-surface/type-jr2config.md +37 -2
  150. package/docs/reference/authoring-surface/type-lateroutcome.md +21 -0
  151. package/docs/reference/authoring-surface/type-lends.md +5 -1
  152. package/docs/reference/authoring-surface/type-lookoutput.md +14 -0
  153. package/docs/reference/authoring-surface/type-mcpcalloutput.md +78 -0
  154. package/docs/reference/authoring-surface/type-mcpnotreturned.md +42 -0
  155. package/docs/reference/authoring-surface/type-mcpoptions.md +47 -0
  156. package/docs/reference/authoring-surface/type-mcpoutput.md +50 -0
  157. package/docs/reference/authoring-surface/type-mcpreadoutput.md +53 -0
  158. package/docs/reference/authoring-surface/type-mcpremoteserver.md +50 -0
  159. package/docs/reference/authoring-surface/type-mcpserver.md +41 -0
  160. package/docs/reference/authoring-surface/type-mcpstdioserver.md +42 -0
  161. package/docs/reference/authoring-surface/type-namedsecret.md +4 -4
  162. package/docs/reference/authoring-surface/type-namestart.md +77 -0
  163. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +1 -6
  164. package/docs/reference/authoring-surface/type-notworktreekeys.md +12 -0
  165. package/docs/reference/authoring-surface/type-openbodydeclaration.md +1 -1
  166. package/docs/reference/authoring-surface/type-openbodyoutput.md +1 -1
  167. package/docs/reference/authoring-surface/type-opencommandinput.md +7 -2
  168. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +1 -6
  169. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +5 -10
  170. package/docs/reference/authoring-surface/type-poolnextinput.md +22 -0
  171. package/docs/reference/authoring-surface/type-poolspec.md +11 -6
  172. package/docs/reference/authoring-surface/type-pushinput.md +22 -3
  173. package/docs/reference/authoring-surface/type-pushoutput.md +33 -8
  174. package/docs/reference/authoring-surface/type-pushsourcespec.md +38 -0
  175. package/docs/reference/authoring-surface/type-readsourcespec.md +47 -0
  176. package/docs/reference/authoring-surface/type-reposlot.md +6 -6
  177. package/docs/reference/authoring-surface/type-reread.md +18 -0
  178. package/docs/reference/authoring-surface/type-runsconfig.md +41 -0
  179. package/docs/reference/authoring-surface/type-sandboxoptions.md +11 -4
  180. package/docs/reference/authoring-surface/type-sender.md +26 -1
  181. package/docs/reference/authoring-surface/type-sendercallerfield.md +14 -0
  182. package/docs/reference/authoring-surface/type-size.md +1 -1
  183. package/docs/reference/authoring-surface/type-skip.md +19 -0
  184. package/docs/reference/authoring-surface/type-slothandles.md +5 -13
  185. package/docs/reference/authoring-surface/type-sourcehooks.md +23 -0
  186. package/docs/reference/authoring-surface/type-sourcein.md +25 -0
  187. package/docs/reference/authoring-surface/type-sourcereply.md +18 -0
  188. package/docs/reference/authoring-surface/type-sourcespec.md +26 -17
  189. package/docs/reference/authoring-surface/type-sourceverdict.md +49 -0
  190. package/docs/reference/authoring-surface/type-standingpoolmachine.md +12 -0
  191. package/docs/reference/authoring-surface/type-standingpoolspec.md +51 -0
  192. package/docs/reference/authoring-surface/type-steerargs.md +20 -0
  193. package/docs/reference/authoring-surface/type-thinkinglevel.md +1 -1
  194. package/docs/reference/authoring-surface/type-usercontainer.md +1 -1
  195. package/docs/reference/authoring-surface/type-workspaced.md +30 -9
  196. package/docs/reference/authoring-surface/type-workspacehandles.md +5 -6
  197. package/docs/reference/authoring-surface/type-workspaceoptions.md +1 -13
  198. package/docs/reference/authoring-surface/type-worktreefound.md +16 -0
  199. package/docs/reference/authoring-surface/type-worktreeinput.md +56 -0
  200. package/docs/reference/authoring-surface/type-worktreekey.md +14 -0
  201. package/docs/reference/authoring-surface/type-worktreeoptions.md +29 -0
  202. package/docs/reference/authoring-surface/type-worktreeoutput.md +45 -0
  203. package/docs/reference/authoring-surface/type-worktreepath.md +16 -0
  204. package/docs/reference/authoring-surface/type-worktreeready.md +37 -0
  205. package/docs/reference/authoring-surface/type-worktreerefused.md +21 -0
  206. package/docs/reference/authoring-surface/workspace.md +66 -38
  207. package/docs/reference/authoring-surface/worktree.md +71 -0
  208. package/docs/reference/authoring-surface.md +88 -147
  209. package/docs/reference/cli.md +413 -74
  210. package/docs/reference/config.md +248 -6
  211. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +10 -9
  212. package/docs/reference/decisions/0002-duplex-streaming-actor.md +81 -14
  213. package/docs/reference/decisions/0004-worktree-provisioning-model.md +27 -21
  214. package/docs/reference/decisions/0005-sandbox-pod-composition.md +39 -25
  215. package/docs/reference/decisions/0006-agent-control-surface.md +6 -3
  216. package/docs/reference/decisions/0007-durable-machine-state.md +1 -1
  217. package/docs/reference/decisions/0009-cli-and-instance-interface.md +150 -49
  218. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +5 -3
  219. package/docs/reference/decisions/0011-workflow-defined-events.md +256 -12
  220. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +39 -32
  221. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +54 -30
  222. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +53 -27
  223. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +26 -16
  224. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +9 -7
  225. package/docs/reference/decisions/0017-pool-over-a-source-port.md +226 -10
  226. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +15 -7
  227. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +53 -27
  228. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +16 -2
  229. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +4 -4
  230. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +124 -43
  231. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +36 -38
  232. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +10 -5
  233. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +16 -7
  234. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +36 -19
  235. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +18 -10
  236. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +3 -2
  237. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +23 -15
  238. package/docs/reference/decisions/0032-the-console-unlocks-with-a-callers-credential.md +101 -0
  239. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +22 -22
  240. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +6 -6
  241. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +13 -12
  242. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +23 -23
  243. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +6 -1
  244. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +57 -46
  245. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +5 -0
  246. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +20 -8
  247. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +55 -40
  248. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +14 -13
  249. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +31 -24
  250. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +18 -10
  251. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +137 -86
  252. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +165 -91
  253. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +7 -7
  254. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +2 -2
  255. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-kept-for-a-set-time.md +109 -0
  256. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +53 -23
  257. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +221 -153
  258. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +161 -96
  259. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +32 -9
  260. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +48 -33
  261. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +56 -30
  262. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +35 -25
  263. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +1 -1
  264. package/docs/reference/decisions/0075-a-machine-cuts-a-worktree-and-the-workspace-only-clones.md +296 -0
  265. package/docs/reference/decisions/0076-an-agents-control-credential-lives-only-where-no-workspace-code-runs.md +347 -0
  266. package/docs/reference/decisions/0077-jr2-requires-landlock-on-every-sandbox-node.md +79 -0
  267. package/docs/reference/decisions/0078-a-caller-comes-from-one-authenticator-seam-and-acts-within-its-scopes.md +285 -0
  268. package/docs/reference/decisions/0079-an-agent-holds-mcp-tools-a-machine-calls-them-as-an-effect-and-the-machine-is-the-approval.md +198 -0
  269. package/docs/reference/decisions.md +9 -4
  270. package/docs/reference/glossary.md +138 -45
  271. package/docs/reference/hooks.md +1077 -0
  272. package/docs/reference/http-api.md +988 -123
  273. package/docs/reference/machines.md +0 -1
  274. package/docs/why.md +7 -5
  275. package/package.json +10 -3
  276. package/src/actor.ts +194 -42
  277. package/src/agent.ts +56 -6
  278. package/src/ambient.ts +3 -5
  279. package/src/assembly-checks.ts +530 -4
  280. package/src/callers.ts +245 -0
  281. package/src/chart.ts +238 -26
  282. package/src/charts.ts +9 -2
  283. package/src/config.ts +566 -7
  284. package/src/conversations.ts +453 -0
  285. package/src/custodian.lua +17 -5
  286. package/src/custodian.ts +257 -77
  287. package/src/customize.ts +154 -7
  288. package/src/dispatch-effect.ts +142 -26
  289. package/src/durability.ts +2 -0
  290. package/src/duration.ts +20 -0
  291. package/src/effect-checks.ts +52 -4
  292. package/src/effect.ts +401 -132
  293. package/src/effector-wire.ts +278 -30
  294. package/src/fail.ts +17 -4
  295. package/src/gate-brand.ts +16 -0
  296. package/src/gate.ts +634 -48
  297. package/src/harness-client.ts +84 -35
  298. package/src/harness-env.ts +33 -0
  299. package/src/held-secrets.ts +197 -39
  300. package/src/holds.ts +5 -2
  301. package/src/hook-kinds/discord.ts +92 -0
  302. package/src/hook-kinds/door.ts +107 -0
  303. package/src/hook-kinds/github.ts +89 -0
  304. package/src/hook-kinds/gitlab.ts +72 -0
  305. package/src/hook-kinds/hook.ts +7 -0
  306. package/src/hook-kinds/index.ts +465 -0
  307. package/src/hook-kinds/slack.ts +151 -0
  308. package/src/hook-kinds/webhook.ts +113 -0
  309. package/src/hooks.ts +506 -0
  310. package/src/http-effect.ts +164 -70
  311. package/src/http.ts +933 -99
  312. package/src/index.ts +30 -5
  313. package/src/instance.ts +196 -26
  314. package/src/internal.ts +23 -3
  315. package/src/kube-client.ts +6 -3
  316. package/src/machine-doc.ts +29 -5
  317. package/src/mcp-effect.ts +424 -0
  318. package/src/model-keys.ts +24 -0
  319. package/src/mount-digest.ts +41 -7
  320. package/src/names.ts +82 -7
  321. package/src/notices.ts +576 -59
  322. package/src/open-body.ts +110 -30
  323. package/src/open-effect.ts +17 -4
  324. package/src/open.ts +40 -7
  325. package/src/parts.ts +125 -35
  326. package/src/party.ts +35 -1
  327. package/src/pick.ts +43 -9
  328. package/src/pool.ts +1172 -172
  329. package/src/registration.ts +249 -17
  330. package/src/repo-identity.ts +7 -3
  331. package/src/repos.ts +20 -2
  332. package/src/run-host.ts +1614 -190
  333. package/src/run-list.ts +191 -0
  334. package/src/sandbox-effect.ts +217 -66
  335. package/src/sandbox-kube.ts +116 -21
  336. package/src/secret-placement.ts +248 -35
  337. package/src/server.ts +53 -4
  338. package/src/setup.ts +158 -38
  339. package/src/snapshot-store.ts +565 -48
  340. package/src/steer.ts +111 -0
  341. package/src/stub-harness.ts +6 -2
  342. package/src/tokens.ts +362 -46
  343. package/src/vocabulary.ts +23 -4
  344. package/src/wire.ts +27 -10
  345. package/src/workspace.ts +314 -259
  346. package/src/worktree.ts +249 -0
  347. package/docs/reference/authoring-surface/type-noslotspec.md +0 -26
  348. package/docs/reference/authoring-surface/type-workspacespec.md +0 -37
  349. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +0 -61
  350. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +0 -65
@@ -137,7 +137,7 @@ seats: workflow "task" — who may send what, per state (ADR-0015)
137
137
  task.working agent:coder: [finish]
138
138
  task.review gate: [approve, request_changes]
139
139
  …
140
- sandbox image "default": building jr2-sandbox-my-instance-default:6389bdf72d50-amd64
140
+ sandbox image "default": building jr2-sandbox-my-instance-default:5e601a543032-amd64
141
141
  no USER declared — the pod's uid-1000 fallback applies
142
142
  kind load → cluster "jr2"
143
143
  …
@@ -161,7 +161,7 @@ jr2 run task --input '{"prompt":"In docs/site/tutorial/greet, one test fails. Fi
161
161
  ```text
162
162
  …
163
163
  → context kind-jr2 / namespace my-instance
164
- run a7a8fc26-851f-4459-9efb-845389acfda9 (task) — attached
164
+ run 79b90360-cdbf-4538-8611-d52da1b8b914 (task) — attached
165
165
  → active "placing"
166
166
  → active "provisioning"
167
167
  → active "attaching"
@@ -183,10 +183,13 @@ jr2 status <run id>
183
183
  ```
184
184
 
185
185
  The status is one line of JSON. While the coder works, `gates` is `[]`. When the run waits at `review`, `gates` holds
186
- the Gate. Its `gate` is `body.review`, and the line ends with its `meta`:
186
+ the Gate. Its `gate` is `body.review`, and the line ends with its `meta`. After the JSON, `jr2 status` prints one line
187
+ for each Worktree that the run cut:
187
188
 
188
189
  ```text
189
- …"gate":"body.review",…,"meta":{"summary":"Fixed the \"trims the name\" test failure in docs/site/tutorial/greet. The bug was that the name wasn't being trimmed before constructing the greeting output. Added `.trim()` to the name extraction in src/greet.js, changing `args.find(...) ?? \"world\"` to `(args.find(...) ?? \"world\").trim()`. All 6 tests now pass.","branch":"jr2/task-d8f59a0c-9ea1-43fc-8d0c-b153caf70f16","worktree":"/work/target/jr2-task-d8f59a0c-9ea1-43fc-8d0c-b153caf70f16"}}]}
190
+ …"gate":"body.review",…,"meta":{"summary":"Fixed the failing \"trims the name\" test in docs/site/tutorial/greet. The bug was in src/greet.js where the name argument wasn't being trimmed, causing `greet([\" ada \"])` to output `'hello, ada '` instead of `'hello, ada'`. Added `.trim()` to the name extraction line. All 6 tests now pass.","branch":"jr2/task-1e805d38-68ac-4ec9-acc8-fc5ce6a68f6b","worktree":"/work/target/task"}}]}
191
+ started by: token/instance on behalf of kubernetes-admin
192
+ worktree: /work/target/task (target), branch jr2/task-1e805d38-68ac-4ec9-acc8-fc5ce6a68f6b
190
193
  ```
191
194
 
192
195
  Run the command again until `gates` holds the Gate.
@@ -196,7 +199,7 @@ Run the command again until `gates` holds the Gate.
196
199
  - `worktree` is the folder in the Sandbox that holds the branch. It is
197
200
  [the Worktree](../reference/glossary.md#worktree).
198
201
 
199
- Copy `branch` and `worktree` from your output. The part after `jr2/task-`, here `d8f59a0c-9ea1-43fc-8d0c-b153caf70f16`,
202
+ Copy `branch` and `worktree` from your output. The part after `jr2/task-`, here `1e805d38-68ac-4ec9-acc8-fc5ce6a68f6b`,
200
203
  is the [Instance ID](../reference/glossary.md#instance-id) of the run. `jr2 status` prints it as `instanceId`. It is not
201
204
  the run id. Do not make the branch name from the run id. With the Instance token, the drawer of the
202
205
  [Console](../reference/glossary.md#console) shows the same `meta`.
@@ -206,27 +209,30 @@ If `meta` has a `reason` and no `summary`, the [Turn](../reference/glossary.md#t
206
209
 
207
210
  ## Find the Sandbox
208
211
 
209
- The label `jr2.dev/run` on the Sandbox holds the full run id. A prefix does not work here. Copy the full run id from the
210
- line `run <run id> (task) — attached` in the first terminal:
212
+ List the Workspaces of the run with [`jr2 workspace ls`](../reference/cli.md#workspace-ls):
211
213
 
212
214
  ```sh
213
- kubectl -n my-instance get sandboxes -l jr2.dev/run=<run id>
215
+ jr2 workspace ls <run id>
214
216
  ```
215
217
 
216
218
  ```text
217
- NAME PHASE ENDPOINT AGE
218
- ws-a7a8fc26-x-38-oakg23 Ready http://ws-a7a8fc26-x-38-oakg23.my-instance.svc:8080 5m10s
219
+ …
220
+ → context kind-jr2 / namespace my-instance
221
+ WORKSPACE SANDBOX WORKFLOW PHASE AGE RUN
222
+ 79b90360/x:23 ws-79b90360-x-23-1gex8om task Ready 81s held
219
223
  ```
220
224
 
221
- `ws-a7a8fc26-x-38-oakg23` is the name of the Sandbox. Your Sandbox has a different name. It starts with `ws-` and the
222
- first 8 characters of the run id. The pod of the Sandbox has the same name. The commands below write it as `<sandbox>`.
225
+ `79b90360/x:23` is the handle of the Workspace: the first 8 characters of the run id, then the path of the Workspace in
226
+ the run. `ws-79b90360-x-23-1gex8om` is the name of the Sandbox. The name of the Sandbox is a handle too. Your values are
227
+ different. The commands below write the handle as `<workspace>`. `held` tells that the run holds the Sandbox.
223
228
 
224
229
  ## Look inside the Sandbox
225
230
 
226
- Go into the `harness` container of the pod. The Agent's tools run in this container:
231
+ Open a shell in the Sandbox with [`jr2 workspace shell`](../reference/cli.md#workspace-shell). The shell runs as the
232
+ Agent's tools run: in the same container, with the same files and the same limits:
227
233
 
228
234
  ```sh
229
- kubectl -n my-instance exec -it <sandbox> -c harness -- bash
235
+ jr2 workspace shell <workspace>
230
236
  ```
231
237
 
232
238
  In the Sandbox, go to the fixture in the Worktree. Then run its tests. `<worktree>` is the `worktree` that you copied:
@@ -237,12 +243,12 @@ node --test
237
243
  ```
238
244
 
239
245
  ```text
240
- ✔ greets the world by default (1.172165ms)
241
- ✔ greets a name (0.138615ms)
242
- ✔ shouts (0.117168ms)
243
- ✔ trims the name (0.067037ms)
244
- ✔ prints help (0.642445ms)
245
- ✔ refuses an unknown flag (0.281559ms)
246
+ ✔ greets the world by default (1.208079ms)
247
+ ✔ greets a name (0.113673ms)
248
+ ✔ shouts (0.070218ms)
249
+ ✔ trims the name (0.054069ms)
250
+ ✔ prints help (0.712678ms)
251
+ ✔ refuses an unknown flag (0.242712ms)
246
252
  ℹ tests 6
247
253
  ℹ suites 0
248
254
  ℹ pass 6
@@ -250,18 +256,18 @@ node --test
250
256
  ℹ cancelled 0
251
257
  ℹ skipped 0
252
258
  ℹ todo 0
253
- ℹ duration_ms 55.318206
259
+ ℹ duration_ms 49.489997
254
260
  ```
255
261
 
256
262
  Your times are different. Read the commits of the coder. The branch starts at the release tag, so the commits after the
257
263
  tag are the commits of the coder:
258
264
 
259
265
  ```sh
260
- git log --oneline v<version>..HEAD
266
+ git --no-pager log --oneline v<version>..HEAD
261
267
  ```
262
268
 
263
269
  ```text
264
- 1a84393 Fix: trim the name before using it in greet output
270
+ 8afef7d (HEAD -> jr2/task-1e805d38-68ac-4ec9-acc8-fc5ce6a68f6b) fix: trim name in greet to handle leading/trailing whitespace
265
271
  ```
266
272
 
267
273
  Each line is one commit. The commit ids and the messages come from the model. The author of each commit is
@@ -283,7 +289,7 @@ jr2 send <run id> --gate body.review --event request_changes --input '{"notes":"
283
289
  ```text
284
290
  …
285
291
  → context kind-jr2 / namespace my-instance
286
- delivered request_changes to gate "body.review" on a7a8fc26-851f-4459-9efb-845389acfda9
292
+ delivered request_changes to gate "body.review" on 79b90360-cdbf-4538-8611-d52da1b8b914
287
293
  ```
288
294
 
289
295
  The coder continues the same conversation, with your notes as its next prompt. The Sandbox and the branch stay. Run
@@ -292,10 +298,10 @@ The coder continues the same conversation, with your notes as its next prompt. T
292
298
  ## Push the branch
293
299
 
294
300
  `task` does not push, and the Agent has no credential to push with. While the run waits at `review`, you push the branch
295
- from the Sandbox. Go into the Sandbox again:
301
+ from the Sandbox. Open a shell in the Sandbox again:
296
302
 
297
303
  ```sh
298
- kubectl -n my-instance exec -it <sandbox> -c harness -- bash
304
+ jr2 workspace shell <workspace>
299
305
  ```
300
306
 
301
307
  In the Sandbox, go to the Worktree. Then push the branch. `<branch>` is the `branch` that you copied:
@@ -312,7 +318,7 @@ Username for 'https://github.com': <you>
312
318
  Password for 'https://<you>@github.com':
313
319
  …
314
320
  To https://github.com/<you>/jr2.git
315
- * [new branch] jr2/task-d8f59a0c-9ea1-43fc-8d0c-b153caf70f16 -> jr2/task-d8f59a0c-9ea1-43fc-8d0c-b153caf70f16
321
+ * [new branch] jr2/task-1e805d38-68ac-4ec9-acc8-fc5ce6a68f6b -> jr2/task-1e805d38-68ac-4ec9-acc8-fc5ce6a68f6b
316
322
  ```
317
323
 
318
324
  `origin` fetches through the Repo cache of the node, and pushes to your fork. Open your fork on GitHub to see the
@@ -337,7 +343,7 @@ jr2 send <run id> --gate body.review --event approve
337
343
  ```text
338
344
  …
339
345
  → context kind-jr2 / namespace my-instance
340
- delivered approve to gate "body.review" on a7a8fc26-851f-4459-9efb-845389acfda9
346
+ delivered approve to gate "body.review" on 79b90360-cdbf-4538-8611-d52da1b8b914
341
347
  ```
342
348
 
343
349
  In the first terminal, `jr2 run` prints the end of the run, then the final status as one line of JSON, and stops:
@@ -346,33 +352,38 @@ In the first terminal, `jr2 run` prints the end of the run, then the final statu
346
352
  …
347
353
  → active "teardown"
348
354
  → done "done"
349
- {"runId":"a7a8fc26-851f-4459-9efb-845389acfda9","workflow":"task",…,"output":{"branch":"jr2/task-d8f59a0c-9ea1-43fc-8d0c-b153caf70f16"}}
355
+ {"runId":"79b90360-cdbf-4538-8611-d52da1b8b914","workflow":"task",…,"output":{"branch":"jr2/task-1e805d38-68ac-4ec9-acc8-fc5ce6a68f6b"},"worktrees":[{"slot":"target","path":"/work/target/task","branch":"jr2/task-1e805d38-68ac-4ec9-acc8-fc5ce6a68f6b"}]}
350
356
  ```
351
357
 
352
358
  ## Make sure that the Sandbox is gone
353
359
 
354
- Use the full run id again:
360
+ List the Workspaces of the run again:
355
361
 
356
362
  ```sh
357
- kubectl -n my-instance get sandboxes -l jr2.dev/run=<run id>
363
+ jr2 workspace ls <run id>
358
364
  ```
359
365
 
360
366
  ```text
361
- No resources found in my-instance namespace.
367
+ …
368
+ → context kind-jr2 / namespace my-instance
369
+ WORKSPACE SANDBOX WORKFLOW PHASE AGE RUN
362
370
  ```
363
371
 
372
+ The list has no row, because the run removed its Sandbox.
373
+
364
374
  ## What happened
365
375
 
366
376
  - `task` is a Machine in a Workspace. The run made a Sandbox for the Workspace and cloned your fork into it. It cut the
367
- branch from the release tag, in a Worktree in `/work/target/`. See [Workspaces](../concepts/workspaces.md).
377
+ branch from the release tag, in the Worktree `/work/target/task`. See [Workspaces](../concepts/workspaces.md).
368
378
  - `task` left its Repo Slots and the model of its coder Open. `customize()` bound them where you registered the
369
379
  Workflow, and `jr2 up` refuses a Workflow with an Open part. See [Composition](../concepts/composition.md) and
370
380
  [ADR-0054](../reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md).
371
381
  - The `review` Gate kept the Sandbox while the run waited. `request_changes` sent the coder back to the same
372
382
  conversation. `approve` ended the run, and the end of the Workspace removed the Sandbox. See
373
383
  [Gates](../concepts/gates.md) and [ADR-0012](../reference/decisions/0012-workspace-wrapper-machine.md).
374
- - You used `kubectl exec` to go into the Sandbox. The guide [Look inside a Sandbox](../guides/look-inside-a-sandbox.md)
375
- gives the same commands.
384
+ - You used `jr2 workspace shell` to go into the Sandbox. The shell runs as the Agent runs, so it cannot read the
385
+ credential of the Agent. The guide [Look inside a Sandbox](../guides/look-inside-a-sandbox.md) gives the same
386
+ commands.
376
387
  - You pushed by hand, because `task` does not push. On the next page, a Machine pushes the branch with an
377
388
  [Effect](../reference/glossary.md#effect).
378
389
 
@@ -183,7 +183,7 @@ jr2 up
183
183
  → .env: ANTHROPIC_API_KEY
184
184
  jr2 up — instance "my-instance" → context kind-jr2 / namespace my-instance
185
185
  …
186
- warning: secrets[0] (ANTHROPIC_API_KEY) is named by nothing; goes nowhere — no workspace() lists it, no Agent's provider reads it, and no Effect names it (ADR-0059, ADR-0068)
186
+ warning: secrets[0] (ANTHROPIC_API_KEY) is named by nothing; goes nowhere — no workspace() lists it, no Agent's provider reads it, and no Effect or Hook names it (ADR-0059, ADR-0068)
187
187
  …
188
188
  converged — `jr2 run <workflow>` when ready
189
189
  ```
@@ -86,7 +86,7 @@ jr2 up — instance "my-instance" → context kind-jr2 / namespace my-instance
86
86
  typecheck: tsc --noEmit (the instance's own compiler)
87
87
  agents: (none) (carried by 1 workflow machine(s))
88
88
  assembly: staging
89
- assembly: ba71fa27f37f (kit v<version>; 1 workflow(s): ping)
89
+ assembly: 50e6f81e3bfb (kit v<version>; 1 workflow(s): ping)
90
90
  kubernetes: v1.36.1 (floor 1.35, ADR-0037)
91
91
  first contact: deploy instance "my-instance" to context kind-jr2 (create namespace "my-instance")? [y/N] y
92
92
  platforms: linux/amd64 (from 1 schedulable node(s))
@@ -94,14 +94,15 @@ images: installed kit — the published v<version> Harness, operator and Orchest
94
94
  …
95
95
  orchestrator: waiting for rollout
96
96
  orchestrator: verified — 1 pod(s) running ghcr.io/snapwich/jr2-orchestrator:<version>
97
- instance effector: none (no Effect is placed there)
98
- assembly: publishing ba71fa27f37f (no current Assembly)
99
- assembly: ba71fa27f37f is current — workflows: ping
97
+ instance effector: none (no Effect is placed there, and no Hook needs it)
98
+ assembly: publishing 50e6f81e3bfb (no current Assembly)
99
+ assembly: 50e6f81e3bfb is current — workflows: ping
100
100
  swept nothing — every labeled image is named by a live root
101
+ …
101
102
  converged — `jr2 run <workflow>` when ready
102
103
  ```
103
104
 
104
- `<version>` is the Kit version, such as `0.4.1`. `ba71fa27f37f` is the hash of the
105
+ `<version>` is the Kit version, such as `0.4.1`. `50e6f81e3bfb` is the hash of the
105
106
  [Assembly](../reference/glossary.md#assembly) of your Instance: your Workflows and your config. Your hash can be
106
107
  different. It changes each time that your Workflows or your config change.
107
108
 
@@ -122,9 +123,9 @@ JSON:
122
123
 
123
124
  ```text
124
125
  → context kind-jr2 / namespace my-instance
125
- run a256ff8a-f99f-42f5-975c-4f93a5008c56 (ping) — attached
126
+ run db1fd16f-166f-4575-b8fb-60cd80321308 (ping) — attached
126
127
  → done "done"
127
- {"runId":"a256ff8a-f99f-42f5-975c-4f93a5008c56","workflow":"ping","instanceId":"0e82cc83-7c15-426f-86ff-e7354873a429","status":"done","value":"done","context":{"message":"hi","reply":"pong: hi"},"children":[],"waiting":[],"held":[],"assembly":"ba71fa27f37f"}
128
+ {"runId":"db1fd16f-166f-4575-b8fb-60cd80321308","workflow":"ping","instanceId":"71af068c-e150-4802-8b1c-6d07d3bb4a08","startedAt":"2026-11-06T19:15:47.436Z","status":"done","value":"done","context":{"message":"hi","reply":"pong: hi"},"children":[],"waiting":[],"held":[],"assembly":"50e6f81e3bfb","startedBy":{"kind":"caller","via":"token","name":"instance","onBehalfOf":"kubernetes-admin"}}
128
129
  ```
129
130
 
130
131
  Your run id and your [Instance ID](../reference/glossary.md#instance-id) are not the same as the ones here. The run is
@@ -155,16 +156,17 @@ Click `ping`. The center shows its Machine, with the states `responding` and `do
155
156
  ## Unlock the Console
156
157
 
157
158
  Without a token, you can look at the runs in the Console, but you cannot start a run or answer a
158
- [Gate](../reference/glossary.md#gate). For these, you need the Instance token. In the first terminal, run:
159
+ [Gate](../reference/glossary.md#gate). For these, you need the token of a Caller with a scope. Here, use the Instance
160
+ token. In the first terminal, run:
159
161
 
160
162
  ```sh
161
163
  kubectl -n my-instance get secret jr2-instance -o jsonpath='{.data.JR2_INSTANCE_TOKEN}' | base64 -d
162
164
  ```
163
165
 
164
- The command prints the token, 48 hexadecimal characters, with no newline after it. Paste the token in the
165
- `instance token` box in the Console nav. Push Enter. The Console checks the token. Then the badge after the box shows
166
- `live`, and a `start` button shows next to `ping`. The browser tab keeps the token until you close the tab. `jr2 up`
167
- keeps the same token each time that it runs.
166
+ The command prints the token, 48 hexadecimal characters, with no newline after it. Paste the token in the `Caller token`
167
+ box in the Console nav. Push Enter. The Console checks the token. Then the badge after the box shows `live`, the nav
168
+ shows `as token/instance`, and a `start` button shows next to `ping`. The browser tab keeps the token until you close
169
+ the tab. `jr2 up` keeps the same token each time that it runs.
168
170
 
169
171
  Keep the port forward open. The next pages use the Console. [Open the Console](../guides/open-the-console.md) gives more
170
172
  about the Console.
@@ -181,8 +183,9 @@ each time that you change the folder. [Converge](../concepts/converge.md) explai
181
183
  it. [Machines and Workflows](../concepts/machines-and-workflows.md) explains the two words.
182
184
 
183
185
  The Console is a page that the Orchestrator serves, at [`GET /`](../reference/http-api.md#get). Anyone who can reach it
184
- can see the runs. Only the holder of the Instance token can start a run or answer a Gate
185
- ([ADR-0032](../reference/decisions/0032-the-console-unlocks-with-the-instance-token.md)).
186
+ can see the runs. Only a [Caller](../reference/glossary.md#caller) with a scope, such as the holder of the Instance
187
+ token, can start a run or answer a Gate
188
+ ([ADR-0032](../reference/decisions/0032-the-console-unlocks-with-a-callers-credential.md)).
186
189
 
187
190
  `jr2 init` wrote `AGENTS.md` for your Assistant. It points to the docs that the Kit installs in
188
191
  `node_modules/@jr2/orchestrator/docs/`. These are the docs of your Kit version