@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,756 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: jr2.config.ts
|
|
3
|
+
description: "Every field of jr2.config.ts: its type, whether it is required, its default, and what it does."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# jr2.config.ts
|
|
7
|
+
|
|
8
|
+
An Instance's config is the default export of its `jr2.config.ts`: a `JR2Config`, written with `defineConfig`. Each field below has its path, as in `git.credentials[].match`, where `[]` is each entry of a list and `<name>` is each key of a map.
|
|
9
|
+
|
|
10
|
+
The shape of `jr2.config.ts`: the deployment facts of an Instance, which a Machine cannot carry.
|
|
11
|
+
It holds the Instance's name, its secrets, how the cluster authenticates to Repos, what the
|
|
12
|
+
Harness can reach, where Sandboxes run, and where images go. It names no Repo, no model and no
|
|
13
|
+
Sandbox Image: a Machine names those itself.
|
|
14
|
+
|
|
15
|
+
Every field is optional, and an Instance can run with no `jr2.config.ts`. Write the file as
|
|
16
|
+
`export default defineConfig({ … })`. When the config loads, a file with no default export is
|
|
17
|
+
refused: `` <file> has no default export (use `export default defineConfig({…})`) ``. The load also
|
|
18
|
+
checks the shape of `git.credentials`, `secrets`, `harness.catalog` and `priorityClasses`. It
|
|
19
|
+
checks that `sandbox` is an object, and checks its `resources`. Each refusal names the field.
|
|
20
|
+
`jr2 up` checks the rest.
|
|
21
|
+
|
|
22
|
+
**Example**
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import { defineConfig, type JR2Config } from "@jr2/orchestrator";
|
|
26
|
+
|
|
27
|
+
const harness: JR2Config["harness"] = {
|
|
28
|
+
provider: {
|
|
29
|
+
id: "vllm",
|
|
30
|
+
api: "openai-completions",
|
|
31
|
+
baseUrl: process.env.VLLM_URL ?? "",
|
|
32
|
+
models: { "Qwen/Qwen3.6-35B-A3B": { contextWindow: 131072, maxTokens: 16384 } },
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export default defineConfig({ name: "my-instance", harness });
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**See also**
|
|
40
|
+
|
|
41
|
+
- [Connect a model](../get-started/connect-a-model.md)
|
|
42
|
+
- [Secrets and trust](../concepts/secrets-and-trust.md)
|
|
43
|
+
- [ADR-0050: What code names, config declares; what the CLI names, discovery finds](decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md)
|
|
44
|
+
|
|
45
|
+
Fields: [`name`](#name), [`secrets`](#secrets), [`git`](#git), [`harness`](#harness), [`sandbox`](#sandbox), [`priorityClasses`](#priorityclasses), [`registry`](#registry), [`kitRegistry`](#kitregistry), [`platforms`](#platforms), [`operator`](#operator).
|
|
46
|
+
|
|
47
|
+
<a id="name"></a>
|
|
48
|
+
|
|
49
|
+
## `name`
|
|
50
|
+
|
|
51
|
+
- Type: `string`
|
|
52
|
+
- Required: no
|
|
53
|
+
- Default: the name of the Instance folder
|
|
54
|
+
|
|
55
|
+
The Instance's name. Its Kubernetes namespace is this name (`-n` overrides it), and
|
|
56
|
+
`jr2 up` labels every object that it owns with it.
|
|
57
|
+
|
|
58
|
+
<a id="secrets"></a>
|
|
59
|
+
|
|
60
|
+
## `secrets`
|
|
61
|
+
|
|
62
|
+
- Type: `readonly SecretEntry[]`
|
|
63
|
+
- Required: no
|
|
64
|
+
|
|
65
|
+
Every secret of the Instance, in one list. A secret goes where something names it. A Held
|
|
66
|
+
secret goes where a `workspace()` lists it under `secrets` or an Agent's provider reads it. An
|
|
67
|
+
Effect secret goes where an Effect names it with `secret("name")`. Its `hosts` is a Held
|
|
68
|
+
secret's binding, never its placement: an entry that nothing names goes nowhere. A model API
|
|
69
|
+
key goes here, never in `harness.env`. See `SecretEntry`. Each entry is checked when the
|
|
70
|
+
config loads: `<file> at secrets[<i>]<path>: <problem>`, followed by the shape of an entry.
|
|
71
|
+
|
|
72
|
+
<a id="secrets-name"></a>
|
|
73
|
+
|
|
74
|
+
### `secrets[].name`
|
|
75
|
+
|
|
76
|
+
- Type: `string`
|
|
77
|
+
- Required: yes
|
|
78
|
+
|
|
79
|
+
As a Held secret, the name of the env var that the Harness container sees, which holds the
|
|
80
|
+
Stand-in. As an Effect secret, the name that `secret("<name>")` names, and the name of the
|
|
81
|
+
Effector's file. For a Held secret, it must match `[A-Z_][A-Z0-9_]*`:
|
|
82
|
+
`secrets[<i>].name "<name>" is not an env var name ([A-Z_][A-Z0-9_]*)`. It must not start with
|
|
83
|
+
`JR2_` and must not be a proxy or trust variable of the kit:
|
|
84
|
+
`secrets[<i>].name <NAME> is the kit's — JR2_ names and the proxy and trust variables belong to the mechanism`.
|
|
85
|
+
One name, one entry: `secrets[<i>].name <NAME> is held twice`.
|
|
86
|
+
|
|
87
|
+
<a id="secrets-value"></a>
|
|
88
|
+
|
|
89
|
+
### `secrets[].value`
|
|
90
|
+
|
|
91
|
+
- Type: `string`
|
|
92
|
+
- Required: no
|
|
93
|
+
|
|
94
|
+
The value, usually read from `process.env` (`.env`). `jr2 up` writes it only into the Secrets
|
|
95
|
+
of the containers that hold it. Write exactly one of `value` and `valueFrom`:
|
|
96
|
+
`secrets[<i>] needs exactly one of value or valueFrom`. A `.env` variable that is not set reads
|
|
97
|
+
as no value, and an empty one is refused: `secrets[<i>].value is empty — set <NAME> in .env`.
|
|
98
|
+
|
|
99
|
+
<a id="secrets-valuefrom"></a>
|
|
100
|
+
|
|
101
|
+
### `secrets[].valueFrom`
|
|
102
|
+
|
|
103
|
+
- Type: `object`
|
|
104
|
+
- Required: no
|
|
105
|
+
|
|
106
|
+
Or a key of a Secret that you manage (Sealed Secrets, External Secrets):
|
|
107
|
+
`{ secretKeyRef: { name, key } }`. `jr2 up` checks that the Secret and the key exist. Each
|
|
108
|
+
container that holds the secret mounts that one key as a file, and no other container does.
|
|
109
|
+
|
|
110
|
+
<a id="secrets-valuefrom-secretkeyref"></a>
|
|
111
|
+
|
|
112
|
+
### `secrets[].valueFrom.secretKeyRef`
|
|
113
|
+
|
|
114
|
+
- Type: `object`
|
|
115
|
+
- Required: yes
|
|
116
|
+
|
|
117
|
+
The Secret and the key in it that hold the value.
|
|
118
|
+
|
|
119
|
+
<a id="secrets-valuefrom-secretkeyref-name"></a>
|
|
120
|
+
|
|
121
|
+
### `secrets[].valueFrom.secretKeyRef.name`
|
|
122
|
+
|
|
123
|
+
- Type: `string`
|
|
124
|
+
- Required: yes
|
|
125
|
+
|
|
126
|
+
The name of the Secret.
|
|
127
|
+
|
|
128
|
+
<a id="secrets-valuefrom-secretkeyref-key"></a>
|
|
129
|
+
|
|
130
|
+
### `secrets[].valueFrom.secretKeyRef.key`
|
|
131
|
+
|
|
132
|
+
- Type: `string`
|
|
133
|
+
- Required: yes
|
|
134
|
+
|
|
135
|
+
The key in the Secret that holds the value.
|
|
136
|
+
|
|
137
|
+
<a id="secrets-hosts"></a>
|
|
138
|
+
|
|
139
|
+
### `secrets[].hosts`
|
|
140
|
+
|
|
141
|
+
- Type: `readonly string[]`
|
|
142
|
+
- Required: no
|
|
143
|
+
|
|
144
|
+
Where the value may go as a Held secret. Each entry is `host`, `host:port`, or an `https://`
|
|
145
|
+
URL, of which only the host and port count. Write exact DNS names or IP addresses, with no
|
|
146
|
+
wildcards. The port default is 443. A known model key, such as `ANTHROPIC_API_KEY`, may leave
|
|
147
|
+
it out: it then goes to the one host that its provider calls. Any other Held secret must name
|
|
148
|
+
its hosts: `secrets[<i>].hosts is absent, and <NAME> has no single default host`.
|
|
149
|
+
|
|
150
|
+
<a id="secrets-headers"></a>
|
|
151
|
+
|
|
152
|
+
### `secrets[].headers`
|
|
153
|
+
|
|
154
|
+
- Type: `readonly string[]`
|
|
155
|
+
- Required: no
|
|
156
|
+
- Default: `["authorization", "x-api-key", "x-goog-api-key", "api-key"]`
|
|
157
|
+
|
|
158
|
+
The request headers in which the Custodian puts the value in place of the Stand-in,
|
|
159
|
+
lowercase. A header
|
|
160
|
+
that frames or routes the request is refused:
|
|
161
|
+
`secrets[<i>].headers[<j>] "<header>" cannot carry a held secret`.
|
|
162
|
+
|
|
163
|
+
<a id="secrets-paths"></a>
|
|
164
|
+
|
|
165
|
+
### `secrets[].paths`
|
|
166
|
+
|
|
167
|
+
- Type: `readonly string[]`
|
|
168
|
+
- Required: no
|
|
169
|
+
- Default: every path
|
|
170
|
+
|
|
171
|
+
The path prefixes to which the value may be sent, such as `/v1/messages`. Each starts with
|
|
172
|
+
`/`. Narrow it for a gateway key that can reach admin routes, such as a
|
|
173
|
+
LiteLLM key that can make new keys. The Agent could take away a key made that way.
|
|
174
|
+
|
|
175
|
+
<a id="git"></a>
|
|
176
|
+
|
|
177
|
+
## `git`
|
|
178
|
+
|
|
179
|
+
- Type: `GitConfig`
|
|
180
|
+
- Required: no
|
|
181
|
+
|
|
182
|
+
How the cluster authenticates to Repos, and the fence that a per-run url must pass. It is not
|
|
183
|
+
a list of Repos: a Machine names its Repos in the Repo Slots of its `workspace()`. See
|
|
184
|
+
`GitConfig`.
|
|
185
|
+
|
|
186
|
+
<a id="git-credentials"></a>
|
|
187
|
+
|
|
188
|
+
### `git.credentials`
|
|
189
|
+
|
|
190
|
+
- Type: `readonly GitCredential[]`
|
|
191
|
+
- Required: no
|
|
192
|
+
|
|
193
|
+
The credential entries, matched by prefix on the Repo identity. The longest `match` wins; on a
|
|
194
|
+
tie, the first entry in the list wins.
|
|
195
|
+
|
|
196
|
+
The list is also a fence. A per-run url, which comes from the run input, must match an entry,
|
|
197
|
+
or the Sandbox refuses it when it attaches the Repo:
|
|
198
|
+
`Sandbox "<name>" refuses the per-run repo <url> for slot "<slot>": no git.credentials entry matches "<identity>"`.
|
|
199
|
+
Thus a run cannot spend this cluster's credentials against any host. A url that a Machine
|
|
200
|
+
binds needs no entry. When no entry matches it, it clones with no credential.
|
|
201
|
+
|
|
202
|
+
Each entry is checked when the config loads:
|
|
203
|
+
`<file> at git.credentials[<i>]<path>: <problem>`, followed by the shape of an entry.
|
|
204
|
+
|
|
205
|
+
<a id="git-credentials-match"></a>
|
|
206
|
+
|
|
207
|
+
### `git.credentials[].match`
|
|
208
|
+
|
|
209
|
+
- Type: `string`
|
|
210
|
+
- Required: yes
|
|
211
|
+
|
|
212
|
+
The Repos this entry is for: a prefix of a Repo's identity, such as `github.com/ourorg/`, or
|
|
213
|
+
`*` for every Repo. The identity of a Repo is its host and path with no scheme, user or `.git`.
|
|
214
|
+
When more than one entry matches, the longest `match` wins; on a tie, the first entry in the
|
|
215
|
+
list wins.
|
|
216
|
+
|
|
217
|
+
<a id="git-credentials-token"></a>
|
|
218
|
+
|
|
219
|
+
### `git.credentials[].token`
|
|
220
|
+
|
|
221
|
+
- Type: `string`
|
|
222
|
+
- Required: no
|
|
223
|
+
|
|
224
|
+
For an `https://` url: the name of the env var that holds a token, read from the shell or
|
|
225
|
+
`.env` when `jr2 up` runs. `jr2 up` writes the value into a Secret (`jr2-git-<hash>`) that only
|
|
226
|
+
the Repo cache agent reads. The Agent never sees it.
|
|
227
|
+
|
|
228
|
+
<a id="git-credentials-sshkey"></a>
|
|
229
|
+
|
|
230
|
+
### `git.credentials[].sshKey`
|
|
231
|
+
|
|
232
|
+
- Type: `string`
|
|
233
|
+
- Required: no
|
|
234
|
+
|
|
235
|
+
For an ssh url: the name of a Secret that you create. It holds a deploy key under the Flux
|
|
236
|
+
key names `identity`, `identity.pub` and `known_hosts`.
|
|
237
|
+
|
|
238
|
+
<a id="git-credentials-push"></a>
|
|
239
|
+
|
|
240
|
+
### `git.credentials[].push`
|
|
241
|
+
|
|
242
|
+
- Type: `object`
|
|
243
|
+
- Required: no
|
|
244
|
+
- Default: the clone credential pushes
|
|
245
|
+
|
|
246
|
+
The credential that a `push()` Effect uses, when it is not the clone credential. Write
|
|
247
|
+
`{ sshKey }` or `{ token }`. An entry with no credential
|
|
248
|
+
admits a clone and never a push. When the push finds no usable credential, it is refused, for
|
|
249
|
+
example: `no git.credentials entry matches "<identity>" — a push spends the entry its url
|
|
250
|
+
matches`, or `git.credentials entry "<match>" holds no credential a push over <scheme> can
|
|
251
|
+
spend`.
|
|
252
|
+
|
|
253
|
+
It is one of these objects:
|
|
254
|
+
|
|
255
|
+
- Form 1: `sshKey`
|
|
256
|
+
- `sshKey`, `string`: For an ssh url: the name of a Secret that you create, with the same keys as the entry's `sshKey`.
|
|
257
|
+
- Form 2: `token`
|
|
258
|
+
- `token`, `string`: For an `https://` url: the name of the env var that holds the push token, read as for the entry's `token`.
|
|
259
|
+
|
|
260
|
+
<a id="git-credentials-sign"></a>
|
|
261
|
+
|
|
262
|
+
### `git.credentials[].sign`
|
|
263
|
+
|
|
264
|
+
- Type: `object`
|
|
265
|
+
- Required: no
|
|
266
|
+
|
|
267
|
+
The key that a `push({ sign: true })` signs with, and the committer it signs as:
|
|
268
|
+
`{ sshKey, name, email }` or `{ gpgKey, name, email }`. `sshKey` names a Secret with
|
|
269
|
+
`identity`. `gpgKey` names a Secret with `private.asc` and no passphrase. jr2 never signs with
|
|
270
|
+
the clone or push key, so name the signing key here. The email must belong to the forge account
|
|
271
|
+
that holds the key, or the forge shows the signature as unverified. A signed push without it is
|
|
272
|
+
refused: `signed, and git.credentials entry "<match>" holds no sign field`.
|
|
273
|
+
|
|
274
|
+
It is one of these objects:
|
|
275
|
+
|
|
276
|
+
- Form 1: `sshKey`, `name`, `email`
|
|
277
|
+
- `sshKey`, `string`: The name of a Secret that you create, which holds the ssh signing key under `identity`.
|
|
278
|
+
- `name`, `string`: The committer's name on the signed commit.
|
|
279
|
+
- `email`, `string`: The committer's email. It must belong to the forge account that holds the key.
|
|
280
|
+
- Form 2: `gpgKey`, `name`, `email`
|
|
281
|
+
- `gpgKey`, `string`: The name of a Secret that you create, which holds the GPG signing key under `private.asc`, with no passphrase.
|
|
282
|
+
- `name`, `string`: The committer's name on the signed commit.
|
|
283
|
+
- `email`, `string`: The committer's email. It must belong to the forge account that holds the key.
|
|
284
|
+
|
|
285
|
+
<a id="git-credentials-committer"></a>
|
|
286
|
+
|
|
287
|
+
### `git.credentials[].committer`
|
|
288
|
+
|
|
289
|
+
- Type: `object`
|
|
290
|
+
- Required: no
|
|
291
|
+
|
|
292
|
+
Who commits an unsigned `push({ squash: true })`: `{ name, email }`. The squashed commit is
|
|
293
|
+
new, so it needs a committer. Its date comes from the Effector's clock, and its author stays
|
|
294
|
+
the Agent. A signed push is committed by the signer, so it does not read this field. A squashed
|
|
295
|
+
push with neither field is refused: `squashed without sign, and git.credentials entry "<match>"
|
|
296
|
+
holds neither sign nor committer`.
|
|
297
|
+
|
|
298
|
+
<a id="git-credentials-committer-name"></a>
|
|
299
|
+
|
|
300
|
+
### `git.credentials[].committer.name`
|
|
301
|
+
|
|
302
|
+
- Type: `string`
|
|
303
|
+
- Required: yes
|
|
304
|
+
|
|
305
|
+
The committer's name on the squashed commit.
|
|
306
|
+
|
|
307
|
+
<a id="git-credentials-committer-email"></a>
|
|
308
|
+
|
|
309
|
+
### `git.credentials[].committer.email`
|
|
310
|
+
|
|
311
|
+
- Type: `string`
|
|
312
|
+
- Required: yes
|
|
313
|
+
|
|
314
|
+
The committer's email on the squashed commit.
|
|
315
|
+
|
|
316
|
+
<a id="harness"></a>
|
|
317
|
+
|
|
318
|
+
## `harness`
|
|
319
|
+
|
|
320
|
+
- Type: `HarnessConfig`
|
|
321
|
+
- Required: no
|
|
322
|
+
|
|
323
|
+
What the Harness can reach: a custom model provider, gateways for catalog providers, env
|
|
324
|
+
vars, and CAs. See `HarnessConfig`.
|
|
325
|
+
|
|
326
|
+
<a id="harness-provider"></a>
|
|
327
|
+
|
|
328
|
+
### `harness.provider`
|
|
329
|
+
|
|
330
|
+
- Type: `HarnessProvider`
|
|
331
|
+
- Required: no
|
|
332
|
+
- Default: none; the Agents use catalog providers only
|
|
333
|
+
|
|
334
|
+
A custom model provider, such as a vLLM or Ollama endpoint. See `HarnessProvider`.
|
|
335
|
+
|
|
336
|
+
<a id="harness-provider-id"></a>
|
|
337
|
+
|
|
338
|
+
### `harness.provider.id`
|
|
339
|
+
|
|
340
|
+
- Type: `string`
|
|
341
|
+
- Required: yes
|
|
342
|
+
|
|
343
|
+
The provider id that model names start with: `vllm` in `vllm/Qwen/Qwen3-32B`. It must not
|
|
344
|
+
also be a key of `harness.catalog`:
|
|
345
|
+
`harness.catalog.<id>: "<id>" is also harness.provider.id — a custom provider owns its own baseUrl`.
|
|
346
|
+
|
|
347
|
+
<a id="harness-provider-api"></a>
|
|
348
|
+
|
|
349
|
+
### `harness.provider.api`
|
|
350
|
+
|
|
351
|
+
- Type: `string`
|
|
352
|
+
- Required: yes
|
|
353
|
+
|
|
354
|
+
The wire protocol. The only value is `"openai-completions"`, which most OpenAI-compatible
|
|
355
|
+
endpoints speak, such as vLLM and Ollama. `jr2 up` refuses any other value before it builds or
|
|
356
|
+
applies anything:
|
|
357
|
+
`refusing: harness.provider.api is "<api>" — the Harness speaks: openai-completions (ADR-0018)`.
|
|
358
|
+
|
|
359
|
+
<a id="harness-provider-baseurl"></a>
|
|
360
|
+
|
|
361
|
+
### `harness.provider.baseUrl`
|
|
362
|
+
|
|
363
|
+
- Type: `string`
|
|
364
|
+
- Required: yes
|
|
365
|
+
|
|
366
|
+
The endpoint's URL. The pods must reach it: `localhost` never works, and a LAN address works
|
|
367
|
+
on kind. It changes between deployments, so read it from `process.env` (`.env`). `jr2 up`
|
|
368
|
+
checks from inside the cluster that the endpoint answers.
|
|
369
|
+
|
|
370
|
+
<a id="harness-provider-apikey"></a>
|
|
371
|
+
|
|
372
|
+
### `harness.provider.apiKey`
|
|
373
|
+
|
|
374
|
+
- Type: `string`
|
|
375
|
+
- Required: no
|
|
376
|
+
- Default: none, for an endpoint that needs no key
|
|
377
|
+
|
|
378
|
+
The API key, when the endpoint needs one. Read it from `process.env`. It is a Held secret,
|
|
379
|
+
`JR2_PROVIDER_API_KEY`: `jr2 up` gives the value to the Custodian only, bound to the host of
|
|
380
|
+
`baseUrl`, and the Harness container holds only its Stand-in. Thus `baseUrl` must be
|
|
381
|
+
`https://` when you set it:
|
|
382
|
+
`harness.provider.apiKey is set, and harness.provider.baseUrl is not https://`.
|
|
383
|
+
|
|
384
|
+
<a id="harness-provider-contextwindow"></a>
|
|
385
|
+
|
|
386
|
+
### `harness.provider.contextWindow`
|
|
387
|
+
|
|
388
|
+
- Type: `number`
|
|
389
|
+
- Required: no
|
|
390
|
+
|
|
391
|
+
The context window, in tokens, of each model of this provider that `models` does not set.
|
|
392
|
+
Set it here or in `models`: a limit that nothing sets is 0, and then Compaction has no context
|
|
393
|
+
budget.
|
|
394
|
+
|
|
395
|
+
<a id="harness-provider-maxtokens"></a>
|
|
396
|
+
|
|
397
|
+
### `harness.provider.maxTokens`
|
|
398
|
+
|
|
399
|
+
- Type: `number`
|
|
400
|
+
- Required: no
|
|
401
|
+
- Default: no limit is sent
|
|
402
|
+
|
|
403
|
+
The most output tokens in one completion, for each model of this provider that `models` does
|
|
404
|
+
not set.
|
|
405
|
+
|
|
406
|
+
<a id="harness-provider-models"></a>
|
|
407
|
+
|
|
408
|
+
### `harness.provider.models`
|
|
409
|
+
|
|
410
|
+
- Type: `Record<string, HarnessProviderModel>`
|
|
411
|
+
- Required: no
|
|
412
|
+
|
|
413
|
+
Token limits for each model, keyed by the model id after the provider prefix: the key for
|
|
414
|
+
`vllm/Qwen/Qwen3-32B` is `"Qwen/Qwen3-32B"`. A limit set here wins over the provider's.
|
|
415
|
+
|
|
416
|
+
<a id="harness-provider-models-name-contextwindow"></a>
|
|
417
|
+
|
|
418
|
+
### `harness.provider.models.<name>.contextWindow`
|
|
419
|
+
|
|
420
|
+
- Type: `number`
|
|
421
|
+
- Required: no
|
|
422
|
+
- Default: the provider's `contextWindow`
|
|
423
|
+
|
|
424
|
+
The model's context window, in tokens (vLLM: `max_model_len`).
|
|
425
|
+
|
|
426
|
+
<a id="harness-provider-models-name-maxtokens"></a>
|
|
427
|
+
|
|
428
|
+
### `harness.provider.models.<name>.maxTokens`
|
|
429
|
+
|
|
430
|
+
- Type: `number`
|
|
431
|
+
- Required: no
|
|
432
|
+
- Default: the provider's `maxTokens`
|
|
433
|
+
|
|
434
|
+
The most output tokens in one completion.
|
|
435
|
+
|
|
436
|
+
<a id="harness-catalog"></a>
|
|
437
|
+
|
|
438
|
+
### `harness.catalog`
|
|
439
|
+
|
|
440
|
+
- Type: `Readonly<Record<string, CatalogReach>>`
|
|
441
|
+
- Required: no
|
|
442
|
+
- Default: each provider's own endpoint
|
|
443
|
+
|
|
444
|
+
Catalog providers whose calls go to another endpoint, such as a gateway, keyed by the catalog
|
|
445
|
+
provider id: `anthropic`, `openai`, and so on. See `CatalogReach`. A key that is not a
|
|
446
|
+
catalog provider with a known model key is refused:
|
|
447
|
+
`harness.catalog.<id>: "<id>" is not a pi catalog provider jr2 knows a key for`.
|
|
448
|
+
|
|
449
|
+
<a id="harness-catalog-name-baseurl"></a>
|
|
450
|
+
|
|
451
|
+
### `harness.catalog.<name>.baseUrl`
|
|
452
|
+
|
|
453
|
+
- Type: `string`
|
|
454
|
+
- Required: yes
|
|
455
|
+
|
|
456
|
+
The whole base URL that the provider's API adds its paths to: `https://litellm.corp.example`
|
|
457
|
+
for `anthropic`, which adds `/v1/messages`; `https://litellm.corp.example/v1` for `openai`. It
|
|
458
|
+
must be `https://`: `harness.catalog.<id>.baseUrl must be an https:// URL`. It changes between
|
|
459
|
+
deployments, so read it from `process.env` (`.env`).
|
|
460
|
+
|
|
461
|
+
<a id="harness-env"></a>
|
|
462
|
+
|
|
463
|
+
### `harness.env`
|
|
464
|
+
|
|
465
|
+
- Type: `readonly HarnessEnvVar[]`
|
|
466
|
+
- Required: no
|
|
467
|
+
|
|
468
|
+
Env vars for the Harness container. The Agent can read every one of them, so do not put a
|
|
469
|
+
credential here. A known model key is refused here. Put it in the top-level `secrets` list.
|
|
470
|
+
See `HarnessEnvVar`.
|
|
471
|
+
|
|
472
|
+
<a id="harness-env-name"></a>
|
|
473
|
+
|
|
474
|
+
### `harness.env[].name`
|
|
475
|
+
|
|
476
|
+
- Type: `string`
|
|
477
|
+
- Required: yes
|
|
478
|
+
|
|
479
|
+
The env var's name. A known model key name, such as `ANTHROPIC_API_KEY`, is refused:
|
|
480
|
+
`harness.env[<i>] sets <NAME>, a model key the Agent could read and take out of the pod — hold it instead`.
|
|
481
|
+
|
|
482
|
+
<a id="harness-env-value"></a>
|
|
483
|
+
|
|
484
|
+
### `harness.env[].value`
|
|
485
|
+
|
|
486
|
+
- Type: `string`
|
|
487
|
+
- Required: no
|
|
488
|
+
|
|
489
|
+
The value, usually read from `process.env`. `jr2 up` writes it into a Secret of the Instance.
|
|
490
|
+
Write `value` or `valueFrom`.
|
|
491
|
+
|
|
492
|
+
<a id="harness-env-valuefrom"></a>
|
|
493
|
+
|
|
494
|
+
### `harness.env[].valueFrom`
|
|
495
|
+
|
|
496
|
+
- Type: `Record<string, unknown>`
|
|
497
|
+
- Required: no
|
|
498
|
+
|
|
499
|
+
Or a Kubernetes `valueFrom` reference, such as `{ secretKeyRef: { name, key } }`, given to the
|
|
500
|
+
pod as it is. A reference to a Secret of the kit is refused:
|
|
501
|
+
`harness.env[<i>] (<NAME>) reads Secret "<name>", which is the kit's and never the Harness's`.
|
|
502
|
+
|
|
503
|
+
<a id="harness-envfrom"></a>
|
|
504
|
+
|
|
505
|
+
### `harness.envFrom`
|
|
506
|
+
|
|
507
|
+
- Type: `readonly HarnessEnvFromSource[]`
|
|
508
|
+
- Required: no
|
|
509
|
+
|
|
510
|
+
Secrets and ConfigMaps that you manage, whose keys all become env vars of the Harness
|
|
511
|
+
container. See `HarnessEnvFromSource`.
|
|
512
|
+
|
|
513
|
+
<a id="harness-envfrom-prefix"></a>
|
|
514
|
+
|
|
515
|
+
### `harness.envFrom[].prefix`
|
|
516
|
+
|
|
517
|
+
- Type: `string`
|
|
518
|
+
- Required: no
|
|
519
|
+
- Default: none
|
|
520
|
+
|
|
521
|
+
Text put before each key's name, as Kubernetes does.
|
|
522
|
+
|
|
523
|
+
<a id="harness-envfrom-secretref"></a>
|
|
524
|
+
|
|
525
|
+
### `harness.envFrom[].secretRef`
|
|
526
|
+
|
|
527
|
+
- Type: `object`
|
|
528
|
+
- Required: no
|
|
529
|
+
|
|
530
|
+
A Secret that you manage, by name: `{ name }`. `jr2 up` checks that it exists.
|
|
531
|
+
|
|
532
|
+
<a id="harness-envfrom-secretref-name"></a>
|
|
533
|
+
|
|
534
|
+
### `harness.envFrom[].secretRef.name`
|
|
535
|
+
|
|
536
|
+
- Type: `string`
|
|
537
|
+
- Required: yes
|
|
538
|
+
|
|
539
|
+
The name of the Secret.
|
|
540
|
+
|
|
541
|
+
<a id="harness-envfrom-configmapref"></a>
|
|
542
|
+
|
|
543
|
+
### `harness.envFrom[].configMapRef`
|
|
544
|
+
|
|
545
|
+
- Type: `object`
|
|
546
|
+
- Required: no
|
|
547
|
+
|
|
548
|
+
A ConfigMap that you manage, by name: `{ name }`.
|
|
549
|
+
|
|
550
|
+
<a id="harness-envfrom-configmapref-name"></a>
|
|
551
|
+
|
|
552
|
+
### `harness.envFrom[].configMapRef.name`
|
|
553
|
+
|
|
554
|
+
- Type: `string`
|
|
555
|
+
- Required: yes
|
|
556
|
+
|
|
557
|
+
The name of the ConfigMap.
|
|
558
|
+
|
|
559
|
+
<a id="harness-cabundle"></a>
|
|
560
|
+
|
|
561
|
+
### `harness.caBundle`
|
|
562
|
+
|
|
563
|
+
- Type: `string`
|
|
564
|
+
- Required: no
|
|
565
|
+
|
|
566
|
+
A path to a PEM CA bundle, relative to the Instance folder. An example is the CA of an
|
|
567
|
+
internal endpoint in front of a LAN vLLM. Commit the file: CA certificates are public. `jr2 up`
|
|
568
|
+
puts it in the `jr2-ca` ConfigMap and uses it when it checks the provider. The Harness
|
|
569
|
+
container trusts it, and so does the Custodian when it verifies a host that a Held secret is
|
|
570
|
+
bound to.
|
|
571
|
+
|
|
572
|
+
<a id="sandbox"></a>
|
|
573
|
+
|
|
574
|
+
## `sandbox`
|
|
575
|
+
|
|
576
|
+
- Type: `SandboxConfig`
|
|
577
|
+
- Required: no
|
|
578
|
+
- Default: a Sandbox runs wherever an ordinary pod runs, at the kit's Size
|
|
579
|
+
|
|
580
|
+
Which nodes are Sandbox nodes, and the Size of a Workspace that states none. See `SandboxConfig`.
|
|
581
|
+
|
|
582
|
+
<a id="sandbox-nodeselector"></a>
|
|
583
|
+
|
|
584
|
+
### `sandbox.nodeSelector`
|
|
585
|
+
|
|
586
|
+
- Type: `Readonly<Record<string, string>>`
|
|
587
|
+
- Required: no
|
|
588
|
+
- Default: none
|
|
589
|
+
|
|
590
|
+
The pod's `nodeSelector`: a Sandbox node must have every one of these labels.
|
|
591
|
+
|
|
592
|
+
<a id="sandbox-tolerations"></a>
|
|
593
|
+
|
|
594
|
+
### `sandbox.tolerations`
|
|
595
|
+
|
|
596
|
+
- Type: `readonly Toleration[]`
|
|
597
|
+
- Required: no
|
|
598
|
+
- Default: none
|
|
599
|
+
|
|
600
|
+
The pod's `tolerations`, as you write them. jr2 adds no `tolerationSeconds`.
|
|
601
|
+
Thus a tolerated `NoExecute` taint keeps a Sandbox on its node while its Lease is renewed.
|
|
602
|
+
|
|
603
|
+
<a id="sandbox-tolerations-key"></a>
|
|
604
|
+
|
|
605
|
+
### `sandbox.tolerations[].key`
|
|
606
|
+
|
|
607
|
+
- Type: `string`
|
|
608
|
+
- Required: no
|
|
609
|
+
|
|
610
|
+
The taint key. Leave it out, with `operator: "Exists"`, to tolerate every taint.
|
|
611
|
+
|
|
612
|
+
<a id="sandbox-tolerations-operator"></a>
|
|
613
|
+
|
|
614
|
+
### `sandbox.tolerations[].operator`
|
|
615
|
+
|
|
616
|
+
- Type: `"Exists" | "Equal"`
|
|
617
|
+
- Required: no
|
|
618
|
+
- Default: `"Equal"`
|
|
619
|
+
|
|
620
|
+
`"Equal"` matches a taint whose value is `value`; `"Exists"` matches any value.
|
|
621
|
+
|
|
622
|
+
<a id="sandbox-tolerations-value"></a>
|
|
623
|
+
|
|
624
|
+
### `sandbox.tolerations[].value`
|
|
625
|
+
|
|
626
|
+
- Type: `string`
|
|
627
|
+
- Required: no
|
|
628
|
+
|
|
629
|
+
The taint value, for `operator: "Equal"`.
|
|
630
|
+
|
|
631
|
+
<a id="sandbox-tolerations-effect"></a>
|
|
632
|
+
|
|
633
|
+
### `sandbox.tolerations[].effect`
|
|
634
|
+
|
|
635
|
+
- Type: `"NoSchedule" | "PreferNoSchedule" | "NoExecute"`
|
|
636
|
+
- Required: no
|
|
637
|
+
- Default: every effect
|
|
638
|
+
|
|
639
|
+
The taint effect to tolerate: `"NoSchedule"`, `"PreferNoSchedule"` or `"NoExecute"`.
|
|
640
|
+
|
|
641
|
+
<a id="sandbox-tolerations-tolerationseconds"></a>
|
|
642
|
+
|
|
643
|
+
### `sandbox.tolerations[].tolerationSeconds`
|
|
644
|
+
|
|
645
|
+
- Type: `number`
|
|
646
|
+
- Required: no
|
|
647
|
+
- Default: the pod stays
|
|
648
|
+
|
|
649
|
+
For `"NoExecute"`: how many seconds the pod stays on the node after the taint is added.
|
|
650
|
+
|
|
651
|
+
<a id="sandbox-resources"></a>
|
|
652
|
+
|
|
653
|
+
### `sandbox.resources`
|
|
654
|
+
|
|
655
|
+
- Type: [`Size`](authoring-surface/type-size.md)
|
|
656
|
+
- Required: no
|
|
657
|
+
- Default: the kit default, memory `2Gi` and cpu `1`
|
|
658
|
+
|
|
659
|
+
The Size of a Workspace that states no Size at all: `{ limits: { memory, cpu } }` and nothing
|
|
660
|
+
else. The kit default fills a field that it leaves out. It never changes a Size that a Machine
|
|
661
|
+
states: to change that, use `customize(machine, { resources })`. jr2 reserves the whole Size and enforces the cpu limit. See
|
|
662
|
+
[`Size`](authoring-surface/type-size.md) for the refusals, such as
|
|
663
|
+
`<file> at sandbox.resources.requests is not accepted`.
|
|
664
|
+
|
|
665
|
+
<a id="priorityclasses"></a>
|
|
666
|
+
|
|
667
|
+
## `priorityClasses`
|
|
668
|
+
|
|
669
|
+
- Type: `PriorityClasses`
|
|
670
|
+
- Required: no
|
|
671
|
+
|
|
672
|
+
Existing PriorityClasses to use in place of the two that `jr2 up` creates. See
|
|
673
|
+
`PriorityClasses`.
|
|
674
|
+
|
|
675
|
+
<a id="priorityclasses-control"></a>
|
|
676
|
+
|
|
677
|
+
### `priorityClasses.control`
|
|
678
|
+
|
|
679
|
+
- Type: `string`
|
|
680
|
+
- Required: no
|
|
681
|
+
- Default: `jr2-control`, which `jr2 up` creates
|
|
682
|
+
|
|
683
|
+
An existing PriorityClass for the Orchestrator, the operator and the Repo cache agent.
|
|
684
|
+
|
|
685
|
+
<a id="priorityclasses-sandbox"></a>
|
|
686
|
+
|
|
687
|
+
### `priorityClasses.sandbox`
|
|
688
|
+
|
|
689
|
+
- Type: `string`
|
|
690
|
+
- Required: no
|
|
691
|
+
- Default: `jr2-sandbox`, which `jr2 up` creates
|
|
692
|
+
|
|
693
|
+
An existing PriorityClass for the Sandboxes and the Instance Harness.
|
|
694
|
+
|
|
695
|
+
<a id="registry"></a>
|
|
696
|
+
|
|
697
|
+
## `registry`
|
|
698
|
+
|
|
699
|
+
- Type: `string`
|
|
700
|
+
- Required: no
|
|
701
|
+
- Default: none; `jr2 up` loads the images into the kind cluster
|
|
702
|
+
|
|
703
|
+
The image registry prefix to which `jr2 up` pushes the images that it builds, such as
|
|
704
|
+
`registry.example.com/team`. It changes between deployments, so read it from `process.env`
|
|
705
|
+
(`.env`). On a cluster that is
|
|
706
|
+
not kind, `jr2 up` then refuses:
|
|
707
|
+
`` context <context> is not a kind cluster and no `registry` is configured ``.
|
|
708
|
+
|
|
709
|
+
<a id="kitregistry"></a>
|
|
710
|
+
|
|
711
|
+
## `kitRegistry`
|
|
712
|
+
|
|
713
|
+
- Type: `string`
|
|
714
|
+
- Required: no
|
|
715
|
+
- Default: none; the cluster pulls from the canonical home, `ghcr.io/snapwich/jr2-harness:<version>` and the others
|
|
716
|
+
|
|
717
|
+
The registry from which this cluster pulls the published Kit images: a mirror for a cluster
|
|
718
|
+
that is self-hosted, air-gapped, or mirror-only. Set, the cluster pulls
|
|
719
|
+
the same tags from `<kitRegistry>/jr2-harness:<version>`. Fill the mirror with
|
|
720
|
+
`jr2 kit push <registry>`; `jr2 up` never pushes to it. Read it from `process.env` (`.env`).
|
|
721
|
+
|
|
722
|
+
<a id="platforms"></a>
|
|
723
|
+
|
|
724
|
+
## `platforms`
|
|
725
|
+
|
|
726
|
+
- Type: `readonly string[]`
|
|
727
|
+
- Required: no
|
|
728
|
+
- Default: the platforms of the cluster's schedulable nodes that the kit releases images for
|
|
729
|
+
|
|
730
|
+
The platforms for which `jr2 up` builds its images, as docker platform strings, such as
|
|
731
|
+
`["linux/arm64"]`. `jr2 up` reports a node platform that it skips.
|
|
732
|
+
|
|
733
|
+
Set it when the nodes cannot tell. One case is a node group that scales up from zero. Another
|
|
734
|
+
is a set of nodes that need no image, such as an amd64 GPU group beside arm64 nodes. When you
|
|
735
|
+
set it, it replaces the default. It adds to nothing and removes from nothing. The kit releases
|
|
736
|
+
images for `linux/amd64` and `linux/arm64` only, so `jr2 up` refuses any other:
|
|
737
|
+
`` `platforms` names <platforms> — the kit releases images for linux/amd64, linux/arm64 and nothing else ``.
|
|
738
|
+
|
|
739
|
+
<a id="operator"></a>
|
|
740
|
+
|
|
741
|
+
## `operator`
|
|
742
|
+
|
|
743
|
+
- Type: `object`
|
|
744
|
+
- Required: no
|
|
745
|
+
|
|
746
|
+
Settings of the operator layer, for kit development.
|
|
747
|
+
|
|
748
|
+
<a id="operator-manage"></a>
|
|
749
|
+
|
|
750
|
+
### `operator.manage`
|
|
751
|
+
|
|
752
|
+
- Type: `boolean`
|
|
753
|
+
- Required: no
|
|
754
|
+
- Default: `true`
|
|
755
|
+
|
|
756
|
+
`false`: `jr2 up` does not converge the operator, and you run its controller yourself.
|