@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
@@ -0,0 +1,48 @@
1
+ ---
2
+ title: "Authoring surface: Effects"
3
+ description: Work a Machine does outside itself, as an actor slot (ADR-0067, ADR-0068, ADR-0071, ADR-0079), and what an author writes between a pick and that work.
4
+ ---
5
+
6
+ # Authoring surface: Effects
7
+
8
+ This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
9
+
10
+ Work a Machine does outside itself, as an actor slot ([ADR-0067](../decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md), [ADR-0068](../decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md), [ADR-0071](../decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md), [ADR-0079](../decisions/0079-an-agent-holds-mcp-tools-a-machine-calls-them-as-an-effect-and-the-machine-is-the-approval.md)), and what an author writes between a pick and that work.
11
+
12
+ - [`arg`](arg.md) (constant): Mark one argv entry of a `command` that the input of the Effect fills.
13
+ - [`CommandOutput`](type-commandoutput.md) (type): The output of a `command` Effect: what the `onDone` of its state gets as `event.output`.
14
+ - [`LaterOutcome`](type-lateroutcome.md) (type): A value of `outcome` that this kit does not give.
15
+ - [`command`](command.md) (function): Make a `command` Effect: an actor slot that runs one program in the Workspace's Sandbox when a state invokes it.
16
+ - [`basic`](basic.md) (function): Make the `auth` of an `http` Effect that sends `Authorization: Basic <value>`, where the value is the base64 of `user:password`.
17
+ - [`bearer`](bearer.md) (function): Make the `auth` of an `http` Effect that sends `Authorization: Bearer <value>`, with the value of an Effect secret.
18
+ - [`file`](file.md) (function): Make a Worktree file the body of an `http` Effect: `body: file("dist/report.pdf")`.
19
+ - [`http`](http.md) (function): Make an `http` Effect: a call to a URL, with Effect secrets that the Agent never reads.
20
+ - [`secret`](secret.md) (function): Name an Effect secret: `secret("jira")`.
21
+ - [`text`](text.md) (function): Make a string from literal text and Effect secrets, as a tagged template: `` text`Token ${secret("x")}` ``.
22
+ - [`HttpOutput`](type-httpoutput.md) (type): The output of an `http` Effect: what the `onDone` of its state gets as `event.output`.
23
+ - [`push`](push.md) (function): Make a `push` Effect: it pushes the branch of a Worktree to the Binding of its Repo Slot.
24
+ - [`PushOutput`](type-pushoutput.md) (type): The output of a `push` Effect: what the `onDone` of its state gets as `event.output`.
25
+ - [`branchName`](branchname.md) (constant): A kit schema for a pick param that names a branch.
26
+ - [`isReady`](isready.md) (constant): Is it `ready`?
27
+ - [`readyOf`](readyof.md) (function): The `ready` output of an `onDone` arm that `isReady` guards.
28
+ - [`worktree`](worktree.md) (function): Make a `worktree` Effect: it cuts a Worktree of a Repo Slot, or reads the one that is there.
29
+ - [`AnyFramePath`](type-anyframepath.md) (type): A Turn's Frame: a Worktree, or `/work`, stated.
30
+ - [`AnyWorktreePath`](type-anyworktreepath.md) (type): A Worktree of any Repo Slot: what a kit factory states, before `jr2Setup` narrows it to the slots of the body.
31
+ - [`FramePath`](type-framepath.md) (type): A Turn's Frame in a Workspace with the Repo Slots `S`.
32
+ - [`WorktreeFound`](type-worktreefound.md) (type): What a cut found.
33
+ - [`WorktreeInput`](type-worktreeinput.md) (type): The input of a `worktree()`: a branch Worktree, or a detached one.
34
+ - [`WorktreeOptions`](type-worktreeoptions.md) (type): The options of `worktree()`.
35
+ - [`WorktreeOutput`](type-worktreeoutput.md) (type): The output of a `worktree()`.
36
+ - [`WorktreePath`](type-worktreepath.md) (type): A Worktree of the Repo Slots `S`.
37
+ - [`WorktreeReady`](type-worktreeready.md) (type)
38
+ - [`WorktreeRefused`](type-worktreerefused.md) (type): No Worktree, and nothing changed.
39
+ - [`dispatch`](dispatch.md) (function): Make a `dispatch` Effect: it starts a run of a Workflow.
40
+ - [`DispatchOutput`](type-dispatchoutput.md) (type): The output of a `dispatch` Effect.
41
+ - [`mcp`](mcp.md) (constant): The `mcp` Effects (ADR-0067, ADR-0079): `mcp.call(server, tool, { input })` calls a tool, `mcp.read(server, uri)` reads a resource, and `mcp.prompt(server, name, { input })` gets a prompt.
42
+ - [`McpOptions`](type-mcpoptions.md) (type): The options of an `mcp` Effect.
43
+ - [`McpCallOutput`](type-mcpcalloutput.md) (type): The output of an `mcp.call` Effect: what the `onDone` of its state gets as `event.output`.
44
+ - [`McpOutput`](type-mcpoutput.md) (type): The output of any `mcp` Effect: a call's, a read's or a prompt's.
45
+ - [`McpReadOutput`](type-mcpreadoutput.md) (type): The output of an `mcp.read` or an `mcp.prompt` Effect.
46
+ - [`answer`](answer.md) (function): Set what the Agent reads when jr2 answers its pick.
47
+ - [`fromPick`](frompick.md) (function): Make the `input` of the invoke of a state that a pick enters: the params of the pick go to the input of the invoked actor by name.
48
+ - [`paramsOf`](paramsof.md) (function): Read the params of a pick from the event that entered the state.
@@ -0,0 +1,13 @@
1
+ ---
2
+ title: "Authoring surface: Failure"
3
+ description: The Part a Machine invokes to fail its run, and the guard that tells a Failure from a defect in an `onError` (ADR-0073).
4
+ ---
5
+
6
+ # Authoring surface: Failure
7
+
8
+ This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
9
+
10
+ The Part a Machine invokes to fail its run, and the guard that tells a Failure from a defect in an `onError` ([ADR-0073](../decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md)).
11
+
12
+ - [`fail`](fail.md) (function): Fail the run: the Part a Machine invokes to end work that did not succeed.
13
+ - [`isFailure`](isfailure.md) (function): Is this error a Failure, which a state invoked `fail` to make?
@@ -0,0 +1,16 @@
1
+ ---
2
+ title: "Authoring surface: Gates"
3
+ description: A Gate slot hears a Hook (ADR-0011).
4
+ ---
5
+
6
+ # Authoring surface: Gates
7
+
8
+ This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
9
+
10
+ A Gate slot hears a Hook ([ADR-0011](../decisions/0011-workflow-defined-events.md)).
11
+
12
+ - [`gate`](gate.md) (function): The Gate: an input that a run waits for from outside the run (ADR-0011).
13
+ - [`Delivered`](type-delivered.md) (type): One plain event of a list of defs: `{ type: "approve", by }`.
14
+ - [`GateLook`](type-gatelook.md) (type): A Gate's read of the fact that it waits for (ADR-0011).
15
+ - [`GateOutcome`](type-gateoutcome.md) (type): What a delivery did at one open Gate.
16
+ - [`GateReply`](type-gatereply.md) (type): The text that the person who acted reads.
@@ -0,0 +1,15 @@
1
+ ---
2
+ title: "Authoring surface: Machine and events"
3
+ description: The setup a workflow writes its Machine with, the events its parties send, and the guard that makes a writing decline other senders (ADR-0011, ADR-0015).
4
+ ---
5
+
6
+ # Authoring surface: Machine and events
7
+
8
+ This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
9
+
10
+ The setup a workflow writes its Machine with, the events its parties send, and the guard that makes a writing decline other senders ([ADR-0011](../decisions/0011-workflow-defined-events.md), [ADR-0015](../decisions/0015-authoring-surface-absorbs-the-mechanism.md)).
11
+
12
+ - [`defineEvent`](defineevent.md) (function): Define one workflow event: an event that an Agent or the caller of a Gate may send into your Machine.
13
+ - [`jr2Setup`](jr2setup.md) (function): Set up a Machine that takes workflow events: the jr2 form of xstate's `setup()`.
14
+ - [`sentBy`](sentby.md) (function): A guard that is true for an event that one party sent, and false for an event that another party sent: `guard: sentBy("coder")`.
15
+ - [`HostInjectedInput`](type-hostinjectedinput.md) (type): The fields that jr2 adds to the input of the Machine that a run starts, beside the input that the caller sent.
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: "Authoring surface: Steering"
3
+ description: "The Machine's free text to one of its Agents, which the Agent hears once (ADR-0002)."
4
+ ---
5
+
6
+ # Authoring surface: Steering
7
+
8
+ This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
9
+
10
+ The Machine's free text to one of its Agents, which the Agent hears once ([ADR-0002](../decisions/0002-duplex-streaming-actor.md)).
11
+
12
+ - [`steer`](steer.md) (function): Send a Steering message to one Agent of this Machine: an action for a transition.
@@ -0,0 +1,137 @@
1
+ ---
2
+ title: "Authoring surface: Types these signatures name"
3
+ description: The signature of an export, or a type here, names each of these types.
4
+ ---
5
+
6
+ # Authoring surface: Types these signatures name
7
+
8
+ This page is one group of the [Authoring surface](../authoring-surface.md). It gives each type its first sentence. Each type has a page of its own, in this folder.
9
+
10
+ The signature of an export, or a type here, names each of these types. They are not exports of `@jr2/orchestrator`, so a workflow module does not import them by name.
11
+
12
+ - [`EventSemantics`](type-eventsemantics.md): How the party that sends an event gets its answer.
13
+ - [`EventAudience`](type-eventaudience.md): Who may send an event: `"agent"` (an Agent, as a pick from its Menu), `"external"` (the caller of a Gate), or `"any"` (both).
14
+ - [`EventDef`](type-eventdef.md): A workflow event, as `defineEvent` gives it back: plain, frozen data and a zod schema, safe to import anywhere.
15
+ - [`WorkflowEvent`](type-workflowevent.md): The type of `event` in a Machine that `jr2Setup` makes: each workflow event in its `events`, and each Mechanism event.
16
+ - [`GateSlot`](type-gateslot.md): A Gate with parts that the Machine carries.
17
+ - [`Duration`](type-duration.md): A length of time: a positive number and a unit, `s`, `m` or `h`.
18
+ - [`CallerRecord`](type-callerrecord.md): A Caller as a run records it (ADR-0078): who acted, and the party it says it acted for.
19
+ - [`FailSlot`](type-failslot.md): The logic `fail()` returns: `failLogic` with the brand the walk reads.
20
+ - [`Failure`](type-failure.md): A Failure as `isFailure` narrows an error to it: the payload's fields, on the error itself.
21
+ - [`AgentDeclaration`](type-agentdeclaration.md): What `agent()` takes: an `AgentDefinition`, except that `model` can also be `open`.
22
+ - [`WorkspaceAccess`](type-workspaceaccess.md): What an Agent may do to the Workspace: `"write"`, `"read"` or `"none"`.
23
+ - [`WorkspaceOptions`](type-workspaceoptions.md): The options of a `workspace()` that declares the input that starts a run.
24
+ - [`NoSlotWorkspaceOptions`](type-noslotworkspaceoptions.md): The options of a `workspace()` with no Repo Slot that declares the input that starts a run.
25
+ - [`WithoutEmptyIndex`](type-withoutemptyindex.md): The fields of the run input `T`.
26
+ - [`PermissiveWorkspaceOptions`](type-permissiveworkspaceoptions.md): The options of a `workspace()` with no `input`: it starts with any input.
27
+ - [`PermissiveNoSlotWorkspaceOptions`](type-permissivenoslotworkspaceoptions.md): The options of a `workspace()` with no Repo Slot and no `input`: it starts with any input.
28
+ - [`WorkspaceHandles`](type-workspacehandles.md): What the body of a `workspace()` gets as `input.workspace`: the folder of each Repo Slot.
29
+ - [`ExecOutcome`](type-execoutcome.md): How an exec ended.
30
+ - [`Unknown`](type-unknown.md): The output `{ outcome: "unknown", reason }`: the Effect may have acted, and jr2 cannot tell.
31
+ - [`Arg`](type-arg.md): One entry of a command's argv that the input of the Effect fills, as `arg("name")` makes it.
32
+ - [`CommandOptions`](type-commandoptions.md): The options of `command()`: the Repo Slot it runs in, how long it can run, how much of its output it keeps, its Effect secrets, and the commit it runs against.
33
+ - [`CommandInput`](type-commandinput.md): A command's input: one string per argv slot, and with `pin` the approved commit (`{ sha }`); none when there is neither.
34
+ - [`OpenCommandInput`](type-opencommandinput.md): The input of a `command(open)`: a string for each `arg()` of the argv that the Instance binds, and with `pin`, the commit (`{ sha }`).
35
+ - [`Secret`](type-secret.md): What `secret("name")` gives: an Effect secret, by its name in the `secrets` list of `jr2.config.ts`.
36
+ - [`Text`](type-text.md): What the `text` template gives: a string of literal text and Effect secrets, in order.
37
+ - [`FromInput`](type-frominput.md): A value of a file body's part: as written, or from the Effect's input.
38
+ - [`FileBody`](type-filebody.md): `file(path, { segments?, contentType? })`: a Worktree file as an `http` body.
39
+ - [`HttpDefinition`](type-httpdefinition.md): An `http` Effect's definition.
40
+ - [`HttpFileInput`](type-httpfileinput.md): The input of an `http` Effect with a Worktree file as its body.
41
+ - [`OpenSecret`](type-opensecret.md): `secret(open)`: a secret a packaged Machine names in its auth, a header or a command's env, and leaves for its composer to name (ADR-0054).
42
+ - [`PushOptions`](type-pushoptions.md): The options of `push()`.
43
+ - [`PushInput`](type-pushinput.md): The input of a `push` Effect: the Worktree that a cut made, `{ sha }` with `pin`, and `{ message }` with `squash`.
44
+ - [`NameStart`](type-namestart.md): What a Worktree's name may start with: neither `.` nor `-`, and not the end of the path.
45
+ - [`DispatchDefinition`](type-dispatchdefinition.md): The definition of a `dispatch` Effect (ADR-0071).
46
+ - [`DispatchInput`](type-dispatchinput.md): A dispatch's input: the run's body — the slot's schema's type, or any JSON object.
47
+ - [`DispatchOpenParts`](type-dispatchopenparts.md): The Open part a dispatch definition states: its target, when it is `open`.
48
+ - [`McpNotReturned`](type-mcpnotreturned.md): The outcomes that an `mcp` Effect gives besides `returned`.
49
+ - [`ChainLink`](type-chainlink.md): One reply since the pick, as the author reads it.
50
+ - [`SteerArgs`](type-steerargs.md): The arguments a `steer` text or `from` function gets: the Machine's context and the event that the transition takes.
51
+ - [`Sender`](type-sender.md): Who delivered an event: an Agent by its slot, or a Gate by its invoke id (ADR-0015).
52
+ - [`Quantity`](type-quantity.md): A Kubernetes quantity: `"2Gi"`, `"1500m"`, `"2"`, or a plain number (`2` cpus, bytes of memory).
53
+ - [`Carry`](type-carry.md): What `carry(item)` gives.
54
+ - [`PoolSpec`](type-poolspec.md): What you pass to `pool()` with a child Machine as its worker.
55
+ - [`StandingPoolSpec`](type-standingpoolspec.md): What you pass to `pool()` for a Pool of runs.
56
+ - [`Reread`](type-reread.md): What `reread()` gives.
57
+ - [`Skip`](type-skip.md): What `skip(reason)` gives: the delivery brings nothing, and the reason says why.
58
+ - [`SourceSpec`](type-sourcespec.md): A pull Source.
59
+ - [`SourceHooks`](type-sourcehooks.md): A Source's handlers, by Hook kind and event key.
60
+ - [`PushSourceSpec`](type-pushsourcespec.md): A push Source.
61
+ - [`ReadSourceSpec`](type-readsourcespec.md): A read Source.
62
+ - [`OpenBodyLogic`](type-openbodylogic.md): The logic `openBody()` returns: actor logic that carries the brand.
63
+ - [`Lends`](type-lends.md): The parts of the Chart wrapper that a Chart can use, by their keys in `actors`, `guards`, `actions` and `delays`.
64
+ - [`Ceilings`](type-ceilings.md): The limits that an Open body sets on its Chart.
65
+ - [`ChartText`](type-charttext.md): The Chart text (ADR-0070).
66
+ - [`DeliveredEvent`](type-deliveredevent.md): A workflow event as delivered into a Machine: the def's name as `type`, plus its payload.
67
+ - [`Caller`](type-caller.md): A request's Caller (ADR-0078): who acts, through which authenticator, and what it may do.
68
+ - [`FailureInput`](type-failureinput.md): What a Failure carries: `reason`, text for a person, and `detail`, optional JSON for a machine reader.
69
+ - [`SandboxOptions`](type-sandboxoptions.md): The options of a `workspace()` that say what its Sandbox is made of and which Repos it clones.
70
+ - [`SlotHandles`](type-slothandles.md): The handles of a Workspace that declares Repo Slots.
71
+ - [`CommandEnv`](type-commandenv.md): The `env` of a `command`: for each variable, `secret("name")` for the value of an Effect secret, or `secret("name").path` for the path of a file that holds it.
72
+ - [`TextPart`](type-textpart.md): One part of a `Text`: `{ text }`, literal text, or `{ secret }`, the name of an Effect secret.
73
+ - [`HttpMethod`](type-httpmethod.md): The method of an `http` Effect: `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE` or `OPTIONS`.
74
+ - [`HttpRequestParts`](type-httprequestparts.md): What the `request` of an `http` definition returns: the part of the request that changes for each run.
75
+ - [`NamedSecret`](type-namedsecret.md): A secret bound to a name, never `secret(open)`.
76
+ - [`SenderCallerField`](type-sendercallerfield.md): A field of a `Sender`'s Caller that jr2 can verify.
77
+ - [`SourceNextResult`](type-sourcenextresult.md): What the `next` of a Source resolves to: an item, to claim it; `null`, when no item is ready now; or `{ item, open }`, where `open` is the number of items that exist but are not ready.
78
+ - [`SourceIn`](type-sourcein.md): What a Source's handler reads beside `payload`.
79
+ - [`OpenBodySlot`](type-openbodyslot.md): The brand an Open body slot carries, as `definition` marks an Agent slot (ADR-0049).
80
+ - [`ChartJson`](type-chartjson.md): Plain JSON.
81
+ - [`ChartEvent`](type-chartevent.md): An event a Chart mints: its payload is a JSON Schema object, built into zod at admission.
82
+ - [`ChartAgent`](type-chartagent.md): An Agent a Chart mints: the plain fields of an Agent definition (ADR-0049).
83
+ - [`ChartState`](type-chartstate.md): A state node.
84
+ - [`ChartValue`](type-chartvalue.md): A value whose strings may hold `{{<root>.<path>}}` placeholders and whose objects may be `{ "$ref": "<root>.<path>" }`.
85
+ - [`ChartInvoke`](type-chartinvoke.md): An invoke: a lent Agent, Effect or Machine, a minted Agent, or the kit's `gate` or `fail`.
86
+ - [`ChartTransitions`](type-charttransitions.md): One transition or a list, in xstate's order.
87
+ - [`ChartAction`](type-chartaction.md): An action.
88
+ - [`ChartTransition`](type-charttransition.md): A transition: a target alone, or the object form.
89
+ - [`ChartGuard`](type-chartguard.md): A guard: a lent guard by name, with or without params, `jr2.sentBy`, `jr2.failure`, or `not`/`and`/`or`.
90
+
91
+ **Type plumbing.** These types compute a type from the types of a Machine or of its parts. A workflow module does not write them. Each has a page with its declaration:
92
+
93
+ - [`ToProvidedActor`](type-toprovidedactor.md)
94
+ - [`MergedActors`](type-mergedactors.md)
95
+ - [`ToParameterizedObject`](type-toparameterizedobject.md)
96
+ - [`BindActors`](type-bindactors.md)
97
+ - [`SentByGuards`](type-sentbyguards.md)
98
+ - [`GateHooks`](type-gatehooks.md)
99
+ - [`EventFrom`](type-eventfrom.md)
100
+ - [`LookOutput`](type-lookoutput.md)
101
+ - [`AgentLogic`](type-agentlogic.md)
102
+ - [`BodyAcceptsDoor`](type-bodyacceptsdoor.md)
103
+ - [`WorkspaceMachine`](type-workspacemachine.md)
104
+ - [`DoorlessInput`](type-doorlessinput.md)
105
+ - [`BodyAcceptsSlots`](type-bodyacceptsslots.md)
106
+ - [`EffectLogic`](type-effectlogic.md)
107
+ - [`OpenOf`](type-openof.md)
108
+ - [`EnvOpenParts`](type-envopenparts.md)
109
+ - [`OpenEffect`](type-openeffect.md)
110
+ - [`MarkedIf`](type-markedif.md)
111
+ - [`HttpOpenParts`](type-httpopenparts.md)
112
+ - [`HttpInput`](type-httpinput.md)
113
+ - [`PushWireOutput`](type-pushwireoutput.md)
114
+ - [`SyncState`](type-syncstate.md)
115
+ - [`AnswerAction`](type-answeraction.md)
116
+ - [`AgentSlots`](type-agentslots.md)
117
+ - [`Reached`](type-reached.md)
118
+ - [`OpenEffectSlots`](type-openeffectslots.md)
119
+ - [`BindingOf`](type-bindingof.md)
120
+ - [`LogicAt`](type-logicat.md)
121
+ - [`GateSlots`](type-gateslots.md)
122
+ - [`GateBinding`](type-gatebinding.md)
123
+ - [`GateTypesAt`](type-gatetypesat.md)
124
+ - [`ChildSlots`](type-childslots.md)
125
+ - [`ChildAt`](type-childat.md)
126
+ - [`RepoSlotsOf`](type-reposlotsof.md)
127
+ - [`WorkspaceOf`](type-workspaceof.md)
128
+ - [`PoolMachine`](type-poolmachine.md)
129
+ - [`StandingPoolMachine`](type-standingpoolmachine.md)
130
+ - [`GateSlotInput`](type-gateslotinput.md)
131
+ - [`GateSlotParts`](type-gateslotparts.md)
132
+ - [`ArgNames`](type-argnames.md)
133
+ - [`WorktreeKey`](type-worktreekey.md)
134
+ - [`NotWorktreeKeys`](type-notworktreekeys.md)
135
+ - [`OpenSecretMark`](type-opensecretmark.md)
136
+
137
+ These names come from a dependency: from `zod`, `z.ZodObject`, `z.output`, `z.infer`, `z.ZodType`; from `xstate`, `MachineContext`, `UnknownActorLogic`, `ParameterizedObject`, `NonReducibleUnknown`, `EventObject`, `MetaObject`, `ActionFunction`, `GuardPredicate`, `DelayConfig`, `SetupReturn`, `AnyActorLogic`, `InputFrom`, `AnyStateMachine`, `OutputFrom`, `ProvidedActor`, `AnyActorRef`, `CallbackActorLogic`, `PromiseActorLogic`.
@@ -0,0 +1,15 @@
1
+ ---
2
+ title: "Authoring surface: Workspaces and Repos"
3
+ description: A Sandbox and the Repo Slots it binds (ADR-0012, ADR-0051).
4
+ ---
5
+
6
+ # Authoring surface: Workspaces and Repos
7
+
8
+ This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
9
+
10
+ A Sandbox and the Repo Slots it binds ([ADR-0012](../decisions/0012-workspace-wrapper-machine.md), [ADR-0051](../decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md)).
11
+
12
+ - [`workspace`](workspace.md) (function): Run a body Machine in a Sandbox: a pod of its own, with a clone of each Repo Slot.
13
+ - [`Workspaced`](type-workspaced.md) (type): The input of a `workspace()` body: the run input, plus `workspace`, the handles that the Workspace adds (`workspace.repos`, the folder of each Repo Slot).
14
+ - [`Binding`](type-binding.md) (type): The repository of a Repo Slot: `{ url, ref }`.
15
+ - [`RepoSlot`](type-reposlot.md) (type): The value of one Repo Slot in `workspace({ repos })`.
@@ -5,7 +5,9 @@ description: "Make an `http` Effect: a call to a URL, with Effect secrets that t
5
5
 
6
6
  # `http`
7
7
 
8
- Function, in `@jr2/orchestrator/src/http-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
8
+ Function, in `@jr2/orchestrator/src/http-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
+
10
+ ## Overload 1
9
11
 
10
12
  ```ts
11
13
  function http<
@@ -14,8 +16,8 @@ function http<
14
16
  const A extends HttpDefinition<S>["auth"] = undefined,
15
17
  const H extends HttpDefinition<S>["headers"] = undefined,
16
18
  >(
17
- def: HttpDefinition<S> & { url: U; auth?: A; headers?: H },
18
- ): EffectLogic<HttpInput<S>, HttpOutput> & OpenOf<HttpOpenParts<U, A, H>>
19
+ def: HttpDefinition<S> & { url: U; auth?: A; headers?: H; body: FileBody<S> },
20
+ ): EffectLogic<HttpFileInput<S>, HttpOutput> & OpenOf<HttpOpenParts<U, A, H>>
19
21
  ```
20
22
 
21
23
  Make an `http` Effect: a call to a URL, with Effect secrets that the Agent never reads. Put it
@@ -23,8 +25,9 @@ in `actors`, and invoke it by its key: `actors: { comment: http({ ... }) }`, the
23
25
  src: "comment" }`.
24
26
 
25
27
  It runs in the Instance Effector, which `jr2 up` deploys when a Machine has an `http` Effect.
26
- With `body: file(...)`, it runs in the Sandbox Effector of the Workspace whose body invokes it.
27
- The Effector makes the call. The Orchestrator holds no secret.
28
+ With `body: file(...)`, it runs in the Sandbox Effector of the Workspace whose body invokes it,
29
+ and under Repo Slots its input names the Worktree in `worktree`. The Effector makes the call. The
30
+ Orchestrator holds no secret.
28
31
 
29
32
  Every outcome is output (`HttpOutput`): `response`, `unreachable`, `refused` or `unknown`. A 4xx
30
33
  or 5xx status is output too. jr2 sends the call at most one time, unless you mark it
@@ -91,12 +94,15 @@ customize() share: actors: { <name>: http(...) }, then invoke: { src: "<name>" }
91
94
  A function that makes the part of the request that changes for each run, from the input:
92
95
  `path` segments, and a `json` or `text` body. It cannot change the host, a header or an
93
96
  Effect secret. Do not write it beside `body`.
94
- - `body` (optional): `FileBody<S>`
97
+ - `body`: `FileBody<S>`
95
98
 
96
- A Worktree file as the body: `file(path, { slot?, segments?, contentType? })`. The Effect then
97
- runs in the Sandbox Effector of its Workspace. Do not write `request` beside it: the `segments`
99
+ A Worktree file as the body: `file(path, { segments?, contentType? })`. The Effect then
100
+ runs in the Sandbox Effector of its Workspace. Under a Workspace with Repo Slots, the invoke's
101
+ input names a Worktree that a cut of this run made, in `worktree`; with none, it refuses when
102
+ it starts: ``http "<slot>" reads a Worktree file, under a Workspace with Repo Slots, and its
103
+ input names no `worktree` ``. Do not write `request` beside it: the `segments`
98
104
  of `file` are the path. It refuses another body: ``http({ body }): a body is file(path, {
99
- slot?, segments?, contentType? }) — json and text come from `request` ``.
105
+ segments?, contentType? }) — json and text come from `request` ``.
100
106
  - `timeout` (optional): [`Duration`](type-duration.md)
101
107
 
102
108
  How long jr2 waits for the answer: a number and a unit, such as `"30s"` or `"2m"`. Default
@@ -157,3 +163,97 @@ export const machine = jr2Setup({
157
163
  - [Secrets and trust](../../concepts/secrets-and-trust.md)
158
164
  - [ADR-0068: An Effector holds an Effect's secrets and signs its wire](../decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md)
159
165
  - [ADR-0067: An Effect is an actor slot, and runs at most once unless marked idempotent](../decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md)
166
+
167
+ ## Overload 2
168
+
169
+ ```ts
170
+ function http<
171
+ S extends z.ZodType | undefined = undefined,
172
+ const U extends HttpDefinition<S>["url"] = string,
173
+ const A extends HttpDefinition<S>["auth"] = undefined,
174
+ const H extends HttpDefinition<S>["headers"] = undefined,
175
+ >(
176
+ def: HttpDefinition<S> & { url: U; auth?: A; headers?: H },
177
+ ): EffectLogic<HttpInput<S>, HttpOutput> & OpenOf<HttpOpenParts<U, A, H>>
178
+ ```
179
+
180
+ **Parameters**
181
+
182
+ - `def`
183
+
184
+ - `method`: [`HttpMethod`](type-httpmethod.md)
185
+
186
+ The HTTP method: `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE` or `OPTIONS`. It refuses
187
+ another: `http({ method: "<method>" }): the method is one of GET, HEAD, POST, PUT, PATCH,
188
+ DELETE, OPTIONS`.
189
+ - `url`: `string | Text | typeof open`
190
+
191
+ The url: `http://` or `https://`, then a literal host. No input, param or Effect secret can
192
+ change where the call goes. An Effect secret can be only in the path:
193
+ `` text`https://api.telegram.org/bot${secret("tg")}/sendMessage` ``.
194
+
195
+ Or `open`: a packaged Machine that cannot know the host leaves the url Open, and the composer
196
+ binds it one time with `customize(machine, { effects: { <slot>: { url } } })`.
197
+
198
+ It refuses:
199
+ - a scheme or host that is not literal: `` http({ url }): the url is an http:// or https:// url
200
+ whose scheme and host are literal — a secret may sit only in its path, after a "/":
201
+ text`https://api.example.com/bot${secret("tg")}/send` (ADR-0068) ``
202
+ - an Effect secret after `?` or `#`: `` http({ url }): secret("<name>") sits in the url's query
203
+ or fragment — a secret may sit only in its path; send it in `auth` or a header instead:
204
+ headers: { "x-api-key": text`${secret("...")}` } (ADR-0068) ``
205
+ - a host that is not a host: `http({ url }): "<scheme>://<host>" is not a host`
206
+ - a user name or password in the url: ``http({ url }): the url carries userinfo — use `auth` ``
207
+ - `headers` (optional): `Readonly<Record<string, string | Text>>`
208
+
209
+ Headers that are the same for each run. Each name is lowercase. A value is a string, or a
210
+ `text` with an Effect secret.
211
+
212
+ It refuses:
213
+ - a name that is not lowercase, or that frames or routes the request (`host`,
214
+ `content-length`, `transfer-encoding`, `connection`, `upgrade`, `te`, `trailer`,
215
+ `keep-alive`, `proxy-*`): `http({ headers }): "<name>" is not a header an Effect sets — a
216
+ lowercase name that does not frame or route the request (ADR-0068)`
217
+ - an `authorization` header beside `auth`: ``http({ headers }): "authorization" is set by
218
+ `auth` — write one of them``
219
+ - `auth` (optional): `{ readonly bearer: Secret; } | { readonly basic: { user: Text; password: Text; }; } | Text`
220
+
221
+ The `Authorization` header: `bearer(secret("x"))`, `basic(user, password)`, or a `text` that
222
+ is the whole value.
223
+ - `input` (optional): `S`
224
+
225
+ The zod schema of the input of the Effect: what the `input` of the `invoke`, or `fromPick`,
226
+ gives it. jr2 parses the input with it before the call. When it starts, input that does not
227
+ agree with it makes the Effect fail (its `onError` route): `http "<slot>": its input does not
228
+ match the definition's input schema — <path>: <message>`, one `<path>: <message>` for each
229
+ problem, joined by `; `.
230
+ - `request` (optional): `(input: S extends z.ZodType ? z.infer<S> : void) => HttpRequestParts`
231
+
232
+ A function that makes the part of the request that changes for each run, from the input:
233
+ `path` segments, and a `json` or `text` body. It cannot change the host, a header or an
234
+ Effect secret. Do not write it beside `body`.
235
+ - `body` (optional): `FileBody<S>`
236
+
237
+ A Worktree file as the body: `file(path, { segments?, contentType? })`. The Effect then
238
+ runs in the Sandbox Effector of its Workspace. Under a Workspace with Repo Slots, the invoke's
239
+ input names a Worktree that a cut of this run made, in `worktree`; with none, it refuses when
240
+ it starts: ``http "<slot>" reads a Worktree file, under a Workspace with Repo Slots, and its
241
+ input names no `worktree` ``. Do not write `request` beside it: the `segments`
242
+ of `file` are the path. It refuses another body: ``http({ body }): a body is file(path, {
243
+ segments?, contentType? }) — json and text come from `request` ``.
244
+ - `timeout` (optional): [`Duration`](type-duration.md)
245
+
246
+ How long jr2 waits for the answer: a number and a unit, such as `"30s"` or `"2m"`. Default
247
+ `"30s"`. With no answer in that time, the output is `unknown`. It refuses a value that is not
248
+ a positive duration: `http: timeout "<timeout>" is not a positive duration (like "30s",
249
+ "2m")`.
250
+ - `maxBody` (optional): `number`
251
+
252
+ The largest number of bytes of a text response body that the output keeps. Default 65536.
253
+ When jr2 cuts the body, `truncated` is `true`. It refuses a value that is not a positive whole
254
+ number: `http({ maxBody }): a positive number of bytes`.
255
+ - `idempotent` (optional): `boolean`
256
+
257
+ `true` when it is safe to send the call two times: it has its own idempotency key, or it only
258
+ reads. Default `false`. After an Orchestrator restart, jr2 cannot always tell if the call went
259
+ out. Then it sends an idempotent call again, and gives any other call the output `unknown`.
@@ -5,7 +5,7 @@ description: Is this error a Failure, which a state invoked `fail` to make?
5
5
 
6
6
  # `isFailure`
7
7
 
8
- Function, in `@jr2/orchestrator/src/fail.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Failure.
8
+ Function, in `@jr2/orchestrator/src/fail.ts`. It is an export of `@jr2/orchestrator`, in the [Failure](group-failure.md) group of the [Authoring surface](../authoring-surface.md) page.
9
9
 
10
10
  ```ts
11
11
  function isFailure(error: unknown): error is Failure
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: isReady
3
+ description: Is it `ready`?
4
+ ---
5
+
6
+ # `isReady`
7
+
8
+ Constant, 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
+ const isReady: <O extends { outcome: string; }>(output: O) => output is Extract<O, { outcome: "ready"; }>
12
+ ```
13
+
14
+ Is it `ready`? For a guard. A Chart's form is the guard `jr2.ready`.
@@ -5,7 +5,7 @@ description: "Set up a Machine that takes workflow events: the jr2 form of xstat
5
5
 
6
6
  # `jr2Setup`
7
7
 
8
- Function, in `@jr2/orchestrator/src/setup.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Machine and events.
8
+ Function, in `@jr2/orchestrator/src/setup.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
  function jr2Setup<
@@ -60,7 +60,7 @@ function jr2Setup<
60
60
  ): SetupReturn<
61
61
  TContext,
62
62
  WorkflowEvent<TDefs>,
63
- MergedActors<TActors>,
63
+ MergedActors<BindActors<TActors, TInput, TContext>>,
64
64
  {},
65
65
  TActions,
66
66
  TGuards & SentByGuards,
@@ -83,7 +83,9 @@ What it adds to `setup()`:
83
83
  `defineEvent` events you list, plus the events jr2 itself sends (`agent.fault`,
84
84
  `workspace.lost`). An event that a party sent has `event.sender`. A Machine that takes no
85
85
  workflow event leaves out `events`.
86
- - The `gate` actor is ready to invoke by name: `invoke: { src: "gate" }`.
86
+ - The `gate` actor is ready to invoke by name: `invoke: { src: "gate" }`. A Gate slot that hears a
87
+ Hook (`actors: { review: gate({ … }) }`) is invoked by its key. An event in its `delivers` whose
88
+ def leaves `audience` unset is `audience: "external"` in this Machine.
87
89
  - Each Agent slot (`actors: { coder: agent(…) }`) gets its Menu from the states that invoke it.
88
90
  - The `sentBy(id)` guard is ready to use.
89
91
  - `createMachine` also takes `input`: a zod object for the input that starts a run. jr2 checks
@@ -140,6 +142,13 @@ has no `output` (see the list below).
140
142
  run an Agent`: the body sends it a Chart's unrouted `agent.fault`. When both kinds have no route,
141
143
  one line names both, joined by `, and`. One route on the root is a route for each state. A
142
144
  Chart's Machine does not get this refusal: in a Chart the route is optional ([ADR-0070](../decisions/0070-a-machine-lends-its-parts-to-a-chart.md)).
145
+ - an event in a Gate slot's `delivers` that `events` does not list: ``machine "<id>": Gate slot
146
+ "<slot>" delivers "<name>", which no def in jr2Setup({ events }) declares (declared: <names>) —
147
+ list it in events (ADR-0011)``
148
+ - an event in a Gate slot's `delivers` that the Gate does not accept at a state that invokes it:
149
+ ``machine "<id>": state "<state>" invokes Gate slot "<slot>", which delivers "<name>", and its
150
+ Gate does not accept it (accepts: <names>) — no handler or look could deliver it: handle it on
151
+ that state, a state above it or a plain child, or drop it from delivers (ADR-0011)``
143
152
 
144
153
  It also refuses a `sentBy` that names no party (see `sentBy`). It refuses a pick param that
145
154
  nothing reads, where the pick enters a state that invokes an Effect (see `fromPick`). Shapes that
@@ -170,7 +179,8 @@ are legal but probably not what you mean, such as a mode that nothing enters, ar
170
179
  - `actors` (optional): `TActors`
171
180
 
172
181
  The actors the states invoke by name, as in `setup()`: Agent slots (`agent(…)`), Effects
173
- (`command(…)`, `http(…)`, `push(…)`), child Machines, `workspace(…)` and plain xstate logic.
182
+ (`command(…)`, `http(…)`, `push(…)`), Gate slots (`gate({ … })`), child Machines, `workspace(…)`
183
+ and plain xstate logic.
174
184
  The key is the slot's name. An actor named `gate` replaces jr2's Gate.
175
185
  - `actions` (optional): `{ [K in keyof TActions]: ActionFunction<TContext, WorkflowEvent<TDefs>, WorkflowEvent<TDefs>, TActions[K], ToProvidedActor<MergedActors<TActors>>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TEmitted>; }`
176
186
 
@@ -0,0 +1,107 @@
1
+ ---
2
+ title: mcp
3
+ description: "The `mcp` Effects (ADR-0067, ADR-0079): `mcp.call(server, tool, { input })` calls a tool, `mcp.read(server, uri)` reads a resource, and `mcp.prompt(server, name, { input })` gets a prompt."
4
+ ---
5
+
6
+ # `mcp`
7
+
8
+ Constant, in `@jr2/orchestrator/src/mcp-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
+
10
+ ```ts
11
+ const mcp: { readonly call: typeof call; readonly read: typeof read; readonly prompt: typeof prompt; }
12
+ ```
13
+
14
+ The `mcp` Effects ([ADR-0067](../decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md), [ADR-0079](../decisions/0079-an-agent-holds-mcp-tools-a-machine-calls-them-as-an-effect-and-the-machine-is-the-approval.md)): `mcp.call(server, tool, { input })` calls a tool,
15
+ `mcp.read(server, uri)` reads a resource, and `mcp.prompt(server, name, { input })` gets a
16
+ prompt. Each one is an Effect that the Machine runs, with no model, in the Instance Effector.
17
+ Put it in `actors`, and invoke it by its key.
18
+
19
+ `server` is a name of the `mcp` block of `jr2.config.ts`: a remote server, whose url and secret
20
+ are the config's. The Instance Effector holds that secret as an Effect secret, and sends it as
21
+ `Authorization: Bearer <value>`. The Agent and the Orchestrator never read it. `jr2 up` refuses
22
+ a server that the `mcp` block does not declare, and a stdio server. `server`, and a call's
23
+ `tool`, can each be `open`: the composer binds them one time with `customize(machine, { effects:
24
+ { <slot>: { server, tool } } })`.
25
+
26
+ Every outcome is output ([`McpCallOutput`](type-mcpcalloutput.md), [`McpReadOutput`](type-mcpreadoutput.md)): `returned`, `refused`,
27
+ `unreachable`, `input-required` or `unknown`. jr2 sends the request at most one time, unless you
28
+ mark it `idempotent`. jr2 does not read the tool's `idempotentHint`.
29
+
30
+ An Agent that holds a server's tools (its `mcp` list) calls them with no approval. When a call
31
+ needs an approval, the Machine makes it: the Agent picks, a Gate waits for a person, and the
32
+ Effect makes the call. The Effect's output is the pick's answer.
33
+
34
+ **Example**
35
+
36
+ ```ts
37
+ import { assign } from "xstate";
38
+ import { z } from "zod";
39
+ import { agent, defineEvent, fail, gate, jr2Setup, mcp } from "@jr2/orchestrator";
40
+
41
+ const postMessage = defineEvent({
42
+ name: "post_message",
43
+ description: "Post one message to the team's channel. A person approves it first.",
44
+ input: z.object({ text: z.string() }),
45
+ });
46
+ const approve = defineEvent({ name: "approve", input: z.object({ by: z.string() }) });
47
+ const reject = defineEvent({ name: "reject", input: z.object({ by: z.string() }) });
48
+
49
+ export const machine = jr2Setup({
50
+ types: {} as { context: { text: string } },
51
+ events: [postMessage, approve, reject],
52
+ actors: {
53
+ writer: agent({
54
+ model: "anthropic/claude-haiku-5-5",
55
+ instructions: "You write the release note for the team.",
56
+ workspace: "none",
57
+ }),
58
+ // A person answers it, in the Console or with `jr2 answer`.
59
+ approval: gate({ meta: z.object({ text: z.string() }), delivers: [approve, reject], look: "none" }),
60
+ // "slack-acme" is a remote server of the mcp block of jr2.config.ts.
61
+ post: mcp.call("slack-acme", "post_message", {
62
+ input: z.object({ channel: z.string(), text: z.string() }),
63
+ }),
64
+ fail: fail(),
65
+ },
66
+ }).createMachine({
67
+ id: "release-note",
68
+ context: { text: "" },
69
+ on: { "agent.fault": ".failed" },
70
+ initial: "writing",
71
+ states: {
72
+ writing: {
73
+ invoke: { src: "writer", input: { prompt: "Write the release note, then post it." } },
74
+ initial: "ready",
75
+ states: {
76
+ ready: {
77
+ on: {
78
+ post_message: { target: "approving", actions: assign({ text: ({ event }) => event.text }) },
79
+ },
80
+ },
81
+ approving: {
82
+ invoke: { src: "approval", input: ({ context }) => ({ meta: { text: context.text } }) },
83
+ on: { approve: "posting", reject: "ready" },
84
+ },
85
+ posting: {
86
+ invoke: {
87
+ src: "post",
88
+ input: ({ context }) => ({ channel: "#releases", text: context.text }),
89
+ // On another outcome, the Agent reads the output as the answer to its pick.
90
+ onDone: [
91
+ { guard: ({ event }) => event.output.outcome === "returned" && !event.output.isError, target: "#posted" },
92
+ { target: "ready" },
93
+ ],
94
+ },
95
+ },
96
+ },
97
+ },
98
+ posted: { id: "posted", type: "final" },
99
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
100
+ },
101
+ });
102
+ ```
103
+
104
+ **See also**
105
+
106
+ - [Effects](../../concepts/effects.md)
107
+ - [ADR-0079: An Agent holds MCP tools, a Machine calls them as an Effect, and the Machine is the approval](../decisions/0079-an-agent-holds-mcp-tools-a-machine-calls-them-as-an-effect-and-the-machine-is-the-approval.md)