@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,186 @@
1
+ ---
2
+ title: pool
3
+ description: "Make a Pool: a Machine that runs one worker Machine for each item that a Source gives, with at most `cap` workers at once."
4
+ ---
5
+
6
+ # `pool`
7
+
8
+ Function, in `@jr2/orchestrator/src/pool.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
9
+
10
+ ## Overload 1
11
+
12
+ ```ts
13
+ function pool<
14
+ TWorker extends AnyStateMachine,
15
+ TSchema extends z.ZodObject,
16
+ >(
17
+ worker: TWorker,
18
+ spec: PoolSpec<any, z.infer<TSchema>> & { input: TSchema },
19
+ ): PoolMachine<TWorker, z.infer<TSchema>>
20
+ ```
21
+
22
+ Make a Pool: a Machine that runs one worker Machine for each item that a Source gives, with at
23
+ most `cap` workers at once. Use it as the root of a Workflow (`export const machine = pool(…)`),
24
+ or compose it in another Machine.
25
+
26
+ The run ends when the Source has no item ready and no worker runs. Its output is
27
+ `{ status, items, failures }`: `status` is `"drained"` when no item is left, or `"deadlocked"`
28
+ when items exist but none can start; `items` holds the output of each worker that got to a final
29
+ state, by item id; `failures` holds the Failure of each worker that failed, by item id. A worker's
30
+ Failure stops only that worker: the other workers and their Sandboxes stay. When the Pool ends
31
+ with one or more failures, `drained` or `deadlocked`, it fails the run by default: the reason is
32
+ `"<n> of <m> items failed"`, and the detail is `{ status, items, failures }`. With
33
+ `failures: "report"`, it ends `done` with that output. A worker's defect ends the whole run
34
+ `error`. While workers wait on Gates, the run stays open.
35
+
36
+ `customize()` reaches through a Pool to its worker: `customize(pool, { agents })` retunes the
37
+ worker's Agents. The events that the Pool accepts are its `wake` event only; each worker keeps
38
+ its own.
39
+
40
+ **Parameters**
41
+
42
+ - `worker`: The Machine to run for each item. It gets the item, or what `itemInput` makes
43
+ of it, as its input. It does not get the run input.
44
+ - `spec`: The Source, the item id, the cap, and the worker's input. See [`PoolSpec`](type-poolspec.md).
45
+
46
+ - `id` (optional): `string`
47
+
48
+ The Machine id: the name of the Pool in the Console. Default: `"pool"`.
49
+ - `input`: `z.ZodObject`
50
+
51
+ The run input of the Pool, as a zod object: what a caller sends to start a run. `cap` and
52
+ `itemInput` read it, typed by it. A worker never gets it: each worker gets its item. Default:
53
+ none, and then their `input` is `unknown`.
54
+ - `source`: `SourceSpec<T>`
55
+
56
+ Where the items come from. Make it with [`source`](source.md).
57
+ - `itemId`: `(item: T) => string`
58
+
59
+ The id of an item. The Pool uses it as the id of the item's worker and in the `active` list
60
+ that `next` gets. It is also the key of that worker's output in `items`. Give each item an id
61
+ of its own, and the same id every time.
62
+ - `cap` (optional): `number | ((args: { input: TInput; }) => number)`
63
+
64
+ The most workers that run at once: a number, or a function of the run input. Default: `1`.
65
+ - `itemInput` (optional): `(item: T, args: { input: TInput; }) => unknown`
66
+
67
+ Make a worker's input from its item and the run input. Default: the item itself.
68
+ - `onDrained` (optional): `"final"`
69
+
70
+ What the Pool does when the Source has no more items and every worker has settled. Only
71
+ `"final"`: the run ends. Default: `"final"`.
72
+ - `failures` (optional): `"fail" | "report"`
73
+
74
+ What the Pool does at the end when one or more workers failed. The Pool catches each worker's
75
+ Failure either way, so one failed item does not stop the other workers. `"fail"`: when the Pool
76
+ ends with failures, `drained` or `deadlocked`, it fails the run with the reason
77
+ `"<n> of <m> items failed"` and the detail `{ status, items, failures }`. `"report"`: the Pool
78
+ ends `done`, with the failures in its output. Default: `"fail"`.
79
+
80
+ **Returns**: The Pool, as a Machine.
81
+
82
+ **Example**
83
+
84
+ ```ts
85
+ import { fromPromise } from "xstate";
86
+ import { customize, pool, source } from "@jr2/orchestrator";
87
+ import { task } from "@jr2/machines";
88
+
89
+ type Issue = { id: string; title: string };
90
+
91
+ const backlog: Issue[] = [
92
+ { id: "ISSUE-1", title: "Fix the greeting." },
93
+ { id: "ISSUE-2", title: "Add a --name flag." },
94
+ ];
95
+
96
+ const issues = source<Issue>({
97
+ next: fromPromise(async ({ input }: { input: { active: string[] } }) => {
98
+ const issue = backlog.find((i) => !input.active.includes(i.id)) ?? null;
99
+ if (issue) backlog.splice(backlog.indexOf(issue), 1);
100
+ return issue;
101
+ }),
102
+ });
103
+
104
+ const fixer = customize(task, {
105
+ repos: { app: { url: "https://github.com/you/app.git" } },
106
+ agents: { coder: { model: "anthropic/claude-haiku-5-5" } },
107
+ });
108
+
109
+ export const machine = pool(fixer, {
110
+ id: "issues",
111
+ source: issues,
112
+ itemId: (issue: Issue) => issue.id,
113
+ cap: 2,
114
+ itemInput: (issue: Issue) => ({ prompt: issue.title, branch: `fix/${issue.id}` }),
115
+ });
116
+ ```
117
+
118
+ **See also**
119
+
120
+ - [Run one worker per item](../../guides/run-one-worker-per-item.md)
121
+ - [Pools and Sources](../../concepts/pools-and-sources.md)
122
+ - [ADR-0017: The run loop is a jr2 `pool` over a generalized source port](../decisions/0017-pool-over-a-source-port.md)
123
+
124
+ ## Overload 2
125
+
126
+ ```ts
127
+ function pool<
128
+ TWorker extends AnyStateMachine,
129
+ TInput = unknown,
130
+ >(
131
+ worker: TWorker,
132
+ spec: PoolSpec<any, TInput> & { input?: never },
133
+ ): PoolMachine<TWorker, TInput>
134
+ ```
135
+
136
+ Make a Pool with no `input` schema. A Pool is a Machine that runs one worker Machine for each
137
+ item that a Source gives, with at most `cap` workers at once. See `pool` for the full description and
138
+ an example.
139
+
140
+ **Parameters**
141
+
142
+ - `worker`: The Machine to run for each item. It gets the item, or what `itemInput` makes
143
+ of it, as its input. It does not get the run input.
144
+ - `spec`: The Source, the item id, the cap, and the worker's input. See [`PoolSpec`](type-poolspec.md).
145
+
146
+ - `id` (optional): `string`
147
+
148
+ The Machine id: the name of the Pool in the Console. Default: `"pool"`.
149
+ - `input` (optional): `z.ZodObject`
150
+
151
+ The run input of the Pool, as a zod object: what a caller sends to start a run. `cap` and
152
+ `itemInput` read it, typed by it. A worker never gets it: each worker gets its item. Default:
153
+ none, and then their `input` is `unknown`.
154
+ - `source`: `SourceSpec<T>`
155
+
156
+ Where the items come from. Make it with [`source`](source.md).
157
+ - `itemId`: `(item: T) => string`
158
+
159
+ The id of an item. The Pool uses it as the id of the item's worker and in the `active` list
160
+ that `next` gets. It is also the key of that worker's output in `items`. Give each item an id
161
+ of its own, and the same id every time.
162
+ - `cap` (optional): `number | ((args: { input: TInput; }) => number)`
163
+
164
+ The most workers that run at once: a number, or a function of the run input. Default: `1`.
165
+ - `itemInput` (optional): `(item: T, args: { input: TInput; }) => unknown`
166
+
167
+ Make a worker's input from its item and the run input. Default: the item itself.
168
+ - `onDrained` (optional): `"final"`
169
+
170
+ What the Pool does when the Source has no more items and every worker has settled. Only
171
+ `"final"`: the run ends. Default: `"final"`.
172
+ - `failures` (optional): `"fail" | "report"`
173
+
174
+ What the Pool does at the end when one or more workers failed. The Pool catches each worker's
175
+ Failure either way, so one failed item does not stop the other workers. `"fail"`: when the Pool
176
+ ends with failures, `drained` or `deadlocked`, it fails the run with the reason
177
+ `"<n> of <m> items failed"` and the detail `{ status, items, failures }`. `"report"`: the Pool
178
+ ends `done`, with the failures in its output. Default: `"fail"`.
179
+
180
+ **Returns**: The Pool, as a Machine.
181
+
182
+ **See also**
183
+
184
+ - [Run one worker per item](../../guides/run-one-worker-per-item.md)
185
+ - [Pools and Sources](../../concepts/pools-and-sources.md)
186
+ - [ADR-0017: The run loop is a jr2 `pool` over a generalized source port](../decisions/0017-pool-over-a-source-port.md)
@@ -0,0 +1,112 @@
1
+ ---
2
+ title: push
3
+ description: "Make a `push` Effect: it pushes the branch of the Workspace to the Binding of its Repo Slot."
4
+ ---
5
+
6
+ # `push`
7
+
8
+ Function, in `@jr2/orchestrator/src/sandbox-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ```ts
11
+ function push<
12
+ const O extends PushOptions,
13
+ >(
14
+ options?: O,
15
+ ): EffectLogic<PushInput<O> | void, PushOutput>
16
+ ```
17
+
18
+ Make a `push` Effect: it pushes the branch of the Workspace to the Binding of its Repo Slot.
19
+ Put it in `actors`, and invoke it from the body of a `workspace()`: `actors: { publish: push({
20
+ sign: true }) }`.
21
+
22
+ It runs in the Sandbox Effector of the Workspace, with the push credential of the
23
+ `git.credentials` entry that the Binding matches. The Agent never reads that credential. It
24
+ pushes one commit: the tip of the Agent's branch when the Effect starts, or, with `pin`, the
25
+ commit that the input names. After an Orchestrator restart, jr2 pushes only that same commit
26
+ again. With `sign` or `squash`, the commit on the remote is not the Agent's own. Then jr2 moves
27
+ the Agent's branch to it.
28
+
29
+ Every outcome is output (`PushOutput`): `pushed`, `rejected`, `diverged` or `unknown`. Each
30
+ field of [`PushOptions`](type-pushoptions.md) tells what it refuses. When it starts, it also refuses a push
31
+ outside a Workspace: `push "<slot>" runs in the Sandbox Effector of a Workspace, and its state is
32
+ not inside a workspace() — invoke it from a Workspace's body (ADR-0067)`.
33
+
34
+ **Parameters**
35
+
36
+ - `options` ([`PushOptions`](type-pushoptions.md)): Optional. Each field tells what it does.
37
+
38
+ **Returns**: An Effect, for `actors`.
39
+
40
+ **Example**
41
+
42
+ ```ts
43
+ import { z } from "zod";
44
+ import {
45
+ agent,
46
+ defineEvent,
47
+ fail,
48
+ jr2Setup,
49
+ push,
50
+ workspace,
51
+ type Workspaced,
52
+ } from "@jr2/orchestrator";
53
+
54
+ const committed = defineEvent({
55
+ name: "committed",
56
+ description: "Say that the fix is committed.",
57
+ input: z.object({}),
58
+ });
59
+
60
+ type Input = Workspaced<{}, "app">;
61
+
62
+ const body = jr2Setup({
63
+ types: {} as { context: Input; input: Input },
64
+ events: [committed],
65
+ actors: {
66
+ coder: agent({
67
+ model: "anthropic/claude-haiku-5-5",
68
+ instructions: "You are a careful engineer.",
69
+ }),
70
+ publish: push({ sign: true }),
71
+ fail: fail(),
72
+ },
73
+ }).createMachine({
74
+ id: "fix-test",
75
+ context: ({ input }) => input,
76
+ on: { "workspace.lost": ".failed", "agent.fault": ".failed" },
77
+ initial: "coding",
78
+ states: {
79
+ coding: {
80
+ invoke: { src: "coder", input: { prompt: "Fix the failing test, and commit the fix." } },
81
+ // The Agent moves the Machine on with a pick. An Agent's actor never ends, so `onDone`
82
+ // never fires.
83
+ on: { committed: "publishing" },
84
+ },
85
+ publishing: {
86
+ invoke: {
87
+ src: "publish",
88
+ onDone: [
89
+ { guard: ({ event }) => event.output.outcome === "pushed", target: "done" },
90
+ { target: "failed" },
91
+ ],
92
+ },
93
+ },
94
+ done: { type: "final" },
95
+ // Not a final state: the run ends `failed`, and the Workspace deletes the Sandbox.
96
+ failed: { invoke: { src: "fail", input: { reason: "the fix was not pushed" } } },
97
+ },
98
+ });
99
+
100
+ export const machine = workspace(body, {
101
+ repos: { app: { url: "https://github.com/you/app.git" } },
102
+ spec: () => ({ branch: "fix-test" }),
103
+ });
104
+ ```
105
+
106
+ **See also**
107
+
108
+ - [Push and sign a branch](../../guides/push-and-sign-a-branch.md)
109
+ - [Effects](../../concepts/effects.md)
110
+ - [Give the cluster git credentials](../../guides/give-the-cluster-git-credentials.md)
111
+ - [ADR-0067: An Effect is an actor slot, and runs at most once unless marked idempotent](../decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md)
112
+ - [ADR-0051: A Repo is a slot on the `workspace()` and a cache on the node](../decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md)
@@ -0,0 +1,118 @@
1
+ ---
2
+ title: secret
3
+ description: "Name an Effect secret: `secret(\"jira\")`."
4
+ ---
5
+
6
+ # `secret`
7
+
8
+ Function, in `@jr2/orchestrator/src/http-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ## Overload 1
11
+
12
+ ```ts
13
+ function secret(name: string): Secret
14
+ ```
15
+
16
+ Name an Effect secret: `secret("jira")`. The name is the `name` of an entry in the `secrets`
17
+ list of `jr2.config.ts`. The Effector reads the value and puts it into the call, or into the env
18
+ of a `command`. The Agent never reads it, and the Orchestrator never holds it.
19
+
20
+ Use it in `bearer`, `basic` or `text`, or in the `env` of a `command`. In an `env`,
21
+ `secret("x")` gives the value, and `secret("x").path` gives the path of a file that holds the
22
+ value.
23
+
24
+ `secret(open)` leaves the name to the composer of a packaged Machine, who binds it one time:
25
+ `customize(machine, { effects: { <slot>: { secret: "<name>" } } })`. An Effect can have one Open
26
+ secret, in its `auth`, a header or its `env`. A url cannot have one: leave the whole url Open
27
+ (`url: open`) instead.
28
+
29
+ It refuses, when you call it:
30
+ - a name that is not letters, digits, `.`, `_` and `-`, that starts with `.`, or that is longer
31
+ than 253 characters: `secret("<name>"): a secret's name is letters, digits, ".", "_" and "-",
32
+ and does not start with "." — it is the file the Effector reads it from (ADR-0068)`
33
+ - an Effect that names `secret(open)` in two places that are two secrets: `an Effect takes one
34
+ Open secret — it names secret(open) in two places that are two secrets; name one secret(open)
35
+ and use it in each place, or name the others with secret("<name>") (ADR-0054)`
36
+ - `secret(open)` in a url: ``secret(open) in a url: a url's secret is not an Open part — leave
37
+ the whole url Open (`url: open`) and let the composer bind it with its secret in its path
38
+ (ADR-0054)``
39
+
40
+ And at `jr2 up`:
41
+ - a name that the `secrets` list does not have: ``workflow "<workflow>": the <kind> Effect
42
+ "<slot>" names secret("<name>"), which the `secrets` list does not hold — add it: secrets: [{
43
+ name: "<name>", value: process.env.<NAME> }] (ADR-0068)``
44
+ - a value of fewer than 8 characters: `secrets[<i>] (<name>) is an Effect secret shorter than 8
45
+ characters — the Effector replaces every match of a secret in what it returns, and a value
46
+ this short would match ordinary text. Use the whole credential; the value itself is not shown
47
+ (ADR-0068)`
48
+
49
+ **Parameters**
50
+
51
+ - `name`: The name of an entry in the `secrets` list.
52
+
53
+ **Returns**: The Effect secret, for an Effect. Its `.path` names the file of the secret, for the
54
+ `env` of a `command`.
55
+
56
+ **Example**
57
+
58
+ ```ts
59
+ import { command, fail, jr2Setup, secret, workspace, type Workspaced } from "@jr2/orchestrator";
60
+
61
+ type Input = Workspaced<{}, "app">;
62
+
63
+ const body = jr2Setup({
64
+ types: {} as { context: Input; input: Input },
65
+ actors: {
66
+ // The command reads the file at $KUBECONFIG. The Agent never reads the secret.
67
+ deploy: command(["kubectl", "apply", "-f", "k8s/"], {
68
+ env: { KUBECONFIG: secret("kube").path },
69
+ }),
70
+ fail: fail(),
71
+ },
72
+ }).createMachine({
73
+ id: "deploy",
74
+ context: ({ input }) => input,
75
+ on: { "workspace.lost": ".lost" },
76
+ initial: "deploying",
77
+ states: {
78
+ deploying: { invoke: { src: "deploy", onDone: "done" } },
79
+ done: { type: "final" },
80
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
81
+ },
82
+ });
83
+
84
+ export const machine = workspace(body, {
85
+ repos: { app: { url: "https://github.com/you/app.git" } },
86
+ spec: () => ({ branch: "deploy" }),
87
+ });
88
+ ```
89
+
90
+ **See also**
91
+
92
+ - [Secrets and trust](../../concepts/secrets-and-trust.md)
93
+ - [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
94
+ - [ADR-0068: An Effector holds an Effect's secrets and signs its wire](../decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md)
95
+ - [ADR-0054: The kit ships Machines, and a shipped Machine leaves its parts Open](../decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md)
96
+
97
+ ## Overload 2
98
+
99
+ ```ts
100
+ function secret(name: typeof open): OpenSecret
101
+ ```
102
+
103
+ Leave an Effect secret Open: `secret(open)`, in a Machine that you publish as a package. The
104
+ composer binds its name one time: `customize(machine, { effects: { <slot>: { secret: "<name>"
105
+ } } })`. `secret` tells the rest, and what it refuses.
106
+
107
+ **Parameters**
108
+
109
+ - `name`: `open`.
110
+
111
+ **Returns**: The Open secret, for an Effect. Its `.path` names the file of the secret, for the `env`
112
+ of a `command`.
113
+
114
+ **See also**
115
+
116
+ - [Secrets and trust](../../concepts/secrets-and-trust.md)
117
+ - [Bind a shipped Machine's Open parts](../../guides/bind-open-parts.md)
118
+ - [ADR-0054: The kit ships Machines, and a shipped Machine leaves its parts Open](../decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md)
@@ -0,0 +1,83 @@
1
+ ---
2
+ title: sentBy
3
+ description: "A guard that is true for an event that one party sent, and false for an event that another party sent: `guard: sentBy(\"coder\")`."
4
+ ---
5
+
6
+ # `sentBy`
7
+
8
+ Function, in `@jr2/orchestrator/src/party.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Machine and events.
9
+
10
+ ```ts
11
+ function sentBy<const Id extends string>(id: Id): { type: typeof SENT_BY; params: { id: Id } }
12
+ ```
13
+
14
+ A guard that is true for an event that one party sent, and false for an event that another party
15
+ sent: `guard: sentBy("coder")`. Use it where two parties may send the same event to one state,
16
+ and the transition must run for one of them only. It is also true for an event that the Machine
17
+ sends itself, which has no sender.
18
+
19
+ It can only make a transition decline the events of other parties. It never lets a party send
20
+ an event that the party may not send at that state: the position of the `on` key decides that.
21
+ When the guard is false, xstate tries the next transition for the event, as for any guard. Use
22
+ it alone, or inside `and([…])`.
23
+
24
+ `createMachine` refuses an id that is not a party of the Machine: ``machine "<id>":
25
+ sentBy("<party>") on "<event>" at "<state>" names no party of this Machine (Agent slots:
26
+ <slots>; Gate invoke ids: <ids>)``
27
+
28
+ **Parameters**
29
+
30
+ - `id`: The party: the slot key of an Agent of this Machine, or the invoke `id` of one of its
31
+ Gates.
32
+
33
+ **Returns**: A named guard object, for a transition's `guard`.
34
+
35
+ **Example**
36
+
37
+ ```ts
38
+ import { z } from "zod";
39
+ import { agent, defineEvent, fail, jr2Setup, sentBy } from "@jr2/orchestrator";
40
+
41
+ const done = defineEvent({
42
+ name: "done",
43
+ description: "Call this when the draft is ready for review.",
44
+ input: z.object({}),
45
+ });
46
+
47
+ export const machine = jr2Setup({
48
+ events: [done],
49
+ actors: {
50
+ writer: agent({
51
+ model: "anthropic/claude-haiku-5-5",
52
+ instructions: "You write release notes.",
53
+ workspace: "none",
54
+ }),
55
+ fail: fail(),
56
+ },
57
+ }).createMachine({
58
+ id: "notes",
59
+ on: { "agent.fault": ".failed" },
60
+ initial: "drafting",
61
+ states: {
62
+ drafting: {
63
+ invoke: [
64
+ { src: "writer", input: { prompt: "Draft the release notes." } },
65
+ { src: "gate", id: "editor" },
66
+ ],
67
+ on: {
68
+ // The writer's `done` goes to review; the editor's `done` skips it.
69
+ done: [{ guard: sentBy("writer"), target: "review" }, { target: "published" }],
70
+ },
71
+ },
72
+ review: { invoke: { src: "gate" }, on: { done: "published" } },
73
+ published: { type: "final" },
74
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
75
+ },
76
+ });
77
+ ```
78
+
79
+ **See also**
80
+
81
+ - [The Menu](../../concepts/the-menu.md)
82
+ - [Gates](../../concepts/gates.md)
83
+ - [ADR-0015: Workflows are authored through `jr2Setup`; vocabulary and agent menus derive from the machine](../decisions/0015-authoring-surface-absorbs-the-mechanism.md)
@@ -0,0 +1,51 @@
1
+ ---
2
+ title: source
3
+ description: "Declare a Source: where a `pool()` gets its work items, one at a time."
4
+ ---
5
+
6
+ # `source`
7
+
8
+ Function, in `@jr2/orchestrator/src/pool.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
9
+
10
+ ```ts
11
+ function source<T>(spec: SourceSpec<T>): SourceSpec<T>
12
+ ```
13
+
14
+ Declare a Source: where a `pool()` gets its work items, one at a time. It gives back the spec
15
+ that you pass. The item type `T` types what `next` gives. `pool()` does not carry `T` to
16
+ `itemId` and `itemInput`, so write the item type on their parameter, as the `pool()` example does.
17
+
18
+ **Parameters**
19
+
20
+ - `spec`: How to claim the next item, and when to look again. See [`SourceSpec`](type-sourcespec.md).
21
+
22
+ **Returns**: The same spec.
23
+
24
+ **Example**
25
+
26
+ ```ts
27
+ import { fromPromise } from "xstate";
28
+ import { source } from "@jr2/orchestrator";
29
+
30
+ type Issue = { id: string; title: string };
31
+
32
+ const backlog: Issue[] = [
33
+ { id: "ISSUE-1", title: "Fix the greeting." },
34
+ { id: "ISSUE-2", title: "Add a --name flag." },
35
+ ];
36
+
37
+ export const issues = source<Issue>({
38
+ next: fromPromise(async ({ input }: { input: { active: string[] } }) => {
39
+ const issue = backlog.find((i) => !input.active.includes(i.id)) ?? null;
40
+ if (issue) backlog.splice(backlog.indexOf(issue), 1);
41
+ return issue;
42
+ }),
43
+ pollEvery: 60_000,
44
+ });
45
+ ```
46
+
47
+ **See also**
48
+
49
+ - [Run one worker per item](../../guides/run-one-worker-per-item.md)
50
+ - [Pools and Sources](../../concepts/pools-and-sources.md)
51
+ - [ADR-0017: The run loop is a jr2 `pool` over a generalized source port](../decisions/0017-pool-over-a-source-port.md)
@@ -0,0 +1,62 @@
1
+ ---
2
+ title: text
3
+ description: "Make a string from literal text and Effect secrets, as a tagged template: `` text`Token ${secret(\"x\")}` ``."
4
+ ---
5
+
6
+ # `text`
7
+
8
+ Function, in `@jr2/orchestrator/src/http-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ```ts
11
+ function text<
12
+ const V extends Array<Secret | OpenSecret | string>,
13
+ >(
14
+ strings: TemplateStringsArray,
15
+ ...values: V,
16
+ ): MarkedIf<V[number], Text>
17
+ ```
18
+
19
+ Make a string from literal text and Effect secrets, as a tagged template:
20
+ `` text`Token ${secret("x")}` ``. The Effector puts in the value of each secret when it makes
21
+ the call. Use it for a url with a secret in its path, or for a header value. Use it also for
22
+ `auth`, where it is the whole `Authorization` header, or for a part of `basic`.
23
+
24
+ It refuses a `${…}` that is not a `secret(...)` or a string: `` text`…`: a value is a
25
+ secret("name") or a string, got <value> ``.
26
+
27
+ **Parameters**
28
+
29
+ - `strings`: The literal text of the template.
30
+ - `values`: The `${…}` values, each a `secret(...)` or a string.
31
+
32
+ **Returns**: The string, which the Effector makes.
33
+
34
+ **Example**
35
+
36
+ ```ts
37
+ import { http, jr2Setup, secret, text } from "@jr2/orchestrator";
38
+
39
+ export const machine = jr2Setup({
40
+ actors: {
41
+ notify: http({
42
+ method: "POST",
43
+ url: text`https://api.telegram.org/bot${secret("telegram")}/sendMessage`,
44
+ headers: { "x-run-source": text`jr2` },
45
+ request: () => ({ json: { chat_id: "12345", text: "The run is done." } }),
46
+ }),
47
+ },
48
+ }).createMachine({
49
+ id: "notify",
50
+ initial: "notifying",
51
+ states: {
52
+ notifying: { invoke: { src: "notify", onDone: "done" } },
53
+ done: { type: "final" },
54
+ },
55
+ });
56
+ ```
57
+
58
+ **See also**
59
+
60
+ - [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
61
+ - [Secrets and trust](../../concepts/secrets-and-trust.md)
62
+ - [ADR-0068: An Effector holds an Effect's secrets and signs its wire](../decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md)
@@ -0,0 +1,27 @@
1
+ ---
2
+ title: AgentDeclaration
3
+ description: "What `agent()` takes: an `AgentDefinition`, except that `model` can also be `open`."
4
+ ---
5
+
6
+ # `AgentDeclaration`
7
+
8
+ Type, in `@jr2/orchestrator/src/agent.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
9
+
10
+ ```ts
11
+ type AgentDeclaration = Omit<AgentDefinition, "model"> & {
12
+ model: string | typeof open;
13
+ };
14
+ ```
15
+
16
+ What `agent()` takes: an [`AgentDefinition`](type-agentdefinition.md), except that `model` can also be `open`.
17
+
18
+ **Fields**: each field of [`AgentDefinition`](type-agentdefinition.md), except `model`, and these:
19
+
20
+ - `model`: `string | typeof open`
21
+
22
+ The model, as `<provider>/<modelId>`: for example `anthropic/claude-haiku-5-5`. Required:
23
+ there is no default model. The provider must be one that `jr2.config.ts` can reach.
24
+
25
+ Or `open`, in a Machine that you publish as a package. Then the Instance that registers the
26
+ Machine binds the model with `customize()`. One Turn may set another model in the invoke's
27
+ `input`.