@jr2/orchestrator 0.3.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -2
- package/bin/server.ts +7 -4
- package/console/canvas.ts +27 -14
- package/console/components/app.ts +12 -1
- package/console/components/fleet.ts +52 -6
- package/console/components/machine-pane.ts +128 -2
- package/console/components/nav.ts +1 -1
- package/console/components/schema-form.ts +12 -4
- package/console/json-field.ts +23 -0
- package/console/main.ts +122 -39
- package/console/store.ts +321 -21
- package/console/style.css +111 -0
- package/docs/agents-block.md +5 -0
- package/docs/concepts/agents-and-turns.md +442 -0
- package/docs/concepts/architecture.md +230 -0
- package/docs/concepts/charts.md +143 -0
- package/docs/concepts/composition.md +357 -0
- package/docs/concepts/converge.md +254 -0
- package/docs/concepts/durable-runs.md +189 -0
- package/docs/concepts/effects.md +603 -0
- package/docs/concepts/gates.md +208 -0
- package/docs/concepts/machines-and-workflows.md +289 -0
- package/docs/concepts/pools-and-sources.md +230 -0
- package/docs/concepts/secrets-and-trust.md +222 -0
- package/docs/concepts/the-menu.md +378 -0
- package/docs/concepts/workspaces.md +678 -0
- package/docs/get-started/a-model-decides.md +563 -0
- package/docs/get-started/an-agent-in-a-sandbox.md +381 -0
- package/docs/get-started/connect-a-model.md +248 -0
- package/docs/get-started/create-an-instance.md +194 -0
- package/docs/get-started/have-your-assistant-write-a-machine.md +922 -0
- package/docs/get-started/install.md +126 -0
- package/docs/guides/add-tools-to-the-sandbox.md +295 -0
- package/docs/guides/answer-a-gate.md +304 -0
- package/docs/guides/bind-open-parts.md +223 -0
- package/docs/guides/cancel-a-run.md +146 -0
- package/docs/guides/clean-up.md +206 -0
- package/docs/guides/fix-a-failed-converge.md +361 -0
- package/docs/guides/give-the-cluster-git-credentials.md +222 -0
- package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
- package/docs/guides/let-an-agent-write-a-chart.md +226 -0
- package/docs/guides/look-inside-a-sandbox.md +174 -0
- package/docs/guides/mirror-the-kit-images.md +176 -0
- package/docs/guides/move-from-kind-to-a-shared-cluster.md +302 -0
- package/docs/guides/open-the-console.md +91 -0
- package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
- package/docs/guides/push-and-sign-a-branch.md +486 -0
- package/docs/guides/run-a-chart-by-name.md +270 -0
- package/docs/guides/run-a-command-or-call-a-url.md +544 -0
- package/docs/guides/run-one-worker-per-item.md +321 -0
- package/docs/guides/set-an-agents-access-and-dials.md +375 -0
- package/docs/guides/size-a-workspace.md +204 -0
- package/docs/guides/start-a-run-from-a-run.md +237 -0
- package/docs/guides/start-a-run.md +207 -0
- package/docs/guides/upgrade-the-kit-version.md +240 -0
- package/docs/guides/use-a-hosted-provider.md +208 -0
- package/docs/guides/use-a-local-model.md +313 -0
- package/docs/guides/watch-a-run.md +326 -0
- package/docs/guides/write-a-workflow.md +318 -0
- package/docs/index.md +44 -0
- package/docs/llms.txt +216 -0
- package/docs/reference/authoring-surface/agent.md +128 -0
- package/docs/reference/authoring-surface/answer.md +140 -0
- package/docs/reference/authoring-surface/arg.md +60 -0
- package/docs/reference/authoring-surface/basic.md +62 -0
- package/docs/reference/authoring-surface/bearer.md +53 -0
- package/docs/reference/authoring-surface/chartschema.md +23 -0
- package/docs/reference/authoring-surface/chartschemafor.md +48 -0
- package/docs/reference/authoring-surface/command.md +191 -0
- package/docs/reference/authoring-surface/customize.md +64 -0
- package/docs/reference/authoring-surface/defineconfig.md +41 -0
- package/docs/reference/authoring-surface/defineevent.md +114 -0
- package/docs/reference/authoring-surface/dispatch.md +126 -0
- package/docs/reference/authoring-surface/fail.md +83 -0
- package/docs/reference/authoring-surface/file.md +122 -0
- package/docs/reference/authoring-surface/frompick.md +277 -0
- package/docs/reference/authoring-surface/http.md +159 -0
- package/docs/reference/authoring-surface/isfailure.md +58 -0
- package/docs/reference/authoring-surface/jr2setup.md +237 -0
- package/docs/reference/authoring-surface/open.md +74 -0
- package/docs/reference/authoring-surface/openbody.md +86 -0
- package/docs/reference/authoring-surface/paramsof.md +125 -0
- package/docs/reference/authoring-surface/pool.md +186 -0
- package/docs/reference/authoring-surface/push.md +112 -0
- package/docs/reference/authoring-surface/secret.md +118 -0
- package/docs/reference/authoring-surface/sentby.md +83 -0
- package/docs/reference/authoring-surface/source.md +51 -0
- package/docs/reference/authoring-surface/text.md +62 -0
- package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
- package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
- package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
- package/docs/reference/authoring-surface/type-agentslots.md +12 -0
- package/docs/reference/authoring-surface/type-answeraction.md +12 -0
- package/docs/reference/authoring-surface/type-arg.md +19 -0
- package/docs/reference/authoring-surface/type-argnames.md +12 -0
- package/docs/reference/authoring-surface/type-binding.md +62 -0
- package/docs/reference/authoring-surface/type-bindingof.md +12 -0
- package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
- package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
- package/docs/reference/authoring-surface/type-ceilings.md +41 -0
- package/docs/reference/authoring-surface/type-chainlink.md +19 -0
- package/docs/reference/authoring-surface/type-chartaction.md +46 -0
- package/docs/reference/authoring-surface/type-chartagent.md +28 -0
- package/docs/reference/authoring-surface/type-chartevent.md +20 -0
- package/docs/reference/authoring-surface/type-chartguard.md +20 -0
- package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
- package/docs/reference/authoring-surface/type-chartjson.md +14 -0
- package/docs/reference/authoring-surface/type-chartstate.md +46 -0
- package/docs/reference/authoring-surface/type-charttext.md +40 -0
- package/docs/reference/authoring-surface/type-charttransition.md +22 -0
- package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
- package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
- package/docs/reference/authoring-surface/type-childat.md +12 -0
- package/docs/reference/authoring-surface/type-childslots.md +12 -0
- package/docs/reference/authoring-surface/type-commandenv.md +15 -0
- package/docs/reference/authoring-surface/type-commandinput.md +19 -0
- package/docs/reference/authoring-surface/type-commandoptions.md +78 -0
- package/docs/reference/authoring-surface/type-commandoutput.md +104 -0
- package/docs/reference/authoring-surface/type-customize.md +109 -0
- package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
- package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
- package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
- package/docs/reference/authoring-surface/type-dispatchoutput.md +65 -0
- package/docs/reference/authoring-surface/type-duration.md +15 -0
- package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
- package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
- package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
- package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
- package/docs/reference/authoring-surface/type-eventdef.md +45 -0
- package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
- package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
- package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
- package/docs/reference/authoring-surface/type-failslot.md +14 -0
- package/docs/reference/authoring-surface/type-failure.md +19 -0
- package/docs/reference/authoring-surface/type-failureinput.md +20 -0
- package/docs/reference/authoring-surface/type-filebody.md +41 -0
- package/docs/reference/authoring-surface/type-frominput.md +14 -0
- package/docs/reference/authoring-surface/type-hostinjectedinput.md +58 -0
- package/docs/reference/authoring-surface/type-httpdefinition.md +101 -0
- package/docs/reference/authoring-surface/type-httpinput.md +12 -0
- package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
- package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
- package/docs/reference/authoring-surface/type-httpoutput.md +89 -0
- package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
- package/docs/reference/authoring-surface/type-jr2config.md +126 -0
- package/docs/reference/authoring-surface/type-lends.md +38 -0
- package/docs/reference/authoring-surface/type-logicat.md +12 -0
- package/docs/reference/authoring-surface/type-markedif.md +12 -0
- package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
- package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
- package/docs/reference/authoring-surface/type-noslotspec.md +26 -0
- package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +32 -0
- package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
- package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
- package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
- package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
- package/docs/reference/authoring-surface/type-opencommandinput.md +17 -0
- package/docs/reference/authoring-surface/type-openeffect.md +12 -0
- package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
- package/docs/reference/authoring-surface/type-openof.md +12 -0
- package/docs/reference/authoring-surface/type-opensecret.md +23 -0
- package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
- package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +31 -0
- package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +32 -0
- package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
- package/docs/reference/authoring-surface/type-poolspec.md +60 -0
- package/docs/reference/authoring-surface/type-pushinput.md +15 -0
- package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
- package/docs/reference/authoring-surface/type-pushoutput.md +124 -0
- package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
- package/docs/reference/authoring-surface/type-quantity.md +14 -0
- package/docs/reference/authoring-surface/type-reached.md +12 -0
- package/docs/reference/authoring-surface/type-reposlot.md +70 -0
- package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
- package/docs/reference/authoring-surface/type-sandboxoptions.md +77 -0
- package/docs/reference/authoring-surface/type-secret.md +25 -0
- package/docs/reference/authoring-surface/type-sender.md +19 -0
- package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
- package/docs/reference/authoring-surface/type-size.md +85 -0
- package/docs/reference/authoring-surface/type-slothandles.md +32 -0
- package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
- package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
- package/docs/reference/authoring-surface/type-syncstate.md +12 -0
- package/docs/reference/authoring-surface/type-text.md +19 -0
- package/docs/reference/authoring-surface/type-textpart.md +24 -0
- package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
- package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
- package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
- package/docs/reference/authoring-surface/type-unknown.md +21 -0
- package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
- package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
- package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
- package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
- package/docs/reference/authoring-surface/type-workspaced.md +94 -0
- package/docs/reference/authoring-surface/type-workspacehandles.md +23 -0
- package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
- package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
- package/docs/reference/authoring-surface/type-workspaceoptions.md +39 -0
- package/docs/reference/authoring-surface/type-workspacespec.md +37 -0
- package/docs/reference/authoring-surface/workspace.md +259 -0
- package/docs/reference/authoring-surface.md +197 -0
- package/docs/reference/cli.md +433 -0
- package/docs/reference/config.md +756 -0
- package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +113 -0
- package/docs/reference/decisions/0002-duplex-streaming-actor.md +110 -0
- package/docs/reference/decisions/0004-worktree-provisioning-model.md +124 -0
- package/docs/reference/decisions/0005-sandbox-pod-composition.md +230 -0
- package/docs/reference/decisions/0006-agent-control-surface.md +47 -0
- package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
- package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
- package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
- package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
- package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
- package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
- package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +157 -0
- package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
- package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +265 -0
- package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +124 -0
- package/docs/reference/decisions/0017-pool-over-a-source-port.md +69 -0
- package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
- package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +275 -0
- package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
- package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +100 -0
- package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
- package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +176 -0
- package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +439 -0
- package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
- package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
- package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +237 -0
- package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +89 -0
- package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
- package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
- package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +190 -0
- package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
- package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +127 -0
- package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
- package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
- package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
- package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
- package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
- package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
- package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
- package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
- package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
- package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
- package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
- package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
- package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
- package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
- package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
- package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
- package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +227 -0
- package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +81 -0
- package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +111 -0
- package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
- package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
- package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
- package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
- package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +106 -0
- package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +384 -0
- package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
- package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
- package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +212 -0
- package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +83 -0
- package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
- package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
- 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
- package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +430 -0
- package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +464 -0
- package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
- package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +323 -0
- package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
- package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
- package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
- package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
- package/docs/reference/decisions.md +83 -0
- package/docs/reference/glossary.md +648 -0
- package/docs/reference/http-api.md +1348 -0
- package/docs/reference/machines.md +190 -0
- package/docs/reference/mechanism-events.md +72 -0
- package/docs/why.md +206 -0
- package/package.json +6 -4
- package/src/actor.ts +976 -61
- package/src/agent.ts +114 -38
- package/src/ambient.ts +4 -1
- package/src/assembly-checks.ts +347 -0
- package/src/assembly-tar.ts +494 -0
- package/src/assembly.ts +721 -0
- package/src/cause.ts +234 -0
- package/src/chart.ts +2182 -0
- package/src/charts.ts +748 -0
- package/src/config.ts +520 -162
- package/src/content-hash.ts +105 -0
- package/src/custodian.lua +6 -5
- package/src/custodian.ts +143 -39
- package/src/customize.ts +388 -55
- package/src/dispatch-effect.ts +945 -0
- package/src/door-compat.ts +217 -0
- package/src/durability.ts +11 -4
- package/src/effect-checks.ts +557 -0
- package/src/effect.ts +1202 -0
- package/src/effector-wire.ts +674 -0
- package/src/fail.ts +209 -0
- package/src/fingerprint.ts +4 -3
- package/src/gate.ts +8 -0
- package/src/git-clone.ts +65 -0
- package/src/git-push.ts +336 -0
- package/src/harness-client.ts +764 -48
- package/src/held-secrets.ts +82 -26
- package/src/holds.ts +156 -0
- package/src/http-effect.ts +1423 -0
- package/src/http.ts +916 -113
- package/src/images.ts +47 -21
- package/src/index.ts +62 -43
- package/src/instance.ts +505 -59
- package/src/internal.ts +84 -0
- package/src/kube-client.ts +333 -0
- package/src/machine-doc.ts +106 -6
- package/src/mechanism-routes.ts +168 -0
- package/src/model-keys.generated.ts +53 -0
- package/src/model-keys.ts +18 -58
- package/src/mount-digest.ts +53 -0
- package/src/names.ts +66 -8
- package/src/notices.ts +141 -0
- package/src/open-body.ts +1580 -0
- package/src/open-effect.ts +217 -0
- package/src/open.ts +59 -6
- package/src/parts.ts +709 -41
- package/src/party.ts +534 -0
- package/src/pick.ts +761 -0
- package/src/pool.ts +248 -37
- package/src/registration.ts +382 -19
- package/src/repo-fetch.ts +60 -85
- package/src/repos.ts +65 -75
- package/src/rest.ts +133 -0
- package/src/run-host.ts +2383 -115
- package/src/run-output.ts +38 -0
- package/src/sandbox-effect.ts +1126 -0
- package/src/sandbox-effector.ts +111 -0
- package/src/sandbox-kube.ts +1721 -0
- package/src/sandbox-watch.ts +260 -0
- package/src/secret-placement.ts +529 -0
- package/src/server.ts +284 -84
- package/src/setup.ts +819 -117
- package/src/size.ts +454 -0
- package/src/snapshot-store.ts +115 -20
- package/src/stub-harness.ts +49 -16
- package/src/sync-client.ts +54 -0
- package/src/timers.ts +191 -0
- package/src/tokens.ts +35 -4
- package/src/vocabulary.ts +135 -15
- package/src/wire.ts +238 -10
- package/src/workspace.ts +1195 -338
- package/src/sandbox-kubectl.ts +0 -1108
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: jr2Setup
|
|
3
|
+
description: "Set up a Machine that takes workflow events: the jr2 form of xstate's `setup()`."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `jr2Setup`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/setup.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Machine and events.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
function jr2Setup<
|
|
12
|
+
TContext extends MachineContext = MachineContext,
|
|
13
|
+
const TDefs extends readonly EventDef[] = readonly [],
|
|
14
|
+
TActors extends Record<string, UnknownActorLogic> = {},
|
|
15
|
+
TActions extends Record<string, ParameterizedObject["params"] | undefined> = {},
|
|
16
|
+
TGuards extends Record<string, ParameterizedObject["params"] | undefined> = {},
|
|
17
|
+
TDelay extends string = never,
|
|
18
|
+
TTag extends string = string,
|
|
19
|
+
TInput = NonReducibleUnknown,
|
|
20
|
+
TOutput extends NonReducibleUnknown = NonReducibleUnknown,
|
|
21
|
+
TEmitted extends EventObject = EventObject,
|
|
22
|
+
TMeta extends MetaObject = MetaObject,
|
|
23
|
+
>(
|
|
24
|
+
def: {
|
|
25
|
+
types?: {
|
|
26
|
+
context?: TContext;
|
|
27
|
+
input?: TInput;
|
|
28
|
+
output?: TOutput;
|
|
29
|
+
tags?: TTag;
|
|
30
|
+
emitted?: TEmitted;
|
|
31
|
+
meta?: TMeta;
|
|
32
|
+
};
|
|
33
|
+
events?: TDefs;
|
|
34
|
+
actors?: TActors;
|
|
35
|
+
actions?: {
|
|
36
|
+
[K in keyof TActions]: ActionFunction<
|
|
37
|
+
TContext,
|
|
38
|
+
WorkflowEvent<TDefs>,
|
|
39
|
+
WorkflowEvent<TDefs>,
|
|
40
|
+
TActions[K],
|
|
41
|
+
ToProvidedActor<MergedActors<TActors>>,
|
|
42
|
+
ToParameterizedObject<TActions>,
|
|
43
|
+
ToParameterizedObject<TGuards>,
|
|
44
|
+
TDelay,
|
|
45
|
+
TEmitted
|
|
46
|
+
>;
|
|
47
|
+
};
|
|
48
|
+
guards?: {
|
|
49
|
+
[K in keyof TGuards]: GuardPredicate<TContext, WorkflowEvent<TDefs>, TGuards[K], ToParameterizedObject<TGuards>>;
|
|
50
|
+
};
|
|
51
|
+
delays?: {
|
|
52
|
+
[K in TDelay]: DelayConfig<
|
|
53
|
+
TContext,
|
|
54
|
+
WorkflowEvent<TDefs>,
|
|
55
|
+
ToParameterizedObject<TActions>["params"],
|
|
56
|
+
WorkflowEvent<TDefs>
|
|
57
|
+
>;
|
|
58
|
+
};
|
|
59
|
+
} = {},
|
|
60
|
+
): SetupReturn<
|
|
61
|
+
TContext,
|
|
62
|
+
WorkflowEvent<TDefs>,
|
|
63
|
+
MergedActors<TActors>,
|
|
64
|
+
{},
|
|
65
|
+
TActions,
|
|
66
|
+
TGuards & SentByGuards,
|
|
67
|
+
TDelay,
|
|
68
|
+
TTag,
|
|
69
|
+
TInput,
|
|
70
|
+
TOutput,
|
|
71
|
+
TEmitted,
|
|
72
|
+
TMeta
|
|
73
|
+
>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Set up a Machine that takes workflow events: the jr2 form of xstate's `setup()`. Write a Machine
|
|
77
|
+
with it when an Agent or a Gate sends events into the Machine, or when the Machine declares a
|
|
78
|
+
door. Call `.createMachine(config)` on the result, as with `setup()`. The Machine you get is a
|
|
79
|
+
plain xstate Machine.
|
|
80
|
+
|
|
81
|
+
What it adds to `setup()`:
|
|
82
|
+
- `events` replaces `types.events`. The event type of the Machine comes from the
|
|
83
|
+
`defineEvent` events you list, plus the events jr2 itself sends (`agent.fault`,
|
|
84
|
+
`workspace.lost`). An event that a party sent has `event.sender`. A Machine that takes no
|
|
85
|
+
workflow event leaves out `events`.
|
|
86
|
+
- The `gate` actor is ready to invoke by name: `invoke: { src: "gate" }`.
|
|
87
|
+
- Each Agent slot (`actors: { coder: agent(…) }`) gets its Menu from the states that invoke it.
|
|
88
|
+
- The `sentBy(id)` guard is ready to use.
|
|
89
|
+
- `createMachine` also takes `input`: a zod object for the input that starts a run. jr2 checks
|
|
90
|
+
each start against it. Without it, a run can start with any input. The `setup()` of xstate
|
|
91
|
+
does not read this `input`, so a Machine with a door uses `jr2Setup`, also when it takes no
|
|
92
|
+
workflow event. `jr2 up` and the publish door refuse a registered Machine that has a zod
|
|
93
|
+
`input` if `jr2Setup` did not make the Machine: ``workflow "<name>": machine "<id>" has a zod `input` on
|
|
94
|
+
createMachine, but jr2Setup did not make this Machine, so no door reads that input …``
|
|
95
|
+
|
|
96
|
+
The output of a run is the root `output` of `createMachine`, beside `id` and `states`, as in
|
|
97
|
+
xstate v5. xstate does not read the `output` of a final state as the output of the Machine. It
|
|
98
|
+
gives that output to the root `output` as `event.output`. Write
|
|
99
|
+
`output: ({ event }) => event.output as Output` at the root, or make the output from `context`
|
|
100
|
+
there. `createMachine` refuses an `output` on a final state directly below the root when the root
|
|
101
|
+
has no `output` (see the list below).
|
|
102
|
+
|
|
103
|
+
`createMachine` refuses a Machine that it cannot run as written. Among the refusals:
|
|
104
|
+
- an `on` key that no listed event has: ``machine "<id>" handles event "<key>", which no def in
|
|
105
|
+
jr2Setup({ events }) declares (declared: <names>) — a typo, or a missing defineEvent``
|
|
106
|
+
- a listed event that no state takes: ``machine "<id>" declares "<name>", which no state handles
|
|
107
|
+
— a pick no state takes is on no Menu and no Gate: handle it, or drop it from
|
|
108
|
+
jr2Setup({ events })``
|
|
109
|
+
- an entry of `events` that `defineEvent` did not make, or one name listed twice:
|
|
110
|
+
``machine "<id>": `events` entry is not a defineEvent() def: <entry>``,
|
|
111
|
+
``machine "<id>": duplicate event "<name>" in `events` ``
|
|
112
|
+
- an `agent()`, an Effect or a `workspace()` written on `invoke.src` instead of under `actors`:
|
|
113
|
+
``machine "<id>": state "<state>" invokes <part> inline — a Part is a key of actors, so it has
|
|
114
|
+
a name that the ledger, the report and customize() share: actors: { <name>: <factory>(...) },
|
|
115
|
+
then invoke: { src: "<name>" }``. `<part>` is `an Agent`, `an Effect` or `a Workspace`.
|
|
116
|
+
`<factory>` is `agent`, the Effect's kind (such as `command`), or `workspace`.
|
|
117
|
+
- an `output` on a final state directly below the root, when the root has no `output`:
|
|
118
|
+
``machine "<id>": final state "<state>" declares an output, and the root has no output — xstate
|
|
119
|
+
v5 gives a run only its root output, so this output reaches nothing and the run ends with none:
|
|
120
|
+
write it at the root, as output: ({ context }) => ..., or keep it on the final state and pass it
|
|
121
|
+
on with output: ({ event }) => event.output at the root``. With more than one such final state,
|
|
122
|
+
it names each one and puts the words in the plural: ``final states "<state>", "<state>"
|
|
123
|
+
declare an output``, ``these outputs reach nothing``, ``write one at the root`` and ``keep
|
|
124
|
+
them on the final states and pass them on``. An `output` on a
|
|
125
|
+
final state inside a compound state is legal: the `onDone` of that compound state gets it as
|
|
126
|
+
`event.output`.
|
|
127
|
+
- a parallel state at or below a state that invokes an Agent: ``machine "<id>": state "<state>"
|
|
128
|
+
is parallel, at or below Agent "<slot>"'s state "<state>" — a parallel region below an Agent's
|
|
129
|
+
state is reserved for picks the Agent does not wait for, which jr2 does not build; background
|
|
130
|
+
work goes above the Agent's state``
|
|
131
|
+
- a state below an Agent's state that invokes something and that nothing enters: ``machine
|
|
132
|
+
"<id>": state "<state>" below Agent "<slot>"'s state "<state>" is entered by nothing, so what
|
|
133
|
+
it invokes (<src>) never runs — target it from a pick or a route, or delete it``
|
|
134
|
+
- a state that invokes an Agent when that state and each state above it have no `agent.fault`
|
|
135
|
+
route: ``machine "<id>": state "<state>" invokes an Agent, and no route for "agent.fault" is
|
|
136
|
+
on it or on a state above — jr2 sends agent.fault when the Agent's Turn cannot go on, and with
|
|
137
|
+
no route the run faults: route it on that state or on a state above it, as on: {
|
|
138
|
+
"agent.fault": "<the state that handles it>" } (ADR-0074)``. A state that invokes an Open body
|
|
139
|
+
that lends an Agent or allows a model gets the same line, with `invokes an Open body that can
|
|
140
|
+
run an Agent`: the body sends it a Chart's unrouted `agent.fault`. When both kinds have no route,
|
|
141
|
+
one line names both, joined by `, and`. One route on the root is a route for each state. A
|
|
142
|
+
Chart's Machine does not get this refusal: in a Chart the route is optional ([ADR-0070](../decisions/0070-a-machine-lends-its-parts-to-a-chart.md)).
|
|
143
|
+
|
|
144
|
+
It also refuses a `sentBy` that names no party (see `sentBy`). It refuses a pick param that
|
|
145
|
+
nothing reads, where the pick enters a state that invokes an Effect (see `fromPick`). Shapes that
|
|
146
|
+
are legal but probably not what you mean, such as a mode that nothing enters, are warnings that
|
|
147
|
+
`jr2 up` prints.
|
|
148
|
+
|
|
149
|
+
**Parameters**
|
|
150
|
+
|
|
151
|
+
- `def`: What `setup()` takes, with `events` in place of `types.events`. A Machine that
|
|
152
|
+
needs none of it calls `jr2Setup()`.
|
|
153
|
+
|
|
154
|
+
- `types` (optional): `object`
|
|
155
|
+
|
|
156
|
+
The types of the Machine, as in `setup()`: `context`, `input`, `output`, `tags`, `emitted`
|
|
157
|
+
and `meta`. Not `events`: the event type comes from `events`.
|
|
158
|
+
|
|
159
|
+
- `context` (optional): `TContext`
|
|
160
|
+
- `input` (optional): `TInput`
|
|
161
|
+
- `output` (optional): `TOutput`
|
|
162
|
+
- `tags` (optional): `TTag`
|
|
163
|
+
- `emitted` (optional): `TEmitted`
|
|
164
|
+
- `meta` (optional): `TMeta`
|
|
165
|
+
- `events` (optional): `TDefs`
|
|
166
|
+
|
|
167
|
+
The workflow events this Machine takes: each one made by `defineEvent`. Leave it out when the
|
|
168
|
+
Machine takes none. Each listed event must be the name of an `on` key. Each `on` key must be
|
|
169
|
+
listed, if it is not a jr2 or xstate event (an event with a `.` in its name).
|
|
170
|
+
- `actors` (optional): `TActors`
|
|
171
|
+
|
|
172
|
+
The actors the states invoke by name, as in `setup()`: Agent slots (`agent(…)`), Effects
|
|
173
|
+
(`command(…)`, `http(…)`, `push(…)`), child Machines, `workspace(…)` and plain xstate logic.
|
|
174
|
+
The key is the slot's name. An actor named `gate` replaces jr2's Gate.
|
|
175
|
+
- `actions` (optional): `{ [K in keyof TActions]: ActionFunction<TContext, WorkflowEvent<TDefs>, WorkflowEvent<TDefs>, TActions[K], ToProvidedActor<MergedActors<TActors>>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TEmitted>; }`
|
|
176
|
+
|
|
177
|
+
Named actions, as in `setup()`. Their `event` has the type of this Machine's events.
|
|
178
|
+
- `guards` (optional): `{ [K in keyof TGuards]: GuardPredicate<TContext, WorkflowEvent<TDefs>, TGuards[K], ToParameterizedObject<TGuards>>; }`
|
|
179
|
+
|
|
180
|
+
Named guards, as in `setup()`. `sentBy` is there already; do not name a guard `jr2.sentBy`.
|
|
181
|
+
- `delays` (optional): `{ [K in TDelay]: DelayConfig<TContext, WorkflowEvent<TDefs>, ToParameterizedObject<TActions>["params"], WorkflowEvent<TDefs>>; }`
|
|
182
|
+
|
|
183
|
+
Named delays, as in `setup()`.
|
|
184
|
+
|
|
185
|
+
**Returns**: What `setup()` returns. Call `.createMachine(config)` on it.
|
|
186
|
+
|
|
187
|
+
**Example**
|
|
188
|
+
|
|
189
|
+
```ts
|
|
190
|
+
import { z } from "zod";
|
|
191
|
+
import { agent, defineEvent, fail, jr2Setup } from "@jr2/orchestrator";
|
|
192
|
+
|
|
193
|
+
const proposed = defineEvent({
|
|
194
|
+
name: "proposed",
|
|
195
|
+
description: "Call this with your plan.",
|
|
196
|
+
input: z.object({ plan: z.string() }),
|
|
197
|
+
});
|
|
198
|
+
const approve = defineEvent({ name: "approve", input: z.object({}) });
|
|
199
|
+
const reject = defineEvent({ name: "reject", input: z.object({ reason: z.string() }) });
|
|
200
|
+
|
|
201
|
+
export const machine = jr2Setup({
|
|
202
|
+
types: {} as { input: { goal: string }; context: { goal: string } },
|
|
203
|
+
events: [proposed, approve, reject],
|
|
204
|
+
actors: {
|
|
205
|
+
planner: agent({
|
|
206
|
+
model: "anthropic/claude-haiku-5-5",
|
|
207
|
+
instructions: "You plan small releases.",
|
|
208
|
+
workspace: "none",
|
|
209
|
+
}),
|
|
210
|
+
fail: fail(),
|
|
211
|
+
},
|
|
212
|
+
}).createMachine({
|
|
213
|
+
id: "plan",
|
|
214
|
+
input: z.object({ goal: z.string() }),
|
|
215
|
+
context: ({ input }) => ({ goal: input.goal }),
|
|
216
|
+
on: { "agent.fault": ".failed" },
|
|
217
|
+
initial: "planning",
|
|
218
|
+
states: {
|
|
219
|
+
planning: {
|
|
220
|
+
invoke: { src: "planner", input: ({ context }) => ({ prompt: `Plan this: ${context.goal}` }) },
|
|
221
|
+
on: { proposed: "review" },
|
|
222
|
+
},
|
|
223
|
+
review: {
|
|
224
|
+
invoke: { src: "gate" },
|
|
225
|
+
on: { approve: "approved", reject: "planning" },
|
|
226
|
+
},
|
|
227
|
+
approved: { type: "final" },
|
|
228
|
+
failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**See also**
|
|
234
|
+
|
|
235
|
+
- [Write a Workflow](../../guides/write-a-workflow.md)
|
|
236
|
+
- [Machines and Workflows](../../concepts/machines-and-workflows.md)
|
|
237
|
+
- [ADR-0015: Workflows are authored through `jr2Setup`; vocabulary and agent menus derive from the machine](../decisions/0015-authoring-surface-absorbs-the-mechanism.md)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: open
|
|
3
|
+
description: "Leave a part of a Machine Open: for the Instance that registers the Machine to bind with `customize()`."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `open`
|
|
7
|
+
|
|
8
|
+
Constant, in `@jr2/orchestrator/src/open.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
const open: unique symbol
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Leave a part of a Machine Open: for the Instance that registers the Machine to bind with
|
|
15
|
+
`customize()`. Write it where a value goes, in a Machine that you publish as a package, for a
|
|
16
|
+
part that the package cannot know or pay for:
|
|
17
|
+
- a Repo Slot: `repos: { app: open }`, or the whole map: `repos: open`;
|
|
18
|
+
- an Agent's model: `agent({ model: open, … })`;
|
|
19
|
+
- an Effect's url or argv: `http({ url: open, … })`, `command(open)`;
|
|
20
|
+
- the secret of an Effect's auth, of a header, or of a command's `env`: `secret(open)`.
|
|
21
|
+
|
|
22
|
+
`jr2 up` refuses a Workflow with an Open part that nobody bound, and prints the `customize()`
|
|
23
|
+
line that binds it: ``refusing: workflow "<name>" leaves <part> open — bind it where the Machine
|
|
24
|
+
is registered: export const machine = customize(<import>, …) (<adr>)``. A run never sees an
|
|
25
|
+
Open part.
|
|
26
|
+
|
|
27
|
+
**Example**
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { z } from "zod";
|
|
31
|
+
import { agent, customize, defineEvent, fail, jr2Setup, open, workspace } from "@jr2/orchestrator";
|
|
32
|
+
|
|
33
|
+
const finish = defineEvent({
|
|
34
|
+
name: "finish",
|
|
35
|
+
description: "Call this when `node --test` passes.",
|
|
36
|
+
input: z.object({}),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const body = jr2Setup({
|
|
40
|
+
events: [finish],
|
|
41
|
+
actors: { coder: agent({ model: open, instructions: "You fix the failing test." }), fail: fail() },
|
|
42
|
+
}).createMachine({
|
|
43
|
+
id: "fix",
|
|
44
|
+
on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
|
|
45
|
+
initial: "coding",
|
|
46
|
+
states: {
|
|
47
|
+
coding: {
|
|
48
|
+
invoke: { src: "coder", input: { prompt: "Make `node --test` pass." } },
|
|
49
|
+
on: { finish: "done" },
|
|
50
|
+
},
|
|
51
|
+
done: { type: "final" },
|
|
52
|
+
failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
|
|
53
|
+
lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// What a package exports: the repository and the model are Open.
|
|
58
|
+
export const fix = workspace(body, {
|
|
59
|
+
repos: { app: open },
|
|
60
|
+
spec: () => ({ branch: "jr2/fix" }),
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// What an Instance's `workflows/fix.ts` exports: the same Machine, its Open parts bound.
|
|
64
|
+
export const machine = customize(fix, {
|
|
65
|
+
repos: { app: { url: "https://github.com/you/app.git" } },
|
|
66
|
+
agents: { coder: { model: "anthropic/claude-haiku-5-5" } },
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**See also**
|
|
71
|
+
|
|
72
|
+
- [Bind a shipped Machine's Open parts](../../guides/bind-open-parts.md)
|
|
73
|
+
- [Composition](../../concepts/composition.md)
|
|
74
|
+
- [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,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: openBody
|
|
3
|
+
description: "Make an Open body: the actor slot that a Chart binds."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `openBody`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/open-body.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Charts.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
function openBody(decl: OpenBodyDeclaration): OpenBodyLogic
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Make an Open body: the actor slot that a Chart binds. Put it in `actors`, and invoke it from a
|
|
15
|
+
state with `{ chart, ...input }`. `chart` is the text of a Chart, or `{ name }` for a named
|
|
16
|
+
Chart of this wrapper. The other keys are the input of the Chart, which it reads as
|
|
17
|
+
`{{input.<key>}}`. A Machine with an Open body is a Chart wrapper.
|
|
18
|
+
|
|
19
|
+
Each Agent Turn of the Chart runs where the Open body runs: in the Sandbox of its `workspace()`,
|
|
20
|
+
or on the Instance Harness. The Open body ends with an [`OpenBodyOutput`](type-openbodyoutput.md).
|
|
21
|
+
|
|
22
|
+
It refuses a declaration that is not correct: `openBody: <problem>; <problem>`, for example
|
|
23
|
+
`ceilings.turns: missing; an Open body states every ceiling`. `createMachine` refuses a lent
|
|
24
|
+
name that the Machine does not have: `machine "<id>": Open body "<slot>": lends.agents: "<name>"
|
|
25
|
+
is no actor slot of this Machine; its actors: <slots>`.
|
|
26
|
+
|
|
27
|
+
**Parameters**
|
|
28
|
+
|
|
29
|
+
- `decl`: What a Chart can use, and its limits (see [`OpenBodyDeclaration`](type-openbodydeclaration.md)).
|
|
30
|
+
|
|
31
|
+
**Returns**: The actor logic of the slot.
|
|
32
|
+
|
|
33
|
+
**Example**
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { assign } from "xstate";
|
|
37
|
+
import { z } from "zod";
|
|
38
|
+
import { agent, chartSchema, fail, jr2Setup, openBody, type OpenBodyOutput } from "@jr2/orchestrator";
|
|
39
|
+
|
|
40
|
+
// `chart` is a Chart, so a run input can carry one, and Charts can have names.
|
|
41
|
+
const door = z.object({ topic: z.string(), chart: chartSchema });
|
|
42
|
+
type Input = z.infer<typeof door>;
|
|
43
|
+
type Context = Input & { result?: OpenBodyOutput };
|
|
44
|
+
|
|
45
|
+
export const machine = jr2Setup({
|
|
46
|
+
types: {} as { context: Context; input: Input },
|
|
47
|
+
actors: {
|
|
48
|
+
writer: agent({
|
|
49
|
+
model: "anthropic/claude-haiku-5-5",
|
|
50
|
+
workspace: "none",
|
|
51
|
+
instructions: "You write clear, short text for engineers.",
|
|
52
|
+
}),
|
|
53
|
+
body: openBody({
|
|
54
|
+
lends: { agents: ["writer"] },
|
|
55
|
+
allows: { models: [], workspace: [] },
|
|
56
|
+
ceilings: { turns: 6, wallClock: "15m", transitions: 200, fanOut: 1, size: 65536 },
|
|
57
|
+
}),
|
|
58
|
+
fail: fail(),
|
|
59
|
+
},
|
|
60
|
+
}).createMachine({
|
|
61
|
+
id: "notes",
|
|
62
|
+
input: door,
|
|
63
|
+
context: ({ input }) => ({ ...input }),
|
|
64
|
+
// The fault of `writer` when a Chart does not route it: the Open body sends it here.
|
|
65
|
+
on: { "agent.fault": ".failed" },
|
|
66
|
+
initial: "running",
|
|
67
|
+
states: {
|
|
68
|
+
running: {
|
|
69
|
+
invoke: {
|
|
70
|
+
src: "body",
|
|
71
|
+
input: ({ context }: { context: Context }) => ({ chart: context.chart, topic: context.topic }),
|
|
72
|
+
onDone: { target: "done", actions: assign({ result: ({ event }) => event.output as OpenBodyOutput }) },
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
done: { type: "final" },
|
|
76
|
+
failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**See also**
|
|
82
|
+
|
|
83
|
+
- [Charts](../../concepts/charts.md)
|
|
84
|
+
- [Run a Chart by name](../../guides/run-a-chart-by-name.md)
|
|
85
|
+
- [Let an Agent write a Chart](../../guides/let-an-agent-write-a-chart.md)
|
|
86
|
+
- [ADR-0070: A Machine lends its parts to a Chart](../decisions/0070-a-machine-lends-its-parts-to-a-chart.md)
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: paramsOf
|
|
3
|
+
description: Read the params of a pick from the event that entered the state.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `paramsOf`
|
|
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 paramsOf<
|
|
12
|
+
N extends string,
|
|
13
|
+
I extends z.ZodObject,
|
|
14
|
+
>(
|
|
15
|
+
event: EventObject,
|
|
16
|
+
def: EventDef<N, I>,
|
|
17
|
+
): z.infer<I>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Read the params of a pick from the event that entered the state. Use it in a plain `input`
|
|
21
|
+
mapper when the Machine must change a param before the invoked actor gets it. When the params go
|
|
22
|
+
to the input as they are, use `fromPick`.
|
|
23
|
+
|
|
24
|
+
It parses the params with the `input` schema of the pick. It refuses an event that is not this
|
|
25
|
+
pick: `state entered by "<event>", but its input reads the params of pick "<pick>"`.
|
|
26
|
+
|
|
27
|
+
`createMachine` calls each mapper one time to see which params it reads. When the mapper throws
|
|
28
|
+
there, `jr2 up` prints a warning before a run starts: `pick "<pick>" enters state "<state>"
|
|
29
|
+
(Effect "<slot>"): could not probe the input mapper (<error>); its params are unchecked`.
|
|
30
|
+
|
|
31
|
+
`createMachine` refuses a param of a pick that enters a state that invokes an Effect, when
|
|
32
|
+
nothing reads the param: `machine "<id>": pick "<pick>" enters state "<state>" (Effect
|
|
33
|
+
"<slot>"), which never reads "<param>": the Agent supplies it and nothing uses it — map it in an
|
|
34
|
+
invoke's input, store it with assign, or drop it from the def`.
|
|
35
|
+
|
|
36
|
+
**Parameters**
|
|
37
|
+
|
|
38
|
+
- `event`: The event that entered the state: the `event` that the mapper gets.
|
|
39
|
+
- `def` ([`EventDef`](type-eventdef.md)): The pick, as `defineEvent` made it.
|
|
40
|
+
|
|
41
|
+
**Returns**: The params of the pick, typed by its `input` schema.
|
|
42
|
+
|
|
43
|
+
**Example**
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { z } from "zod";
|
|
47
|
+
import {
|
|
48
|
+
agent,
|
|
49
|
+
arg,
|
|
50
|
+
command,
|
|
51
|
+
defineEvent,
|
|
52
|
+
fail,
|
|
53
|
+
jr2Setup,
|
|
54
|
+
paramsOf,
|
|
55
|
+
workspace,
|
|
56
|
+
type Workspaced,
|
|
57
|
+
} from "@jr2/orchestrator";
|
|
58
|
+
|
|
59
|
+
const runTest = defineEvent({
|
|
60
|
+
name: "run_test",
|
|
61
|
+
description: "Run the tests of one module.",
|
|
62
|
+
input: z.object({ module: z.string() }),
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const finished = defineEvent({
|
|
66
|
+
name: "finished",
|
|
67
|
+
description: "Say that all the tests pass.",
|
|
68
|
+
input: z.object({}),
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
type Input = Workspaced<{}, "app">;
|
|
72
|
+
|
|
73
|
+
const body = jr2Setup({
|
|
74
|
+
types: {} as { context: Input; input: Input },
|
|
75
|
+
events: [runTest, finished],
|
|
76
|
+
actors: {
|
|
77
|
+
coder: agent({
|
|
78
|
+
model: "anthropic/claude-haiku-5-5",
|
|
79
|
+
instructions: "You are a careful engineer.",
|
|
80
|
+
}),
|
|
81
|
+
test: command(["node", "--test", arg("file")]),
|
|
82
|
+
fail: fail(),
|
|
83
|
+
},
|
|
84
|
+
}).createMachine({
|
|
85
|
+
id: "fix-tests",
|
|
86
|
+
context: ({ input }) => input,
|
|
87
|
+
on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
|
|
88
|
+
initial: "coding",
|
|
89
|
+
states: {
|
|
90
|
+
coding: {
|
|
91
|
+
invoke: {
|
|
92
|
+
src: "coder",
|
|
93
|
+
input: { prompt: "Make the tests pass. Run the tests of one module at a time." },
|
|
94
|
+
},
|
|
95
|
+
on: { finished: "done" },
|
|
96
|
+
initial: "ready",
|
|
97
|
+
states: {
|
|
98
|
+
ready: { on: { run_test: "testing" } },
|
|
99
|
+
testing: {
|
|
100
|
+
invoke: {
|
|
101
|
+
src: "test",
|
|
102
|
+
// A plain mapper: the Machine makes the file name from the pick's `module`.
|
|
103
|
+
input: ({ event }) => ({ file: `test/${paramsOf(event, runTest).module}.test.js` }),
|
|
104
|
+
onDone: "ready",
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
done: { type: "final" },
|
|
110
|
+
failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
|
|
111
|
+
lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
export const machine = workspace(body, {
|
|
116
|
+
repos: { app: { url: "https://github.com/you/app.git" } },
|
|
117
|
+
spec: () => ({ branch: "fix-tests" }),
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**See also**
|
|
122
|
+
|
|
123
|
+
- [Effects](../../concepts/effects.md)
|
|
124
|
+
- [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
|
|
125
|
+
- [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)
|