@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
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: EffectBinding
|
|
3
|
+
description: The values that bind the Open parts of one Effect.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `EffectBinding`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/open-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type EffectBinding = {
|
|
12
|
+
readonly url?: string | Text;
|
|
13
|
+
readonly argv?: readonly (string | Arg)[];
|
|
14
|
+
readonly secret?: string;
|
|
15
|
+
readonly target?: { readonly url: string; readonly token: Secret };
|
|
16
|
+
};
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The values that bind the Open parts of one Effect. A packaged Machine leaves a part of an Effect
|
|
20
|
+
Open when it cannot know it. That part is the url of an `http` Effect, the argv of a `command`,
|
|
21
|
+
the name of a secret, written `secret(open)`, or the target of a `dispatch`: the url of another
|
|
22
|
+
Orchestrator and the secret that holds its Instance token, bound as one. You bind it once, where you register the
|
|
23
|
+
Machine, with `customize(machine, { effects: { <slot>: binding } })`. Each key binds one Open
|
|
24
|
+
part. For an Effect with two Open parts, one object holds both keys.
|
|
25
|
+
|
|
26
|
+
The binding is a value, never a function of the run: no run chooses an Effect's url, argv or
|
|
27
|
+
secret. `customize()` builds the Effect again with the bound parts, so a bound part gets every
|
|
28
|
+
check that a part written in the definition gets.
|
|
29
|
+
|
|
30
|
+
`customize()` refuses:
|
|
31
|
+
- an empty binding, or a key for a part that is not Open: `customize(): the <kind> Effect
|
|
32
|
+
"<slot>" leaves its <parts> Open — bind it with <binding> (ADR-0054)`
|
|
33
|
+
- an Effect with no Open part: ``customize(): the <kind> Effect "<slot>" of machine "<id>"
|
|
34
|
+
leaves nothing Open — its parts are fixed in its definition, and only a part a package left
|
|
35
|
+
`open` is bound, once (ADR-0054).``
|
|
36
|
+
- `open` as a value: ``customize(): the <kind> Effect "<slot>"'s <part> is bound once, to a
|
|
37
|
+
value — not `open` again: no run chooses an Effect's <part> (ADR-0054)``. A function as a
|
|
38
|
+
value gives the same text, with `a function of the run` for `` `open` again ``.
|
|
39
|
+
- a secret that is not a string: `customize(): the <kind> Effect "<slot>"'s secret is bound to
|
|
40
|
+
a secret's name, a string — the file the Effector reads it from: { secret: "<name>" }
|
|
41
|
+
(ADR-0054, ADR-0068)`
|
|
42
|
+
|
|
43
|
+
`jr2 up` refuses a registered Machine with an Open part that nobody bound, and prints the
|
|
44
|
+
`customize` line that binds it.
|
|
45
|
+
|
|
46
|
+
**Fields**
|
|
47
|
+
|
|
48
|
+
- `url` (optional): `string | Text`
|
|
49
|
+
|
|
50
|
+
The url of an `http` Effect whose url is Open: a string, or a `text` template with a secret
|
|
51
|
+
in its path, such as `` text`https://hooks.example.com/services/${secret("hook")}` ``. Its
|
|
52
|
+
scheme and host must be literal.
|
|
53
|
+
- `argv` (optional): `readonly (string | Arg)[]`
|
|
54
|
+
|
|
55
|
+
The argv of a `command` whose argv is Open: one entry for each argument, never shell text.
|
|
56
|
+
An entry is a string or an `arg("<param>")` that the invoke's input fills. It must not be
|
|
57
|
+
empty.
|
|
58
|
+
- `secret` (optional): `string`
|
|
59
|
+
|
|
60
|
+
The name of the secret that `secret(open)` stands for: an entry of `secrets` in
|
|
61
|
+
`jr2.config.ts`. The Effector reads it from a file of that name.
|
|
62
|
+
- `target` (optional): `object`
|
|
63
|
+
|
|
64
|
+
- `url`: `string`
|
|
65
|
+
- `token`: [`Secret`](type-secret.md)
|
|
66
|
+
|
|
67
|
+
**Example**
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
import { customize, http, jr2Setup, open, type EffectBinding } from "@jr2/orchestrator";
|
|
71
|
+
|
|
72
|
+
const notifier = jr2Setup({
|
|
73
|
+
actors: { notify: http({ method: "POST", url: open }) },
|
|
74
|
+
}).createMachine({
|
|
75
|
+
id: "notifier",
|
|
76
|
+
initial: "sending",
|
|
77
|
+
states: {
|
|
78
|
+
sending: { invoke: { src: "notify", onDone: "done" } },
|
|
79
|
+
done: { type: "final" },
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const notify = { url: "https://hooks.example.com/build" } satisfies EffectBinding;
|
|
84
|
+
|
|
85
|
+
export const machine = customize(notifier, { effects: { notify } });
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**See also**
|
|
89
|
+
|
|
90
|
+
- [Bind a shipped Machine's Open parts](../../guides/bind-open-parts.md)
|
|
91
|
+
- [Effects](../../concepts/effects.md)
|
|
92
|
+
- [ADR-0054: The kit ships Machines, and a shipped Machine leaves its parts Open](../decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md)
|
|
93
|
+
- [ADR-0067: An Effect is an actor slot, and runs at most once unless marked idempotent](../decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: EffectLogic
|
|
3
|
+
description: A type that the Authoring surface names.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `EffectLogic`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/effect.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type EffectLogic<I, O> = ActorLogic<EffectSnapshot<O, I>, EventObject, I> & EffectSlot;
|
|
12
|
+
```
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: EnvOpenParts
|
|
3
|
+
description: A type that the Authoring surface names.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `EnvOpenParts`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/effect.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type EnvOpenParts<Opt> = Opt extends { readonly env: infer E }
|
|
12
|
+
? OpenSecretIn<E extends Readonly<Record<string, infer V>> ? V : never>
|
|
13
|
+
: never;
|
|
14
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: EventAudience
|
|
3
|
+
description: "Who may send an event: `\"agent\"` (an Agent, as a pick from its Menu), `\"external\"` (the caller of a Gate), or `\"any\"` (both)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `EventAudience`
|
|
7
|
+
|
|
8
|
+
Type, in `src/define-event.ts` of `@jr2/agent-protocol`, a dependency of `@jr2/orchestrator`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type EventAudience = "agent" | "external" | "any";
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Who may send an event: `"agent"` (an Agent, as a pick from its Menu), `"external"` (the caller of
|
|
15
|
+
a Gate), or `"any"` (both).
|
|
16
|
+
|
|
17
|
+
Leave it unset in most cases. Then the position of each `on` key decides: the event belongs to
|
|
18
|
+
the party that its state, or the nearest state above it, invokes. An `on` key on a state that
|
|
19
|
+
invokes no party, with no such state above it, belongs to both. Set an audience only to give an
|
|
20
|
+
event to the other party too (`"any"`). Or set it to keep an event on the root from one party
|
|
21
|
+
(`"agent"` or `"external"`).
|
|
22
|
+
|
|
23
|
+
**See also**
|
|
24
|
+
|
|
25
|
+
- [The Menu](../../concepts/the-menu.md)
|
|
26
|
+
- [Gates](../../concepts/gates.md)
|
|
27
|
+
- [ADR-0015: Workflows are authored through `jr2Setup`; vocabulary and agent menus derive from the machine](../decisions/0015-authoring-surface-absorbs-the-mechanism.md)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: EventDef
|
|
3
|
+
description: "A workflow event, as `defineEvent` gives it back: plain, frozen data and a zod schema, safe to import anywhere."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `EventDef`
|
|
7
|
+
|
|
8
|
+
Type, in `src/define-event.ts` of `@jr2/agent-protocol`, a dependency of `@jr2/orchestrator`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type EventDef<Name extends string = string, Input extends z.ZodObject = z.ZodObject> = {
|
|
12
|
+
readonly name: Name;
|
|
13
|
+
readonly description?: string;
|
|
14
|
+
readonly input: Input;
|
|
15
|
+
readonly semantics: EventSemantics;
|
|
16
|
+
readonly audience?: EventAudience;
|
|
17
|
+
};
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
A workflow event, as `defineEvent` gives it back: plain, frozen data and a zod schema, safe to
|
|
21
|
+
import anywhere. Give it to `jr2Setup({ events })`. A Machine accepts only the events in that
|
|
22
|
+
list.
|
|
23
|
+
|
|
24
|
+
**Fields**
|
|
25
|
+
|
|
26
|
+
- `name`: `Name`
|
|
27
|
+
|
|
28
|
+
The event's name: its xstate event `type`, and the name of its tool on the Agent's Menu.
|
|
29
|
+
- `description` (optional): `string`
|
|
30
|
+
|
|
31
|
+
What the event means. An Agent's model reads it as the tool's description.
|
|
32
|
+
- `input`: `Input`
|
|
33
|
+
|
|
34
|
+
The schema of the event's payload: a flat `z.object`, never a union.
|
|
35
|
+
- `semantics`: [`EventSemantics`](type-eventsemantics.md)
|
|
36
|
+
|
|
37
|
+
How the sender gets its answer: always `"ack"` on an event that `createMachine` accepts.
|
|
38
|
+
- `audience` (optional): [`EventAudience`](type-eventaudience.md)
|
|
39
|
+
|
|
40
|
+
Who may send the event. Absent: the state of each `on` key decides (see [`EventAudience`](type-eventaudience.md)).
|
|
41
|
+
|
|
42
|
+
**See also**
|
|
43
|
+
|
|
44
|
+
- [Write a Workflow](../../guides/write-a-workflow.md)
|
|
45
|
+
- [ADR-0011: Control events are workflow-defined and delivered by closure, not routed](../decisions/0011-workflow-defined-events.md)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: EventFrom
|
|
3
|
+
description: A type that the Authoring surface names.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `EventFrom`
|
|
7
|
+
|
|
8
|
+
Type, in `src/define-event.ts` of `@jr2/agent-protocol`, a dependency of `@jr2/orchestrator`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type EventFrom<D extends EventDef> =
|
|
12
|
+
D extends EventDef<infer N, infer I>
|
|
13
|
+
?
|
|
14
|
+
{ type: N } & (z.infer<I> extends Record<string, never> ? unknown : z.infer<I>)
|
|
15
|
+
: never;
|
|
16
|
+
```
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: EventSemantics
|
|
3
|
+
description: How the party that sends an event gets its answer.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `EventSemantics`
|
|
7
|
+
|
|
8
|
+
Type, in `src/define-event.ts` of `@jr2/agent-protocol`, a dependency of `@jr2/orchestrator`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type EventSemantics = "ack" | "poll";
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
How the party that sends an event gets its answer.
|
|
15
|
+
|
|
16
|
+
- `"ack"`, the default: jr2 delivers the event and answers the sender. When the event starts
|
|
17
|
+
work inside the Agent's state, the answer comes when that work is done.
|
|
18
|
+
- `"poll"`: reserved. `createMachine` refuses it: ``machine "<id>": event "<name>" is `poll`,
|
|
19
|
+
which is reserved but NOT IMPLEMENTED (ADR-0013). Only `ack` events can be delivered today;
|
|
20
|
+
nothing drains a steer inbox, and degrading it to `ack` would hand the Agent a lying tool
|
|
21
|
+
contract.``
|
|
22
|
+
|
|
23
|
+
**See also**
|
|
24
|
+
|
|
25
|
+
- [The Menu](../../concepts/the-menu.md)
|
|
26
|
+
- [ADR-0006: The agent picks from a Machine-defined, schema-backed menu; it does not drive the workflow](../decisions/0006-agent-control-surface.md)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: ExecOutcome
|
|
3
|
+
description: How an exec ended.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `ExecOutcome`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/wire.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type ExecOutcome =
|
|
12
|
+
| { outcome: "exited"; code: number; tail: string }
|
|
13
|
+
| { outcome: "timeout"; tail: string }
|
|
14
|
+
| { outcome: "killed"; signal: string; tail: string };
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
How an exec ended. Every one is output; none is a fault.
|
|
18
|
+
|
|
19
|
+
**Forms**: it is one of these objects.
|
|
20
|
+
|
|
21
|
+
- Form 1: `outcome`, `code`, `tail`
|
|
22
|
+
|
|
23
|
+
- `outcome`: `"exited"`
|
|
24
|
+
- `code`: `number`
|
|
25
|
+
- `tail`: `string`
|
|
26
|
+
- Form 2: `outcome`, `tail`
|
|
27
|
+
|
|
28
|
+
- `outcome`: `"timeout"`
|
|
29
|
+
- `tail`: `string`
|
|
30
|
+
- Form 3: `outcome`, `signal`, `tail`
|
|
31
|
+
|
|
32
|
+
- `outcome`: `"killed"`
|
|
33
|
+
- `signal`: `string`
|
|
34
|
+
- `tail`: `string`
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: FailSlot
|
|
3
|
+
description: "The logic `fail()` returns: `failLogic` with the brand the walk reads."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `FailSlot`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/fail.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type FailSlot = PromiseActorLogic<never, FailureInput> & { readonly [FAIL_SLOT]: true };
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The logic `fail()` returns: `failLogic` with the brand the walk reads.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Failure
|
|
3
|
+
description: "A Failure as `isFailure` narrows an error to it: the payload's fields, on the error itself."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `Failure`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/fail.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type Failure = { readonly reason: string; readonly detail?: unknown };
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
A Failure as `isFailure` narrows an error to it: the payload's fields, on the error itself.
|
|
15
|
+
|
|
16
|
+
**Fields**
|
|
17
|
+
|
|
18
|
+
- `reason`: `string`
|
|
19
|
+
- `detail` (optional): `unknown`
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: FailureInput
|
|
3
|
+
description: "What a Failure carries: `reason`, text for a person, and `detail`, optional JSON for a machine reader."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `FailureInput`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/fail.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type FailureInput = { reason: string; detail?: unknown };
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
What a Failure carries: `reason`, text for a person, and `detail`, optional JSON for a machine
|
|
15
|
+
reader. The input of `fail()` and the output of a run that ends `failed`.
|
|
16
|
+
|
|
17
|
+
**Fields**
|
|
18
|
+
|
|
19
|
+
- `reason`: `string`
|
|
20
|
+
- `detail` (optional): `unknown`
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: FileBody
|
|
3
|
+
description: "`file(path, { segments?, contentType? })`: a Worktree file as an `http` body."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `FileBody`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/http-effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type FileBody<S extends z.ZodType | undefined = undefined> = {
|
|
12
|
+
readonly file: {
|
|
13
|
+
readonly path: FromInput<S, string>;
|
|
14
|
+
readonly segments?: FromInput<S, readonly string[]>;
|
|
15
|
+
readonly contentType?: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`file(path, { segments?, contentType? })`: a Worktree file as an `http` body.
|
|
21
|
+
|
|
22
|
+
**Fields**
|
|
23
|
+
|
|
24
|
+
- `file`: `object`
|
|
25
|
+
|
|
26
|
+
- `path`: `FromInput<S, string>`
|
|
27
|
+
|
|
28
|
+
The file, relative to the Worktree that `worktree` of the Effect's input names, or to `/work`
|
|
29
|
+
in a Workspace with no Repo Slot.
|
|
30
|
+
- `segments` (optional): `FromInput<S, readonly string[]>`
|
|
31
|
+
|
|
32
|
+
Path segments that jr2 adds to the end of the url, as `path` of `request` does for a json
|
|
33
|
+
or text body.
|
|
34
|
+
- `contentType` (optional): `string`
|
|
35
|
+
|
|
36
|
+
The content type of the body. Write it or a `content-type` header, not both. With neither,
|
|
37
|
+
it is `application/octet-stream`.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: FramePath
|
|
3
|
+
description: "A Turn's Frame in a Workspace with the Repo Slots `S`."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `FramePath`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/worktree.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type FramePath<S extends string> = WorktreePath<S> | "/work";
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
A Turn's Frame in a Workspace with the Repo Slots `S`.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: FromInput
|
|
3
|
+
description: "A value of a file body's part: as written, or from the Effect's input."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `FromInput`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/http-effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type FromInput<S, T> = T | ((input: S extends z.ZodType ? z.infer<S> : void) => T);
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
A value of a file body's part: as written, or from the Effect's input.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: HostInjectedInput
|
|
3
|
+
description: The fields that jr2 adds to the input of the Machine that a run starts, beside the input that the caller sent.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `HostInjectedInput`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/vocabulary.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Machine and events.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type HostInjectedInput = { instanceId: string };
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The fields that jr2 adds to the input of the Machine that a run starts, beside the input that
|
|
15
|
+
the caller sent. Today it is one field: `instanceId`, an id that jr2 makes for the run.
|
|
16
|
+
|
|
17
|
+
Add it to the type of your root Machine's input when the Machine reads it:
|
|
18
|
+
`HostInjectedInput & RunInput`. Do not put it in the `input` schema that a run starts with. No
|
|
19
|
+
caller sends it. jr2 writes it over any value that a caller sends.
|
|
20
|
+
|
|
21
|
+
Only the root Machine of a run gets it. A Machine that another Machine invokes gets the input
|
|
22
|
+
that its parent gives it. A `workspace()` passes its input to its body, so the body of a root
|
|
23
|
+
`workspace()` gets it too: `Workspaced<HostInjectedInput & RunInput, "app">`. For example, a cut
|
|
24
|
+
can name a branch for each run: `` branch: `fix/${context.instanceId}` ``.
|
|
25
|
+
|
|
26
|
+
It is not the run id. Use it, for example, to give each run a branch of its own.
|
|
27
|
+
|
|
28
|
+
**Fields**
|
|
29
|
+
|
|
30
|
+
- `instanceId`: `string`
|
|
31
|
+
|
|
32
|
+
**Example**
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import { z } from "zod";
|
|
36
|
+
import { jr2Setup, type HostInjectedInput } from "@jr2/orchestrator";
|
|
37
|
+
|
|
38
|
+
const runInput = z.object({ ticket: z.string() });
|
|
39
|
+
type Input = HostInjectedInput & z.infer<typeof runInput>;
|
|
40
|
+
|
|
41
|
+
export const machine = jr2Setup({
|
|
42
|
+
types: {} as { input: Input; context: Input; output: { run: string; ticket: string } },
|
|
43
|
+
}).createMachine({
|
|
44
|
+
id: "ticket",
|
|
45
|
+
input: runInput,
|
|
46
|
+
context: ({ input }) => input,
|
|
47
|
+
initial: "done",
|
|
48
|
+
states: { done: { type: "final" } },
|
|
49
|
+
output: ({ context }) => ({ run: context.instanceId, ticket: context.ticket }),
|
|
50
|
+
});
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**See also**
|
|
54
|
+
|
|
55
|
+
- [Write a Workflow](../../guides/write-a-workflow.md)
|
|
56
|
+
- [ADR-0033: A Machine declares the input that starts it](../decisions/0033-a-machine-declares-the-input-that-starts-it.md)
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: HttpDefinition
|
|
3
|
+
description: "An `http` Effect's definition."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `HttpDefinition`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/http-effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type HttpDefinition<S extends z.ZodType | undefined = undefined> = {
|
|
12
|
+
method: HttpMethod;
|
|
13
|
+
url: string | Text | typeof open;
|
|
14
|
+
headers?: Readonly<Record<string, string | Text>>;
|
|
15
|
+
auth?: { readonly bearer: Secret } | { readonly basic: { user: Text; password: Text } } | Text;
|
|
16
|
+
input?: S;
|
|
17
|
+
request?: (input: S extends z.ZodType ? z.infer<S> : void) => HttpRequestParts;
|
|
18
|
+
body?: FileBody<S>;
|
|
19
|
+
timeout?: Duration;
|
|
20
|
+
maxBody?: number;
|
|
21
|
+
idempotent?: boolean;
|
|
22
|
+
};
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
An `http` Effect's definition.
|
|
26
|
+
|
|
27
|
+
**Fields**
|
|
28
|
+
|
|
29
|
+
- `method`: [`HttpMethod`](type-httpmethod.md)
|
|
30
|
+
|
|
31
|
+
The HTTP method: `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE` or `OPTIONS`. It refuses
|
|
32
|
+
another: `http({ method: "<method>" }): the method is one of GET, HEAD, POST, PUT, PATCH,
|
|
33
|
+
DELETE, OPTIONS`.
|
|
34
|
+
- `url`: `string | Text | typeof open`
|
|
35
|
+
|
|
36
|
+
The url: `http://` or `https://`, then a literal host. No input, param or Effect secret can
|
|
37
|
+
change where the call goes. An Effect secret can be only in the path:
|
|
38
|
+
`` text`https://api.telegram.org/bot${secret("tg")}/sendMessage` ``.
|
|
39
|
+
|
|
40
|
+
Or `open`: a packaged Machine that cannot know the host leaves the url Open, and the composer
|
|
41
|
+
binds it one time with `customize(machine, { effects: { <slot>: { url } } })`.
|
|
42
|
+
|
|
43
|
+
It refuses:
|
|
44
|
+
- a scheme or host that is not literal: `` http({ url }): the url is an http:// or https:// url
|
|
45
|
+
whose scheme and host are literal — a secret may sit only in its path, after a "/":
|
|
46
|
+
text`https://api.example.com/bot${secret("tg")}/send` (ADR-0068) ``
|
|
47
|
+
- an Effect secret after `?` or `#`: `` http({ url }): secret("<name>") sits in the url's query
|
|
48
|
+
or fragment — a secret may sit only in its path; send it in `auth` or a header instead:
|
|
49
|
+
headers: { "x-api-key": text`${secret("...")}` } (ADR-0068) ``
|
|
50
|
+
- a host that is not a host: `http({ url }): "<scheme>://<host>" is not a host`
|
|
51
|
+
- a user name or password in the url: ``http({ url }): the url carries userinfo — use `auth` ``
|
|
52
|
+
- `headers` (optional): `Readonly<Record<string, string | Text>>`
|
|
53
|
+
|
|
54
|
+
Headers that are the same for each run. Each name is lowercase. A value is a string, or a
|
|
55
|
+
`text` with an Effect secret.
|
|
56
|
+
|
|
57
|
+
It refuses:
|
|
58
|
+
- a name that is not lowercase, or that frames or routes the request (`host`,
|
|
59
|
+
`content-length`, `transfer-encoding`, `connection`, `upgrade`, `te`, `trailer`,
|
|
60
|
+
`keep-alive`, `proxy-*`): `http({ headers }): "<name>" is not a header an Effect sets — a
|
|
61
|
+
lowercase name that does not frame or route the request (ADR-0068)`
|
|
62
|
+
- an `authorization` header beside `auth`: ``http({ headers }): "authorization" is set by
|
|
63
|
+
`auth` — write one of them``
|
|
64
|
+
- `auth` (optional): `{ readonly bearer: Secret; } | { readonly basic: { user: Text; password: Text; }; } | Text`
|
|
65
|
+
|
|
66
|
+
The `Authorization` header: `bearer(secret("x"))`, `basic(user, password)`, or a `text` that
|
|
67
|
+
is the whole value.
|
|
68
|
+
- `input` (optional): `S`
|
|
69
|
+
|
|
70
|
+
The zod schema of the input of the Effect: what the `input` of the `invoke`, or `fromPick`,
|
|
71
|
+
gives it. jr2 parses the input with it before the call. When it starts, input that does not
|
|
72
|
+
agree with it makes the Effect fail (its `onError` route): `http "<slot>": its input does not
|
|
73
|
+
match the definition's input schema — <path>: <message>`, one `<path>: <message>` for each
|
|
74
|
+
problem, joined by `; `.
|
|
75
|
+
- `request` (optional): `(input: S extends z.ZodType ? z.infer<S> : void) => HttpRequestParts`
|
|
76
|
+
|
|
77
|
+
A function that makes the part of the request that changes for each run, from the input:
|
|
78
|
+
`path` segments, and a `json` or `text` body. It cannot change the host, a header or an
|
|
79
|
+
Effect secret. Do not write it beside `body`.
|
|
80
|
+
- `body` (optional): `FileBody<S>`
|
|
81
|
+
|
|
82
|
+
A Worktree file as the body: `file(path, { segments?, contentType? })`. The Effect then
|
|
83
|
+
runs in the Sandbox Effector of its Workspace. Under a Workspace with Repo Slots, the invoke's
|
|
84
|
+
input names a Worktree that a cut of this run made, in `worktree`; with none, it refuses when
|
|
85
|
+
it starts: ``http "<slot>" reads a Worktree file, under a Workspace with Repo Slots, and its
|
|
86
|
+
input names no `worktree` ``. Do not write `request` beside it: the `segments`
|
|
87
|
+
of `file` are the path. It refuses another body: ``http({ body }): a body is file(path, {
|
|
88
|
+
segments?, contentType? }) — json and text come from `request` ``.
|
|
89
|
+
- `timeout` (optional): [`Duration`](type-duration.md)
|
|
90
|
+
|
|
91
|
+
How long jr2 waits for the answer: a number and a unit, such as `"30s"` or `"2m"`. Default
|
|
92
|
+
`"30s"`. With no answer in that time, the output is `unknown`. It refuses a value that is not
|
|
93
|
+
a positive duration: `http: timeout "<timeout>" is not a positive duration (like "30s",
|
|
94
|
+
"2m")`.
|
|
95
|
+
- `maxBody` (optional): `number`
|
|
96
|
+
|
|
97
|
+
The largest number of bytes of a text response body that the output keeps. Default 65536.
|
|
98
|
+
When jr2 cuts the body, `truncated` is `true`. It refuses a value that is not a positive whole
|
|
99
|
+
number: `http({ maxBody }): a positive number of bytes`.
|
|
100
|
+
- `idempotent` (optional): `boolean`
|
|
101
|
+
|
|
102
|
+
`true` when it is safe to send the call two times: it has its own idempotency key, or it only
|
|
103
|
+
reads. Default `false`. After an Orchestrator restart, jr2 cannot always tell if the call went
|
|
104
|
+
out. Then it sends an idempotent call again, and gives any other call the output `unknown`.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: HttpFileInput
|
|
3
|
+
description: The input of an `http` Effect with a Worktree file as its body.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `HttpFileInput`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/http-effect.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type HttpFileInput<S> = (S extends z.ZodType ? z.infer<S> : unknown) & { worktree?: AnyWorktreePath };
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The input of an `http` Effect with a Worktree file as its body. Under a Workspace with Repo
|
|
15
|
+
Slots, `worktree` names the Worktree. In a Workspace with no Repo Slot, the input has no
|
|
16
|
+
`worktree`, and the path is relative to `/work`.
|
|
17
|
+
|
|
18
|
+
**Fields**
|
|
19
|
+
|
|
20
|
+
- `worktree` (optional): [`AnyWorktreePath`](type-anyworktreepath.md)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: HttpInput
|
|
3
|
+
description: A type that the Authoring surface names.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `HttpInput`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/http-effect.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type HttpInput<S> = S extends z.ZodType ? z.infer<S> : void;
|
|
12
|
+
```
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: HttpMethod
|
|
3
|
+
description: "The method of an `http` Effect: `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE` or `OPTIONS`."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `HttpMethod`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/effector-wire.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type HttpMethod = z.infer<typeof HttpMethodShape>;
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The method of an `http` Effect: `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE` or `OPTIONS`.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: HttpOpenParts
|
|
3
|
+
description: A type that the Authoring surface names.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `HttpOpenParts`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/http-effect.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type HttpOpenParts<U, A, H> = (U extends typeof open ? "url" : never) | OpenSecretIn<A | ValuesOf<H>>;
|
|
12
|
+
```
|