@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
@@ -10,23 +10,18 @@ Type, in `@jr2/orchestrator/src/workspace.ts`. The signature of an export, or a
10
10
  ```ts
11
11
  type PermissiveWorkspaceOptions<TSlots extends string, TInput = unknown> = SandboxOptions<TSlots, TInput> & {
12
12
  input?: never;
13
- spec: (args: { input: TInput }) => WorkspaceSpec;
14
13
  };
15
14
  ```
16
15
 
17
- The options of a `workspace()` with no `input`: it starts with any input. The `input` of `spec`
18
- is then `unknown`, and `spec` must check it before it reads a field.
16
+ The options of a `workspace()` with no `input`: it starts with any input. The `input` of a
17
+ per-run Repo Slot is then `unknown`, and the mapper must check it before it reads a field.
19
18
 
20
- Use it for a Workspace that a Pool or another Machine starts. Give the parameter of `spec` a
21
- type to say what that input is: `spec: ({ input }: { input: Item }) => …`. That also types the
22
- input of the Workspace. For a Workspace that a caller starts, declare `input`.
19
+ Use it for a Workspace that a Pool or another Machine starts. The body's `input` type says what
20
+ that input is, and that also types the input of the Workspace. For a Workspace that a caller
21
+ starts, declare `input`.
23
22
 
24
23
  **Fields**: each field of [`SandboxOptions`](type-sandboxoptions.md), and these:
25
24
 
26
25
  - `input` (optional): `never`
27
26
 
28
27
  Not present: a `workspace()` without `input` starts with any input.
29
- - `spec`: `(args: { input: TInput; }) => WorkspaceSpec`
30
-
31
- A function from the input to the Workspace's [`WorkspaceSpec`](type-workspacespec.md). Its `input` is
32
- `unknown` unless you give the parameter a type: `spec: ({ input }: { input: Item }) => …`.
@@ -0,0 +1,22 @@
1
+ ---
2
+ title: PoolNextInput
3
+ description: "The input of a Source's `next`: the ids of the items that workers have now, the ids of the items that settled, and the Pool's input."
4
+ ---
5
+
6
+ # `PoolNextInput`
7
+
8
+ Type, in `@jr2/orchestrator/src/pool.ts`. It is an export of `@jr2/orchestrator`, in the [Composition](group-composition.md) group of the [Authoring surface](../authoring-surface.md) page.
9
+
10
+ ```ts
11
+ type PoolNextInput<TInput = unknown> = { active: string[]; settled: string[]; input: TInput };
12
+ ```
13
+
14
+ The input of a Source's `next`: the ids of the items that workers have now, the ids of the items
15
+ that settled, and the Pool's input. So a Source over a list that a Machine holds needs no state
16
+ of its own.
17
+
18
+ **Fields**
19
+
20
+ - `active`: `string[]`
21
+ - `settled`: `string[]`
22
+ - `input`: `TInput`
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: PoolSpec
3
- description: "What you pass to `pool()`: where the items come from, how many workers run at once, and what each worker gets."
3
+ description: What you pass to `pool()` with a child Machine as its worker.
4
4
  ---
5
5
 
6
6
  # `PoolSpec`
@@ -11,17 +11,18 @@ Type, in `@jr2/orchestrator/src/pool.ts`. The signature of an export, or a type
11
11
  type PoolSpec<T, TInput = unknown> = {
12
12
  id?: string;
13
13
  input?: z.ZodObject;
14
- source: SourceSpec<T>;
14
+ source: SourceSpec<T, TInput> | SourceSpec<T> | ReadSourceSpec<T, TInput> | ReadSourceSpec<T>;
15
15
  itemId: (item: T) => string;
16
16
  cap?: number | ((args: { input: TInput }) => number);
17
17
  itemInput?: (item: T, args: { input: TInput }) => unknown;
18
18
  onDrained?: "final";
19
19
  failures?: "fail" | "report";
20
+ standing?: false;
20
21
  };
21
22
  ```
22
23
 
23
- What you pass to `pool()`: where the items come from, how many workers run at once, and what
24
- each worker gets.
24
+ What you pass to `pool()` with a child Machine as its worker. It says where the items come
25
+ from, how many workers run at once, and what each worker gets.
25
26
 
26
27
  **Fields**
27
28
 
@@ -33,9 +34,10 @@ each worker gets.
33
34
  The run input of the Pool, as a zod object: what a caller sends to start a run. `cap` and
34
35
  `itemInput` read it, typed by it. A worker never gets it: each worker gets its item. Default:
35
36
  none, and then their `input` is `unknown`.
36
- - `source`: `SourceSpec<T>`
37
+ - `source`: `SourceSpec<T, TInput> | SourceSpec<T> | ReadSourceSpec<T, TInput> | ReadSourceSpec<T>`
37
38
 
38
- Where the items come from. Make it with [`source`](source.md).
39
+ Where the items come from: a pull or a read Source. Make it with [`source`](source.md). A push Source
40
+ needs a standing Pool of runs.
39
41
  - `itemId`: `(item: T) => string`
40
42
 
41
43
  The id of an item. The Pool uses it as the id of the item's worker and in the `active` list
@@ -58,3 +60,6 @@ each worker gets.
58
60
  ends with failures, `drained` or `deadlocked`, it fails the run with the reason
59
61
  `"<n> of <m> items failed"` and the detail `{ status, items, failures }`. `"report"`: the Pool
60
62
  ends `done`, with the failures in its output. Default: `"fail"`.
63
+ - `standing` (optional): `false`
64
+
65
+ A Pool of child Machines never stands: a child cannot be handed over.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: PushInput
3
- description: "The input of a `push` Effect: `{ sha }` with `pin`, and `{ message }` with `squash`."
3
+ description: "The input of a `push` Effect: the Worktree that a cut made, `{ sha }` with `pin`, and `{ message }` with `squash`."
4
4
  ---
5
5
 
6
6
  # `PushInput`
@@ -8,8 +8,27 @@ description: "The input of a `push` Effect: `{ sha }` with `pin`, and `{ message
8
8
  Type, in `@jr2/orchestrator/src/sandbox-effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
9
 
10
10
  ```ts
11
- type PushInput<O extends PushOptions> = (O["pin"] extends true ? { sha: string } : unknown) &
11
+ type PushInput<O extends PushOptions> = {
12
+ worktree: O extends { slot: infer S extends string } ? `/work/${S}/${string}` : AnyWorktreePath;
13
+ branch?: never;
14
+ to?: never;
15
+ cwd?: never;
16
+ path?: never;
17
+ } & (O["pin"] extends true ? { sha: string } : unknown) &
12
18
  (O["squash"] extends true ? { message: string } : unknown);
13
19
  ```
14
20
 
15
- The input of a `push` Effect: `{ sha }` with `pin`, and `{ message }` with `squash`.
21
+ The input of a `push` Effect: the Worktree that a cut made, `{ sha }` with `pin`, and
22
+ `{ message }` with `squash`. It names no branch: jr2 reads it from the cut's record, so no word of
23
+ a Chart reaches a remote branch. The other keys are refused by name, because each is a key of a
24
+ cut or a Turn, and a mapper's excess key is no compile error otherwise.
25
+
26
+ **Fields**
27
+
28
+ - `worktree`: ``O extends { slot: infer S extends string; } ? `/work/${S}/${string}` : AnyWorktreePath``
29
+
30
+ The Worktree to push: `event.output.path` of its cut, of the push's Repo Slot.
31
+ - `branch` (optional): `never`
32
+ - `to` (optional): `never`
33
+ - `cwd` (optional): `never`
34
+ - `path` (optional): `never`
@@ -5,12 +5,13 @@ description: "The output of a `push` Effect: what the `onDone` of its state gets
5
5
 
6
6
  # `PushOutput`
7
7
 
8
- Type, in `@jr2/orchestrator/src/sandbox-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
8
+ Type, in `@jr2/orchestrator/src/sandbox-effect.ts`. It is an export of `@jr2/orchestrator`, in the [Effects](group-effects.md) group of the [Authoring surface](../authoring-surface.md) page.
9
9
 
10
10
  ```ts
11
11
  type PushOutput =
12
12
  | Exclude<PushWireOutput, { outcome: "pushed" }>
13
- | (Omit<Extract<PushWireOutput, { outcome: "pushed" }>, "bundle"> & { sync: SyncState; syncReason?: string });
13
+ | (Omit<Extract<PushWireOutput, { outcome: "pushed" }>, "bundle"> & { sync: SyncState; syncReason?: string })
14
+ | LaterOutcome;
14
15
  ```
15
16
 
16
17
  The output of a `push` Effect: what the `onDone` of its state gets as `event.output`. Every
@@ -40,6 +41,8 @@ Beside `pushed`, `sync` tells what jr2 did to the Agent's branch after the push:
40
41
 
41
42
  With `busy` or `not-synced`, `syncReason` tells why, and jr2 tries again before the next push.
42
43
 
44
+ The union is open (`LaterOutcome`): give the rest a last arm with no guard.
45
+
43
46
  **Forms**: it is one of these objects.
44
47
 
45
48
  - Form 1: `outcome`, `stage`, `reason`, `detail`
@@ -70,13 +73,28 @@ With `busy` or `not-synced`, `syncReason` tells why, and jr2 tries again before
70
73
  - `squashed` (optional): `"signed" | "unsigned"`
71
74
  - `sync`: [`SyncState`](type-syncstate.md)
72
75
  - `syncReason` (optional): `string`
76
+ - Form 5: `outcome`, `reason`
77
+
78
+ - `outcome`: `"(a later outcome)"`
79
+ - `reason` (optional): `string`
73
80
 
74
81
  **Example**
75
82
 
76
83
  ```ts
77
- import { fail, jr2Setup, push, type PushOutput, workspace, type Workspaced } from "@jr2/orchestrator";
84
+ import {
85
+ fail,
86
+ isReady,
87
+ jr2Setup,
88
+ push,
89
+ type PushOutput,
90
+ workspace,
91
+ worktree,
92
+ type Workspaced,
93
+ } from "@jr2/orchestrator";
94
+
95
+ type Input = Workspaced<{ branch: string; sha: string }, "app">;
78
96
 
79
- type Input = Workspaced<{ sha: string }, "app">;
97
+ const releaseTree = (context: Input) => `${context.workspace.repos.app}/release` as const;
80
98
 
81
99
  // A push that did not happen (`rejected` or `diverged`) is a different problem from one jr2
82
100
  // cannot see (`unknown`).
@@ -85,17 +103,24 @@ const notPushed = (output: PushOutput): boolean =>
85
103
 
86
104
  const body = jr2Setup({
87
105
  types: {} as { context: Input; input: Input },
88
- actors: { publish: push({ pin: true }), fail: fail() },
106
+ actors: { cut: worktree({ expect: "existing" }), publish: push({ pin: true }), fail: fail() },
89
107
  }).createMachine({
90
108
  id: "release",
91
109
  context: ({ input }) => input,
92
110
  on: { "workspace.lost": ".lost" },
93
- initial: "publishing",
111
+ initial: "cutting",
94
112
  states: {
113
+ cutting: {
114
+ invoke: {
115
+ src: "cut",
116
+ input: ({ context }) => ({ path: releaseTree(context), branch: context.branch }),
117
+ onDone: [{ guard: ({ event }) => isReady(event.output), target: "publishing" }, { target: "notCut" }],
118
+ },
119
+ },
95
120
  publishing: {
96
121
  invoke: {
97
122
  src: "publish",
98
- input: ({ context }) => ({ sha: context.sha }),
123
+ input: ({ context }) => ({ worktree: releaseTree(context), sha: context.sha }),
99
124
  onDone: [
100
125
  { guard: ({ event }) => event.output.outcome === "pushed", target: "published" },
101
126
  { guard: ({ event }) => notPushed(event.output), target: "notPushed" },
@@ -107,13 +132,13 @@ const body = jr2Setup({
107
132
  // Not final states: each one fails the run, with its own reason.
108
133
  notPushed: { invoke: { src: "fail", input: { reason: "the remote refused the push" } } },
109
134
  unknown: { invoke: { src: "fail", input: { reason: "jr2 cannot tell if the push happened" } } },
135
+ notCut: { invoke: { src: "fail", input: { reason: "the Worktree was not cut" } } },
110
136
  lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
111
137
  },
112
138
  });
113
139
 
114
140
  export const machine = workspace(body, {
115
141
  repos: { app: { url: "https://github.com/you/app.git" } },
116
- spec: () => ({ branch: "release" }),
117
142
  });
118
143
  ```
119
144
 
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: PushSourceSpec
3
+ description: A push Source.
4
+ ---
5
+
6
+ # `PushSourceSpec`
7
+
8
+ Type, in `@jr2/orchestrator/src/pool.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type PushSourceSpec<T> = {
12
+ item: z.ZodType<T>;
13
+ hooks: SourceHooks<Carry<T>, {}>;
14
+ hold?: number;
15
+ reply?: SourceReply<T>;
16
+ };
17
+ ```
18
+
19
+ A push Source. Nothing can be read again, and each item comes in a Hook's delivery. A handler
20
+ gives `carry(item)` or `skip(reason)`. The Pool holds each carried item in its run's blob, in the
21
+ order of arrival, until it claims it. Only a standing Pool takes a push Source. Make one with
22
+ [`source`](source.md).
23
+
24
+ **Fields**
25
+
26
+ - `item`: `z.ZodType<T>`
27
+
28
+ The schema of an item. The Pool parses each carried item with it before it holds it.
29
+ - `hooks`: `SourceHooks<Carry<T>, {}>`
30
+
31
+ A handler for each Hook kind id and event key. It gives `carry(item)` or `skip(reason)`.
32
+ - `hold` (optional): `number`
33
+
34
+ The most items that the Pool holds. Above it, a carried item is `hold-full`, and the Hook's
35
+ answer is 429. Default: 1000.
36
+ - `reply` (optional): `SourceReply<T>`
37
+
38
+ The text that the person who acted reads, from the verdict. Default: none.
@@ -0,0 +1,47 @@
1
+ ---
2
+ title: ReadSourceSpec
3
+ description: A read Source.
4
+ ---
5
+
6
+ # `ReadSourceSpec`
7
+
8
+ Type, in `@jr2/orchestrator/src/pool.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type ReadSourceSpec<T, TInput = unknown, R extends AnyActorLogic = AnyActorLogic> = {
12
+ read: R;
13
+ items?: (output: LookOutput<R>, args: { input: TInput }) => readonly T[];
14
+ wake?: EventDef;
15
+ pollEvery?: number;
16
+ hooks?: SourceHooks<Reread, TInput>;
17
+ reply?: SourceReply<T>;
18
+ };
19
+ ```
20
+
21
+ A read Source. `read` reads the whole set, and `items` turns its answer into the items, in
22
+ order. The read is an `http` Effect marked `idempotent: true`, so it can spend a secret that the
23
+ Instance Effector holds, or a promise (`fromPromise`). Its input is the Pool's input. A read that
24
+ fails gives no items. The read is the truth: a Hook's delivery only says "read again". Make one
25
+ with [`source`](source.md).
26
+
27
+ **Fields**
28
+
29
+ - `read`: `R`
30
+
31
+ The read: an `http` Effect marked `idempotent: true`, or a promise. The Pool runs it at the
32
+ start, after a worker settles, on `wake`, on a Hook's `reread()` and every `pollEvery`.
33
+ - `items` (optional): `(output: LookOutput<R>, args: { input: TInput; }) => readonly T[]`
34
+
35
+ The items in the read's answer, in order. Default: the answer itself, when it is an array.
36
+ - `wake` (optional): [`EventDef`](type-eventdef.md)
37
+
38
+ As a pull Source's `wake`.
39
+ - `pollEvery` (optional): `number`
40
+
41
+ Read again after this many milliseconds while the Pool waits. Default: none.
42
+ - `hooks` (optional): `SourceHooks<Reread, TInput>`
43
+
44
+ What a Hook's delivery does: a handler gives `reread()` or `skip(reason)`. Default: none.
45
+ - `reply` (optional): `SourceReply<T>`
46
+
47
+ The text that the person who acted reads, from the verdict. Default: none.
@@ -5,7 +5,7 @@ description: The value of one Repo Slot in `workspace({ repos })`.
5
5
 
6
6
  # `RepoSlot`
7
7
 
8
- Type, in `@jr2/orchestrator/src/parts.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Workspaces and Repos.
8
+ Type, in `@jr2/orchestrator/src/parts.ts`. It is an export of `@jr2/orchestrator`, in the [Workspaces and Repos](group-workspaces-and-repos.md) group of the [Authoring surface](../authoring-surface.md) page.
9
9
 
10
10
  ```ts
11
11
  type RepoSlot<TInput = unknown> =
@@ -24,10 +24,11 @@ The value of one Repo Slot in `workspace({ repos })`. One of:
24
24
  - a function of the run input, `({ input }) => url` or a [`Binding`](type-binding.md): each run chooses. The
25
25
  url must match an entry of `git.credentials` in `jr2.config.ts`, or the run cannot use it.
26
26
 
27
- The key of the slot is a directory name under `/work`. It starts with a letter, and
28
- `workspace()` and `customize()` refuse a key that does not: ``<where>: Repo Slot key "<key>" is
29
- not a directory name — a slot becomes `/work/<slot>` and its order matters, so it starts with a
30
- letter and matches /^[A-Za-z][A-Za-z0-9._-]*$/ (ADR-0051).`` They refuse a value of another
27
+ The key of the slot is a directory name under `/work`. It starts with a letter, so never with
28
+ `.`: `/work/.jr2/` is reserved for jr2. `workspace()` and `customize()` refuse a key that does
29
+ not: ``<where>: Repo Slot key "<key>" is not a directory name — a slot becomes `/work/<slot>`,
30
+ `/work/.jr2/` is reserved for jr2, and its order matters, so it starts with a letter and matches
31
+ /^[A-Za-z][A-Za-z0-9._-]*$/ (ADR-0051, ADR-0075).`` They refuse a value of another
31
32
  shape: ``<where>: Repo Slot "<slot>" is <what> — a slot is `open`, a url, `{ url, ref? }`, or a
32
33
  mapper `({ input }) => url | { url, ref? }` over the door (ADR-0051).``
33
34
 
@@ -58,7 +59,6 @@ export const deploy = workspace(body, {
58
59
  docs: "https://github.com/you/docs.git",
59
60
  config: open,
60
61
  },
61
- spec: ({ input }) => ({ branch: `deploy/${input.service}` }),
62
62
  });
63
63
  ```
64
64
 
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: Reread
3
+ description: What `reread()` gives.
4
+ ---
5
+
6
+ # `Reread`
7
+
8
+ Type, in `@jr2/orchestrator/src/pool.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type Reread = { readonly [VERDICT]: "reread" };
12
+ ```
13
+
14
+ What `reread()` gives. Only a Source that can read (`next` or `read`) gives it.
15
+
16
+ **Fields**
17
+
18
+ - `[VERDICT]`: `"reread"`
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: RunsConfig
3
+ description: How long jr2 keeps an ended run, and the volume that keeps it (ADR-0065).
4
+ ---
5
+
6
+ # `RunsConfig`
7
+
8
+ Type, in `@jr2/orchestrator/src/config.ts`. It is an export of `@jr2/orchestrator`, in the [Config](group-config.md) group of the [Authoring surface](../authoring-surface.md) page.
9
+
10
+ ```ts
11
+ type RunsConfig = {
12
+ retain?: `${number}${"m" | "h" | "d" | "w"}`;
13
+ volume?: string;
14
+ };
15
+ ```
16
+
17
+ How long jr2 keeps an ended run, and the volume that keeps it ([ADR-0065](../decisions/0065-a-persist-survives-a-crash-and-history-is-kept-for-a-set-time.md)). When the config loads,
18
+ a bad field is refused: `<file> at runs.<field>: <problem>`.
19
+
20
+ **Fields**
21
+
22
+ - `retain` (optional): `` `${number}${"m" | "h" | "d" | "w"}` ``
23
+
24
+ How long jr2 keeps an ended run: its row, its conversations and the hook log. A number and
25
+ `m`, `h`, `d` or `w`, such as `"90d"`. At least `"1h"`, with no upper limit. A live run is
26
+ never removed. Default: `"30d"`.
27
+ - `volume` (optional): `string`
28
+
29
+ The size of the Orchestrator's state volume claim: a number and a unit, such as `"5Gi"` or
30
+ `"500Mi"` (a number with no unit is refused). Default: `"5Gi"` for a
31
+ new claim; unset, `jr2 up` keeps the size of a claim that exists. A larger size grows the
32
+ claim where its StorageClass allows expansion, else `jr2 up` refuses it. A smaller size is
33
+ refused: Kubernetes never makes a claim smaller.
34
+
35
+ **Example**
36
+
37
+ ```ts
38
+ import { defineConfig } from "@jr2/orchestrator";
39
+
40
+ export default defineConfig({ runs: { retain: "90d", volume: "20Gi" } });
41
+ ```
@@ -10,6 +10,7 @@ Type, in `@jr2/orchestrator/src/workspace.ts`. The signature of an export, or a
10
10
  ```ts
11
11
  type SandboxOptions<TSlots extends string, TInput = unknown> = {
12
12
  image?: string;
13
+ workGroup?: number;
13
14
  user?: string | UserContainer;
14
15
  resources?: Size;
15
16
  repos: Record<TSlots, RepoSlot<TInput>> | typeof open;
@@ -30,6 +31,9 @@ clones. They are the same for each run.
30
31
  (`import.meta.resolve("./image")`), which `jr2 up` builds, or a registry ref. Its floor is
31
32
  glibc and git; jr2 adds its own runtime at `/opt/jr2`. Default: the Instance's
32
33
  `images/default`, then jr2's Harness image.
34
+ - `workGroup` (optional): `number`
35
+
36
+ The group id that owns the files in `/work`. Default: 2000. A non-negative integer.
33
37
  - `user` (optional): `string | UserContainer`
34
38
 
35
39
  The User Container: a third container in the Sandbox, for a service that must run beside the
@@ -52,8 +56,8 @@ clones. They are the same for each run.
52
56
  choice. The name is the key of `workspace.repos` in the body and the directory under `/work`.
53
57
  At least one slot. Leave `repos` out for a Workspace with no Repo Slot (see
54
58
  [`NoSlotWorkspaceOptions`](type-noslotworkspaceoptions.md)). Each value is one of:
55
- - a url, or `{ url, ref }`, where `ref` is the branch or commit that the Worktree starts from
56
- (default: the Repo's default branch);
59
+ - a url, or `{ url, ref }`, where `ref` is the branch, the tag or the commit that the clone
60
+ stays on, and that a new branch starts from (default: the Repo's default branch);
57
61
  - `open`, for the Instance that registers the Machine to bind with `customize()`;
58
62
  - a function of the run input, `({ input }) => url` or `{ url, ref }`, when each run chooses.
59
63
 
@@ -63,8 +67,11 @@ clones. They are the same for each run.
63
67
 
64
68
  The Held secrets that this Sandbox can use: names from the `secrets` list in `jr2.config.ts`.
65
69
  The Sandbox's Custodian holds each value and puts it into requests to the hosts of that Held
66
- secret. The Agent sees only a Stand-in. You need not list the model key of an Agent that runs
67
- here: its provider claims it. Each name once.
70
+ secret. Listing a name also gives its Stand-in to the Agent's programs — each `bash` call, test,
71
+ build and `command` — in their env under that name, so code in `/work` can spend it ([ADR-0076](../decisions/0076-an-agents-control-credential-lives-only-where-no-workspace-code-runs.md)).
72
+ You need not list the model key of an Agent that runs here: its provider claims it, and the
73
+ Harness gives it to the model calls alone. List the model key only when code in `/work` must
74
+ call the model itself: such a call is outside the Turn's usage record. Each name once.
68
75
  - `effector` (optional): `object`
69
76
 
70
77
  The image of the Sandbox Effector. This container runs three kinds of Effect for this
@@ -8,12 +8,37 @@ description: "Who delivered an event: an Agent by its slot, or a Gate by its inv
8
8
  Type, in `src/define-event.ts` of `@jr2/agent-protocol`, a dependency of `@jr2/orchestrator`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
9
 
10
10
  ```ts
11
- type Sender = { readonly party: "agent" | "gate"; readonly id: string };
11
+ type Sender = {
12
+ readonly party: "agent" | "gate";
13
+ readonly id: string;
14
+ readonly via?: "token" | "jwt" | "hook";
15
+ readonly name?: string;
16
+ readonly onBehalfOf?: string;
17
+ readonly checked?: readonly SenderCallerField[];
18
+ };
12
19
  ```
13
20
 
14
21
  Who delivered an event: an Agent by its slot, or a Gate by its invoke id ([ADR-0015](../decisions/0015-authoring-surface-absorbs-the-mechanism.md)).
15
22
 
23
+ A Gate's event also carries the Caller that answered it ([ADR-0011](../decisions/0011-workflow-defined-events.md), [ADR-0078](../decisions/0078-a-caller-comes-from-one-authenticator-seam-and-acts-within-its-scopes.md)): `via` and `name`
24
+ name it, `onBehalfOf` is the party that it says it acts for, and `checked` names the fields that
25
+ jr2 verified. `via` and `name` are always checked, because an authenticator made them;
26
+ `onBehalfOf` is checked only for a Hook, whose signature covers the payload that it comes from.
27
+ An event that a Gate gives with no Caller (its `look`) has none of these fields.
28
+
16
29
  **Fields**
17
30
 
18
31
  - `party`: `"agent" | "gate"`
19
32
  - `id`: `string`
33
+ - `via` (optional): `"token" | "jwt" | "hook"`
34
+
35
+ The authenticator that made the Caller: `token`, `jwt` or `hook`. A Gate's event only.
36
+ - `name` (optional): `string`
37
+
38
+ The Caller's name for that authenticator. A Gate's event only.
39
+ - `onBehalfOf` (optional): `string`
40
+
41
+ The party that the Caller says it acts for. A claim, unless `checked` names it.
42
+ - `checked` (optional): `readonly SenderCallerField[]`
43
+
44
+ The fields of the Caller that jr2 verified.
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: SenderCallerField
3
+ description: "A field of a `Sender`'s Caller that jr2 can verify."
4
+ ---
5
+
6
+ # `SenderCallerField`
7
+
8
+ Type, in `src/define-event.ts` of `@jr2/agent-protocol`, a dependency of `@jr2/orchestrator`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type SenderCallerField = "via" | "name" | "onBehalfOf";
12
+ ```
13
+
14
+ A field of a [`Sender`](type-sender.md)'s Caller that jr2 can verify.
@@ -5,7 +5,7 @@ description: "The Size of a Workspace: the most memory and cpu that its whole Sa
5
5
 
6
6
  # `Size`
7
7
 
8
- Type, in `@jr2/orchestrator/src/size.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
8
+ Type, in `@jr2/orchestrator/src/size.ts`. It is an export of `@jr2/orchestrator`, in the [Composition](group-composition.md) group of the [Authoring surface](../authoring-surface.md) page.
9
9
 
10
10
  ```ts
11
11
  type Size = {
@@ -0,0 +1,19 @@
1
+ ---
2
+ title: Skip
3
+ description: "What `skip(reason)` gives: the delivery brings nothing, and the reason says why."
4
+ ---
5
+
6
+ # `Skip`
7
+
8
+ Type, in `@jr2/orchestrator/src/pool.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type Skip = { readonly [VERDICT]: "skip"; readonly reason: string };
12
+ ```
13
+
14
+ What `skip(reason)` gives: the delivery brings nothing, and the reason says why.
15
+
16
+ **Fields**
17
+
18
+ - `[VERDICT]`: `"skip"`
19
+ - `reason`: `string`
@@ -9,9 +9,7 @@ Type, in `@jr2/orchestrator/src/workspace.ts`. The signature of an export, or a
9
9
 
10
10
  ```ts
11
11
  type SlotHandles<TSlots extends string> = {
12
- repos: Record<TSlots, string>;
13
- branch: string;
14
- review?: Partial<Record<TSlots, string>>;
12
+ repos: { [K in TSlots]: `/work/${K}` };
15
13
  };
16
14
  ```
17
15
 
@@ -19,14 +17,8 @@ The handles of a Workspace that declares Repo Slots. @internal
19
17
 
20
18
  **Fields**
21
19
 
22
- - `repos`: `Record<TSlots, string>`
20
+ - `repos`: ``{ [K in TSlots]: `/work/${K}`; }``
23
21
 
24
- The absolute path of each Repo Slot's Worktree, `/work/<slot>/<branch>`, in the order that
25
- `repos` declares the slots. Give one to an Agent's Turn as its `cwd`.
26
- - `branch`: `string`
27
-
28
- The branch that the Workspace works on: the `branch` of the spec.
29
- - `review` (optional): `Partial<Record<TSlots, string>>`
30
-
31
- The path of each Repo Slot's review Worktree. Present only when the spec has `reviewSha`.
32
- Give one to a reviewer's Turn as its `cwd`.
22
+ The folder of each Repo Slot, `/work/<slot>`, in the order that `repos` declares the slots.
23
+ `${handle}/default` is the clone, on the Binding's base. Any other Worktree is one the Machine
24
+ cut with `worktree()`.
@@ -0,0 +1,23 @@
1
+ ---
2
+ title: SourceHooks
3
+ description: "A Source's handlers, by Hook kind and event key."
4
+ ---
5
+
6
+ # `SourceHooks`
7
+
8
+ Type, in `@jr2/orchestrator/src/pool.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type SourceHooks<Out, TInput = unknown> = KindHooks<SourceIn<TInput>, Out | Skip>;
12
+ ```
13
+
14
+ A Source's handlers, by Hook kind and event key. They have the shape of a Gate's `hooks`. A
15
+ handler is pure and synchronous. It gives `Out` or `skip(reason)`, never `undefined`; a throw is a
16
+ skip with the error as its reason.
17
+
18
+ **Fields**
19
+
20
+ - `github` (optional): `typeof github`
21
+ - `gitlab` (optional): `typeof gitlab`
22
+ - `slack` (optional): `typeof slack`
23
+ - `discord` (optional): `typeof discord`
@@ -0,0 +1,25 @@
1
+ ---
2
+ title: SourceIn
3
+ description: "What a Source's handler reads beside `payload`."
4
+ ---
5
+
6
+ # `SourceIn`
7
+
8
+ Type, in `@jr2/orchestrator/src/pool.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type SourceIn<TInput = unknown> = {
12
+ readonly caller: CallerRecord;
13
+ readonly delivery: string;
14
+ readonly input: TInput;
15
+ };
16
+ ```
17
+
18
+ What a Source's handler reads beside `payload`. `caller` is the Hook as a Caller, `delivery` the
19
+ delivery id, and `input` the Pool's input (`{}` for a standing Pool).
20
+
21
+ **Fields**
22
+
23
+ - `caller`: [`CallerRecord`](type-callerrecord.md)
24
+ - `delivery`: `string`
25
+ - `input`: `TInput`
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: SourceReply
3
+ description: "The text that the person who acted reads, from this Source's verdict (ADR-0011, ADR-0017)."
4
+ ---
5
+
6
+ # `SourceReply`
7
+
8
+ Type, in `@jr2/orchestrator/src/pool.ts`. It is an export of `@jr2/orchestrator`, in the [Composition](group-composition.md) group of the [Authoring surface](../authoring-surface.md) page.
9
+
10
+ ```ts
11
+ type SourceReply<T> = (verdict: SourceVerdict<T>, at: { readonly caller: CallerRecord }) => string | undefined;
12
+ ```
13
+
14
+ The text that the person who acted reads, from this Source's verdict ([ADR-0011](../decisions/0011-workflow-defined-events.md), [ADR-0017](../decisions/0017-pool-over-a-source-port.md)).
15
+ Plain text: the Hook kind escapes it and puts it in its envelope. Pure and synchronous.
16
+ `undefined` or `""`: this Source says nothing. It runs only for a delivery whose answer a person
17
+ reads (`slack`, `discord`). The text of a `skipped` verdict shows only when no other target gave
18
+ a text.