@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
package/src/images.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// The resolved key→ref image map, from the READ side (ADR-0037/0038/0049). `jr2 up` builds every
|
|
2
2
|
// image it deploys and writes this map into the `jr2-images` ConfigMap; the Sandbox port consults it
|
|
3
3
|
// when it creates a pod. This module is the shape both sides agree on — deliberately its own file,
|
|
4
|
-
// not folded into sandbox-
|
|
4
|
+
// not folded into sandbox-kube.ts, because the CLI needs the type without dragging in the
|
|
5
5
|
// kubectl port.
|
|
6
6
|
//
|
|
7
7
|
// The map is NESTED, never flat. The kit's own `harness` and the `custodian` sit beside a `sandbox`
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
//
|
|
11
11
|
// A user image's key is its build context's CONTENT DIGEST (ADR-0049). That is what lets the two
|
|
12
12
|
// sides agree without a path table: a Machine names its context as a `file:` URL, whose absolute
|
|
13
|
-
// path differs between the host at `jr2 up` and the
|
|
14
|
-
// folder — the
|
|
13
|
+
// path differs between the host at `jr2 up` and the Orchestrator Kit image, while the FOLDER is the
|
|
14
|
+
// same folder — the published Assembly's `node_modules` holds the very tree the converge hashed. Digest in, digest
|
|
15
15
|
// out, no dirname registry in between.
|
|
16
16
|
//
|
|
17
17
|
// There is NO cache and NO memo for the map itself. The whole reason it arrives as a mounted
|
|
@@ -24,6 +24,7 @@ import { createHash } from "node:crypto";
|
|
|
24
24
|
import { readdir, readFile } from "node:fs/promises";
|
|
25
25
|
import { join, relative } from "node:path";
|
|
26
26
|
import { fileURLToPath } from "node:url";
|
|
27
|
+
import { byteOrder } from "./content-hash.ts";
|
|
27
28
|
|
|
28
29
|
/**
|
|
29
30
|
* Every image ref one converge resolved. `harness` is the kit's own (built from a kit checkout, or
|
|
@@ -143,7 +144,8 @@ export function isImageContext(image: string): boolean {
|
|
|
143
144
|
* nothing else (ADR-0037/0038).
|
|
144
145
|
*
|
|
145
146
|
* It lives HERE, not in the CLI's build module, because BOTH sides compute it: `jr2 up` keys the
|
|
146
|
-
* map it publishes by this digest, and the
|
|
147
|
+
* map it publishes by this digest, and the Orchestrator computes it again at provision, over the
|
|
148
|
+
* published Assembly, to
|
|
147
149
|
* look the ref up. One implementation is what makes "the host and the pod agree without a path
|
|
148
150
|
* table" true rather than hopeful (ADR-0049).
|
|
149
151
|
*
|
|
@@ -156,12 +158,11 @@ export function isImageContext(image: string): boolean {
|
|
|
156
158
|
export async function imageContextDigest(dir: string): Promise<string> {
|
|
157
159
|
const h = createHash("sha256");
|
|
158
160
|
// A domain separator, and the whole of it: a Sandbox Image's build is `docker build` of the
|
|
159
|
-
// user's own directory with no generated text anywhere in it, so
|
|
160
|
-
//
|
|
161
|
-
// WITH. The constant only keeps this hash's domain apart from the bundle's.
|
|
161
|
+
// user's own directory with no generated text anywhere in it, so there is nothing to salt WITH.
|
|
162
|
+
// The constant only keeps this hash's domain apart from the Assembly's.
|
|
162
163
|
h.update("salt:sandbox\n");
|
|
163
164
|
const walk = async (root: string, d: string): Promise<void> => {
|
|
164
|
-
const entries = (await readdir(d, { withFileTypes: true })).sort((a, b) => a.name
|
|
165
|
+
const entries = (await readdir(d, { withFileTypes: true })).sort((a, b) => byteOrder(a.name, b.name));
|
|
165
166
|
for (const e of entries) {
|
|
166
167
|
const p = join(d, e.name);
|
|
167
168
|
if (e.isDirectory()) await walk(root, p);
|
|
@@ -182,7 +183,7 @@ export async function imageContextDigest(dir: string): Promise<string> {
|
|
|
182
183
|
* own key and is never looked up. Absent is the reserved `default` key — ADR-0037's middle leg.
|
|
183
184
|
*
|
|
184
185
|
* A context whose folder is unreadable fails HERE, before a Secret or a CR exists, naming the path:
|
|
185
|
-
* in a deployed Orchestrator that means the module shipped a context the
|
|
186
|
+
* in a deployed Orchestrator that means the module shipped a context the current Assembly does not
|
|
186
187
|
* hold, which is a packaging bug and not a cluster one.
|
|
187
188
|
*/
|
|
188
189
|
async function imageKey(image: string): Promise<string> {
|
|
@@ -194,7 +195,7 @@ async function imageKey(image: string): Promise<string> {
|
|
|
194
195
|
throw new Error(
|
|
195
196
|
`the Sandbox Image context ${image} cannot be read (${(err as NodeJS.ErrnoException).code ?? "read failed"}) — ` +
|
|
196
197
|
"a `file:` image names a docker context the Machine's own module ships (ADR-0037), so it must travel " +
|
|
197
|
-
`with the module: check that ${dir} exists in the
|
|
198
|
+
`with the module: check that ${dir} exists in the current Assembly.`,
|
|
198
199
|
);
|
|
199
200
|
}
|
|
200
201
|
}
|
|
@@ -227,13 +228,14 @@ export type ResolvedImage = {
|
|
|
227
228
|
* cannot prove is non-root because it does not read the image's `/etc/passwd`, and uid 0
|
|
228
229
|
* (`USER root`, `USER 0`), which plainly is root.
|
|
229
230
|
*
|
|
230
|
-
* Both surface as CreateContainerConfigError on the
|
|
231
|
+
* Both surface as CreateContainerConfigError on the init step that runs the image — the
|
|
231
232
|
* preflight — and that container never starts, so `kubectl logs -c preflight` prints nothing. The
|
|
232
233
|
* record is the one place that can see it coming: `docker inspect` at converge already put the
|
|
233
234
|
* string in the map, so the provision can fail BEFORE it applies anything. Only a BUILT image is
|
|
234
|
-
* knowable here; a registry ref was never inspected, so it answers undefined and that pod
|
|
235
|
-
*
|
|
236
|
-
*
|
|
235
|
+
* knowable here; a registry ref was never inspected, so it answers undefined and that pod runs
|
|
236
|
+
* out the provision's Ready budget, whose message names the numeric non-root `USER` among the
|
|
237
|
+
* floor's causes (sandbox-kube.ts). The Orchestrator reads no Pod (ADR-0063), so the kubelet's
|
|
238
|
+
* waiting reason is not visible to it.
|
|
237
239
|
*/
|
|
238
240
|
refusedUser?: string;
|
|
239
241
|
};
|
|
@@ -249,6 +251,14 @@ function judgeUser(recorded: string | undefined): Pick<ResolvedImage, "fallbackS
|
|
|
249
251
|
return { fallbackSeat: false };
|
|
250
252
|
}
|
|
251
253
|
|
|
254
|
+
/**
|
|
255
|
+
* The run a provision resolves images for, when it holds an Assembly that is not the current one
|
|
256
|
+
* (ADR-0069). The image map holds the current walk's contexts only, so a held run whose context the
|
|
257
|
+
* current Assembly dropped cannot provision, and `jr2 up` cannot fix it: the error must say which
|
|
258
|
+
* case it is.
|
|
259
|
+
*/
|
|
260
|
+
export type HeldImageScope = { runId: string; assembly: string; current: string | undefined };
|
|
261
|
+
|
|
252
262
|
/**
|
|
253
263
|
* Look one built key up in the map this converge wrote — for the Sandbox Image and the User
|
|
254
264
|
* Container alike, because ADR-0005 gives the User Container "the same resolution" deliberately.
|
|
@@ -256,15 +266,27 @@ function judgeUser(recorded: string | undefined): Pick<ResolvedImage, "fallbackS
|
|
|
256
266
|
* An unknown key throws: a converge-time check is impossible for a ref and unnecessary for a
|
|
257
267
|
* context (the walk built every one it found), so this fires when the Orchestrator's own
|
|
258
268
|
* `node_modules` holds a context the LAST converge did not build — a stale deployment. The error
|
|
259
|
-
* says exactly that, because "re-run `jr2 up`" is the
|
|
269
|
+
* says exactly that, because "re-run `jr2 up`" is the fix. It also fires for a run under a held
|
|
270
|
+
* Assembly (ADR-0069) whose context the current walk no longer carries, which `jr2 up` cannot fix.
|
|
271
|
+
* With `held`, the error names that case alone: the run, the held Assembly and the current one.
|
|
260
272
|
*/
|
|
261
|
-
function builtRef(refs: ImageRefs, key: string, image: string, what: string): string {
|
|
273
|
+
function builtRef(refs: ImageRefs, key: string, image: string, what: string, held?: HeldImageScope): string {
|
|
262
274
|
const ref = refs.sandbox[key];
|
|
263
275
|
if (ref === undefined) {
|
|
276
|
+
if (held) {
|
|
277
|
+
throw new Error(
|
|
278
|
+
`no ${what} for ${image} (context digest ${key}) — run ${held.runId} is under the held Assembly ` +
|
|
279
|
+
`${held.assembly}, whose context ${key} the current Assembly ${held.current ?? "(none)"} does not ` +
|
|
280
|
+
"carry. The image map holds the current Assembly's contexts only, so `jr2 up` does not fix this: " +
|
|
281
|
+
"publish an Assembly that names the context again, or cancel the run (ADR-0069).",
|
|
282
|
+
);
|
|
283
|
+
}
|
|
264
284
|
throw new Error(
|
|
265
285
|
`no ${what} for ${image} (context digest ${key}) — this instance's last converge built ` +
|
|
266
286
|
`${Object.keys(refs.sandbox).length} image(s), none of them this one. Re-run \`jr2 up\`: it walks the ` +
|
|
267
|
-
"registered Machines and builds every `file:` context they carry (ADR-0037/0049)."
|
|
287
|
+
"registered Machines and builds every `file:` context they carry (ADR-0037/0049). A run under a held " +
|
|
288
|
+
"Assembly (ADR-0069) whose context the current Assembly no longer carries is the one case it does not " +
|
|
289
|
+
"fix: the map holds the current walk's contexts only.",
|
|
268
290
|
);
|
|
269
291
|
}
|
|
270
292
|
return ref;
|
|
@@ -280,7 +302,11 @@ function builtRef(refs: ImageRefs, key: string, image: string, what: string): st
|
|
|
280
302
|
* look up and nothing to say about its tag discipline — the cluster pulls it, and nothing was
|
|
281
303
|
* inspected, so no seat fact is known.
|
|
282
304
|
*/
|
|
283
|
-
export async function resolveSandboxImage(
|
|
305
|
+
export async function resolveSandboxImage(
|
|
306
|
+
refs: ImageRefs,
|
|
307
|
+
image?: string,
|
|
308
|
+
held?: HeldImageScope,
|
|
309
|
+
): Promise<ResolvedImage> {
|
|
284
310
|
if (image === undefined) {
|
|
285
311
|
const ref = refs.sandbox["default"];
|
|
286
312
|
if (ref === undefined) return { ref: refs.harness, fallbackSeat: false };
|
|
@@ -288,7 +314,7 @@ export async function resolveSandboxImage(refs: ImageRefs, image?: string): Prom
|
|
|
288
314
|
}
|
|
289
315
|
if (!isImageContext(image)) return { ref: image, fallbackSeat: false };
|
|
290
316
|
const key = await imageKey(image);
|
|
291
|
-
return { ref: builtRef(refs, key, image, "Sandbox Image"), ...judgeUser(refs.sandboxUser?.[key]) };
|
|
317
|
+
return { ref: builtRef(refs, key, image, "Sandbox Image", held), ...judgeUser(refs.sandboxUser?.[key]) };
|
|
292
318
|
}
|
|
293
319
|
|
|
294
320
|
/**
|
|
@@ -298,7 +324,7 @@ export async function resolveSandboxImage(refs: ImageRefs, image?: string): Prom
|
|
|
298
324
|
* the one place ADR-0005 promises none. Its `USER` is not judged either: the seat carries no
|
|
299
325
|
* `securityContext` at all, so root is allowed there.
|
|
300
326
|
*/
|
|
301
|
-
export async function resolveUserImage(refs: ImageRefs, image: string): Promise<string> {
|
|
327
|
+
export async function resolveUserImage(refs: ImageRefs, image: string, held?: HeldImageScope): Promise<string> {
|
|
302
328
|
if (!isImageContext(image)) return image;
|
|
303
|
-
return builtRef(refs, await imageKey(image), image, "User Container image");
|
|
329
|
+
return builtRef(refs, await imageKey(image), image, "User Container image", held);
|
|
304
330
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,44 +1,63 @@
|
|
|
1
|
-
// @jr2/orchestrator — the
|
|
2
|
-
//
|
|
3
|
-
// (
|
|
1
|
+
// @jr2/orchestrator — the Authoring surface (GLOSSARY.md): the names an author writes in a
|
|
2
|
+
// workflow module or in `jr2.config.ts`, and no other name. A name is here when an author writes
|
|
3
|
+
// it; a name an author only meets through inference (a jr2Setup event union, a gate's input, a
|
|
4
|
+
// pick's Frame) stays internal. A workflow authors against ONE package — `defineEvent`,
|
|
5
|
+
// `jr2Setup`, `workspace`, … all import from "@jr2/orchestrator" (ADR-0015) — and an Assistant that
|
|
6
|
+
// reads this file reads the whole of what it may write.
|
|
4
7
|
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
//
|
|
11
|
-
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
export
|
|
23
|
-
export
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
export
|
|
27
|
-
export
|
|
28
|
-
export
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
export
|
|
33
|
-
export
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
export type {
|
|
37
|
-
export
|
|
38
|
-
export
|
|
39
|
-
export
|
|
40
|
-
export
|
|
41
|
-
export
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
8
|
+
// Named re-exports only, never `export *`: each name below is a decision, and
|
|
9
|
+
// test/authoring-surface.test.ts pins the list. The kit's own packages (the CLI, the e2e suite,
|
|
10
|
+
// the Harness's tests) import "@jr2/orchestrator/internal", which holds everything here and the
|
|
11
|
+
// runtime besides.
|
|
12
|
+
|
|
13
|
+
// Machine and events: the setup a workflow writes its Machine with, the events its parties send,
|
|
14
|
+
// and the guard that makes a writing decline other senders (ADR-0011, ADR-0015).
|
|
15
|
+
export { defineEvent } from "@jr2/agent-protocol";
|
|
16
|
+
export { jr2Setup } from "./setup.ts";
|
|
17
|
+
export { sentBy } from "./party.ts";
|
|
18
|
+
export type { HostInjectedInput } from "./vocabulary.ts";
|
|
19
|
+
|
|
20
|
+
// Failure: the Part a Machine invokes to fail its run, and the guard that tells a Failure from a
|
|
21
|
+
// defect in an `onError` (ADR-0073).
|
|
22
|
+
export { fail, isFailure } from "./fail.ts";
|
|
23
|
+
|
|
24
|
+
// Agents: an Agent slot and the definition it carries (ADR-0028, ADR-0049).
|
|
25
|
+
export { agent } from "./harness-client.ts";
|
|
26
|
+
export type { AgentDefinition, ThinkingLevel } from "./agent.ts";
|
|
27
|
+
|
|
28
|
+
// Workspaces and Repos: a Sandbox and the Repo Slots it binds (ADR-0012, ADR-0051).
|
|
29
|
+
export { workspace } from "./workspace.ts";
|
|
30
|
+
export type { Workspaced } from "./workspace.ts";
|
|
31
|
+
export type { Binding, RepoSlot } from "./parts.ts";
|
|
32
|
+
|
|
33
|
+
// Effects: work a Machine does outside itself, as an actor slot (ADR-0067, ADR-0068, ADR-0071),
|
|
34
|
+
// and what an author writes between a pick and that work.
|
|
35
|
+
export { arg } from "./effect.ts";
|
|
36
|
+
export type { CommandOutput } from "./effect.ts";
|
|
37
|
+
export { command } from "./harness-client.ts";
|
|
38
|
+
export { basic, bearer, file, http, secret, text } from "./http-effect.ts";
|
|
39
|
+
export type { HttpOutput } from "./effector-wire.ts";
|
|
40
|
+
export { push } from "./sandbox-effect.ts";
|
|
41
|
+
export type { PushOutput } from "./sandbox-effect.ts";
|
|
42
|
+
export { dispatch } from "./dispatch-effect.ts";
|
|
43
|
+
export type { DispatchOutput } from "./effect.ts";
|
|
44
|
+
export { answer, fromPick, paramsOf } from "./pick.ts";
|
|
45
|
+
|
|
46
|
+
// Composition: a part left Open, a Machine's parts retuned, a Pool over a Source (ADR-0017,
|
|
47
|
+
// ADR-0049, ADR-0054, ADR-0060).
|
|
48
|
+
export { open } from "./parts.ts";
|
|
49
|
+
export { customize } from "./customize.ts";
|
|
50
|
+
export type { Customize } from "./customize.ts";
|
|
51
|
+
export type { EffectBinding } from "./open-effect.ts";
|
|
52
|
+
export type { Size, UserContainer } from "./size.ts";
|
|
53
|
+
export { pool, source } from "./pool.ts";
|
|
54
|
+
|
|
55
|
+
// Charts: the Open body a Chart wrapper places in `actors`, and the grammar a planner's pick
|
|
56
|
+
// declares, whole or narrowed to one wrapper (ADR-0070).
|
|
57
|
+
export { openBody } from "./open-body.ts";
|
|
58
|
+
export type { OpenBodyDeclaration, OpenBodyOutput } from "./open-body.ts";
|
|
59
|
+
export { chartSchema, chartSchemaFor } from "./chart.ts";
|
|
60
|
+
|
|
61
|
+
// Config: `jr2.config.ts`, the deployment facts a Machine cannot carry (ADR-0050).
|
|
62
|
+
export { defineConfig } from "./config.ts";
|
|
63
|
+
export type { JR2Config } from "./config.ts";
|