@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,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Install
|
|
3
|
+
description: Install the tools that jr2 needs and the jr2 CLI, and make a kind cluster on your computer.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Install
|
|
7
|
+
|
|
8
|
+
At the end of this page, you have the [jr2 CLI](../reference/glossary.md#jr2-cli) and a kind cluster on your computer.
|
|
9
|
+
The next pages use them to make an [Instance](../reference/glossary.md#instance) and run it.
|
|
10
|
+
|
|
11
|
+
## Before you start
|
|
12
|
+
|
|
13
|
+
This is the first page of the tutorial. You need a computer with these tools:
|
|
14
|
+
|
|
15
|
+
- [Node.js](https://nodejs.org/) 24 or later. Node.js includes npm.
|
|
16
|
+
- [Docker](https://docs.docker.com/get-started/get-docker/). Make sure that the Docker daemon runs.
|
|
17
|
+
- [kind](https://kind.sigs.k8s.io/docs/user/quick-start/#installation), which runs a Kubernetes cluster in Docker.
|
|
18
|
+
- [kubectl](https://kubernetes.io/docs/tasks/tools/), which speaks to the cluster.
|
|
19
|
+
|
|
20
|
+
kind makes the cluster from Docker containers. `jr2 up` builds an image with Docker and loads it into the kind cluster.
|
|
21
|
+
kubectl is the tool that `jr2 up`, `jr2 run` and the other commands use to speak to the cluster.
|
|
22
|
+
|
|
23
|
+
## Check Node.js
|
|
24
|
+
|
|
25
|
+
Run:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
node --version
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The version must be `v24` or later:
|
|
32
|
+
|
|
33
|
+
```text
|
|
34
|
+
v24.18.0
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Your version can be different.
|
|
38
|
+
|
|
39
|
+
## Install the jr2 CLI
|
|
40
|
+
|
|
41
|
+
Run:
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
npm i -g @jr2/cli
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
npm installs the `jr2` command and the `@jr2/orchestrator` package that it uses. npm prints its progress and a summary
|
|
48
|
+
of the packages that it added. This page does not show that output. The next step checks the install.
|
|
49
|
+
|
|
50
|
+
## Check the jr2 CLI
|
|
51
|
+
|
|
52
|
+
Run:
|
|
53
|
+
|
|
54
|
+
```sh
|
|
55
|
+
jr2 --version
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The CLI shows its version, its folder and the version of Node.js. Outside an Instance, it shows no Instance:
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
cli: <version> /tmp/jr2-dist/npm-global/lib/node_modules/@jr2/cli
|
|
62
|
+
instance: none — no jr2.config.ts walking up from cwd
|
|
63
|
+
node: v24.18.0
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
`<version>` is the version of jr2 that you installed, such as `0.4.1`. The folder is in the global folder of your npm,
|
|
67
|
+
so it can be different.
|
|
68
|
+
|
|
69
|
+
## Make the kind cluster
|
|
70
|
+
|
|
71
|
+
Run:
|
|
72
|
+
|
|
73
|
+
```sh
|
|
74
|
+
kind create cluster --name jr2
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
kind makes a cluster with one node. It sets your current kubectl context to the new cluster:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
Creating cluster "jr2" ...
|
|
81
|
+
…
|
|
82
|
+
Set kubectl context to "kind-jr2"
|
|
83
|
+
…
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The context of the cluster is `kind-jr2`. `jr2 up` converges into the current kubectl context, so the next pages use
|
|
87
|
+
this cluster.
|
|
88
|
+
|
|
89
|
+
## Check the Kubernetes version
|
|
90
|
+
|
|
91
|
+
Run:
|
|
92
|
+
|
|
93
|
+
```sh
|
|
94
|
+
kubectl version
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The `Server Version` must be `v1.35` or later:
|
|
98
|
+
|
|
99
|
+
```text
|
|
100
|
+
Client Version: v1.35.7
|
|
101
|
+
Kustomize Version: v5.7.1
|
|
102
|
+
Server Version: v1.36.1
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Your versions can be different. If the server version is earlier than `v1.35`, delete the cluster with
|
|
106
|
+
`kind delete cluster --name jr2`. Then install a newer kind release. Make the cluster again. `jr2 up` refuses an older
|
|
107
|
+
cluster with this message, where `<server version>` is the `Server Version` of the cluster:
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
refusing: kind-jr2 runs Kubernetes <server version>; jr2 needs Kubernetes 1.35 or newer (every Sandbox mounts jr2's runtime as an image volume, ADR-0037). Nothing was applied.
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## What happened
|
|
114
|
+
|
|
115
|
+
You installed the jr2 CLI globally. It is the command that you use for each step of this tutorial. Each Instance also
|
|
116
|
+
installs its own copy of `@jr2/cli`. In an Instance folder, the global `jr2` gives the command to that copy. Thus the
|
|
117
|
+
version that runs is the version that the Instance pins. The glossary calls this a
|
|
118
|
+
[Handoff](../reference/glossary.md#handoff).
|
|
119
|
+
|
|
120
|
+
You also made a kind cluster. jr2 needs no setup in the cluster other than Kubernetes 1.35 or later. `jr2 up` puts in it
|
|
121
|
+
all that an Instance needs. [Converge](../concepts/converge.md) explains what `jr2 up` makes. The
|
|
122
|
+
[CLI reference](../reference/cli.md) gives each command and its options.
|
|
123
|
+
|
|
124
|
+
## Next
|
|
125
|
+
|
|
126
|
+
[Create an Instance](create-an-instance.md).
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Add tools to the Sandbox
|
|
3
|
+
description: Put the programs that your Agents use into the Sandbox Image, or run a service in a User Container.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Add tools to the Sandbox
|
|
7
|
+
|
|
8
|
+
Put the programs that your [Agents](../reference/glossary.md#agent) and
|
|
9
|
+
[`command`](../reference/authoring-surface/command.md) [Effects](../reference/glossary.md#effect) use into the
|
|
10
|
+
[Sandbox Image](../reference/glossary.md#sandbox-image).
|
|
11
|
+
|
|
12
|
+
A [Workspace](../reference/glossary.md#workspace) runs its body in a [Sandbox](../reference/glossary.md#sandbox): a pod
|
|
13
|
+
of its own. The Sandbox Image is the image of the pod's `harness` container. The Agent's
|
|
14
|
+
[Working tools](../reference/glossary.md#working-tools) run in that container, and so do the `command` Effects and the
|
|
15
|
+
shell that you get with `kubectl exec`. Thus a program that is in the image is a program that they can run.
|
|
16
|
+
|
|
17
|
+
Use this table to choose:
|
|
18
|
+
|
|
19
|
+
| You want | Do this |
|
|
20
|
+
| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
|
|
21
|
+
| The same tools for each Workspace | Change `images/default/Dockerfile`. |
|
|
22
|
+
| Different tools for the Workspaces of one file | Put a docker context beside the workflow module, and name it in the `image` option. |
|
|
23
|
+
| An image that you build and push yourself | Write its registry ref in the `image` option. |
|
|
24
|
+
| A service that runs beside the Agent | Name its image in the `user` option. It runs in the [User Container](../reference/glossary.md#user-container). |
|
|
25
|
+
|
|
26
|
+
## Add a tool to the default image
|
|
27
|
+
|
|
28
|
+
`jr2 init` writes `images/default/Dockerfile`. Each Workspace that names no `image` in
|
|
29
|
+
[`workspace()`](../reference/authoring-surface/workspace.md) uses it. This example adds pnpm to the file that `jr2 init`
|
|
30
|
+
wrote:
|
|
31
|
+
|
|
32
|
+
```dockerfile
|
|
33
|
+
FROM node:24-slim
|
|
34
|
+
|
|
35
|
+
RUN apt-get update \
|
|
36
|
+
&& apt-get install -y --no-install-recommends git ca-certificates \
|
|
37
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
38
|
+
|
|
39
|
+
# Your agents' toolchain goes here — compilers, CLIs, language servers, dotfiles.
|
|
40
|
+
|
|
41
|
+
# pnpm on the system PATH, at a fixed version, so that each Sandbox gets the same pnpm.
|
|
42
|
+
RUN npm install -g pnpm@10.9.0
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The example does not show the comments at the start of the file. Keep them in your file.
|
|
46
|
+
|
|
47
|
+
Install a tool at a fixed version, as the example does. Then each build of the image gets the same version.
|
|
48
|
+
|
|
49
|
+
Run [`jr2 up`](../reference/cli.md#up). It builds the image. Then it loads the image into kind, or pushes it to the
|
|
50
|
+
[`registry`](../reference/config.md#registry) of `jr2.config.ts`:
|
|
51
|
+
|
|
52
|
+
```sh
|
|
53
|
+
jr2 up
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
…
|
|
58
|
+
sandbox image "default": building jr2-sandbox-my-instance-default:fce23ddc3cce-amd64
|
|
59
|
+
no USER declared — the pod's uid-1000 fallback applies
|
|
60
|
+
kind load → cluster "jr2"
|
|
61
|
+
…
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
- The tag is the hash of the files in the folder, then the architecture of the nodes. Your hash is different. A change
|
|
65
|
+
to a file in the folder changes it. The architecture is such as `amd64`.
|
|
66
|
+
- On kind, `jr2 up` loads the image into the cluster. The next line names the cluster.
|
|
67
|
+
- When no file in the folder changed, `jr2 up` does not build the image again. The line then ends with
|
|
68
|
+
`(fresh — build skipped; --force to rebuild anyway)`.
|
|
69
|
+
- `jr2 up` builds the Sandbox Images only when a registered [Machine](../reference/glossary.md#machine) has a
|
|
70
|
+
`workspace()`. Otherwise it prints `sandbox images: skipped (no registered Machine composes a Sandbox)`.
|
|
71
|
+
|
|
72
|
+
A Sandbox that runs now keeps its image. The next Sandbox gets the new image. `jr2 up` removes the old image at the end
|
|
73
|
+
of a later converge, when no Sandbox uses it. On a kind node, it keeps the old image for one more converge. It does not
|
|
74
|
+
remove an image from a registry. [`jr2 gc`](../reference/cli.md#gc) does the same work when you ask for it (see
|
|
75
|
+
[Clean up](clean-up.md)).
|
|
76
|
+
|
|
77
|
+
To see the tool, open a shell in a Sandbox (see [Look inside a Sandbox](look-inside-a-sandbox.md)), and run it:
|
|
78
|
+
|
|
79
|
+
```sh
|
|
80
|
+
pnpm --version
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
10.9.0
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## What the image must have
|
|
88
|
+
|
|
89
|
+
The image is yours. jr2 adds no layer to it, and does not read the Dockerfile. When the pod starts, jr2 mounts its own
|
|
90
|
+
runtime at `/opt/jr2`, and starts the [Harness](../reference/glossary.md#harness) from there. Thus:
|
|
91
|
+
|
|
92
|
+
- The `ENTRYPOINT` and the `CMD` of the image do not run. To run a process all the time, use a User Container (see
|
|
93
|
+
[Run a service beside the Agent](#run-a-service-beside-the-agent)).
|
|
94
|
+
- jr2 adds `/opt/jr2/bin` at the end of `PATH`. Thus a tool of the same name in your image comes first.
|
|
95
|
+
- The `USER` and the `HOME` of the image stay as you set them. When an image that `jr2 up` built sets no `USER`, the pod
|
|
96
|
+
runs as uid 1000, with `HOME=/home/jr2`.
|
|
97
|
+
|
|
98
|
+
The image must have these, or the Sandbox does not start:
|
|
99
|
+
|
|
100
|
+
- A glibc base no older than the glibc of jr2's node, such as a current Debian or Ubuntu. An Alpine base has musl, and
|
|
101
|
+
jr2's runtime does not run on it.
|
|
102
|
+
- `git` on the system `PATH`. The Harness clones, makes the [Worktrees](../reference/glossary.md#worktree) and commits
|
|
103
|
+
with it.
|
|
104
|
+
- A `HOME` that the image's `USER` can write.
|
|
105
|
+
- A `USER` that is a number and is not `0`, such as `USER 1000`. An image that `jr2 up` builds can also have no `USER`.
|
|
106
|
+
The `harness` container does not run as root.
|
|
107
|
+
- Nothing at `/opt/jr2` or `/work`, and nothing that listens on port `8080`.
|
|
108
|
+
|
|
109
|
+
The image does not need a git author. When the image sets none, a commit in the `harness` container has the author
|
|
110
|
+
`jr2 Agent <agent@jr2.invalid>`. jr2 puts this default at git's system level, under the image's own `/etc/gitconfig`, so
|
|
111
|
+
each git author that the image sets is used in its place: in `/etc/gitconfig`, in the `HOME` of its `USER`, or in
|
|
112
|
+
`GIT_AUTHOR_NAME` and `GIT_AUTHOR_EMAIL`. When the image sets `GIT_CONFIG_SYSTEM` or `GIT_CONFIG_NOSYSTEM`, or its git
|
|
113
|
+
reads another system file than `/etc/gitconfig`, jr2 does not set the default.
|
|
114
|
+
|
|
115
|
+
Before the Harness starts, a `preflight` step in the pod checks the image. When the check fails, the run faults. Read
|
|
116
|
+
the log of the step with `kubectl -n <namespace> logs <sandbox> -c preflight`. `<namespace>` is the namespace of the
|
|
117
|
+
Instance, such as `my-instance`. [Look inside a Sandbox](look-inside-a-sandbox.md) tells how to find `<sandbox>`.
|
|
118
|
+
|
|
119
|
+
## Give one Workflow its own image
|
|
120
|
+
|
|
121
|
+
Put a docker context in a folder beside the workflow module. Name the folder in the `image` option of `workspace()`. In
|
|
122
|
+
this example, `workflows/pytest.ts` runs the tests of a Python [Repo](../reference/glossary.md#repo), with the image in
|
|
123
|
+
`workflows/python/`:
|
|
124
|
+
|
|
125
|
+
```dockerfile
|
|
126
|
+
# A Sandbox Image for a Python project. The build context is this folder.
|
|
127
|
+
FROM python:3.13-slim
|
|
128
|
+
|
|
129
|
+
# git is part of the floor: the Harness clones, makes the Worktrees and commits with it.
|
|
130
|
+
RUN apt-get update \
|
|
131
|
+
&& apt-get install -y --no-install-recommends git ca-certificates \
|
|
132
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
133
|
+
|
|
134
|
+
# The tools of the project.
|
|
135
|
+
RUN pip install --no-cache-dir pytest ruff
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
import { z } from "zod";
|
|
140
|
+
import { command, fail, jr2Setup, workspace, type Workspaced } from "@jr2/orchestrator";
|
|
141
|
+
|
|
142
|
+
const runInput = z.object({ branch: z.string() });
|
|
143
|
+
type BodyInput = Workspaced<z.infer<typeof runInput>, "app">;
|
|
144
|
+
|
|
145
|
+
const body = jr2Setup({
|
|
146
|
+
types: {} as { input: BodyInput },
|
|
147
|
+
actors: {
|
|
148
|
+
// python and pytest come from the Sandbox Image in ./python.
|
|
149
|
+
tests: command(["python", "-m", "pytest"], { timeout: "15m" }),
|
|
150
|
+
fail: fail(),
|
|
151
|
+
},
|
|
152
|
+
}).createMachine({
|
|
153
|
+
id: "pytest",
|
|
154
|
+
on: { "workspace.lost": ".lost" },
|
|
155
|
+
initial: "testing",
|
|
156
|
+
states: {
|
|
157
|
+
testing: {
|
|
158
|
+
invoke: {
|
|
159
|
+
src: "tests",
|
|
160
|
+
onDone: [
|
|
161
|
+
{
|
|
162
|
+
guard: ({ event }) => event.output.outcome === "exited" && event.output.code === 0,
|
|
163
|
+
target: "passed",
|
|
164
|
+
},
|
|
165
|
+
{ target: "failed" },
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
passed: { type: "final" },
|
|
170
|
+
// Not final states: each one fails the run, and the run ends `failed`.
|
|
171
|
+
failed: { invoke: { src: "fail", input: { reason: "pytest did not pass" } } },
|
|
172
|
+
lost: { invoke: { src: "fail", input: { reason: "the Sandbox was lost" } } },
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
export const machine = workspace(body, {
|
|
177
|
+
input: runInput,
|
|
178
|
+
// The docker context in the folder beside this file. jr2 up builds it.
|
|
179
|
+
image: import.meta.resolve("./python"),
|
|
180
|
+
repos: { app: "https://github.com/you/app.git" },
|
|
181
|
+
spec: ({ input }) => ({ branch: input.branch }),
|
|
182
|
+
});
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
- `import.meta.resolve("./python")` gives a `file:` URL to the folder. The folder is the build context. A `COPY` in the
|
|
186
|
+
Dockerfile reads from it.
|
|
187
|
+
- jr2 reads only the `.ts` files in `workflows/` as [Workflows](../reference/glossary.md#workflow). A folder there is
|
|
188
|
+
not a Workflow.
|
|
189
|
+
- An Agent in the body gets the same tools. Its Working tools run in the same container as the `command`.
|
|
190
|
+
- `jr2 up` finds the folder from the registered Machines, and builds it. Its line is
|
|
191
|
+
`sandbox image "python": building jr2-sandbox-my-instance-python:<hash>-<arch>`. The name of the folder is the name in
|
|
192
|
+
the tag.
|
|
193
|
+
|
|
194
|
+
A Machine that you register from a package, such as `task` from [`@jr2/machines`](../reference/machines.md), takes an
|
|
195
|
+
image from [`customize()`](../reference/authoring-surface/customize.md): `customize(task, { image })`. The value has the
|
|
196
|
+
same two forms, and it replaces the image of the Machine's `workspace()`. See
|
|
197
|
+
[Bind a shipped Machine's Open parts](bind-open-parts.md).
|
|
198
|
+
|
|
199
|
+
A Machine that you publish as an npm package carries its docker context in the package. See
|
|
200
|
+
[Publish a Machine as an npm package](publish-a-machine-as-an-npm-package.md).
|
|
201
|
+
|
|
202
|
+
## Use an image from a registry
|
|
203
|
+
|
|
204
|
+
When you build and push the image yourself, write its ref in place of the `file:` URL:
|
|
205
|
+
`image: "registry.example.com/python-sandbox:1.0"`. A value that does not start with `file:` is a registry ref.
|
|
206
|
+
|
|
207
|
+
- jr2 does not build the image, does not read it, and does not remove it.
|
|
208
|
+
- The nodes of the cluster pull it. jr2 gives the pod no pull credential.
|
|
209
|
+
- The image must be for the architecture of the nodes.
|
|
210
|
+
- The image must have each item in [What the image must have](#what-the-image-must-have). jr2 does not supply uid 1000
|
|
211
|
+
for a registry image: an image with no `USER` runs as root, and the pod does not start.
|
|
212
|
+
- For each change, push a new tag. Then change the `image` value to the new tag. A node that has a tag does not pull it
|
|
213
|
+
again, unless the tag is `latest`.
|
|
214
|
+
|
|
215
|
+
## Run a service beside the Agent
|
|
216
|
+
|
|
217
|
+
The User Container is a third container in the Sandbox pod. Use it for a process that must run without an Agent, such as
|
|
218
|
+
an sshd for a person. This image gives a person a shell beside the Agent:
|
|
219
|
+
|
|
220
|
+
```dockerfile
|
|
221
|
+
# A User Container: a shell for a person, beside the Agent, on the same Worktrees.
|
|
222
|
+
FROM alpine:3.21
|
|
223
|
+
|
|
224
|
+
RUN apk add --no-cache git
|
|
225
|
+
|
|
226
|
+
# The Worktrees under /work belong to a different user. Tell git to trust them.
|
|
227
|
+
RUN git config --system --add safe.directory '*'
|
|
228
|
+
|
|
229
|
+
# jr2 does not replace this command. It must keep running: when it ends, the pod is not ready.
|
|
230
|
+
CMD ["sh", "-c", "while true; do sleep 3600; done"]
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Save it as `workflows/shell/Dockerfile`. Name it in the `workspace()` options with
|
|
234
|
+
`user: import.meta.resolve("./shell")`. `user` takes the same two forms as `image`, and `jr2 up` builds a `file:`
|
|
235
|
+
context in the same way. Open the shell with `kubectl -n <namespace> exec -it <sandbox> -c user -- sh`.
|
|
236
|
+
|
|
237
|
+
The User Container is not a second Sandbox Image:
|
|
238
|
+
|
|
239
|
+
- Its own `ENTRYPOINT` and `CMD` run. Its process must keep running: when it ends, the pod is not ready.
|
|
240
|
+
- jr2 gives it `/work`, which it can write, and `/repos` and `/opt/jr2`, which it can only read. jr2 gives it no other
|
|
241
|
+
mount, no environment variable and no command.
|
|
242
|
+
- It has no floor: an Alpine base is correct here. It runs as the `USER` of its image, and root is permitted.
|
|
243
|
+
- Its user can be different from the user that owns the Worktrees, for example root. Thus an image that runs git needs
|
|
244
|
+
`git config --system --add safe.directory '*'`, as the example has.
|
|
245
|
+
- The pod has one network. The User Container cannot listen on the ports of jr2's containers: `8080`, `8082` and
|
|
246
|
+
`15021`, and `8081` and `15001` on loopback.
|
|
247
|
+
- To give it a part of the [Size](../reference/glossary.md#size), write `user: { image, resources }`. See
|
|
248
|
+
[Size a Workspace](size-a-workspace.md).
|
|
249
|
+
|
|
250
|
+
A `push`, an `http` Effect whose body is a Worktree file, and a `command` that names an Effect secret run in a different
|
|
251
|
+
container, the [Sandbox Effector](../reference/glossary.md#sandbox-effector). By default it uses the Sandbox Image. The
|
|
252
|
+
`effector` option gives it an image of its own. See
|
|
253
|
+
[Run a command or call a URL with an Effect](run-a-command-or-call-a-url.md) and
|
|
254
|
+
[Push and sign a branch](push-and-sign-a-branch.md).
|
|
255
|
+
|
|
256
|
+
## Rules
|
|
257
|
+
|
|
258
|
+
- `workspace()` refuses an `image` that is empty or not a string:
|
|
259
|
+
``workspace(): `image` must be a non-empty string (got <value>) — either a `file:` URL to a docker context this module ships (`import.meta.resolve("./image")`) or a registry ref (ADR-0037).``
|
|
260
|
+
- `workspace()` and `customize()` refuse a `user` that is not an image or `{ image, resources? }`. `<where>` is
|
|
261
|
+
`workspace()` or `customize()`:
|
|
262
|
+
``<where>: `user` must be a non-empty string (an image), or { image, resources? } (got <value>) — either a `file:` URL to a docker context this module ships (`import.meta.resolve("./image")`) or a registry ref (ADR-0037, ADR-0060).``
|
|
263
|
+
and `<where>: user.<key> is not accepted — the User Container is { image, resources? } (ADR-0005, ADR-0060)`.
|
|
264
|
+
- `customize()` refuses `image` or `user` for a Machine that has no `workspace()`:
|
|
265
|
+
``customize(): `image`/`user` say what a SANDBOX is made of, how big it is and which Repos it attaches, and machine "<id>" composes none — only a workspace() wrapper carries those seats, that Size and those slots (ADR-0049, ADR-0037, ADR-0051, ADR-0060).``
|
|
266
|
+
- `jr2 up` refuses a `file:` URL to a folder that does not exist. `<path>` is the folder:
|
|
267
|
+
``the Sandbox Image context <path> cannot be read (<code>) — a `workspace()` names its image with `import.meta.resolve("./<dir>")`, so that directory must exist beside the Machine's own module (ADR-0037/0049).``
|
|
268
|
+
- `jr2 up` refuses an `images/default` folder that has no `Dockerfile`:
|
|
269
|
+
``the Instance's `images/default` has no Dockerfile (<path>) — that directory IS a build context (ADR-0037), and it is the Sandbox Image every `workspace()` that names none falls back to.``
|
|
270
|
+
- An image that `jr2 up` built, with a `USER` that is not a number or is `0`, faults the run before the pod is made.
|
|
271
|
+
`<image>` is the `image` value, or `default`:
|
|
272
|
+
``the Sandbox Image "<image>" declares `USER <user>`, which cannot run a jr2 seat: every jr2-owned container is `runAsNonRoot` with no `runAsUser`, so the kubelet needs a NUMERIC non-zero uid it can check without reading the image (ADR-0005). Change the Dockerfile's last `USER` to that uid (e.g. `USER 1000`, or drop the line entirely and jr2 supplies uid 1000 with a writable HOME — ADR-0037), then re-run `jr2 up`.``
|
|
273
|
+
- A registry image that runs as root faults the run. The text starts with
|
|
274
|
+
`Sandbox "<sandbox>" cannot start: its image runs as ROOT, and every jr2-owned seat is hardened with runAsNonRoot (ADR-0005).`
|
|
275
|
+
- An image that does not have the floor stops the `preflight` step. Its log says:
|
|
276
|
+
`jr2: this Sandbox Image does not meet the floor (ADR-0037): a glibc base no older than jr2's node (musl is out entirely), git on the system PATH, a writable HOME for the image's USER, and /opt/jr2 + /work + :8080 unclaimed. jr2 vendors the rest.`
|
|
277
|
+
The run faults with a text that starts with
|
|
278
|
+
``Sandbox "<sandbox>" never reached Ready (last phase: <phase>) — if its Sandbox Image is new, check the preflight: `kubectl logs <sandbox> -c preflight` ``.
|
|
279
|
+
- The [Orchestrator](../reference/glossary.md#orchestrator) refuses a `file:` image that the last `jr2 up` did not
|
|
280
|
+
build. Run `jr2 up` again:
|
|
281
|
+
``no Sandbox Image for <url> (context digest <digest>) — this instance's last converge built <n> image(s), none of them this one. Re-run `jr2 up`: it walks the registered Machines and builds every `file:` context they carry (ADR-0037/0049).``
|
|
282
|
+
|
|
283
|
+
## Read next
|
|
284
|
+
|
|
285
|
+
- [Workspaces](../concepts/workspaces.md): the pod, the Sandbox Image and the User Container.
|
|
286
|
+
- [Converge](../concepts/converge.md): how `jr2 up` builds and loads the images.
|
|
287
|
+
- [Look inside a Sandbox](look-inside-a-sandbox.md)
|
|
288
|
+
- Reference: [`workspace`](../reference/authoring-surface/workspace.md),
|
|
289
|
+
[`SandboxOptions`](../reference/authoring-surface/type-sandboxoptions.md),
|
|
290
|
+
[`UserContainer`](../reference/authoring-surface/type-usercontainer.md), [`jr2 up`](../reference/cli.md#up)
|
|
291
|
+
- [ADR-0037](../reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md): the Instance
|
|
292
|
+
builds its Sandbox Images, and jr2 injects the Harness.
|
|
293
|
+
- [ADR-0005](../reference/decisions/0005-sandbox-pod-composition.md): the containers of the Sandbox pod.
|
|
294
|
+
- [ADR-0049](../reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md): a Machine carries its
|
|
295
|
+
images.
|