@jr2/orchestrator 0.4.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -2
- package/console/components/app.ts +2 -0
- package/console/components/fleet.ts +14 -1
- package/console/components/machine-pane.ts +41 -2
- package/console/main.ts +13 -1
- package/console/store.ts +102 -6
- package/console/style.css +21 -0
- package/docs/agents-block.md +5 -0
- package/docs/concepts/agents-and-turns.md +478 -0
- package/docs/concepts/architecture.md +243 -0
- package/docs/concepts/charts.md +146 -0
- package/docs/concepts/composition.md +357 -0
- package/docs/concepts/converge.md +257 -0
- package/docs/concepts/durable-runs.md +189 -0
- package/docs/concepts/effects.md +658 -0
- package/docs/concepts/gates.md +208 -0
- package/docs/concepts/machines-and-workflows.md +298 -0
- package/docs/concepts/pools-and-sources.md +230 -0
- package/docs/concepts/secrets-and-trust.md +306 -0
- package/docs/concepts/the-menu.md +381 -0
- package/docs/concepts/workspaces.md +756 -0
- package/docs/get-started/a-model-decides.md +563 -0
- package/docs/get-started/an-agent-in-a-sandbox.md +383 -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 +993 -0
- package/docs/get-started/install.md +130 -0
- package/docs/guides/add-tools-to-the-sandbox.md +308 -0
- package/docs/guides/answer-a-gate.md +304 -0
- package/docs/guides/bind-open-parts.md +224 -0
- package/docs/guides/cancel-a-run.md +146 -0
- package/docs/guides/clean-up.md +206 -0
- package/docs/guides/cut-a-worktree.md +560 -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 +230 -0
- package/docs/guides/look-inside-a-sandbox.md +177 -0
- package/docs/guides/mirror-the-kit-images.md +176 -0
- package/docs/guides/move-from-kind-to-a-shared-cluster.md +318 -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 +532 -0
- package/docs/guides/run-a-chart-by-name.md +270 -0
- package/docs/guides/run-a-command-or-call-a-url.md +587 -0
- package/docs/guides/run-one-worker-per-item.md +322 -0
- package/docs/guides/set-an-agents-access-and-dials.md +420 -0
- package/docs/guides/size-a-workspace.md +217 -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 +214 -0
- package/docs/guides/use-a-local-model.md +313 -0
- package/docs/guides/watch-a-run.md +349 -0
- package/docs/guides/write-a-workflow.md +318 -0
- package/docs/index.md +44 -0
- package/docs/llms.txt +237 -0
- package/docs/reference/authoring-surface/agent.md +151 -0
- package/docs/reference/authoring-surface/answer.md +156 -0
- package/docs/reference/authoring-surface/arg.md +82 -0
- package/docs/reference/authoring-surface/basic.md +62 -0
- package/docs/reference/authoring-surface/bearer.md +53 -0
- package/docs/reference/authoring-surface/branchname.md +15 -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 +206 -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 +96 -0
- package/docs/reference/authoring-surface/file.md +142 -0
- package/docs/reference/authoring-surface/frompick.md +277 -0
- package/docs/reference/authoring-surface/http.md +259 -0
- package/docs/reference/authoring-surface/isfailure.md +58 -0
- package/docs/reference/authoring-surface/isready.md +14 -0
- package/docs/reference/authoring-surface/jr2setup.md +237 -0
- package/docs/reference/authoring-surface/open.md +105 -0
- package/docs/reference/authoring-surface/openbody.md +86 -0
- package/docs/reference/authoring-surface/paramsof.md +143 -0
- package/docs/reference/authoring-surface/pool.md +186 -0
- package/docs/reference/authoring-surface/push.md +130 -0
- package/docs/reference/authoring-surface/readyof.md +21 -0
- package/docs/reference/authoring-surface/secret.md +139 -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 +15 -0
- package/docs/reference/authoring-surface/type-answeraction.md +12 -0
- package/docs/reference/authoring-surface/type-anyframepath.md +14 -0
- package/docs/reference/authoring-surface/type-anyworktreepath.md +15 -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-bindactors.md +14 -0
- package/docs/reference/authoring-surface/type-binding.md +61 -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 +20 -0
- package/docs/reference/authoring-surface/type-commandoptions.md +56 -0
- package/docs/reference/authoring-surface/type-commandoutput.md +122 -0
- package/docs/reference/authoring-surface/type-customize.md +111 -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 +72 -0
- package/docs/reference/authoring-surface/type-doorlessinput.md +19 -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 +37 -0
- package/docs/reference/authoring-surface/type-framepath.md +14 -0
- package/docs/reference/authoring-surface/type-frominput.md +14 -0
- package/docs/reference/authoring-surface/type-hostinjectedinput.md +56 -0
- package/docs/reference/authoring-surface/type-httpdefinition.md +104 -0
- package/docs/reference/authoring-surface/type-httpfileinput.md +20 -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 +95 -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-lateroutcome.md +21 -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-namestart.md +77 -0
- package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +27 -0
- package/docs/reference/authoring-surface/type-notworktreekeys.md +12 -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 +22 -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 +26 -0
- package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +27 -0
- package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
- package/docs/reference/authoring-surface/type-poolnextinput.md +22 -0
- package/docs/reference/authoring-surface/type-poolspec.md +60 -0
- package/docs/reference/authoring-surface/type-pushinput.md +34 -0
- package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
- package/docs/reference/authoring-surface/type-pushoutput.md +149 -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 +84 -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 +24 -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 +115 -0
- package/docs/reference/authoring-surface/type-workspacehandles.md +22 -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 +27 -0
- package/docs/reference/authoring-surface/type-worktreefound.md +16 -0
- package/docs/reference/authoring-surface/type-worktreeinput.md +56 -0
- package/docs/reference/authoring-surface/type-worktreekey.md +14 -0
- package/docs/reference/authoring-surface/type-worktreeoptions.md +29 -0
- package/docs/reference/authoring-surface/type-worktreeoutput.md +45 -0
- package/docs/reference/authoring-surface/type-worktreepath.md +16 -0
- package/docs/reference/authoring-surface/type-worktreeready.md +37 -0
- package/docs/reference/authoring-surface/type-worktreerefused.md +21 -0
- package/docs/reference/authoring-surface/workspace.md +287 -0
- package/docs/reference/authoring-surface/worktree.md +71 -0
- package/docs/reference/authoring-surface.md +217 -0
- package/docs/reference/cli.md +433 -0
- package/docs/reference/config.md +765 -0
- package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +114 -0
- package/docs/reference/decisions/0002-duplex-streaming-actor.md +117 -0
- package/docs/reference/decisions/0004-worktree-provisioning-model.md +130 -0
- package/docs/reference/decisions/0005-sandbox-pod-composition.md +240 -0
- package/docs/reference/decisions/0006-agent-control-surface.md +50 -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 +175 -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 +271 -0
- package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +126 -0
- package/docs/reference/decisions/0017-pool-over-a-source-port.md +71 -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 +287 -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 +101 -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 +175 -0
- package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +436 -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 +245 -0
- package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +90 -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 +193 -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 +126 -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 +238 -0
- package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +86 -0
- package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +123 -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 +108 -0
- package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +427 -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 +239 -0
- package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +82 -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 +552 -0
- package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +458 -0
- package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +475 -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 +334 -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/0075-a-machine-cuts-a-worktree-and-the-workspace-only-clones.md +295 -0
- package/docs/reference/decisions/0076-an-agents-control-credential-lives-only-where-no-workspace-code-runs.md +320 -0
- package/docs/reference/decisions/0077-jr2-requires-landlock-on-every-sandbox-node.md +79 -0
- package/docs/reference/decisions.md +86 -0
- package/docs/reference/glossary.md +687 -0
- package/docs/reference/http-api.md +1386 -0
- package/docs/reference/machines.md +189 -0
- package/docs/reference/mechanism-events.md +72 -0
- package/docs/why.md +207 -0
- package/package.json +5 -3
- package/src/actor.ts +694 -106
- package/src/agent.ts +114 -38
- package/src/ambient.ts +3 -4
- package/src/assembly-checks.ts +189 -7
- package/src/cause.ts +234 -0
- package/src/chart.ts +345 -46
- package/src/charts.ts +43 -8
- package/src/config.ts +440 -178
- package/src/custodian.lua +17 -5
- package/src/custodian.ts +325 -99
- package/src/customize.ts +199 -49
- 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 +50 -3
- package/src/effect.ts +641 -128
- package/src/effector-wire.ts +165 -13
- package/src/fail.ts +222 -0
- package/src/harness-client.ts +587 -50
- package/src/harness-env.ts +33 -0
- package/src/held-secrets.ts +125 -16
- package/src/holds.ts +3 -0
- package/src/http-effect.ts +556 -58
- package/src/http.ts +480 -30
- package/src/index.ts +74 -82
- package/src/instance.ts +68 -8
- package/src/internal.ts +85 -0
- package/src/kube-client.ts +6 -3
- package/src/machine-doc.ts +24 -7
- package/src/mechanism-routes.ts +168 -0
- package/src/model-keys.generated.ts +53 -0
- package/src/model-keys.ts +42 -58
- package/src/names.ts +19 -6
- package/src/notices.ts +483 -41
- package/src/open-body.ts +242 -40
- package/src/open-effect.ts +81 -8
- package/src/open.ts +90 -6
- package/src/parts.ts +213 -30
- package/src/party.ts +101 -2
- package/src/pick.ts +497 -11
- package/src/pool.ts +282 -50
- package/src/registration.ts +133 -12
- package/src/repo-identity.ts +7 -3
- package/src/repos.ts +22 -3
- package/src/run-host.ts +665 -45
- package/src/run-output.ts +38 -0
- package/src/sandbox-effect.ts +457 -71
- package/src/sandbox-kube.ts +66 -17
- package/src/secret-placement.ts +59 -17
- package/src/server.ts +3 -0
- package/src/setup.ts +325 -62
- package/src/size.ts +121 -9
- package/src/snapshot-store.ts +54 -10
- package/src/stub-harness.ts +44 -16
- package/src/timers.ts +14 -1
- package/src/tokens.ts +107 -32
- package/src/vocabulary.ts +88 -14
- package/src/wire.ts +100 -26
- package/src/workspace.ts +771 -238
- package/src/worktree.ts +249 -0
package/src/setup.ts
CHANGED
|
@@ -29,6 +29,7 @@ import { randomUUID } from "node:crypto";
|
|
|
29
29
|
import {
|
|
30
30
|
setup,
|
|
31
31
|
type ActionFunction,
|
|
32
|
+
type ActorLogic,
|
|
32
33
|
type AnyActorRef,
|
|
33
34
|
type AnyStateMachine,
|
|
34
35
|
type DelayConfig,
|
|
@@ -39,6 +40,7 @@ import {
|
|
|
39
40
|
type NonReducibleUnknown,
|
|
40
41
|
type ParameterizedObject,
|
|
41
42
|
type SetupReturn,
|
|
43
|
+
type Snapshot,
|
|
42
44
|
type UnknownActorLogic,
|
|
43
45
|
} from "xstate";
|
|
44
46
|
import type { z } from "zod";
|
|
@@ -46,38 +48,65 @@ import { eventMap, type EventDef, type EventFrom, type Sender } from "@jr2/agent
|
|
|
46
48
|
import type { AgentRunInput, AgentTurnInput, FaultTelemetry } from "./actor.ts";
|
|
47
49
|
import { isAgent } from "./agent.ts";
|
|
48
50
|
import { isEffect } from "./effect.ts";
|
|
49
|
-
import {
|
|
51
|
+
import type { AnyFramePath, FramePath, WorktreePath, WorktreeReady } from "./worktree.ts";
|
|
52
|
+
import { effectChecks, refuseUnroutedOutcome } from "./effect-checks.ts";
|
|
50
53
|
import { gate } from "./gate.ts";
|
|
51
54
|
import { attachLent, isOpenBody, openBodyDeclarationOf, type LentParts } from "./open-body.ts";
|
|
52
55
|
import { refuseInlineParts } from "./parts.ts";
|
|
53
|
-
import { partyWarnings, refuseUnknownSentBy, SENT_BY, sentByGuard } from "./party.ts";
|
|
56
|
+
import { partyWarnings, refuseSlotActiveTwice, refuseUnknownSentBy, SENT_BY, sentByGuard } from "./party.ts";
|
|
57
|
+
import { refuseLostOutput } from "./run-output.ts";
|
|
58
|
+
import { refuseUnroutedAgentFault } from "./mechanism-routes.ts";
|
|
54
59
|
import { boundEpoch, boundRunId, continuedIid } from "./registration.ts";
|
|
55
60
|
import { attachInputSchema, attachLoadWarnings, attachSeats, attachVocabulary } from "./vocabulary.ts";
|
|
56
61
|
|
|
57
62
|
/**
|
|
58
|
-
* The
|
|
59
|
-
*
|
|
60
|
-
*
|
|
63
|
+
* The marker that `compileChart` puts on the config of a Chart's Machine (ADR-0070). In a Chart the
|
|
64
|
+
* `agent.fault` route is optional: the Open body sends an `agent.fault` that no transition takes to
|
|
65
|
+
* the Machine that invoked it, so `createMachine` does not refuse a Chart state with no route. Not on the Authoring
|
|
66
|
+
* surface (index.ts). The load walk (`partsOf`) refuses an author's Machine with no route, with or
|
|
67
|
+
* without the marker (ADR-0074).
|
|
61
68
|
*/
|
|
69
|
+
export const COMPILED_CHART: unique symbol = Symbol("jr2.compiledChart");
|
|
70
|
+
|
|
71
|
+
// Injected into every jr2Setup union. Dotted names by construction (`NAME_RE` forbids dots in
|
|
72
|
+
// workflow event names), so they can never collide with a def.
|
|
73
|
+
/** The events that jr2 itself sends into each Machine that `jr2Setup` makes. A Mechanism event's
|
|
74
|
+
* name has a dot, and a workflow event's name cannot, so the two never collide. */
|
|
62
75
|
export type MechanismEvent = FaultTelemetry | WorkspaceLost;
|
|
63
76
|
|
|
77
|
+
// A Workspace's Continuity broke (ADR-0021): its Sandbox is gone, or Lost. `reason` and `message`
|
|
78
|
+
// are for a body whose policy tells the causes apart, or only reports them; no policy needs them.
|
|
64
79
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
80
|
+
* jr2 sends `workspace.lost` to the body of a `workspace()` when its Sandbox is gone: its pod was
|
|
81
|
+
* evicted or deleted, or its node went. jr2 does not make the Sandbox again, and the commits that
|
|
82
|
+
* were not pushed go with it. The body decides what to do next: route the event with
|
|
83
|
+
* `on: { "workspace.lost": … }`, usually once, on the body's root. `workspace()` refuses a body
|
|
84
|
+
* with a state that is not final and has no route for it on itself or on a state above. When the
|
|
85
|
+
* event comes and no transition takes it (the route's guard is false), the run ends `error`, with
|
|
86
|
+
* the event, the state and the reason in its fault.
|
|
69
87
|
*/
|
|
70
|
-
export type WorkspaceLost = {
|
|
88
|
+
export type WorkspaceLost = {
|
|
89
|
+
type: "workspace.lost";
|
|
90
|
+
/** Why the Sandbox is gone, for a person or a log: the pod's reason (`Evicted`, `NodeShutdown`),
|
|
91
|
+
* the operator's (`PodDeleted`, `NodeLost`), or `Deleted`. A body can act without it. */
|
|
92
|
+
reason?: string;
|
|
93
|
+
/** More text about the loss, when jr2 has it. */
|
|
94
|
+
message?: string;
|
|
95
|
+
};
|
|
71
96
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
*
|
|
97
|
+
// The defs' derived types plus the mechanism's (ADR-0015).
|
|
98
|
+
/** The type of `event` in a Machine that `jr2Setup` makes: each workflow event in its `events`,
|
|
99
|
+
* and each Mechanism event. A workflow event that an Agent or a Gate sent has `event.sender`. An
|
|
100
|
+
* event that the Machine sent to itself (`raise`, `sendTo`) has no `sender`. */
|
|
75
101
|
export type WorkflowEvent<TDefs extends readonly EventDef[]> =
|
|
76
102
|
| (EventFrom<TDefs[number]> & { readonly sender?: Sender })
|
|
77
103
|
| MechanismEvent;
|
|
78
104
|
|
|
79
105
|
/** The guard jr2Setup registers for every Machine — `sentBy(id)` (ADR-0015) — in the typed guard
|
|
80
|
-
* map, so `sentBy("coder")` and `and([sentBy("coder"), "ready"])` type-check with no cast.
|
|
106
|
+
* map, so `sentBy("coder")` and `and([sentBy("coder"), "ready"])` type-check with no cast.
|
|
107
|
+
*
|
|
108
|
+
* @internal
|
|
109
|
+
*/
|
|
81
110
|
type SentByGuards = { [SENT_BY]: { id: string } };
|
|
82
111
|
|
|
83
112
|
/** The jr2 actor every workflow can invoke by name without listing it (ADR-0015). `gate` is the
|
|
@@ -86,25 +115,222 @@ type SentByGuards = { [SENT_BY]: { id: string } };
|
|
|
86
115
|
const jr2Actors = { gate };
|
|
87
116
|
type JR2Actors = typeof jr2Actors;
|
|
88
117
|
|
|
89
|
-
/**
|
|
118
|
+
/**
|
|
119
|
+
* Consumer actors merge OVER the pre-registered set: same name → the consumer's logic wins.
|
|
120
|
+
*
|
|
121
|
+
* @internal
|
|
122
|
+
*/
|
|
90
123
|
type MergedActors<TActors extends Record<string, UnknownActorLogic>> = Omit<JR2Actors, keyof TActors> & TActors;
|
|
91
124
|
|
|
92
125
|
// Local equivalents of xstate's non-exported setup() mapped helpers (setup.d.ts) — same shapes,
|
|
93
126
|
// so the declared signature below composes with the public `ActionFunction`/`GuardPredicate`.
|
|
127
|
+
/** @internal */
|
|
94
128
|
type ToParameterizedObject<T extends Record<string, ParameterizedObject["params"] | undefined>> = {
|
|
95
129
|
[K in keyof T & string]: { type: K; params: T[K] };
|
|
96
130
|
}[keyof T & string];
|
|
131
|
+
/** @internal */
|
|
97
132
|
type ToProvidedActor<TActors extends Record<string, UnknownActorLogic>> = {
|
|
98
133
|
[K in keyof TActors & string]: { src: K; logic: TActors[K]; id: string | undefined };
|
|
99
134
|
}[keyof TActors & string];
|
|
100
135
|
|
|
136
|
+
// The types below carry the body's Repo Slots to every Worktree input.
|
|
137
|
+
/** @internal */
|
|
138
|
+
type NoHandles = { readonly noHandles: true };
|
|
139
|
+
/** `S`, the slots of the body, or {@link NoHandles} when its input and context hold no handles.
|
|
140
|
+
* @internal */
|
|
141
|
+
type RepoSlotsOf<TInput, TContext> = TInput extends { workspace: { repos: infer R } }
|
|
142
|
+
? keyof R & string
|
|
143
|
+
: TContext extends { workspace: { repos: infer R } }
|
|
144
|
+
? keyof R & string
|
|
145
|
+
: NoHandles;
|
|
146
|
+
/** The Worktrees of the slots `S` that this key takes: a `push({ slot })` keeps to its own slot.
|
|
147
|
+
* @internal */
|
|
148
|
+
type PathIn<W, S> = S extends string ? (`/work/${S}/x` extends NonNullable<W> ? WorktreePath<S> : never) : never;
|
|
149
|
+
/** One arm of an input. A key that names a Worktree or a Frame is REQUIRED under a body with Repo
|
|
150
|
+
* Slots, so that no mix of `cwd`, `worktree` and `path` lands in `/work`. Under a body with none,
|
|
151
|
+
* `worktree` goes: there is no Worktree. A Turn's arm that carries no kit path (the run's own form)
|
|
152
|
+
* and every other key stay.
|
|
153
|
+
* @internal */
|
|
154
|
+
type BindArm<I, S> = I extends object
|
|
155
|
+
? "worktree" extends keyof I
|
|
156
|
+
? [S] extends [never]
|
|
157
|
+
? Omit<I, "worktree"> & { worktree?: never }
|
|
158
|
+
: Omit<I, "worktree"> & { worktree: PathIn<I["worktree"], S> }
|
|
159
|
+
: "cwd" extends keyof I
|
|
160
|
+
? [NonNullable<I["cwd"]>] extends [AnyFramePath]
|
|
161
|
+
? [S] extends [never]
|
|
162
|
+
? I
|
|
163
|
+
: Omit<I, "cwd"> & { cwd: FramePath<S & string> }
|
|
164
|
+
: I
|
|
165
|
+
: "path" extends keyof I
|
|
166
|
+
? [S] extends [never]
|
|
167
|
+
? I
|
|
168
|
+
: Omit<I, "path"> & { path: PathIn<I["path"], S> }
|
|
169
|
+
: I
|
|
170
|
+
: I;
|
|
171
|
+
/** Does this input name a Worktree? @internal */
|
|
172
|
+
type NamesWorktree<I> = I extends object ? ("worktree" extends keyof I ? true : never) : never;
|
|
173
|
+
/** @internal */
|
|
174
|
+
type BindInput<I, S> = [NamesWorktree<I>] extends [never]
|
|
175
|
+
? BindArm<I, S>
|
|
176
|
+
: [S] extends [never]
|
|
177
|
+
? BindArm<I, S>
|
|
178
|
+
: Exclude<BindArm<I, S>, void | undefined>;
|
|
179
|
+
/** A cut's `ready` output with the body's slots. @internal */
|
|
180
|
+
type BindOutput<O, S> = O extends WorktreeReady ? WorktreeReady<S & string> : O;
|
|
181
|
+
/** @internal */
|
|
182
|
+
type BindSnapshot<Snap, S> = Snap extends { output: infer O }
|
|
183
|
+
? [O] extends [BindOutput<O, S>]
|
|
184
|
+
? Snap
|
|
185
|
+
: Omit<Snap, "output"> & { output: BindOutput<O, S> }
|
|
186
|
+
: Snap;
|
|
187
|
+
/** @internal */
|
|
188
|
+
type BindLogic<L extends UnknownActorLogic, S> = L extends AnyStateMachine
|
|
189
|
+
? L
|
|
190
|
+
: ([S] extends [never] ? false : [S] extends [NoHandles] ? true : false) extends true
|
|
191
|
+
? L
|
|
192
|
+
: L extends { readonly definition: { readonly workspace: "none" } }
|
|
193
|
+
? L
|
|
194
|
+
: L extends ActorLogic<infer Snap, infer Ev, infer I, infer Sys, infer Em>
|
|
195
|
+
? BindSnapshot<Snap, S> extends infer B extends Snapshot<unknown>
|
|
196
|
+
? Omit<L, keyof ActorLogic<Snap, Ev, I, Sys, Em>> & ActorLogic<B, Ev, BindInput<I, S>, any, Em>
|
|
197
|
+
: never
|
|
198
|
+
: L;
|
|
199
|
+
/** @internal */
|
|
200
|
+
type BindActors<A extends Record<string, UnknownActorLogic>, TInput, TContext> = {
|
|
201
|
+
[K in keyof A]: BindLogic<A[K], RepoSlotsOf<TInput, TContext>>;
|
|
202
|
+
};
|
|
203
|
+
|
|
101
204
|
/**
|
|
102
|
-
*
|
|
103
|
-
*
|
|
205
|
+
* Set up a Machine that takes workflow events: the jr2 form of xstate's `setup()`. Write a Machine
|
|
206
|
+
* with it when an Agent or a Gate sends events into the Machine, or when the Machine declares a
|
|
207
|
+
* door. Call `.createMachine(config)` on the result, as with `setup()`. The Machine you get is a
|
|
208
|
+
* plain xstate Machine.
|
|
209
|
+
*
|
|
210
|
+
* What it adds to `setup()`:
|
|
211
|
+
* - `events` replaces `types.events`. The event type of the Machine comes from the
|
|
212
|
+
* `defineEvent` events you list, plus the events jr2 itself sends (`agent.fault`,
|
|
213
|
+
* `workspace.lost`). An event that a party sent has `event.sender`. A Machine that takes no
|
|
214
|
+
* workflow event leaves out `events`.
|
|
215
|
+
* - The `gate` actor is ready to invoke by name: `invoke: { src: "gate" }`.
|
|
216
|
+
* - Each Agent slot (`actors: { coder: agent(…) }`) gets its Menu from the states that invoke it.
|
|
217
|
+
* - The `sentBy(id)` guard is ready to use.
|
|
218
|
+
* - `createMachine` also takes `input`: a zod object for the input that starts a run. jr2 checks
|
|
219
|
+
* each start against it. Without it, a run can start with any input. The `setup()` of xstate
|
|
220
|
+
* does not read this `input`, so a Machine with a door uses `jr2Setup`, also when it takes no
|
|
221
|
+
* workflow event. `jr2 up` and the publish door refuse a registered Machine that has a zod
|
|
222
|
+
* `input` if `jr2Setup` did not make the Machine: ``workflow "<name>": machine "<id>" has a zod `input` on
|
|
223
|
+
* createMachine, but jr2Setup did not make this Machine, so no door reads that input …``
|
|
224
|
+
*
|
|
225
|
+
* The output of a run is the root `output` of `createMachine`, beside `id` and `states`, as in
|
|
226
|
+
* xstate v5. xstate does not read the `output` of a final state as the output of the Machine. It
|
|
227
|
+
* gives that output to the root `output` as `event.output`. Write
|
|
228
|
+
* `output: ({ event }) => event.output as Output` at the root, or make the output from `context`
|
|
229
|
+
* there. `createMachine` refuses an `output` on a final state directly below the root when the root
|
|
230
|
+
* has no `output` (see the list below).
|
|
231
|
+
*
|
|
232
|
+
* `createMachine` refuses a Machine that it cannot run as written. Among the refusals:
|
|
233
|
+
* - an `on` key that no listed event has: ``machine "<id>" handles event "<key>", which no def in
|
|
234
|
+
* jr2Setup({ events }) declares (declared: <names>) — a typo, or a missing defineEvent``
|
|
235
|
+
* - a listed event that no state takes: ``machine "<id>" declares "<name>", which no state handles
|
|
236
|
+
* — a pick no state takes is on no Menu and no Gate: handle it, or drop it from
|
|
237
|
+
* jr2Setup({ events })``
|
|
238
|
+
* - an entry of `events` that `defineEvent` did not make, or one name listed twice:
|
|
239
|
+
* ``machine "<id>": `events` entry is not a defineEvent() def: <entry>``,
|
|
240
|
+
* ``machine "<id>": duplicate event "<name>" in `events` ``
|
|
241
|
+
* - an `agent()`, an Effect or a `workspace()` written on `invoke.src` instead of under `actors`:
|
|
242
|
+
* ``machine "<id>": state "<state>" invokes <part> inline — a Part is a key of actors, so it has
|
|
243
|
+
* a name that the ledger, the report and customize() share: actors: { <name>: <factory>(...) },
|
|
244
|
+
* then invoke: { src: "<name>" }``. `<part>` is `an Agent`, `an Effect` or `a Workspace`.
|
|
245
|
+
* `<factory>` is `agent`, the Effect's kind (such as `command`), or `workspace`.
|
|
246
|
+
* - an `output` on a final state directly below the root, when the root has no `output`:
|
|
247
|
+
* ``machine "<id>": final state "<state>" declares an output, and the root has no output — xstate
|
|
248
|
+
* v5 gives a run only its root output, so this output reaches nothing and the run ends with none:
|
|
249
|
+
* write it at the root, as output: ({ context }) => ..., or keep it on the final state and pass it
|
|
250
|
+
* on with output: ({ event }) => event.output at the root``. With more than one such final state,
|
|
251
|
+
* it names each one and puts the words in the plural: ``final states "<state>", "<state>"
|
|
252
|
+
* declare an output``, ``these outputs reach nothing``, ``write one at the root`` and ``keep
|
|
253
|
+
* them on the final states and pass them on``. An `output` on a
|
|
254
|
+
* final state inside a compound state is legal: the `onDone` of that compound state gets it as
|
|
255
|
+
* `event.output`.
|
|
256
|
+
* - a parallel state at or below a state that invokes an Agent: ``machine "<id>": state "<state>"
|
|
257
|
+
* is parallel, at or below Agent "<slot>"'s state "<state>" — a parallel region below an Agent's
|
|
258
|
+
* state is reserved for picks the Agent does not wait for, which jr2 does not build; background
|
|
259
|
+
* work goes above the Agent's state``
|
|
260
|
+
* - a state below an Agent's state that invokes something and that nothing enters: ``machine
|
|
261
|
+
* "<id>": state "<state>" below Agent "<slot>"'s state "<state>" is entered by nothing, so what
|
|
262
|
+
* it invokes (<src>) never runs — target it from a pick or a route, or delete it``
|
|
263
|
+
* - a state that invokes an Agent when that state and each state above it have no `agent.fault`
|
|
264
|
+
* route: ``machine "<id>": state "<state>" invokes an Agent, and no route for "agent.fault" is
|
|
265
|
+
* on it or on a state above — jr2 sends agent.fault when the Agent's Turn cannot go on, and with
|
|
266
|
+
* no route the run faults: route it on that state or on a state above it, as on: {
|
|
267
|
+
* "agent.fault": "<the state that handles it>" } (ADR-0074)``. A state that invokes an Open body
|
|
268
|
+
* that lends an Agent or allows a model gets the same line, with `invokes an Open body that can
|
|
269
|
+
* run an Agent`: the body sends it a Chart's unrouted `agent.fault`. When both kinds have no route,
|
|
270
|
+
* one line names both, joined by `, and`. One route on the root is a route for each state. A
|
|
271
|
+
* Chart's Machine does not get this refusal: in a Chart the route is optional (ADR-0070).
|
|
272
|
+
*
|
|
273
|
+
* It also refuses a `sentBy` that names no party (see `sentBy`). It refuses a pick param that
|
|
274
|
+
* nothing reads, where the pick enters a state that invokes an Effect (see `fromPick`). Shapes that
|
|
275
|
+
* are legal but probably not what you mean, such as a mode that nothing enters, are warnings that
|
|
276
|
+
* `jr2 up` prints.
|
|
277
|
+
*
|
|
278
|
+
* @param def - What `setup()` takes, with `events` in place of `types.events`. A Machine that
|
|
279
|
+
* needs none of it calls `jr2Setup()`.
|
|
280
|
+
* @returns What `setup()` returns. Call `.createMachine(config)` on it.
|
|
281
|
+
*
|
|
282
|
+
* @example
|
|
283
|
+
* ```ts
|
|
284
|
+
* import { z } from "zod";
|
|
285
|
+
* import { agent, defineEvent, fail, jr2Setup } from "@jr2/orchestrator";
|
|
286
|
+
*
|
|
287
|
+
* const proposed = defineEvent({
|
|
288
|
+
* name: "proposed",
|
|
289
|
+
* description: "Call this with your plan.",
|
|
290
|
+
* input: z.object({ plan: z.string() }),
|
|
291
|
+
* });
|
|
292
|
+
* const approve = defineEvent({ name: "approve", input: z.object({}) });
|
|
293
|
+
* const reject = defineEvent({ name: "reject", input: z.object({ reason: z.string() }) });
|
|
294
|
+
*
|
|
295
|
+
* export const machine = jr2Setup({
|
|
296
|
+
* types: {} as { input: { goal: string }; context: { goal: string } },
|
|
297
|
+
* events: [proposed, approve, reject],
|
|
298
|
+
* actors: {
|
|
299
|
+
* planner: agent({
|
|
300
|
+
* model: "anthropic/claude-haiku-5-5",
|
|
301
|
+
* instructions: "You plan small releases.",
|
|
302
|
+
* workspace: "none",
|
|
303
|
+
* }),
|
|
304
|
+
* fail: fail(),
|
|
305
|
+
* },
|
|
306
|
+
* }).createMachine({
|
|
307
|
+
* id: "plan",
|
|
308
|
+
* input: z.object({ goal: z.string() }),
|
|
309
|
+
* context: ({ input }) => ({ goal: input.goal }),
|
|
310
|
+
* on: { "agent.fault": ".failed" },
|
|
311
|
+
* initial: "planning",
|
|
312
|
+
* states: {
|
|
313
|
+
* planning: {
|
|
314
|
+
* invoke: { src: "planner", input: ({ context }) => ({ prompt: `Plan this: ${context.goal}` }) },
|
|
315
|
+
* on: { proposed: "review" },
|
|
316
|
+
* },
|
|
317
|
+
* review: {
|
|
318
|
+
* invoke: { src: "gate" },
|
|
319
|
+
* on: { approve: "approved", reject: "planning" },
|
|
320
|
+
* },
|
|
321
|
+
* approved: { type: "final" },
|
|
322
|
+
* failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
|
|
323
|
+
* },
|
|
324
|
+
* });
|
|
325
|
+
* ```
|
|
326
|
+
*
|
|
327
|
+
* @see docs/guides/write-a-workflow.md
|
|
328
|
+
* @see docs/concepts/machines-and-workflows.md
|
|
329
|
+
* @see docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md
|
|
104
330
|
*/
|
|
105
331
|
export function jr2Setup<
|
|
106
332
|
TContext extends MachineContext = MachineContext,
|
|
107
|
-
const TDefs extends readonly EventDef[] = readonly
|
|
333
|
+
const TDefs extends readonly EventDef[] = readonly [],
|
|
108
334
|
TActors extends Record<string, UnknownActorLogic> = {},
|
|
109
335
|
TActions extends Record<string, ParameterizedObject["params"] | undefined> = {},
|
|
110
336
|
TGuards extends Record<string, ParameterizedObject["params"] | undefined> = {},
|
|
@@ -114,47 +340,59 @@ export function jr2Setup<
|
|
|
114
340
|
TOutput extends NonReducibleUnknown = NonReducibleUnknown,
|
|
115
341
|
TEmitted extends EventObject = EventObject,
|
|
116
342
|
TMeta extends MetaObject = MetaObject,
|
|
117
|
-
>(
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
343
|
+
>(
|
|
344
|
+
def: {
|
|
345
|
+
/** The types of the Machine, as in `setup()`: `context`, `input`, `output`, `tags`, `emitted`
|
|
346
|
+
* and `meta`. Not `events`: the event type comes from `events`. */
|
|
347
|
+
types?: {
|
|
348
|
+
context?: TContext;
|
|
349
|
+
input?: TInput;
|
|
350
|
+
output?: TOutput;
|
|
351
|
+
tags?: TTag;
|
|
352
|
+
emitted?: TEmitted;
|
|
353
|
+
meta?: TMeta;
|
|
354
|
+
};
|
|
355
|
+
// The single source for types, validation and delivery.
|
|
356
|
+
/** The workflow events this Machine takes: each one made by `defineEvent`. Leave it out when the
|
|
357
|
+
* Machine takes none. Each listed event must be the name of an `on` key. Each `on` key must be
|
|
358
|
+
* listed, if it is not a jr2 or xstate event (an event with a `.` in its name). */
|
|
359
|
+
events?: TDefs;
|
|
360
|
+
/** The actors the states invoke by name, as in `setup()`: Agent slots (`agent(…)`), Effects
|
|
361
|
+
* (`command(…)`, `http(…)`, `push(…)`), child Machines, `workspace(…)` and plain xstate logic.
|
|
362
|
+
* The key is the slot's name. An actor named `gate` replaces jr2's Gate. */
|
|
363
|
+
actors?: TActors;
|
|
364
|
+
/** Named actions, as in `setup()`. Their `event` has the type of this Machine's events. */
|
|
365
|
+
actions?: {
|
|
366
|
+
[K in keyof TActions]: ActionFunction<
|
|
367
|
+
TContext,
|
|
368
|
+
WorkflowEvent<TDefs>,
|
|
369
|
+
WorkflowEvent<TDefs>,
|
|
370
|
+
TActions[K],
|
|
371
|
+
ToProvidedActor<MergedActors<TActors>>,
|
|
372
|
+
ToParameterizedObject<TActions>,
|
|
373
|
+
ToParameterizedObject<TGuards>,
|
|
374
|
+
TDelay,
|
|
375
|
+
TEmitted
|
|
376
|
+
>;
|
|
377
|
+
};
|
|
378
|
+
/** Named guards, as in `setup()`. `sentBy` is there already; do not name a guard `jr2.sentBy`. */
|
|
379
|
+
guards?: {
|
|
380
|
+
[K in keyof TGuards]: GuardPredicate<TContext, WorkflowEvent<TDefs>, TGuards[K], ToParameterizedObject<TGuards>>;
|
|
381
|
+
};
|
|
382
|
+
/** Named delays, as in `setup()`. */
|
|
383
|
+
delays?: {
|
|
384
|
+
[K in TDelay]: DelayConfig<
|
|
385
|
+
TContext,
|
|
386
|
+
WorkflowEvent<TDefs>,
|
|
387
|
+
ToParameterizedObject<TActions>["params"],
|
|
388
|
+
WorkflowEvent<TDefs>
|
|
389
|
+
>;
|
|
390
|
+
};
|
|
391
|
+
} = {},
|
|
392
|
+
): SetupReturn<
|
|
155
393
|
TContext,
|
|
156
394
|
WorkflowEvent<TDefs>,
|
|
157
|
-
MergedActors<TActors
|
|
395
|
+
MergedActors<BindActors<TActors, TInput, TContext>>,
|
|
158
396
|
{},
|
|
159
397
|
TActions,
|
|
160
398
|
TGuards & SentByGuards,
|
|
@@ -165,6 +403,8 @@ export function jr2Setup<
|
|
|
165
403
|
TEmitted,
|
|
166
404
|
TMeta
|
|
167
405
|
> {
|
|
406
|
+
// Like `setup()`, but `types.events` is gone (ADR-0015): the event union derives from `events`
|
|
407
|
+
// (defineEvent defs, taken as values) plus the mechanism events.
|
|
168
408
|
const inner = setup({
|
|
169
409
|
types: def.types,
|
|
170
410
|
actors: { ...jr2Actors, ...(def.actors ?? {}) },
|
|
@@ -179,11 +419,16 @@ export function jr2Setup<
|
|
|
179
419
|
// machine receives at creation — and is pulled OFF before xstate sees it: a zod schema is
|
|
180
420
|
// not machine structure, and it must never reach the fingerprint/serialization paths that
|
|
181
421
|
// read `machine.config`. It is attached beside the vocabulary below.
|
|
182
|
-
|
|
422
|
+
// A compiled Chart (ADR-0070) is marked, and the marker is pulled off as `input` is.
|
|
423
|
+
const {
|
|
424
|
+
input: inputSchema,
|
|
425
|
+
[COMPILED_CHART]: compiledChart,
|
|
426
|
+
...machineConfig
|
|
427
|
+
} = config as { input?: z.ZodObject; [COMPILED_CHART]?: true } & Record<string, unknown>;
|
|
183
428
|
|
|
184
429
|
// Resolve the defs first (duplicates and reserved semantics fail HERE, naming the machine —
|
|
185
430
|
// the same loud failure `eventMap` gave the manifest, moved to machine-build time)…
|
|
186
|
-
const defs = eventMap((machineConfig as { id?: string }).id ?? "(machine)", def.events);
|
|
431
|
+
const defs = eventMap((machineConfig as { id?: string }).id ?? "(machine)", def.events ?? []);
|
|
187
432
|
|
|
188
433
|
// Every Open body slot (ADR-0070), found by its brand: each name it lends resolves against THIS
|
|
189
434
|
// setup's own parts, or the Machine is refused naming it. The resolved set is stamped on the slot,
|
|
@@ -231,13 +476,26 @@ export function jr2Setup<
|
|
|
231
476
|
|
|
232
477
|
// A Part written inline has no name (ADR-0049, ADR-0067): refused, with the slot form.
|
|
233
478
|
refuseInlineParts(machine);
|
|
479
|
+
// A final state's output with no root output (ADR-0015): the run would end with none.
|
|
480
|
+
refuseLostOutput(machine);
|
|
481
|
+
// A state that invokes an Agent, or an Open body that can run one, with no `agent.fault` route
|
|
482
|
+
// (ADR-0074): the run would wait for ever. Not in a compiled Chart: there the route is optional,
|
|
483
|
+
// and the Open body sends the event that no transition takes to the Machine that invoked it (ADR-0070).
|
|
484
|
+
if (compiledChart !== true) refuseUnroutedAgentFault(machine);
|
|
485
|
+
// An Effect's `onDone` with no last arm that always matches (ADR-0075): the run would stay in the
|
|
486
|
+
// state and show no fault. A compiled Chart comes here too, so the door refuses it.
|
|
487
|
+
refuseUnroutedOutcome(machine);
|
|
234
488
|
refuseParallelBelowAgents(machine, def.actors ?? {});
|
|
489
|
+
// One slot, two Turns at once (ADR-0015): one sender and one conversation cannot hold both.
|
|
490
|
+
refuseSlotActiveTwice(machine);
|
|
235
491
|
refuseUnknownSentBy(machine);
|
|
236
492
|
// Before the Effect checks: they ask who may send a writing (`mayTake`), which reads its audience.
|
|
237
493
|
attachVocabulary(machine, defs);
|
|
238
494
|
// The Effect checks (ADR-0067): a pick param nothing reads, a `fill` that overwrites one, a
|
|
239
495
|
// `fromPick` of another pick — refused; a mapper the probe cannot run — warned.
|
|
240
|
-
|
|
496
|
+
// A Chart's door reads each reference itself (rule 7), and it refuses every load warning: the
|
|
497
|
+
// walk's "I could not run this" says nothing of a Chart's `{{...}}` mapper or its `set`.
|
|
498
|
+
const effects = effectChecks(machine, def.actors ?? {}, defs, compiledChart === true);
|
|
241
499
|
if (effects.errors.length) throw new Error(`machine "${machine.id}": ${effects.errors.join("; ")}`);
|
|
242
500
|
|
|
243
501
|
const idOf = (path: readonly string[]): string => stateAt(machine, path).id;
|
|
@@ -261,7 +519,7 @@ export function jr2Setup<
|
|
|
261
519
|
return { ...inner, createMachine } as unknown as SetupReturn<
|
|
262
520
|
TContext,
|
|
263
521
|
WorkflowEvent<TDefs>,
|
|
264
|
-
MergedActors<TActors
|
|
522
|
+
MergedActors<BindActors<TActors, TInput, TContext>>,
|
|
265
523
|
{},
|
|
266
524
|
TActions,
|
|
267
525
|
TGuards & SentByGuards,
|
|
@@ -886,7 +1144,7 @@ function refuseUnknownKeys(consumer: object, agentName: string): void {
|
|
|
886
1144
|
/** Wrap an Agent slot's invoke input: name the Agent (the slot key), append the state's derived set
|
|
887
1145
|
* and the Agent's Menu, and finalize the mechanism fields. */
|
|
888
1146
|
function wrapAgentInput(orig: unknown, derived: string[], agentName: string, menuOf: (agentName: string) => string[]) {
|
|
889
|
-
|
|
1147
|
+
const wrapped = (args: InputArgs): AgentRunInput => {
|
|
890
1148
|
const consumer = resolveInput(orig, args) as Partial<AgentTurnInput & AgentRunInput>;
|
|
891
1149
|
refuseUnknownKeys(consumer, agentName);
|
|
892
1150
|
return {
|
|
@@ -894,6 +1152,9 @@ function wrapAgentInput(orig: unknown, derived: string[], agentName: string, men
|
|
|
894
1152
|
// jr2 mints every id (ADR-0016, ADR-0057): the Turn's input carries no id to honor, so
|
|
895
1153
|
// nothing a Machine writes can address a conversation jr2 did not derive.
|
|
896
1154
|
instanceId: mintIid(consumer, agentName, args.self),
|
|
1155
|
+
// One per invocation (ADR-0016): two Turns that continue one conversation share the iid, the
|
|
1156
|
+
// admission ledger's key, and a restore must not re-attach one Turn to the other's admission.
|
|
1157
|
+
turnId: randomUUID(),
|
|
897
1158
|
endpoint: consumer.endpoint,
|
|
898
1159
|
sandbox: consumer.sandbox,
|
|
899
1160
|
prompt: consumer.prompt,
|
|
@@ -914,6 +1175,8 @@ function wrapAgentInput(orig: unknown, derived: string[], agentName: string, men
|
|
|
914
1175
|
menu: menuOf(agentName),
|
|
915
1176
|
};
|
|
916
1177
|
};
|
|
1178
|
+
// The walk reads what the author wrote: `workspace()`, for a literal `cwd`.
|
|
1179
|
+
return Object.assign(wrapped, { consumerInput: orig });
|
|
917
1180
|
}
|
|
918
1181
|
|
|
919
1182
|
/** Wrap a gate invoke input: append the derived accepted set. */
|