@jr2/orchestrator 0.3.0 → 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 (354) hide show
  1. package/README.md +20 -2
  2. package/bin/server.ts +7 -4
  3. package/console/canvas.ts +27 -14
  4. package/console/components/app.ts +12 -1
  5. package/console/components/fleet.ts +52 -6
  6. package/console/components/machine-pane.ts +128 -2
  7. package/console/components/nav.ts +1 -1
  8. package/console/components/schema-form.ts +12 -4
  9. package/console/json-field.ts +23 -0
  10. package/console/main.ts +122 -39
  11. package/console/store.ts +321 -21
  12. package/console/style.css +111 -0
  13. package/docs/agents-block.md +5 -0
  14. package/docs/concepts/agents-and-turns.md +442 -0
  15. package/docs/concepts/architecture.md +230 -0
  16. package/docs/concepts/charts.md +143 -0
  17. package/docs/concepts/composition.md +357 -0
  18. package/docs/concepts/converge.md +254 -0
  19. package/docs/concepts/durable-runs.md +189 -0
  20. package/docs/concepts/effects.md +603 -0
  21. package/docs/concepts/gates.md +208 -0
  22. package/docs/concepts/machines-and-workflows.md +289 -0
  23. package/docs/concepts/pools-and-sources.md +230 -0
  24. package/docs/concepts/secrets-and-trust.md +222 -0
  25. package/docs/concepts/the-menu.md +378 -0
  26. package/docs/concepts/workspaces.md +678 -0
  27. package/docs/get-started/a-model-decides.md +563 -0
  28. package/docs/get-started/an-agent-in-a-sandbox.md +381 -0
  29. package/docs/get-started/connect-a-model.md +248 -0
  30. package/docs/get-started/create-an-instance.md +194 -0
  31. package/docs/get-started/have-your-assistant-write-a-machine.md +922 -0
  32. package/docs/get-started/install.md +126 -0
  33. package/docs/guides/add-tools-to-the-sandbox.md +295 -0
  34. package/docs/guides/answer-a-gate.md +304 -0
  35. package/docs/guides/bind-open-parts.md +223 -0
  36. package/docs/guides/cancel-a-run.md +146 -0
  37. package/docs/guides/clean-up.md +206 -0
  38. package/docs/guides/fix-a-failed-converge.md +361 -0
  39. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  40. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  41. package/docs/guides/let-an-agent-write-a-chart.md +226 -0
  42. package/docs/guides/look-inside-a-sandbox.md +174 -0
  43. package/docs/guides/mirror-the-kit-images.md +176 -0
  44. package/docs/guides/move-from-kind-to-a-shared-cluster.md +302 -0
  45. package/docs/guides/open-the-console.md +91 -0
  46. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  47. package/docs/guides/push-and-sign-a-branch.md +486 -0
  48. package/docs/guides/run-a-chart-by-name.md +270 -0
  49. package/docs/guides/run-a-command-or-call-a-url.md +544 -0
  50. package/docs/guides/run-one-worker-per-item.md +321 -0
  51. package/docs/guides/set-an-agents-access-and-dials.md +375 -0
  52. package/docs/guides/size-a-workspace.md +204 -0
  53. package/docs/guides/start-a-run-from-a-run.md +237 -0
  54. package/docs/guides/start-a-run.md +207 -0
  55. package/docs/guides/upgrade-the-kit-version.md +240 -0
  56. package/docs/guides/use-a-hosted-provider.md +208 -0
  57. package/docs/guides/use-a-local-model.md +313 -0
  58. package/docs/guides/watch-a-run.md +326 -0
  59. package/docs/guides/write-a-workflow.md +318 -0
  60. package/docs/index.md +44 -0
  61. package/docs/llms.txt +216 -0
  62. package/docs/reference/authoring-surface/agent.md +128 -0
  63. package/docs/reference/authoring-surface/answer.md +140 -0
  64. package/docs/reference/authoring-surface/arg.md +60 -0
  65. package/docs/reference/authoring-surface/basic.md +62 -0
  66. package/docs/reference/authoring-surface/bearer.md +53 -0
  67. package/docs/reference/authoring-surface/chartschema.md +23 -0
  68. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  69. package/docs/reference/authoring-surface/command.md +191 -0
  70. package/docs/reference/authoring-surface/customize.md +64 -0
  71. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  72. package/docs/reference/authoring-surface/defineevent.md +114 -0
  73. package/docs/reference/authoring-surface/dispatch.md +126 -0
  74. package/docs/reference/authoring-surface/fail.md +83 -0
  75. package/docs/reference/authoring-surface/file.md +122 -0
  76. package/docs/reference/authoring-surface/frompick.md +277 -0
  77. package/docs/reference/authoring-surface/http.md +159 -0
  78. package/docs/reference/authoring-surface/isfailure.md +58 -0
  79. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  80. package/docs/reference/authoring-surface/open.md +74 -0
  81. package/docs/reference/authoring-surface/openbody.md +86 -0
  82. package/docs/reference/authoring-surface/paramsof.md +125 -0
  83. package/docs/reference/authoring-surface/pool.md +186 -0
  84. package/docs/reference/authoring-surface/push.md +112 -0
  85. package/docs/reference/authoring-surface/secret.md +118 -0
  86. package/docs/reference/authoring-surface/sentby.md +83 -0
  87. package/docs/reference/authoring-surface/source.md +51 -0
  88. package/docs/reference/authoring-surface/text.md +62 -0
  89. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  90. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  91. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  92. package/docs/reference/authoring-surface/type-agentslots.md +12 -0
  93. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  94. package/docs/reference/authoring-surface/type-arg.md +19 -0
  95. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  96. package/docs/reference/authoring-surface/type-binding.md +62 -0
  97. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  98. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  99. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  100. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  101. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  102. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  103. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  104. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  105. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  106. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  107. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  108. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  109. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  110. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  111. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  112. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  113. package/docs/reference/authoring-surface/type-childat.md +12 -0
  114. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  115. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  116. package/docs/reference/authoring-surface/type-commandinput.md +19 -0
  117. package/docs/reference/authoring-surface/type-commandoptions.md +78 -0
  118. package/docs/reference/authoring-surface/type-commandoutput.md +104 -0
  119. package/docs/reference/authoring-surface/type-customize.md +109 -0
  120. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  121. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  122. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  123. package/docs/reference/authoring-surface/type-dispatchoutput.md +65 -0
  124. package/docs/reference/authoring-surface/type-duration.md +15 -0
  125. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  126. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  127. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  128. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  129. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  130. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  131. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  132. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  133. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  134. package/docs/reference/authoring-surface/type-failure.md +19 -0
  135. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  136. package/docs/reference/authoring-surface/type-filebody.md +41 -0
  137. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  138. package/docs/reference/authoring-surface/type-hostinjectedinput.md +58 -0
  139. package/docs/reference/authoring-surface/type-httpdefinition.md +101 -0
  140. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  141. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  142. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  143. package/docs/reference/authoring-surface/type-httpoutput.md +89 -0
  144. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  145. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  146. package/docs/reference/authoring-surface/type-lends.md +38 -0
  147. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  148. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  149. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  150. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  151. package/docs/reference/authoring-surface/type-noslotspec.md +26 -0
  152. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +32 -0
  153. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  154. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  155. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  156. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  157. package/docs/reference/authoring-surface/type-opencommandinput.md +17 -0
  158. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  159. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  160. package/docs/reference/authoring-surface/type-openof.md +12 -0
  161. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  162. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  163. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +31 -0
  164. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +32 -0
  165. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  166. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  167. package/docs/reference/authoring-surface/type-pushinput.md +15 -0
  168. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  169. package/docs/reference/authoring-surface/type-pushoutput.md +124 -0
  170. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  171. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  172. package/docs/reference/authoring-surface/type-reached.md +12 -0
  173. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  174. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  175. package/docs/reference/authoring-surface/type-sandboxoptions.md +77 -0
  176. package/docs/reference/authoring-surface/type-secret.md +25 -0
  177. package/docs/reference/authoring-surface/type-sender.md +19 -0
  178. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  179. package/docs/reference/authoring-surface/type-size.md +85 -0
  180. package/docs/reference/authoring-surface/type-slothandles.md +32 -0
  181. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  182. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  183. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  184. package/docs/reference/authoring-surface/type-text.md +19 -0
  185. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  186. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  187. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  188. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  189. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  190. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  191. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  192. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  193. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  194. package/docs/reference/authoring-surface/type-workspaced.md +94 -0
  195. package/docs/reference/authoring-surface/type-workspacehandles.md +23 -0
  196. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  197. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  198. package/docs/reference/authoring-surface/type-workspaceoptions.md +39 -0
  199. package/docs/reference/authoring-surface/type-workspacespec.md +37 -0
  200. package/docs/reference/authoring-surface/workspace.md +259 -0
  201. package/docs/reference/authoring-surface.md +197 -0
  202. package/docs/reference/cli.md +433 -0
  203. package/docs/reference/config.md +756 -0
  204. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +113 -0
  205. package/docs/reference/decisions/0002-duplex-streaming-actor.md +110 -0
  206. package/docs/reference/decisions/0004-worktree-provisioning-model.md +124 -0
  207. package/docs/reference/decisions/0005-sandbox-pod-composition.md +230 -0
  208. package/docs/reference/decisions/0006-agent-control-surface.md +47 -0
  209. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  210. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  211. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  212. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  213. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  214. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  215. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +157 -0
  216. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  217. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +265 -0
  218. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +124 -0
  219. package/docs/reference/decisions/0017-pool-over-a-source-port.md +69 -0
  220. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  221. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +275 -0
  222. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  223. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +100 -0
  224. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  225. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +176 -0
  226. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +439 -0
  227. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  228. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  229. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +237 -0
  230. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +89 -0
  231. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  232. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  233. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +190 -0
  234. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  235. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +127 -0
  236. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  237. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  238. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  239. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  240. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  241. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  242. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  243. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  244. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  245. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  246. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  247. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  248. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  249. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  250. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  251. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  252. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +227 -0
  253. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +81 -0
  254. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +111 -0
  255. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  256. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  257. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  258. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  259. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +106 -0
  260. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +384 -0
  261. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  262. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  263. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +212 -0
  264. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +83 -0
  265. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  266. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  267. 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
  268. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +430 -0
  269. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +464 -0
  270. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  271. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +323 -0
  272. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  273. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  274. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  275. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  276. package/docs/reference/decisions.md +83 -0
  277. package/docs/reference/glossary.md +648 -0
  278. package/docs/reference/http-api.md +1348 -0
  279. package/docs/reference/machines.md +190 -0
  280. package/docs/reference/mechanism-events.md +72 -0
  281. package/docs/why.md +206 -0
  282. package/package.json +6 -4
  283. package/src/actor.ts +976 -61
  284. package/src/agent.ts +114 -38
  285. package/src/ambient.ts +4 -1
  286. package/src/assembly-checks.ts +347 -0
  287. package/src/assembly-tar.ts +494 -0
  288. package/src/assembly.ts +721 -0
  289. package/src/cause.ts +234 -0
  290. package/src/chart.ts +2182 -0
  291. package/src/charts.ts +748 -0
  292. package/src/config.ts +520 -162
  293. package/src/content-hash.ts +105 -0
  294. package/src/custodian.lua +6 -5
  295. package/src/custodian.ts +143 -39
  296. package/src/customize.ts +388 -55
  297. package/src/dispatch-effect.ts +945 -0
  298. package/src/door-compat.ts +217 -0
  299. package/src/durability.ts +11 -4
  300. package/src/effect-checks.ts +557 -0
  301. package/src/effect.ts +1202 -0
  302. package/src/effector-wire.ts +674 -0
  303. package/src/fail.ts +209 -0
  304. package/src/fingerprint.ts +4 -3
  305. package/src/gate.ts +8 -0
  306. package/src/git-clone.ts +65 -0
  307. package/src/git-push.ts +336 -0
  308. package/src/harness-client.ts +764 -48
  309. package/src/held-secrets.ts +82 -26
  310. package/src/holds.ts +156 -0
  311. package/src/http-effect.ts +1423 -0
  312. package/src/http.ts +916 -113
  313. package/src/images.ts +47 -21
  314. package/src/index.ts +62 -43
  315. package/src/instance.ts +505 -59
  316. package/src/internal.ts +84 -0
  317. package/src/kube-client.ts +333 -0
  318. package/src/machine-doc.ts +106 -6
  319. package/src/mechanism-routes.ts +168 -0
  320. package/src/model-keys.generated.ts +53 -0
  321. package/src/model-keys.ts +18 -58
  322. package/src/mount-digest.ts +53 -0
  323. package/src/names.ts +66 -8
  324. package/src/notices.ts +141 -0
  325. package/src/open-body.ts +1580 -0
  326. package/src/open-effect.ts +217 -0
  327. package/src/open.ts +59 -6
  328. package/src/parts.ts +709 -41
  329. package/src/party.ts +534 -0
  330. package/src/pick.ts +761 -0
  331. package/src/pool.ts +248 -37
  332. package/src/registration.ts +382 -19
  333. package/src/repo-fetch.ts +60 -85
  334. package/src/repos.ts +65 -75
  335. package/src/rest.ts +133 -0
  336. package/src/run-host.ts +2383 -115
  337. package/src/run-output.ts +38 -0
  338. package/src/sandbox-effect.ts +1126 -0
  339. package/src/sandbox-effector.ts +111 -0
  340. package/src/sandbox-kube.ts +1721 -0
  341. package/src/sandbox-watch.ts +260 -0
  342. package/src/secret-placement.ts +529 -0
  343. package/src/server.ts +284 -84
  344. package/src/setup.ts +819 -117
  345. package/src/size.ts +454 -0
  346. package/src/snapshot-store.ts +115 -20
  347. package/src/stub-harness.ts +49 -16
  348. package/src/sync-client.ts +54 -0
  349. package/src/timers.ts +191 -0
  350. package/src/tokens.ts +35 -4
  351. package/src/vocabulary.ts +135 -15
  352. package/src/wire.ts +238 -10
  353. package/src/workspace.ts +1195 -338
  354. package/src/sandbox-kubectl.ts +0 -1108
@@ -0,0 +1,350 @@
1
+ ---
2
+ title: Publish a Machine as an npm package
3
+ description: Ship a Machine in an npm package that names the Kit as a peer, and register it in an Instance.
4
+ ---
5
+
6
+ # Publish a Machine as an npm package
7
+
8
+ Publish a [Machine](../reference/glossary.md#machine) as an npm package, so that each
9
+ [Instance](../reference/glossary.md#instance) can install it and register it as a
10
+ [Workflow](../reference/glossary.md#workflow).
11
+
12
+ The example package is `@you/labeler`. It exports one Machine, `labeler`: an [Agent](../reference/glossary.md#agent)
13
+ reads an issue and chooses one label for it. The Machine gives the label as its output. The package leaves the model of
14
+ the Agent [Open](../reference/glossary.md#open), because it cannot know which model each Instance uses. `@jr2/machines`
15
+ has the same shape.
16
+
17
+ Replace `@you` with your npm scope in each file and each command on this page.
18
+
19
+ ## The package
20
+
21
+ The package has three files:
22
+
23
+ ```text
24
+ labeler/
25
+ ├── package.json
26
+ ├── tsconfig.json
27
+ └── src/
28
+ └── index.ts
29
+ ```
30
+
31
+ `package.json`:
32
+
33
+ ```json
34
+ {
35
+ "name": "@you/labeler",
36
+ "version": "1.0.0",
37
+ "description": "A jr2 Machine that gives an issue one label.",
38
+ "license": "MIT",
39
+ "type": "module",
40
+ "engines": {
41
+ "node": ">=24"
42
+ },
43
+ "exports": {
44
+ ".": "./src/index.ts"
45
+ },
46
+ "types": "./src/index.ts",
47
+ "files": [
48
+ "src"
49
+ ],
50
+ "scripts": {
51
+ "typecheck": "tsc --noEmit"
52
+ },
53
+ "peerDependencies": {
54
+ "@jr2/orchestrator": "<version>",
55
+ "xstate": "^5.18.0",
56
+ "zod": "^4.4.3"
57
+ },
58
+ "devDependencies": {
59
+ "@jr2/orchestrator": "<version>",
60
+ "@types/node": "^26.0.1",
61
+ "typescript": "^5.6.0",
62
+ "xstate": "^5.18.0",
63
+ "zod": "^4.4.3"
64
+ }
65
+ }
66
+ ```
67
+
68
+ - `peerDependencies` names `@jr2/orchestrator`, `xstate` and `zod`. The package has no `dependencies`. Replace
69
+ `<version>` with the [Kit version](../reference/glossary.md#kit-version) that the package is for, such as `0.4.1`.
70
+ Write the exact version, with no `^` and no `~`.
71
+ - `devDependencies` also names the three packages, at the same versions, and `typescript` and `@types/node`. With them,
72
+ you can typecheck the package.
73
+ - `exports` gives the `.ts` files, and `files` ships `src`. The package has no build step. jr2 loads `.ts` files from
74
+ `node_modules`, the same as it loads `@jr2/orchestrator` and `@jr2/machines`.
75
+
76
+ `tsconfig.json` uses the options of an Instance. The typecheck of an Instance also checks the `.ts` files of each
77
+ package that it imports, so the package must pass the same options:
78
+
79
+ ```json
80
+ {
81
+ "extends": "@jr2/orchestrator/tsconfig.instance.json",
82
+ "include": ["src/**/*.ts"]
83
+ }
84
+ ```
85
+
86
+ `src/index.ts` exports the Machine, and the type of its output:
87
+
88
+ ```ts
89
+ import { assign } from "xstate";
90
+ import { z } from "zod";
91
+ import { agent, defineEvent, fail, jr2Setup, open } from "@jr2/orchestrator";
92
+
93
+ // The Agent's one pick.
94
+ const label = defineEvent({
95
+ name: "label",
96
+ description: "Give the issue one label. Call this once, then stop.",
97
+ audience: "agent",
98
+ input: z.object({
99
+ kind: z
100
+ .enum(["bug", "feature", "question"])
101
+ .describe(
102
+ "bug: something does not work. feature: a request. question: the author asks for help or for information.",
103
+ ),
104
+ reason: z.string().describe("Why, in one sentence."),
105
+ }),
106
+ });
107
+
108
+ const door = z.object({
109
+ title: z.string().describe("The title of the issue."),
110
+ body: z.string().describe("The text of the issue."),
111
+ });
112
+
113
+ type Input = z.infer<typeof door>;
114
+ export type LabelerOutput = { kind: "bug" | "feature" | "question"; reason: string };
115
+
116
+ /**
117
+ * A Machine that gives an issue one label.
118
+ *
119
+ * Open part: `agents.labeler.model`. Bind it with `customize()` where you register the Machine.
120
+ *
121
+ * Run input: `{ title, body }`, the title and the text of the issue.
122
+ *
123
+ * Output: `{ kind, reason }`. `kind` is `bug`, `feature` or `question`.
124
+ *
125
+ * Fails the run when the Turn of the Agent fails: the reason of the Failure is `no label: ` and the
126
+ * reason of the fault.
127
+ */
128
+ export const labeler = jr2Setup({
129
+ types: {} as { input: Input; context: Input & { result?: LabelerOutput; fault?: string }; output: LabelerOutput },
130
+ events: [label],
131
+ actors: {
132
+ labeler: agent({
133
+ // Open: the Instance that registers this Machine binds the model with customize().
134
+ model: open,
135
+ workspace: "none",
136
+ instructions: "You read one issue and give it one label. Call label once.",
137
+ }),
138
+ fail: fail(),
139
+ },
140
+ }).createMachine({
141
+ id: "labeler",
142
+ input: door,
143
+ context: ({ input }) => input,
144
+ initial: "labeling",
145
+ states: {
146
+ labeling: {
147
+ invoke: {
148
+ src: "labeler",
149
+ input: ({ context }) => ({ prompt: `Title: ${context.title}\n\n${context.body}` }),
150
+ },
151
+ on: {
152
+ label: {
153
+ target: "done",
154
+ actions: assign({ result: ({ event }) => ({ kind: event.kind, reason: event.reason }) }),
155
+ },
156
+ // jr2 sends this when the Agent's Turn fails for good.
157
+ "agent.fault": { target: "failed", actions: assign({ fault: ({ event }) => event.reason }) },
158
+ },
159
+ },
160
+ done: { type: "final" },
161
+ // Not a final state: the run ends `failed`. The reason of the Failure is `no label: ` and the reason of the fault.
162
+ failed: { invoke: { src: "fail", input: ({ context }) => ({ reason: `no label: ${context.fault}` }) } },
163
+ },
164
+ output: ({ context }) => context.result!,
165
+ });
166
+ ```
167
+
168
+ The Machine carries all of its parts: its run input, its [Vocabulary](../reference/glossary.md#vocabulary) and its
169
+ Agent. The model is [`open`](../reference/authoring-surface/open.md), so the Instance binds it with
170
+ [`customize()`](../reference/authoring-surface/customize.md). On the export, write TSDoc that gives its Open parts and
171
+ its run input, as [`task`](../reference/machines.md#task) does. An [Assistant](../reference/glossary.md#assistant) that
172
+ reads `node_modules` reads that text.
173
+
174
+ ## Check the package
175
+
176
+ In the folder of the package, install the `devDependencies`. Then typecheck the package:
177
+
178
+ ```sh
179
+ npm install
180
+ npm run typecheck
181
+ ```
182
+
183
+ Then see what the package ships:
184
+
185
+ ```sh
186
+ npm pack --dry-run
187
+ ```
188
+
189
+ ```text
190
+ npm notice
191
+ npm notice 📦 @you/labeler@1.0.0
192
+ npm notice Tarball Contents
193
+ npm notice 623B package.json
194
+ npm notice 2.4kB src/index.ts
195
+ npm notice Tarball Details
196
+ npm notice name: @you/labeler
197
+ npm notice version: 1.0.0
198
+ npm notice filename: you-labeler-1.0.0.tgz
199
+ npm notice package size: 1.4 kB
200
+ npm notice unpacked size: 3.0 kB
201
+ npm notice shasum: b4b5fd9c9ddff44b1be2e852e89969bdbe76750c
202
+ npm notice integrity: sha512-5CXrYzHDj/Qy8[...]70mtq84+C6+6w==
203
+ npm notice total files: 2
204
+ npm notice
205
+ you-labeler-1.0.0.tgz
206
+ ```
207
+
208
+ The list holds `package.json` and the files of `src`. Your sizes and sums are different.
209
+
210
+ ## Publish the package
211
+
212
+ Log in to your registry with `npm login`. Then publish the package. npm publishes a package with a scope, such as
213
+ `@you`, as restricted, unless you give `--access public`:
214
+
215
+ ```sh
216
+ npm publish --access public
217
+ ```
218
+
219
+ ## Register the Machine in an Instance
220
+
221
+ In the Instance folder, install the package. Use npm's `--save-exact`, so that `package.json` names one version:
222
+
223
+ ```sh
224
+ npm install --save-exact @you/labeler@1.0.0
225
+ ```
226
+
227
+ Make sure that the Instance has one copy of `@jr2/orchestrator`:
228
+
229
+ ```sh
230
+ npm ls @jr2/orchestrator
231
+ ```
232
+
233
+ ```text
234
+ my-instance@0.0.0 <path>
235
+ ├─┬ @jr2/cli@0.4.1
236
+ │ └── @jr2/orchestrator@0.4.1 deduped
237
+ ├── @jr2/orchestrator@0.4.1
238
+ └─┬ @you/labeler@1.0.0
239
+ └── @jr2/orchestrator@0.4.1 deduped
240
+ ```
241
+
242
+ `<path>` is the path of your Instance folder, and the version is your Kit version. Each line names the same version.
243
+ Each `deduped` line tells you that the package uses the copy of the Instance.
244
+
245
+ Save this file as `workflows/label.ts`. It binds the Open model of the Agent `labeler` to the model of the tab:
246
+
247
+ **Anthropic**
248
+
249
+ ```ts
250
+ import { customize } from "@jr2/orchestrator";
251
+ import { labeler } from "@you/labeler";
252
+
253
+ export const machine = customize(labeler, {
254
+ agents: { labeler: { model: "anthropic/claude-haiku-5-5" } },
255
+ });
256
+ ```
257
+
258
+ **Local**
259
+
260
+ ```ts
261
+ import { customize } from "@jr2/orchestrator";
262
+ import { labeler } from "@you/labeler";
263
+
264
+ export const machine = customize(labeler, {
265
+ agents: { labeler: { model: "local/qwen3.6-35b-a3b" } },
266
+ });
267
+ ```
268
+
269
+ Run [`jr2 up`](../reference/cli.md#up):
270
+
271
+ ```sh
272
+ jr2 up
273
+ ```
274
+
275
+ ```text
276
+ …
277
+ jr2 up — instance "my-instance" → context <context> / namespace my-instance
278
+ typecheck: tsc --noEmit (the instance's own compiler)
279
+ failures: workflow "label" — the states that fail the run (ADR-0073)
280
+ labeler.failed: invokes fail
281
+ seats: workflow "label" — who may send what, per state (ADR-0015)
282
+ labeler.labeling agent:labeler: [label]
283
+ …
284
+ ```
285
+
286
+ The first line (`…`) is the `.env` line, when `.env` sets a variable that your shell does not set. `<context>` is your
287
+ kubectl context. The `seats:` lines show that jr2 reads the Vocabulary of the Machine. [Start a run](start-a-run.md)
288
+ tells how to run the Workflow `label`.
289
+
290
+ ## Rules
291
+
292
+ - Name `@jr2/orchestrator`, `xstate` and `zod` in `peerDependencies`, never in `dependencies`.
293
+ - When the package names `@jr2/orchestrator` in `dependencies` at a different version, npm installs a second copy under
294
+ the package, with no error. A Machine that loads a second copy has empty [Menus](../reference/glossary.md#menu). Thus
295
+ `jr2 up` refuses the Instance before it applies anything. It gives one line for each Kit package that has a second
296
+ copy, such as `@jr2/orchestrator` and `@jr2/agent-protocol`:
297
+
298
+ ```text
299
+ error: cannot stage the Assembly: it would carry a second copy of a Kit package (ADR-0069)
300
+ <path> is a second copy of <name>, nested by <package>@<package version> (<package path>): the Orchestrator's image ships <name> for @jr2/orchestrator <version>, and an Assembly that carries its own copy loads Machines whose Menus are empty (ADR-0054) — align that dependency with the <name> @jr2/orchestrator uses, or remove it, and reinstall
301
+ ```
302
+
303
+ Run `npm ls @jr2/orchestrator` to find the second copy.
304
+
305
+ - Name `@jr2/orchestrator` at the exact Kit version. When the Instance has a different Kit version, npm refuses to
306
+ install the package:
307
+
308
+ ```text
309
+ npm error code ERESOLVE
310
+ npm error ERESOLVE unable to resolve dependency tree
311
+ …
312
+ npm error Could not resolve dependency:
313
+ npm error peer @jr2/orchestrator@"<version>" from <package>@<package version>
314
+ …
315
+ ```
316
+
317
+ `<package>@<package version>` is the package and the version that you install.
318
+
319
+ Do not install with `--force` or `--legacy-peer-deps`. Publish a version of the package for the Kit version of the
320
+ Instance. Thus each [upgrade of the Kit version](upgrade-the-kit-version.md) needs a new version of the package.
321
+
322
+ - In the Instance, the package must be in `dependencies`, not in `devDependencies`. The
323
+ [Assembly](../reference/glossary.md#assembly) holds only `dependencies`. Without the package, the
324
+ [Orchestrator](../reference/glossary.md#orchestrator) cannot load the Workflow, and it refuses the Assembly.
325
+ - The typecheck of `jr2 up` includes the `.ts` files of the package. A type error in it stops the converge:
326
+ `refusing: this instance does not typecheck — nothing was built and nothing was applied`.
327
+ - Use only TypeScript that jr2 can erase: no `enum`, no `namespace`, and no parameter properties in a constructor. The
328
+ typecheck accepts them, but `jr2 up` cannot load the Workflow. It stops with a JavaScript syntax error, such as
329
+ `error: Unexpected token 'export'`.
330
+ - Write each relative import in the package with the `.ts` extension, as `./util.ts`. With `.js`, the typecheck passes,
331
+ but `jr2 up` stops: `error: Cannot find module '<path>/util.js' imported from <path>/index.ts`.
332
+ - A package exports Machines, never Workflows. A Workflow is a file in the `workflows/` folder of an Instance.
333
+ - `jr2 up` refuses a Workflow that leaves a part Open. It prints the `customize()` line that binds it:
334
+ `refusing: workflow "<workflow>" leaves Agent "<slot>" open — bind it where the Machine is registered: export const machine = customize(<import>, { agents: { <slot>: { model: "<provider>/<model>" } } }) (ADR-0054)`.
335
+ [Bind a shipped Machine's Open parts](bind-open-parts.md) gives the refusals for the other Open parts.
336
+ - A new version of the package can change the [Machine shape](../reference/glossary.md#machine-shape): its states, its
337
+ invokes or its transitions. Then the Orchestrator does not continue a run that the old version started. Its status is
338
+ `drifted`. See [Machine shape and drift](../concepts/durable-runs.md#machine-shape-and-drift).
339
+
340
+ ## Read next
341
+
342
+ - [Composition](../concepts/composition.md)
343
+ - [Bind a shipped Machine's Open parts](bind-open-parts.md)
344
+ - [Durable runs](../concepts/durable-runs.md)
345
+ - Reference: [`customize()`](../reference/authoring-surface/customize.md),
346
+ [`open`](../reference/authoring-surface/open.md), [`@jr2/machines`](../reference/machines.md)
347
+ - [ADR-0054](../reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md): the kit
348
+ ships Machines, and a shipped Machine leaves its parts Open
349
+ - [ADR-0049](../reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md): a Machine carries its
350
+ parts and composes by invoke