@jr2/orchestrator 0.4.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/README.md +20 -2
  2. package/console/components/app.ts +2 -0
  3. package/console/components/fleet.ts +14 -1
  4. package/console/components/machine-pane.ts +41 -2
  5. package/console/main.ts +13 -1
  6. package/console/store.ts +102 -6
  7. package/console/style.css +21 -0
  8. package/docs/agents-block.md +5 -0
  9. package/docs/concepts/agents-and-turns.md +442 -0
  10. package/docs/concepts/architecture.md +230 -0
  11. package/docs/concepts/charts.md +143 -0
  12. package/docs/concepts/composition.md +357 -0
  13. package/docs/concepts/converge.md +254 -0
  14. package/docs/concepts/durable-runs.md +189 -0
  15. package/docs/concepts/effects.md +603 -0
  16. package/docs/concepts/gates.md +208 -0
  17. package/docs/concepts/machines-and-workflows.md +289 -0
  18. package/docs/concepts/pools-and-sources.md +230 -0
  19. package/docs/concepts/secrets-and-trust.md +222 -0
  20. package/docs/concepts/the-menu.md +378 -0
  21. package/docs/concepts/workspaces.md +678 -0
  22. package/docs/get-started/a-model-decides.md +563 -0
  23. package/docs/get-started/an-agent-in-a-sandbox.md +381 -0
  24. package/docs/get-started/connect-a-model.md +248 -0
  25. package/docs/get-started/create-an-instance.md +194 -0
  26. package/docs/get-started/have-your-assistant-write-a-machine.md +922 -0
  27. package/docs/get-started/install.md +126 -0
  28. package/docs/guides/add-tools-to-the-sandbox.md +295 -0
  29. package/docs/guides/answer-a-gate.md +304 -0
  30. package/docs/guides/bind-open-parts.md +223 -0
  31. package/docs/guides/cancel-a-run.md +146 -0
  32. package/docs/guides/clean-up.md +206 -0
  33. package/docs/guides/fix-a-failed-converge.md +361 -0
  34. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  35. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  36. package/docs/guides/let-an-agent-write-a-chart.md +226 -0
  37. package/docs/guides/look-inside-a-sandbox.md +174 -0
  38. package/docs/guides/mirror-the-kit-images.md +176 -0
  39. package/docs/guides/move-from-kind-to-a-shared-cluster.md +302 -0
  40. package/docs/guides/open-the-console.md +91 -0
  41. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  42. package/docs/guides/push-and-sign-a-branch.md +486 -0
  43. package/docs/guides/run-a-chart-by-name.md +270 -0
  44. package/docs/guides/run-a-command-or-call-a-url.md +544 -0
  45. package/docs/guides/run-one-worker-per-item.md +321 -0
  46. package/docs/guides/set-an-agents-access-and-dials.md +375 -0
  47. package/docs/guides/size-a-workspace.md +204 -0
  48. package/docs/guides/start-a-run-from-a-run.md +237 -0
  49. package/docs/guides/start-a-run.md +207 -0
  50. package/docs/guides/upgrade-the-kit-version.md +240 -0
  51. package/docs/guides/use-a-hosted-provider.md +208 -0
  52. package/docs/guides/use-a-local-model.md +313 -0
  53. package/docs/guides/watch-a-run.md +326 -0
  54. package/docs/guides/write-a-workflow.md +318 -0
  55. package/docs/index.md +44 -0
  56. package/docs/llms.txt +216 -0
  57. package/docs/reference/authoring-surface/agent.md +128 -0
  58. package/docs/reference/authoring-surface/answer.md +140 -0
  59. package/docs/reference/authoring-surface/arg.md +60 -0
  60. package/docs/reference/authoring-surface/basic.md +62 -0
  61. package/docs/reference/authoring-surface/bearer.md +53 -0
  62. package/docs/reference/authoring-surface/chartschema.md +23 -0
  63. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  64. package/docs/reference/authoring-surface/command.md +191 -0
  65. package/docs/reference/authoring-surface/customize.md +64 -0
  66. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  67. package/docs/reference/authoring-surface/defineevent.md +114 -0
  68. package/docs/reference/authoring-surface/dispatch.md +126 -0
  69. package/docs/reference/authoring-surface/fail.md +83 -0
  70. package/docs/reference/authoring-surface/file.md +122 -0
  71. package/docs/reference/authoring-surface/frompick.md +277 -0
  72. package/docs/reference/authoring-surface/http.md +159 -0
  73. package/docs/reference/authoring-surface/isfailure.md +58 -0
  74. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  75. package/docs/reference/authoring-surface/open.md +74 -0
  76. package/docs/reference/authoring-surface/openbody.md +86 -0
  77. package/docs/reference/authoring-surface/paramsof.md +125 -0
  78. package/docs/reference/authoring-surface/pool.md +186 -0
  79. package/docs/reference/authoring-surface/push.md +112 -0
  80. package/docs/reference/authoring-surface/secret.md +118 -0
  81. package/docs/reference/authoring-surface/sentby.md +83 -0
  82. package/docs/reference/authoring-surface/source.md +51 -0
  83. package/docs/reference/authoring-surface/text.md +62 -0
  84. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  85. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  86. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  87. package/docs/reference/authoring-surface/type-agentslots.md +12 -0
  88. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  89. package/docs/reference/authoring-surface/type-arg.md +19 -0
  90. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  91. package/docs/reference/authoring-surface/type-binding.md +62 -0
  92. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  93. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  94. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  95. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  96. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  97. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  98. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  99. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  100. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  101. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  102. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  103. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  104. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  105. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  106. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  107. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  108. package/docs/reference/authoring-surface/type-childat.md +12 -0
  109. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  110. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  111. package/docs/reference/authoring-surface/type-commandinput.md +19 -0
  112. package/docs/reference/authoring-surface/type-commandoptions.md +78 -0
  113. package/docs/reference/authoring-surface/type-commandoutput.md +104 -0
  114. package/docs/reference/authoring-surface/type-customize.md +109 -0
  115. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  116. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  117. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  118. package/docs/reference/authoring-surface/type-dispatchoutput.md +65 -0
  119. package/docs/reference/authoring-surface/type-duration.md +15 -0
  120. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  121. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  122. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  123. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  124. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  125. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  126. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  127. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  128. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  129. package/docs/reference/authoring-surface/type-failure.md +19 -0
  130. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  131. package/docs/reference/authoring-surface/type-filebody.md +41 -0
  132. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  133. package/docs/reference/authoring-surface/type-hostinjectedinput.md +58 -0
  134. package/docs/reference/authoring-surface/type-httpdefinition.md +101 -0
  135. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  136. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  137. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  138. package/docs/reference/authoring-surface/type-httpoutput.md +89 -0
  139. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  140. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  141. package/docs/reference/authoring-surface/type-lends.md +38 -0
  142. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  143. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  144. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  145. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  146. package/docs/reference/authoring-surface/type-noslotspec.md +26 -0
  147. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +32 -0
  148. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  149. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  150. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  151. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  152. package/docs/reference/authoring-surface/type-opencommandinput.md +17 -0
  153. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  154. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  155. package/docs/reference/authoring-surface/type-openof.md +12 -0
  156. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  157. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  158. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +31 -0
  159. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +32 -0
  160. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  161. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  162. package/docs/reference/authoring-surface/type-pushinput.md +15 -0
  163. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  164. package/docs/reference/authoring-surface/type-pushoutput.md +124 -0
  165. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  166. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  167. package/docs/reference/authoring-surface/type-reached.md +12 -0
  168. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  169. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  170. package/docs/reference/authoring-surface/type-sandboxoptions.md +77 -0
  171. package/docs/reference/authoring-surface/type-secret.md +25 -0
  172. package/docs/reference/authoring-surface/type-sender.md +19 -0
  173. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  174. package/docs/reference/authoring-surface/type-size.md +85 -0
  175. package/docs/reference/authoring-surface/type-slothandles.md +32 -0
  176. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  177. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  178. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  179. package/docs/reference/authoring-surface/type-text.md +19 -0
  180. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  181. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  182. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  183. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  184. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  185. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  186. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  187. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  188. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  189. package/docs/reference/authoring-surface/type-workspaced.md +94 -0
  190. package/docs/reference/authoring-surface/type-workspacehandles.md +23 -0
  191. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  192. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  193. package/docs/reference/authoring-surface/type-workspaceoptions.md +39 -0
  194. package/docs/reference/authoring-surface/type-workspacespec.md +37 -0
  195. package/docs/reference/authoring-surface/workspace.md +259 -0
  196. package/docs/reference/authoring-surface.md +197 -0
  197. package/docs/reference/cli.md +433 -0
  198. package/docs/reference/config.md +756 -0
  199. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +113 -0
  200. package/docs/reference/decisions/0002-duplex-streaming-actor.md +110 -0
  201. package/docs/reference/decisions/0004-worktree-provisioning-model.md +124 -0
  202. package/docs/reference/decisions/0005-sandbox-pod-composition.md +230 -0
  203. package/docs/reference/decisions/0006-agent-control-surface.md +47 -0
  204. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  205. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  206. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  207. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  208. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  209. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  210. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +157 -0
  211. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  212. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +265 -0
  213. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +124 -0
  214. package/docs/reference/decisions/0017-pool-over-a-source-port.md +69 -0
  215. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  216. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +275 -0
  217. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  218. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +100 -0
  219. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  220. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +176 -0
  221. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +439 -0
  222. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  223. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  224. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +237 -0
  225. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +89 -0
  226. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  227. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  228. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +190 -0
  229. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  230. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +127 -0
  231. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  232. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  233. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  234. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  235. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  236. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  237. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  238. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  239. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  240. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  241. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  242. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  243. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  244. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  245. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  246. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  247. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +227 -0
  248. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +81 -0
  249. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +111 -0
  250. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  251. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  252. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  253. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  254. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +106 -0
  255. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +384 -0
  256. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  257. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  258. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +212 -0
  259. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +83 -0
  260. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  261. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  262. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +550 -0
  263. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +430 -0
  264. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +464 -0
  265. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  266. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +323 -0
  267. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  268. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  269. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  270. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  271. package/docs/reference/decisions.md +83 -0
  272. package/docs/reference/glossary.md +648 -0
  273. package/docs/reference/http-api.md +1348 -0
  274. package/docs/reference/machines.md +190 -0
  275. package/docs/reference/mechanism-events.md +72 -0
  276. package/docs/why.md +206 -0
  277. package/package.json +5 -3
  278. package/src/actor.ts +541 -79
  279. package/src/agent.ts +114 -38
  280. package/src/ambient.ts +2 -1
  281. package/src/assembly-checks.ts +189 -7
  282. package/src/cause.ts +234 -0
  283. package/src/chart.ts +169 -37
  284. package/src/charts.ts +34 -6
  285. package/src/config.ts +430 -178
  286. package/src/custodian.ts +74 -22
  287. package/src/customize.ts +188 -46
  288. package/src/dispatch-effect.ts +945 -0
  289. package/src/door-compat.ts +217 -0
  290. package/src/durability.ts +11 -4
  291. package/src/effect.ts +341 -44
  292. package/src/effector-wire.ts +160 -11
  293. package/src/fail.ts +209 -0
  294. package/src/harness-client.ts +541 -47
  295. package/src/http-effect.ts +495 -53
  296. package/src/http.ts +427 -16
  297. package/src/index.ts +60 -82
  298. package/src/instance.ts +68 -8
  299. package/src/internal.ts +84 -0
  300. package/src/machine-doc.ts +21 -3
  301. package/src/mechanism-routes.ts +168 -0
  302. package/src/model-keys.generated.ts +53 -0
  303. package/src/model-keys.ts +18 -58
  304. package/src/notices.ts +66 -13
  305. package/src/open-body.ts +159 -23
  306. package/src/open-effect.ts +81 -8
  307. package/src/open.ts +59 -6
  308. package/src/parts.ts +184 -13
  309. package/src/party.ts +68 -2
  310. package/src/pick.ts +463 -11
  311. package/src/pool.ts +247 -36
  312. package/src/registration.ts +83 -4
  313. package/src/repos.ts +2 -1
  314. package/src/run-host.ts +565 -31
  315. package/src/run-output.ts +38 -0
  316. package/src/sandbox-effect.ts +273 -38
  317. package/src/sandbox-kube.ts +3 -1
  318. package/src/secret-placement.ts +52 -17
  319. package/src/server.ts +3 -0
  320. package/src/setup.ts +239 -56
  321. package/src/size.ts +121 -9
  322. package/src/snapshot-store.ts +54 -10
  323. package/src/stub-harness.ts +44 -16
  324. package/src/timers.ts +14 -1
  325. package/src/vocabulary.ts +69 -14
  326. package/src/wire.ts +90 -16
  327. package/src/workspace.ts +697 -175
@@ -0,0 +1,45 @@
1
+ ---
2
+ title: EventDef
3
+ description: "A workflow event, as `defineEvent` gives it back: plain, frozen data and a zod schema, safe to import anywhere."
4
+ ---
5
+
6
+ # `EventDef`
7
+
8
+ Type, in `src/define-event.ts` of `@jr2/agent-protocol`, a dependency of `@jr2/orchestrator`. 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 EventDef<Name extends string = string, Input extends z.ZodObject = z.ZodObject> = {
12
+ readonly name: Name;
13
+ readonly description?: string;
14
+ readonly input: Input;
15
+ readonly semantics: EventSemantics;
16
+ readonly audience?: EventAudience;
17
+ };
18
+ ```
19
+
20
+ A workflow event, as `defineEvent` gives it back: plain, frozen data and a zod schema, safe to
21
+ import anywhere. Give it to `jr2Setup({ events })`. A Machine accepts only the events in that
22
+ list.
23
+
24
+ **Fields**
25
+
26
+ - `name`: `Name`
27
+
28
+ The event's name: its xstate event `type`, and the name of its tool on the Agent's Menu.
29
+ - `description` (optional): `string`
30
+
31
+ What the event means. An Agent's model reads it as the tool's description.
32
+ - `input`: `Input`
33
+
34
+ The schema of the event's payload: a flat `z.object`, never a union.
35
+ - `semantics`: [`EventSemantics`](type-eventsemantics.md)
36
+
37
+ How the sender gets its answer: always `"ack"` on an event that `createMachine` accepts.
38
+ - `audience` (optional): [`EventAudience`](type-eventaudience.md)
39
+
40
+ Who may send the event. Absent: the state of each `on` key decides (see [`EventAudience`](type-eventaudience.md)).
41
+
42
+ **See also**
43
+
44
+ - [Write a Workflow](../../guides/write-a-workflow.md)
45
+ - [ADR-0011: Control events are workflow-defined and delivered by closure, not routed](../decisions/0011-workflow-defined-events.md)
@@ -0,0 +1,16 @@
1
+ ---
2
+ title: EventFrom
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `EventFrom`
7
+
8
+ Type, in `src/define-event.ts` of `@jr2/agent-protocol`, a dependency of `@jr2/orchestrator`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type EventFrom<D extends EventDef> =
12
+ D extends EventDef<infer N, infer I>
13
+ ?
14
+ { type: N } & (z.infer<I> extends Record<string, never> ? unknown : z.infer<I>)
15
+ : never;
16
+ ```
@@ -0,0 +1,26 @@
1
+ ---
2
+ title: EventSemantics
3
+ description: How the party that sends an event gets its answer.
4
+ ---
5
+
6
+ # `EventSemantics`
7
+
8
+ Type, in `src/define-event.ts` of `@jr2/agent-protocol`, a dependency of `@jr2/orchestrator`. 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 EventSemantics = "ack" | "poll";
12
+ ```
13
+
14
+ How the party that sends an event gets its answer.
15
+
16
+ - `"ack"`, the default: jr2 delivers the event and answers the sender. When the event starts
17
+ work inside the Agent's state, the answer comes when that work is done.
18
+ - `"poll"`: reserved. `createMachine` refuses it: ``machine "<id>": event "<name>" is `poll`,
19
+ which is reserved but NOT IMPLEMENTED (ADR-0013). Only `ack` events can be delivered today;
20
+ nothing drains a steer inbox, and degrading it to `ack` would hand the Agent a lying tool
21
+ contract.``
22
+
23
+ **See also**
24
+
25
+ - [The Menu](../../concepts/the-menu.md)
26
+ - [ADR-0006: The agent picks from a Machine-defined, schema-backed menu; it does not drive the workflow](../decisions/0006-agent-control-surface.md)
@@ -0,0 +1,34 @@
1
+ ---
2
+ title: ExecOutcome
3
+ description: How an exec ended.
4
+ ---
5
+
6
+ # `ExecOutcome`
7
+
8
+ Type, in `@jr2/orchestrator/src/wire.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 ExecOutcome =
12
+ | { outcome: "exited"; code: number; tail: string }
13
+ | { outcome: "timeout"; tail: string }
14
+ | { outcome: "killed"; signal: string; tail: string };
15
+ ```
16
+
17
+ How an exec ended. Every one is output; none is a fault.
18
+
19
+ **Forms**: it is one of these objects.
20
+
21
+ - Form 1: `outcome`, `code`, `tail`
22
+
23
+ - `outcome`: `"exited"`
24
+ - `code`: `number`
25
+ - `tail`: `string`
26
+ - Form 2: `outcome`, `tail`
27
+
28
+ - `outcome`: `"timeout"`
29
+ - `tail`: `string`
30
+ - Form 3: `outcome`, `signal`, `tail`
31
+
32
+ - `outcome`: `"killed"`
33
+ - `signal`: `string`
34
+ - `tail`: `string`
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: FailSlot
3
+ description: "The logic `fail()` returns: `failLogic` with the brand the walk reads."
4
+ ---
5
+
6
+ # `FailSlot`
7
+
8
+ Type, in `@jr2/orchestrator/src/fail.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 FailSlot = PromiseActorLogic<never, FailureInput> & { readonly [FAIL_SLOT]: true };
12
+ ```
13
+
14
+ The logic `fail()` returns: `failLogic` with the brand the walk reads.
@@ -0,0 +1,19 @@
1
+ ---
2
+ title: Failure
3
+ description: "A Failure as `isFailure` narrows an error to it: the payload's fields, on the error itself."
4
+ ---
5
+
6
+ # `Failure`
7
+
8
+ Type, in `@jr2/orchestrator/src/fail.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 Failure = { readonly reason: string; readonly detail?: unknown };
12
+ ```
13
+
14
+ A Failure as `isFailure` narrows an error to it: the payload's fields, on the error itself.
15
+
16
+ **Fields**
17
+
18
+ - `reason`: `string`
19
+ - `detail` (optional): `unknown`
@@ -0,0 +1,20 @@
1
+ ---
2
+ title: FailureInput
3
+ description: "What a Failure carries: `reason`, text for a person, and `detail`, optional JSON for a machine reader."
4
+ ---
5
+
6
+ # `FailureInput`
7
+
8
+ Type, in `@jr2/orchestrator/src/fail.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 FailureInput = { reason: string; detail?: unknown };
12
+ ```
13
+
14
+ What a Failure carries: `reason`, text for a person, and `detail`, optional JSON for a machine
15
+ reader. The input of `fail()` and the output of a run that ends `failed`.
16
+
17
+ **Fields**
18
+
19
+ - `reason`: `string`
20
+ - `detail` (optional): `unknown`
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: FileBody
3
+ description: "`file(path, { slot?, segments?, contentType? })`: a Worktree file as an `http` body."
4
+ ---
5
+
6
+ # `FileBody`
7
+
8
+ Type, in `@jr2/orchestrator/src/http-effect.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 FileBody<S extends z.ZodType | undefined = undefined> = {
12
+ readonly file: {
13
+ readonly path: FromInput<S, string>;
14
+ readonly slot?: string;
15
+ readonly segments?: FromInput<S, readonly string[]>;
16
+ readonly contentType?: string;
17
+ };
18
+ };
19
+ ```
20
+
21
+ `file(path, { slot?, segments?, contentType? })`: a Worktree file as an `http` body.
22
+
23
+ **Fields**
24
+
25
+ - `file`: `object`
26
+
27
+ - `path`: `FromInput<S, string>`
28
+
29
+ The file, relative to the Repo Slot's Worktree, or to `/work` in a Workspace with no Repo
30
+ Slot.
31
+ - `slot` (optional): `string`
32
+
33
+ The Repo Slot whose Worktree holds it. Write it only when the Workspace has more than one.
34
+ - `segments` (optional): `FromInput<S, readonly string[]>`
35
+
36
+ Path segments that jr2 adds to the end of the url, as `path` of `request` does for a json
37
+ or text body.
38
+ - `contentType` (optional): `string`
39
+
40
+ The content type of the body. Write it or a `content-type` header, not both. With neither,
41
+ it is `application/octet-stream`.
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: FromInput
3
+ description: "A value of a file body's part: as written, or from the Effect's input."
4
+ ---
5
+
6
+ # `FromInput`
7
+
8
+ Type, in `@jr2/orchestrator/src/http-effect.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 FromInput<S, T> = T | ((input: S extends z.ZodType ? z.infer<S> : void) => T);
12
+ ```
13
+
14
+ A value of a file body's part: as written, or from the Effect's input.
@@ -0,0 +1,58 @@
1
+ ---
2
+ title: HostInjectedInput
3
+ description: The fields that jr2 adds to the input of the Machine that a run starts, beside the input that the caller sent.
4
+ ---
5
+
6
+ # `HostInjectedInput`
7
+
8
+ Type, in `@jr2/orchestrator/src/vocabulary.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Machine and events.
9
+
10
+ ```ts
11
+ type HostInjectedInput = { instanceId: string };
12
+ ```
13
+
14
+ The fields that jr2 adds to the input of the Machine that a run starts, beside the input that
15
+ the caller sent. Today it is one field: `instanceId`, an id that jr2 makes for the run.
16
+
17
+ Add it to the type of your root Machine's input when the Machine reads it:
18
+ `HostInjectedInput & RunInput`. Do not put it in the `input` schema that a run starts with. No
19
+ caller sends it. jr2 writes it over any value that a caller sends.
20
+
21
+ Only the root Machine of a run gets it. A Machine that another Machine invokes gets the input
22
+ that its parent gives it. A `workspace()` passes its input to its body, so the body of a root
23
+ `workspace()` gets it too: `Workspaced<HostInjectedInput & RunInput, "app">`.
24
+
25
+ The `spec` of a root `workspace()` also gets it, and the type of its input shows it:
26
+ ``spec: ({ input }) => ({ branch: `fix/${input.instanceId}` })``.
27
+
28
+ It is not the run id. Use it, for example, to give each run a branch of its own.
29
+
30
+ **Fields**
31
+
32
+ - `instanceId`: `string`
33
+
34
+ **Example**
35
+
36
+ ```ts
37
+ import { z } from "zod";
38
+ import { jr2Setup, type HostInjectedInput } from "@jr2/orchestrator";
39
+
40
+ const runInput = z.object({ ticket: z.string() });
41
+ type Input = HostInjectedInput & z.infer<typeof runInput>;
42
+
43
+ export const machine = jr2Setup({
44
+ types: {} as { input: Input; context: Input; output: { run: string; ticket: string } },
45
+ }).createMachine({
46
+ id: "ticket",
47
+ input: runInput,
48
+ context: ({ input }) => input,
49
+ initial: "done",
50
+ states: { done: { type: "final" } },
51
+ output: ({ context }) => ({ run: context.instanceId, ticket: context.ticket }),
52
+ });
53
+ ```
54
+
55
+ **See also**
56
+
57
+ - [Write a Workflow](../../guides/write-a-workflow.md)
58
+ - [ADR-0033: A Machine declares the input that starts it](../decisions/0033-a-machine-declares-the-input-that-starts-it.md)
@@ -0,0 +1,101 @@
1
+ ---
2
+ title: HttpDefinition
3
+ description: "An `http` Effect's definition."
4
+ ---
5
+
6
+ # `HttpDefinition`
7
+
8
+ Type, in `@jr2/orchestrator/src/http-effect.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 HttpDefinition<S extends z.ZodType | undefined = undefined> = {
12
+ method: HttpMethod;
13
+ url: string | Text | typeof open;
14
+ headers?: Readonly<Record<string, string | Text>>;
15
+ auth?: { readonly bearer: Secret } | { readonly basic: { user: Text; password: Text } } | Text;
16
+ input?: S;
17
+ request?: (input: S extends z.ZodType ? z.infer<S> : void) => HttpRequestParts;
18
+ body?: FileBody<S>;
19
+ timeout?: Duration;
20
+ maxBody?: number;
21
+ idempotent?: boolean;
22
+ };
23
+ ```
24
+
25
+ An `http` Effect's definition.
26
+
27
+ **Fields**
28
+
29
+ - `method`: [`HttpMethod`](type-httpmethod.md)
30
+
31
+ The HTTP method: `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE` or `OPTIONS`. It refuses
32
+ another: `http({ method: "<method>" }): the method is one of GET, HEAD, POST, PUT, PATCH,
33
+ DELETE, OPTIONS`.
34
+ - `url`: `string | Text | typeof open`
35
+
36
+ The url: `http://` or `https://`, then a literal host. No input, param or Effect secret can
37
+ change where the call goes. An Effect secret can be only in the path:
38
+ `` text`https://api.telegram.org/bot${secret("tg")}/sendMessage` ``.
39
+
40
+ Or `open`: a packaged Machine that cannot know the host leaves the url Open, and the composer
41
+ binds it one time with `customize(machine, { effects: { <slot>: { url } } })`.
42
+
43
+ It refuses:
44
+ - a scheme or host that is not literal: `` http({ url }): the url is an http:// or https:// url
45
+ whose scheme and host are literal — a secret may sit only in its path, after a "/":
46
+ text`https://api.example.com/bot${secret("tg")}/send` (ADR-0068) ``
47
+ - an Effect secret after `?` or `#`: `` http({ url }): secret("<name>") sits in the url's query
48
+ or fragment — a secret may sit only in its path; send it in `auth` or a header instead:
49
+ headers: { "x-api-key": text`${secret("...")}` } (ADR-0068) ``
50
+ - a host that is not a host: `http({ url }): "<scheme>://<host>" is not a host`
51
+ - a user name or password in the url: ``http({ url }): the url carries userinfo — use `auth` ``
52
+ - `headers` (optional): `Readonly<Record<string, string | Text>>`
53
+
54
+ Headers that are the same for each run. Each name is lowercase. A value is a string, or a
55
+ `text` with an Effect secret.
56
+
57
+ It refuses:
58
+ - a name that is not lowercase, or that frames or routes the request (`host`,
59
+ `content-length`, `transfer-encoding`, `connection`, `upgrade`, `te`, `trailer`,
60
+ `keep-alive`, `proxy-*`): `http({ headers }): "<name>" is not a header an Effect sets — a
61
+ lowercase name that does not frame or route the request (ADR-0068)`
62
+ - an `authorization` header beside `auth`: ``http({ headers }): "authorization" is set by
63
+ `auth` — write one of them``
64
+ - `auth` (optional): `{ readonly bearer: Secret; } | { readonly basic: { user: Text; password: Text; }; } | Text`
65
+
66
+ The `Authorization` header: `bearer(secret("x"))`, `basic(user, password)`, or a `text` that
67
+ is the whole value.
68
+ - `input` (optional): `S`
69
+
70
+ The zod schema of the input of the Effect: what the `input` of the `invoke`, or `fromPick`,
71
+ gives it. jr2 parses the input with it before the call. When it starts, input that does not
72
+ agree with it makes the Effect fail (its `onError` route): `http "<slot>": its input does not
73
+ match the definition's input schema — <path>: <message>`, one `<path>: <message>` for each
74
+ problem, joined by `; `.
75
+ - `request` (optional): `(input: S extends z.ZodType ? z.infer<S> : void) => HttpRequestParts`
76
+
77
+ A function that makes the part of the request that changes for each run, from the input:
78
+ `path` segments, and a `json` or `text` body. It cannot change the host, a header or an
79
+ Effect secret. Do not write it beside `body`.
80
+ - `body` (optional): `FileBody<S>`
81
+
82
+ A Worktree file as the body: `file(path, { slot?, segments?, contentType? })`. The Effect then
83
+ runs in the Sandbox Effector of its Workspace. Do not write `request` beside it: the `segments`
84
+ of `file` are the path. It refuses another body: ``http({ body }): a body is file(path, {
85
+ slot?, segments?, contentType? }) — json and text come from `request` ``.
86
+ - `timeout` (optional): [`Duration`](type-duration.md)
87
+
88
+ How long jr2 waits for the answer: a number and a unit, such as `"30s"` or `"2m"`. Default
89
+ `"30s"`. With no answer in that time, the output is `unknown`. It refuses a value that is not
90
+ a positive duration: `http: timeout "<timeout>" is not a positive duration (like "30s",
91
+ "2m")`.
92
+ - `maxBody` (optional): `number`
93
+
94
+ The largest number of bytes of a text response body that the output keeps. Default 65536.
95
+ When jr2 cuts the body, `truncated` is `true`. It refuses a value that is not a positive whole
96
+ number: `http({ maxBody }): a positive number of bytes`.
97
+ - `idempotent` (optional): `boolean`
98
+
99
+ `true` when it is safe to send the call two times: it has its own idempotency key, or it only
100
+ reads. Default `false`. After an Orchestrator restart, jr2 cannot always tell if the call went
101
+ out. Then it sends an idempotent call again, and gives any other call the output `unknown`.
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: HttpInput
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `HttpInput`
7
+
8
+ Type, in `@jr2/orchestrator/src/http-effect.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type HttpInput<S> = S extends z.ZodType ? z.infer<S> : void;
12
+ ```
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: HttpMethod
3
+ description: "The method of an `http` Effect: `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE` or `OPTIONS`."
4
+ ---
5
+
6
+ # `HttpMethod`
7
+
8
+ Type, in `@jr2/orchestrator/src/effector-wire.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 HttpMethod = z.infer<typeof HttpMethodShape>;
12
+ ```
13
+
14
+ The method of an `http` Effect: `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE` or `OPTIONS`.
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: HttpOpenParts
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `HttpOpenParts`
7
+
8
+ Type, in `@jr2/orchestrator/src/http-effect.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
9
+
10
+ ```ts
11
+ type HttpOpenParts<U, A, H> = (U extends typeof open ? "url" : never) | OpenSecretIn<A | ValuesOf<H>>;
12
+ ```
@@ -0,0 +1,89 @@
1
+ ---
2
+ title: HttpOutput
3
+ description: "The output of an `http` Effect: what the `onDone` of its state gets as `event.output`."
4
+ ---
5
+
6
+ # `HttpOutput`
7
+
8
+ Type, in `@jr2/orchestrator/src/effector-wire.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ```ts
11
+ type HttpOutput = {
12
+ outcome: "response";
13
+ status: number;
14
+ headers: Record<string, string>;
15
+ contentType: string;
16
+ size: number;
17
+ body?: string | undefined;
18
+ truncated?: boolean | undefined;
19
+ } | {
20
+ outcome: "unknown" | "unreachable" | "refused";
21
+ reason: string;
22
+ };
23
+ ```
24
+
25
+ The output of an `http` Effect: what the `onDone` of its state gets as `event.output`. Every
26
+ outcome is output. A 4xx or 5xx status is output too. Route on `outcome`:
27
+
28
+ - `response`: an answer came back. `status` is its HTTP status. `headers`, `contentType` and
29
+ `size` tell about the body. `body` is there when the body is text: at most `maxBody` bytes
30
+ (`truncated` is `true` when jr2 cut it). A body that is not text gives only its size and
31
+ content type. jr2 replaces each value of an Effect secret that the Effector holds, and its
32
+ usual encodings, with `[secret:<name>]`, in the body and the headers.
33
+ - `unreachable`: the call did not go out, for example because the name did not resolve, or the
34
+ connection or TLS failed. `reason` tells why.
35
+ - `refused`: jr2 or the Effector refused the call, and nothing was sent. For example, a path
36
+ segment that is `.`, `..` or empty, or a request that is too large. `reason` tells why.
37
+ - `unknown`: the call can have gone out, but no answer came, or jr2 cannot tell after a restart.
38
+ `reason` tells why. jr2 does not send it again unless it is marked `idempotent`.
39
+
40
+ **Forms**: it is one of these objects.
41
+
42
+ - Form 1: `outcome`, `status`, `headers`, `contentType`, `size`, `body`, `truncated`
43
+
44
+ - `outcome`: `"response"`
45
+ - `status`: `number`
46
+ - `headers`: `Record<string, string>`
47
+ - `contentType`: `string`
48
+ - `size`: `number`
49
+ - `body` (optional): `string`
50
+ - `truncated` (optional): `boolean`
51
+ - Form 2: `outcome`, `reason`
52
+
53
+ - `outcome`: `"unknown" | "unreachable" | "refused"`
54
+ - `reason`: `string`
55
+
56
+ **Example**
57
+
58
+ ```ts
59
+ import { fail, http, jr2Setup, type HttpOutput } from "@jr2/orchestrator";
60
+
61
+ const ok = (output: HttpOutput): boolean => output.outcome === "response" && output.status < 300;
62
+
63
+ export const machine = jr2Setup({
64
+ actors: { health: http({ method: "GET", url: "https://app.example.com/healthz" }), fail: fail() },
65
+ }).createMachine({
66
+ id: "health",
67
+ initial: "checking",
68
+ states: {
69
+ checking: {
70
+ invoke: {
71
+ src: "health",
72
+ onDone: [
73
+ { guard: ({ event }) => ok(event.output), target: "healthy" },
74
+ { target: "unhealthy" },
75
+ ],
76
+ },
77
+ },
78
+ healthy: { type: "final" },
79
+ // Not a final state: the run ends `failed`, and `jr2 run` exits 1.
80
+ unhealthy: { invoke: { src: "fail", input: { reason: "the app is not healthy" } } },
81
+ },
82
+ });
83
+ ```
84
+
85
+ **See also**
86
+
87
+ - [Effects](../../concepts/effects.md)
88
+ - [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
89
+ - [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,33 @@
1
+ ---
2
+ title: HttpRequestParts
3
+ description: "What the `request` of an `http` definition returns: the part of the request that changes for each run."
4
+ ---
5
+
6
+ # `HttpRequestParts`
7
+
8
+ Type, in `@jr2/orchestrator/src/http-effect.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 HttpRequestParts = {
12
+ path?: readonly string[];
13
+ json?: unknown;
14
+ text?: string;
15
+ };
16
+ ```
17
+
18
+ What the `request` of an `http` definition returns: the part of the request that changes for
19
+ each run. The definition fixes the rest.
20
+
21
+ **Fields**
22
+
23
+ - `path` (optional): `readonly string[]`
24
+
25
+ Path segments that jr2 adds to the end of the url. jr2 encodes each segment. A segment that
26
+ is `.`, `..` or empty gives the output `refused`, and nothing is sent.
27
+ - `json` (optional): `unknown`
28
+
29
+ A JSON body. Do not give `text` too. When it starts, the Effect refuses both: ``http:
30
+ `request` returned both json and text``.
31
+ - `text` (optional): `string`
32
+
33
+ A text body.