@jr2/orchestrator 0.3.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -2
- package/bin/server.ts +7 -4
- package/console/canvas.ts +27 -14
- package/console/components/app.ts +12 -1
- package/console/components/fleet.ts +52 -6
- package/console/components/machine-pane.ts +128 -2
- package/console/components/nav.ts +1 -1
- package/console/components/schema-form.ts +12 -4
- package/console/json-field.ts +23 -0
- package/console/main.ts +122 -39
- package/console/store.ts +321 -21
- package/console/style.css +111 -0
- package/docs/agents-block.md +5 -0
- package/docs/concepts/agents-and-turns.md +442 -0
- package/docs/concepts/architecture.md +230 -0
- package/docs/concepts/charts.md +143 -0
- package/docs/concepts/composition.md +357 -0
- package/docs/concepts/converge.md +254 -0
- package/docs/concepts/durable-runs.md +189 -0
- package/docs/concepts/effects.md +603 -0
- package/docs/concepts/gates.md +208 -0
- package/docs/concepts/machines-and-workflows.md +289 -0
- package/docs/concepts/pools-and-sources.md +230 -0
- package/docs/concepts/secrets-and-trust.md +222 -0
- package/docs/concepts/the-menu.md +378 -0
- package/docs/concepts/workspaces.md +678 -0
- package/docs/get-started/a-model-decides.md +563 -0
- package/docs/get-started/an-agent-in-a-sandbox.md +381 -0
- package/docs/get-started/connect-a-model.md +248 -0
- package/docs/get-started/create-an-instance.md +194 -0
- package/docs/get-started/have-your-assistant-write-a-machine.md +922 -0
- package/docs/get-started/install.md +126 -0
- package/docs/guides/add-tools-to-the-sandbox.md +295 -0
- package/docs/guides/answer-a-gate.md +304 -0
- package/docs/guides/bind-open-parts.md +223 -0
- package/docs/guides/cancel-a-run.md +146 -0
- package/docs/guides/clean-up.md +206 -0
- package/docs/guides/fix-a-failed-converge.md +361 -0
- package/docs/guides/give-the-cluster-git-credentials.md +222 -0
- package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
- package/docs/guides/let-an-agent-write-a-chart.md +226 -0
- package/docs/guides/look-inside-a-sandbox.md +174 -0
- package/docs/guides/mirror-the-kit-images.md +176 -0
- package/docs/guides/move-from-kind-to-a-shared-cluster.md +302 -0
- package/docs/guides/open-the-console.md +91 -0
- package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
- package/docs/guides/push-and-sign-a-branch.md +486 -0
- package/docs/guides/run-a-chart-by-name.md +270 -0
- package/docs/guides/run-a-command-or-call-a-url.md +544 -0
- package/docs/guides/run-one-worker-per-item.md +321 -0
- package/docs/guides/set-an-agents-access-and-dials.md +375 -0
- package/docs/guides/size-a-workspace.md +204 -0
- package/docs/guides/start-a-run-from-a-run.md +237 -0
- package/docs/guides/start-a-run.md +207 -0
- package/docs/guides/upgrade-the-kit-version.md +240 -0
- package/docs/guides/use-a-hosted-provider.md +208 -0
- package/docs/guides/use-a-local-model.md +313 -0
- package/docs/guides/watch-a-run.md +326 -0
- package/docs/guides/write-a-workflow.md +318 -0
- package/docs/index.md +44 -0
- package/docs/llms.txt +216 -0
- package/docs/reference/authoring-surface/agent.md +128 -0
- package/docs/reference/authoring-surface/answer.md +140 -0
- package/docs/reference/authoring-surface/arg.md +60 -0
- package/docs/reference/authoring-surface/basic.md +62 -0
- package/docs/reference/authoring-surface/bearer.md +53 -0
- package/docs/reference/authoring-surface/chartschema.md +23 -0
- package/docs/reference/authoring-surface/chartschemafor.md +48 -0
- package/docs/reference/authoring-surface/command.md +191 -0
- package/docs/reference/authoring-surface/customize.md +64 -0
- package/docs/reference/authoring-surface/defineconfig.md +41 -0
- package/docs/reference/authoring-surface/defineevent.md +114 -0
- package/docs/reference/authoring-surface/dispatch.md +126 -0
- package/docs/reference/authoring-surface/fail.md +83 -0
- package/docs/reference/authoring-surface/file.md +122 -0
- package/docs/reference/authoring-surface/frompick.md +277 -0
- package/docs/reference/authoring-surface/http.md +159 -0
- package/docs/reference/authoring-surface/isfailure.md +58 -0
- package/docs/reference/authoring-surface/jr2setup.md +237 -0
- package/docs/reference/authoring-surface/open.md +74 -0
- package/docs/reference/authoring-surface/openbody.md +86 -0
- package/docs/reference/authoring-surface/paramsof.md +125 -0
- package/docs/reference/authoring-surface/pool.md +186 -0
- package/docs/reference/authoring-surface/push.md +112 -0
- package/docs/reference/authoring-surface/secret.md +118 -0
- package/docs/reference/authoring-surface/sentby.md +83 -0
- package/docs/reference/authoring-surface/source.md +51 -0
- package/docs/reference/authoring-surface/text.md +62 -0
- package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
- package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
- package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
- package/docs/reference/authoring-surface/type-agentslots.md +12 -0
- package/docs/reference/authoring-surface/type-answeraction.md +12 -0
- package/docs/reference/authoring-surface/type-arg.md +19 -0
- package/docs/reference/authoring-surface/type-argnames.md +12 -0
- package/docs/reference/authoring-surface/type-binding.md +62 -0
- package/docs/reference/authoring-surface/type-bindingof.md +12 -0
- package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
- package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
- package/docs/reference/authoring-surface/type-ceilings.md +41 -0
- package/docs/reference/authoring-surface/type-chainlink.md +19 -0
- package/docs/reference/authoring-surface/type-chartaction.md +46 -0
- package/docs/reference/authoring-surface/type-chartagent.md +28 -0
- package/docs/reference/authoring-surface/type-chartevent.md +20 -0
- package/docs/reference/authoring-surface/type-chartguard.md +20 -0
- package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
- package/docs/reference/authoring-surface/type-chartjson.md +14 -0
- package/docs/reference/authoring-surface/type-chartstate.md +46 -0
- package/docs/reference/authoring-surface/type-charttext.md +40 -0
- package/docs/reference/authoring-surface/type-charttransition.md +22 -0
- package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
- package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
- package/docs/reference/authoring-surface/type-childat.md +12 -0
- package/docs/reference/authoring-surface/type-childslots.md +12 -0
- package/docs/reference/authoring-surface/type-commandenv.md +15 -0
- package/docs/reference/authoring-surface/type-commandinput.md +19 -0
- package/docs/reference/authoring-surface/type-commandoptions.md +78 -0
- package/docs/reference/authoring-surface/type-commandoutput.md +104 -0
- package/docs/reference/authoring-surface/type-customize.md +109 -0
- package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
- package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
- package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
- package/docs/reference/authoring-surface/type-dispatchoutput.md +65 -0
- package/docs/reference/authoring-surface/type-duration.md +15 -0
- package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
- package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
- package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
- package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
- package/docs/reference/authoring-surface/type-eventdef.md +45 -0
- package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
- package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
- package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
- package/docs/reference/authoring-surface/type-failslot.md +14 -0
- package/docs/reference/authoring-surface/type-failure.md +19 -0
- package/docs/reference/authoring-surface/type-failureinput.md +20 -0
- package/docs/reference/authoring-surface/type-filebody.md +41 -0
- package/docs/reference/authoring-surface/type-frominput.md +14 -0
- package/docs/reference/authoring-surface/type-hostinjectedinput.md +58 -0
- package/docs/reference/authoring-surface/type-httpdefinition.md +101 -0
- package/docs/reference/authoring-surface/type-httpinput.md +12 -0
- package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
- package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
- package/docs/reference/authoring-surface/type-httpoutput.md +89 -0
- package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
- package/docs/reference/authoring-surface/type-jr2config.md +126 -0
- package/docs/reference/authoring-surface/type-lends.md +38 -0
- package/docs/reference/authoring-surface/type-logicat.md +12 -0
- package/docs/reference/authoring-surface/type-markedif.md +12 -0
- package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
- package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
- package/docs/reference/authoring-surface/type-noslotspec.md +26 -0
- package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +32 -0
- package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
- package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
- package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
- package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
- package/docs/reference/authoring-surface/type-opencommandinput.md +17 -0
- package/docs/reference/authoring-surface/type-openeffect.md +12 -0
- package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
- package/docs/reference/authoring-surface/type-openof.md +12 -0
- package/docs/reference/authoring-surface/type-opensecret.md +23 -0
- package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
- package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +31 -0
- package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +32 -0
- package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
- package/docs/reference/authoring-surface/type-poolspec.md +60 -0
- package/docs/reference/authoring-surface/type-pushinput.md +15 -0
- package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
- package/docs/reference/authoring-surface/type-pushoutput.md +124 -0
- package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
- package/docs/reference/authoring-surface/type-quantity.md +14 -0
- package/docs/reference/authoring-surface/type-reached.md +12 -0
- package/docs/reference/authoring-surface/type-reposlot.md +70 -0
- package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
- package/docs/reference/authoring-surface/type-sandboxoptions.md +77 -0
- package/docs/reference/authoring-surface/type-secret.md +25 -0
- package/docs/reference/authoring-surface/type-sender.md +19 -0
- package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
- package/docs/reference/authoring-surface/type-size.md +85 -0
- package/docs/reference/authoring-surface/type-slothandles.md +32 -0
- package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
- package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
- package/docs/reference/authoring-surface/type-syncstate.md +12 -0
- package/docs/reference/authoring-surface/type-text.md +19 -0
- package/docs/reference/authoring-surface/type-textpart.md +24 -0
- package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
- package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
- package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
- package/docs/reference/authoring-surface/type-unknown.md +21 -0
- package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
- package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
- package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
- package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
- package/docs/reference/authoring-surface/type-workspaced.md +94 -0
- package/docs/reference/authoring-surface/type-workspacehandles.md +23 -0
- package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
- package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
- package/docs/reference/authoring-surface/type-workspaceoptions.md +39 -0
- package/docs/reference/authoring-surface/type-workspacespec.md +37 -0
- package/docs/reference/authoring-surface/workspace.md +259 -0
- package/docs/reference/authoring-surface.md +197 -0
- package/docs/reference/cli.md +433 -0
- package/docs/reference/config.md +756 -0
- package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +113 -0
- package/docs/reference/decisions/0002-duplex-streaming-actor.md +110 -0
- package/docs/reference/decisions/0004-worktree-provisioning-model.md +124 -0
- package/docs/reference/decisions/0005-sandbox-pod-composition.md +230 -0
- package/docs/reference/decisions/0006-agent-control-surface.md +47 -0
- package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
- package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
- package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
- package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
- package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
- package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
- package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +157 -0
- package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
- package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +265 -0
- package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +124 -0
- package/docs/reference/decisions/0017-pool-over-a-source-port.md +69 -0
- package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
- package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +275 -0
- package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
- package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +100 -0
- package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
- package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +176 -0
- package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +439 -0
- package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
- package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
- package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +237 -0
- package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +89 -0
- package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
- package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
- package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +190 -0
- package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
- package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +127 -0
- package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
- package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
- package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
- package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
- package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
- package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
- package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
- package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
- package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
- package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
- package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
- package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
- package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
- package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
- package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
- package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
- package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +227 -0
- package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +81 -0
- package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +111 -0
- package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
- package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
- package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
- package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
- package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +106 -0
- package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +384 -0
- package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
- package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
- package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +212 -0
- package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +83 -0
- package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
- package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
- package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +550 -0
- package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +430 -0
- package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +464 -0
- package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
- package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +323 -0
- package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
- package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
- package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
- package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
- package/docs/reference/decisions.md +83 -0
- package/docs/reference/glossary.md +648 -0
- package/docs/reference/http-api.md +1348 -0
- package/docs/reference/machines.md +190 -0
- package/docs/reference/mechanism-events.md +72 -0
- package/docs/why.md +206 -0
- package/package.json +6 -4
- package/src/actor.ts +976 -61
- package/src/agent.ts +114 -38
- package/src/ambient.ts +4 -1
- package/src/assembly-checks.ts +347 -0
- package/src/assembly-tar.ts +494 -0
- package/src/assembly.ts +721 -0
- package/src/cause.ts +234 -0
- package/src/chart.ts +2182 -0
- package/src/charts.ts +748 -0
- package/src/config.ts +520 -162
- package/src/content-hash.ts +105 -0
- package/src/custodian.lua +6 -5
- package/src/custodian.ts +143 -39
- package/src/customize.ts +388 -55
- package/src/dispatch-effect.ts +945 -0
- package/src/door-compat.ts +217 -0
- package/src/durability.ts +11 -4
- package/src/effect-checks.ts +557 -0
- package/src/effect.ts +1202 -0
- package/src/effector-wire.ts +674 -0
- package/src/fail.ts +209 -0
- package/src/fingerprint.ts +4 -3
- package/src/gate.ts +8 -0
- package/src/git-clone.ts +65 -0
- package/src/git-push.ts +336 -0
- package/src/harness-client.ts +764 -48
- package/src/held-secrets.ts +82 -26
- package/src/holds.ts +156 -0
- package/src/http-effect.ts +1423 -0
- package/src/http.ts +916 -113
- package/src/images.ts +47 -21
- package/src/index.ts +62 -43
- package/src/instance.ts +505 -59
- package/src/internal.ts +84 -0
- package/src/kube-client.ts +333 -0
- package/src/machine-doc.ts +106 -6
- package/src/mechanism-routes.ts +168 -0
- package/src/model-keys.generated.ts +53 -0
- package/src/model-keys.ts +18 -58
- package/src/mount-digest.ts +53 -0
- package/src/names.ts +66 -8
- package/src/notices.ts +141 -0
- package/src/open-body.ts +1580 -0
- package/src/open-effect.ts +217 -0
- package/src/open.ts +59 -6
- package/src/parts.ts +709 -41
- package/src/party.ts +534 -0
- package/src/pick.ts +761 -0
- package/src/pool.ts +248 -37
- package/src/registration.ts +382 -19
- package/src/repo-fetch.ts +60 -85
- package/src/repos.ts +65 -75
- package/src/rest.ts +133 -0
- package/src/run-host.ts +2383 -115
- package/src/run-output.ts +38 -0
- package/src/sandbox-effect.ts +1126 -0
- package/src/sandbox-effector.ts +111 -0
- package/src/sandbox-kube.ts +1721 -0
- package/src/sandbox-watch.ts +260 -0
- package/src/secret-placement.ts +529 -0
- package/src/server.ts +284 -84
- package/src/setup.ts +819 -117
- package/src/size.ts +454 -0
- package/src/snapshot-store.ts +115 -20
- package/src/stub-harness.ts +49 -16
- package/src/sync-client.ts +54 -0
- package/src/timers.ts +191 -0
- package/src/tokens.ts +35 -4
- package/src/vocabulary.ts +135 -15
- package/src/wire.ts +238 -10
- package/src/workspace.ts +1195 -338
- package/src/sandbox-kubectl.ts +0 -1108
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: agent
|
|
3
|
+
description: "Make an Agent: an actor slot that runs one Turn of a model each time a state invokes it."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `agent`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/harness-client.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Agents.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
function agent(declaration: AgentDeclaration): AgentLogic
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Make an Agent: an actor slot that runs one Turn of a model each time a state invokes it. Put it
|
|
15
|
+
under `actors` in `jr2Setup`, and invoke it by its key: `actors: { coder: agent(…) }`, then
|
|
16
|
+
`invoke: { src: "coder", input: { prompt } }`. The key is the Agent's name.
|
|
17
|
+
|
|
18
|
+
The invoke's `input` is the Turn: `prompt` (required), `cwd`, `model`, `thinkingLevel` and
|
|
19
|
+
`continue`. `cwd` is the absolute directory where the Working tools work. Absent, it is the
|
|
20
|
+
Worktree of the Workspace's one Repo Slot. `continue: true` continues the Agent's conversation
|
|
21
|
+
in this Machine. Absent, each Turn starts a new conversation. `continue` is the literal `true`,
|
|
22
|
+
not a `boolean`. A Turn can join only a conversation that an earlier Turn started with
|
|
23
|
+
`continue: true`. Thus in a retry loop, put `continue: true` on each Turn, also on the first, so
|
|
24
|
+
that attempt 2 sees attempt 1. Then a Runaway on the first Turn gets no second start, because a
|
|
25
|
+
continued Turn gets none ([ADR-0035](../decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md)). Spread it only when a state must start a clean conversation
|
|
26
|
+
on some Turns only: `...(context.clean ? {} : { continue: true as const })`. A clean Turn does not
|
|
27
|
+
start the continued conversation again: the next Turn with `continue: true` joins the earlier
|
|
28
|
+
one. The Turn ends when the state that invoked the Agent exits, usually on a pick from the
|
|
29
|
+
Agent's Menu.
|
|
30
|
+
|
|
31
|
+
The actor of an Agent never finishes, so an `onDone` on its invoke never runs. Give the Agent a
|
|
32
|
+
pick, such as `finish`, and route on it. When a Turn fails with no pick, jr2 sends the event
|
|
33
|
+
`agent.fault` to the Machine. It is an event, not an error of the invoke, so an `onError` does
|
|
34
|
+
not get it. Route it on each state that invokes an Agent, or once on a state above them:
|
|
35
|
+
`on: { "agent.fault": "failed" }`. `jr2 check` and `jr2 up` refuse a state that invokes an
|
|
36
|
+
Agent with no route for it, and an `agent.fault` that no transition takes ends the run `error`.
|
|
37
|
+
|
|
38
|
+
An Agent with `workspace: "write"` or `"read"` works in a Sandbox, so invoke it inside a
|
|
39
|
+
`workspace()` body. An Agent with `workspace: "none"` can run anywhere. A model can lack the
|
|
40
|
+
definition's thinking level: see [`ThinkingLevel`](type-thinkinglevel.md).
|
|
41
|
+
|
|
42
|
+
When a Turn starts, it refuses:
|
|
43
|
+
- a key in `input` that a Turn does not have: ``agent "<slot>": the Turn's input carries
|
|
44
|
+
`<key>`, which a Turn has no use for — its input is its Frame (`prompt`, `cwd`), its Dials
|
|
45
|
+
(`model`, `thinkingLevel`), and `continue` (ADR-0057)``
|
|
46
|
+
- no `cwd` under a Workspace with more than one Repo Slot: ``turn <id>: agent "<slot>" works
|
|
47
|
+
under a Workspace carrying more than one Repo Slot (<slots>) and its Turn framed no `cwd` —
|
|
48
|
+
say which Worktree it works in (`cwd: context.workspace.repos.<slot>`, one of those), because
|
|
49
|
+
the kit gives no slot a meaning (ADR-0051) and a Turn's Frame is where it works (ADR-0057)``
|
|
50
|
+
- a `cwd` that is not an absolute path: ``agent "<slot>": the Turn's Frame carries a `cwd` that
|
|
51
|
+
is not an absolute path — the Frame says WHERE this Turn works (ADR-0057), and a Turn rooted
|
|
52
|
+
anywhere else would work in the wrong directory silently``. The Harness makes this refusal
|
|
53
|
+
when it admits the Turn, and the error starts with `harness admission failed (400): `.
|
|
54
|
+
- an Agent with Working tools outside a `workspace()`: ``turn <id>: agent "<slot>" has
|
|
55
|
+
workspace: "<access>" — invoke it inside a workspace() (ambient resolution), or pass an
|
|
56
|
+
explicit `endpoint` (workspace-less stub path)``
|
|
57
|
+
- a `model` that is still `open`: ``agent "<slot>" has an Open model — nobody bound it; bind it
|
|
58
|
+
where the Machine is registered (`customize(<machine>, { agents: { <slot>: { model:
|
|
59
|
+
"<provider>/<model>" } } })`), because a packaged Machine cannot pick a model on your behalf
|
|
60
|
+
(ADR-0054)``. `jr2 up` refuses this before it builds anything.
|
|
61
|
+
|
|
62
|
+
**Parameters**
|
|
63
|
+
|
|
64
|
+
- `declaration` ([`AgentDeclaration`](type-agentdeclaration.md)): The Agent's definition (see [`AgentDefinition`](type-agentdefinition.md)). `model` may be `open`
|
|
65
|
+
in a Machine that you publish as a package.
|
|
66
|
+
|
|
67
|
+
**Returns**: The actor logic of the Agent's slot.
|
|
68
|
+
|
|
69
|
+
**Example**
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { z } from "zod";
|
|
73
|
+
import { agent, defineEvent, fail, jr2Setup, workspace, type Workspaced } from "@jr2/orchestrator";
|
|
74
|
+
|
|
75
|
+
const finish = defineEvent({
|
|
76
|
+
name: "finish",
|
|
77
|
+
description: "Call this when `node --test` passes.",
|
|
78
|
+
input: z.object({}),
|
|
79
|
+
});
|
|
80
|
+
const runInput = z.object({ branch: z.string() });
|
|
81
|
+
type BodyInput = Workspaced<z.infer<typeof runInput>, "app">;
|
|
82
|
+
|
|
83
|
+
const body = jr2Setup({
|
|
84
|
+
types: {} as { input: BodyInput; context: BodyInput },
|
|
85
|
+
events: [finish],
|
|
86
|
+
actors: {
|
|
87
|
+
coder: agent({
|
|
88
|
+
model: "anthropic/claude-haiku-5-5",
|
|
89
|
+
instructions: "You fix failing tests. You change no test.",
|
|
90
|
+
}),
|
|
91
|
+
fail: fail(),
|
|
92
|
+
},
|
|
93
|
+
}).createMachine({
|
|
94
|
+
id: "fix",
|
|
95
|
+
context: ({ input }) => input,
|
|
96
|
+
on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
|
|
97
|
+
initial: "coding",
|
|
98
|
+
states: {
|
|
99
|
+
coding: {
|
|
100
|
+
invoke: {
|
|
101
|
+
src: "coder",
|
|
102
|
+
input: ({ context }) => ({
|
|
103
|
+
prompt: "Make `node --test` pass, then commit.",
|
|
104
|
+
cwd: context.workspace.repos.app,
|
|
105
|
+
thinkingLevel: "high",
|
|
106
|
+
}),
|
|
107
|
+
},
|
|
108
|
+
on: { finish: "done" },
|
|
109
|
+
},
|
|
110
|
+
done: { type: "final" },
|
|
111
|
+
failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
|
|
112
|
+
lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
export const machine = workspace(body, {
|
|
117
|
+
input: runInput,
|
|
118
|
+
repos: { app: "https://github.com/you/app.git" },
|
|
119
|
+
spec: ({ input }) => ({ branch: input.branch }),
|
|
120
|
+
});
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**See also**
|
|
124
|
+
|
|
125
|
+
- [Agents and Turns](../../concepts/agents-and-turns.md)
|
|
126
|
+
- [Write a Workflow](../../guides/write-a-workflow.md)
|
|
127
|
+
- [ADR-0049: A Machine carries its parts and composes by invoke](../decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md)
|
|
128
|
+
- [ADR-0057: A Turn is its Frame, its Dials, and whether it continues](../decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md)
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: answer
|
|
3
|
+
description: Set what the Agent reads when jr2 answers its pick.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `answer`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/pick.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
function answer<
|
|
12
|
+
TContext extends MachineContext,
|
|
13
|
+
TExpressionEvent extends EventObject,
|
|
14
|
+
TParams extends ParameterizedObject["params"] | undefined,
|
|
15
|
+
TEvent extends EventObject,
|
|
16
|
+
TActor extends ProvidedActor,
|
|
17
|
+
>(
|
|
18
|
+
fn: (args: { context: TContext; event: TExpressionEvent; chain: readonly ChainLink<TActor, TEvent>[] }) => unknown,
|
|
19
|
+
): ActionFunction<TContext, TExpressionEvent, TEvent, TParams, TActor, never, never, never, never> & AnswerAction
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Set what the Agent reads when jr2 answers its pick. It is an xstate action: write it in
|
|
23
|
+
`entry`, `exit` or the `actions` of a transition. Without it, the Agent reads the last reply
|
|
24
|
+
since the pick.
|
|
25
|
+
|
|
26
|
+
`fn` gets `{ context, event, chain }`. `chain` is every reply since the pick, oldest first. Each
|
|
27
|
+
link is `{ kind: "output", src, output }`, the output of an invoked actor, or `{ kind: "event",
|
|
28
|
+
event }`, an event that a Gate or a nested Agent sent. TypeScript types each link, but not the
|
|
29
|
+
order or the number of links. What `fn` gives back goes to the Agent as JSON. A value with no
|
|
30
|
+
JSON form clears the answer: the Agent then reads the last reply. When more than one `answer`
|
|
31
|
+
runs, the last one wins.
|
|
32
|
+
|
|
33
|
+
Where you write it decides which pick it answers:
|
|
34
|
+
|
|
35
|
+
- At or below the state of an Agent, it answers only a pick of that Agent.
|
|
36
|
+
- On a transition below no Agent's state, it answers a pick of the Agent whose event took the
|
|
37
|
+
transition.
|
|
38
|
+
- On an `entry` or an `exit` below no Agent's state, it sets nothing, and `jr2 up` prints a
|
|
39
|
+
warning: `an answer on the <entry|exit> of "<state>" is below no Agent's state, so it shapes
|
|
40
|
+
no pick — an <entry|exit> there is no transition an Agent's event takes; move it under
|
|
41
|
+
"<agent state>", or onto a transition (ADR-0067)`.
|
|
42
|
+
|
|
43
|
+
The error of an invoked actor is no link, and the Agent does not see it. To tell the Agent,
|
|
44
|
+
write `answer` on the `onError` route. An Effect never takes that route for an outcome: every
|
|
45
|
+
outcome is output.
|
|
46
|
+
|
|
47
|
+
**Parameters**
|
|
48
|
+
|
|
49
|
+
- `fn`: Gets `{ context, event, chain }` and gives back what the Agent reads, as a value
|
|
50
|
+
with a JSON form.
|
|
51
|
+
|
|
52
|
+
**Returns**: An xstate action.
|
|
53
|
+
|
|
54
|
+
**Example**
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import { z } from "zod";
|
|
58
|
+
import {
|
|
59
|
+
agent,
|
|
60
|
+
answer,
|
|
61
|
+
command,
|
|
62
|
+
defineEvent,
|
|
63
|
+
fail,
|
|
64
|
+
jr2Setup,
|
|
65
|
+
workspace,
|
|
66
|
+
type Workspaced,
|
|
67
|
+
} from "@jr2/orchestrator";
|
|
68
|
+
|
|
69
|
+
const runTests = defineEvent({
|
|
70
|
+
name: "run_tests",
|
|
71
|
+
description: "Run the test suite. Its result is this call's answer.",
|
|
72
|
+
input: z.object({}),
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const finished = defineEvent({
|
|
76
|
+
name: "finished",
|
|
77
|
+
description: "Say that the tests pass.",
|
|
78
|
+
input: z.object({}),
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
type Input = Workspaced<{}, "app">;
|
|
82
|
+
|
|
83
|
+
const body = jr2Setup({
|
|
84
|
+
types: {} as { context: Input; input: Input },
|
|
85
|
+
events: [runTests, finished],
|
|
86
|
+
actors: {
|
|
87
|
+
coder: agent({
|
|
88
|
+
model: "anthropic/claude-haiku-5-5",
|
|
89
|
+
instructions: "You are a careful engineer.",
|
|
90
|
+
}),
|
|
91
|
+
tests: command(["npm", "test"]),
|
|
92
|
+
fail: fail(),
|
|
93
|
+
},
|
|
94
|
+
}).createMachine({
|
|
95
|
+
id: "fix-tests",
|
|
96
|
+
context: ({ input }) => input,
|
|
97
|
+
on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
|
|
98
|
+
initial: "coding",
|
|
99
|
+
states: {
|
|
100
|
+
coding: {
|
|
101
|
+
invoke: { src: "coder", input: { prompt: "Make the tests pass." } },
|
|
102
|
+
on: { finished: "done" },
|
|
103
|
+
initial: "ready",
|
|
104
|
+
states: {
|
|
105
|
+
ready: { on: { run_tests: "testing" } },
|
|
106
|
+
testing: {
|
|
107
|
+
invoke: {
|
|
108
|
+
src: "tests",
|
|
109
|
+
onDone: {
|
|
110
|
+
target: "ready",
|
|
111
|
+
// The Agent reads this string, not the whole output of the command.
|
|
112
|
+
actions: answer(({ event }) =>
|
|
113
|
+
event.output.outcome === "exited" && event.output.code === 0
|
|
114
|
+
? "The tests pass."
|
|
115
|
+
: `The tests fail:\n${"tail" in event.output ? event.output.tail : event.output.reason}`,
|
|
116
|
+
),
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
done: { type: "final" },
|
|
123
|
+
failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
|
|
124
|
+
lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
export const machine = workspace(body, {
|
|
129
|
+
repos: { app: { url: "https://github.com/you/app.git" } },
|
|
130
|
+
spec: () => ({ branch: "fix-tests" }),
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**See also**
|
|
135
|
+
|
|
136
|
+
- [The Menu](../../concepts/the-menu.md)
|
|
137
|
+
- [Effects](../../concepts/effects.md)
|
|
138
|
+
- [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
|
|
139
|
+
- [ADR-0067: An Effect is an actor slot, and runs at most once unless marked idempotent](../decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md)
|
|
140
|
+
- [ADR-0024: An Agent's turn ends with the state that asked for it](../decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: arg
|
|
3
|
+
description: Mark one argv entry of a `command` that the input of the Effect fills.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `arg`
|
|
7
|
+
|
|
8
|
+
Constant, in `@jr2/orchestrator/src/effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
const arg: <const N extends string>(name: N) => Arg<N>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Mark one argv entry of a `command` that the input of the Effect fills. `arg("file")` is one
|
|
15
|
+
argument: the value of the `file` key of the input, whatever its characters. No shell reads it.
|
|
16
|
+
|
|
17
|
+
The input of the Effect then has a string key for each `arg`. Give it in the `input` of the
|
|
18
|
+
`invoke`, or use `fromPick` to give it from a pick.
|
|
19
|
+
|
|
20
|
+
When it starts, with no string in the input for an entry, the Effect fails (its `onError`
|
|
21
|
+
route): `command "<slot>": argv slot <<name>> has no string value in its input (got <type>) —
|
|
22
|
+
map it in the invoke's input`. The angle brackets around the name are in the text.
|
|
23
|
+
|
|
24
|
+
**Returns**: The argv entry, for the argv list of `command`.
|
|
25
|
+
|
|
26
|
+
**Example**
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import { arg, command, fail, jr2Setup, workspace, type Workspaced } from "@jr2/orchestrator";
|
|
30
|
+
|
|
31
|
+
type Input = Workspaced<{ file: string }, "app">;
|
|
32
|
+
|
|
33
|
+
const body = jr2Setup({
|
|
34
|
+
types: {} as { context: Input; input: Input },
|
|
35
|
+
actors: { lint: command(["npx", "eslint", arg("file")]), fail: fail() },
|
|
36
|
+
}).createMachine({
|
|
37
|
+
id: "lint",
|
|
38
|
+
context: ({ input }) => input,
|
|
39
|
+
on: { "workspace.lost": ".lost" },
|
|
40
|
+
initial: "lint",
|
|
41
|
+
states: {
|
|
42
|
+
lint: {
|
|
43
|
+
invoke: { src: "lint", input: ({ context }) => ({ file: context.file }), onDone: "done" },
|
|
44
|
+
},
|
|
45
|
+
done: { type: "final" },
|
|
46
|
+
lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
export const machine = workspace(body, {
|
|
51
|
+
repos: { app: { url: "https://github.com/you/app.git" } },
|
|
52
|
+
spec: () => ({ branch: "lint" }),
|
|
53
|
+
});
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**See also**
|
|
57
|
+
|
|
58
|
+
- [Effects](../../concepts/effects.md)
|
|
59
|
+
- [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
|
|
60
|
+
- [ADR-0067: An Effect is an actor slot, and runs at most once unless marked idempotent](../decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: basic
|
|
3
|
+
description: "Make the `auth` of an `http` Effect that sends `Authorization: Basic <value>`, where the value is the base64 of `user:password`."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `basic`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/http-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
function basic<
|
|
12
|
+
const U extends string | Secret | Text,
|
|
13
|
+
const P extends string | Secret | Text,
|
|
14
|
+
>(
|
|
15
|
+
user: U,
|
|
16
|
+
password: P,
|
|
17
|
+
): MarkedIf<U | P, { readonly basic: { user: Text; password: Text } }>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Make the `auth` of an `http` Effect that sends `Authorization: Basic <value>`, where the value
|
|
21
|
+
is the base64 of `user:password`. The Effector puts in the value of each secret.
|
|
22
|
+
|
|
23
|
+
Each of `user` and `password` is a string, a `secret(...)` or a `text`. In a packaged Machine,
|
|
24
|
+
one of them can hold `secret(open)`. It refuses another value: `` expected a string, a
|
|
25
|
+
secret("name") or a text`…`, got <value> ``.
|
|
26
|
+
|
|
27
|
+
**Parameters**
|
|
28
|
+
|
|
29
|
+
- `user`: The user name: a string, a `secret(...)` or a `text`.
|
|
30
|
+
- `password`: The password: a string, a `secret(...)` or a `text`.
|
|
31
|
+
|
|
32
|
+
**Returns**: The `auth` of an `http` Effect.
|
|
33
|
+
|
|
34
|
+
**Example**
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
import { basic, http, jr2Setup, secret } from "@jr2/orchestrator";
|
|
38
|
+
|
|
39
|
+
export const machine = jr2Setup({
|
|
40
|
+
actors: {
|
|
41
|
+
issue: http({
|
|
42
|
+
method: "GET",
|
|
43
|
+
url: "https://jira.example.com/rest/api/2/issue/APP-1",
|
|
44
|
+
auth: basic("jr2-bot@example.com", secret("jira-token")),
|
|
45
|
+
}),
|
|
46
|
+
},
|
|
47
|
+
}).createMachine({
|
|
48
|
+
id: "issue",
|
|
49
|
+
initial: "reading",
|
|
50
|
+
states: {
|
|
51
|
+
reading: { invoke: { src: "issue", onDone: "done" } },
|
|
52
|
+
done: { type: "final" },
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**See also**
|
|
58
|
+
|
|
59
|
+
- [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
|
|
60
|
+
- [Secrets and trust](../../concepts/secrets-and-trust.md)
|
|
61
|
+
- [ADR-0068: An Effector holds an Effect's secrets and signs its wire](../decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md)
|
|
62
|
+
- [ADR-0054: The kit ships Machines, and a shipped Machine leaves its parts Open](../decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: bearer
|
|
3
|
+
description: "Make the `auth` of an `http` Effect that sends `Authorization: Bearer <value>`, with the value of an Effect secret."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `bearer`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/http-effect.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Effects.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
function bearer<const S extends Secret>(s: S): MarkedIf<S, { readonly bearer: Secret }>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Make the `auth` of an `http` Effect that sends `Authorization: Bearer <value>`, with the value
|
|
15
|
+
of an Effect secret. In a packaged Machine, the secret can be `secret(open)`.
|
|
16
|
+
|
|
17
|
+
It refuses a value that is not a secret: `bearer(…) takes a secret("name")`.
|
|
18
|
+
|
|
19
|
+
**Parameters**
|
|
20
|
+
|
|
21
|
+
- `s` ([`Secret`](type-secret.md)): The secret: `secret("name")`, or `secret(open)`.
|
|
22
|
+
|
|
23
|
+
**Returns**: The `auth` of an `http` Effect.
|
|
24
|
+
|
|
25
|
+
**Example**
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import { bearer, http, jr2Setup, secret } from "@jr2/orchestrator";
|
|
29
|
+
|
|
30
|
+
export const machine = jr2Setup({
|
|
31
|
+
actors: {
|
|
32
|
+
status: http({
|
|
33
|
+
method: "GET",
|
|
34
|
+
url: "https://api.github.com/repos/you/app",
|
|
35
|
+
auth: bearer(secret("github")),
|
|
36
|
+
}),
|
|
37
|
+
},
|
|
38
|
+
}).createMachine({
|
|
39
|
+
id: "status",
|
|
40
|
+
initial: "reading",
|
|
41
|
+
states: {
|
|
42
|
+
reading: { invoke: { src: "status", onDone: "done" } },
|
|
43
|
+
done: { type: "final" },
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**See also**
|
|
49
|
+
|
|
50
|
+
- [Run a command or call a URL with an Effect](../../guides/run-a-command-or-call-a-url.md)
|
|
51
|
+
- [Secrets and trust](../../concepts/secrets-and-trust.md)
|
|
52
|
+
- [ADR-0068: An Effector holds an Effect's secrets and signs its wire](../decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md)
|
|
53
|
+
- [ADR-0054: The kit ships Machines, and a shipped Machine leaves its parts Open](../decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: chartSchema
|
|
3
|
+
description: The Chart grammar, as a zod schema.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `chartSchema`
|
|
7
|
+
|
|
8
|
+
Constant, in `@jr2/orchestrator/src/chart.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Charts.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
const chartSchema: z.ZodType<ChartText>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The Chart grammar, as a zod schema. Make a field of the run input of a Chart wrapper this schema,
|
|
15
|
+
as in `z.object({ topic: z.string(), chart: chartSchema })`. Then a run input can carry a Chart,
|
|
16
|
+
and the wrapper can keep Charts under names: Chart files in `workflows/<wrapper>/`, and runtime
|
|
17
|
+
Charts. For the pick of a planner, use `chartSchemaFor`, which knows the names that the Open body
|
|
18
|
+
lends.
|
|
19
|
+
|
|
20
|
+
**See also**
|
|
21
|
+
|
|
22
|
+
- [Run a Chart by name](../../guides/run-a-chart-by-name.md)
|
|
23
|
+
- [Charts](../../concepts/charts.md)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: chartSchemaFor
|
|
3
|
+
description: The Chart grammar for one Open body, as a zod schema.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `chartSchemaFor`
|
|
7
|
+
|
|
8
|
+
Function, in `@jr2/orchestrator/src/chart.ts`. It is an export of `@jr2/orchestrator`, on the [Authoring surface](../authoring-surface.md) page, in Charts.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
function chartSchemaFor(decl: OpenBodyDeclaration): z.ZodType<ChartText>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The Chart grammar for one Open body, as a zod schema. The names that the Open body lends, and the
|
|
15
|
+
models and the Workspace accesses that it allows, are the only values that the schema takes.
|
|
16
|
+
Make it the parameter of the pick of a planner. The model then gets the grammar as the
|
|
17
|
+
parameters of its tool, and the Briefing tells it how a Chart runs. The door still checks each
|
|
18
|
+
Chart before it runs.
|
|
19
|
+
|
|
20
|
+
**Parameters**
|
|
21
|
+
|
|
22
|
+
- `decl` ([`OpenBodyDeclaration`](type-openbodydeclaration.md)): The declaration of the Open body that the Chart binds.
|
|
23
|
+
|
|
24
|
+
**Returns**: The schema of a Chart for that Open body.
|
|
25
|
+
|
|
26
|
+
**Example**
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import { z } from "zod";
|
|
30
|
+
import { chartSchemaFor, defineEvent, type OpenBodyDeclaration } from "@jr2/orchestrator";
|
|
31
|
+
|
|
32
|
+
const declaration: OpenBodyDeclaration = {
|
|
33
|
+
lends: { agents: ["writer"], gate: true },
|
|
34
|
+
allows: { models: ["anthropic/claude-haiku-5-5"], workspace: ["none"] },
|
|
35
|
+
ceilings: { turns: 12, wallClock: "30m", transitions: 500, fanOut: 2, size: 65536 },
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export const runChart = defineEvent({
|
|
39
|
+
name: "run_chart",
|
|
40
|
+
description: "Run this Chart. Its outcome is the answer to this call.",
|
|
41
|
+
input: z.object({ chart: chartSchemaFor(declaration) }),
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**See also**
|
|
46
|
+
|
|
47
|
+
- [Let an Agent write a Chart](../../guides/let-an-agent-write-a-chart.md)
|
|
48
|
+
- [Charts](../../concepts/charts.md)
|