@jr2/orchestrator 0.4.1 → 0.5.1

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 (327) hide show
  1. package/README.md +20 -2
  2. package/console/components/app.ts +2 -0
  3. package/console/components/fleet.ts +14 -1
  4. package/console/components/machine-pane.ts +41 -2
  5. package/console/main.ts +13 -1
  6. package/console/store.ts +102 -6
  7. package/console/style.css +21 -0
  8. package/docs/agents-block.md +5 -0
  9. package/docs/concepts/agents-and-turns.md +442 -0
  10. package/docs/concepts/architecture.md +230 -0
  11. package/docs/concepts/charts.md +143 -0
  12. package/docs/concepts/composition.md +357 -0
  13. package/docs/concepts/converge.md +254 -0
  14. package/docs/concepts/durable-runs.md +189 -0
  15. package/docs/concepts/effects.md +603 -0
  16. package/docs/concepts/gates.md +208 -0
  17. package/docs/concepts/machines-and-workflows.md +289 -0
  18. package/docs/concepts/pools-and-sources.md +230 -0
  19. package/docs/concepts/secrets-and-trust.md +222 -0
  20. package/docs/concepts/the-menu.md +378 -0
  21. package/docs/concepts/workspaces.md +678 -0
  22. package/docs/get-started/a-model-decides.md +563 -0
  23. package/docs/get-started/an-agent-in-a-sandbox.md +381 -0
  24. package/docs/get-started/connect-a-model.md +248 -0
  25. package/docs/get-started/create-an-instance.md +194 -0
  26. package/docs/get-started/have-your-assistant-write-a-machine.md +922 -0
  27. package/docs/get-started/install.md +126 -0
  28. package/docs/guides/add-tools-to-the-sandbox.md +295 -0
  29. package/docs/guides/answer-a-gate.md +304 -0
  30. package/docs/guides/bind-open-parts.md +223 -0
  31. package/docs/guides/cancel-a-run.md +146 -0
  32. package/docs/guides/clean-up.md +206 -0
  33. package/docs/guides/fix-a-failed-converge.md +361 -0
  34. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  35. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  36. package/docs/guides/let-an-agent-write-a-chart.md +226 -0
  37. package/docs/guides/look-inside-a-sandbox.md +174 -0
  38. package/docs/guides/mirror-the-kit-images.md +176 -0
  39. package/docs/guides/move-from-kind-to-a-shared-cluster.md +302 -0
  40. package/docs/guides/open-the-console.md +91 -0
  41. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  42. package/docs/guides/push-and-sign-a-branch.md +486 -0
  43. package/docs/guides/run-a-chart-by-name.md +270 -0
  44. package/docs/guides/run-a-command-or-call-a-url.md +544 -0
  45. package/docs/guides/run-one-worker-per-item.md +321 -0
  46. package/docs/guides/set-an-agents-access-and-dials.md +375 -0
  47. package/docs/guides/size-a-workspace.md +204 -0
  48. package/docs/guides/start-a-run-from-a-run.md +237 -0
  49. package/docs/guides/start-a-run.md +207 -0
  50. package/docs/guides/upgrade-the-kit-version.md +240 -0
  51. package/docs/guides/use-a-hosted-provider.md +208 -0
  52. package/docs/guides/use-a-local-model.md +313 -0
  53. package/docs/guides/watch-a-run.md +326 -0
  54. package/docs/guides/write-a-workflow.md +318 -0
  55. package/docs/index.md +44 -0
  56. package/docs/llms.txt +216 -0
  57. package/docs/reference/authoring-surface/agent.md +128 -0
  58. package/docs/reference/authoring-surface/answer.md +140 -0
  59. package/docs/reference/authoring-surface/arg.md +60 -0
  60. package/docs/reference/authoring-surface/basic.md +62 -0
  61. package/docs/reference/authoring-surface/bearer.md +53 -0
  62. package/docs/reference/authoring-surface/chartschema.md +23 -0
  63. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  64. package/docs/reference/authoring-surface/command.md +191 -0
  65. package/docs/reference/authoring-surface/customize.md +64 -0
  66. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  67. package/docs/reference/authoring-surface/defineevent.md +114 -0
  68. package/docs/reference/authoring-surface/dispatch.md +126 -0
  69. package/docs/reference/authoring-surface/fail.md +83 -0
  70. package/docs/reference/authoring-surface/file.md +122 -0
  71. package/docs/reference/authoring-surface/frompick.md +277 -0
  72. package/docs/reference/authoring-surface/http.md +159 -0
  73. package/docs/reference/authoring-surface/isfailure.md +58 -0
  74. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  75. package/docs/reference/authoring-surface/open.md +74 -0
  76. package/docs/reference/authoring-surface/openbody.md +86 -0
  77. package/docs/reference/authoring-surface/paramsof.md +125 -0
  78. package/docs/reference/authoring-surface/pool.md +186 -0
  79. package/docs/reference/authoring-surface/push.md +112 -0
  80. package/docs/reference/authoring-surface/secret.md +118 -0
  81. package/docs/reference/authoring-surface/sentby.md +83 -0
  82. package/docs/reference/authoring-surface/source.md +51 -0
  83. package/docs/reference/authoring-surface/text.md +62 -0
  84. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  85. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  86. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  87. package/docs/reference/authoring-surface/type-agentslots.md +12 -0
  88. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  89. package/docs/reference/authoring-surface/type-arg.md +19 -0
  90. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  91. package/docs/reference/authoring-surface/type-binding.md +62 -0
  92. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  93. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  94. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  95. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  96. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  97. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  98. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  99. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  100. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  101. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  102. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  103. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  104. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  105. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  106. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  107. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  108. package/docs/reference/authoring-surface/type-childat.md +12 -0
  109. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  110. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  111. package/docs/reference/authoring-surface/type-commandinput.md +19 -0
  112. package/docs/reference/authoring-surface/type-commandoptions.md +78 -0
  113. package/docs/reference/authoring-surface/type-commandoutput.md +104 -0
  114. package/docs/reference/authoring-surface/type-customize.md +109 -0
  115. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  116. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  117. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  118. package/docs/reference/authoring-surface/type-dispatchoutput.md +65 -0
  119. package/docs/reference/authoring-surface/type-duration.md +15 -0
  120. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  121. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  122. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  123. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  124. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  125. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  126. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  127. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  128. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  129. package/docs/reference/authoring-surface/type-failure.md +19 -0
  130. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  131. package/docs/reference/authoring-surface/type-filebody.md +41 -0
  132. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  133. package/docs/reference/authoring-surface/type-hostinjectedinput.md +58 -0
  134. package/docs/reference/authoring-surface/type-httpdefinition.md +101 -0
  135. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  136. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  137. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  138. package/docs/reference/authoring-surface/type-httpoutput.md +89 -0
  139. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  140. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  141. package/docs/reference/authoring-surface/type-lends.md +38 -0
  142. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  143. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  144. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  145. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  146. package/docs/reference/authoring-surface/type-noslotspec.md +26 -0
  147. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +32 -0
  148. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  149. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  150. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  151. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  152. package/docs/reference/authoring-surface/type-opencommandinput.md +17 -0
  153. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  154. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  155. package/docs/reference/authoring-surface/type-openof.md +12 -0
  156. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  157. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  158. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +31 -0
  159. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +32 -0
  160. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  161. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  162. package/docs/reference/authoring-surface/type-pushinput.md +15 -0
  163. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  164. package/docs/reference/authoring-surface/type-pushoutput.md +124 -0
  165. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  166. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  167. package/docs/reference/authoring-surface/type-reached.md +12 -0
  168. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  169. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  170. package/docs/reference/authoring-surface/type-sandboxoptions.md +77 -0
  171. package/docs/reference/authoring-surface/type-secret.md +25 -0
  172. package/docs/reference/authoring-surface/type-sender.md +19 -0
  173. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  174. package/docs/reference/authoring-surface/type-size.md +85 -0
  175. package/docs/reference/authoring-surface/type-slothandles.md +32 -0
  176. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  177. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  178. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  179. package/docs/reference/authoring-surface/type-text.md +19 -0
  180. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  181. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  182. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  183. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  184. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  185. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  186. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  187. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  188. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  189. package/docs/reference/authoring-surface/type-workspaced.md +94 -0
  190. package/docs/reference/authoring-surface/type-workspacehandles.md +23 -0
  191. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  192. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  193. package/docs/reference/authoring-surface/type-workspaceoptions.md +39 -0
  194. package/docs/reference/authoring-surface/type-workspacespec.md +37 -0
  195. package/docs/reference/authoring-surface/workspace.md +259 -0
  196. package/docs/reference/authoring-surface.md +197 -0
  197. package/docs/reference/cli.md +433 -0
  198. package/docs/reference/config.md +756 -0
  199. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +113 -0
  200. package/docs/reference/decisions/0002-duplex-streaming-actor.md +110 -0
  201. package/docs/reference/decisions/0004-worktree-provisioning-model.md +124 -0
  202. package/docs/reference/decisions/0005-sandbox-pod-composition.md +230 -0
  203. package/docs/reference/decisions/0006-agent-control-surface.md +47 -0
  204. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  205. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  206. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  207. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  208. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  209. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  210. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +157 -0
  211. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  212. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +265 -0
  213. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +124 -0
  214. package/docs/reference/decisions/0017-pool-over-a-source-port.md +69 -0
  215. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  216. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +275 -0
  217. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  218. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +100 -0
  219. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  220. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +176 -0
  221. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +439 -0
  222. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  223. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  224. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +237 -0
  225. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +89 -0
  226. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  227. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  228. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +190 -0
  229. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  230. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +127 -0
  231. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  232. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  233. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  234. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  235. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  236. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  237. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  238. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  239. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  240. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  241. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  242. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  243. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  244. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  245. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  246. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  247. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +227 -0
  248. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +81 -0
  249. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +111 -0
  250. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  251. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  252. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  253. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  254. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +106 -0
  255. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +384 -0
  256. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  257. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  258. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +212 -0
  259. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +83 -0
  260. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  261. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  262. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +550 -0
  263. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +430 -0
  264. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +464 -0
  265. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  266. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +323 -0
  267. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  268. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  269. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  270. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  271. package/docs/reference/decisions.md +83 -0
  272. package/docs/reference/glossary.md +648 -0
  273. package/docs/reference/http-api.md +1348 -0
  274. package/docs/reference/machines.md +190 -0
  275. package/docs/reference/mechanism-events.md +72 -0
  276. package/docs/why.md +206 -0
  277. package/package.json +5 -3
  278. package/src/actor.ts +541 -79
  279. package/src/agent.ts +114 -38
  280. package/src/ambient.ts +2 -1
  281. package/src/assembly-checks.ts +189 -7
  282. package/src/cause.ts +234 -0
  283. package/src/chart.ts +169 -37
  284. package/src/charts.ts +34 -6
  285. package/src/config.ts +430 -178
  286. package/src/custodian.ts +74 -22
  287. package/src/customize.ts +188 -46
  288. package/src/dispatch-effect.ts +945 -0
  289. package/src/door-compat.ts +217 -0
  290. package/src/durability.ts +11 -4
  291. package/src/effect.ts +341 -44
  292. package/src/effector-wire.ts +160 -11
  293. package/src/fail.ts +209 -0
  294. package/src/harness-client.ts +541 -47
  295. package/src/http-effect.ts +495 -53
  296. package/src/http.ts +427 -16
  297. package/src/index.ts +60 -82
  298. package/src/instance.ts +68 -8
  299. package/src/internal.ts +84 -0
  300. package/src/machine-doc.ts +21 -3
  301. package/src/mechanism-routes.ts +168 -0
  302. package/src/model-keys.generated.ts +53 -0
  303. package/src/model-keys.ts +18 -58
  304. package/src/notices.ts +66 -13
  305. package/src/open-body.ts +159 -23
  306. package/src/open-effect.ts +81 -8
  307. package/src/open.ts +59 -6
  308. package/src/parts.ts +184 -13
  309. package/src/party.ts +68 -2
  310. package/src/pick.ts +463 -11
  311. package/src/pool.ts +247 -36
  312. package/src/registration.ts +83 -4
  313. package/src/repos.ts +2 -1
  314. package/src/run-host.ts +565 -31
  315. package/src/run-output.ts +38 -0
  316. package/src/sandbox-effect.ts +273 -38
  317. package/src/sandbox-kube.ts +3 -1
  318. package/src/secret-placement.ts +52 -17
  319. package/src/server.ts +3 -0
  320. package/src/setup.ts +239 -56
  321. package/src/size.ts +121 -9
  322. package/src/snapshot-store.ts +54 -10
  323. package/src/stub-harness.ts +44 -16
  324. package/src/timers.ts +14 -1
  325. package/src/vocabulary.ts +69 -14
  326. package/src/wire.ts +90 -16
  327. package/src/workspace.ts +697 -175
package/src/http.ts CHANGED
@@ -5,17 +5,14 @@
5
5
  // TWO dialects, one primitive (ADR-0013). The Orchestrator does not speak MCP — nothing does: the
6
6
  // Harness presents the Menu to its model itself, and reaches these routes through the Custodian in
7
7
  // its pod, which holds the Sandbox token. What is left here are two thin adapters over the same
8
- // registration table:
8
+ // registration table: the Gate resource of ADR-0011, for a human, a webhook or CI
9
+ // (`GET /runs/:id`, `POST /runs/:id/gates/:gate/events`), and the Agent's surface, for the Agent's
10
+ // Harness through its Custodian and nothing else (`/agents/:iid/*`). `/sandboxes/:name/fetch` also
11
+ // serves the Harness's pod, but it is not an adapter over the registration table.
9
12
  //
10
- // # human / webhook / CI — the Gate resource of ADR-0011
11
- // GET /runs/:id open gates: accepts + schemas + meta [Instance token]
12
- // POST /runs/:id/gates/:gate/events validate + deliver [Instance token]
13
- //
14
- // # the Agent's Harness, through its Custodian, and nothing else
15
- // GET /agents/:iid/surface accepts + schemas + semantics [Sandbox token]
16
- // POST /agents/:iid/events validate + deliver → the turn receipt [Sandbox token]
17
- // GET /agents/:iid/deliveries/:id long-poll an outstanding pick's answer [Sandbox token]
18
- // POST /sandboxes/:name/fetch ask the node cache to fetch one Repo [Sandbox token]
13
+ // Every route, with its band, is a row of `HTTP_ROUTES` below. That table is data: the HTTP API
14
+ // Reference is generated from it (ADR-0072), and http-routes.test.ts holds it to the routes
15
+ // `createApp` registers, both ways.
19
16
  //
20
17
  // # named Charts (ADR-0070): a Chart under a name is a Workflow `<wrapper>/<name>`
21
18
  // GET /workflows/:wrapper/chart-schema the grammar, narrowed to the Open body [open]
@@ -53,16 +50,379 @@ import { Hono } from "hono";
53
50
  import type { Context, MiddlewareHandler } from "hono";
54
51
  import { accepts } from "hono/accepts";
55
52
  import { streamSSE } from "hono/streaming";
56
- import { EventValidationError, NotTakenError, OutstandingError, UnknownAddressError } from "./registration.ts";
53
+ import { z } from "zod";
54
+ import {
55
+ DISPATCHED_BY_HEADER,
56
+ EventValidationError,
57
+ NotTakenError,
58
+ OutstandingError,
59
+ UnknownAddressError,
60
+ type DispatchedBy,
61
+ } from "./registration.ts";
57
62
  import type { RepoStatus } from "./repos.ts";
58
63
  import { UnmountedRepoError, type FetchAnswer } from "./repo-fetch.ts";
59
64
  import { mayAskForSandbox, mayDeliverToAgent, type Authenticator, type Principal } from "./tokens.ts";
60
- import { observe, type RunFeedEvent, type RunHost, type RunStatus, type WorkflowFeedEvent } from "./run-host.ts";
65
+ import {
66
+ DispatchKeyConflictError,
67
+ keyAnswer,
68
+ keyConflict,
69
+ observe,
70
+ UnknownWorkflowError,
71
+ type RunFeedEvent,
72
+ type RunHost,
73
+ type RunStatus,
74
+ type WorkflowFeedEvent,
75
+ } from "./run-host.ts";
61
76
  import { KIT_VERSION } from "./config.ts";
62
77
  import type { AssemblyDoor } from "./assembly.ts";
63
78
  import { ChartRefusal } from "./chart.ts";
64
79
  import { chartName, NamedChartError, splitChartName, type NamedCharts } from "./charts.ts";
65
80
 
81
+ // ---- The route table (ADR-0072) -------------------------------------------------------------
82
+ // The routes `createApp` registers, as data. It is the source of the HTTP API Reference page, so a
83
+ // row says what a CALLER needs: the address, the credential, the body, the answer. Why a route is
84
+ // in its band stays in the comment above its handler. http-routes.test.ts compares the rows with
85
+ // the app's own registrations both ways and checks each row's band on the wire, so the table
86
+ // cannot drift from the code by forgetting.
87
+
88
+ /** The access bands of ADR-0014, named for the credential each requires, and the publish door's
89
+ * band (ADR-0069): the publish token alone. */
90
+ export type HttpBand = "open" | "authenticated" | "instanceOnly" | "publishOnly";
91
+
92
+ /** One route of the Orchestrator's HTTP API (ADR-0072). */
93
+ export type HttpRoute = {
94
+ method: "GET" | "POST" | "PUT" | "DELETE";
95
+ /** In Hono syntax, exactly as registered: `:param`, and `:param{regex}` for a constrained one. */
96
+ path: string;
97
+ band: HttpBand;
98
+ /** One line: what the route does. */
99
+ summary: string;
100
+ /** The request body, as a type name or in short; absent when the route reads none. */
101
+ body?: string;
102
+ /** The success answer, in short. Errors are `{ error }` with the status the handler says. */
103
+ response: string;
104
+ /** `true` when the answer is a Server-Sent Events stream. */
105
+ stream: boolean;
106
+ /** The decisions that shape the route, as bare ADR numbers: `"0014"`. */
107
+ adrs: readonly string[];
108
+ };
109
+
110
+ /** Every route of the Orchestrator's HTTP API, in the order `createApp` registers them. */
111
+ export const HTTP_ROUTES: readonly HttpRoute[] = [
112
+ {
113
+ method: "GET",
114
+ path: "/healthz",
115
+ band: "open",
116
+ summary: "Liveness, and what this instance is: its Kit version and image content hash.",
117
+ response: "{ ok: true, version, hash? }",
118
+ stream: false,
119
+ adrs: ["0009", "0019"],
120
+ },
121
+ {
122
+ method: "GET",
123
+ path: "/readyz",
124
+ band: "open",
125
+ summary: "Readiness.",
126
+ response: "{ ready: true }",
127
+ stream: false,
128
+ adrs: ["0009"],
129
+ },
130
+ {
131
+ method: "GET",
132
+ path: "/workflows",
133
+ band: "open",
134
+ summary:
135
+ "The Workflows a run can start, each with its origin, and each Chart wrapper's named Charts in its entry. A named Chart that cannot run now says why.",
136
+ response: "WorkflowListing[]",
137
+ stream: false,
138
+ adrs: ["0014", "0070"],
139
+ },
140
+ {
141
+ method: "GET",
142
+ path: "/assembly",
143
+ band: "open",
144
+ summary: "The current Assembly and the Assemblies that live runs hold.",
145
+ response: "AssemblyView",
146
+ stream: false,
147
+ adrs: ["0069"],
148
+ },
149
+ {
150
+ method: "PUT",
151
+ path: "/assembly",
152
+ band: "publishOnly",
153
+ summary:
154
+ "Publish the next Assembly. `jr2 up` calls it, and nothing else. A refused Assembly leaves the current one current.",
155
+ body: "the Assembly as a tar stream, with the headers `jr2-kit-version` and `jr2-assembly-hash`",
156
+ response:
157
+ "200 with the Assembly, its Workflows, the held Assemblies and the ones collected; 400, 409 or 422 with the reason",
158
+ stream: false,
159
+ adrs: ["0069"],
160
+ },
161
+ {
162
+ method: "GET",
163
+ path: "/workflows/:wrapper/chart-schema",
164
+ band: "open",
165
+ summary: "The Chart grammar, narrowed to the Open body of one Chart wrapper.",
166
+ response: "JSON Schema",
167
+ stream: false,
168
+ adrs: ["0070"],
169
+ },
170
+ {
171
+ method: "PUT",
172
+ path: "/workflows/:wrapper/charts/:name",
173
+ band: "instanceOnly",
174
+ summary: "Admit and keep a runtime Chart under a name. Its Workflow is `<wrapper>/<name>`.",
175
+ body: "the Chart text alone",
176
+ response: "201 { name, origin, hash } when new, 200 when it replaced one; 422 { error, report } when refused",
177
+ stream: false,
178
+ adrs: ["0070"],
179
+ },
180
+ {
181
+ method: "DELETE",
182
+ path: "/workflows/:wrapper/charts/:name",
183
+ band: "instanceOnly",
184
+ summary: "Remove a runtime Chart. A live run of it keeps its own text.",
185
+ response: "204",
186
+ stream: false,
187
+ adrs: ["0070"],
188
+ },
189
+ {
190
+ method: "POST",
191
+ path: "/workflows/:wrapper/charts/:name/runs",
192
+ band: "instanceOnly",
193
+ summary: "Start a run of a named Chart, as `POST /workflows/<wrapper>%2F<name>/runs` does.",
194
+ body: "the Chart wrapper's input, without the Chart",
195
+ response: "201 { runId, instanceId }; 409 when the named Chart cannot run now",
196
+ stream: false,
197
+ adrs: ["0070"],
198
+ },
199
+ {
200
+ method: "GET",
201
+ path: "/workflows/:name/runs/:runId/machine",
202
+ band: "open",
203
+ summary: "The Machine that a run binds, with each bound Chart compiled in, which the Console draws.",
204
+ response: "MachineDoc",
205
+ stream: false,
206
+ adrs: ["0070"],
207
+ },
208
+ {
209
+ method: "GET",
210
+ path: "/",
211
+ band: "open",
212
+ summary: "The Console page to a browser; a 404 to a JSON caller.",
213
+ response: "text/html (the Console shell)",
214
+ stream: false,
215
+ adrs: ["0032"],
216
+ },
217
+ {
218
+ method: "GET",
219
+ path: "/workflows/:name",
220
+ band: "open",
221
+ summary: "The Console page to a browser; to a JSON caller, the workflow and its declared input schema.",
222
+ response: "{ name, machineId, input: JSON Schema | null }, or text/html",
223
+ stream: false,
224
+ adrs: ["0032", "0033"],
225
+ },
226
+ {
227
+ method: "POST",
228
+ path: "/workflows/:name/runs",
229
+ band: "instanceOnly",
230
+ summary:
231
+ "Start a run of a registered workflow. A `dispatch` from another Orchestrator sends the header `jr2-dispatched-by`, and a repeated start with its key answers the run that it started.",
232
+ body: "the workflow's input, checked against its declared input schema",
233
+ response:
234
+ "201 { runId, instanceId }; 200 { runId, instanceId, existing: true } for a repeated dispatch; 422 { error, report } when the door refuses a Chart in the input",
235
+ stream: false,
236
+ adrs: ["0033", "0058", "0070", "0071"],
237
+ },
238
+ {
239
+ method: "GET",
240
+ path: "/workflows/:name/machine",
241
+ band: "open",
242
+ summary: "The registered template Machine's structure, which the Console draws.",
243
+ response: "MachineDoc",
244
+ stream: false,
245
+ adrs: ["0014"],
246
+ },
247
+ {
248
+ method: "GET",
249
+ path: "/workflows/:name/runs",
250
+ band: "open",
251
+ summary: "The live runs of one workflow, as observations: identity and state value, no context.",
252
+ response: "RunObservation[]",
253
+ stream: false,
254
+ adrs: ["0014"],
255
+ },
256
+ {
257
+ method: "GET",
258
+ path: "/workflows/:name/events",
259
+ band: "open",
260
+ summary: "The activity of every run of one workflow, as observations, on one connection.",
261
+ response: "SSE: runs, status, emit (type only), retry, gone",
262
+ stream: true,
263
+ adrs: ["0014", "0022"],
264
+ },
265
+ {
266
+ method: "GET",
267
+ path: "/workflows/:name/runs/:runId/events",
268
+ band: "open",
269
+ summary: "One live run's activity, as observations, until it settles.",
270
+ response: "SSE: status, emit (type only), retry",
271
+ stream: true,
272
+ adrs: ["0014", "0022"],
273
+ },
274
+ {
275
+ method: "GET",
276
+ path: "/assets/style.css",
277
+ band: "open",
278
+ summary: "The Console's stylesheet.",
279
+ response: "text/css",
280
+ stream: false,
281
+ adrs: ["0032"],
282
+ },
283
+ {
284
+ method: "GET",
285
+ path: "/assets/elk.js",
286
+ band: "open",
287
+ summary: "The Console's graph layout library (the elkjs bundle).",
288
+ response: "text/javascript",
289
+ stream: false,
290
+ adrs: ["0032"],
291
+ },
292
+ {
293
+ method: "GET",
294
+ path: "/assets/:file{[\\w.-]+\\.ts}",
295
+ band: "open",
296
+ summary: "A Console source module, with its types erased.",
297
+ response: "text/javascript",
298
+ stream: false,
299
+ adrs: ["0034"],
300
+ },
301
+ {
302
+ method: "GET",
303
+ path: "/assets/components/:file{[\\w.-]+\\.ts}",
304
+ band: "open",
305
+ summary: "A Console view module, with its types erased.",
306
+ response: "text/javascript",
307
+ stream: false,
308
+ adrs: ["0034"],
309
+ },
310
+ {
311
+ method: "GET",
312
+ path: "/assets/vendor/:file",
313
+ band: "open",
314
+ summary: "Preact's browser ESM, which the Console's import map names.",
315
+ response: "text/javascript",
316
+ stream: false,
317
+ adrs: ["0034"],
318
+ },
319
+ {
320
+ method: "GET",
321
+ path: "/runs",
322
+ band: "instanceOnly",
323
+ summary: "The live runs, with their full status.",
324
+ response: "RunStatus[]",
325
+ stream: false,
326
+ adrs: ["0009", "0014"],
327
+ },
328
+ {
329
+ method: "GET",
330
+ path: "/repos",
331
+ band: "instanceOnly",
332
+ summary: "The Repos as the cluster reports them.",
333
+ response: "{ dataPlane, repos: RepoStatus[] }",
334
+ stream: false,
335
+ adrs: ["0048", "0051"],
336
+ },
337
+ {
338
+ method: "GET",
339
+ path: "/runs/resolve",
340
+ band: "instanceOnly",
341
+ summary: "The run ids that start with a prefix (`?prefix=`, at least 4 characters).",
342
+ response: "{ prefix, runIds: string[], truncated }",
343
+ stream: false,
344
+ adrs: ["0009"],
345
+ },
346
+ {
347
+ method: "GET",
348
+ path: "/runs/:runId",
349
+ band: "instanceOnly",
350
+ summary: "One run's status, live or settled, with its open Gates.",
351
+ response: "RunStatus & { gates: GateView[] }",
352
+ stream: false,
353
+ adrs: ["0009", "0011"],
354
+ },
355
+ {
356
+ // `authenticated` in the code, and the handler refuses a Sandbox token itself (ADR-0013): the
357
+ // credential the route requires is the Instance token's, so this is its band.
358
+ method: "POST",
359
+ path: "/runs/:runId/gates/:gate/events",
360
+ band: "instanceOnly",
361
+ summary: "Deliver an event to an open Gate of a run.",
362
+ body: "{ type, ...payload }, checked against the Gate's schema for that event",
363
+ response: "{ ok: true }; 409 { error, acceptsNow } when the run does not take it now",
364
+ stream: false,
365
+ adrs: ["0011", "0013"],
366
+ },
367
+ {
368
+ method: "GET",
369
+ path: "/runs/:runId/events",
370
+ band: "instanceOnly",
371
+ summary: "One run's full activity until it settles; a settled run's final status, once.",
372
+ response: "SSE: status, emit, retry, admission, pick, placing, placed, child-error, effect, gone",
373
+ stream: true,
374
+ adrs: ["0022", "0023", "0064", "0067"],
375
+ },
376
+ {
377
+ method: "POST",
378
+ path: "/runs/:runId/events",
379
+ band: "instanceOnly",
380
+ summary: "Cancel a run: it ends, and its Workspaces go unless `keep` is true.",
381
+ body: '{ type: "CANCEL", keep?: boolean }',
382
+ response: "{ ok: true }",
383
+ stream: false,
384
+ adrs: ["0002", "0025"],
385
+ },
386
+ {
387
+ method: "GET",
388
+ path: "/agents/:instanceId/surface",
389
+ band: "authenticated",
390
+ summary: "An Agent's Menu and this Turn's Allowed picks. A Sandbox token reads only its own Sandbox's.",
391
+ response: "AgentSurfaceView",
392
+ stream: false,
393
+ adrs: ["0013", "0029"],
394
+ },
395
+ {
396
+ method: "POST",
397
+ path: "/agents/:instanceId/events",
398
+ band: "authenticated",
399
+ summary: "Deliver an Agent's pick into the state that invoked it.",
400
+ body: "{ type, ...payload }, checked against the pick's input schema",
401
+ response: 'AgentDeliveryReceipt; 409 { refused: "outstanding", outstanding?, allowed }',
402
+ stream: false,
403
+ adrs: ["0013", "0024", "0029"],
404
+ },
405
+ {
406
+ method: "GET",
407
+ path: "/agents/:instanceId/deliveries/:deliveryId",
408
+ band: "authenticated",
409
+ summary: "Long-poll the answer to an outstanding pick; 503 means ask again.",
410
+ response: "AgentDeliveryReceipt",
411
+ stream: false,
412
+ adrs: ["0013", "0024"],
413
+ },
414
+ {
415
+ method: "POST",
416
+ path: "/sandboxes/:name/fetch",
417
+ band: "authenticated",
418
+ summary: "Ask the node cache to fetch one Repo that this Sandbox mounts. A Sandbox token asks only for its own.",
419
+ body: "{ identity }",
420
+ response: "FetchAnswer: { fetched } | { stale, asOf }",
421
+ stream: false,
422
+ adrs: ["0053"],
423
+ },
424
+ ];
425
+
66
426
  /** A `POST /runs/:id/events` body: the down-channel event. CANCEL is all that is left of it
67
427
  * (ADR-0013): APPROVE and STEER rode the deferred/poll machinery: `deferred`
68
428
  * is retired (ADR-0006), `poll` reserved but not built.
@@ -89,6 +449,40 @@ async function readJson(text: Promise<string>): Promise<Record<string, unknown>>
89
449
  }
90
450
  }
91
451
 
452
+ /**
453
+ * The `jr2-dispatched-by` header a foreign `dispatch` sends (ADR-0071). `instance` is required: a
454
+ * start that comes over the door with a key comes from another Orchestrator by construction (an
455
+ * in-process dispatch never reaches the door). Unknown fields are dropped, as a door drops them: a
456
+ * caller at a later Kit version may send more.
457
+ */
458
+ const DispatchedByHeader = z.object({
459
+ run: z.string().min(1),
460
+ slot: z.string().min(1),
461
+ effect: z.string().min(1),
462
+ depth: z.number().int().positive(),
463
+ instance: z.string().min(1),
464
+ });
465
+
466
+ /** The header's {@link DispatchedBy}, absent when no header was sent, or why it is refused. */
467
+ function dispatchedByOf(raw: string | undefined): { by?: DispatchedBy } | { error: string } {
468
+ if (raw === undefined) return {};
469
+ let json: unknown;
470
+ try {
471
+ json = JSON.parse(raw);
472
+ } catch (err) {
473
+ return { error: `the ${DISPATCHED_BY_HEADER} header is not JSON: ${errMessage(err)} (ADR-0071)` };
474
+ }
475
+ const parsed = DispatchedByHeader.safeParse(json);
476
+ if (!parsed.success) {
477
+ return {
478
+ error:
479
+ `the ${DISPATCHED_BY_HEADER} header must be { run, slot, effect, depth, instance }: ` +
480
+ `${parsed.error.issues.map((i) => `${i.path.join(".") || "(header)"}: ${i.message}`).join("; ")} (ADR-0071)`,
481
+ };
482
+ }
483
+ return { by: parsed.data };
484
+ }
485
+
92
486
  /** The message of a thrown error, for the `{ error }` 404 body. */
93
487
  function errMessage(err: unknown): string {
94
488
  return err instanceof Error ? err.message : String(err);
@@ -581,18 +975,35 @@ export function createApp(host: RunHost, auth?: Authenticator, opts: CreateAppOp
581
975
  * Start a run of a Workflow (ADR-0009). A named Chart that cannot run now is 409 with why
582
976
  * (ADR-0070); a Chart in the input that the door refuses is 422 with the report; input failing
583
977
  * the door schema is 400 (ADR-0033); an unknown Workflow is 404.
978
+ *
979
+ * A foreign `dispatch` sends `jr2-dispatched-by` (ADR-0071): its key makes a repeated start one
980
+ * run, answered `200 { runId, instanceId, existing: true }` where a new one is `201`. The key is
981
+ * asked first, so a re-send answers its run even when the name would be refused now; a key a
982
+ * run of another Workflow carries is 409. A header that does not parse is 400. `jr2 run` and the
983
+ * Console send none. Any throw that is not a refusal is a defect, 500: a foreign caller reads a
984
+ * 404 as "nothing was started", and a defect may come after a start.
584
985
  */
585
986
  const startRun = async (c: Context<JR2Env>, name: string): Promise<Response> => {
987
+ const header = dispatchedByOf(c.req.header(DISPATCHED_BY_HEADER));
988
+ if ("error" in header) return c.json({ error: header.error }, 400);
989
+ const { by } = header;
990
+ if (by) {
991
+ const found = await host.dispatched(by.effect);
992
+ if (found && found.workflow !== name) return c.json({ error: keyConflict(found, name, by.effect) }, 409);
993
+ if (found) return c.json({ ...keyAnswer(found, name, by.effect), existing: true }, 200);
994
+ }
586
995
  const unrunnable = opts.charts?.get(name)?.unrunnable;
587
996
  if (unrunnable !== undefined) return c.json({ error: `named Chart "${name}" cannot run: ${unrunnable}` }, 409);
588
997
  const input = await readJson(c.req.text());
589
998
  try {
590
- const { runId, instanceId } = await host.start(name, input);
591
- return c.json({ runId, instanceId }, 201);
999
+ const { runId, instanceId, existing } = await host.start(name, input, by ? { dispatchedBy: by } : {});
1000
+ return existing ? c.json({ runId, instanceId, existing }, 200) : c.json({ runId, instanceId }, 201);
592
1001
  } catch (err) {
593
1002
  if (err instanceof ChartRefusal) return c.json({ error: "refused", report: err.report }, 422);
594
1003
  if (err instanceof EventValidationError) return c.json({ error: errMessage(err) }, 400);
595
- return c.json({ error: errMessage(err) }, 404);
1004
+ if (err instanceof DispatchKeyConflictError) return c.json({ error: errMessage(err) }, 409);
1005
+ if (err instanceof UnknownWorkflowError) return c.json({ error: errMessage(err) }, 404);
1006
+ return c.json({ error: errMessage(err) }, 500);
596
1007
  }
597
1008
  };
598
1009
 
@@ -660,7 +1071,7 @@ export function createApp(host: RunHost, auth?: Authenticator, opts: CreateAppOp
660
1071
  });
661
1072
  });
662
1073
 
663
- // Push work: start a run of a registered workflow. Unknown workflow → host.start throws → 404.
1074
+ // Push work: start a run of a registered workflow. Unknown workflow → UnknownWorkflowError → 404.
664
1075
  // A body failing the machine's declared input schema (ADR-0033) → 400 naming the accepted
665
1076
  // shape — the same error class, and the same wire mapping, as a gate delivery failing its
666
1077
  // schema (`POST /runs/:id/gates/:gate/events` below). Instance-band (ADR-0058): starting work is
package/src/index.ts CHANGED
@@ -1,85 +1,63 @@
1
- // @jr2/orchestrator — the deployed app that runs Machines: workflow config, the agent + gate
2
- // delivery surfaces, the duplex Actor over the Harness wire, and durable snapshot persistence
3
- // (ADR-0002/0006/0007). Builds on the `@jr2/agent-protocol` wire contract.
1
+ // @jr2/orchestrator — the Authoring surface (GLOSSARY.md): the names an author writes in a
2
+ // workflow module or in `jr2.config.ts`, and no other name. A name is here when an author writes
3
+ // it; a name an author only meets through inference (a jr2Setup event union, a gate's input, a
4
+ // pick's Frame) stays internal. A workflow authors against ONE package — `defineEvent`,
5
+ // `jr2Setup`, `workspace`, … all import from "@jr2/orchestrator" (ADR-0015) — and an Assistant that
6
+ // reads this file reads the whole of what it may write.
4
7
  //
5
- // It does NOT speak MCP (ADR-0013): the Harness presents the Menu to its model itself, and reaches
6
- // the surface here through the Custodian in its pod. What lives here is the registration table and
7
- // two thin HTTP adapters over it — plus what composes a Custodian (ADR-0059).
8
+ // Named re-exports only, never `export *`: each name below is a decision, and
9
+ // test/authoring-surface.test.ts pins the list. The kit's own packages (the CLI, the e2e suite,
10
+ // the Harness's tests) import "@jr2/orchestrator/internal", which holds everything here and the
11
+ // runtime besides.
8
12
 
9
- // The wire contract, re-exported: a workflow authors against ONE package (`defineEvent`,
10
- // `jr2Setup`, `workspace`, … all import from "@jr2/orchestrator" — ADR-0015).
11
- export * from "@jr2/agent-protocol";
12
- export * from "./agent.ts";
13
- // The Effect surface (ADR-0067): `command` itself is the wire-bound one, from harness-client.ts;
14
- // `fromPick`, `paramsOf` and `answer` are what an author writes between a pick and its work.
15
- export * from "./effect.ts";
16
- // The http kind (ADR-0068): `http`, `secret`, `bearer`, `basic`, `text`, and the Effector's wire.
17
- export * from "./http-effect.ts";
18
- export * from "./sandbox-effect.ts";
19
- // An Effect's Open parts (ADR-0054): the types `customize({ effects })` reads.
20
- export type { EffectBinding, OpenEffect, OpenEffectPart } from "./open-effect.ts";
21
- export { openPartsText } from "./open-effect.ts";
22
- export * from "./effector-wire.ts";
23
- export * from "./pick.ts";
24
- // The Chart (ADR-0070): its grammar (`chartSchema`, which a Chart wrapper's door and a planner's pick
25
- // import), the door that admits one, and the resolver of its references.
26
- export * from "./chart.ts";
27
- // The Open body a Chart binds (`openBody`, the slot constructor a Chart wrapper places in `actors`)
28
- // and the named Charts of an Instance: Chart files and runtime Charts (ADR-0070).
29
- export * from "./open-body.ts";
30
- export * from "./charts.ts";
31
- export * from "./parts.ts";
32
- export * from "./size.ts";
33
- export * from "./customize.ts";
34
- export * from "./ambient.ts";
35
- export * from "./config.ts";
36
- export * from "./repo-identity.ts";
37
- export * from "./pool.ts";
38
- export * from "./setup.ts";
39
- // The author's routing guard (ADR-0015).
13
+ // Machine and events: the setup a workflow writes its Machine with, the events its parties send,
14
+ // and the guard that makes a writing decline other senders (ADR-0011, ADR-0015).
15
+ export { defineEvent } from "@jr2/agent-protocol";
16
+ export { jr2Setup } from "./setup.ts";
40
17
  export { sentBy } from "./party.ts";
41
- export * from "./vocabulary.ts";
42
- export * from "./tokens.ts";
43
- export * from "./durability.ts";
44
- export * from "./snapshot-store.ts";
45
- export * from "./actor.ts";
46
- export * from "./gate.ts";
47
- export * from "./workspace.ts";
48
- export * from "./images.ts";
49
- // The Assembly's content address and wire form (ADR-0069): `jr2 up` and the door share both.
50
- export * from "./content-hash.ts";
51
- export * from "./assembly-tar.ts";
52
- // The current Assembly and the publish door (ADR-0069), and the walk's refusal listing that
53
- // `jr2 up` and the door both run.
54
- export * from "./assembly.ts";
55
- export * from "./assembly-checks.ts";
56
- export * from "./mount-digest.ts";
57
- export * from "./model-keys.ts";
58
- export * from "./held-secrets.ts";
59
- export * from "./secret-placement.ts";
60
- export * from "./git-push.ts";
61
- export * from "./git-clone.ts";
62
- export * from "./custodian.ts";
63
- export * from "./sandbox-kube.ts";
64
- export {
65
- effectorManifestKey,
66
- LABEL_EFFECTOR_POD,
67
- readSandboxEffectorManifest,
68
- sandboxEffectorKeySecret,
69
- sandboxEffectorObjectsOf,
70
- type ProjectedSecret,
71
- type SandboxEffectorManifest,
72
- } from "./sandbox-effector.ts";
73
- export * from "./repos.ts";
74
- export * from "./repo-fetch.ts";
75
- // Type-only: what a workflow event delivery looks like (the registration TABLE stays internal —
76
- // ADR-0011: workflows speak only defineEvent/agent/gate).
77
- export type { ChildErrorMarker, DeliveredEvent, PlacingMarker, RunMarker, TurnMarker } from "./registration.ts";
78
- export * from "./machine-doc.ts";
79
- export * from "./run-host.ts";
80
- export * from "./http.ts";
81
- export * from "./harness-client.ts";
82
- export * from "./stub-harness.ts";
83
- export * from "./instance.ts";
84
- export * from "./server.ts";
85
- export * from "./names.ts";
18
+ export type { HostInjectedInput } from "./vocabulary.ts";
19
+
20
+ // Failure: the Part a Machine invokes to fail its run, and the guard that tells a Failure from a
21
+ // defect in an `onError` (ADR-0073).
22
+ export { fail, isFailure } from "./fail.ts";
23
+
24
+ // Agents: an Agent slot and the definition it carries (ADR-0028, ADR-0049).
25
+ export { agent } from "./harness-client.ts";
26
+ export type { AgentDefinition, ThinkingLevel } from "./agent.ts";
27
+
28
+ // Workspaces and Repos: a Sandbox and the Repo Slots it binds (ADR-0012, ADR-0051).
29
+ export { workspace } from "./workspace.ts";
30
+ export type { Workspaced } from "./workspace.ts";
31
+ export type { Binding, RepoSlot } from "./parts.ts";
32
+
33
+ // Effects: work a Machine does outside itself, as an actor slot (ADR-0067, ADR-0068, ADR-0071),
34
+ // and what an author writes between a pick and that work.
35
+ export { arg } from "./effect.ts";
36
+ export type { CommandOutput } from "./effect.ts";
37
+ export { command } from "./harness-client.ts";
38
+ export { basic, bearer, file, http, secret, text } from "./http-effect.ts";
39
+ export type { HttpOutput } from "./effector-wire.ts";
40
+ export { push } from "./sandbox-effect.ts";
41
+ export type { PushOutput } from "./sandbox-effect.ts";
42
+ export { dispatch } from "./dispatch-effect.ts";
43
+ export type { DispatchOutput } from "./effect.ts";
44
+ export { answer, fromPick, paramsOf } from "./pick.ts";
45
+
46
+ // Composition: a part left Open, a Machine's parts retuned, a Pool over a Source (ADR-0017,
47
+ // ADR-0049, ADR-0054, ADR-0060).
48
+ export { open } from "./parts.ts";
49
+ export { customize } from "./customize.ts";
50
+ export type { Customize } from "./customize.ts";
51
+ export type { EffectBinding } from "./open-effect.ts";
52
+ export type { Size, UserContainer } from "./size.ts";
53
+ export { pool, source } from "./pool.ts";
54
+
55
+ // Charts: the Open body a Chart wrapper places in `actors`, and the grammar a planner's pick
56
+ // declares, whole or narrowed to one wrapper (ADR-0070).
57
+ export { openBody } from "./open-body.ts";
58
+ export type { OpenBodyDeclaration, OpenBodyOutput } from "./open-body.ts";
59
+ export { chartSchema, chartSchemaFor } from "./chart.ts";
60
+
61
+ // Config: `jr2.config.ts`, the deployment facts a Machine cannot carry (ADR-0050).
62
+ export { defineConfig } from "./config.ts";
63
+ export type { JR2Config } from "./config.ts";