@jr2/orchestrator 0.4.1 → 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/console/components/app.ts +2 -0
- package/console/components/fleet.ts +14 -1
- package/console/components/machine-pane.ts +41 -2
- package/console/main.ts +13 -1
- package/console/store.ts +102 -6
- package/console/style.css +21 -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 +5 -3
- package/src/actor.ts +541 -79
- package/src/agent.ts +114 -38
- package/src/ambient.ts +2 -1
- package/src/assembly-checks.ts +189 -7
- package/src/cause.ts +234 -0
- package/src/chart.ts +169 -37
- package/src/charts.ts +34 -6
- package/src/config.ts +430 -178
- package/src/custodian.ts +74 -22
- package/src/customize.ts +188 -46
- package/src/dispatch-effect.ts +945 -0
- package/src/door-compat.ts +217 -0
- package/src/durability.ts +11 -4
- package/src/effect.ts +341 -44
- package/src/effector-wire.ts +160 -11
- package/src/fail.ts +209 -0
- package/src/harness-client.ts +541 -47
- package/src/http-effect.ts +495 -53
- package/src/http.ts +427 -16
- package/src/index.ts +60 -82
- package/src/instance.ts +68 -8
- package/src/internal.ts +84 -0
- package/src/machine-doc.ts +21 -3
- package/src/mechanism-routes.ts +168 -0
- package/src/model-keys.generated.ts +53 -0
- package/src/model-keys.ts +18 -58
- package/src/notices.ts +66 -13
- package/src/open-body.ts +159 -23
- package/src/open-effect.ts +81 -8
- package/src/open.ts +59 -6
- package/src/parts.ts +184 -13
- package/src/party.ts +68 -2
- package/src/pick.ts +463 -11
- package/src/pool.ts +247 -36
- package/src/registration.ts +83 -4
- package/src/repos.ts +2 -1
- package/src/run-host.ts +565 -31
- package/src/run-output.ts +38 -0
- package/src/sandbox-effect.ts +273 -38
- package/src/sandbox-kube.ts +3 -1
- package/src/secret-placement.ts +52 -17
- package/src/server.ts +3 -0
- package/src/setup.ts +239 -56
- package/src/size.ts +121 -9
- package/src/snapshot-store.ts +54 -10
- package/src/stub-harness.ts +44 -16
- package/src/timers.ts +14 -1
- package/src/vocabulary.ts +69 -14
- package/src/wire.ts +90 -16
- package/src/workspace.ts +697 -175
package/src/stub-harness.ts
CHANGED
|
@@ -5,20 +5,26 @@
|
|
|
5
5
|
// the durable stream open, and never act — the Machine parks exactly as it would against a
|
|
6
6
|
// silent real Harness, and e2e drives it by playing the agent against `/mcp/<iid>` instead.
|
|
7
7
|
//
|
|
8
|
-
// Wire (ADR-0027 — the normative model of the
|
|
9
|
-
//
|
|
10
|
-
//
|
|
8
|
+
// Wire (ADR-0027 — the normative model of the conversation endpoints; `@jr2/harness` serves it for
|
|
9
|
+
// real), and the pod's memory kills, which a stub never has (ADR-0062):
|
|
10
|
+
// POST /agents/:name/:id {message, cwd?, definition, model?, thinkingLevel?, notices?, kept?} → 200 { streamUrl, offset, submissionId }
|
|
11
|
+
// (`message` and `cwd` are the Turn's Frame — what it is about and where it works, ADR-0057;
|
|
12
|
+
// `kept` admits as any POST does, because the stub keeps every conversation — the real Harness
|
|
13
|
+
// answers 404 when it keeps none, ADR-0062)
|
|
11
14
|
// GET /agents/:name/:id?offset=…[&view=updates] → 200 `[]` + Stream-Next-Offset/Up-To-Date
|
|
12
15
|
// GET /agents/:name/:id?…&live=long-poll → parked; 204 + same headers on timeout
|
|
13
|
-
// POST /agents/:name/:id/abort
|
|
16
|
+
// POST /agents/:name/:id/abort [{cause?}] → 200 { aborted }
|
|
14
17
|
// GET /agents/:name/:id?view=history → 200 { …, settlements }
|
|
18
|
+
// GET /memory-kills → 200 { kills: [] }
|
|
15
19
|
// (the client's `wait(admission)` long-polls `streamUrl?view=updates` from the admission offset;
|
|
16
20
|
// an empty stream parks it — exactly the "admitted, never settles" semantics the mechanics tier
|
|
17
21
|
// needs.) The client then re-polls calmly at the long-poll cadence. `close()` severs parked polls.
|
|
18
22
|
//
|
|
19
|
-
// A stub submission therefore ends
|
|
20
|
-
//
|
|
21
|
-
//
|
|
23
|
+
// A stub submission therefore ends one way: the sweep, when the state that asked for the turn stops
|
|
24
|
+
// waiting (ADR-0024). Its outcome follows the sweep's cause, as the real Harness's does: `ended` for
|
|
25
|
+
// the running Submission when the Turn's own pick ended it (`cause: "pick"`), `aborted` for every
|
|
26
|
+
// other Submission and every other end. That is what `history`'s `settlements` carries, and it is
|
|
27
|
+
// the only place a black-box test can see a turn end — the run itself is untouched by an abort.
|
|
22
28
|
//
|
|
23
29
|
// This can later grow scriptable behavior or be swapped for a real local Harness without
|
|
24
30
|
// touching actor code — it is only a different URL.
|
|
@@ -55,8 +61,8 @@ export type Admission = {
|
|
|
55
61
|
};
|
|
56
62
|
|
|
57
63
|
/** One settled submission, in the shape `history()` reports it. The stub settles submissions for
|
|
58
|
-
* exactly one reason — an abort (ADR-0024) — so `outcome`
|
|
59
|
-
export type StubSettlement = { submissionId: string; outcome: "aborted" };
|
|
64
|
+
* exactly one reason — an abort (ADR-0024) — so `outcome` is one of the two a sweep gives. */
|
|
65
|
+
export type StubSettlement = { submissionId: string; outcome: "ended" | "aborted" };
|
|
60
66
|
|
|
61
67
|
export type StubHarnessOptions = {
|
|
62
68
|
/** Listen port. Default 0 → ephemeral (read back from `url`). */
|
|
@@ -102,17 +108,39 @@ export async function startStubHarness(opts: StubHarnessOptions = {}): Promise<R
|
|
|
102
108
|
// End every in-flight and queued submission for one instance (`agents.abort` — ADR-0024).
|
|
103
109
|
// Answers `{ aborted }`: whether there was anything to end, exactly as the real Harness
|
|
104
110
|
// does for an idle instance. Settlement is recorded here rather than pushed on the stream, because nothing is
|
|
105
|
-
// listening — the actor that asked for the turn is already stopped.
|
|
111
|
+
// listening — the actor that asked for the turn is already stopped. The body's cause decides the
|
|
112
|
+
// running Submission's outcome, the first unsettled one (`AbortRequest`): `ended` for `pick` with
|
|
113
|
+
// that Submission's id; no body, another id, or any other cause, `aborted`. What is queued
|
|
114
|
+
// behind it never ran: `aborted`.
|
|
106
115
|
const aborting = req.method === "POST" && ABORT_PATH.exec(url.pathname);
|
|
107
116
|
if (aborting) {
|
|
108
117
|
const [, agentName, instanceId] = aborting as unknown as [string, string, string];
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
118
|
+
let body = "";
|
|
119
|
+
req.on("data", (chunk: Buffer) => (body += chunk));
|
|
120
|
+
req.on("end", () => {
|
|
121
|
+
const sent = safeParse(body) as { cause?: unknown; submissionId?: unknown } | undefined;
|
|
122
|
+
const k = key(decodeURIComponent(agentName), decodeURIComponent(instanceId));
|
|
123
|
+
const ended = unsettled.get(k)?.splice(0) ?? [];
|
|
124
|
+
const byPick = sent?.cause === "pick" && sent.submissionId === ended[0];
|
|
125
|
+
const settled = settlements.get(k) ?? [];
|
|
126
|
+
settled.push(
|
|
127
|
+
...ended.map((submissionId, i) => ({
|
|
128
|
+
submissionId,
|
|
129
|
+
outcome: byPick && i === 0 ? ("ended" as const) : ("aborted" as const),
|
|
130
|
+
})),
|
|
131
|
+
);
|
|
132
|
+
settlements.set(k, settled);
|
|
133
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
134
|
+
res.end(JSON.stringify({ aborted: ended.length > 0 }));
|
|
135
|
+
});
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// The pod's memory kills (ADR-0062): a stub runs no process, so none. Answered, not a 404, so a
|
|
140
|
+
// Turn the stub admits logs no failed read.
|
|
141
|
+
if (req.method === "GET" && url.pathname === "/memory-kills") {
|
|
114
142
|
res.writeHead(200, { "content-type": "application/json" });
|
|
115
|
-
res.end(JSON.stringify({
|
|
143
|
+
res.end(JSON.stringify({ kills: [] }));
|
|
116
144
|
return;
|
|
117
145
|
}
|
|
118
146
|
|
package/src/timers.ts
CHANGED
|
@@ -106,11 +106,15 @@ export function scheduledFor(ref: AnyActorRef): Array<{ id: string; event: Event
|
|
|
106
106
|
* Install it before `start()` (the root's creation event is early enough): a timer armed before the
|
|
107
107
|
* wrap is not seen. The same xstate internals as the rest of this module; the canary is the same.
|
|
108
108
|
*/
|
|
109
|
-
export function watchTimers(
|
|
109
|
+
export function watchTimers(
|
|
110
|
+
system: AnyActorRef["system"],
|
|
111
|
+
hooks: TimerHooks = {},
|
|
112
|
+
): (source: unknown, event: unknown) => boolean {
|
|
110
113
|
const scheduler = system.scheduler;
|
|
111
114
|
const { schedule, cancel } = scheduler;
|
|
112
115
|
const armed = new Map<string, { source: AnyActorRef; event: EventObject }>();
|
|
113
116
|
scheduler.schedule = (source, target, event, delay, id = Math.random().toString(36).slice(2)) => {
|
|
117
|
+
hooks.arming?.(source);
|
|
114
118
|
schedule(source, target, event, delay, id);
|
|
115
119
|
armed.set(keyOf(source, id), { source, event });
|
|
116
120
|
};
|
|
@@ -129,6 +133,15 @@ export function watchTimers(system: AnyActorRef["system"]): (source: unknown, ev
|
|
|
129
133
|
};
|
|
130
134
|
}
|
|
131
135
|
|
|
136
|
+
/** What `watchTimers` tells as the scheduler arms a timer: `arming` is called with the timer's
|
|
137
|
+
* source just before xstate schedules it, and xstate then arms it on the system's clock in the same
|
|
138
|
+
* call. xstate schedules in the deferred effects of the event whose actions armed the timer, so the
|
|
139
|
+
* source still takes that event. The run host keeps each timer's cause this way (`cause.ts`,
|
|
140
|
+
* ADR-0024). */
|
|
141
|
+
export type TimerHooks = {
|
|
142
|
+
arming?: (source: AnyActorRef) => void;
|
|
143
|
+
};
|
|
144
|
+
|
|
132
145
|
/**
|
|
133
146
|
* Start a restored run, then schedule each recorded timer again on it. One function, so the order
|
|
134
147
|
* cannot be got wrong: re-armed BEFORE `start()`, a timer is armed twice and fires twice, because
|
package/src/vocabulary.ts
CHANGED
|
@@ -101,6 +101,23 @@ export function inputSchemaOf(machine: AnyStateMachine): z.ZodObject | undefined
|
|
|
101
101
|
return inputSchemas.get(machine.config);
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
/** A zod schema, by its shape: the Instance can resolve a zod of its own, so `instanceof` does not
|
|
105
|
+
* tell. */
|
|
106
|
+
export function isZodSchema(value: unknown): boolean {
|
|
107
|
+
return (
|
|
108
|
+
typeof value === "object" &&
|
|
109
|
+
value !== null &&
|
|
110
|
+
"_zod" in value &&
|
|
111
|
+
typeof (value as { safeParse?: unknown }).safeParse === "function"
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** The run input that a machine declares: the door that `jr2Setup` attached, or a zod `input` on
|
|
116
|
+
* its `createMachine` config that no door reads (a machine that `setup()` made). */
|
|
117
|
+
export function declaresRunInput(machine: AnyStateMachine): boolean {
|
|
118
|
+
return inputSchemaOf(machine) !== undefined || isZodSchema((machine.config as { input?: unknown }).input);
|
|
119
|
+
}
|
|
120
|
+
|
|
104
121
|
// Who may send what, per state (ADR-0015): the seats the menu-derivation walk computed. Same key
|
|
105
122
|
// choice as the vocabulary, for the same reasons. The Machine's doc carries them; `jr2 up` and the
|
|
106
123
|
// Console show them, so an author reads the audience rule's answer for their own Machine.
|
|
@@ -144,22 +161,60 @@ export function loadWarningsOf(machine: AnyStateMachine): string[] {
|
|
|
144
161
|
return loadWarnings.get(machine.config) ?? [];
|
|
145
162
|
}
|
|
146
163
|
|
|
164
|
+
// What the HOST adds to the input of the machine a run STARTS with, beside the door
|
|
165
|
+
// (`RunHost.start`). One field today: the run's seed Instance ID, minted with the run and
|
|
166
|
+
// reported by `jr2 status`. It names the RUN, never a conversation — jr2 mints every Agent
|
|
167
|
+
// Instance ID in the input mapper (ADR-0016, ADR-0057), and a Machine cannot pass one in.
|
|
168
|
+
//
|
|
169
|
+
// It is deliberately NOT door material (ADR-0033): no caller sends it — `start` overwrites
|
|
170
|
+
// whatever arrived, after the parse — and it is never served as JSON Schema, so putting it in a
|
|
171
|
+
// door schema would publish it and demand of every caller a field the host supplies anyway.
|
|
172
|
+
//
|
|
173
|
+
// It is also PLACEMENT-DEPENDENT: only the ROOT machine is started with it. A machine invoked
|
|
174
|
+
// further down is fed by its parent, which passes what it chooses. No type can see where a machine
|
|
175
|
+
// sits, so the one contract that must reason about this — `workspace()`'s body guard — takes the
|
|
176
|
+
// permissive answer and counts these keys as PROVIDED, which lets a body declare the field
|
|
177
|
+
// honestly. Counting them as provided (rather than subtracting them from what the body demands)
|
|
178
|
+
// is what keeps their TYPE checked: `instanceId` is a string, and a body asking for anything else
|
|
179
|
+
// is still rejected.
|
|
147
180
|
/**
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
181
|
+
* The fields that jr2 adds to the input of the Machine that a run starts, beside the input that
|
|
182
|
+
* the caller sent. Today it is one field: `instanceId`, an id that jr2 makes for the run.
|
|
183
|
+
*
|
|
184
|
+
* Add it to the type of your root Machine's input when the Machine reads it:
|
|
185
|
+
* `HostInjectedInput & RunInput`. Do not put it in the `input` schema that a run starts with. No
|
|
186
|
+
* caller sends it. jr2 writes it over any value that a caller sends.
|
|
187
|
+
*
|
|
188
|
+
* Only the root Machine of a run gets it. A Machine that another Machine invokes gets the input
|
|
189
|
+
* that its parent gives it. A `workspace()` passes its input to its body, so the body of a root
|
|
190
|
+
* `workspace()` gets it too: `Workspaced<HostInjectedInput & RunInput, "app">`.
|
|
191
|
+
*
|
|
192
|
+
* The `spec` of a root `workspace()` also gets it, and the type of its input shows it:
|
|
193
|
+
* ``spec: ({ input }) => ({ branch: `fix/${input.instanceId}` })``.
|
|
194
|
+
*
|
|
195
|
+
* It is not the run id. Use it, for example, to give each run a branch of its own.
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* ```ts
|
|
199
|
+
* import { z } from "zod";
|
|
200
|
+
* import { jr2Setup, type HostInjectedInput } from "@jr2/orchestrator";
|
|
201
|
+
*
|
|
202
|
+
* const runInput = z.object({ ticket: z.string() });
|
|
203
|
+
* type Input = HostInjectedInput & z.infer<typeof runInput>;
|
|
152
204
|
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
205
|
+
* export const machine = jr2Setup({
|
|
206
|
+
* types: {} as { input: Input; context: Input; output: { run: string; ticket: string } },
|
|
207
|
+
* }).createMachine({
|
|
208
|
+
* id: "ticket",
|
|
209
|
+
* input: runInput,
|
|
210
|
+
* context: ({ input }) => input,
|
|
211
|
+
* initial: "done",
|
|
212
|
+
* states: { done: { type: "final" } },
|
|
213
|
+
* output: ({ context }) => ({ run: context.instanceId, ticket: context.ticket }),
|
|
214
|
+
* });
|
|
215
|
+
* ```
|
|
156
216
|
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
* sits, so the one contract that must reason about this — `workspace()`'s body guard — takes the
|
|
160
|
-
* permissive answer and counts these keys as PROVIDED, which lets a body declare the field
|
|
161
|
-
* honestly. Counting them as provided (rather than subtracting them from what the body demands)
|
|
162
|
-
* is what keeps their TYPE checked: `instanceId` is a string, and a body asking for anything else
|
|
163
|
-
* is still rejected.
|
|
217
|
+
* @see docs/guides/write-a-workflow.md
|
|
218
|
+
* @see docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md
|
|
164
219
|
*/
|
|
165
220
|
export type HostInjectedInput = { instanceId: string };
|
package/src/wire.ts
CHANGED
|
@@ -13,19 +13,35 @@
|
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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";
|
|
24
|
+
|
|
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
|
|
@@ -33,11 +49,18 @@ export const SUBMISSION_RUNAWAY = "runaway";
|
|
|
33
49
|
* Settlement, not a 404. The Agent actor switches on this type, never on the message's prose. */
|
|
34
50
|
export const SUBMISSION_HARNESS_RESTARTED = "harness_restarted";
|
|
35
51
|
|
|
36
|
-
/**
|
|
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). */
|
|
37
59
|
export type Settlement = {
|
|
38
60
|
submissionId: string;
|
|
39
61
|
outcome: SettlementOutcome;
|
|
40
62
|
error?: SettlementError;
|
|
63
|
+
usage?: SubmissionUsage;
|
|
41
64
|
};
|
|
42
65
|
|
|
43
66
|
/** Where a chunk sits on the durable stream. Ordering only (`batch`, then `index`); the Harness
|
|
@@ -59,10 +82,16 @@ export type SubmissionSettledEvent = StreamChunk<"submission-settled"> & Settlem
|
|
|
59
82
|
/**
|
|
60
83
|
* The Harness's memory guard killed the Agent's processes (ADR-0061, layer 4), on the stream of the
|
|
61
84
|
* conversation whose Turn was running. The Agent heard it in its `bash` answer; this is how the
|
|
62
|
-
* Orchestrator hears it, so the next Turn in the Workspace is told (ADR-0062). `
|
|
63
|
-
*
|
|
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.
|
|
64
88
|
*/
|
|
65
|
-
export type MemoryLimitEvent = StreamChunk<"memory-limit"> & {
|
|
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
|
+
};
|
|
66
95
|
|
|
67
96
|
/** One event on the durable stream (`GET ?offset=…&view=updates` → 200 JSON array). */
|
|
68
97
|
export type StreamEvent = MessageAppendedEvent | SubmissionSettledEvent | MemoryLimitEvent;
|
|
@@ -73,14 +102,16 @@ export type StreamEvent = MessageAppendedEvent | SubmissionSettledEvent | Memory
|
|
|
73
102
|
// Harness writes every word of the Briefing's Turn part from them.
|
|
74
103
|
|
|
75
104
|
/** The Sandbox's processes were killed at its memory limit during `agent`'s Turn — by the
|
|
76
|
-
* Harness's guard (`peak` known) or by the kernel (`peak` unknown).
|
|
77
|
-
*
|
|
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. */
|
|
78
108
|
export type MemoryLimitNotice = {
|
|
79
109
|
kind: "memory-limit";
|
|
80
110
|
scope: "workspace";
|
|
81
|
-
agent
|
|
111
|
+
agent?: string;
|
|
82
112
|
peak?: string;
|
|
83
|
-
|
|
113
|
+
/** Absent with `peak` when the sizes read were not sizes: the notice says no sizes. */
|
|
114
|
+
limit?: string;
|
|
84
115
|
};
|
|
85
116
|
|
|
86
117
|
/** This conversation is new; earlier context is gone. Conversation scope: that Agent's next
|
|
@@ -147,6 +178,49 @@ export type LiveSetRequest = { live: LiveConversation[] };
|
|
|
147
178
|
/** What `PUT /agents` answers (200): how many conversations this statement freed. */
|
|
148
179
|
export type LiveSetResponse = { freed: number };
|
|
149
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
|
+
|
|
150
224
|
// ---- The run-narrative echo (`POST /echo` — ADR-0023) ------------------------------------------
|
|
151
225
|
// "Print these events": the Orchestrator — the observation feed's one subscriber (ADR-0022) — tees
|
|
152
226
|
// the owning run's feed to the enclosing Workspace's Harness, which renders it into its own pod log.
|