@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
@@ -70,8 +70,8 @@ _Avoid_: agent (unqualified), coding agent (a `coder` Agent codes too), copilot,
70
70
 
71
71
  **Console**:
72
72
  The browser surface that the Orchestrator serves, where a person sees the Workflows, their runs and their Machines.
73
- Observation needs no token; the Instance token unlocks control, so that a person can start runs and see and answer the
74
- open Gates.
73
+ Observation needs no token; a Caller's credential unlocks the control that its scopes allow, so that a person can start
74
+ runs and see and answer the open Gates.
75
75
  _Avoid_: visualizer (only one panel of it), dashboard, UI (unqualified), viz
76
76
 
77
77
  <a id="kit-image"></a>
@@ -147,9 +147,9 @@ _Avoid_: agent actor
147
147
  <a id="agent"></a>
148
148
 
149
149
  **Agent**:
150
- A configured worker, such as a coder or a reviewer: a model, instructions, Working tools and access to the Workspace.
151
- It is a data definition that a Machine carries in a named Actor slot, so its name is the slot's name and its scope is
152
- that Machine; a Turn can set its Dials but never its identity.
150
+ A configured worker, such as a coder or a reviewer: a model, instructions, Working tools, MCP tools and access to the
151
+ Workspace. It is a data definition that a Machine carries in a named Actor slot, so its name is the slot's name and its
152
+ scope is that Machine; a Turn can set its Dials but never its identity.
153
153
  _Avoid_: role, persona, roster entry
154
154
 
155
155
  <a id="dials"></a>
@@ -213,7 +213,43 @@ _Avoid_: humanGate (humans are one caller among many), approval (one possible ev
213
213
  **Sender**:
214
214
  The party that delivered an event: an Agent or a Gate. Only the Orchestrator writes the Sender, on each event that a
215
215
  party delivers, and the Machine's own events have none.
216
- _Avoid_: origin, caller (the human or system behind a Gate)
216
+ _Avoid_: origin, Caller (the holder of the credential behind a Gate's answer)
217
+
218
+ <a id="caller"></a>
219
+
220
+ **Caller**:
221
+ The holder of a credential that acts on an Instance from outside its Machines, such as a person, a CI job or a bridge
222
+ to a chat service: it starts a run, answers a Gate, sends a **Steering message** or cancels a run. A Caller can act
223
+ **on behalf of** another party, but that is the Caller's claim, which jr2 does not check, except where a **Hook**'s
224
+ signature covers it.
225
+ _Avoid_: principal (it brings policies and roles that an Instance does not have), user (a CI job is a Caller), actor
226
+ (xstate's word), Sender (a party inside the run)
227
+
228
+ <a id="steering-message"></a>
229
+
230
+ **Steering message**:
231
+ Free text that a Caller, or the Machine, sends to one Agent of a run, named by its slot, which the Agent hears once,
232
+ without an interrupt. A Caller's is an instruction from outside the run; the Machine's can carry what another Agent said, which is
233
+ a peer's word, not an instruction. It is not a fact from jr2, and it is not a pick.
234
+ _Avoid_: steer (as a noun), notice (a fact that jr2 knows and the Agent cannot find), prompt (the Turn's, from the
235
+ Machine), interrupt (`abort` is the terminal act)
236
+
237
+ <a id="hook"></a>
238
+
239
+ **Hook**:
240
+ An Instance's door, at a stable address, for one outside service that sends it deliveries, such as a forge or an alert
241
+ service. A Hook checks that a delivery is the service's and decides nothing: it is a Caller that can only answer a Gate
242
+ or bring items to a Source. Its Hook kind, such as `github` or `slack`, is the service's protocol.
243
+ _Avoid_: webhook (the service's request, not the door), endpoint, trigger, listener, subscription, intake; not an engine
244
+ hook or a git hook
245
+
246
+ <a id="hook-kind"></a>
247
+
248
+ **Hook kind**:
249
+ One outside service's protocol, as code that an Instance imports: what the service signed, how to read a delivery and
250
+ its payloads, the service's handshake, and the envelope of an answer that a person reads. It never holds a secret, and
251
+ one kind serves every Hook of that service.
252
+ _Avoid_: plugin, adapter (a Source's word), integration, driver
217
253
 
218
254
  <a id="emit"></a>
219
255
 
@@ -225,9 +261,9 @@ _Avoid_: event (what a Gate or an Agent delivers), log (not a diagnostic)
225
261
  <a id="effect"></a>
226
262
 
227
263
  **Effect**:
228
- Work that a Machine does outside itself: it runs a command, calls a URL, pushes a branch or starts a run. A run that
229
- an Effect started is **dispatched by** the run that started it, and the two are independent: an in-run child is a
230
- nested Machine, never a dispatched run.
264
+ Work that a Machine does outside itself: it runs a command, calls a URL, calls an MCP server, pushes a branch
265
+ or starts a run. A run that an Effect started is **dispatched by** the run that started it, and the two are independent:
266
+ an in-run child is a nested Machine, never a dispatched run.
231
267
  _Avoid_: action (xstate's word), side effect, job, task, step, operation, errand, tool; sub-run, child run, nested run,
232
268
  spawned run (a dispatched run is a run of its own)
233
269
 
@@ -235,8 +271,9 @@ spawned run (a dispatched run is a run of its own)
235
271
 
236
272
  **Open**:
237
273
  A part that a Machine declares but does not bind, so that its composer binds it: for example, a Repo Slot with no url,
238
- an Agent with no model, or an Effect with no url, program or secret. It is the shape that a packaged Machine ships in,
239
- `jr2 up` refuses an Open part that nobody bound, and a run never sees one, except an Open body, which a run binds.
274
+ an Agent with no model, or an Effect with no url, program, MCP server or tool, or secret. It is the shape that a
275
+ packaged Machine ships in, `jr2 up` refuses an Open part that nobody bound, and a run never sees one, except an Open
276
+ body, which a run binds, and a Gate's Open look, about which `jr2 up` only warns.
240
277
  _Avoid_: unset, default (an Open part has none), placeholder
241
278
 
242
279
  <a id="open-body"></a>
@@ -274,6 +311,13 @@ _Avoid_: template, expression, interpolation, variable, placeholder (the `{{ }}`
274
311
 
275
312
  ### Turns and conversations
276
313
 
314
+ <a id="conversation"></a>
315
+
316
+ **Conversation**:
317
+ One Agent's exchange with its model, from its first Turn to its end: the prompts, the model's words, its tool calls and
318
+ their results. An Instance ID names it, and one conversation spans one or more Turns.
319
+ _Avoid_: session, transcript, chat, log
320
+
277
321
  <a id="turn"></a>
278
322
 
279
323
  **Turn**:
@@ -327,8 +371,9 @@ _Avoid_: result, status
327
371
  **Sweep**:
328
372
  The Turn's sweep: the Orchestrator's end of an Agent's Submissions when the state that asked for the Turn stops
329
373
  waiting. It settles the running Submission and every one queued behind it. It says how the Turn ended: by the Turn's
330
- own pick, or by something else. Two other sweeps are not this one: the image sweep of `jr2 up` (ADR-0039,
331
- "swept N image(s)"), and the Repo sweep of `jr2 gc` (ADR-0051).
374
+ own pick, or by something else. Other sweeps are not this one: the image sweep of `jr2 up` (ADR-0039,
375
+ "swept N image(s)"), the Repo sweep of `jr2 gc` (ADR-0051), and the run sweep of the Orchestrator, which deletes the
376
+ ended runs older than `runs.retain` and, when the state volume is more than 80% full, the oldest kept conversations (ADR-0065).
332
377
  _Avoid_: abort (the wire's route, not the act), cancel (the end of a run)
333
378
 
334
379
  <a id="runaway"></a>
@@ -342,7 +387,7 @@ _Avoid_: degeneration (the model behavior, not the fault class), loop, hang, sta
342
387
 
343
388
  **step**:
344
389
  One tool call of a model answer that the engine starts while a Turn is live, whether or not it runs: a call of a
345
- Working tool or a pick, a call of an unknown tool or with invalid arguments, a pick that the Harness blocks as the
390
+ Working tool, of an MCP tool or a pick, a call of an unknown tool or with invalid arguments, a pick that the Harness blocks as the
346
391
  second pick of its model answer, each call of a model answer that hit the output limit, and the call that trips the
347
392
  Runaway watch. A call after a pick that ended the Turn is not a step. The Harness counts steps to find a Runaway. A
348
393
  **step boundary** is the point after a model answer and the results of all its calls, and before the next model
@@ -414,9 +459,20 @@ re-prompt of an open Turn)
414
459
 
415
460
  **Working tools**:
416
461
  The file and shell tools that the Harness runs in its own container: what an Agent may do, as its Menu is what it may
417
- say. The Agent's access to the Workspace decides which of them it gets, and a Menu-only Agent gets none.
462
+ say. Every program that they run, and their file I/O, is confined, so it cannot reach what the Harness itself holds. The
463
+ Agent's access to the Workspace decides which of them it gets, and a Menu-only Agent gets none.
418
464
  _Avoid_: tools (unqualified), sandbox tools
419
465
 
466
+ <a id="mcp-tools"></a>
467
+
468
+ **MCP tools**:
469
+ The tools of the MCP servers that an Agent's definition names: what an Agent may do through a service, beside its
470
+ Working tools and its Menu. The Instance's config declares each server by a name of the author's, and the Agent names
471
+ the servers and, for a remote server, the tools that it may call. They are fixed for a conversation, and a call to one
472
+ is never a pick. A call that needs a person's approval is not made with an MCP tool: the Machine makes it as an Effect,
473
+ after a Gate.
474
+ _Avoid_: connector, plugin, integration, extension, tools (unqualified)
475
+
420
476
  ### Sandboxes, Harnesses and secrets
421
477
 
422
478
  <a id="sandbox"></a>
@@ -429,9 +485,9 @@ _Avoid_: worker pod, container
429
485
  <a id="harness"></a>
430
486
 
431
487
  **Harness**:
432
- jr2's own long-running server that hosts the conversations of Agents and executes their Working tools, in every Sandbox
433
- and once per Instance as the Instance Harness. It holds no Agent of its own: each Submission carries the definition
434
- that it runs.
488
+ jr2's own long-running server that hosts the conversations of Agents and executes their Working tools and calls their
489
+ MCP tools, in every Sandbox and once per Instance as the Instance Harness. It holds no Agent of its own: each Submission
490
+ carries the definition that it runs.
435
491
  _Avoid_: flue agent, server, `local()`
436
492
 
437
493
  <a id="engine"></a>
@@ -462,36 +518,60 @@ firewall
462
518
  <a id="held-secret"></a>
463
519
 
464
520
  **Held secret**:
465
- A credential that the Harness uses through its pod's Custodian but never holds: a model API key above all, and the
466
- Sandbox token. The Harness holds only its Stand-in, so the Agent cannot take the secret out of the pod, but it can spend
467
- it through the Custodian while the pod lives.
521
+ A credential that the Harness uses through its pod's Custodian but never holds: a model API key above all, the token of
522
+ an MCP server that an Agent names, and the Sandbox tokens. The Harness holds only its Stand-in, so no Agent can take the
523
+ secret out of the pod. Workspace code can spend it through the Custodian, while the pod lives, only when its Workspace
524
+ grants that secret.
468
525
  _Avoid_: masked secret, injected secret, proxied key, secret (unqualified)
469
526
 
470
527
  <a id="stand-in"></a>
471
528
 
472
529
  **Stand-in**:
473
- The public value that the Harness holds in place of a Held secret. It means something only to the Custodian, and only
474
- toward a host that the secret is bound to; sent anywhere else, it arrives as it left.
530
+ The value that the Harness holds in place of a Held secret. It means something only to the Custodian, and only toward a
531
+ host or a route that the secret is bound to; sent anywhere else, it arrives as it left. It is secret, and only the
532
+ Harness itself holds it: Workspace code gets a Stand-in only for a secret that its Workspace grants, and never the one
533
+ for the control token. The one public Stand-in is the fetch token's, which can only ask for a fetch.
475
534
  _Avoid_: placeholder (an Open part's word), dummy key, fake key, token, mask
476
535
 
536
+ <a id="sandbox-token"></a>
537
+
538
+ **Sandbox token**:
539
+ A credential that jr2 makes for one Sandbox, which its Custodian alone holds. There are two. The **control token** lets
540
+ the Harness read each Agent's Menu and deliver its picks, for the Agent that the Harness names. The **fetch token** lets
541
+ a process in the pod ask for a fetch of a Repo that the Sandbox holds. Each one is good only for its own work and in its
542
+ own Sandbox, and neither one reaches a Gate.
543
+ _Avoid_: pod token, agent token, slot token, Instance token (the Caller's credential)
544
+
545
+ <a id="workspace-code"></a>
546
+
547
+ **Workspace code**:
548
+ Each process in a Sandbox whose program or input comes from the Workspace's shared files: what an Agent's Working tools
549
+ run, tests and builds, git and what a repository's own config makes it run, a stdio MCP server, and a command that a
550
+ Machine runs there. Any Agent can run what another Agent wrote, so jr2 trusts none of it, and no credential that acts
551
+ for an Agent is where Workspace code runs.
552
+ _Avoid_: agent code (any Agent can run another's), user code, untrusted code (unqualified), tool process
553
+
477
554
  <a id="check-pod"></a>
478
555
 
479
556
  **Check pod**:
480
- The one-shot pod in which the provider preflight of `jr2 up` checks the models of one class of Harness pod, before the
481
- converge writes an object that the Instance reads. It has a Custodian, its own copies of the objects that it reads, and
482
- labels that no Harness pod has. Its check container calls each model as a Turn calls it. The preflight is the step of
483
- `jr2 up`, and a check is what the check container does for one model: one call, and at most a second one after an
484
- answer in text. `jr2 check` is not this check: it runs the typecheck and the Machine walk of `jr2 up`, with no pod and no
485
- cluster.
557
+ The one-shot pod in which the provider preflight of `jr2 up` checks the models of one class of Harness pod, and the tool
558
+ list of each remote MCP server that an Agent of the class names, before the converge writes an object that the Instance
559
+ reads. It has a Custodian, its own copies of the objects that it reads, and labels that no Harness pod has. Its check
560
+ container calls each model as a Turn calls it. The preflight is the step of `jr2 up`, and a check is what the check
561
+ container does for one model: one call, and at most a second one after an answer in text; for an MCP server, it reads
562
+ its tool list once through the Custodian. `jr2 check` is not this check: it runs the typecheck and the Machine walk of
563
+ `jr2 up`, with no pod and no cluster.
486
564
  _Avoid_: probe, probe pod, preflight pod, test pod, Harness (it runs none)
487
565
 
488
566
  <a id="effector"></a>
489
567
 
490
568
  **Effector**:
491
- The container where jr2's own process runs a Machine's Effects and holds their secrets, and where the Agent executes
492
- nothing: a Sandbox Effector or the Instance Effector. Every Effect runs in it except a command that names no secret,
493
- which runs beside the Agent, and a dispatch that names no target, which runs in the Orchestrator's own process; a
494
- command that runs in it sees a pinned commit, never the live Worktree.
569
+ The container where jr2's own process holds the secrets that the Orchestrator must not hold and makes the calls to the
570
+ outside that jr2 makes for a Machine or a Hook, and where the Agent executes nothing: a Sandbox Effector or the Instance
571
+ Effector. It serves a Machine's Effects and, in the Instance Effector, the Hook door, and it knows no Hook kind or
572
+ service. Every Effect runs in it except a command that names no secret, which runs beside the Agent, and a dispatch that
573
+ names no target, which runs in the Orchestrator's own process; a command that runs in it sees a pinned commit, never the
574
+ live Worktree.
495
575
  _Avoid_: Courier, Actuator, Clerk, machine container, tool image
496
576
 
497
577
  <a id="sandbox-effector"></a>
@@ -506,7 +586,9 @@ _Avoid_: sidecar, worker, runner
506
586
 
507
587
  **Instance Effector**:
508
588
  The Effector as a stateless pod of its own, one per Instance, for an Effect that calls a URL and reads no Worktree file,
509
- and for a dispatch that starts a run on another Orchestrator.
589
+ for an Effect that calls an MCP server, for a dispatch that starts a run on another Orchestrator, and for the Hook
590
+ door's two operations: it checks an HMAC with a Hook's secret, which the Orchestrator never holds, and makes the door's
591
+ one call out.
510
592
  _Avoid_: sidecar, worker, runner
511
593
 
512
594
  <a id="effect-secret"></a>
@@ -519,7 +601,7 @@ _Avoid_: secret (unqualified), injected secret
519
601
  <a id="sandbox-image"></a>
520
602
 
521
603
  **Sandbox Image**:
522
- The user-owned image that a Sandbox's Harness runs in: the tools that the Agent's Working tools can reach, and the shell
604
+ The user-owned image that a Sandbox's Harness runs in: the tools that the Agent's Working tools can reach, the program of each stdio MCP server, and the shell
523
605
  that a human gets where the Harness runs. A Workspace names it as a fact of its Machine, built by `jr2 up` or brought
524
606
  from a registry, and it carries no part of jr2.
525
607
  _Avoid_: workspace image (a Workspace is a Machine; the image is the pod's), agent image, harness image (the kit's own),
@@ -558,15 +640,17 @@ _Avoid_: sidecar (its deployment shape), debug container (a one-off attach, not
558
640
 
559
641
  **Source**:
560
642
  The port from which a Pool gets its work items. A queue, a generator or a re-queried set can be a Source, and a Work
561
- Source is one Source adapter.
643
+ Source is one Source adapter. A Source can pull (read its set again) and be pushed (hear a Hook, which either tells it to
644
+ read again or carries an item to it); when it can read, the read is the truth.
562
645
  _Avoid_: queue (one possible backing, and not FIFO), feed
563
646
 
564
647
  <a id="pool"></a>
565
648
 
566
649
  **Pool**:
567
- The Machine that the kit supplies to run one worker Machine for each Source item, with a limit on how many run at the
568
- same time.
569
- _Avoid_: scheduler, work loop
650
+ The Machine that the kit supplies to run one worker for each Source item, with a limit on how many run at the same
651
+ time. A worker is a child Machine inside the Pool's run, or a run of another Workflow that the Pool dispatches. A Pool
652
+ of runs can be **standing**: jr2 keeps it live for the Instance, and it parks when it has no work instead of ending.
653
+ _Avoid_: scheduler, work loop, intake, router
570
654
 
571
655
  <a id="work-source"></a>
572
656
 
@@ -629,20 +713,29 @@ _Avoid_: role, alias, repo name, workdir, primary repo
629
713
  <a id="binding"></a>
630
714
 
631
715
  **Binding**:
632
- What a Repo Slot resolves to: a Repo's url and an optional base from which the Worktree is cut. With no base, the
633
- Worktree is cut from the Repo's own default branch.
716
+ What a Repo Slot resolves to: a Repo's url and an optional base. The Sandbox's own clone stays on that base, and a new
717
+ branch starts from it. With no base, both use the Repo's own default branch.
634
718
  _Avoid_: config, catalog entry
635
719
 
636
720
  <a id="project-layout"></a>
637
721
 
638
722
  **Project layout**:
639
723
  The convention for the checkouts in a Sandbox: under each Repo Slot, the Sandbox's own clone of the Repo, with the
640
- Worktrees beside it. The node's cache of the Repo is not part of the layout.
724
+ Worktrees beside it. An Agent reads the clone and works in a Worktree. The node's cache of the Repo is not part of the
725
+ layout.
641
726
  _Avoid_: directory structure, repo tree
642
727
 
643
728
  <a id="worktree"></a>
644
729
 
645
730
  **Worktree**:
646
- A git worktree of a Repo Slot for the one branch that its Workspace works on, beside the Sandbox's own clone. Its work
647
- is sequential commits on that branch, not separate worktrees; the Machine, not jr2, chooses the branch and its scope.
648
- _Avoid_: per-task worktree, task branch
731
+ A git worktree of a Repo Slot, in a folder that a Machine names, beside the Sandbox's own clone. It holds one branch, or
732
+ one commit with no branch. The Machine, not jr2, chooses how many Worktrees it cuts, their branches, and which Agents
733
+ work in them.
734
+ _Avoid_: checkout, task branch
735
+
736
+ <a id="cut"></a>
737
+
738
+ **Cut**:
739
+ An Effect's act that makes a Worktree, or reads the one that a cut already made at that path. A cut that cannot happen
740
+ changes nothing.
741
+ _Avoid_: attach (the Workspace's step, which only clones), provision