@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,240 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Upgrade the Kit version
|
|
3
|
+
description: Move an Instance to a new Kit version. jr2 up converges it and updates the jr2 block in AGENTS.md.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Upgrade the Kit version
|
|
7
|
+
|
|
8
|
+
Move your [Instance](../reference/glossary.md#instance) to a new [Kit version](../reference/glossary.md#kit-version),
|
|
9
|
+
and converge it.
|
|
10
|
+
|
|
11
|
+
An Instance has one Kit version: the version of `@jr2/orchestrator` that it installs. `package.json` pins
|
|
12
|
+
`@jr2/orchestrator` and `@jr2/cli` to that one exact version. To upgrade, you change the two pins to the new version,
|
|
13
|
+
install, and run [`jr2 up`](../reference/cli.md#up). Each upgrade ends in `jr2 up`. It converges the cluster to the new
|
|
14
|
+
version, and it updates the jr2 block in `AGENTS.md`, which your [Assistant](../reference/glossary.md#assistant) reads.
|
|
15
|
+
|
|
16
|
+
In the commands on this page, `<version>` is the new Kit version, such as `0.4.1`, and `<old version>` is the version
|
|
17
|
+
that the Instance has now.
|
|
18
|
+
|
|
19
|
+
## Before you start
|
|
20
|
+
|
|
21
|
+
- An Instance that you made with `jr2 init`, with its dependencies installed with npm.
|
|
22
|
+
- The new version. To see the latest release, run `npm view @jr2/cli version`.
|
|
23
|
+
- If the Instance sets [`kitRegistry`](../reference/config.md#kitregistry), write access to that registry. See
|
|
24
|
+
[Mirror the Kit images](mirror-the-kit-images.md).
|
|
25
|
+
|
|
26
|
+
## See the Kit version now
|
|
27
|
+
|
|
28
|
+
Run this command in the Instance folder:
|
|
29
|
+
|
|
30
|
+
```sh
|
|
31
|
+
jr2 version --local
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
```text
|
|
35
|
+
…
|
|
36
|
+
cli: <old version> <instance folder>/node_modules/@jr2/cli
|
|
37
|
+
global: <global version> <global folder>
|
|
38
|
+
kit: <old version> <instance folder>/node_modules/@jr2/orchestrator ok
|
|
39
|
+
instance: my-instance <instance folder> (installed kit → ghcr.io/snapwich)
|
|
40
|
+
node: v24.18.0
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- `cli` is the CLI that runs: the Instance's own `@jr2/cli`.
|
|
44
|
+
- `global` is your global `jr2`. In an Instance folder, it runs the Instance's own `@jr2/cli`. This is the
|
|
45
|
+
[Handoff](../reference/glossary.md#handoff). Thus the version of the global `jr2` does not change what the Instance
|
|
46
|
+
runs.
|
|
47
|
+
- `kit` is the Kit version. `ok` means that the CLI and the Instance use the same copy of `@jr2/orchestrator`, and that
|
|
48
|
+
this copy has the version of the CLI.
|
|
49
|
+
|
|
50
|
+
`<global version>` is the version of your global `jr2`. `<instance folder>` and `<global folder>` are paths on your
|
|
51
|
+
computer, and `node` gives your version of Node.js. The first line (`…`) is the `.env` line, when `.env` sets a variable
|
|
52
|
+
that your shell does not set.
|
|
53
|
+
|
|
54
|
+
## Install the new version
|
|
55
|
+
|
|
56
|
+
Change the two pins in one command:
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
npm install --save-exact @jr2/orchestrator@<version> @jr2/cli@<version>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
npm keeps `@jr2/orchestrator` in `dependencies` and `@jr2/cli` in `devDependencies`. `--save-exact` writes the version
|
|
63
|
+
with no range, as `jr2 init` does.
|
|
64
|
+
|
|
65
|
+
When the Instance also uses [`@jr2/machines`](../reference/machines.md), upgrade it in the same command. It must have
|
|
66
|
+
the same version:
|
|
67
|
+
|
|
68
|
+
```sh
|
|
69
|
+
npm install --save-exact @jr2/orchestrator@<version> @jr2/cli@<version> @jr2/machines@<version>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
> **Caution**
|
|
73
|
+
>
|
|
74
|
+
> Do not upgrade one of the packages alone. If you upgrade only `@jr2/orchestrator`, npm shows
|
|
75
|
+
> `npm warn ERESOLVE overriding peer dependency` and installs it. The CLI and the Kit then have different versions, and
|
|
76
|
+
> each command that reads the Instance, other than `jr2 version`, refuses. See the Rules.
|
|
77
|
+
|
|
78
|
+
Then check the result:
|
|
79
|
+
|
|
80
|
+
```sh
|
|
81
|
+
jr2 version --local
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
```text
|
|
85
|
+
…
|
|
86
|
+
cli: <version> <instance folder>/node_modules/@jr2/cli
|
|
87
|
+
global: <global version> <global folder>
|
|
88
|
+
kit: <version> <instance folder>/node_modules/@jr2/orchestrator ok
|
|
89
|
+
instance: my-instance <instance folder> (installed kit → ghcr.io/snapwich)
|
|
90
|
+
node: v24.18.0
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
The `cli` line and the `kit` line must show the same version, and the `kit` line must end in `ok`. When you upgraded
|
|
94
|
+
only `@jr2/orchestrator`, the `kit` line gives the version of the `jr2` that runs:
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
kit: <version> <instance folder>/node_modules/@jr2/orchestrator MISMATCH — this jr2 (<old version>) runs against <version> (<instance folder>/node_modules/@jr2/orchestrator)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Then install the two packages again, with one version.
|
|
101
|
+
|
|
102
|
+
Your global `jr2` can stay at its version. Its version matters only for `jr2 init` and for commands outside an Instance.
|
|
103
|
+
In an Instance, it runs the Instance's own `@jr2/cli`. To upgrade it too, run `npm i -g @jr2/cli@<version>`.
|
|
104
|
+
|
|
105
|
+
## Mirror the new images
|
|
106
|
+
|
|
107
|
+
Do this step only when the Instance sets `kitRegistry`. The mirror does not have the images of the new version yet, and
|
|
108
|
+
`jr2 up` never pushes them. In the Instance folder, run:
|
|
109
|
+
|
|
110
|
+
```sh
|
|
111
|
+
jr2 kit push <registry>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
`<registry>` is the value of `kitRegistry`. The Instance's own `@jr2/cli` runs, so the command copies the images of the
|
|
115
|
+
new version. [Mirror the Kit images](mirror-the-kit-images.md) shows its output.
|
|
116
|
+
|
|
117
|
+
## Compare with the cluster
|
|
118
|
+
|
|
119
|
+
`jr2 version`, with no `--local`, also reads what the cluster runs. Before the converge, it tells you that the cluster
|
|
120
|
+
is at the old version:
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
jr2 version
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
```text
|
|
127
|
+
…
|
|
128
|
+
orchestrator: <old version> assembly 87cddbde1271 ghcr.io/snapwich/jr2-orchestrator:<old version>
|
|
129
|
+
operator: <old version> ghcr.io/snapwich/jr2-operator:<old version>
|
|
130
|
+
…
|
|
131
|
+
skew: deployed <old version> predates this kit <version> — `jr2 up` converges it
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
`87cddbde1271` is the hash of the current [Assembly](../reference/glossary.md#assembly), and your hash is different. The
|
|
135
|
+
`orchestrator` line also gives the image of the [Orchestrator](../reference/glossary.md#orchestrator) that runs in the
|
|
136
|
+
cluster.
|
|
137
|
+
|
|
138
|
+
When the Orchestrator in the cluster is newer than the Kit version of the Instance, the `skew` line says
|
|
139
|
+
``deployed <deployed version> is newer than this kit <version> — `jr2 up` would roll the orchestrator back; the operator is never downgraded``.
|
|
140
|
+
`<deployed version>` is the version in the cluster.
|
|
141
|
+
|
|
142
|
+
`jr2 version` does not refuse a Kit version mismatch. It shows `MISMATCH` on the `kit` line. When `package.json` pins a
|
|
143
|
+
version that is not installed, the `kit` line ends in `; package.json pins <version> — reinstall`.
|
|
144
|
+
|
|
145
|
+
## Converge
|
|
146
|
+
|
|
147
|
+
```sh
|
|
148
|
+
jr2 up
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
```text
|
|
152
|
+
…
|
|
153
|
+
AGENTS.md: jr2 block updated for <version>
|
|
154
|
+
jr2 up — instance "my-instance" → context <context> / namespace my-instance
|
|
155
|
+
typecheck: tsc --noEmit (the instance's own compiler)
|
|
156
|
+
…
|
|
157
|
+
images: installed kit — the published v<version> Harness, operator and Orchestrator, pulled from ghcr.io/snapwich
|
|
158
|
+
…
|
|
159
|
+
operator: applying v<version> (ghcr.io/snapwich/jr2-operator:<version>) over v<old version>
|
|
160
|
+
…
|
|
161
|
+
orchestrator: applying (image ghcr.io/snapwich/jr2-orchestrator:<version>)
|
|
162
|
+
orchestrator: waiting for rollout
|
|
163
|
+
orchestrator: verified — 1 pod(s) running ghcr.io/snapwich/jr2-orchestrator:<version>
|
|
164
|
+
…
|
|
165
|
+
assembly: publishing 36b7afe19f88 (no current Assembly)
|
|
166
|
+
assembly: 36b7afe19f88 is current — workflows: <workflows>
|
|
167
|
+
converged — `jr2 run <workflow>` when ready
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
`<context>` is the kubectl context of the cluster. `36b7afe19f88` is the hash of the Assembly for the new version, and
|
|
171
|
+
your hash is different. The new Orchestrator does not load the Assembly of the old version, so the publish line says
|
|
172
|
+
`no current Assembly`.
|
|
173
|
+
|
|
174
|
+
`jr2 up` does these things for the upgrade:
|
|
175
|
+
|
|
176
|
+
- **`AGENTS.md`.** Before the cluster work, it writes the docs index of the new Kit version between the two `jr2-docs`
|
|
177
|
+
markers. It changes nothing outside the markers. A converge that fails still updates the block. `jr2 up` does not
|
|
178
|
+
change an `AGENTS.md` that has no markers. When the markers are not a correct pair, `jr2 up` does not change the file,
|
|
179
|
+
and the converge continues: `warning: AGENTS.md: <reason>, so the jr2 block was not updated`.
|
|
180
|
+
- **The typecheck.** It typechecks the Instance against the new Kit. A [Workflow](../reference/glossary.md#workflow)
|
|
181
|
+
that the new version does not accept stops the converge before the cluster changes. See the Rules.
|
|
182
|
+
- **The images.** The nodes pull the [Kit images](../reference/glossary.md#kit-image) at the tag of the new version, the
|
|
183
|
+
image of the Orchestrator too. The pod of the Orchestrator starts again on it. A
|
|
184
|
+
[Sandbox Image](../reference/glossary.md#sandbox-image) does not change, because the runtime of jr2 is not in it.
|
|
185
|
+
- **The Assembly.** The Assembly records its Kit version, so the hash changes. `jr2 up` publishes the Assembly after the
|
|
186
|
+
new Orchestrator runs. Until the publish, the new Orchestrator has no current Assembly, and it starts no run.
|
|
187
|
+
- **The operator.** All the Instances on the cluster share one operator. `jr2 up` upgrades an older operator, so the
|
|
188
|
+
upgrade of one Instance upgrades the operator for each Instance on the cluster. `jr2 up` never downgrades the
|
|
189
|
+
operator. When a different Instance upgraded the operator to a later version, `jr2 up` keeps it:
|
|
190
|
+
`operator: leaving v<deployed version> (newer than this kit's v<version> — never downgraded)`.
|
|
191
|
+
|
|
192
|
+
## What happens to the runs
|
|
193
|
+
|
|
194
|
+
A live run holds the Assembly that it started under, and that Assembly is for the old Kit version. The new Orchestrator
|
|
195
|
+
cannot load it. Thus the publish of the new Assembly marks each live run `drifted`, also a run that waits at a
|
|
196
|
+
[Gate](../reference/glossary.md#gate). `jr2 status <run id>` gives the reason, with the hash of the Assembly and the two
|
|
197
|
+
versions:
|
|
198
|
+
`workflow "<workflow>": Assembly <hash> was published for Kit version <old version>; this Orchestrator is <version>`. To
|
|
199
|
+
keep the result of a run, let it end before you converge, or cancel it. See
|
|
200
|
+
[Machine shape and drift](../concepts/durable-runs.md#machine-shape-and-drift).
|
|
201
|
+
|
|
202
|
+
A [Sandbox](../reference/glossary.md#sandbox) that runs keeps its pod, with the
|
|
203
|
+
[Harness](../reference/glossary.md#harness) of the old version. `jr2 up` does not replace the pod, because the new pod
|
|
204
|
+
would lose the commits that nobody pushed. A Sandbox that starts after the converge uses the new version.
|
|
205
|
+
|
|
206
|
+
## Rules
|
|
207
|
+
|
|
208
|
+
- `jr2 up` refuses an Instance that does not typecheck against the new Kit. It builds nothing and applies nothing. The
|
|
209
|
+
lines after the refusal are the errors of the compiler:
|
|
210
|
+
`refusing: this instance does not typecheck — nothing was built and nothing was applied`
|
|
211
|
+
- Each verb that reads the Instance, other than `jr2 version`, refuses when the Instance and the CLI do not use the same
|
|
212
|
+
copy of `@jr2/orchestrator`, or when that copy does not have the version of the CLI. The refusal gives the two copies,
|
|
213
|
+
and its last line gives the fix:
|
|
214
|
+
|
|
215
|
+
```text
|
|
216
|
+
error: Kit version mismatch — an Instance has one (ADR-0056):
|
|
217
|
+
@jr2/orchestrator resolves to <instance kit version> (<path>)
|
|
218
|
+
this jr2 (<cli version>) runs against <cli kit version> (<path>)
|
|
219
|
+
pin "@jr2/orchestrator" and "@jr2/cli" at ONE exact version in <instance folder>/package.json and reinstall
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
`<instance kit version>` is the version of `@jr2/orchestrator` that the Instance installs. `<cli version>` is the
|
|
223
|
+
version of the `jr2` that runs, and `<cli kit version>` is the version of the `@jr2/orchestrator` beside that `jr2`.
|
|
224
|
+
When the Instance has no `@jr2/cli` of its own, the last line is
|
|
225
|
+
`add "@jr2/cli": "<instance kit version>" to devDependencies in <instance folder>/package.json and reinstall — the Instance's own jr2 then runs`.
|
|
226
|
+
When nothing is installed, the refusal says `@jr2/orchestrator does not resolve from <instance folder>`.
|
|
227
|
+
|
|
228
|
+
## Read next
|
|
229
|
+
|
|
230
|
+
- [Converge](../concepts/converge.md)
|
|
231
|
+
- [Durable runs](../concepts/durable-runs.md)
|
|
232
|
+
- [ADR-0056](../reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md):
|
|
233
|
+
the Handoff, and one Kit version for each Instance.
|
|
234
|
+
- [ADR-0072](../reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md): the
|
|
235
|
+
docs in the Kit, and the block in `AGENTS.md`.
|
|
236
|
+
- [ADR-0069](../reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md): an
|
|
237
|
+
Assembly names its Kit version, and the Orchestrator refuses any other.
|
|
238
|
+
- [ADR-0030](../reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md): a run whose Machine has
|
|
239
|
+
a different shape.
|
|
240
|
+
- [Mirror the Kit images](mirror-the-kit-images.md)
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use a hosted provider or a gateway
|
|
3
|
+
description: Give your Agents a model from a hosted provider, directly or through a gateway.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Use a hosted provider or a gateway
|
|
7
|
+
|
|
8
|
+
Give the [Agents](../reference/glossary.md#agent) of your [Instance](../reference/glossary.md#instance) a model from a
|
|
9
|
+
hosted provider, such as Anthropic, directly or through a gateway.
|
|
10
|
+
|
|
11
|
+
The [Harness](../reference/glossary.md#harness) has a model catalog. The catalog knows the providers, their models, and
|
|
12
|
+
the limits of each model. An Agent names a catalog model as `<provider>/<modelId>`, such as `anthropic/<modelId>`. The
|
|
13
|
+
config needs no provider entry for it. It needs only the key.
|
|
14
|
+
|
|
15
|
+
## Hold the provider's key
|
|
16
|
+
|
|
17
|
+
Add the key to the `secrets` list of `jr2.config.ts`:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { defineConfig } from "@jr2/orchestrator";
|
|
21
|
+
|
|
22
|
+
export default defineConfig({
|
|
23
|
+
git: {
|
|
24
|
+
// The credentials that the cluster uses to clone and push. The token comes from JR2_GIT_TOKEN in .env.
|
|
25
|
+
credentials: [{ match: "*", token: "JR2_GIT_TOKEN", sshKey: "jr2-git-ssh" }],
|
|
26
|
+
},
|
|
27
|
+
// The model key. jr2 up gives it only to the Custodian of each pod whose Agents use Anthropic.
|
|
28
|
+
secrets: [{ name: "ANTHROPIC_API_KEY", value: process.env.ANTHROPIC_API_KEY }],
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Put the value in `.env`:
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
ANTHROPIC_API_KEY=<your key>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The `name` of the entry is the env var that the provider reads. When an Agent names a model of that provider, the key is
|
|
39
|
+
a [Held secret](../reference/glossary.md#held-secret) in the pod of the Agent. The Harness container holds only its
|
|
40
|
+
[Stand-in](../reference/glossary.md#stand-in). The [Custodian](../reference/glossary.md#custodian) of the pod puts the
|
|
41
|
+
key into the requests to the provider.
|
|
42
|
+
|
|
43
|
+
You do not say which pods get the key. jr2 finds them from the models that the Agents of each pod name.
|
|
44
|
+
|
|
45
|
+
The name tells jr2 the provider and its host. For a key that goes to one host, `hosts` can stay out: the key then goes
|
|
46
|
+
to that host only. Some of these names are:
|
|
47
|
+
|
|
48
|
+
| Name | Provider | Host |
|
|
49
|
+
| -------------------- | ------------ | ----------------------------------- |
|
|
50
|
+
| `ANTHROPIC_API_KEY` | `anthropic` | `api.anthropic.com` |
|
|
51
|
+
| `OPENAI_API_KEY` | `openai` | `api.openai.com` |
|
|
52
|
+
| `GEMINI_API_KEY` | `google` | `generativelanguage.googleapis.com` |
|
|
53
|
+
| `MISTRAL_API_KEY` | `mistral` | `api.mistral.ai` |
|
|
54
|
+
| `OPENROUTER_API_KEY` | `openrouter` | `openrouter.ai` |
|
|
55
|
+
|
|
56
|
+
Some providers have no single host, because the address has a region or an account in it. Examples are
|
|
57
|
+
`AWS_BEARER_TOKEN_BEDROCK`, `AZURE_OPENAI_API_KEY` and `GOOGLE_CLOUD_API_KEY`. For these, add the hosts to the entry,
|
|
58
|
+
such as `hosts: ["<resource host>"]`.
|
|
59
|
+
|
|
60
|
+
To keep the value in a Kubernetes Secret that you manage, write `valueFrom` in place of `value`:
|
|
61
|
+
`valueFrom: { secretKeyRef: { name: "<secret>", key: "<key>" } }`. See [`secrets`](../reference/config.md#secrets) for
|
|
62
|
+
each field.
|
|
63
|
+
|
|
64
|
+
Run `jr2 up`:
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
jr2 up
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
For an Instance whose Agent has only the [Menu](../reference/glossary.md#menu) and uses Anthropic, you see these lines:
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
…
|
|
74
|
+
secret ANTHROPIC_API_KEY: Held in the Instance Harness
|
|
75
|
+
the Instance Harness: Custodian holds ANTHROPIC_API_KEY (provider)
|
|
76
|
+
held secret ANTHROPIC_API_KEY → api.anthropic.com (literal)
|
|
77
|
+
provider: checking anthropic/claude-haiku-5-5 on the Instance Harness, through a Custodian that holds ANTHROPIC_API_KEY for api.anthropic.com
|
|
78
|
+
provider: the check pod has up to 5 min to start, then up to 6 min for its model
|
|
79
|
+
provider: the check pod is not running yet — custodian: PodInitializing
|
|
80
|
+
provider: anthropic/claude-haiku-5-5 reachable, and it completed a tool call
|
|
81
|
+
…
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
For an Agent in a [Workspace](../reference/glossary.md#workspace), the line names its
|
|
85
|
+
[Workflow](../reference/glossary.md#workflow): `Workspace of workflow "<workflow>"`. For a Workspace inside a different
|
|
86
|
+
Machine, the label continues with its route, such as ` → "<state>"`.
|
|
87
|
+
|
|
88
|
+
Before `jr2 up` applies the operator and the Instance, it checks each catalog model that an Agent names. A pod in the
|
|
89
|
+
cluster asks the provider for one tool call, through a Custodian that holds the key, as a
|
|
90
|
+
[Turn](../reference/glossary.md#turn) asks. When the model id or the key is wrong, `jr2 up` stops with
|
|
91
|
+
`error: provider preflight failed for model "<model>"`. The Instance, its Assembly and the operator do not change.
|
|
92
|
+
[Fix a failed converge](fix-a-failed-converge.md#rules) gives the full error.
|
|
93
|
+
|
|
94
|
+
## Send the calls through a gateway
|
|
95
|
+
|
|
96
|
+
A gateway, such as LiteLLM, serves the API of a provider at a different address. The catalog keeps every fact about the
|
|
97
|
+
models. Only the address of the calls changes.
|
|
98
|
+
|
|
99
|
+
Change the `secrets` entry: read its value from `GATEWAY_API_KEY`, and add `paths`. Then add the gateway to
|
|
100
|
+
[`harness.catalog`](../reference/config.md#harness-catalog), under the id of the provider:
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
import { defineConfig } from "@jr2/orchestrator";
|
|
104
|
+
|
|
105
|
+
export default defineConfig({
|
|
106
|
+
git: {
|
|
107
|
+
// The credentials that the cluster uses to clone and push. The token comes from JR2_GIT_TOKEN in .env.
|
|
108
|
+
credentials: [{ match: "*", token: "JR2_GIT_TOKEN", sshKey: "jr2-git-ssh" }],
|
|
109
|
+
},
|
|
110
|
+
// The gateway's key, held under the name that the provider reads. With no hosts, it goes to the host of the
|
|
111
|
+
// gateway below. paths keeps it away from the gateway's other routes.
|
|
112
|
+
secrets: [{ name: "ANTHROPIC_API_KEY", value: process.env.GATEWAY_API_KEY, paths: ["/v1/messages"] }],
|
|
113
|
+
harness: {
|
|
114
|
+
// Each call of an anthropic/<model> Agent goes to the gateway, not to api.anthropic.com.
|
|
115
|
+
catalog: { anthropic: { baseUrl: process.env.GATEWAY_URL ?? "" } },
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Put the address and the key of the gateway in `.env`:
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
GATEWAY_URL=https://<gateway>
|
|
124
|
+
GATEWAY_API_KEY=<gateway key>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Obey these conditions:
|
|
128
|
+
|
|
129
|
+
- `baseUrl` is the whole base URL that the provider's API adds its paths to. For `anthropic`, it is `https://<gateway>`,
|
|
130
|
+
and the API adds `/v1/messages`. For `openai`, it is `https://<gateway>/v1`.
|
|
131
|
+
- `baseUrl` is `https://`, because the Custodian sends a key over TLS only.
|
|
132
|
+
- The gateway serves each model under its catalog id. The Harness sends the catalog id, not a name that you choose.
|
|
133
|
+
- The key has the name that the provider reads, here `ANTHROPIC_API_KEY`. With no `hosts`, the key goes to the host of
|
|
134
|
+
`baseUrl`, not to `api.anthropic.com`.
|
|
135
|
+
|
|
136
|
+
`paths` limits the key to the path prefixes that the Agents use. A gateway key can often reach admin routes too, such as
|
|
137
|
+
a route that makes new keys. An Agent could take a new key out of the pod. Thus give a gateway key `paths`.
|
|
138
|
+
|
|
139
|
+
When the certificate of the gateway comes from a private CA, name the CA in
|
|
140
|
+
[`harness.caBundle`](../reference/config.md#harness-cabundle). The guide
|
|
141
|
+
[Use a local model](use-a-local-model.md#change-the-provider) shows `caBundle`.
|
|
142
|
+
|
|
143
|
+
Run `jr2 up` again:
|
|
144
|
+
|
|
145
|
+
```sh
|
|
146
|
+
jr2 up
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The key now goes to the gateway:
|
|
150
|
+
|
|
151
|
+
```text
|
|
152
|
+
…
|
|
153
|
+
held secret ANTHROPIC_API_KEY → <gateway> (literal)
|
|
154
|
+
provider: checking anthropic/claude-haiku-5-5 on the Instance Harness, through a Custodian that holds ANTHROPIC_API_KEY for <gateway>
|
|
155
|
+
…
|
|
156
|
+
provider: anthropic/claude-haiku-5-5 reachable, and it completed a tool call
|
|
157
|
+
…
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`<gateway>` is the host of `GATEWAY_URL`. When its port is not 443, the port follows the host, such as `<gateway>:8443`.
|
|
161
|
+
|
|
162
|
+
A gateway that serves its own model names, or only `/v1/chat/completions`, is not a catalog provider. Declare it as a
|
|
163
|
+
custom provider, with `harness.provider` and `apiKey`. The guide
|
|
164
|
+
[Use a local model](use-a-local-model.md#serve-over-tls-with-a-key) shows how.
|
|
165
|
+
|
|
166
|
+
## Rules
|
|
167
|
+
|
|
168
|
+
`jr2 up` prints each refusal after `error: `.
|
|
169
|
+
|
|
170
|
+
- `jr2 up` refuses an empty value: `secrets[<i>].value is empty — set <NAME> in .env (ADR-0059)`.
|
|
171
|
+
- `jr2 up` refuses a key that a pod gets, but that has no value. A `.env` variable that is not set reads as no value:
|
|
172
|
+
`secrets[<i>] needs exactly one of value or valueFrom — <NAME> has neither, which is what an unset .env variable reads as: set <NAME> in .env, or reference a Secret with valueFrom: { secretKeyRef: { name, key } } (ADR-0059)`.
|
|
173
|
+
- `jr2 up` refuses a key with no `hosts` when its name has no single host:
|
|
174
|
+
`secrets[<i>].hosts is absent, and <NAME> has no single default host — name where the value may go: hosts: ["gateway.example.com"] (ADR-0059)`.
|
|
175
|
+
- `jr2 up` refuses `hosts` that leave out the host to which an Agent's calls go:
|
|
176
|
+
`secrets[<i>].hosts leaves out <host>, where pi sends every "<provider>/…" turn an Agent here names — each would arrive with the Stand-in and fail with 401. Add it, or drop hosts to take that default (ADR-0059)`.
|
|
177
|
+
- `jr2 up` refuses a model key in `harness.env`, because the Agent can read that env:
|
|
178
|
+
`harness.env[<i>] sets <NAME>, a model key the Agent could read and take out of the pod — hold it instead: secrets: [<entry>] (ADR-0059)`.
|
|
179
|
+
- `jr2 up` refuses a Secret or a ConfigMap that `harness.envFrom` names, when it carries a model key. `<kind>` is
|
|
180
|
+
`Secret` or `ConfigMap`:
|
|
181
|
+
`harness.envFrom[<i>] loads <kind> "<name>", which carries <NAME> — a model key the Agent could read. Hold it instead: secrets: [{ name: "<NAME>", valueFrom: { secretKeyRef: { name: "<secret>", key: "<NAME>" } } }], and drop the key from that <kind> (ADR-0059)`.
|
|
182
|
+
- `jr2 up` refuses a `valueFrom` that names a Secret that does not exist:
|
|
183
|
+
`secrets[<i>].valueFrom names Secret "<name>", which does not exist in the instance's namespace — create it first: kubectl create secret generic <name> --from-literal=<key>=... (ADR-0019, ADR-0059)`.
|
|
184
|
+
- `jr2 up` refuses a `harness.catalog` key that is not a catalog provider with a known key:
|
|
185
|
+
`harness.catalog.<id>: "<id>" is not a pi catalog provider jr2 knows a key for — the catalog ids are <ids> (ADR-0059)`.
|
|
186
|
+
- `jr2 up` refuses a gateway address that is not `https://`:
|
|
187
|
+
`harness.catalog.<id>.baseUrl must be an https:// URL — the Custodian carries TLS only (ADR-0059). Read it from .env: catalog: { anthropic: { baseUrl: process.env.LITELLM_URL ?? "" } }`.
|
|
188
|
+
- `jr2 up` warns about a key that no pod gets:
|
|
189
|
+
`warning: secrets[<i>] (<NAME>) is named by nothing; goes nowhere — no workspace() lists it, no Agent's provider reads it, and no Effect names it (ADR-0059, ADR-0068)`.
|
|
190
|
+
- A credential that signs each request, such as `AWS_ACCESS_KEY_ID`, cannot be a Held secret. `jr2 up` warns when
|
|
191
|
+
`harness.env` sets one. Send the calls through a gateway that holds the credential, and hold the key of the gateway:
|
|
192
|
+
`warning: harness.env sets <NAME>: a signing credential cannot be held (a Stand-in cannot be swapped into a signature), so the Agent can read it — route the provider through a gateway that holds it, and hold the gateway's key instead (ADR-0059)`.
|
|
193
|
+
- The Harness refuses a model that is not in the catalog when it admits the Turn:
|
|
194
|
+
`harness admission failed (400): agent "<agent>": model "<provider>/<modelId>" resolves to nothing — not in pi's catalog, and no custom provider "<provider>" is configured (ADR-0018)`.
|
|
195
|
+
|
|
196
|
+
## Read next
|
|
197
|
+
|
|
198
|
+
- [Secrets and trust](../concepts/secrets-and-trust.md): Held secrets, Stand-ins and the Custodian.
|
|
199
|
+
- [Connect a model](../get-started/connect-a-model.md): the tutorial step that adds the Anthropic key.
|
|
200
|
+
- [Use a local model](use-a-local-model.md): a model that you serve yourself.
|
|
201
|
+
- [`secrets`](../reference/config.md#secrets) and [`harness.catalog`](../reference/config.md#harness-catalog) in the
|
|
202
|
+
`jr2.config.ts` Reference.
|
|
203
|
+
- [ADR-0059](../reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md): the Custodian
|
|
204
|
+
holds the keys, and a catalog provider can move to a gateway.
|
|
205
|
+
- [ADR-0068](../reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md): one `secrets`
|
|
206
|
+
list, and a secret goes where something names it.
|
|
207
|
+
- [ADR-0018](../reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md): an Agent names
|
|
208
|
+
its model.
|