@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/wire.ts
CHANGED
|
@@ -13,26 +13,54 @@
|
|
|
13
13
|
// asserts each shape here is mutually assignable with `@jr2/harness/wire`'s, and `@jr2/harness`
|
|
14
14
|
// stays a devDependency so that file — and only that file — can see the server's copy.
|
|
15
15
|
|
|
16
|
-
/** How a Submission ends (ADR-0024/0027)
|
|
17
|
-
*
|
|
18
|
-
|
|
16
|
+
/** How a Submission ends (ADR-0024/0027). The Orchestrator is the one judge of how a Turn ended:
|
|
17
|
+
* `completed` (the run returned, and the Turn is still open — the Agent actor asks again,
|
|
18
|
+
* ADR-0016), `ended` (the Turn's own pick ended the Turn, from this Submission or an earlier one of
|
|
19
|
+
* the same Turn, and the sweep said `cause: "pick"`),
|
|
20
|
+
* `failed` (the turn threw — provider failure after retries, the Menu connect/list failed, a
|
|
21
|
+
* Runaway), `aborted` (something else ended the Turn, no sweep came in time, or it was over before
|
|
22
|
+
* it started — ADR-0026). */
|
|
23
|
+
export type SettlementOutcome = "completed" | "ended" | "failed" | "aborted";
|
|
19
24
|
|
|
20
|
-
/** The error payload a
|
|
25
|
+
/** The error payload a `failed` or `aborted` Settlement carries. A `completed` or an `ended` one
|
|
26
|
+
* carries none. */
|
|
21
27
|
export type SettlementError = { type: string; message?: string };
|
|
22
28
|
|
|
23
29
|
/** `SettlementError.type` for a swept Submission (ADR-0024/0025). */
|
|
24
30
|
export const SUBMISSION_ABORTED = "submission_aborted";
|
|
25
31
|
|
|
26
|
-
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
32
|
+
/** Why the Orchestrator sweeps a conversation (ADR-0024): `pick` — the Turn's own pick ended it, so
|
|
33
|
+
* the running Submission settles `ended`. Any other end sends no cause, and the sweep settles
|
|
34
|
+
* `aborted`. */
|
|
35
|
+
export type AbortCause = "pick";
|
|
36
|
+
|
|
37
|
+
/** The body of `POST /agents/:name/:id/abort`. `submissionId` names the Submission the cause is
|
|
38
|
+
* about: the last one ledgered for the Turn, which the Harness settles `ended` only while it is the
|
|
39
|
+
* running one (ADR-0024). */
|
|
40
|
+
export type AbortRequest = { cause?: AbortCause; submissionId?: string };
|
|
41
|
+
|
|
42
|
+
/** `SettlementError.type` for a Turn the Harness ended as a Runaway (ADR-0035). A Runaway is a kind
|
|
43
|
+
* of failure, so it has no outcome of its own: the typed error on a `failed` settlement is what lets
|
|
44
|
+
* the Agent actor switch on the class (one fresh-conversation reroll) without parsing prose. */
|
|
29
45
|
export const SUBMISSION_RUNAWAY = "runaway";
|
|
30
46
|
|
|
31
|
-
/**
|
|
47
|
+
/** `SettlementError.type` for a Submission the Harness admitted but had not settled when it
|
|
48
|
+
* restarted (ADR-0031): the rebuilt stream settles it `failed`, so a re-attached `wait` reads a
|
|
49
|
+
* Settlement, not a 404. The Agent actor switches on this type, never on the message's prose. */
|
|
50
|
+
export const SUBMISSION_HARNESS_RESTARTED = "harness_restarted";
|
|
51
|
+
|
|
52
|
+
/** What a Submission's model answers spent, summed: tokens, and the cost in US dollars from the
|
|
53
|
+
* model's catalog rates (0 for a model with no rates). */
|
|
54
|
+
export type SubmissionUsage = { input: number; output: number; cacheRead: number; cacheWrite: number; cost: number };
|
|
55
|
+
|
|
56
|
+
/** One settled Submission, in the shape `?view=history`'s `settlements` reports. `usage` is absent
|
|
57
|
+
* when no model answer reported one, or when the Submission was lost with a restarted Harness. The
|
|
58
|
+
* Orchestrator does not read it yet: the @model tier records it per trial (ADR-0066). */
|
|
32
59
|
export type Settlement = {
|
|
33
60
|
submissionId: string;
|
|
34
61
|
outcome: SettlementOutcome;
|
|
35
62
|
error?: SettlementError;
|
|
63
|
+
usage?: SubmissionUsage;
|
|
36
64
|
};
|
|
37
65
|
|
|
38
66
|
/** Where a chunk sits on the durable stream. Ordering only (`batch`, then `index`); the Harness
|
|
@@ -51,19 +79,148 @@ export type MessageAppendedEvent = StreamChunk<"message-appended"> & {
|
|
|
51
79
|
* a parked long-poll. */
|
|
52
80
|
export type SubmissionSettledEvent = StreamChunk<"submission-settled"> & Settlement;
|
|
53
81
|
|
|
82
|
+
/**
|
|
83
|
+
* The Harness's memory guard killed the Agent's processes (ADR-0061, layer 4), on the stream of the
|
|
84
|
+
* conversation whose Turn was running. The Agent heard it in its `bash` answer; this is how the
|
|
85
|
+
* Orchestrator hears it, so the next Turn in the Workspace is told (ADR-0062). `id` is the kill's:
|
|
86
|
+
* the same on every stream that carries it and in `GET /memory-kills`, so one kill is one notice.
|
|
87
|
+
* `peak` and `limit` are the guard's own spellings — carried to the notice as they are, never parsed.
|
|
88
|
+
*/
|
|
89
|
+
export type MemoryLimitEvent = StreamChunk<"memory-limit"> & {
|
|
90
|
+
/** Absent from an older Harness's event, which had none. */
|
|
91
|
+
id?: string;
|
|
92
|
+
peak: string;
|
|
93
|
+
limit: string;
|
|
94
|
+
};
|
|
95
|
+
|
|
54
96
|
/** One event on the durable stream (`GET ?offset=…&view=updates` → 200 JSON array). */
|
|
55
|
-
export type StreamEvent = MessageAppendedEvent | SubmissionSettledEvent;
|
|
97
|
+
export type StreamEvent = MessageAppendedEvent | SubmissionSettledEvent | MemoryLimitEvent;
|
|
98
|
+
|
|
99
|
+
// ---- Notices (ADR-0062) ------------------------------------------------------------------------
|
|
100
|
+
// What happened that the next Turn cannot find out for itself, as DATA: the Orchestrator keeps
|
|
101
|
+
// them and attaches the pending ones in scope to an admission (`AdmissionRequest.notices`); the
|
|
102
|
+
// Harness writes every word of the Briefing's Turn part from them.
|
|
103
|
+
|
|
104
|
+
/** The Sandbox's processes were killed at its memory limit during `agent`'s Turn — by the
|
|
105
|
+
* Harness's guard (`peak` known) or by the kernel (`peak` unknown). `agent` is absent for every
|
|
106
|
+
* kill read from the pod's list, which cannot say whose Turn a kill ended. Workspace scope: the next
|
|
107
|
+
* Turn of any Agent in that Workspace. */
|
|
108
|
+
export type MemoryLimitNotice = {
|
|
109
|
+
kind: "memory-limit";
|
|
110
|
+
scope: "workspace";
|
|
111
|
+
agent?: string;
|
|
112
|
+
peak?: string;
|
|
113
|
+
/** Absent with `peak` when the sizes read were not sizes: the notice says no sizes. */
|
|
114
|
+
limit?: string;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/** This conversation is new; earlier context is gone. Conversation scope: that Agent's next
|
|
118
|
+
* continued Turn. `reason` says why — the fault that burned the last one, or that the Harness no
|
|
119
|
+
* longer holds it. */
|
|
120
|
+
export type ConversationNewNotice = { kind: "conversation-new"; scope: "conversation"; reason: string };
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* What an outstanding pick's answer is (ADR-0024): the LAST reply from below the Agent's state since
|
|
124
|
+
* the pick — a party's event (a Gate's answer, a nested Agent's pick) with its payload, or a child's
|
|
125
|
+
* output (a child Machine, an Effect stand-in) — named by who sent it. A child's error is no reply (a
|
|
126
|
+
* defect, ADR-0024). Absent where nothing replied: the answer carries no reply, and says nothing of
|
|
127
|
+
* whether work ran. Plain data; the Harness writes the words. `answer`: the value the Machine's
|
|
128
|
+
* `answer` action set (ADR-0067), which replaces the default.
|
|
129
|
+
*/
|
|
130
|
+
export type PickAnswer =
|
|
131
|
+
| { kind: "event"; event: string; sender?: { party: "agent" | "gate"; id: string }; payload: Record<string, unknown> }
|
|
132
|
+
| { kind: "output"; actor: string; output: unknown }
|
|
133
|
+
| { kind: "answer"; value: unknown };
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* A pick's answer that did not reach the pick's call (ADR-0024): `cut` — the Harness restarted while
|
|
137
|
+
* the workflow ran it, and jr2 re-admits the Agent on the same conversation with this notice; or the
|
|
138
|
+
* route left the Agent's state, and the next Turn of the conversation the picking Turn continued
|
|
139
|
+
* hears it. Conversation scope.
|
|
140
|
+
*/
|
|
141
|
+
export type PickAnswerNotice = {
|
|
142
|
+
kind: "pick-answer";
|
|
143
|
+
scope: "conversation";
|
|
144
|
+
pick: string;
|
|
145
|
+
cut: boolean;
|
|
146
|
+
/** The last reply since the pick — with `stopped`, an earlier link's, kept. */
|
|
147
|
+
answer?: PickAnswer;
|
|
148
|
+
/** Something other than the pick's route left the Agent's state while the pick's work ran, and
|
|
149
|
+
* that exit stopped the work before it finished (ADR-0024). */
|
|
150
|
+
stopped?: true;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export type Notice = MemoryLimitNotice | ConversationNewNotice | PickAnswerNotice;
|
|
56
154
|
|
|
57
155
|
/** Response header: the offset to resume the stream from (every stream read carries it). */
|
|
58
156
|
export const STREAM_NEXT_OFFSET_HEADER = "stream-next-offset";
|
|
59
157
|
|
|
60
|
-
/** `?view=`
|
|
158
|
+
/** `?view=` values the client reads. A read with neither view is `updates`; `history` is the
|
|
159
|
+
* conversation snapshot, read only to learn whether the Harness still holds it (ADR-0062). */
|
|
61
160
|
export const VIEW_UPDATES = "updates";
|
|
161
|
+
export const VIEW_HISTORY = "history";
|
|
62
162
|
|
|
63
163
|
/** `?live=` value: park until a new event or timeout (204 + the same headers). Long-poll is the
|
|
64
164
|
* ONLY wait transport (ADR-0027) — no SSE, no `?wait=result`. */
|
|
65
165
|
export const LIVE_LONG_POLL = "long-poll";
|
|
66
166
|
|
|
167
|
+
// ---- The live set (`PUT /agents` — ADR-0031) ----------------------------------------------------
|
|
168
|
+
// The Orchestrator states which conversations its live runs hold on the Instance Harness, and the
|
|
169
|
+
// Harness frees every other one that is not busy. The whole set every time (level-triggered), so a
|
|
170
|
+
// missed statement costs nothing.
|
|
171
|
+
|
|
172
|
+
/** One conversation a live run holds: the `:name` and `:id` of its `/agents/:name/:id` route. */
|
|
173
|
+
export type LiveConversation = { agent: string; instanceId: string };
|
|
174
|
+
|
|
175
|
+
/** What `PUT /agents` accepts: every conversation the Orchestrator's live runs hold. */
|
|
176
|
+
export type LiveSetRequest = { live: LiveConversation[] };
|
|
177
|
+
|
|
178
|
+
/** What `PUT /agents` answers (200): how many conversations this statement freed. */
|
|
179
|
+
export type LiveSetResponse = { freed: number };
|
|
180
|
+
|
|
181
|
+
/** What a Harness answers (404) to an admission with `kept: true` when it keeps no such
|
|
182
|
+
* conversation (ADR-0062). The client takes a 404 as "not kept" only with `kept: false` on it: a
|
|
183
|
+
* 404 from anything else is a failed admission. */
|
|
184
|
+
export type NotKeptResponse = { error: string; kept: false };
|
|
185
|
+
|
|
186
|
+
// ---- The pod's guard kills (`GET /memory-kills` — ADR-0061, ADR-0062) -------------------------
|
|
187
|
+
// Every guard kill, kept by the Harness pod-scoped. A stream is read only while the Agent actor
|
|
188
|
+
// waits on a Submission, and that wait stops when the Agent's state exits — so a kill while no
|
|
189
|
+
// Submission runs, or after the wait stopped, has no reader there. The actor reads this list before
|
|
190
|
+
// it admits a Turn into the Workspace. The read is idempotent: the notice ledger keeps each `id` it
|
|
191
|
+
// raised (`seen`), whichever path it came by.
|
|
192
|
+
|
|
193
|
+
/** One guard kill: `id` unique for the pod's life and the stream events' `id`, `at` when the guard
|
|
194
|
+
* fired, the guard's own `peak` and `limit`, and `told` — the conversations with a `bash` call
|
|
195
|
+
* running then, whose answer told the Agent of the kill. None when no call ran. */
|
|
196
|
+
export type PodMemoryKill = {
|
|
197
|
+
id: string;
|
|
198
|
+
at: string;
|
|
199
|
+
/** Absent, with `limit`, when the pod could not keep the sizes as sizes. */
|
|
200
|
+
peak?: string;
|
|
201
|
+
limit?: string;
|
|
202
|
+
told: LiveConversation[];
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
/** What `GET /memory-kills` answers (200): the newest kills, oldest first. */
|
|
206
|
+
export type MemoryKillsResponse = { kills: PodMemoryKill[] };
|
|
207
|
+
|
|
208
|
+
// The bounds of the list, the same on the two sides of the wire (ADR-0062). The Agent's uid can
|
|
209
|
+
// write the file the list is read from, so the Harness keeps no kill, and no `told` entry, that the
|
|
210
|
+
// Orchestrator drops. With these bounds the largest answer is 149,259 bytes, under the
|
|
211
|
+
// Orchestrator's read of 256 KiB: 16 kills of 208 bytes and 32 `told` entries of 284 bytes each.
|
|
212
|
+
|
|
213
|
+
/** How many kills the pod keeps. A guard kill is rare; a burst of them is one piece of news. */
|
|
214
|
+
export const KEPT_KILLS = 16;
|
|
215
|
+
/** The most conversations one kill's `told` holds: far more Agents than a Workspace runs. */
|
|
216
|
+
export const MAX_TOLD = 32;
|
|
217
|
+
/** The longest `id` and `at` of a kill. A minted id and an ISO time are less than half of it. */
|
|
218
|
+
export const MAX_KILL_STAMP = 64;
|
|
219
|
+
/** The longest `agent` and `instanceId` of a `told` entry. */
|
|
220
|
+
export const MAX_KILL_NAME = 128;
|
|
221
|
+
/** The most of `GET /memory-kills` the Orchestrator reads, in bytes. */
|
|
222
|
+
export const MAX_KILLS_BODY = 256 * 1024;
|
|
223
|
+
|
|
67
224
|
// ---- The run-narrative echo (`POST /echo` — ADR-0023) ------------------------------------------
|
|
68
225
|
// "Print these events": the Orchestrator — the observation feed's one subscriber (ADR-0022) — tees
|
|
69
226
|
// the owning run's feed to the enclosing Workspace's Harness, which renders it into its own pod log.
|
|
@@ -101,3 +258,74 @@ export type EchoEvent = EchoStatusEvent | EchoEmitEvent | EchoAdmissionEvent | E
|
|
|
101
258
|
/** What `POST /echo` accepts: feed events in feed order. The answer is `{ printed }` — how many
|
|
102
259
|
* lines landed on stdout (an unrenderable event prints nothing; it never errors the batch). */
|
|
103
260
|
export type EchoRequest = { events: EchoEvent[] };
|
|
261
|
+
|
|
262
|
+
// --- the attach (ADR-0063) ----------------------------------------------------------------------
|
|
263
|
+
// The Workspace's Repos into `/work`, run by the Harness on `POST /attach` — the Orchestrator's
|
|
264
|
+
// call where it once ran a script over `kubectl exec`. Same bearer as every Harness route
|
|
265
|
+
// (ADR-0058); idempotent on the Harness's side.
|
|
266
|
+
|
|
267
|
+
/** One Repo Slot to attach. The Orchestrator resolves the Repo's `identity` and cache `key`
|
|
268
|
+
* (repo-identity.ts) — the Harness never re-derives them, so the cache it clones from and the node
|
|
269
|
+
* cache the operator mounted agree by construction (ADR-0051). `url` is the Binding's own spelling,
|
|
270
|
+
* the push url (ADR-0005); `ref` is the base the branch starts from, omitted for the Repo's default
|
|
271
|
+
* branch. */
|
|
272
|
+
export type AttachSlot = { slot: string; url: string; identity: string; key: string; ref?: string };
|
|
273
|
+
|
|
274
|
+
/** What `POST /attach` accepts: the slots in declaration order, the Workspace's branch, and — for a
|
|
275
|
+
* reviewer's seat — the sha the detached review worktree is forced to (ADR-0028). */
|
|
276
|
+
export type AttachRequest = { slots: AttachSlot[]; branch: string; reviewSha?: string };
|
|
277
|
+
|
|
278
|
+
/** What `POST /attach` answers (200): the branch worktree per slot, and the review worktree per
|
|
279
|
+
* slot when the request named a `reviewSha`. Freshness is the operator's verdict on the Sandbox,
|
|
280
|
+
* which the Orchestrator reads itself — never the Harness's to report. */
|
|
281
|
+
export type AttachResponse = { repos: Record<string, string>; review?: Record<string, string> };
|
|
282
|
+
|
|
283
|
+
/** What a failed attach answers: 400 for a body that is not an `AttachRequest`, 500 when a step
|
|
284
|
+
* failed — `slot` names the Repo Slot, and `error` carries the step and git's own stderr. */
|
|
285
|
+
export type AttachError = { error: string; slot?: string };
|
|
286
|
+
|
|
287
|
+
// --- the exec (a `command` Effect, ADR-0067) ----------------------------------------------------
|
|
288
|
+
// A `command` Effect runs in the Harness container of its Workspace's Sandbox, named by its
|
|
289
|
+
// Effect's id: one id runs once, whoever asks again. Same bearer as every Harness route (ADR-0058).
|
|
290
|
+
|
|
291
|
+
// --- the sync (ADR-0067) ------------------------------------------------------------------------
|
|
292
|
+
// After a push whose published commit is not the Agent's own — signed copies of its commits, or
|
|
293
|
+
// one squashed commit, signed or not — the sync moves the Agent's branch to it, here, in the
|
|
294
|
+
// Harness container, with one `update-ref` (files, index, HEAD and stash do not change). The
|
|
295
|
+
// bundle of the published commits travels through the Orchestrator. Same bearer as every Harness route (ADR-0058).
|
|
296
|
+
|
|
297
|
+
/** What `POST /sync` accepts: the branch Worktree (absolute, under `/work`), the branch, the pair
|
|
298
|
+
* the push published (`published`, the published tip; `source`, the Agent's commit it re-creates) and,
|
|
299
|
+
* when the push just ran, the bundle of the published commits (base64). With no bundle the published
|
|
300
|
+
* commits must already be in the Agent's store (a sync run again). */
|
|
301
|
+
export type SyncRequest = { worktree: string; branch: string; published: string; source: string; bundle?: string };
|
|
302
|
+
|
|
303
|
+
/** What the sync answers — a report, which the next push never trusts. `synced`: the branch moved
|
|
304
|
+
* (`replayed` commits the Agent made after the push were copied onto the published tip). `already`:
|
|
305
|
+
* the branch holds the published tip. `skipped`: the push published the Agent's own commit. `busy`: a rebase, merge,
|
|
306
|
+
* cherry-pick or revert of the branch is in progress; nothing changed. `not-synced`: the branch
|
|
307
|
+
* did not move (`reason` says why). */
|
|
308
|
+
export type SyncAnswer =
|
|
309
|
+
| { sync: "synced"; from: string; to: string; replayed: number; tries: number }
|
|
310
|
+
| { sync: "already" }
|
|
311
|
+
| { sync: "skipped" | "busy" | "not-synced"; reason: string };
|
|
312
|
+
|
|
313
|
+
/** What `POST /exec/:id` accepts: argv (never shell text), an absolute `cwd` or none, the timeout,
|
|
314
|
+
* and how many characters of the stream's end the output keeps. */
|
|
315
|
+
export type ExecRequest = { argv: string[]; cwd?: string; timeoutMs: number; tail: number };
|
|
316
|
+
|
|
317
|
+
/** How an exec ended. Every one is output; none is a fault. */
|
|
318
|
+
export type ExecOutcome =
|
|
319
|
+
| { outcome: "exited"; code: number; tail: string }
|
|
320
|
+
| { outcome: "timeout"; tail: string }
|
|
321
|
+
| { outcome: "killed"; signal: string; tail: string };
|
|
322
|
+
|
|
323
|
+
/** What `GET /exec/:id` answers: the stream from `offset` to `next`, and the output once settled. A
|
|
324
|
+
* read with no `offset` starts at the end. */
|
|
325
|
+
export type ExecRead = {
|
|
326
|
+
state: "running" | "settled";
|
|
327
|
+
stream: string;
|
|
328
|
+
next: number;
|
|
329
|
+
dropped?: number;
|
|
330
|
+
output?: ExecOutcome;
|
|
331
|
+
};
|