@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
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Publish a Machine as an npm package
|
|
3
|
+
description: Ship a Machine in an npm package that names the Kit as a peer, and register it in an Instance.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Publish a Machine as an npm package
|
|
7
|
+
|
|
8
|
+
Publish a [Machine](../reference/glossary.md#machine) as an npm package, so that each
|
|
9
|
+
[Instance](../reference/glossary.md#instance) can install it and register it as a
|
|
10
|
+
[Workflow](../reference/glossary.md#workflow).
|
|
11
|
+
|
|
12
|
+
The example package is `@you/labeler`. It exports one Machine, `labeler`: an [Agent](../reference/glossary.md#agent)
|
|
13
|
+
reads an issue and chooses one label for it. The Machine gives the label as its output. The package leaves the model of
|
|
14
|
+
the Agent [Open](../reference/glossary.md#open), because it cannot know which model each Instance uses. `@jr2/machines`
|
|
15
|
+
has the same shape.
|
|
16
|
+
|
|
17
|
+
Replace `@you` with your npm scope in each file and each command on this page.
|
|
18
|
+
|
|
19
|
+
## The package
|
|
20
|
+
|
|
21
|
+
The package has three files:
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
labeler/
|
|
25
|
+
├── package.json
|
|
26
|
+
├── tsconfig.json
|
|
27
|
+
└── src/
|
|
28
|
+
└── index.ts
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`package.json`:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"name": "@you/labeler",
|
|
36
|
+
"version": "1.0.0",
|
|
37
|
+
"description": "A jr2 Machine that gives an issue one label.",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"type": "module",
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=24"
|
|
42
|
+
},
|
|
43
|
+
"exports": {
|
|
44
|
+
".": "./src/index.ts"
|
|
45
|
+
},
|
|
46
|
+
"types": "./src/index.ts",
|
|
47
|
+
"files": [
|
|
48
|
+
"src"
|
|
49
|
+
],
|
|
50
|
+
"scripts": {
|
|
51
|
+
"typecheck": "tsc --noEmit"
|
|
52
|
+
},
|
|
53
|
+
"peerDependencies": {
|
|
54
|
+
"@jr2/orchestrator": "<version>",
|
|
55
|
+
"xstate": "^5.18.0",
|
|
56
|
+
"zod": "^4.4.3"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@jr2/orchestrator": "<version>",
|
|
60
|
+
"@types/node": "^26.0.1",
|
|
61
|
+
"typescript": "^5.6.0",
|
|
62
|
+
"xstate": "^5.18.0",
|
|
63
|
+
"zod": "^4.4.3"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- `peerDependencies` names `@jr2/orchestrator`, `xstate` and `zod`. The package has no `dependencies`. Replace
|
|
69
|
+
`<version>` with the [Kit version](../reference/glossary.md#kit-version) that the package is for, such as `0.4.1`.
|
|
70
|
+
Write the exact version, with no `^` and no `~`.
|
|
71
|
+
- `devDependencies` also names the three packages, at the same versions, and `typescript` and `@types/node`. With them,
|
|
72
|
+
you can typecheck the package.
|
|
73
|
+
- `exports` gives the `.ts` files, and `files` ships `src`. The package has no build step. jr2 loads `.ts` files from
|
|
74
|
+
`node_modules`, the same as it loads `@jr2/orchestrator` and `@jr2/machines`.
|
|
75
|
+
|
|
76
|
+
`tsconfig.json` uses the options of an Instance. The typecheck of an Instance also checks the `.ts` files of each
|
|
77
|
+
package that it imports, so the package must pass the same options:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"extends": "@jr2/orchestrator/tsconfig.instance.json",
|
|
82
|
+
"include": ["src/**/*.ts"]
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
`src/index.ts` exports the Machine, and the type of its output:
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
import { assign } from "xstate";
|
|
90
|
+
import { z } from "zod";
|
|
91
|
+
import { agent, defineEvent, fail, jr2Setup, open } from "@jr2/orchestrator";
|
|
92
|
+
|
|
93
|
+
// The Agent's one pick.
|
|
94
|
+
const label = defineEvent({
|
|
95
|
+
name: "label",
|
|
96
|
+
description: "Give the issue one label. Call this once, then stop.",
|
|
97
|
+
audience: "agent",
|
|
98
|
+
input: z.object({
|
|
99
|
+
kind: z
|
|
100
|
+
.enum(["bug", "feature", "question"])
|
|
101
|
+
.describe(
|
|
102
|
+
"bug: something does not work. feature: a request. question: the author asks for help or for information.",
|
|
103
|
+
),
|
|
104
|
+
reason: z.string().describe("Why, in one sentence."),
|
|
105
|
+
}),
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const door = z.object({
|
|
109
|
+
title: z.string().describe("The title of the issue."),
|
|
110
|
+
body: z.string().describe("The text of the issue."),
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
type Input = z.infer<typeof door>;
|
|
114
|
+
export type LabelerOutput = { kind: "bug" | "feature" | "question"; reason: string };
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* A Machine that gives an issue one label.
|
|
118
|
+
*
|
|
119
|
+
* Open part: `agents.labeler.model`. Bind it with `customize()` where you register the Machine.
|
|
120
|
+
*
|
|
121
|
+
* Run input: `{ title, body }`, the title and the text of the issue.
|
|
122
|
+
*
|
|
123
|
+
* Output: `{ kind, reason }`. `kind` is `bug`, `feature` or `question`.
|
|
124
|
+
*
|
|
125
|
+
* Fails the run when the Turn of the Agent fails: the reason of the Failure is `no label: ` and the
|
|
126
|
+
* reason of the fault.
|
|
127
|
+
*/
|
|
128
|
+
export const labeler = jr2Setup({
|
|
129
|
+
types: {} as { input: Input; context: Input & { result?: LabelerOutput; fault?: string }; output: LabelerOutput },
|
|
130
|
+
events: [label],
|
|
131
|
+
actors: {
|
|
132
|
+
labeler: agent({
|
|
133
|
+
// Open: the Instance that registers this Machine binds the model with customize().
|
|
134
|
+
model: open,
|
|
135
|
+
workspace: "none",
|
|
136
|
+
instructions: "You read one issue and give it one label. Call label once.",
|
|
137
|
+
}),
|
|
138
|
+
fail: fail(),
|
|
139
|
+
},
|
|
140
|
+
}).createMachine({
|
|
141
|
+
id: "labeler",
|
|
142
|
+
input: door,
|
|
143
|
+
context: ({ input }) => input,
|
|
144
|
+
initial: "labeling",
|
|
145
|
+
states: {
|
|
146
|
+
labeling: {
|
|
147
|
+
invoke: {
|
|
148
|
+
src: "labeler",
|
|
149
|
+
input: ({ context }) => ({ prompt: `Title: ${context.title}\n\n${context.body}` }),
|
|
150
|
+
},
|
|
151
|
+
on: {
|
|
152
|
+
label: {
|
|
153
|
+
target: "done",
|
|
154
|
+
actions: assign({ result: ({ event }) => ({ kind: event.kind, reason: event.reason }) }),
|
|
155
|
+
},
|
|
156
|
+
// jr2 sends this when the Agent's Turn fails for good.
|
|
157
|
+
"agent.fault": { target: "failed", actions: assign({ fault: ({ event }) => event.reason }) },
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
done: { type: "final" },
|
|
161
|
+
// Not a final state: the run ends `failed`. The reason of the Failure is `no label: ` and the reason of the fault.
|
|
162
|
+
failed: { invoke: { src: "fail", input: ({ context }) => ({ reason: `no label: ${context.fault}` }) } },
|
|
163
|
+
},
|
|
164
|
+
output: ({ context }) => context.result!,
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
The Machine carries all of its parts: its run input, its [Vocabulary](../reference/glossary.md#vocabulary) and its
|
|
169
|
+
Agent. The model is [`open`](../reference/authoring-surface/open.md), so the Instance binds it with
|
|
170
|
+
[`customize()`](../reference/authoring-surface/customize.md). On the export, write TSDoc that gives its Open parts and
|
|
171
|
+
its run input, as [`task`](../reference/machines.md#task) does. An [Assistant](../reference/glossary.md#assistant) that
|
|
172
|
+
reads `node_modules` reads that text.
|
|
173
|
+
|
|
174
|
+
## Check the package
|
|
175
|
+
|
|
176
|
+
In the folder of the package, install the `devDependencies`. Then typecheck the package:
|
|
177
|
+
|
|
178
|
+
```sh
|
|
179
|
+
npm install
|
|
180
|
+
npm run typecheck
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Then see what the package ships:
|
|
184
|
+
|
|
185
|
+
```sh
|
|
186
|
+
npm pack --dry-run
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```text
|
|
190
|
+
npm notice
|
|
191
|
+
npm notice 📦 @you/labeler@1.0.0
|
|
192
|
+
npm notice Tarball Contents
|
|
193
|
+
npm notice 623B package.json
|
|
194
|
+
npm notice 2.4kB src/index.ts
|
|
195
|
+
npm notice Tarball Details
|
|
196
|
+
npm notice name: @you/labeler
|
|
197
|
+
npm notice version: 1.0.0
|
|
198
|
+
npm notice filename: you-labeler-1.0.0.tgz
|
|
199
|
+
npm notice package size: 1.4 kB
|
|
200
|
+
npm notice unpacked size: 3.0 kB
|
|
201
|
+
npm notice shasum: b4b5fd9c9ddff44b1be2e852e89969bdbe76750c
|
|
202
|
+
npm notice integrity: sha512-5CXrYzHDj/Qy8[...]70mtq84+C6+6w==
|
|
203
|
+
npm notice total files: 2
|
|
204
|
+
npm notice
|
|
205
|
+
you-labeler-1.0.0.tgz
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
The list holds `package.json` and the files of `src`. Your sizes and sums are different.
|
|
209
|
+
|
|
210
|
+
## Publish the package
|
|
211
|
+
|
|
212
|
+
Log in to your registry with `npm login`. Then publish the package. npm publishes a package with a scope, such as
|
|
213
|
+
`@you`, as restricted, unless you give `--access public`:
|
|
214
|
+
|
|
215
|
+
```sh
|
|
216
|
+
npm publish --access public
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Register the Machine in an Instance
|
|
220
|
+
|
|
221
|
+
In the Instance folder, install the package. Use npm's `--save-exact`, so that `package.json` names one version:
|
|
222
|
+
|
|
223
|
+
```sh
|
|
224
|
+
npm install --save-exact @you/labeler@1.0.0
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Make sure that the Instance has one copy of `@jr2/orchestrator`:
|
|
228
|
+
|
|
229
|
+
```sh
|
|
230
|
+
npm ls @jr2/orchestrator
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
```text
|
|
234
|
+
my-instance@0.0.0 <path>
|
|
235
|
+
├─┬ @jr2/cli@0.4.1
|
|
236
|
+
│ └── @jr2/orchestrator@0.4.1 deduped
|
|
237
|
+
├── @jr2/orchestrator@0.4.1
|
|
238
|
+
└─┬ @you/labeler@1.0.0
|
|
239
|
+
└── @jr2/orchestrator@0.4.1 deduped
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
`<path>` is the path of your Instance folder, and the version is your Kit version. Each line names the same version.
|
|
243
|
+
Each `deduped` line tells you that the package uses the copy of the Instance.
|
|
244
|
+
|
|
245
|
+
Save this file as `workflows/label.ts`. It binds the Open model of the Agent `labeler` to the model of the tab:
|
|
246
|
+
|
|
247
|
+
**Anthropic**
|
|
248
|
+
|
|
249
|
+
```ts
|
|
250
|
+
import { customize } from "@jr2/orchestrator";
|
|
251
|
+
import { labeler } from "@you/labeler";
|
|
252
|
+
|
|
253
|
+
export const machine = customize(labeler, {
|
|
254
|
+
agents: { labeler: { model: "anthropic/claude-haiku-5-5" } },
|
|
255
|
+
});
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**Local**
|
|
259
|
+
|
|
260
|
+
```ts
|
|
261
|
+
import { customize } from "@jr2/orchestrator";
|
|
262
|
+
import { labeler } from "@you/labeler";
|
|
263
|
+
|
|
264
|
+
export const machine = customize(labeler, {
|
|
265
|
+
agents: { labeler: { model: "local/qwen3.6-35b-a3b" } },
|
|
266
|
+
});
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Run [`jr2 up`](../reference/cli.md#up):
|
|
270
|
+
|
|
271
|
+
```sh
|
|
272
|
+
jr2 up
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
```text
|
|
276
|
+
…
|
|
277
|
+
jr2 up — instance "my-instance" → context <context> / namespace my-instance
|
|
278
|
+
typecheck: tsc --noEmit (the instance's own compiler)
|
|
279
|
+
failures: workflow "label" — the states that fail the run (ADR-0073)
|
|
280
|
+
labeler.failed: invokes fail
|
|
281
|
+
seats: workflow "label" — who may send what, per state (ADR-0015)
|
|
282
|
+
labeler.labeling agent:labeler: [label]
|
|
283
|
+
…
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
The first line (`…`) is the `.env` line, when `.env` sets a variable that your shell does not set. `<context>` is your
|
|
287
|
+
kubectl context. The `seats:` lines show that jr2 reads the Vocabulary of the Machine. [Start a run](start-a-run.md)
|
|
288
|
+
tells how to run the Workflow `label`.
|
|
289
|
+
|
|
290
|
+
## Rules
|
|
291
|
+
|
|
292
|
+
- Name `@jr2/orchestrator`, `xstate` and `zod` in `peerDependencies`, never in `dependencies`.
|
|
293
|
+
- When the package names `@jr2/orchestrator` in `dependencies` at a different version, npm installs a second copy under
|
|
294
|
+
the package, with no error. A Machine that loads a second copy has empty [Menus](../reference/glossary.md#menu). Thus
|
|
295
|
+
`jr2 up` refuses the Instance before it applies anything. It gives one line for each Kit package that has a second
|
|
296
|
+
copy, such as `@jr2/orchestrator` and `@jr2/agent-protocol`:
|
|
297
|
+
|
|
298
|
+
```text
|
|
299
|
+
error: cannot stage the Assembly: it would carry a second copy of a Kit package (ADR-0069)
|
|
300
|
+
<path> is a second copy of <name>, nested by <package>@<package version> (<package path>): the Orchestrator's image ships <name> for @jr2/orchestrator <version>, and an Assembly that carries its own copy loads Machines whose Menus are empty (ADR-0054) — align that dependency with the <name> @jr2/orchestrator uses, or remove it, and reinstall
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
Run `npm ls @jr2/orchestrator` to find the second copy.
|
|
304
|
+
|
|
305
|
+
- Name `@jr2/orchestrator` at the exact Kit version. When the Instance has a different Kit version, npm refuses to
|
|
306
|
+
install the package:
|
|
307
|
+
|
|
308
|
+
```text
|
|
309
|
+
npm error code ERESOLVE
|
|
310
|
+
npm error ERESOLVE unable to resolve dependency tree
|
|
311
|
+
…
|
|
312
|
+
npm error Could not resolve dependency:
|
|
313
|
+
npm error peer @jr2/orchestrator@"<version>" from <package>@<package version>
|
|
314
|
+
…
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
`<package>@<package version>` is the package and the version that you install.
|
|
318
|
+
|
|
319
|
+
Do not install with `--force` or `--legacy-peer-deps`. Publish a version of the package for the Kit version of the
|
|
320
|
+
Instance. Thus each [upgrade of the Kit version](upgrade-the-kit-version.md) needs a new version of the package.
|
|
321
|
+
|
|
322
|
+
- In the Instance, the package must be in `dependencies`, not in `devDependencies`. The
|
|
323
|
+
[Assembly](../reference/glossary.md#assembly) holds only `dependencies`. Without the package, the
|
|
324
|
+
[Orchestrator](../reference/glossary.md#orchestrator) cannot load the Workflow, and it refuses the Assembly.
|
|
325
|
+
- The typecheck of `jr2 up` includes the `.ts` files of the package. A type error in it stops the converge:
|
|
326
|
+
`refusing: this instance does not typecheck — nothing was built and nothing was applied`.
|
|
327
|
+
- Use only TypeScript that jr2 can erase: no `enum`, no `namespace`, and no parameter properties in a constructor. The
|
|
328
|
+
typecheck accepts them, but `jr2 up` cannot load the Workflow. It stops with a JavaScript syntax error, such as
|
|
329
|
+
`error: Unexpected token 'export'`.
|
|
330
|
+
- Write each relative import in the package with the `.ts` extension, as `./util.ts`. With `.js`, the typecheck passes,
|
|
331
|
+
but `jr2 up` stops: `error: Cannot find module '<path>/util.js' imported from <path>/index.ts`.
|
|
332
|
+
- A package exports Machines, never Workflows. A Workflow is a file in the `workflows/` folder of an Instance.
|
|
333
|
+
- `jr2 up` refuses a Workflow that leaves a part Open. It prints the `customize()` line that binds it:
|
|
334
|
+
`refusing: workflow "<workflow>" leaves Agent "<slot>" open — bind it where the Machine is registered: export const machine = customize(<import>, { agents: { <slot>: { model: "<provider>/<model>" } } }) (ADR-0054)`.
|
|
335
|
+
[Bind a shipped Machine's Open parts](bind-open-parts.md) gives the refusals for the other Open parts.
|
|
336
|
+
- A new version of the package can change the [Machine shape](../reference/glossary.md#machine-shape): its states, its
|
|
337
|
+
invokes or its transitions. Then the Orchestrator does not continue a run that the old version started. Its status is
|
|
338
|
+
`drifted`. See [Machine shape and drift](../concepts/durable-runs.md#machine-shape-and-drift).
|
|
339
|
+
|
|
340
|
+
## Read next
|
|
341
|
+
|
|
342
|
+
- [Composition](../concepts/composition.md)
|
|
343
|
+
- [Bind a shipped Machine's Open parts](bind-open-parts.md)
|
|
344
|
+
- [Durable runs](../concepts/durable-runs.md)
|
|
345
|
+
- Reference: [`customize()`](../reference/authoring-surface/customize.md),
|
|
346
|
+
[`open`](../reference/authoring-surface/open.md), [`@jr2/machines`](../reference/machines.md)
|
|
347
|
+
- [ADR-0054](../reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md): the kit
|
|
348
|
+
ships Machines, and a shipped Machine leaves its parts Open
|
|
349
|
+
- [ADR-0049](../reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md): a Machine carries its
|
|
350
|
+
parts and composes by invoke
|