@jr2/orchestrator 0.4.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/README.md +20 -2
  2. package/console/components/app.ts +2 -0
  3. package/console/components/fleet.ts +14 -1
  4. package/console/components/machine-pane.ts +41 -2
  5. package/console/main.ts +13 -1
  6. package/console/store.ts +102 -6
  7. package/console/style.css +21 -0
  8. package/docs/agents-block.md +5 -0
  9. package/docs/concepts/agents-and-turns.md +442 -0
  10. package/docs/concepts/architecture.md +230 -0
  11. package/docs/concepts/charts.md +143 -0
  12. package/docs/concepts/composition.md +357 -0
  13. package/docs/concepts/converge.md +254 -0
  14. package/docs/concepts/durable-runs.md +189 -0
  15. package/docs/concepts/effects.md +603 -0
  16. package/docs/concepts/gates.md +208 -0
  17. package/docs/concepts/machines-and-workflows.md +289 -0
  18. package/docs/concepts/pools-and-sources.md +230 -0
  19. package/docs/concepts/secrets-and-trust.md +222 -0
  20. package/docs/concepts/the-menu.md +378 -0
  21. package/docs/concepts/workspaces.md +678 -0
  22. package/docs/get-started/a-model-decides.md +563 -0
  23. package/docs/get-started/an-agent-in-a-sandbox.md +381 -0
  24. package/docs/get-started/connect-a-model.md +248 -0
  25. package/docs/get-started/create-an-instance.md +194 -0
  26. package/docs/get-started/have-your-assistant-write-a-machine.md +922 -0
  27. package/docs/get-started/install.md +126 -0
  28. package/docs/guides/add-tools-to-the-sandbox.md +295 -0
  29. package/docs/guides/answer-a-gate.md +304 -0
  30. package/docs/guides/bind-open-parts.md +223 -0
  31. package/docs/guides/cancel-a-run.md +146 -0
  32. package/docs/guides/clean-up.md +206 -0
  33. package/docs/guides/fix-a-failed-converge.md +361 -0
  34. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  35. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  36. package/docs/guides/let-an-agent-write-a-chart.md +226 -0
  37. package/docs/guides/look-inside-a-sandbox.md +174 -0
  38. package/docs/guides/mirror-the-kit-images.md +176 -0
  39. package/docs/guides/move-from-kind-to-a-shared-cluster.md +302 -0
  40. package/docs/guides/open-the-console.md +91 -0
  41. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  42. package/docs/guides/push-and-sign-a-branch.md +486 -0
  43. package/docs/guides/run-a-chart-by-name.md +270 -0
  44. package/docs/guides/run-a-command-or-call-a-url.md +544 -0
  45. package/docs/guides/run-one-worker-per-item.md +321 -0
  46. package/docs/guides/set-an-agents-access-and-dials.md +375 -0
  47. package/docs/guides/size-a-workspace.md +204 -0
  48. package/docs/guides/start-a-run-from-a-run.md +237 -0
  49. package/docs/guides/start-a-run.md +207 -0
  50. package/docs/guides/upgrade-the-kit-version.md +240 -0
  51. package/docs/guides/use-a-hosted-provider.md +208 -0
  52. package/docs/guides/use-a-local-model.md +313 -0
  53. package/docs/guides/watch-a-run.md +326 -0
  54. package/docs/guides/write-a-workflow.md +318 -0
  55. package/docs/index.md +44 -0
  56. package/docs/llms.txt +216 -0
  57. package/docs/reference/authoring-surface/agent.md +128 -0
  58. package/docs/reference/authoring-surface/answer.md +140 -0
  59. package/docs/reference/authoring-surface/arg.md +60 -0
  60. package/docs/reference/authoring-surface/basic.md +62 -0
  61. package/docs/reference/authoring-surface/bearer.md +53 -0
  62. package/docs/reference/authoring-surface/chartschema.md +23 -0
  63. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  64. package/docs/reference/authoring-surface/command.md +191 -0
  65. package/docs/reference/authoring-surface/customize.md +64 -0
  66. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  67. package/docs/reference/authoring-surface/defineevent.md +114 -0
  68. package/docs/reference/authoring-surface/dispatch.md +126 -0
  69. package/docs/reference/authoring-surface/fail.md +83 -0
  70. package/docs/reference/authoring-surface/file.md +122 -0
  71. package/docs/reference/authoring-surface/frompick.md +277 -0
  72. package/docs/reference/authoring-surface/http.md +159 -0
  73. package/docs/reference/authoring-surface/isfailure.md +58 -0
  74. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  75. package/docs/reference/authoring-surface/open.md +74 -0
  76. package/docs/reference/authoring-surface/openbody.md +86 -0
  77. package/docs/reference/authoring-surface/paramsof.md +125 -0
  78. package/docs/reference/authoring-surface/pool.md +186 -0
  79. package/docs/reference/authoring-surface/push.md +112 -0
  80. package/docs/reference/authoring-surface/secret.md +118 -0
  81. package/docs/reference/authoring-surface/sentby.md +83 -0
  82. package/docs/reference/authoring-surface/source.md +51 -0
  83. package/docs/reference/authoring-surface/text.md +62 -0
  84. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  85. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  86. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  87. package/docs/reference/authoring-surface/type-agentslots.md +12 -0
  88. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  89. package/docs/reference/authoring-surface/type-arg.md +19 -0
  90. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  91. package/docs/reference/authoring-surface/type-binding.md +62 -0
  92. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  93. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  94. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  95. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  96. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  97. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  98. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  99. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  100. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  101. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  102. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  103. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  104. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  105. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  106. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  107. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  108. package/docs/reference/authoring-surface/type-childat.md +12 -0
  109. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  110. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  111. package/docs/reference/authoring-surface/type-commandinput.md +19 -0
  112. package/docs/reference/authoring-surface/type-commandoptions.md +78 -0
  113. package/docs/reference/authoring-surface/type-commandoutput.md +104 -0
  114. package/docs/reference/authoring-surface/type-customize.md +109 -0
  115. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  116. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  117. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  118. package/docs/reference/authoring-surface/type-dispatchoutput.md +65 -0
  119. package/docs/reference/authoring-surface/type-duration.md +15 -0
  120. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  121. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  122. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  123. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  124. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  125. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  126. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  127. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  128. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  129. package/docs/reference/authoring-surface/type-failure.md +19 -0
  130. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  131. package/docs/reference/authoring-surface/type-filebody.md +41 -0
  132. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  133. package/docs/reference/authoring-surface/type-hostinjectedinput.md +58 -0
  134. package/docs/reference/authoring-surface/type-httpdefinition.md +101 -0
  135. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  136. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  137. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  138. package/docs/reference/authoring-surface/type-httpoutput.md +89 -0
  139. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  140. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  141. package/docs/reference/authoring-surface/type-lends.md +38 -0
  142. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  143. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  144. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  145. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  146. package/docs/reference/authoring-surface/type-noslotspec.md +26 -0
  147. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +32 -0
  148. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  149. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  150. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  151. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  152. package/docs/reference/authoring-surface/type-opencommandinput.md +17 -0
  153. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  154. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  155. package/docs/reference/authoring-surface/type-openof.md +12 -0
  156. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  157. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  158. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +31 -0
  159. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +32 -0
  160. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  161. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  162. package/docs/reference/authoring-surface/type-pushinput.md +15 -0
  163. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  164. package/docs/reference/authoring-surface/type-pushoutput.md +124 -0
  165. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  166. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  167. package/docs/reference/authoring-surface/type-reached.md +12 -0
  168. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  169. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  170. package/docs/reference/authoring-surface/type-sandboxoptions.md +77 -0
  171. package/docs/reference/authoring-surface/type-secret.md +25 -0
  172. package/docs/reference/authoring-surface/type-sender.md +19 -0
  173. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  174. package/docs/reference/authoring-surface/type-size.md +85 -0
  175. package/docs/reference/authoring-surface/type-slothandles.md +32 -0
  176. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  177. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  178. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  179. package/docs/reference/authoring-surface/type-text.md +19 -0
  180. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  181. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  182. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  183. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  184. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  185. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  186. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  187. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  188. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  189. package/docs/reference/authoring-surface/type-workspaced.md +94 -0
  190. package/docs/reference/authoring-surface/type-workspacehandles.md +23 -0
  191. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  192. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  193. package/docs/reference/authoring-surface/type-workspaceoptions.md +39 -0
  194. package/docs/reference/authoring-surface/type-workspacespec.md +37 -0
  195. package/docs/reference/authoring-surface/workspace.md +259 -0
  196. package/docs/reference/authoring-surface.md +197 -0
  197. package/docs/reference/cli.md +433 -0
  198. package/docs/reference/config.md +756 -0
  199. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +113 -0
  200. package/docs/reference/decisions/0002-duplex-streaming-actor.md +110 -0
  201. package/docs/reference/decisions/0004-worktree-provisioning-model.md +124 -0
  202. package/docs/reference/decisions/0005-sandbox-pod-composition.md +230 -0
  203. package/docs/reference/decisions/0006-agent-control-surface.md +47 -0
  204. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  205. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  206. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  207. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  208. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  209. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  210. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +157 -0
  211. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  212. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +265 -0
  213. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +124 -0
  214. package/docs/reference/decisions/0017-pool-over-a-source-port.md +69 -0
  215. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  216. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +275 -0
  217. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  218. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +100 -0
  219. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  220. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +176 -0
  221. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +439 -0
  222. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  223. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  224. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +237 -0
  225. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +89 -0
  226. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  227. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  228. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +190 -0
  229. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  230. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +127 -0
  231. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  232. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  233. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  234. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  235. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  236. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  237. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  238. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  239. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  240. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  241. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  242. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  243. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  244. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  245. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  246. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  247. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +227 -0
  248. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +81 -0
  249. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +111 -0
  250. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  251. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  252. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  253. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  254. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +106 -0
  255. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +384 -0
  256. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  257. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  258. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +212 -0
  259. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +83 -0
  260. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  261. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  262. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +550 -0
  263. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +430 -0
  264. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +464 -0
  265. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  266. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +323 -0
  267. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  268. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  269. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  270. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  271. package/docs/reference/decisions.md +83 -0
  272. package/docs/reference/glossary.md +648 -0
  273. package/docs/reference/http-api.md +1348 -0
  274. package/docs/reference/machines.md +190 -0
  275. package/docs/reference/mechanism-events.md +72 -0
  276. package/docs/why.md +206 -0
  277. package/package.json +5 -3
  278. package/src/actor.ts +541 -79
  279. package/src/agent.ts +114 -38
  280. package/src/ambient.ts +2 -1
  281. package/src/assembly-checks.ts +189 -7
  282. package/src/cause.ts +234 -0
  283. package/src/chart.ts +169 -37
  284. package/src/charts.ts +34 -6
  285. package/src/config.ts +430 -178
  286. package/src/custodian.ts +74 -22
  287. package/src/customize.ts +188 -46
  288. package/src/dispatch-effect.ts +945 -0
  289. package/src/door-compat.ts +217 -0
  290. package/src/durability.ts +11 -4
  291. package/src/effect.ts +341 -44
  292. package/src/effector-wire.ts +160 -11
  293. package/src/fail.ts +209 -0
  294. package/src/harness-client.ts +541 -47
  295. package/src/http-effect.ts +495 -53
  296. package/src/http.ts +427 -16
  297. package/src/index.ts +60 -82
  298. package/src/instance.ts +68 -8
  299. package/src/internal.ts +84 -0
  300. package/src/machine-doc.ts +21 -3
  301. package/src/mechanism-routes.ts +168 -0
  302. package/src/model-keys.generated.ts +53 -0
  303. package/src/model-keys.ts +18 -58
  304. package/src/notices.ts +66 -13
  305. package/src/open-body.ts +159 -23
  306. package/src/open-effect.ts +81 -8
  307. package/src/open.ts +59 -6
  308. package/src/parts.ts +184 -13
  309. package/src/party.ts +68 -2
  310. package/src/pick.ts +463 -11
  311. package/src/pool.ts +247 -36
  312. package/src/registration.ts +83 -4
  313. package/src/repos.ts +2 -1
  314. package/src/run-host.ts +565 -31
  315. package/src/run-output.ts +38 -0
  316. package/src/sandbox-effect.ts +273 -38
  317. package/src/sandbox-kube.ts +3 -1
  318. package/src/secret-placement.ts +52 -17
  319. package/src/server.ts +3 -0
  320. package/src/setup.ts +239 -56
  321. package/src/size.ts +121 -9
  322. package/src/snapshot-store.ts +54 -10
  323. package/src/stub-harness.ts +44 -16
  324. package/src/timers.ts +14 -1
  325. package/src/vocabulary.ts +69 -14
  326. package/src/wire.ts +90 -16
  327. package/src/workspace.ts +697 -175
@@ -0,0 +1,128 @@
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(declaration: AgentDeclaration): AgentLogic
12
+ ```
13
+
14
+ Make an Agent: an actor slot that runs one Turn of a model each time a state invokes it. Put it
15
+ under `actors` in `jr2Setup`, and invoke it by its key: `actors: { coder: agent(…) }`, then
16
+ `invoke: { src: "coder", input: { prompt } }`. The key is the Agent's name.
17
+
18
+ The invoke's `input` is the Turn: `prompt` (required), `cwd`, `model`, `thinkingLevel` and
19
+ `continue`. `cwd` is the absolute directory where the Working tools work. Absent, it is the
20
+ Worktree of the Workspace's one Repo Slot. `continue: true` continues the Agent's conversation
21
+ in this Machine. Absent, each Turn starts a new conversation. `continue` is the literal `true`,
22
+ not a `boolean`. A Turn can join only a conversation that an earlier Turn started with
23
+ `continue: true`. Thus in a retry loop, put `continue: true` on each Turn, also on the first, so
24
+ that attempt 2 sees attempt 1. Then a Runaway on the first Turn gets no second start, because a
25
+ 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
26
+ on some Turns only: `...(context.clean ? {} : { continue: true as const })`. A clean Turn does not
27
+ start the continued conversation again: the next Turn with `continue: true` joins the earlier
28
+ one. The Turn ends when the state that invoked the Agent exits, usually on a pick from the
29
+ Agent's Menu.
30
+
31
+ The actor of an Agent never finishes, so an `onDone` on its invoke never runs. Give the Agent a
32
+ pick, such as `finish`, and route on it. When a Turn fails with no pick, jr2 sends the event
33
+ `agent.fault` to the Machine. It is an event, not an error of the invoke, so an `onError` does
34
+ not get it. Route it on each state that invokes an Agent, or once on a state above them:
35
+ `on: { "agent.fault": "failed" }`. `jr2 check` and `jr2 up` refuse a state that invokes an
36
+ Agent with no route for it, and an `agent.fault` that no transition takes ends the run `error`.
37
+
38
+ An Agent with `workspace: "write"` or `"read"` works in a Sandbox, so invoke it inside a
39
+ `workspace()` body. An Agent with `workspace: "none"` can run anywhere. A model can lack the
40
+ definition's thinking level: see [`ThinkingLevel`](type-thinkinglevel.md).
41
+
42
+ When a Turn starts, it refuses:
43
+ - a key in `input` that a Turn does not have: ``agent "<slot>": the Turn's input carries
44
+ `<key>`, which a Turn has no use for — its input is its Frame (`prompt`, `cwd`), its Dials
45
+ (`model`, `thinkingLevel`), and `continue` (ADR-0057)``
46
+ - no `cwd` under a Workspace with more than one Repo Slot: ``turn <id>: agent "<slot>" works
47
+ under a Workspace carrying more than one Repo Slot (<slots>) and its Turn framed no `cwd` —
48
+ say which Worktree it works in (`cwd: context.workspace.repos.<slot>`, one of those), because
49
+ the kit gives no slot a meaning (ADR-0051) and a Turn's Frame is where it works (ADR-0057)``
50
+ - a `cwd` that is not an absolute path: ``agent "<slot>": the Turn's Frame carries a `cwd` that
51
+ is not an absolute path — the Frame says WHERE this Turn works (ADR-0057), and a Turn rooted
52
+ anywhere else would work in the wrong directory silently``. The Harness makes this refusal
53
+ when it admits the Turn, and the error starts with `harness admission failed (400): `.
54
+ - an Agent with Working tools outside a `workspace()`: ``turn <id>: agent "<slot>" has
55
+ workspace: "<access>" — invoke it inside a workspace() (ambient resolution), or pass an
56
+ explicit `endpoint` (workspace-less stub path)``
57
+ - a `model` that is still `open`: ``agent "<slot>" has an Open model — nobody bound it; bind it
58
+ where the Machine is registered (`customize(<machine>, { agents: { <slot>: { model:
59
+ "<provider>/<model>" } } })`), because a packaged Machine cannot pick a model on your behalf
60
+ (ADR-0054)``. `jr2 up` refuses this before it builds anything.
61
+
62
+ **Parameters**
63
+
64
+ - `declaration` ([`AgentDeclaration`](type-agentdeclaration.md)): The Agent's definition (see [`AgentDefinition`](type-agentdefinition.md)). `model` may be `open`
65
+ in a Machine that you publish as a package.
66
+
67
+ **Returns**: The actor logic of the Agent's slot.
68
+
69
+ **Example**
70
+
71
+ ```ts
72
+ import { z } from "zod";
73
+ import { agent, defineEvent, fail, jr2Setup, workspace, type Workspaced } from "@jr2/orchestrator";
74
+
75
+ const finish = defineEvent({
76
+ name: "finish",
77
+ description: "Call this when `node --test` passes.",
78
+ input: z.object({}),
79
+ });
80
+ const runInput = z.object({ branch: z.string() });
81
+ type BodyInput = Workspaced<z.infer<typeof runInput>, "app">;
82
+
83
+ const body = jr2Setup({
84
+ types: {} as { input: BodyInput; context: BodyInput },
85
+ events: [finish],
86
+ actors: {
87
+ coder: agent({
88
+ model: "anthropic/claude-haiku-5-5",
89
+ instructions: "You fix failing tests. You change no test.",
90
+ }),
91
+ fail: fail(),
92
+ },
93
+ }).createMachine({
94
+ id: "fix",
95
+ context: ({ input }) => input,
96
+ on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
97
+ initial: "coding",
98
+ states: {
99
+ coding: {
100
+ invoke: {
101
+ src: "coder",
102
+ input: ({ context }) => ({
103
+ prompt: "Make `node --test` pass, then commit.",
104
+ cwd: context.workspace.repos.app,
105
+ thinkingLevel: "high",
106
+ }),
107
+ },
108
+ on: { finish: "done" },
109
+ },
110
+ done: { type: "final" },
111
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
112
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
113
+ },
114
+ });
115
+
116
+ export const machine = workspace(body, {
117
+ input: runInput,
118
+ repos: { app: "https://github.com/you/app.git" },
119
+ spec: ({ input }) => ({ branch: input.branch }),
120
+ });
121
+ ```
122
+
123
+ **See also**
124
+
125
+ - [Agents and Turns](../../concepts/agents-and-turns.md)
126
+ - [Write a Workflow](../../guides/write-a-workflow.md)
127
+ - [ADR-0049: A Machine carries its parts and composes by invoke](../decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md)
128
+ - [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,140 @@
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
+ jr2Setup,
65
+ workspace,
66
+ type Workspaced,
67
+ } from "@jr2/orchestrator";
68
+
69
+ const runTests = defineEvent({
70
+ name: "run_tests",
71
+ description: "Run the test suite. Its result is this call's answer.",
72
+ input: z.object({}),
73
+ });
74
+
75
+ const finished = defineEvent({
76
+ name: "finished",
77
+ description: "Say that the tests pass.",
78
+ input: z.object({}),
79
+ });
80
+
81
+ type Input = Workspaced<{}, "app">;
82
+
83
+ const body = jr2Setup({
84
+ types: {} as { context: Input; input: Input },
85
+ events: [runTests, finished],
86
+ actors: {
87
+ coder: agent({
88
+ model: "anthropic/claude-haiku-5-5",
89
+ instructions: "You are a careful engineer.",
90
+ }),
91
+ tests: command(["npm", "test"]),
92
+ fail: fail(),
93
+ },
94
+ }).createMachine({
95
+ id: "fix-tests",
96
+ context: ({ input }) => input,
97
+ on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
98
+ initial: "coding",
99
+ states: {
100
+ coding: {
101
+ invoke: { src: "coder", input: { prompt: "Make the tests pass." } },
102
+ on: { finished: "done" },
103
+ initial: "ready",
104
+ states: {
105
+ ready: { on: { run_tests: "testing" } },
106
+ testing: {
107
+ invoke: {
108
+ src: "tests",
109
+ onDone: {
110
+ target: "ready",
111
+ // The Agent reads this string, not the whole output of the command.
112
+ actions: answer(({ event }) =>
113
+ event.output.outcome === "exited" && event.output.code === 0
114
+ ? "The tests pass."
115
+ : `The tests fail:\n${"tail" in event.output ? event.output.tail : event.output.reason}`,
116
+ ),
117
+ },
118
+ },
119
+ },
120
+ },
121
+ },
122
+ done: { type: "final" },
123
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
124
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
125
+ },
126
+ });
127
+
128
+ export const machine = workspace(body, {
129
+ repos: { app: { url: "https://github.com/you/app.git" } },
130
+ spec: () => ({ branch: "fix-tests" }),
131
+ });
132
+ ```
133
+
134
+ **See also**
135
+
136
+ - [The Menu](../../concepts/the-menu.md)
137
+ - [Effects](../../concepts/effects.md)
138
+ - [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
139
+ - [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)
140
+ - [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,60 @@
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 { arg, command, fail, jr2Setup, workspace, type Workspaced } from "@jr2/orchestrator";
30
+
31
+ type Input = Workspaced<{ file: string }, "app">;
32
+
33
+ const body = jr2Setup({
34
+ types: {} as { context: Input; input: Input },
35
+ actors: { lint: command(["npx", "eslint", arg("file")]), fail: fail() },
36
+ }).createMachine({
37
+ id: "lint",
38
+ context: ({ input }) => input,
39
+ on: { "workspace.lost": ".lost" },
40
+ initial: "lint",
41
+ states: {
42
+ lint: {
43
+ invoke: { src: "lint", input: ({ context }) => ({ file: context.file }), onDone: "done" },
44
+ },
45
+ done: { type: "final" },
46
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
47
+ },
48
+ });
49
+
50
+ export const machine = workspace(body, {
51
+ repos: { app: { url: "https://github.com/you/app.git" } },
52
+ spec: () => ({ branch: "lint" }),
53
+ });
54
+ ```
55
+
56
+ **See also**
57
+
58
+ - [Effects](../../concepts/effects.md)
59
+ - [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
60
+ - [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,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)