@jr2/orchestrator 0.4.1 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +442 -0
- package/docs/concepts/architecture.md +230 -0
- package/docs/concepts/charts.md +143 -0
- package/docs/concepts/composition.md +357 -0
- package/docs/concepts/converge.md +254 -0
- package/docs/concepts/durable-runs.md +189 -0
- package/docs/concepts/effects.md +603 -0
- package/docs/concepts/gates.md +208 -0
- package/docs/concepts/machines-and-workflows.md +289 -0
- package/docs/concepts/pools-and-sources.md +230 -0
- package/docs/concepts/secrets-and-trust.md +222 -0
- package/docs/concepts/the-menu.md +378 -0
- package/docs/concepts/workspaces.md +678 -0
- package/docs/get-started/a-model-decides.md +563 -0
- package/docs/get-started/an-agent-in-a-sandbox.md +381 -0
- package/docs/get-started/connect-a-model.md +248 -0
- package/docs/get-started/create-an-instance.md +194 -0
- package/docs/get-started/have-your-assistant-write-a-machine.md +922 -0
- package/docs/get-started/install.md +126 -0
- package/docs/guides/add-tools-to-the-sandbox.md +295 -0
- package/docs/guides/answer-a-gate.md +304 -0
- package/docs/guides/bind-open-parts.md +223 -0
- package/docs/guides/cancel-a-run.md +146 -0
- package/docs/guides/clean-up.md +206 -0
- package/docs/guides/fix-a-failed-converge.md +361 -0
- package/docs/guides/give-the-cluster-git-credentials.md +222 -0
- package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
- package/docs/guides/let-an-agent-write-a-chart.md +226 -0
- package/docs/guides/look-inside-a-sandbox.md +174 -0
- package/docs/guides/mirror-the-kit-images.md +176 -0
- package/docs/guides/move-from-kind-to-a-shared-cluster.md +302 -0
- package/docs/guides/open-the-console.md +91 -0
- package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
- package/docs/guides/push-and-sign-a-branch.md +486 -0
- package/docs/guides/run-a-chart-by-name.md +270 -0
- package/docs/guides/run-a-command-or-call-a-url.md +544 -0
- package/docs/guides/run-one-worker-per-item.md +321 -0
- package/docs/guides/set-an-agents-access-and-dials.md +375 -0
- package/docs/guides/size-a-workspace.md +204 -0
- package/docs/guides/start-a-run-from-a-run.md +237 -0
- package/docs/guides/start-a-run.md +207 -0
- package/docs/guides/upgrade-the-kit-version.md +240 -0
- package/docs/guides/use-a-hosted-provider.md +208 -0
- package/docs/guides/use-a-local-model.md +313 -0
- package/docs/guides/watch-a-run.md +326 -0
- package/docs/guides/write-a-workflow.md +318 -0
- package/docs/index.md +44 -0
- package/docs/llms.txt +216 -0
- package/docs/reference/authoring-surface/agent.md +128 -0
- package/docs/reference/authoring-surface/answer.md +140 -0
- package/docs/reference/authoring-surface/arg.md +60 -0
- package/docs/reference/authoring-surface/basic.md +62 -0
- package/docs/reference/authoring-surface/bearer.md +53 -0
- package/docs/reference/authoring-surface/chartschema.md +23 -0
- package/docs/reference/authoring-surface/chartschemafor.md +48 -0
- package/docs/reference/authoring-surface/command.md +191 -0
- package/docs/reference/authoring-surface/customize.md +64 -0
- package/docs/reference/authoring-surface/defineconfig.md +41 -0
- package/docs/reference/authoring-surface/defineevent.md +114 -0
- package/docs/reference/authoring-surface/dispatch.md +126 -0
- package/docs/reference/authoring-surface/fail.md +83 -0
- package/docs/reference/authoring-surface/file.md +122 -0
- package/docs/reference/authoring-surface/frompick.md +277 -0
- package/docs/reference/authoring-surface/http.md +159 -0
- package/docs/reference/authoring-surface/isfailure.md +58 -0
- package/docs/reference/authoring-surface/jr2setup.md +237 -0
- package/docs/reference/authoring-surface/open.md +74 -0
- package/docs/reference/authoring-surface/openbody.md +86 -0
- package/docs/reference/authoring-surface/paramsof.md +125 -0
- package/docs/reference/authoring-surface/pool.md +186 -0
- package/docs/reference/authoring-surface/push.md +112 -0
- package/docs/reference/authoring-surface/secret.md +118 -0
- package/docs/reference/authoring-surface/sentby.md +83 -0
- package/docs/reference/authoring-surface/source.md +51 -0
- package/docs/reference/authoring-surface/text.md +62 -0
- package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
- package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
- package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
- package/docs/reference/authoring-surface/type-agentslots.md +12 -0
- package/docs/reference/authoring-surface/type-answeraction.md +12 -0
- package/docs/reference/authoring-surface/type-arg.md +19 -0
- package/docs/reference/authoring-surface/type-argnames.md +12 -0
- package/docs/reference/authoring-surface/type-binding.md +62 -0
- package/docs/reference/authoring-surface/type-bindingof.md +12 -0
- package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
- package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
- package/docs/reference/authoring-surface/type-ceilings.md +41 -0
- package/docs/reference/authoring-surface/type-chainlink.md +19 -0
- package/docs/reference/authoring-surface/type-chartaction.md +46 -0
- package/docs/reference/authoring-surface/type-chartagent.md +28 -0
- package/docs/reference/authoring-surface/type-chartevent.md +20 -0
- package/docs/reference/authoring-surface/type-chartguard.md +20 -0
- package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
- package/docs/reference/authoring-surface/type-chartjson.md +14 -0
- package/docs/reference/authoring-surface/type-chartstate.md +46 -0
- package/docs/reference/authoring-surface/type-charttext.md +40 -0
- package/docs/reference/authoring-surface/type-charttransition.md +22 -0
- package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
- package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
- package/docs/reference/authoring-surface/type-childat.md +12 -0
- package/docs/reference/authoring-surface/type-childslots.md +12 -0
- package/docs/reference/authoring-surface/type-commandenv.md +15 -0
- package/docs/reference/authoring-surface/type-commandinput.md +19 -0
- package/docs/reference/authoring-surface/type-commandoptions.md +78 -0
- package/docs/reference/authoring-surface/type-commandoutput.md +104 -0
- package/docs/reference/authoring-surface/type-customize.md +109 -0
- package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
- package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
- package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
- package/docs/reference/authoring-surface/type-dispatchoutput.md +65 -0
- package/docs/reference/authoring-surface/type-duration.md +15 -0
- package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
- package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
- package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
- package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
- package/docs/reference/authoring-surface/type-eventdef.md +45 -0
- package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
- package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
- package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
- package/docs/reference/authoring-surface/type-failslot.md +14 -0
- package/docs/reference/authoring-surface/type-failure.md +19 -0
- package/docs/reference/authoring-surface/type-failureinput.md +20 -0
- package/docs/reference/authoring-surface/type-filebody.md +41 -0
- package/docs/reference/authoring-surface/type-frominput.md +14 -0
- package/docs/reference/authoring-surface/type-hostinjectedinput.md +58 -0
- package/docs/reference/authoring-surface/type-httpdefinition.md +101 -0
- package/docs/reference/authoring-surface/type-httpinput.md +12 -0
- package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
- package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
- package/docs/reference/authoring-surface/type-httpoutput.md +89 -0
- package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
- package/docs/reference/authoring-surface/type-jr2config.md +126 -0
- package/docs/reference/authoring-surface/type-lends.md +38 -0
- package/docs/reference/authoring-surface/type-logicat.md +12 -0
- package/docs/reference/authoring-surface/type-markedif.md +12 -0
- package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
- package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
- package/docs/reference/authoring-surface/type-noslotspec.md +26 -0
- package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +32 -0
- package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
- package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
- package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
- package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
- package/docs/reference/authoring-surface/type-opencommandinput.md +17 -0
- package/docs/reference/authoring-surface/type-openeffect.md +12 -0
- package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
- package/docs/reference/authoring-surface/type-openof.md +12 -0
- package/docs/reference/authoring-surface/type-opensecret.md +23 -0
- package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
- package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +31 -0
- package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +32 -0
- package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
- package/docs/reference/authoring-surface/type-poolspec.md +60 -0
- package/docs/reference/authoring-surface/type-pushinput.md +15 -0
- package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
- package/docs/reference/authoring-surface/type-pushoutput.md +124 -0
- package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
- package/docs/reference/authoring-surface/type-quantity.md +14 -0
- package/docs/reference/authoring-surface/type-reached.md +12 -0
- package/docs/reference/authoring-surface/type-reposlot.md +70 -0
- package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
- package/docs/reference/authoring-surface/type-sandboxoptions.md +77 -0
- package/docs/reference/authoring-surface/type-secret.md +25 -0
- package/docs/reference/authoring-surface/type-sender.md +19 -0
- package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
- package/docs/reference/authoring-surface/type-size.md +85 -0
- package/docs/reference/authoring-surface/type-slothandles.md +32 -0
- package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
- package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
- package/docs/reference/authoring-surface/type-syncstate.md +12 -0
- package/docs/reference/authoring-surface/type-text.md +19 -0
- package/docs/reference/authoring-surface/type-textpart.md +24 -0
- package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
- package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
- package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
- package/docs/reference/authoring-surface/type-unknown.md +21 -0
- package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
- package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
- package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
- package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
- package/docs/reference/authoring-surface/type-workspaced.md +94 -0
- package/docs/reference/authoring-surface/type-workspacehandles.md +23 -0
- package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
- package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
- package/docs/reference/authoring-surface/type-workspaceoptions.md +39 -0
- package/docs/reference/authoring-surface/type-workspacespec.md +37 -0
- package/docs/reference/authoring-surface/workspace.md +259 -0
- package/docs/reference/authoring-surface.md +197 -0
- package/docs/reference/cli.md +433 -0
- package/docs/reference/config.md +756 -0
- package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +113 -0
- package/docs/reference/decisions/0002-duplex-streaming-actor.md +110 -0
- package/docs/reference/decisions/0004-worktree-provisioning-model.md +124 -0
- package/docs/reference/decisions/0005-sandbox-pod-composition.md +230 -0
- package/docs/reference/decisions/0006-agent-control-surface.md +47 -0
- package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
- package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
- package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
- package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
- package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
- package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
- package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +157 -0
- package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
- package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +265 -0
- package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +124 -0
- package/docs/reference/decisions/0017-pool-over-a-source-port.md +69 -0
- package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
- package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +275 -0
- package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
- package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +100 -0
- package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
- package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +176 -0
- package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +439 -0
- package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
- package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
- package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +237 -0
- package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +89 -0
- package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
- package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
- package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +190 -0
- package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
- package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +127 -0
- package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
- package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
- package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
- package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
- package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
- package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
- package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
- package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
- package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
- package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
- package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
- package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
- package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
- package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
- package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
- package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
- package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +227 -0
- package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +81 -0
- package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +111 -0
- package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
- package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
- package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
- package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
- package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +106 -0
- package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +384 -0
- package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
- package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
- package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +212 -0
- package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +83 -0
- package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
- package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
- package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +550 -0
- package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +430 -0
- package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +464 -0
- package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
- package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +323 -0
- package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
- package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
- package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
- package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
- package/docs/reference/decisions.md +83 -0
- package/docs/reference/glossary.md +648 -0
- package/docs/reference/http-api.md +1348 -0
- package/docs/reference/machines.md +190 -0
- package/docs/reference/mechanism-events.md +72 -0
- package/docs/why.md +206 -0
- package/package.json +5 -3
- package/src/actor.ts +541 -79
- package/src/agent.ts +114 -38
- package/src/ambient.ts +2 -1
- package/src/assembly-checks.ts +189 -7
- package/src/cause.ts +234 -0
- package/src/chart.ts +169 -37
- package/src/charts.ts +34 -6
- package/src/config.ts +430 -178
- package/src/custodian.ts +74 -22
- package/src/customize.ts +188 -46
- package/src/dispatch-effect.ts +945 -0
- package/src/door-compat.ts +217 -0
- package/src/durability.ts +11 -4
- package/src/effect.ts +341 -44
- package/src/effector-wire.ts +160 -11
- package/src/fail.ts +209 -0
- package/src/harness-client.ts +541 -47
- package/src/http-effect.ts +495 -53
- package/src/http.ts +427 -16
- package/src/index.ts +60 -82
- package/src/instance.ts +68 -8
- package/src/internal.ts +84 -0
- package/src/machine-doc.ts +21 -3
- package/src/mechanism-routes.ts +168 -0
- package/src/model-keys.generated.ts +53 -0
- package/src/model-keys.ts +18 -58
- package/src/notices.ts +66 -13
- package/src/open-body.ts +159 -23
- package/src/open-effect.ts +81 -8
- package/src/open.ts +59 -6
- package/src/parts.ts +184 -13
- package/src/party.ts +68 -2
- package/src/pick.ts +463 -11
- package/src/pool.ts +247 -36
- package/src/registration.ts +83 -4
- package/src/repos.ts +2 -1
- package/src/run-host.ts +565 -31
- package/src/run-output.ts +38 -0
- package/src/sandbox-effect.ts +273 -38
- package/src/sandbox-kube.ts +3 -1
- package/src/secret-placement.ts +52 -17
- package/src/server.ts +3 -0
- package/src/setup.ts +239 -56
- 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/vocabulary.ts +69 -14
- package/src/wire.ts +90 -16
- package/src/workspace.ts +697 -175
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: pool
|
|
3
|
+
description: "Make a Pool: a Machine that runs one worker Machine for each item that a Source gives, with at most `cap` workers at once."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `pool`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/pool.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
|
|
9
|
+
|
|
10
|
+
## Overload 1
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
function pool<
|
|
14
|
+
TWorker extends AnyStateMachine,
|
|
15
|
+
TSchema extends z.ZodObject,
|
|
16
|
+
>(
|
|
17
|
+
worker: TWorker,
|
|
18
|
+
spec: PoolSpec<any, z.infer<TSchema>> & { input: TSchema },
|
|
19
|
+
): PoolMachine<TWorker, z.infer<TSchema>>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Make a Pool: a Machine that runs one worker Machine for each item that a Source gives, with at
|
|
23
|
+
most `cap` workers at once. Use it as the root of a Workflow (`export const machine = pool(…)`),
|
|
24
|
+
or compose it in another Machine.
|
|
25
|
+
|
|
26
|
+
The run ends when the Source has no item ready and no worker runs. Its output is
|
|
27
|
+
`{ status, items, failures }`: `status` is `"drained"` when no item is left, or `"deadlocked"`
|
|
28
|
+
when items exist but none can start; `items` holds the output of each worker that got to a final
|
|
29
|
+
state, by item id; `failures` holds the Failure of each worker that failed, by item id. A worker's
|
|
30
|
+
Failure stops only that worker: the other workers and their Sandboxes stay. When the Pool ends
|
|
31
|
+
with one or more failures, `drained` or `deadlocked`, it fails the run by default: the reason is
|
|
32
|
+
`"<n> of <m> items failed"`, and the detail is `{ status, items, failures }`. With
|
|
33
|
+
`failures: "report"`, it ends `done` with that output. A worker's defect ends the whole run
|
|
34
|
+
`error`. While workers wait on Gates, the run stays open.
|
|
35
|
+
|
|
36
|
+
`customize()` reaches through a Pool to its worker: `customize(pool, { agents })` retunes the
|
|
37
|
+
worker's Agents. The events that the Pool accepts are its `wake` event only; each worker keeps
|
|
38
|
+
its own.
|
|
39
|
+
|
|
40
|
+
**Parameters**
|
|
41
|
+
|
|
42
|
+
- `worker`: The Machine to run for each item. It gets the item, or what `itemInput` makes
|
|
43
|
+
of it, as its input. It does not get the run input.
|
|
44
|
+
- `spec`: The Source, the item id, the cap, and the worker's input. See [`PoolSpec`](type-poolspec.md).
|
|
45
|
+
|
|
46
|
+
- `id` (optional): `string`
|
|
47
|
+
|
|
48
|
+
The Machine id: the name of the Pool in the Console. Default: `"pool"`.
|
|
49
|
+
- `input`: `z.ZodObject`
|
|
50
|
+
|
|
51
|
+
The run input of the Pool, as a zod object: what a caller sends to start a run. `cap` and
|
|
52
|
+
`itemInput` read it, typed by it. A worker never gets it: each worker gets its item. Default:
|
|
53
|
+
none, and then their `input` is `unknown`.
|
|
54
|
+
- `source`: `SourceSpec<T>`
|
|
55
|
+
|
|
56
|
+
Where the items come from. Make it with [`source`](source.md).
|
|
57
|
+
- `itemId`: `(item: T) => string`
|
|
58
|
+
|
|
59
|
+
The id of an item. The Pool uses it as the id of the item's worker and in the `active` list
|
|
60
|
+
that `next` gets. It is also the key of that worker's output in `items`. Give each item an id
|
|
61
|
+
of its own, and the same id every time.
|
|
62
|
+
- `cap` (optional): `number | ((args: { input: TInput; }) => number)`
|
|
63
|
+
|
|
64
|
+
The most workers that run at once: a number, or a function of the run input. Default: `1`.
|
|
65
|
+
- `itemInput` (optional): `(item: T, args: { input: TInput; }) => unknown`
|
|
66
|
+
|
|
67
|
+
Make a worker's input from its item and the run input. Default: the item itself.
|
|
68
|
+
- `onDrained` (optional): `"final"`
|
|
69
|
+
|
|
70
|
+
What the Pool does when the Source has no more items and every worker has settled. Only
|
|
71
|
+
`"final"`: the run ends. Default: `"final"`.
|
|
72
|
+
- `failures` (optional): `"fail" | "report"`
|
|
73
|
+
|
|
74
|
+
What the Pool does at the end when one or more workers failed. The Pool catches each worker's
|
|
75
|
+
Failure either way, so one failed item does not stop the other workers. `"fail"`: when the Pool
|
|
76
|
+
ends with failures, `drained` or `deadlocked`, it fails the run with the reason
|
|
77
|
+
`"<n> of <m> items failed"` and the detail `{ status, items, failures }`. `"report"`: the Pool
|
|
78
|
+
ends `done`, with the failures in its output. Default: `"fail"`.
|
|
79
|
+
|
|
80
|
+
**Returns**: The Pool, as a Machine.
|
|
81
|
+
|
|
82
|
+
**Example**
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
import { fromPromise } from "xstate";
|
|
86
|
+
import { customize, pool, source } from "@jr2/orchestrator";
|
|
87
|
+
import { task } from "@jr2/machines";
|
|
88
|
+
|
|
89
|
+
type Issue = { id: string; title: string };
|
|
90
|
+
|
|
91
|
+
const backlog: Issue[] = [
|
|
92
|
+
{ id: "ISSUE-1", title: "Fix the greeting." },
|
|
93
|
+
{ id: "ISSUE-2", title: "Add a --name flag." },
|
|
94
|
+
];
|
|
95
|
+
|
|
96
|
+
const issues = source<Issue>({
|
|
97
|
+
next: fromPromise(async ({ input }: { input: { active: string[] } }) => {
|
|
98
|
+
const issue = backlog.find((i) => !input.active.includes(i.id)) ?? null;
|
|
99
|
+
if (issue) backlog.splice(backlog.indexOf(issue), 1);
|
|
100
|
+
return issue;
|
|
101
|
+
}),
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
const fixer = customize(task, {
|
|
105
|
+
repos: { app: { url: "https://github.com/you/app.git" } },
|
|
106
|
+
agents: { coder: { model: "anthropic/claude-haiku-5-5" } },
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
export const machine = pool(fixer, {
|
|
110
|
+
id: "issues",
|
|
111
|
+
source: issues,
|
|
112
|
+
itemId: (issue: Issue) => issue.id,
|
|
113
|
+
cap: 2,
|
|
114
|
+
itemInput: (issue: Issue) => ({ prompt: issue.title, branch: `fix/${issue.id}` }),
|
|
115
|
+
});
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**See also**
|
|
119
|
+
|
|
120
|
+
- [Run one worker per item](../../guides/run-one-worker-per-item.md)
|
|
121
|
+
- [Pools and Sources](../../concepts/pools-and-sources.md)
|
|
122
|
+
- [ADR-0017: The run loop is a jr2 `pool` over a generalized source port](../decisions/0017-pool-over-a-source-port.md)
|
|
123
|
+
|
|
124
|
+
## Overload 2
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
function pool<
|
|
128
|
+
TWorker extends AnyStateMachine,
|
|
129
|
+
TInput = unknown,
|
|
130
|
+
>(
|
|
131
|
+
worker: TWorker,
|
|
132
|
+
spec: PoolSpec<any, TInput> & { input?: never },
|
|
133
|
+
): PoolMachine<TWorker, TInput>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Make a Pool with no `input` schema. A Pool is a Machine that runs one worker Machine for each
|
|
137
|
+
item that a Source gives, with at most `cap` workers at once. See `pool` for the full description and
|
|
138
|
+
an example.
|
|
139
|
+
|
|
140
|
+
**Parameters**
|
|
141
|
+
|
|
142
|
+
- `worker`: The Machine to run for each item. It gets the item, or what `itemInput` makes
|
|
143
|
+
of it, as its input. It does not get the run input.
|
|
144
|
+
- `spec`: The Source, the item id, the cap, and the worker's input. See [`PoolSpec`](type-poolspec.md).
|
|
145
|
+
|
|
146
|
+
- `id` (optional): `string`
|
|
147
|
+
|
|
148
|
+
The Machine id: the name of the Pool in the Console. Default: `"pool"`.
|
|
149
|
+
- `input` (optional): `z.ZodObject`
|
|
150
|
+
|
|
151
|
+
The run input of the Pool, as a zod object: what a caller sends to start a run. `cap` and
|
|
152
|
+
`itemInput` read it, typed by it. A worker never gets it: each worker gets its item. Default:
|
|
153
|
+
none, and then their `input` is `unknown`.
|
|
154
|
+
- `source`: `SourceSpec<T>`
|
|
155
|
+
|
|
156
|
+
Where the items come from. Make it with [`source`](source.md).
|
|
157
|
+
- `itemId`: `(item: T) => string`
|
|
158
|
+
|
|
159
|
+
The id of an item. The Pool uses it as the id of the item's worker and in the `active` list
|
|
160
|
+
that `next` gets. It is also the key of that worker's output in `items`. Give each item an id
|
|
161
|
+
of its own, and the same id every time.
|
|
162
|
+
- `cap` (optional): `number | ((args: { input: TInput; }) => number)`
|
|
163
|
+
|
|
164
|
+
The most workers that run at once: a number, or a function of the run input. Default: `1`.
|
|
165
|
+
- `itemInput` (optional): `(item: T, args: { input: TInput; }) => unknown`
|
|
166
|
+
|
|
167
|
+
Make a worker's input from its item and the run input. Default: the item itself.
|
|
168
|
+
- `onDrained` (optional): `"final"`
|
|
169
|
+
|
|
170
|
+
What the Pool does when the Source has no more items and every worker has settled. Only
|
|
171
|
+
`"final"`: the run ends. Default: `"final"`.
|
|
172
|
+
- `failures` (optional): `"fail" | "report"`
|
|
173
|
+
|
|
174
|
+
What the Pool does at the end when one or more workers failed. The Pool catches each worker's
|
|
175
|
+
Failure either way, so one failed item does not stop the other workers. `"fail"`: when the Pool
|
|
176
|
+
ends with failures, `drained` or `deadlocked`, it fails the run with the reason
|
|
177
|
+
`"<n> of <m> items failed"` and the detail `{ status, items, failures }`. `"report"`: the Pool
|
|
178
|
+
ends `done`, with the failures in its output. Default: `"fail"`.
|
|
179
|
+
|
|
180
|
+
**Returns**: The Pool, as a Machine.
|
|
181
|
+
|
|
182
|
+
**See also**
|
|
183
|
+
|
|
184
|
+
- [Run one worker per item](../../guides/run-one-worker-per-item.md)
|
|
185
|
+
- [Pools and Sources](../../concepts/pools-and-sources.md)
|
|
186
|
+
- [ADR-0017: The run loop is a jr2 `pool` over a generalized source port](../decisions/0017-pool-over-a-source-port.md)
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: push
|
|
3
|
+
description: "Make a `push` Effect: it pushes the branch of the Workspace to the Binding of its Repo Slot."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `push`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/sandbox-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
function push<
|
|
12
|
+
const O extends PushOptions,
|
|
13
|
+
>(
|
|
14
|
+
options?: O,
|
|
15
|
+
): EffectLogic<PushInput<O> | void, PushOutput>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Make a `push` Effect: it pushes the branch of the Workspace to the Binding of its Repo Slot.
|
|
19
|
+
Put it in `actors`, and invoke it from the body of a `workspace()`: `actors: { publish: push({
|
|
20
|
+
sign: true }) }`.
|
|
21
|
+
|
|
22
|
+
It runs in the Sandbox Effector of the Workspace, with the push credential of the
|
|
23
|
+
`git.credentials` entry that the Binding matches. The Agent never reads that credential. It
|
|
24
|
+
pushes one commit: the tip of the Agent's branch when the Effect starts, or, with `pin`, the
|
|
25
|
+
commit that the input names. After an Orchestrator restart, jr2 pushes only that same commit
|
|
26
|
+
again. With `sign` or `squash`, the commit on the remote is not the Agent's own. Then jr2 moves
|
|
27
|
+
the Agent's branch to it.
|
|
28
|
+
|
|
29
|
+
Every outcome is output (`PushOutput`): `pushed`, `rejected`, `diverged` or `unknown`. Each
|
|
30
|
+
field of [`PushOptions`](type-pushoptions.md) tells what it refuses. When it starts, it also refuses a push
|
|
31
|
+
outside a Workspace: `push "<slot>" runs in the Sandbox Effector of a Workspace, and its state is
|
|
32
|
+
not inside a workspace() — invoke it from a Workspace's body (ADR-0067)`.
|
|
33
|
+
|
|
34
|
+
**Parameters**
|
|
35
|
+
|
|
36
|
+
- `options` ([`PushOptions`](type-pushoptions.md)): Optional. Each field tells what it does.
|
|
37
|
+
|
|
38
|
+
**Returns**: An Effect, for `actors`.
|
|
39
|
+
|
|
40
|
+
**Example**
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { z } from "zod";
|
|
44
|
+
import {
|
|
45
|
+
agent,
|
|
46
|
+
defineEvent,
|
|
47
|
+
fail,
|
|
48
|
+
jr2Setup,
|
|
49
|
+
push,
|
|
50
|
+
workspace,
|
|
51
|
+
type Workspaced,
|
|
52
|
+
} from "@jr2/orchestrator";
|
|
53
|
+
|
|
54
|
+
const committed = defineEvent({
|
|
55
|
+
name: "committed",
|
|
56
|
+
description: "Say that the fix is committed.",
|
|
57
|
+
input: z.object({}),
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
type Input = Workspaced<{}, "app">;
|
|
61
|
+
|
|
62
|
+
const body = jr2Setup({
|
|
63
|
+
types: {} as { context: Input; input: Input },
|
|
64
|
+
events: [committed],
|
|
65
|
+
actors: {
|
|
66
|
+
coder: agent({
|
|
67
|
+
model: "anthropic/claude-haiku-5-5",
|
|
68
|
+
instructions: "You are a careful engineer.",
|
|
69
|
+
}),
|
|
70
|
+
publish: push({ sign: true }),
|
|
71
|
+
fail: fail(),
|
|
72
|
+
},
|
|
73
|
+
}).createMachine({
|
|
74
|
+
id: "fix-test",
|
|
75
|
+
context: ({ input }) => input,
|
|
76
|
+
on: { "workspace.lost": ".failed", "agent.fault": ".failed" },
|
|
77
|
+
initial: "coding",
|
|
78
|
+
states: {
|
|
79
|
+
coding: {
|
|
80
|
+
invoke: { src: "coder", input: { prompt: "Fix the failing test, and commit the fix." } },
|
|
81
|
+
// The Agent moves the Machine on with a pick. An Agent's actor never ends, so `onDone`
|
|
82
|
+
// never fires.
|
|
83
|
+
on: { committed: "publishing" },
|
|
84
|
+
},
|
|
85
|
+
publishing: {
|
|
86
|
+
invoke: {
|
|
87
|
+
src: "publish",
|
|
88
|
+
onDone: [
|
|
89
|
+
{ guard: ({ event }) => event.output.outcome === "pushed", target: "done" },
|
|
90
|
+
{ target: "failed" },
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
done: { type: "final" },
|
|
95
|
+
// Not a final state: the run ends `failed`, and the Workspace deletes the Sandbox.
|
|
96
|
+
failed: { invoke: { src: "fail", input: { reason: "the fix was not pushed" } } },
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
export const machine = workspace(body, {
|
|
101
|
+
repos: { app: { url: "https://github.com/you/app.git" } },
|
|
102
|
+
spec: () => ({ branch: "fix-test" }),
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**See also**
|
|
107
|
+
|
|
108
|
+
- [Push and sign a branch](../../guides/push-and-sign-a-branch.md)
|
|
109
|
+
- [Effects](../../concepts/effects.md)
|
|
110
|
+
- [Give the cluster git credentials](../../guides/give-the-cluster-git-credentials.md)
|
|
111
|
+
- [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)
|
|
112
|
+
- [ADR-0051: A Repo is a slot on the `workspace()` and a cache on the node](../decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md)
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: secret
|
|
3
|
+
description: "Name an Effect secret: `secret(\"jira\")`."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `secret`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/http-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
|
|
9
|
+
|
|
10
|
+
## Overload 1
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
function secret(name: string): Secret
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Name an Effect secret: `secret("jira")`. The name is the `name` of an entry in the `secrets`
|
|
17
|
+
list of `jr2.config.ts`. The Effector reads the value and puts it into the call, or into the env
|
|
18
|
+
of a `command`. The Agent never reads it, and the Orchestrator never holds it.
|
|
19
|
+
|
|
20
|
+
Use it in `bearer`, `basic` or `text`, or in the `env` of a `command`. In an `env`,
|
|
21
|
+
`secret("x")` gives the value, and `secret("x").path` gives the path of a file that holds the
|
|
22
|
+
value.
|
|
23
|
+
|
|
24
|
+
`secret(open)` leaves the name to the composer of a packaged Machine, who binds it one time:
|
|
25
|
+
`customize(machine, { effects: { <slot>: { secret: "<name>" } } })`. An Effect can have one Open
|
|
26
|
+
secret, in its `auth`, a header or its `env`. A url cannot have one: leave the whole url Open
|
|
27
|
+
(`url: open`) instead.
|
|
28
|
+
|
|
29
|
+
It refuses, when you call it:
|
|
30
|
+
- a name that is not letters, digits, `.`, `_` and `-`, that starts with `.`, or that is longer
|
|
31
|
+
than 253 characters: `secret("<name>"): a secret's name is letters, digits, ".", "_" and "-",
|
|
32
|
+
and does not start with "." — it is the file the Effector reads it from (ADR-0068)`
|
|
33
|
+
- an Effect that names `secret(open)` in two places that are two secrets: `an Effect takes one
|
|
34
|
+
Open secret — it names secret(open) in two places that are two secrets; name one secret(open)
|
|
35
|
+
and use it in each place, or name the others with secret("<name>") (ADR-0054)`
|
|
36
|
+
- `secret(open)` in a url: ``secret(open) in a url: a url's secret is not an Open part — leave
|
|
37
|
+
the whole url Open (`url: open`) and let the composer bind it with its secret in its path
|
|
38
|
+
(ADR-0054)``
|
|
39
|
+
|
|
40
|
+
And at `jr2 up`:
|
|
41
|
+
- a name that the `secrets` list does not have: ``workflow "<workflow>": the <kind> Effect
|
|
42
|
+
"<slot>" names secret("<name>"), which the `secrets` list does not hold — add it: secrets: [{
|
|
43
|
+
name: "<name>", value: process.env.<NAME> }] (ADR-0068)``
|
|
44
|
+
- a value of fewer than 8 characters: `secrets[<i>] (<name>) is an Effect secret shorter than 8
|
|
45
|
+
characters — the Effector replaces every match of a secret in what it returns, and a value
|
|
46
|
+
this short would match ordinary text. Use the whole credential; the value itself is not shown
|
|
47
|
+
(ADR-0068)`
|
|
48
|
+
|
|
49
|
+
**Parameters**
|
|
50
|
+
|
|
51
|
+
- `name`: The name of an entry in the `secrets` list.
|
|
52
|
+
|
|
53
|
+
**Returns**: The Effect secret, for an Effect. Its `.path` names the file of the secret, for the
|
|
54
|
+
`env` of a `command`.
|
|
55
|
+
|
|
56
|
+
**Example**
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import { command, fail, jr2Setup, secret, workspace, type Workspaced } from "@jr2/orchestrator";
|
|
60
|
+
|
|
61
|
+
type Input = Workspaced<{}, "app">;
|
|
62
|
+
|
|
63
|
+
const body = jr2Setup({
|
|
64
|
+
types: {} as { context: Input; input: Input },
|
|
65
|
+
actors: {
|
|
66
|
+
// The command reads the file at $KUBECONFIG. The Agent never reads the secret.
|
|
67
|
+
deploy: command(["kubectl", "apply", "-f", "k8s/"], {
|
|
68
|
+
env: { KUBECONFIG: secret("kube").path },
|
|
69
|
+
}),
|
|
70
|
+
fail: fail(),
|
|
71
|
+
},
|
|
72
|
+
}).createMachine({
|
|
73
|
+
id: "deploy",
|
|
74
|
+
context: ({ input }) => input,
|
|
75
|
+
on: { "workspace.lost": ".lost" },
|
|
76
|
+
initial: "deploying",
|
|
77
|
+
states: {
|
|
78
|
+
deploying: { invoke: { src: "deploy", onDone: "done" } },
|
|
79
|
+
done: { type: "final" },
|
|
80
|
+
lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
export const machine = workspace(body, {
|
|
85
|
+
repos: { app: { url: "https://github.com/you/app.git" } },
|
|
86
|
+
spec: () => ({ branch: "deploy" }),
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**See also**
|
|
91
|
+
|
|
92
|
+
- [Secrets and trust](../../concepts/secrets-and-trust.md)
|
|
93
|
+
- [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
|
|
94
|
+
- [ADR-0068: An Effector holds an Effect's secrets and signs its wire](../decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md)
|
|
95
|
+
- [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)
|
|
96
|
+
|
|
97
|
+
## Overload 2
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
function secret(name: typeof open): OpenSecret
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Leave an Effect secret Open: `secret(open)`, in a Machine that you publish as a package. The
|
|
104
|
+
composer binds its name one time: `customize(machine, { effects: { <slot>: { secret: "<name>"
|
|
105
|
+
} } })`. `secret` tells the rest, and what it refuses.
|
|
106
|
+
|
|
107
|
+
**Parameters**
|
|
108
|
+
|
|
109
|
+
- `name`: `open`.
|
|
110
|
+
|
|
111
|
+
**Returns**: The Open secret, for an Effect. Its `.path` names the file of the secret, for the `env`
|
|
112
|
+
of a `command`.
|
|
113
|
+
|
|
114
|
+
**See also**
|
|
115
|
+
|
|
116
|
+
- [Secrets and trust](../../concepts/secrets-and-trust.md)
|
|
117
|
+
- [Bind a shipped Machine's Open parts](../../guides/bind-open-parts.md)
|
|
118
|
+
- [ADR-0054: The kit ships Machines, and a shipped Machine leaves its parts Open](../decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: sentBy
|
|
3
|
+
description: "A guard that is true for an event that one party sent, and false for an event that another party sent: `guard: sentBy(\"coder\")`."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `sentBy`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/party.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Machine and events.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
function sentBy<const Id extends string>(id: Id): { type: typeof SENT_BY; params: { id: Id } }
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
A guard that is true for an event that one party sent, and false for an event that another party
|
|
15
|
+
sent: `guard: sentBy("coder")`. Use it where two parties may send the same event to one state,
|
|
16
|
+
and the transition must run for one of them only. It is also true for an event that the Machine
|
|
17
|
+
sends itself, which has no sender.
|
|
18
|
+
|
|
19
|
+
It can only make a transition decline the events of other parties. It never lets a party send
|
|
20
|
+
an event that the party may not send at that state: the position of the `on` key decides that.
|
|
21
|
+
When the guard is false, xstate tries the next transition for the event, as for any guard. Use
|
|
22
|
+
it alone, or inside `and([…])`.
|
|
23
|
+
|
|
24
|
+
`createMachine` refuses an id that is not a party of the Machine: ``machine "<id>":
|
|
25
|
+
sentBy("<party>") on "<event>" at "<state>" names no party of this Machine (Agent slots:
|
|
26
|
+
<slots>; Gate invoke ids: <ids>)``
|
|
27
|
+
|
|
28
|
+
**Parameters**
|
|
29
|
+
|
|
30
|
+
- `id`: The party: the slot key of an Agent of this Machine, or the invoke `id` of one of its
|
|
31
|
+
Gates.
|
|
32
|
+
|
|
33
|
+
**Returns**: A named guard object, for a transition's `guard`.
|
|
34
|
+
|
|
35
|
+
**Example**
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import { z } from "zod";
|
|
39
|
+
import { agent, defineEvent, fail, jr2Setup, sentBy } from "@jr2/orchestrator";
|
|
40
|
+
|
|
41
|
+
const done = defineEvent({
|
|
42
|
+
name: "done",
|
|
43
|
+
description: "Call this when the draft is ready for review.",
|
|
44
|
+
input: z.object({}),
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
export const machine = jr2Setup({
|
|
48
|
+
events: [done],
|
|
49
|
+
actors: {
|
|
50
|
+
writer: agent({
|
|
51
|
+
model: "anthropic/claude-haiku-5-5",
|
|
52
|
+
instructions: "You write release notes.",
|
|
53
|
+
workspace: "none",
|
|
54
|
+
}),
|
|
55
|
+
fail: fail(),
|
|
56
|
+
},
|
|
57
|
+
}).createMachine({
|
|
58
|
+
id: "notes",
|
|
59
|
+
on: { "agent.fault": ".failed" },
|
|
60
|
+
initial: "drafting",
|
|
61
|
+
states: {
|
|
62
|
+
drafting: {
|
|
63
|
+
invoke: [
|
|
64
|
+
{ src: "writer", input: { prompt: "Draft the release notes." } },
|
|
65
|
+
{ src: "gate", id: "editor" },
|
|
66
|
+
],
|
|
67
|
+
on: {
|
|
68
|
+
// The writer's `done` goes to review; the editor's `done` skips it.
|
|
69
|
+
done: [{ guard: sentBy("writer"), target: "review" }, { target: "published" }],
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
review: { invoke: { src: "gate" }, on: { done: "published" } },
|
|
73
|
+
published: { type: "final" },
|
|
74
|
+
failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**See also**
|
|
80
|
+
|
|
81
|
+
- [The Menu](../../concepts/the-menu.md)
|
|
82
|
+
- [Gates](../../concepts/gates.md)
|
|
83
|
+
- [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,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: source
|
|
3
|
+
description: "Declare a Source: where a `pool()` gets its work items, one at a time."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `source`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/pool.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Composition.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
function source<T>(spec: SourceSpec<T>): SourceSpec<T>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Declare a Source: where a `pool()` gets its work items, one at a time. It gives back the spec
|
|
15
|
+
that you pass. The item type `T` types what `next` gives. `pool()` does not carry `T` to
|
|
16
|
+
`itemId` and `itemInput`, so write the item type on their parameter, as the `pool()` example does.
|
|
17
|
+
|
|
18
|
+
**Parameters**
|
|
19
|
+
|
|
20
|
+
- `spec`: How to claim the next item, and when to look again. See [`SourceSpec`](type-sourcespec.md).
|
|
21
|
+
|
|
22
|
+
**Returns**: The same spec.
|
|
23
|
+
|
|
24
|
+
**Example**
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { fromPromise } from "xstate";
|
|
28
|
+
import { source } from "@jr2/orchestrator";
|
|
29
|
+
|
|
30
|
+
type Issue = { id: string; title: string };
|
|
31
|
+
|
|
32
|
+
const backlog: Issue[] = [
|
|
33
|
+
{ id: "ISSUE-1", title: "Fix the greeting." },
|
|
34
|
+
{ id: "ISSUE-2", title: "Add a --name flag." },
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
export const issues = source<Issue>({
|
|
38
|
+
next: fromPromise(async ({ input }: { input: { active: string[] } }) => {
|
|
39
|
+
const issue = backlog.find((i) => !input.active.includes(i.id)) ?? null;
|
|
40
|
+
if (issue) backlog.splice(backlog.indexOf(issue), 1);
|
|
41
|
+
return issue;
|
|
42
|
+
}),
|
|
43
|
+
pollEvery: 60_000,
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**See also**
|
|
48
|
+
|
|
49
|
+
- [Run one worker per item](../../guides/run-one-worker-per-item.md)
|
|
50
|
+
- [Pools and Sources](../../concepts/pools-and-sources.md)
|
|
51
|
+
- [ADR-0017: The run loop is a jr2 `pool` over a generalized source port](../decisions/0017-pool-over-a-source-port.md)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: text
|
|
3
|
+
description: "Make a string from literal text and Effect secrets, as a tagged template: `` text`Token ${secret(\"x\")}` ``."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `text`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/http-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
function text<
|
|
12
|
+
const V extends Array<Secret | OpenSecret | string>,
|
|
13
|
+
>(
|
|
14
|
+
strings: TemplateStringsArray,
|
|
15
|
+
...values: V,
|
|
16
|
+
): MarkedIf<V[number], Text>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Make a string from literal text and Effect secrets, as a tagged template:
|
|
20
|
+
`` text`Token ${secret("x")}` ``. The Effector puts in the value of each secret when it makes
|
|
21
|
+
the call. Use it for a url with a secret in its path, or for a header value. Use it also for
|
|
22
|
+
`auth`, where it is the whole `Authorization` header, or for a part of `basic`.
|
|
23
|
+
|
|
24
|
+
It refuses a `${…}` that is not a `secret(...)` or a string: `` text`…`: a value is a
|
|
25
|
+
secret("name") or a string, got <value> ``.
|
|
26
|
+
|
|
27
|
+
**Parameters**
|
|
28
|
+
|
|
29
|
+
- `strings`: The literal text of the template.
|
|
30
|
+
- `values`: The `${…}` values, each a `secret(...)` or a string.
|
|
31
|
+
|
|
32
|
+
**Returns**: The string, which the Effector makes.
|
|
33
|
+
|
|
34
|
+
**Example**
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
import { http, jr2Setup, secret, text } from "@jr2/orchestrator";
|
|
38
|
+
|
|
39
|
+
export const machine = jr2Setup({
|
|
40
|
+
actors: {
|
|
41
|
+
notify: http({
|
|
42
|
+
method: "POST",
|
|
43
|
+
url: text`https://api.telegram.org/bot${secret("telegram")}/sendMessage`,
|
|
44
|
+
headers: { "x-run-source": text`jr2` },
|
|
45
|
+
request: () => ({ json: { chat_id: "12345", text: "The run is done." } }),
|
|
46
|
+
}),
|
|
47
|
+
},
|
|
48
|
+
}).createMachine({
|
|
49
|
+
id: "notify",
|
|
50
|
+
initial: "notifying",
|
|
51
|
+
states: {
|
|
52
|
+
notifying: { invoke: { src: "notify", onDone: "done" } },
|
|
53
|
+
done: { type: "final" },
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**See also**
|
|
59
|
+
|
|
60
|
+
- [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
|
|
61
|
+
- [Secrets and trust](../../concepts/secrets-and-trust.md)
|
|
62
|
+
- [ADR-0068: An Effector holds an Effect's secrets and signs its wire](../decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: AgentDeclaration
|
|
3
|
+
description: "What `agent()` takes: an `AgentDefinition`, except that `model` can also be `open`."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `AgentDeclaration`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/agent.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 AgentDeclaration = Omit<AgentDefinition, "model"> & {
|
|
12
|
+
model: string | typeof open;
|
|
13
|
+
};
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
What `agent()` takes: an [`AgentDefinition`](type-agentdefinition.md), except that `model` can also be `open`.
|
|
17
|
+
|
|
18
|
+
**Fields**: each field of [`AgentDefinition`](type-agentdefinition.md), except `model`, and these:
|
|
19
|
+
|
|
20
|
+
- `model`: `string | typeof open`
|
|
21
|
+
|
|
22
|
+
The model, as `<provider>/<modelId>`: for example `anthropic/claude-haiku-5-5`. Required:
|
|
23
|
+
there is no default model. The provider must be one that `jr2.config.ts` can reach.
|
|
24
|
+
|
|
25
|
+
Or `open`, in a Machine that you publish as a package. Then the Instance that registers the
|
|
26
|
+
Machine binds the model with `customize()`. One Turn may set another model in the invoke's
|
|
27
|
+
`input`.
|