@jr2/orchestrator 0.4.1 → 0.6.0

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 (361) 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 +478 -0
  10. package/docs/concepts/architecture.md +243 -0
  11. package/docs/concepts/charts.md +146 -0
  12. package/docs/concepts/composition.md +357 -0
  13. package/docs/concepts/converge.md +257 -0
  14. package/docs/concepts/durable-runs.md +189 -0
  15. package/docs/concepts/effects.md +658 -0
  16. package/docs/concepts/gates.md +208 -0
  17. package/docs/concepts/machines-and-workflows.md +298 -0
  18. package/docs/concepts/pools-and-sources.md +230 -0
  19. package/docs/concepts/secrets-and-trust.md +306 -0
  20. package/docs/concepts/the-menu.md +381 -0
  21. package/docs/concepts/workspaces.md +756 -0
  22. package/docs/get-started/a-model-decides.md +563 -0
  23. package/docs/get-started/an-agent-in-a-sandbox.md +383 -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 +993 -0
  27. package/docs/get-started/install.md +130 -0
  28. package/docs/guides/add-tools-to-the-sandbox.md +308 -0
  29. package/docs/guides/answer-a-gate.md +304 -0
  30. package/docs/guides/bind-open-parts.md +224 -0
  31. package/docs/guides/cancel-a-run.md +146 -0
  32. package/docs/guides/clean-up.md +206 -0
  33. package/docs/guides/cut-a-worktree.md +560 -0
  34. package/docs/guides/fix-a-failed-converge.md +361 -0
  35. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  36. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  37. package/docs/guides/let-an-agent-write-a-chart.md +230 -0
  38. package/docs/guides/look-inside-a-sandbox.md +177 -0
  39. package/docs/guides/mirror-the-kit-images.md +176 -0
  40. package/docs/guides/move-from-kind-to-a-shared-cluster.md +318 -0
  41. package/docs/guides/open-the-console.md +91 -0
  42. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  43. package/docs/guides/push-and-sign-a-branch.md +532 -0
  44. package/docs/guides/run-a-chart-by-name.md +270 -0
  45. package/docs/guides/run-a-command-or-call-a-url.md +587 -0
  46. package/docs/guides/run-one-worker-per-item.md +322 -0
  47. package/docs/guides/set-an-agents-access-and-dials.md +420 -0
  48. package/docs/guides/size-a-workspace.md +217 -0
  49. package/docs/guides/start-a-run-from-a-run.md +237 -0
  50. package/docs/guides/start-a-run.md +207 -0
  51. package/docs/guides/upgrade-the-kit-version.md +240 -0
  52. package/docs/guides/use-a-hosted-provider.md +214 -0
  53. package/docs/guides/use-a-local-model.md +313 -0
  54. package/docs/guides/watch-a-run.md +349 -0
  55. package/docs/guides/write-a-workflow.md +318 -0
  56. package/docs/index.md +44 -0
  57. package/docs/llms.txt +237 -0
  58. package/docs/reference/authoring-surface/agent.md +151 -0
  59. package/docs/reference/authoring-surface/answer.md +156 -0
  60. package/docs/reference/authoring-surface/arg.md +82 -0
  61. package/docs/reference/authoring-surface/basic.md +62 -0
  62. package/docs/reference/authoring-surface/bearer.md +53 -0
  63. package/docs/reference/authoring-surface/branchname.md +15 -0
  64. package/docs/reference/authoring-surface/chartschema.md +23 -0
  65. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  66. package/docs/reference/authoring-surface/command.md +206 -0
  67. package/docs/reference/authoring-surface/customize.md +64 -0
  68. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  69. package/docs/reference/authoring-surface/defineevent.md +114 -0
  70. package/docs/reference/authoring-surface/dispatch.md +126 -0
  71. package/docs/reference/authoring-surface/fail.md +96 -0
  72. package/docs/reference/authoring-surface/file.md +142 -0
  73. package/docs/reference/authoring-surface/frompick.md +277 -0
  74. package/docs/reference/authoring-surface/http.md +259 -0
  75. package/docs/reference/authoring-surface/isfailure.md +58 -0
  76. package/docs/reference/authoring-surface/isready.md +14 -0
  77. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  78. package/docs/reference/authoring-surface/open.md +105 -0
  79. package/docs/reference/authoring-surface/openbody.md +86 -0
  80. package/docs/reference/authoring-surface/paramsof.md +143 -0
  81. package/docs/reference/authoring-surface/pool.md +186 -0
  82. package/docs/reference/authoring-surface/push.md +130 -0
  83. package/docs/reference/authoring-surface/readyof.md +21 -0
  84. package/docs/reference/authoring-surface/secret.md +139 -0
  85. package/docs/reference/authoring-surface/sentby.md +83 -0
  86. package/docs/reference/authoring-surface/source.md +51 -0
  87. package/docs/reference/authoring-surface/text.md +62 -0
  88. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  89. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  90. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  91. package/docs/reference/authoring-surface/type-agentslots.md +15 -0
  92. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  93. package/docs/reference/authoring-surface/type-anyframepath.md +14 -0
  94. package/docs/reference/authoring-surface/type-anyworktreepath.md +15 -0
  95. package/docs/reference/authoring-surface/type-arg.md +19 -0
  96. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  97. package/docs/reference/authoring-surface/type-bindactors.md +14 -0
  98. package/docs/reference/authoring-surface/type-binding.md +61 -0
  99. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  100. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  101. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  102. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  103. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  104. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  105. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  106. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  107. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  108. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  109. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  110. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  111. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  112. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  113. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  114. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  115. package/docs/reference/authoring-surface/type-childat.md +12 -0
  116. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  117. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  118. package/docs/reference/authoring-surface/type-commandinput.md +20 -0
  119. package/docs/reference/authoring-surface/type-commandoptions.md +56 -0
  120. package/docs/reference/authoring-surface/type-commandoutput.md +122 -0
  121. package/docs/reference/authoring-surface/type-customize.md +111 -0
  122. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  123. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  124. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  125. package/docs/reference/authoring-surface/type-dispatchoutput.md +72 -0
  126. package/docs/reference/authoring-surface/type-doorlessinput.md +19 -0
  127. package/docs/reference/authoring-surface/type-duration.md +15 -0
  128. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  129. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  130. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  131. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  132. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  133. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  134. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  135. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  136. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  137. package/docs/reference/authoring-surface/type-failure.md +19 -0
  138. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  139. package/docs/reference/authoring-surface/type-filebody.md +37 -0
  140. package/docs/reference/authoring-surface/type-framepath.md +14 -0
  141. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  142. package/docs/reference/authoring-surface/type-hostinjectedinput.md +56 -0
  143. package/docs/reference/authoring-surface/type-httpdefinition.md +104 -0
  144. package/docs/reference/authoring-surface/type-httpfileinput.md +20 -0
  145. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  146. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  147. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  148. package/docs/reference/authoring-surface/type-httpoutput.md +95 -0
  149. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  150. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  151. package/docs/reference/authoring-surface/type-lateroutcome.md +21 -0
  152. package/docs/reference/authoring-surface/type-lends.md +38 -0
  153. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  154. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  155. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  156. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  157. package/docs/reference/authoring-surface/type-namestart.md +77 -0
  158. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +27 -0
  159. package/docs/reference/authoring-surface/type-notworktreekeys.md +12 -0
  160. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  161. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  162. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  163. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  164. package/docs/reference/authoring-surface/type-opencommandinput.md +22 -0
  165. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  166. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  167. package/docs/reference/authoring-surface/type-openof.md +12 -0
  168. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  169. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  170. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +26 -0
  171. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +27 -0
  172. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  173. package/docs/reference/authoring-surface/type-poolnextinput.md +22 -0
  174. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  175. package/docs/reference/authoring-surface/type-pushinput.md +34 -0
  176. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  177. package/docs/reference/authoring-surface/type-pushoutput.md +149 -0
  178. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  179. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  180. package/docs/reference/authoring-surface/type-reached.md +12 -0
  181. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  182. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  183. package/docs/reference/authoring-surface/type-sandboxoptions.md +84 -0
  184. package/docs/reference/authoring-surface/type-secret.md +25 -0
  185. package/docs/reference/authoring-surface/type-sender.md +19 -0
  186. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  187. package/docs/reference/authoring-surface/type-size.md +85 -0
  188. package/docs/reference/authoring-surface/type-slothandles.md +24 -0
  189. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  190. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  191. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  192. package/docs/reference/authoring-surface/type-text.md +19 -0
  193. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  194. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  195. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  196. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  197. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  198. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  199. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  200. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  201. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  202. package/docs/reference/authoring-surface/type-workspaced.md +115 -0
  203. package/docs/reference/authoring-surface/type-workspacehandles.md +22 -0
  204. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  205. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  206. package/docs/reference/authoring-surface/type-workspaceoptions.md +27 -0
  207. package/docs/reference/authoring-surface/type-worktreefound.md +16 -0
  208. package/docs/reference/authoring-surface/type-worktreeinput.md +56 -0
  209. package/docs/reference/authoring-surface/type-worktreekey.md +14 -0
  210. package/docs/reference/authoring-surface/type-worktreeoptions.md +29 -0
  211. package/docs/reference/authoring-surface/type-worktreeoutput.md +45 -0
  212. package/docs/reference/authoring-surface/type-worktreepath.md +16 -0
  213. package/docs/reference/authoring-surface/type-worktreeready.md +37 -0
  214. package/docs/reference/authoring-surface/type-worktreerefused.md +21 -0
  215. package/docs/reference/authoring-surface/workspace.md +287 -0
  216. package/docs/reference/authoring-surface/worktree.md +71 -0
  217. package/docs/reference/authoring-surface.md +217 -0
  218. package/docs/reference/cli.md +433 -0
  219. package/docs/reference/config.md +765 -0
  220. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +114 -0
  221. package/docs/reference/decisions/0002-duplex-streaming-actor.md +117 -0
  222. package/docs/reference/decisions/0004-worktree-provisioning-model.md +130 -0
  223. package/docs/reference/decisions/0005-sandbox-pod-composition.md +240 -0
  224. package/docs/reference/decisions/0006-agent-control-surface.md +50 -0
  225. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  226. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  227. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  228. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  229. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  230. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  231. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +175 -0
  232. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  233. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +271 -0
  234. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +126 -0
  235. package/docs/reference/decisions/0017-pool-over-a-source-port.md +71 -0
  236. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  237. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +287 -0
  238. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  239. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +101 -0
  240. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  241. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +175 -0
  242. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +436 -0
  243. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  244. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  245. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +245 -0
  246. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +90 -0
  247. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  248. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  249. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +193 -0
  250. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  251. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +126 -0
  252. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  253. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  254. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  255. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  256. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  257. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  258. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  259. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  260. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  261. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  262. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  263. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  264. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  265. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  266. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  267. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  268. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +238 -0
  269. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +86 -0
  270. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +123 -0
  271. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  272. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  273. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  274. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  275. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +108 -0
  276. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +427 -0
  277. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  278. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  279. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +239 -0
  280. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +82 -0
  281. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  282. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  283. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +552 -0
  284. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +458 -0
  285. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +475 -0
  286. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  287. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +334 -0
  288. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  289. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  290. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  291. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  292. package/docs/reference/decisions/0075-a-machine-cuts-a-worktree-and-the-workspace-only-clones.md +295 -0
  293. package/docs/reference/decisions/0076-an-agents-control-credential-lives-only-where-no-workspace-code-runs.md +320 -0
  294. package/docs/reference/decisions/0077-jr2-requires-landlock-on-every-sandbox-node.md +79 -0
  295. package/docs/reference/decisions.md +86 -0
  296. package/docs/reference/glossary.md +687 -0
  297. package/docs/reference/http-api.md +1386 -0
  298. package/docs/reference/machines.md +189 -0
  299. package/docs/reference/mechanism-events.md +72 -0
  300. package/docs/why.md +207 -0
  301. package/package.json +5 -3
  302. package/src/actor.ts +694 -106
  303. package/src/agent.ts +114 -38
  304. package/src/ambient.ts +3 -4
  305. package/src/assembly-checks.ts +189 -7
  306. package/src/cause.ts +234 -0
  307. package/src/chart.ts +345 -46
  308. package/src/charts.ts +43 -8
  309. package/src/config.ts +440 -178
  310. package/src/custodian.lua +17 -5
  311. package/src/custodian.ts +325 -99
  312. package/src/customize.ts +199 -49
  313. package/src/dispatch-effect.ts +945 -0
  314. package/src/door-compat.ts +217 -0
  315. package/src/durability.ts +11 -4
  316. package/src/effect-checks.ts +50 -3
  317. package/src/effect.ts +641 -128
  318. package/src/effector-wire.ts +165 -13
  319. package/src/fail.ts +222 -0
  320. package/src/harness-client.ts +587 -50
  321. package/src/harness-env.ts +33 -0
  322. package/src/held-secrets.ts +125 -16
  323. package/src/holds.ts +3 -0
  324. package/src/http-effect.ts +556 -58
  325. package/src/http.ts +480 -30
  326. package/src/index.ts +74 -82
  327. package/src/instance.ts +68 -8
  328. package/src/internal.ts +85 -0
  329. package/src/kube-client.ts +6 -3
  330. package/src/machine-doc.ts +24 -7
  331. package/src/mechanism-routes.ts +168 -0
  332. package/src/model-keys.generated.ts +53 -0
  333. package/src/model-keys.ts +42 -58
  334. package/src/names.ts +19 -6
  335. package/src/notices.ts +483 -41
  336. package/src/open-body.ts +242 -40
  337. package/src/open-effect.ts +81 -8
  338. package/src/open.ts +90 -6
  339. package/src/parts.ts +213 -30
  340. package/src/party.ts +101 -2
  341. package/src/pick.ts +497 -11
  342. package/src/pool.ts +282 -50
  343. package/src/registration.ts +133 -12
  344. package/src/repo-identity.ts +7 -3
  345. package/src/repos.ts +22 -3
  346. package/src/run-host.ts +665 -45
  347. package/src/run-output.ts +38 -0
  348. package/src/sandbox-effect.ts +457 -71
  349. package/src/sandbox-kube.ts +66 -17
  350. package/src/secret-placement.ts +59 -17
  351. package/src/server.ts +3 -0
  352. package/src/setup.ts +325 -62
  353. package/src/size.ts +121 -9
  354. package/src/snapshot-store.ts +54 -10
  355. package/src/stub-harness.ts +44 -16
  356. package/src/timers.ts +14 -1
  357. package/src/tokens.ts +107 -32
  358. package/src/vocabulary.ts +88 -14
  359. package/src/wire.ts +100 -26
  360. package/src/workspace.ts +771 -238
  361. package/src/worktree.ts +249 -0
@@ -0,0 +1,93 @@
1
+ ---
2
+ title: EffectBinding
3
+ description: The values that bind the Open parts of one Effect.
4
+ ---
5
+
6
+ # `EffectBinding`
7
+
8
+ Type, in `@jr2/orchestrator/src/open-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
9
+
10
+ ```ts
11
+ type EffectBinding = {
12
+ readonly url?: string | Text;
13
+ readonly argv?: readonly (string | Arg)[];
14
+ readonly secret?: string;
15
+ readonly target?: { readonly url: string; readonly token: Secret };
16
+ };
17
+ ```
18
+
19
+ The values that bind the Open parts of one Effect. A packaged Machine leaves a part of an Effect
20
+ Open when it cannot know it. That part is the url of an `http` Effect, the argv of a `command`,
21
+ the name of a secret, written `secret(open)`, or the target of a `dispatch`: the url of another
22
+ Orchestrator and the secret that holds its Instance token, bound as one. You bind it once, where you register the
23
+ Machine, with `customize(machine, { effects: { <slot>: binding } })`. Each key binds one Open
24
+ part. For an Effect with two Open parts, one object holds both keys.
25
+
26
+ The binding is a value, never a function of the run: no run chooses an Effect's url, argv or
27
+ secret. `customize()` builds the Effect again with the bound parts, so a bound part gets every
28
+ check that a part written in the definition gets.
29
+
30
+ `customize()` refuses:
31
+ - an empty binding, or a key for a part that is not Open: `customize(): the <kind> Effect
32
+ "<slot>" leaves its <parts> Open — bind it with <binding> (ADR-0054)`
33
+ - an Effect with no Open part: ``customize(): the <kind> Effect "<slot>" of machine "<id>"
34
+ leaves nothing Open — its parts are fixed in its definition, and only a part a package left
35
+ `open` is bound, once (ADR-0054).``
36
+ - `open` as a value: ``customize(): the <kind> Effect "<slot>"'s <part> is bound once, to a
37
+ value — not `open` again: no run chooses an Effect's <part> (ADR-0054)``. A function as a
38
+ value gives the same text, with `a function of the run` for `` `open` again ``.
39
+ - a secret that is not a string: `customize(): the <kind> Effect "<slot>"'s secret is bound to
40
+ a secret's name, a string — the file the Effector reads it from: { secret: "<name>" }
41
+ (ADR-0054, ADR-0068)`
42
+
43
+ `jr2 up` refuses a registered Machine with an Open part that nobody bound, and prints the
44
+ `customize` line that binds it.
45
+
46
+ **Fields**
47
+
48
+ - `url` (optional): `string | Text`
49
+
50
+ The url of an `http` Effect whose url is Open: a string, or a `text` template with a secret
51
+ in its path, such as `` text`https://hooks.example.com/services/${secret("hook")}` ``. Its
52
+ scheme and host must be literal.
53
+ - `argv` (optional): `readonly (string | Arg)[]`
54
+
55
+ The argv of a `command` whose argv is Open: one entry for each argument, never shell text.
56
+ An entry is a string or an `arg("<param>")` that the invoke's input fills. It must not be
57
+ empty.
58
+ - `secret` (optional): `string`
59
+
60
+ The name of the secret that `secret(open)` stands for: an entry of `secrets` in
61
+ `jr2.config.ts`. The Effector reads it from a file of that name.
62
+ - `target` (optional): `object`
63
+
64
+ - `url`: `string`
65
+ - `token`: [`Secret`](type-secret.md)
66
+
67
+ **Example**
68
+
69
+ ```ts
70
+ import { customize, http, jr2Setup, open, type EffectBinding } from "@jr2/orchestrator";
71
+
72
+ const notifier = jr2Setup({
73
+ actors: { notify: http({ method: "POST", url: open }) },
74
+ }).createMachine({
75
+ id: "notifier",
76
+ initial: "sending",
77
+ states: {
78
+ sending: { invoke: { src: "notify", onDone: "done" } },
79
+ done: { type: "final" },
80
+ },
81
+ });
82
+
83
+ const notify = { url: "https://hooks.example.com/build" } satisfies EffectBinding;
84
+
85
+ export const machine = customize(notifier, { effects: { notify } });
86
+ ```
87
+
88
+ **See also**
89
+
90
+ - [Bind a shipped Machine's Open parts](../../guides/bind-open-parts.md)
91
+ - [Effects](../../concepts/effects.md)
92
+ - [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)
93
+ - [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)
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: EffectLogic
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `EffectLogic`
7
+
8
+ Type, in `@jr2/orchestrator/src/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 EffectLogic<I, O> = ActorLogic<EffectSnapshot<O, I>, EventObject, I> & EffectSlot;
12
+ ```
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: EnvOpenParts
3
+ description: A type that the Authoring surface names.
4
+ ---
5
+
6
+ # `EnvOpenParts`
7
+
8
+ Type, in `@jr2/orchestrator/src/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 EnvOpenParts<Opt> = Opt extends { readonly env: infer E }
12
+ ? OpenSecretIn<E extends Readonly<Record<string, infer V>> ? V : never>
13
+ : never;
14
+ ```
@@ -0,0 +1,27 @@
1
+ ---
2
+ title: EventAudience
3
+ description: "Who may send an event: `\"agent\"` (an Agent, as a pick from its Menu), `\"external\"` (the caller of a Gate), or `\"any\"` (both)."
4
+ ---
5
+
6
+ # `EventAudience`
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 EventAudience = "agent" | "external" | "any";
12
+ ```
13
+
14
+ Who may send an event: `"agent"` (an Agent, as a pick from its Menu), `"external"` (the caller of
15
+ a Gate), or `"any"` (both).
16
+
17
+ Leave it unset in most cases. Then the position of each `on` key decides: the event belongs to
18
+ the party that its state, or the nearest state above it, invokes. An `on` key on a state that
19
+ invokes no party, with no such state above it, belongs to both. Set an audience only to give an
20
+ event to the other party too (`"any"`). Or set it to keep an event on the root from one party
21
+ (`"agent"` or `"external"`).
22
+
23
+ **See also**
24
+
25
+ - [The Menu](../../concepts/the-menu.md)
26
+ - [Gates](../../concepts/gates.md)
27
+ - [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,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,37 @@
1
+ ---
2
+ title: FileBody
3
+ description: "`file(path, { 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 segments?: FromInput<S, readonly string[]>;
15
+ readonly contentType?: string;
16
+ };
17
+ };
18
+ ```
19
+
20
+ `file(path, { segments?, contentType? })`: a Worktree file as an `http` body.
21
+
22
+ **Fields**
23
+
24
+ - `file`: `object`
25
+
26
+ - `path`: `FromInput<S, string>`
27
+
28
+ The file, relative to the Worktree that `worktree` of the Effect's input names, or to `/work`
29
+ in a Workspace with no Repo Slot.
30
+ - `segments` (optional): `FromInput<S, readonly string[]>`
31
+
32
+ Path segments that jr2 adds to the end of the url, as `path` of `request` does for a json
33
+ or text body.
34
+ - `contentType` (optional): `string`
35
+
36
+ The content type of the body. Write it or a `content-type` header, not both. With neither,
37
+ it is `application/octet-stream`.
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: FramePath
3
+ description: "A Turn's Frame in a Workspace with the Repo Slots `S`."
4
+ ---
5
+
6
+ # `FramePath`
7
+
8
+ Type, in `@jr2/orchestrator/src/worktree.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ```ts
11
+ type FramePath<S extends string> = WorktreePath<S> | "/work";
12
+ ```
13
+
14
+ A Turn's Frame in a Workspace with the Repo Slots `S`.
@@ -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,56 @@
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">`. For example, a cut
24
+ can name a branch for each run: `` branch: `fix/${context.instanceId}` ``.
25
+
26
+ It is not the run id. Use it, for example, to give each run a branch of its own.
27
+
28
+ **Fields**
29
+
30
+ - `instanceId`: `string`
31
+
32
+ **Example**
33
+
34
+ ```ts
35
+ import { z } from "zod";
36
+ import { jr2Setup, type HostInjectedInput } from "@jr2/orchestrator";
37
+
38
+ const runInput = z.object({ ticket: z.string() });
39
+ type Input = HostInjectedInput & z.infer<typeof runInput>;
40
+
41
+ export const machine = jr2Setup({
42
+ types: {} as { input: Input; context: Input; output: { run: string; ticket: string } },
43
+ }).createMachine({
44
+ id: "ticket",
45
+ input: runInput,
46
+ context: ({ input }) => input,
47
+ initial: "done",
48
+ states: { done: { type: "final" } },
49
+ output: ({ context }) => ({ run: context.instanceId, ticket: context.ticket }),
50
+ });
51
+ ```
52
+
53
+ **See also**
54
+
55
+ - [Write a Workflow](../../guides/write-a-workflow.md)
56
+ - [ADR-0033: A Machine declares the input that starts it](../decisions/0033-a-machine-declares-the-input-that-starts-it.md)
@@ -0,0 +1,104 @@
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, { segments?, contentType? })`. The Effect then
83
+ runs in the Sandbox Effector of its Workspace. Under a Workspace with Repo Slots, the invoke's
84
+ input names a Worktree that a cut of this run made, in `worktree`; with none, it refuses when
85
+ it starts: ``http "<slot>" reads a Worktree file, under a Workspace with Repo Slots, and its
86
+ input names no `worktree` ``. Do not write `request` beside it: the `segments`
87
+ of `file` are the path. It refuses another body: ``http({ body }): a body is file(path, {
88
+ segments?, contentType? }) — json and text come from `request` ``.
89
+ - `timeout` (optional): [`Duration`](type-duration.md)
90
+
91
+ How long jr2 waits for the answer: a number and a unit, such as `"30s"` or `"2m"`. Default
92
+ `"30s"`. With no answer in that time, the output is `unknown`. It refuses a value that is not
93
+ a positive duration: `http: timeout "<timeout>" is not a positive duration (like "30s",
94
+ "2m")`.
95
+ - `maxBody` (optional): `number`
96
+
97
+ The largest number of bytes of a text response body that the output keeps. Default 65536.
98
+ When jr2 cuts the body, `truncated` is `true`. It refuses a value that is not a positive whole
99
+ number: `http({ maxBody }): a positive number of bytes`.
100
+ - `idempotent` (optional): `boolean`
101
+
102
+ `true` when it is safe to send the call two times: it has its own idempotency key, or it only
103
+ reads. Default `false`. After an Orchestrator restart, jr2 cannot always tell if the call went
104
+ out. Then it sends an idempotent call again, and gives any other call the output `unknown`.
@@ -0,0 +1,20 @@
1
+ ---
2
+ title: HttpFileInput
3
+ description: The input of an `http` Effect with a Worktree file as its body.
4
+ ---
5
+
6
+ # `HttpFileInput`
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 HttpFileInput<S> = (S extends z.ZodType ? z.infer<S> : unknown) & { worktree?: AnyWorktreePath };
12
+ ```
13
+
14
+ The input of an `http` Effect with a Worktree file as its body. Under a Workspace with Repo
15
+ Slots, `worktree` names the Worktree. In a Workspace with no Repo Slot, the input has no
16
+ `worktree`, and the path is relative to `/work`.
17
+
18
+ **Fields**
19
+
20
+ - `worktree` (optional): [`AnyWorktreePath`](type-anyworktreepath.md)
@@ -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
+ ```