@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
@@ -5,7 +5,7 @@ description: "The parts of one Machine that `customize()` can retune: its Agents
5
5
 
6
6
  # `Customize`
7
7
 
8
- Type, in `@jr2/orchestrator/src/customize.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
8
+ Type, in `@jr2/orchestrator/src/customize.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 Customize<M extends AnyStateMachine> = {
@@ -15,13 +15,23 @@ type Customize<M extends AnyStateMachine> = {
15
15
  effects?: [OpenEffectSlots<Reached<M>>] extends [never]
16
16
  ? never
17
17
  : { [K in OpenEffectSlots<Reached<M>>]?: BindingOf<LogicAt<Reached<M>, K>> };
18
+ gates?: [GateSlots<Reached<M>>] extends [never]
19
+ ? never
20
+ : {
21
+ [K in GateSlots<Reached<M>>]?: GateBinding<
22
+ GateTypesAt<Reached<M>, K>["meta"],
23
+ GateTypesAt<Reached<M>, K>["ev"]
24
+ >;
25
+ };
18
26
  actors?: [ChildSlots<Reached<M>>] extends [never]
19
27
  ? never
20
28
  : { [K in ChildSlots<Reached<M>>]?: Customize<ChildAt<Reached<M>, K>> };
21
29
  image?: string;
22
30
  user?: string | UserContainer;
23
31
  resources?: Size;
24
- repos?: [RepoSlotsOf<M>] extends [never] ? never : { [K in RepoSlotsOf<M>]?: RepoSlot<InputFrom<WorkspaceOf<M>>> };
32
+ repos?: [RepoSlotsOf<M>] extends [never]
33
+ ? never
34
+ : { [K in RepoSlotsOf<M>]?: RepoSlot<Exclude<InputFrom<WorkspaceOf<M>>, undefined>> };
25
35
  };
26
36
  ```
27
37
 
@@ -52,6 +62,13 @@ Every key is optional. Write only what you change.
52
62
  whose target is Open. For an Effect with two Open parts, one object holds both keys, and
53
63
  a binding that leaves one out does not compile. Only Effects with an Open part are offered.
54
64
  See [`EffectBinding`](type-effectbinding.md) for the values and the refusals.
65
+ - `gates` (optional): `[ GateSlots<Reached<M>> ] extends [ never ] ? never : { [K in GateSlots<Reached<M>>]?: GateBinding<GateTypesAt<Reached<M>, K>["meta"], GateTypesAt<Reached<M>, K>["ev"]>; }`
66
+
67
+ Bind the look of a Gate slot (`gate({ … })`) that a package left `open`, and add, replace or
68
+ remove its handlers by Hook kind id and event key (`null` removes one), by slot name:
69
+ `{ review: { look, hooks: { gitlab: { "note.MergeRequest": null } } } }`. At run time,
70
+ `customize()` refuses a slot that holds no Gate slot: `customize(): machine "<id>" carries no
71
+ Gate slot "<slot>" — its Gate slots are: <slots>`.
55
72
  - `actors` (optional): `[ ChildSlots<Reached<M>> ] extends [ never ] ? never : { [K in ChildSlots<Reached<M>>]?: Customize<ChildAt<Reached<M>, K>>; }`
56
73
 
57
74
  Retune a Machine that this Machine composes, by slot name. The value has the same shape as
@@ -74,7 +91,7 @@ Every key is optional. Write only what you change.
74
91
  The Size, layered field by field over the Size of the `workspace()`: `{ limits: { memory } }`
75
92
  keeps the author's cpu. Only `limits.memory` and `limits.cpu`. See [`Size`](type-size.md). Only for a
76
93
  Machine that composes a `workspace()`.
77
- - `repos` (optional): `[ RepoSlotsOf<M> ] extends [ never ] ? never : { [K in RepoSlotsOf<M>]?: RepoSlot<InputFrom<WorkspaceOf<M>>>; }`
94
+ - `repos` (optional): `[ RepoSlotsOf<M> ] extends [ never ] ? never : { [K in RepoSlotsOf<M>]?: RepoSlot<Exclude<InputFrom<WorkspaceOf<M>>, undefined>>; }`
78
95
 
79
96
  Bind the Repo Slots of the `workspace()`, by slot name. Each value is one of these:
80
97
 
@@ -0,0 +1,17 @@
1
+ ---
2
+ title: Delivered
3
+ description: "One plain event of a list of defs: `{ type: \"approve\", by }`."
4
+ ---
5
+
6
+ # `Delivered`
7
+
8
+ Type, in `@jr2/orchestrator/src/gate.ts`. It is an export of `@jr2/orchestrator`, in the [Gates](group-gates.md) group of the [Authoring surface](../authoring-surface.md) page.
9
+
10
+ ```ts
11
+ type Delivered<D extends readonly EventDef[]> = {
12
+ [K in keyof D]: D[K] extends EventDef ? EventFrom<D[K]> : never;
13
+ }[number];
14
+ ```
15
+
16
+ One plain event of a list of defs: `{ type: "approve", by }`. What a handler, a look's `until`
17
+ and a Gate's `reply` see.
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: DeliveredEvent
3
+ description: "A workflow event as delivered into a Machine: the def's name as `type`, plus its payload."
4
+ ---
5
+
6
+ # `DeliveredEvent`
7
+
8
+ Type, in `@jr2/orchestrator/src/registration.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 DeliveredEvent = { type: string } & Record<string, unknown>;
12
+ ```
13
+
14
+ A workflow event as delivered into a Machine: the def's name as `type`, plus its payload.
15
+
16
+ **Fields**
17
+
18
+ - `type`: `string`
@@ -34,6 +34,7 @@ The definition of a `dispatch` Effect ([ADR-0071](../decisions/0071-a-run-starts
34
34
  How long the Effect waits: by default 30s for the start, and 10m with `wait`.
35
35
  - `target` (optional): `{ url: string; token: NamedSecret; } | typeof open`
36
36
 
37
- A different Orchestrator: `url` is its origin, and `token` is the secret that holds its
38
- Instance token. Or `open`, which the composer binds with `customize(<import>, { effects: {
39
- <slot>: { target: { url, token } } } })`. Without it, the run starts in this Orchestrator.
37
+ A different Orchestrator: `url` is its origin, and `token` is the secret that holds the token
38
+ of a Caller of it with `start` for the Workflow, and `read` too when `wait` is true. Or `open`,
39
+ which the composer binds with `customize(<import>, { effects: { <slot>: { target: { url, token
40
+ } } } })`. Without it, the run starts in this Orchestrator.
@@ -5,7 +5,7 @@ description: The output of a `dispatch` Effect.
5
5
 
6
6
  # `DispatchOutput`
7
7
 
8
- Type, in `@jr2/orchestrator/src/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/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 DispatchOutput =
@@ -18,7 +18,8 @@ type DispatchOutput =
18
18
  }
19
19
  | { outcome: "refused"; status: number; report: string[] }
20
20
  | { outcome: "unreachable"; reason: string }
21
- | Unknown;
21
+ | Unknown
22
+ | LaterOutcome;
22
23
  ```
23
24
 
24
25
  The output of a `dispatch` Effect. Route on `outcome`:
@@ -34,6 +35,8 @@ The output of a `dispatch` Effect. Route on `outcome`:
34
35
  - `unreachable`: the Orchestrator of the target did not answer. No run started.
35
36
  - `unknown`: jr2 cannot tell if a run started.
36
37
 
38
+ The union is open ([`LaterOutcome`](type-lateroutcome.md)): give the rest a last arm with no guard.
39
+
37
40
  **Forms**: it is one of these objects.
38
41
 
39
42
  - Form 1: `outcome`, `reason`
@@ -59,6 +62,10 @@ The output of a `dispatch` Effect. Route on `outcome`:
59
62
 
60
63
  - `outcome`: `"unreachable"`
61
64
  - `reason`: `string`
65
+ - Form 6: `outcome`, `reason`
66
+
67
+ - `outcome`: `"(a later outcome)"`
68
+ - `reason` (optional): `string`
62
69
 
63
70
  **See also**
64
71
 
@@ -0,0 +1,19 @@
1
+ ---
2
+ title: DoorlessInput
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `DoorlessInput`
7
+
8
+ Type, in `@jr2/orchestrator/src/workspace.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type DoorlessInput<TBody extends AnyStateMachine> =
12
+ unknown extends InputFrom<TBody>
13
+ ? unknown
14
+ : [keyof Omit<InputFrom<TBody>, "workspace">] extends [never]
15
+ ? unknown
16
+ : {} extends Omit<InputFrom<TBody>, "workspace">
17
+ ? Omit<InputFrom<TBody>, "workspace"> | undefined
18
+ : Omit<InputFrom<TBody>, "workspace">;
19
+ ```
@@ -5,7 +5,7 @@ description: The values that bind the Open parts of one Effect.
5
5
 
6
6
  # `EffectBinding`
7
7
 
8
- Type, in `@jr2/orchestrator/src/open-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
8
+ Type, in `@jr2/orchestrator/src/open-effect.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 EffectBinding = {
@@ -13,13 +13,16 @@ type EffectBinding = {
13
13
  readonly argv?: readonly (string | Arg)[];
14
14
  readonly secret?: string;
15
15
  readonly target?: { readonly url: string; readonly token: Secret };
16
+ readonly server?: string;
17
+ readonly tool?: string;
16
18
  };
17
19
  ```
18
20
 
19
21
  The values that bind the Open parts of one Effect. A packaged Machine leaves a part of an Effect
20
22
  Open when it cannot know it. That part is the url of an `http` Effect, the argv of a `command`,
21
23
  the name of a secret, written `secret(open)`, or the target of a `dispatch`: the url of another
22
- Orchestrator and the secret that holds its Instance token, bound as one. You bind it once, where you register the
24
+ Orchestrator and the secret that holds its Instance token, bound as one, or the server or the tool
25
+ of an `mcp` Effect. You bind it once, where you register the
23
26
  Machine, with `customize(machine, { effects: { <slot>: binding } })`. Each key binds one Open
24
27
  part. For an Effect with two Open parts, one object holds both keys.
25
28
 
@@ -63,6 +66,13 @@ check that a part written in the definition gets.
63
66
 
64
67
  - `url`: `string`
65
68
  - `token`: [`Secret`](type-secret.md)
69
+ - `server` (optional): `string`
70
+
71
+ The server of an `mcp` Effect whose server is Open: a name of the `mcp` block of
72
+ `jr2.config.ts`. The server's url and its secret are the config's.
73
+ - `tool` (optional): `string`
74
+
75
+ The tool of an `mcp.call` Effect whose tool is Open: a tool name of the server.
66
76
 
67
77
  **Example**
68
78
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: FileBody
3
- description: "`file(path, { slot?, segments?, contentType? })`: a Worktree file as an `http` body."
3
+ description: "`file(path, { segments?, contentType? })`: a Worktree file as an `http` body."
4
4
  ---
5
5
 
6
6
  # `FileBody`
@@ -11,14 +11,13 @@ Type, in `@jr2/orchestrator/src/http-effect.ts`. The signature of an export, or
11
11
  type FileBody<S extends z.ZodType | undefined = undefined> = {
12
12
  readonly file: {
13
13
  readonly path: FromInput<S, string>;
14
- readonly slot?: string;
15
14
  readonly segments?: FromInput<S, readonly string[]>;
16
15
  readonly contentType?: string;
17
16
  };
18
17
  };
19
18
  ```
20
19
 
21
- `file(path, { slot?, segments?, contentType? })`: a Worktree file as an `http` body.
20
+ `file(path, { segments?, contentType? })`: a Worktree file as an `http` body.
22
21
 
23
22
  **Fields**
24
23
 
@@ -26,11 +25,8 @@ type FileBody<S extends z.ZodType | undefined = undefined> = {
26
25
 
27
26
  - `path`: `FromInput<S, string>`
28
27
 
29
- The file, relative to the Repo Slot's Worktree, or to `/work` in a Workspace with no Repo
30
- Slot.
31
- - `slot` (optional): `string`
32
-
33
- The Repo Slot whose Worktree holds it. Write it only when the Workspace has more than one.
28
+ The file, relative to the Worktree that `worktree` of the Effect's input names, or to `/work`
29
+ in a Workspace with no Repo Slot.
34
30
  - `segments` (optional): `FromInput<S, readonly string[]>`
35
31
 
36
32
  Path segments that jr2 adds to the end of the url, as `path` of `request` does for a json
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: FramePath
3
+ description: "A Turn's Frame in a Workspace with the Repo Slots `S`."
4
+ ---
5
+
6
+ # `FramePath`
7
+
8
+ Type, in `@jr2/orchestrator/src/worktree.ts`. It is an export of `@jr2/orchestrator`, in the [Effects](group-effects.md) group of the [Authoring surface](../authoring-surface.md) page.
9
+
10
+ ```ts
11
+ type FramePath<S extends string> = WorktreePath<S> | "/work";
12
+ ```
13
+
14
+ A Turn's Frame in a Workspace with the Repo Slots `S`.
@@ -0,0 +1,15 @@
1
+ ---
2
+ title: GateBinding
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `GateBinding`
7
+
8
+ Type, in `@jr2/orchestrator/src/customize.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type GateBinding<Meta, Ev> = {
12
+ readonly look?: GateLook<Meta, Ev> | "none";
13
+ readonly hooks?: GateHooksPatch<Meta, Ev>;
14
+ };
15
+ ```
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: GateHooks
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `GateHooks`
7
+
8
+ Type, in `@jr2/orchestrator/src/gate.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type GateHooks<Meta, Ev> = KindHooks<GateIn<Meta>, Ev | undefined>;
12
+ ```
@@ -0,0 +1,37 @@
1
+ ---
2
+ title: GateLook
3
+ description: "A Gate's read of the fact that it waits for (ADR-0011)."
4
+ ---
5
+
6
+ # `GateLook`
7
+
8
+ Type, in `@jr2/orchestrator/src/gate.ts`. It is an export of `@jr2/orchestrator`, in the [Gates](group-gates.md) group of the [Authoring surface](../authoring-surface.md) page.
9
+
10
+ ```ts
11
+ type GateLook<Meta, Ev, R extends AnyActorLogic = AnyActorLogic> = {
12
+ readonly read: R;
13
+ readonly input: (meta: Meta) => InputFrom<R>;
14
+ readonly every?: Duration;
15
+ readonly until: (output: LookOutput<R>, meta: Meta) => Ev | undefined;
16
+ };
17
+ ```
18
+
19
+ A Gate's read of the fact that it waits for ([ADR-0011](../decisions/0011-workflow-defined-events.md)).
20
+
21
+ - `read`: an `http` Effect marked `idempotent: true`, or a promise actor (`fromPromise`), which the
22
+ Machine can invoke anyway and which a restore runs again. `gate()` refuses any other logic.
23
+ - `input`: the read's input, from the Gate's meta.
24
+ - `every`: how often the Gate looks again while it is open. Default: `"10m"`.
25
+ - `until`: the read's output as one event of `delivers`, or `undefined` for "not yet". Pure and
26
+ synchronous, as a guard is.
27
+
28
+ The look runs once after the Gate registers, again after each restore, and every `every` while the
29
+ Gate is open. It stops after the run takes its event, until the Gate opens again. A looked event
30
+ has the Gate as its Sender and no Caller, and the feed marks it `looked`.
31
+
32
+ **Fields**
33
+
34
+ - `read`: `R`
35
+ - `input`: `(meta: Meta) => InputFrom<R>`
36
+ - `every` (optional): [`Duration`](type-duration.md)
37
+ - `until`: `(output: LookOutput<R>, meta: Meta) => Ev | undefined`
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: GateOutcome
3
+ description: What a delivery did at one open Gate.
4
+ ---
5
+
6
+ # `GateOutcome`
7
+
8
+ Type, in `@jr2/orchestrator/src/gate.ts`. It is an export of `@jr2/orchestrator`, in the [Gates](group-gates.md) group of the [Authoring surface](../authoring-surface.md) page.
9
+
10
+ ```ts
11
+ type GateOutcome<Ev> =
12
+ | { readonly state: "delivered"; readonly event: Ev; readonly run: string }
13
+ | { readonly state: "refused"; readonly event?: Ev; readonly reason: string; readonly run: string };
14
+ ```
15
+
16
+ What a delivery did at one open Gate. The run took the event, or it did not: the handler threw,
17
+ its event is not in `delivers`, or the run does not take it now. A Gate whose handler gave
18
+ `undefined` was not a target, and its `reply` does not run.
19
+
20
+ **Forms**: it is one of these objects.
21
+
22
+ - Form 1: `state`, `event`, `run`
23
+
24
+ - `state`: `"delivered"`
25
+ - `event`: `Ev`
26
+ - `run`: `string`
27
+ - Form 2: `state`, `event`, `reason`, `run`
28
+
29
+ - `state`: `"refused"`
30
+ - `event` (optional): `Ev`
31
+ - `reason`: `string`
32
+ - `run`: `string`
@@ -0,0 +1,19 @@
1
+ ---
2
+ title: GateReply
3
+ description: The text that the person who acted reads.
4
+ ---
5
+
6
+ # `GateReply`
7
+
8
+ Type, in `@jr2/orchestrator/src/gate.ts`. It is an export of `@jr2/orchestrator`, in the [Gates](group-gates.md) group of the [Authoring surface](../authoring-surface.md) page.
9
+
10
+ ```ts
11
+ type GateReply<Meta, Ev> = (
12
+ outcome: GateOutcome<Ev>,
13
+ at: { readonly meta: Meta; readonly caller: CallerRecord },
14
+ ) => string | undefined;
15
+ ```
16
+
17
+ The text that the person who acted reads. Plain text: the Hook kind
18
+ escapes it and puts it in its envelope. Pure and synchronous. `undefined` or `""`: this Gate says
19
+ nothing. It runs only for a delivery whose answer a person reads (`slack`, `discord`).
@@ -0,0 +1,21 @@
1
+ ---
2
+ title: GateSlot
3
+ description: A Gate with parts that the Machine carries.
4
+ ---
5
+
6
+ # `GateSlot`
7
+
8
+ Type, in `@jr2/orchestrator/src/gate.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 GateSlot<Meta, Ev> = CallbackActorLogic<
12
+ DeliveredEvent,
13
+ {} extends Meta ? GateSlotInput<Meta> | undefined : GateSlotInput<Meta>
14
+ > & {
15
+ readonly gateSlot: GateSlotParts;
16
+ readonly [gateSlotMark]?: { readonly meta: Meta; readonly ev: Ev };
17
+ };
18
+ ```
19
+
20
+ A Gate with parts that the Machine carries. Put it in `actors` and invoke it by its key. The
21
+ brand `gateSlot` holds its parts.
@@ -0,0 +1,13 @@
1
+ ---
2
+ title: GateSlotInput
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `GateSlotInput`
7
+
8
+ Type, in `@jr2/orchestrator/src/gate.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type GateSlotInput<Meta> = Omit<GateInput, "meta"> &
12
+ ({} extends Meta ? { readonly meta?: Meta } : { readonly meta: Meta });
13
+ ```
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: GateSlotParts
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `GateSlotParts`
7
+
8
+ Type, in `@jr2/orchestrator/src/gate.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type GateSlotParts = {
12
+ readonly meta?: z.ZodType;
13
+ readonly delivers: readonly EventDef[];
14
+ readonly hooks: Readonly<Record<string, Readonly<Record<string, AnyHandler>>>>;
15
+ readonly look?: LooseLook | typeof open | "none";
16
+ readonly reply?: (outcome: GateOutcome<DeliveredEvent>, at: { meta: unknown; caller: CallerRecord }) => unknown;
17
+ };
18
+ ```
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: GateSlots
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `GateSlots`
7
+
8
+ Type, in `@jr2/orchestrator/src/customize.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type GateSlots<M extends AnyStateMachine> = Extract<SlotsOf<M>, { logic: GateSlot<any, any> }>["src"];
12
+ ```
@@ -0,0 +1,13 @@
1
+ ---
2
+ title: GateTypesAt
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `GateTypesAt`
7
+
8
+ Type, in `@jr2/orchestrator/src/customize.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type GateTypesAt<M extends AnyStateMachine, K extends string> =
12
+ LogicAt<M, K> extends GateSlot<infer Meta, infer Ev> ? { meta: Meta; ev: Ev } : never;
13
+ ```
@@ -5,7 +5,7 @@ description: The fields that jr2 adds to the input of the Machine that a run sta
5
5
 
6
6
  # `HostInjectedInput`
7
7
 
8
- Type, in `@jr2/orchestrator/src/vocabulary.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Machine and events.
8
+ Type, in `@jr2/orchestrator/src/vocabulary.ts`. It is an export of `@jr2/orchestrator`, in the [Machine and events](group-machine-and-events.md) group of the [Authoring surface](../authoring-surface.md) page.
9
9
 
10
10
  ```ts
11
11
  type HostInjectedInput = { instanceId: string };
@@ -20,10 +20,8 @@ caller sends it. jr2 writes it over any value that a caller sends.
20
20
 
21
21
  Only the root Machine of a run gets it. A Machine that another Machine invokes gets the input
22
22
  that its parent gives it. A `workspace()` passes its input to its body, so the body of a root
23
- `workspace()` gets it too: `Workspaced<HostInjectedInput & RunInput, "app">`.
24
-
25
- The `spec` of a root `workspace()` also gets it, and the type of its input shows it:
26
- ``spec: ({ input }) => ({ branch: `fix/${input.instanceId}` })``.
23
+ `workspace()` gets it too: `Workspaced<HostInjectedInput & RunInput, "app">`. For example, a cut
24
+ can name a branch for each run: `` branch: `fix/${context.instanceId}` ``.
27
25
 
28
26
  It is not the run id. Use it, for example, to give each run a branch of its own.
29
27
 
@@ -79,10 +79,13 @@ An `http` Effect's definition.
79
79
  Effect secret. Do not write it beside `body`.
80
80
  - `body` (optional): `FileBody<S>`
81
81
 
82
- A Worktree file as the body: `file(path, { slot?, segments?, contentType? })`. The Effect then
83
- runs in the Sandbox Effector of its Workspace. Do not write `request` beside it: the `segments`
82
+ A Worktree file as the body: `file(path, { segments?, contentType? })`. The Effect then
83
+ runs in the Sandbox Effector of its Workspace. Under a Workspace with Repo Slots, the invoke's
84
+ input names a Worktree that a cut of this run made, in `worktree`; with none, it refuses when
85
+ it starts: ``http "<slot>" reads a Worktree file, under a Workspace with Repo Slots, and its
86
+ input names no `worktree` ``. Do not write `request` beside it: the `segments`
84
87
  of `file` are the path. It refuses another body: ``http({ body }): a body is file(path, {
85
- slot?, segments?, contentType? }) — json and text come from `request` ``.
88
+ segments?, contentType? }) — json and text come from `request` ``.
86
89
  - `timeout` (optional): [`Duration`](type-duration.md)
87
90
 
88
91
  How long jr2 waits for the answer: a number and a unit, such as `"30s"` or `"2m"`. Default
@@ -0,0 +1,20 @@
1
+ ---
2
+ title: HttpFileInput
3
+ description: The input of an `http` Effect with a Worktree file as its body.
4
+ ---
5
+
6
+ # `HttpFileInput`
7
+
8
+ Type, in `@jr2/orchestrator/src/http-effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type HttpFileInput<S> = (S extends z.ZodType ? z.infer<S> : unknown) & { worktree?: AnyWorktreePath };
12
+ ```
13
+
14
+ The input of an `http` Effect with a Worktree file as its body. Under a Workspace with Repo
15
+ Slots, `worktree` names the Worktree. In a Workspace with no Repo Slot, the input has no
16
+ `worktree`, and the path is relative to `/work`.
17
+
18
+ **Fields**
19
+
20
+ - `worktree` (optional): [`AnyWorktreePath`](type-anyworktreepath.md)
@@ -5,10 +5,10 @@ description: "The output of an `http` Effect: what the `onDone` of its state get
5
5
 
6
6
  # `HttpOutput`
7
7
 
8
- Type, in `@jr2/orchestrator/src/effector-wire.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
8
+ Type, in `@jr2/orchestrator/src/effector-wire.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
- type HttpOutput = {
11
+ type HttpOutput = LaterOutcome | {
12
12
  outcome: "response";
13
13
  status: number;
14
14
  headers: Record<string, string>;
@@ -37,6 +37,8 @@ outcome is output. A 4xx or 5xx status is output too. Route on `outcome`:
37
37
  - `unknown`: the call can have gone out, but no answer came, or jr2 cannot tell after a restart.
38
38
  `reason` tells why. jr2 does not send it again unless it is marked `idempotent`.
39
39
 
40
+ The union is open (`LaterOutcome`): give the rest a last arm with no guard.
41
+
40
42
  **Forms**: it is one of these objects.
41
43
 
42
44
  - Form 1: `outcome`, `status`, `headers`, `contentType`, `size`, `body`, `truncated`
@@ -52,6 +54,10 @@ outcome is output. A 4xx or 5xx status is output too. Route on `outcome`:
52
54
 
53
55
  - `outcome`: `"unknown" | "unreachable" | "refused"`
54
56
  - `reason`: `string`
57
+ - Form 3: `outcome`, `reason`
58
+
59
+ - `outcome`: `"(a later outcome)"`
60
+ - `reason` (optional): `string`
55
61
 
56
62
  **Example**
57
63
 
@@ -5,7 +5,7 @@ description: "The shape of `jr2.config.ts`: the deployment facts of an Instance,
5
5
 
6
6
  # `JR2Config`
7
7
 
8
- Type, in `@jr2/orchestrator/src/config.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Config.
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
9
 
10
10
  ```ts
11
11
  type JR2Config = {
@@ -15,6 +15,11 @@ type JR2Config = {
15
15
  harness?: HarnessConfig;
16
16
  sandbox?: SandboxConfig;
17
17
  priorityClasses?: PriorityClasses;
18
+ callers?: CallersConfig;
19
+ cors?: readonly string[];
20
+ hooks?: Readonly<Record<string, Hook>>;
21
+ mcp?: Readonly<Record<string, McpServer>>;
22
+ runs?: RunsConfig;
18
23
  registry?: string;
19
24
  kitRegistry?: string;
20
25
  platforms?: readonly string[];
@@ -32,7 +37,7 @@ Sandbox Image: a Machine names those itself.
32
37
  Every field is optional, and an Instance can run with no `jr2.config.ts`. Write the file as
33
38
  `export default defineConfig({ … })`. When the config loads, a file with no default export is
34
39
  refused: `` <file> has no default export (use `export default defineConfig({…})`) ``. The load also
35
- checks the shape of `git.credentials`, `secrets`, `harness.catalog` and `priorityClasses`. It
40
+ checks the shape of `git.credentials`, `secrets`, `harness.catalog`, `priorityClasses` and `mcp`. It
36
41
  checks that `sandbox` is an object, and checks its `resources`. Each refusal names the field.
37
42
  `jr2 up` checks the rest.
38
43
 
@@ -67,6 +72,36 @@ checks that `sandbox` is an object, and checks its `resources`. Each refusal nam
67
72
 
68
73
  Existing PriorityClasses to use in place of the two that `jr2 up` creates. See
69
74
  [`PriorityClasses`](../config.md#priorityclasses).
75
+ - `callers` (optional): [`CallersConfig`](../config.md#callers)
76
+
77
+ The Callers that act on the Instance with a credential of their own, and what each may do.
78
+ Default: none; only the Instance token acts. See [`CallersConfig`](../config.md#callers).
79
+ - `cors` (optional): `readonly string[]`
80
+
81
+ The origins from which a browser app may call the Instance's HTTP API, such as
82
+ `https://ops.example.com`. Each entry is an origin alone: a scheme, a host and an optional port,
83
+ with no path. Default: none. The Console is served from the Orchestrator's own origin, so it
84
+ needs no entry. The config load refuses an entry that is not an origin:
85
+ `<file> at cors[<i>]: <entry> is not an origin — scheme://host[:port], with no path`.
86
+ - `hooks` (optional): `Readonly<Record<string, Hook>>`
87
+
88
+ The Hooks of the Instance, by name: each one is a door, `POST /hooks/<name>`, for one outside
89
+ service. A Hook's value comes from its kind's constructor, which the config imports:
90
+ `github({ secret: secret("GH_HOOK") })`, `gitlab({ secret: secret("GL_HOOK"), may })`,
91
+ `discord({ publicKey: "…" })`. `may.answer` names the Workflows whose Gates the Hook may answer,
92
+ every Workflow by default. A Hook never starts a run. A name has the rule of a Caller token's
93
+ name. When the config loads, a bad entry is refused: `<file> at hooks.<name>: <problem>`.
94
+ Default: none.
95
+ - `mcp` (optional): `Readonly<Record<string, McpServer>>`
96
+
97
+ The MCP servers, by a name of yours: `[a-z][a-z0-9-]*`, not `jr2`. A remote server has a
98
+ `url` (`https://` with a secret), a `secret` (a name of the `secrets` list; with no `hosts`, it
99
+ is bound to the url's host) and a `timeout` (default `"60s"`). A stdio server has a `command`
100
+ of the Sandbox Image, its `args` and a `timeout`. An Agent names a server in its `mcp` list.
101
+ Default: none. See [`McpServer`](type-mcpserver.md).
102
+ - `runs` (optional): [`RunsConfig`](type-runsconfig.md)
103
+
104
+ How long ended runs are kept, and the volume size. Default: `{ retain: "30d", volume: "5Gi" }`.
70
105
  - `registry` (optional): `string`
71
106
 
72
107
  The image registry prefix to which `jr2 up` pushes the images that it builds, such as