@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,151 @@
1
+ ---
2
+ title: agent
3
+ description: "Make an Agent: an actor slot that runs one Turn of a model each time a state invokes it."
4
+ ---
5
+
6
+ # `agent`
7
+
8
+ Function, in `@jr2/orchestrator/src/harness-client.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Agents.
9
+
10
+ ```ts
11
+ function agent<
12
+ const D extends AgentDeclaration,
13
+ >(
14
+ declaration: D,
15
+ ): AgentLogic & (D extends { workspace: "none" } ? { readonly definition: { readonly workspace: "none" } } : unknown)
16
+ ```
17
+
18
+ Make an Agent: an actor slot that runs one Turn of a model each time a state invokes it. Put it
19
+ under `actors` in `jr2Setup`, and invoke it by its key: `actors: { coder: agent(…) }`, then
20
+ `invoke: { src: "coder", input: { prompt } }`. The key is the Agent's name.
21
+
22
+ The invoke's `input` is the Turn: `prompt` (required), `cwd`, `model`, `thinkingLevel` and
23
+ `continue`. `cwd` is the absolute directory where the Working tools work. Under Repo Slots it
24
+ is required: a Worktree that a cut made, `<slot>/default` to read, or `/work`. An Agent with
25
+ `workspace: "none"`, and a Workspace with no Repo Slot, need no `cwd`. `continue: true` continues the Agent's conversation
26
+ in this Machine. Absent, each Turn starts a new conversation. `continue` is the literal `true`,
27
+ not a `boolean`. A Turn can join only a conversation that an earlier Turn started with
28
+ `continue: true`. Thus in a retry loop, put `continue: true` on each Turn, also on the first, so
29
+ that attempt 2 sees attempt 1. Then a Runaway on the first Turn gets no second start, because a
30
+ continued Turn gets none ([ADR-0035](../decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md)). Spread it only when a state must start a clean conversation
31
+ on some Turns only: `...(context.clean ? {} : { continue: true as const })`. A clean Turn does not
32
+ start the continued conversation again: the next Turn with `continue: true` joins the earlier
33
+ one. The Turn ends when the state that invoked the Agent exits, usually on a pick from the
34
+ Agent's Menu.
35
+
36
+ The actor of an Agent never finishes, so an `onDone` on its invoke never runs. Give the Agent a
37
+ pick, such as `finish`, and route on it. When a Turn fails with no pick, jr2 sends the event
38
+ `agent.fault` to the Machine. It is an event, not an error of the invoke, so an `onError` does
39
+ not get it. Route it on each state that invokes an Agent, or once on a state above them:
40
+ `on: { "agent.fault": "failed" }`. `jr2 check` and `jr2 up` refuse a state that invokes an
41
+ Agent with no route for it, and an `agent.fault` that no transition takes ends the run `error`.
42
+
43
+ An Agent with `workspace: "write"` or `"read"` works in a Sandbox, so invoke it inside a
44
+ `workspace()` body. An Agent with `workspace: "none"` can run anywhere. A model can lack the
45
+ definition's thinking level: see [`ThinkingLevel`](type-thinkinglevel.md).
46
+
47
+ When a Turn starts, it refuses:
48
+ - a key in `input` that a Turn does not have: ``agent "<slot>": the Turn's input carries
49
+ `<key>`, which a Turn has no use for — its input is its Frame (`prompt`, `cwd`), its Dials
50
+ (`model`, `thinkingLevel`), and `continue` (ADR-0057)``
51
+ - no `cwd` under Repo Slots: ``turn <id>: agent "<slot>" works under a Workspace with Repo Slots
52
+ (<slots>) and its Turn framed no `cwd`: say where it works, a Worktree, or `cwd: "/work"` above
53
+ them (ADR-0057)``
54
+ - a `cwd` that is not an absolute path: ``agent "<slot>": the Turn's Frame carries a `cwd` that
55
+ is not an absolute path — the Frame says WHERE this Turn works (ADR-0057), and a Turn rooted
56
+ anywhere else would work in the wrong directory silently``. The Harness makes this refusal
57
+ when it admits the Turn, and the error starts with `harness admission failed (400): `.
58
+ - an Agent with Working tools outside a `workspace()`: ``turn <id>: agent "<slot>" has
59
+ workspace: "<access>" — invoke it inside a workspace() (ambient resolution), or pass an
60
+ explicit `endpoint` (workspace-less stub path)``
61
+ - a `model` that is still `open`: ``agent "<slot>" has an Open model — nobody bound it; bind it
62
+ where the Machine is registered (`customize(<machine>, { agents: { <slot>: { model:
63
+ "<provider>/<model>" } } })`), because a packaged Machine cannot pick a model on your behalf
64
+ (ADR-0054)``. `jr2 up` refuses this before it builds anything.
65
+
66
+ **Parameters**
67
+
68
+ - `declaration` ([`AgentDeclaration`](type-agentdeclaration.md)): The Agent's definition (see [`AgentDefinition`](type-agentdefinition.md)). `model` may be `open`
69
+ in a Machine that you publish as a package.
70
+
71
+ **Returns**: The actor logic of the Agent's slot.
72
+
73
+ **Example**
74
+
75
+ ```ts
76
+ import { z } from "zod";
77
+ import {
78
+ agent,
79
+ defineEvent,
80
+ fail,
81
+ isReady,
82
+ jr2Setup,
83
+ workspace,
84
+ worktree,
85
+ type Workspaced,
86
+ } from "@jr2/orchestrator";
87
+
88
+ const finish = defineEvent({
89
+ name: "finish",
90
+ description: "Call this when `node --test` passes.",
91
+ input: z.object({}),
92
+ });
93
+ const runInput = z.object({ branch: z.string() });
94
+ type BodyInput = Workspaced<z.infer<typeof runInput>, "app">;
95
+
96
+ const fixTree = (context: BodyInput) => `${context.workspace.repos.app}/fix` as const;
97
+
98
+ const body = jr2Setup({
99
+ types: {} as { input: BodyInput; context: BodyInput },
100
+ events: [finish],
101
+ actors: {
102
+ coder: agent({
103
+ model: "anthropic/claude-haiku-5-5",
104
+ instructions: "You fix failing tests. You change no test.",
105
+ }),
106
+ cut: worktree(),
107
+ fail: fail(),
108
+ },
109
+ }).createMachine({
110
+ id: "fix",
111
+ context: ({ input }) => input,
112
+ on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
113
+ initial: "cutting",
114
+ states: {
115
+ cutting: {
116
+ invoke: {
117
+ src: "cut",
118
+ input: ({ context }) => ({ path: fixTree(context), branch: context.branch }),
119
+ onDone: [{ guard: ({ event }) => isReady(event.output), target: "coding" }, { target: "notCut" }],
120
+ },
121
+ },
122
+ coding: {
123
+ invoke: {
124
+ src: "coder",
125
+ input: ({ context }) => ({
126
+ prompt: "Make `node --test` pass, then commit.",
127
+ cwd: fixTree(context),
128
+ thinkingLevel: "high",
129
+ }),
130
+ },
131
+ on: { finish: "done" },
132
+ },
133
+ done: { type: "final" },
134
+ notCut: { invoke: { src: "fail", input: { reason: "the Worktree was not cut" } } },
135
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
136
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
137
+ },
138
+ });
139
+
140
+ export const machine = workspace(body, {
141
+ input: runInput,
142
+ repos: { app: "https://github.com/you/app.git" },
143
+ });
144
+ ```
145
+
146
+ **See also**
147
+
148
+ - [Agents and Turns](../../concepts/agents-and-turns.md)
149
+ - [Write a Workflow](../../guides/write-a-workflow.md)
150
+ - [ADR-0049: A Machine carries its parts and composes by invoke](../decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md)
151
+ - [ADR-0057: A Turn is its Frame, its Dials, and whether it continues](../decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md)
@@ -0,0 +1,156 @@
1
+ ---
2
+ title: answer
3
+ description: Set what the Agent reads when jr2 answers its pick.
4
+ ---
5
+
6
+ # `answer`
7
+
8
+ Function, in `@jr2/orchestrator/src/pick.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ```ts
11
+ function answer<
12
+ TContext extends MachineContext,
13
+ TExpressionEvent extends EventObject,
14
+ TParams extends ParameterizedObject["params"] | undefined,
15
+ TEvent extends EventObject,
16
+ TActor extends ProvidedActor,
17
+ >(
18
+ fn: (args: { context: TContext; event: TExpressionEvent; chain: readonly ChainLink<TActor, TEvent>[] }) => unknown,
19
+ ): ActionFunction<TContext, TExpressionEvent, TEvent, TParams, TActor, never, never, never, never> & AnswerAction
20
+ ```
21
+
22
+ Set what the Agent reads when jr2 answers its pick. It is an xstate action: write it in
23
+ `entry`, `exit` or the `actions` of a transition. Without it, the Agent reads the last reply
24
+ since the pick.
25
+
26
+ `fn` gets `{ context, event, chain }`. `chain` is every reply since the pick, oldest first. Each
27
+ link is `{ kind: "output", src, output }`, the output of an invoked actor, or `{ kind: "event",
28
+ event }`, an event that a Gate or a nested Agent sent. TypeScript types each link, but not the
29
+ order or the number of links. What `fn` gives back goes to the Agent as JSON. A value with no
30
+ JSON form clears the answer: the Agent then reads the last reply. When more than one `answer`
31
+ runs, the last one wins.
32
+
33
+ Where you write it decides which pick it answers:
34
+
35
+ - At or below the state of an Agent, it answers only a pick of that Agent.
36
+ - On a transition below no Agent's state, it answers a pick of the Agent whose event took the
37
+ transition.
38
+ - On an `entry` or an `exit` below no Agent's state, it sets nothing, and `jr2 up` prints a
39
+ warning: `an answer on the <entry|exit> of "<state>" is below no Agent's state, so it shapes
40
+ no pick — an <entry|exit> there is no transition an Agent's event takes; move it under
41
+ "<agent state>", or onto a transition (ADR-0067)`.
42
+
43
+ The error of an invoked actor is no link, and the Agent does not see it. To tell the Agent,
44
+ write `answer` on the `onError` route. An Effect never takes that route for an outcome: every
45
+ outcome is output.
46
+
47
+ **Parameters**
48
+
49
+ - `fn`: Gets `{ context, event, chain }` and gives back what the Agent reads, as a value
50
+ with a JSON form.
51
+
52
+ **Returns**: An xstate action.
53
+
54
+ **Example**
55
+
56
+ ```ts
57
+ import { z } from "zod";
58
+ import {
59
+ agent,
60
+ answer,
61
+ command,
62
+ defineEvent,
63
+ fail,
64
+ isReady,
65
+ jr2Setup,
66
+ workspace,
67
+ worktree,
68
+ type Workspaced,
69
+ } from "@jr2/orchestrator";
70
+
71
+ const runTests = defineEvent({
72
+ name: "run_tests",
73
+ description: "Run the test suite. Its result is this call's answer.",
74
+ input: z.object({}),
75
+ });
76
+
77
+ const finished = defineEvent({
78
+ name: "finished",
79
+ description: "Say that the tests pass.",
80
+ input: z.object({}),
81
+ });
82
+
83
+ type Input = Workspaced<{}, "app">;
84
+
85
+ const fixTree = (context: Input) => `${context.workspace.repos.app}/fix` as const;
86
+
87
+ const body = jr2Setup({
88
+ types: {} as { context: Input; input: Input },
89
+ events: [runTests, finished],
90
+ actors: {
91
+ coder: agent({
92
+ model: "anthropic/claude-haiku-5-5",
93
+ instructions: "You are a careful engineer.",
94
+ }),
95
+ cut: worktree(),
96
+ tests: command(["npm", "test"]),
97
+ fail: fail(),
98
+ },
99
+ }).createMachine({
100
+ id: "fix-tests",
101
+ context: ({ input }) => input,
102
+ on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
103
+ initial: "cutting",
104
+ states: {
105
+ cutting: {
106
+ invoke: {
107
+ src: "cut",
108
+ input: ({ context }) => ({ path: fixTree(context), branch: "fix-tests" }),
109
+ onDone: [{ guard: ({ event }) => isReady(event.output), target: "coding" }, { target: "notCut" }],
110
+ },
111
+ },
112
+ coding: {
113
+ invoke: {
114
+ src: "coder",
115
+ input: ({ context }) => ({ prompt: "Make the tests pass.", cwd: fixTree(context) }),
116
+ },
117
+ on: { finished: "done" },
118
+ initial: "ready",
119
+ states: {
120
+ ready: { on: { run_tests: "testing" } },
121
+ testing: {
122
+ invoke: {
123
+ src: "tests",
124
+ input: ({ context }) => ({ worktree: fixTree(context) }),
125
+ onDone: {
126
+ target: "ready",
127
+ // The Agent reads this string, not the whole output of the command.
128
+ actions: answer(({ event }) =>
129
+ event.output.outcome === "exited" && event.output.code === 0
130
+ ? "The tests pass."
131
+ : `The tests fail:\n${"tail" in event.output ? event.output.tail : event.output.reason}`,
132
+ ),
133
+ },
134
+ },
135
+ },
136
+ },
137
+ },
138
+ done: { type: "final" },
139
+ notCut: { invoke: { src: "fail", input: { reason: "the Worktree was not cut" } } },
140
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
141
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
142
+ },
143
+ });
144
+
145
+ export const machine = workspace(body, {
146
+ repos: { app: { url: "https://github.com/you/app.git" } },
147
+ });
148
+ ```
149
+
150
+ **See also**
151
+
152
+ - [The Menu](../../concepts/the-menu.md)
153
+ - [Effects](../../concepts/effects.md)
154
+ - [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
155
+ - [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)
156
+ - [ADR-0024: An Agent's turn ends with the state that asked for it](../decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md)
@@ -0,0 +1,82 @@
1
+ ---
2
+ title: arg
3
+ description: Mark one argv entry of a `command` that the input of the Effect fills.
4
+ ---
5
+
6
+ # `arg`
7
+
8
+ Constant, in `@jr2/orchestrator/src/effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ```ts
11
+ const arg: <const N extends string>(name: N) => Arg<N>
12
+ ```
13
+
14
+ Mark one argv entry of a `command` that the input of the Effect fills. `arg("file")` is one
15
+ argument: the value of the `file` key of the input, whatever its characters. No shell reads it.
16
+
17
+ The input of the Effect then has a string key for each `arg`. Give it in the `input` of the
18
+ `invoke`, or use `fromPick` to give it from a pick.
19
+
20
+ When it starts, with no string in the input for an entry, the Effect fails (its `onError`
21
+ route): `command "<slot>": argv slot <<name>> has no string value in its input (got <type>) —
22
+ map it in the invoke's input`. The angle brackets around the name are in the text.
23
+
24
+ **Returns**: The argv entry, for the argv list of `command`.
25
+
26
+ **Example**
27
+
28
+ ```ts
29
+ import {
30
+ arg,
31
+ command,
32
+ fail,
33
+ isReady,
34
+ jr2Setup,
35
+ workspace,
36
+ worktree,
37
+ type Workspaced,
38
+ } from "@jr2/orchestrator";
39
+
40
+ type Input = Workspaced<{ file: string }, "app">;
41
+
42
+ const lintTree = (context: Input) => `${context.workspace.repos.app}/lint` as const;
43
+
44
+ const body = jr2Setup({
45
+ types: {} as { context: Input; input: Input },
46
+ actors: { cut: worktree(), lint: command(["npx", "eslint", arg("file")]), fail: fail() },
47
+ }).createMachine({
48
+ id: "lint",
49
+ context: ({ input }) => input,
50
+ on: { "workspace.lost": ".lost" },
51
+ initial: "cutting",
52
+ states: {
53
+ cutting: {
54
+ invoke: {
55
+ src: "cut",
56
+ input: ({ context }) => ({ path: lintTree(context), branch: "lint" }),
57
+ onDone: [{ guard: ({ event }) => isReady(event.output), target: "lint" }, { target: "notCut" }],
58
+ },
59
+ },
60
+ lint: {
61
+ invoke: {
62
+ src: "lint",
63
+ input: ({ context }) => ({ file: context.file, worktree: lintTree(context) }),
64
+ onDone: "done",
65
+ },
66
+ },
67
+ done: { type: "final" },
68
+ notCut: { invoke: { src: "fail", input: { reason: "the Worktree was not cut" } } },
69
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
70
+ },
71
+ });
72
+
73
+ export const machine = workspace(body, {
74
+ repos: { app: { url: "https://github.com/you/app.git" } },
75
+ });
76
+ ```
77
+
78
+ **See also**
79
+
80
+ - [Effects](../../concepts/effects.md)
81
+ - [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
82
+ - [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,62 @@
1
+ ---
2
+ title: basic
3
+ description: "Make the `auth` of an `http` Effect that sends `Authorization: Basic <value>`, where the value is the base64 of `user:password`."
4
+ ---
5
+
6
+ # `basic`
7
+
8
+ Function, in `@jr2/orchestrator/src/http-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ```ts
11
+ function basic<
12
+ const U extends string | Secret | Text,
13
+ const P extends string | Secret | Text,
14
+ >(
15
+ user: U,
16
+ password: P,
17
+ ): MarkedIf<U | P, { readonly basic: { user: Text; password: Text } }>
18
+ ```
19
+
20
+ Make the `auth` of an `http` Effect that sends `Authorization: Basic <value>`, where the value
21
+ is the base64 of `user:password`. The Effector puts in the value of each secret.
22
+
23
+ Each of `user` and `password` is a string, a `secret(...)` or a `text`. In a packaged Machine,
24
+ one of them can hold `secret(open)`. It refuses another value: `` expected a string, a
25
+ secret("name") or a text`…`, got <value> ``.
26
+
27
+ **Parameters**
28
+
29
+ - `user`: The user name: a string, a `secret(...)` or a `text`.
30
+ - `password`: The password: a string, a `secret(...)` or a `text`.
31
+
32
+ **Returns**: The `auth` of an `http` Effect.
33
+
34
+ **Example**
35
+
36
+ ```ts
37
+ import { basic, http, jr2Setup, secret } from "@jr2/orchestrator";
38
+
39
+ export const machine = jr2Setup({
40
+ actors: {
41
+ issue: http({
42
+ method: "GET",
43
+ url: "https://jira.example.com/rest/api/2/issue/APP-1",
44
+ auth: basic("jr2-bot@example.com", secret("jira-token")),
45
+ }),
46
+ },
47
+ }).createMachine({
48
+ id: "issue",
49
+ initial: "reading",
50
+ states: {
51
+ reading: { invoke: { src: "issue", onDone: "done" } },
52
+ done: { type: "final" },
53
+ },
54
+ });
55
+ ```
56
+
57
+ **See also**
58
+
59
+ - [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
60
+ - [Secrets and trust](../../concepts/secrets-and-trust.md)
61
+ - [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)
62
+ - [ADR-0054: The kit ships Machines, and a shipped Machine leaves its parts Open](../decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md)
@@ -0,0 +1,53 @@
1
+ ---
2
+ title: bearer
3
+ description: "Make the `auth` of an `http` Effect that sends `Authorization: Bearer <value>`, with the value of an Effect secret."
4
+ ---
5
+
6
+ # `bearer`
7
+
8
+ Function, in `@jr2/orchestrator/src/http-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
9
+
10
+ ```ts
11
+ function bearer<const S extends Secret>(s: S): MarkedIf<S, { readonly bearer: Secret }>
12
+ ```
13
+
14
+ Make the `auth` of an `http` Effect that sends `Authorization: Bearer <value>`, with the value
15
+ of an Effect secret. In a packaged Machine, the secret can be `secret(open)`.
16
+
17
+ It refuses a value that is not a secret: `bearer(…) takes a secret("name")`.
18
+
19
+ **Parameters**
20
+
21
+ - `s` ([`Secret`](type-secret.md)): The secret: `secret("name")`, or `secret(open)`.
22
+
23
+ **Returns**: The `auth` of an `http` Effect.
24
+
25
+ **Example**
26
+
27
+ ```ts
28
+ import { bearer, http, jr2Setup, secret } from "@jr2/orchestrator";
29
+
30
+ export const machine = jr2Setup({
31
+ actors: {
32
+ status: http({
33
+ method: "GET",
34
+ url: "https://api.github.com/repos/you/app",
35
+ auth: bearer(secret("github")),
36
+ }),
37
+ },
38
+ }).createMachine({
39
+ id: "status",
40
+ initial: "reading",
41
+ states: {
42
+ reading: { invoke: { src: "status", onDone: "done" } },
43
+ done: { type: "final" },
44
+ },
45
+ });
46
+ ```
47
+
48
+ **See also**
49
+
50
+ - [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
51
+ - [Secrets and trust](../../concepts/secrets-and-trust.md)
52
+ - [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)
53
+ - [ADR-0054: The kit ships Machines, and a shipped Machine leaves its parts Open](../decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md)
@@ -0,0 +1,15 @@
1
+ ---
2
+ title: branchName
3
+ description: A kit schema for a pick param that names a branch.
4
+ ---
5
+
6
+ # `branchName`
7
+
8
+ Constant, 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
+ const branchName: ZodString
12
+ ```
13
+
14
+ A kit schema for a pick param that names a branch. For example:
15
+ `input: z.object({ branch: branchName })`.
@@ -0,0 +1,23 @@
1
+ ---
2
+ title: chartSchema
3
+ description: The Chart grammar, as a zod schema.
4
+ ---
5
+
6
+ # `chartSchema`
7
+
8
+ Constant, in `@jr2/orchestrator/src/chart.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Charts.
9
+
10
+ ```ts
11
+ const chartSchema: z.ZodType<ChartText>
12
+ ```
13
+
14
+ The Chart grammar, as a zod schema. Make a field of the run input of a Chart wrapper this schema,
15
+ as in `z.object({ topic: z.string(), chart: chartSchema })`. Then a run input can carry a Chart,
16
+ and the wrapper can keep Charts under names: Chart files in `workflows/<wrapper>/`, and runtime
17
+ Charts. For the pick of a planner, use `chartSchemaFor`, which knows the names that the Open body
18
+ lends.
19
+
20
+ **See also**
21
+
22
+ - [Run a Chart by name](../../guides/run-a-chart-by-name.md)
23
+ - [Charts](../../concepts/charts.md)
@@ -0,0 +1,48 @@
1
+ ---
2
+ title: chartSchemaFor
3
+ description: The Chart grammar for one Open body, as a zod schema.
4
+ ---
5
+
6
+ # `chartSchemaFor`
7
+
8
+ Function, in `@jr2/orchestrator/src/chart.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Charts.
9
+
10
+ ```ts
11
+ function chartSchemaFor(decl: OpenBodyDeclaration): z.ZodType<ChartText>
12
+ ```
13
+
14
+ The Chart grammar for one Open body, as a zod schema. The names that the Open body lends, and the
15
+ models and the Workspace accesses that it allows, are the only values that the schema takes.
16
+ Make it the parameter of the pick of a planner. The model then gets the grammar as the
17
+ parameters of its tool, and the Briefing tells it how a Chart runs. The door still checks each
18
+ Chart before it runs.
19
+
20
+ **Parameters**
21
+
22
+ - `decl` ([`OpenBodyDeclaration`](type-openbodydeclaration.md)): The declaration of the Open body that the Chart binds.
23
+
24
+ **Returns**: The schema of a Chart for that Open body.
25
+
26
+ **Example**
27
+
28
+ ```ts
29
+ import { z } from "zod";
30
+ import { chartSchemaFor, defineEvent, type OpenBodyDeclaration } from "@jr2/orchestrator";
31
+
32
+ const declaration: OpenBodyDeclaration = {
33
+ lends: { agents: ["writer"], gate: true },
34
+ allows: { models: ["anthropic/claude-haiku-5-5"], workspace: ["none"] },
35
+ ceilings: { turns: 12, wallClock: "30m", transitions: 500, fanOut: 2, size: 65536 },
36
+ };
37
+
38
+ export const runChart = defineEvent({
39
+ name: "run_chart",
40
+ description: "Run this Chart. Its outcome is the answer to this call.",
41
+ input: z.object({ chart: chartSchemaFor(declaration) }),
42
+ });
43
+ ```
44
+
45
+ **See also**
46
+
47
+ - [Let an Agent write a Chart](../../guides/let-an-agent-write-a-chart.md)
48
+ - [Charts](../../concepts/charts.md)