@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
package/src/cause.ts ADDED
@@ -0,0 +1,234 @@
1
+ // What took the Machine out of an Agent's state (ADR-0024): the Turn's own pick, or something else.
2
+ // The Agent's Actor asks it as its invocation stops, and its sweep says `cause: "pick"` only for
3
+ // the first, so the Harness settles that Submission `ended` and every other end `aborted`. The pick
4
+ // may be from an earlier Submission of the same Turn: a nudge or a wake starts a new Submission in
5
+ // the same Turn.
6
+ //
7
+ // The answer comes from the events the Machines took, never from the pick's answer: "was the pick's
8
+ // work stopped" (`Hold.cutShort`, the answer's `stopped`) is another question. Two facts are kept,
9
+ // read off xstate's inspection stream and the actor system's scheduler and clock:
10
+ //
11
+ // - THE CAUSE OF EACH RELAY: the set of Agents' picks it comes from. ADR-0024 lists the four ways
12
+ // a relay comes from a pick: the pick itself, the work below the Agent's state, a send of an
13
+ // actor that takes a caused relay, and a timer armed while its Machine took one. The cause rides
14
+ // the RELAY, never the event object: xstate relays one object each time a config action with an
15
+ // object literal runs. A timer's cause rides its own `setTimeout` on the run's clock, so two
16
+ // timers of one id each keep their own.
17
+ // - THE EXIT. On each microstep of a Machine, the first microstep that stops the Agent's
18
+ // invocation names the cause of the macrostep it is part of. After it, the Agent's actor is no
19
+ // longer the child of the Machine that invokes it, a child Machine on the way up is no longer a
20
+ // child of the one above, or a Machine on the way up is done. A microstep that throws is never
21
+ // inspected, so a fault is never the exit. When a Machine above catches a fault on the way up,
22
+ // that catch is the exit, and it has no cause: a fault is never the pick's, even when the pick's
23
+ // route caused it. The stop of a run is no event of the Machine's.
24
+ // - A FAILURE (ADR-0073) is not a fault: it is the end that a state chose. When a Machine on the
25
+ // way up from the Agent ends with a Failure, its own error event is the exit, with the cause of
26
+ // that relay. So a pick whose route invokes `fail` ends its Turn, whether a Machine above
27
+ // catches the Failure or the run ends `failed`.
28
+ //
29
+ // Which relay an actor takes now is read from the relay order: xstate relays an event (inspected as
30
+ // `@xstate.event`) to the actor's mailbox. The mailbox takes events one at a time, in order, and
31
+ // xstate inspects `@xstate.snapshot` with that event when the actor has taken it. An actor's own done
32
+ // or error event (`xstate.done.actor.<id>`, `xstate.error.actor.<id>`) is the last relay it makes
33
+ // with a cause. It takes the cause of the relay the actor took then; after it, the actor is
34
+ // finished. A finished actor has no cause, and a relay to it, or to a stopped actor, is not queued:
35
+ // xstate drops it. Status alone does not say it: a done Machine makes its last deferred sends with
36
+ // status `done`, and a Machine done at start is `done` before its init relay. And an errored callback
37
+ // is never stopped: its own later sends still reach its parent.
38
+
39
+ import type { AnyActorRef, AnyEventObject, AnyMachineSnapshot } from "xstate";
40
+ import { isFailure } from "./fail.ts";
41
+ import type { Registration } from "./registration.ts";
42
+
43
+ const XSTATE_STOP = "xstate.stop";
44
+
45
+ /** The Agents' picks a relay comes from; undefined for none. */
46
+ type Cause = ReadonlySet<Registration> | undefined;
47
+
48
+ export class PickCauses {
49
+ /** Each actor's relays that it has not taken yet, in order, with their causes: the first is the
50
+ * one it takes now, or next. */
51
+ private readonly pending = new WeakMap<AnyActorRef, Array<{ event: AnyEventObject; cause: Cause }>>();
52
+ /** For each registration, the cause of the microstep that took the Machine out of its Agent's
53
+ * state, or `null` for none. Set once, at the first such microstep. */
54
+ private readonly exits = new WeakMap<Registration, Cause | null>();
55
+ /** Each registration's Agent actor, read off the invoking Machine's committed snapshot. */
56
+ private readonly actors = new WeakMap<Registration, AnyActorRef>();
57
+ /** Each actor that relayed its own done or error event: it takes nothing more, and has no cause. */
58
+ private readonly finished = new WeakSet<AnyActorRef>();
59
+ /** The cause of the timer the scheduler arms now: the next `setTimeout` on the clock keeps it. */
60
+ private arming: Cause;
61
+ /** Set while a timer's callback runs: its cause, for the relay the scheduler makes next. */
62
+ private firing: { cause: Cause } | undefined;
63
+
64
+ /** The scheduler arms a timer whose source is `source`: its cause is the relay `source` takes now. */
65
+ armingFrom(source: AnyActorRef): void {
66
+ this.arming = this.causeOfCurrent(source);
67
+ }
68
+
69
+ /**
70
+ * The run's clock, over `base`: each `setTimeout` keeps the cause of the timer the scheduler arms
71
+ * with it, and gives it to the relay its callback makes. So each timer's cause is its own, even
72
+ * for two timers of one id. A clear needs nothing: the callback never runs.
73
+ */
74
+ clockOver<T>(base: { setTimeout: (fn: () => void, ms: number) => T; clearTimeout: (timer: T) => void }) {
75
+ return {
76
+ setTimeout: (fn: () => void, ms: number): T => {
77
+ const cause = this.arming;
78
+ this.arming = undefined;
79
+ return base.setTimeout(() => {
80
+ this.firing = { cause };
81
+ try {
82
+ fn();
83
+ } finally {
84
+ this.firing = undefined;
85
+ }
86
+ }, ms);
87
+ },
88
+ clearTimeout: (timer: T) => base.clearTimeout(timer),
89
+ };
90
+ }
91
+
92
+ /**
93
+ * `@xstate.event`: `event` is relayed from `source` to `target`. `pickOf` names the registrations
94
+ * whose pick it is, or whose work below it comes from. With them: the cause of the timer whose
95
+ * callback makes this relay, or else of the relay that `source` takes now.
96
+ *
97
+ * When the relay is the error event of a Machine that a Failure ended, it is the exit of each of
98
+ * `registrations` whose Agent that Machine invokes, or is above: the Failure took the Agent's
99
+ * state away, and the pick that chose it is the cause.
100
+ */
101
+ relayed(
102
+ source: AnyActorRef | undefined,
103
+ target: AnyActorRef,
104
+ event: AnyEventObject,
105
+ pickOf: () => Cause,
106
+ registrations: () => Iterable<Registration> = () => [],
107
+ ): void {
108
+ const firing = this.firing;
109
+ this.firing = undefined;
110
+ const by = firing ? firing.cause : source !== undefined ? this.causeOfCurrent(source) : undefined;
111
+ const cause = union(pickOf(), by);
112
+ // The source's own done or error event: the last relay it makes with a cause.
113
+ if (source !== undefined && isOwnEnd(source, event)) {
114
+ this.finished.add(source);
115
+ this.pending.delete(source);
116
+ if (isFailure((event as { error?: unknown }).error)) this.failedAt(source, cause, registrations());
117
+ }
118
+ if (this.finished.has(target) || statusOf(target) === "stopped") return;
119
+ const queue = this.pending.get(target);
120
+ if (queue) queue.push({ event, cause });
121
+ else this.pending.set(target, [{ event, cause }]);
122
+ }
123
+
124
+ /** A Failure ended `machine`: record the exit of each registration whose invoker is `machine` or
125
+ * is below it, with the cause of the Failure's relay. */
126
+ private failedAt(machine: AnyActorRef, cause: Cause, registrations: Iterable<Registration>): void {
127
+ for (const reg of registrations) {
128
+ if (this.exits.has(reg)) continue;
129
+ for (let at: AnyActorRef | undefined = reg.invoker; at !== undefined; at = at._parent) {
130
+ if (at !== machine) continue;
131
+ this.exits.set(reg, cause ?? null);
132
+ break;
133
+ }
134
+ }
135
+ }
136
+
137
+ /** `@xstate.snapshot`: `actor` has taken `event`. An event that was not relayed (a stop) leaves
138
+ * the order as it is; a stop clears it, since a stopped actor takes nothing more. */
139
+ taken(actor: AnyActorRef, event: AnyEventObject): void {
140
+ const queue = this.pending.get(actor);
141
+ if (!queue) return;
142
+ if (event.type === XSTATE_STOP) {
143
+ queue.length = 0;
144
+ return;
145
+ }
146
+ const at = queue.findIndex((relay) => relay.event === event);
147
+ if (at !== -1) queue.splice(0, at + 1);
148
+ }
149
+
150
+ /**
151
+ * `@xstate.microstep` of `machine`, with the snapshot after it: record the exit of each of
152
+ * `registrations` that this microstep takes out of the Machine.
153
+ */
154
+ microstep(
155
+ machine: AnyActorRef,
156
+ snapshot: AnyMachineSnapshot,
157
+ event: AnyEventObject,
158
+ registrations: Iterable<Registration>,
159
+ ): void {
160
+ for (const reg of registrations) {
161
+ if (this.exits.has(reg) || !reg.invoker || !reg.invokeId) continue;
162
+ if (!this.actors.has(reg)) {
163
+ // The committed snapshot: the invoking Machine's own microstep is not committed until its
164
+ // macrostep ends, so this is the actor the registration was made for.
165
+ const ref = childrenOf(reg.invoker.getSnapshot())[reg.invokeId];
166
+ if (ref === undefined) continue;
167
+ this.actors.set(reg, ref);
168
+ }
169
+ const exit = leaves(reg, this.actors.get(reg)!, machine, snapshot);
170
+ if (exit === false) continue;
171
+ // A fault on the way up took the Agent's state away when the Machine above caught it: that is
172
+ // the exit, and a fault is never the pick's, even when the pick's route caused it.
173
+ const none = event.type === XSTATE_STOP || exit === "fault";
174
+ this.exits.set(reg, none ? null : (this.causeOfCurrent(machine) ?? null));
175
+ }
176
+ }
177
+
178
+ /** Did this registration's own pick take the Machine out of its Agent's state? */
179
+ endedByPick(reg: Registration): boolean {
180
+ return this.exits.get(reg)?.has(reg) === true;
181
+ }
182
+
183
+ /** The cause of the relay `actor` takes now. A done or errored actor relays its own done or error
184
+ * event while it takes its last relay, so that event keeps the cause. A finished or stopped actor
185
+ * has none. */
186
+ private causeOfCurrent(actor: AnyActorRef): Cause {
187
+ const status = statusOf(actor);
188
+ if (status === undefined || status === "stopped" || this.finished.has(actor)) return undefined;
189
+ return this.pending.get(actor)?.[0]?.cause;
190
+ }
191
+ }
192
+
193
+ function statusOf(actor: AnyActorRef): string | undefined {
194
+ return (actor.getSnapshot() as { status?: string } | undefined)?.status;
195
+ }
196
+
197
+ /** Is `event` the actor's own done or error event? */
198
+ function isOwnEnd(actor: AnyActorRef, event: AnyEventObject): boolean {
199
+ return event.type === `xstate.done.actor.${actor.id}` || event.type === `xstate.error.actor.${actor.id}`;
200
+ }
201
+
202
+ function union(a: Cause, b: Cause): Cause {
203
+ if (a === undefined) return b;
204
+ if (b === undefined) return a;
205
+ return new Set([...a, ...b]);
206
+ }
207
+
208
+ /** Does this microstep of `machine` stop `reg`'s invocation: `machine` is on the way up from the
209
+ * Agent and is done, or the actor (or child Machine) on the way down is no longer its child. It is
210
+ * `"fault"` when a Machine on the way up below `machine` has status `error`: `machine` caught that
211
+ * fault. A Failure is no fault (ADR-0073), but it never gets here: its relay records the exit
212
+ * (`failedAt`) before a Machine above takes it. The invoker's own microstep has no Machine below it
213
+ * on the way up, so the error of a child of the invoker is never a fault here. */
214
+ function leaves(
215
+ reg: Registration,
216
+ agent: AnyActorRef,
217
+ machine: AnyActorRef,
218
+ snapshot: AnyMachineSnapshot,
219
+ ): "exit" | "fault" | false {
220
+ let below = agent;
221
+ let faulted = false;
222
+ for (let at: AnyActorRef | undefined = reg.invoker; at !== undefined; below = at, at = at._parent) {
223
+ if (at === machine) {
224
+ if (snapshot.status !== "done" && childrenOf(snapshot)[below.id] === below) return false;
225
+ return faulted ? "fault" : "exit";
226
+ }
227
+ if (statusOf(at) === "error") faulted = true;
228
+ }
229
+ return false;
230
+ }
231
+
232
+ function childrenOf(snapshot: unknown): Record<string, AnyActorRef | undefined> {
233
+ return (snapshot as { children?: Record<string, AnyActorRef | undefined> } | undefined)?.children ?? {};
234
+ }