@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,237 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Start a run from a run
|
|
3
|
+
description: Use a dispatch Effect to start a run of a Workflow from a Machine, in this Instance or in a different one.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Start a run from a run
|
|
7
|
+
|
|
8
|
+
Start a run of a [Workflow](../reference/glossary.md#workflow) from a [Machine](../reference/glossary.md#machine), with
|
|
9
|
+
a `dispatch` [Effect](../reference/glossary.md#effect).
|
|
10
|
+
|
|
11
|
+
This example is `workflows/intake.ts`. It waits at a [Gate](../reference/glossary.md#gate). For each `report` event, it
|
|
12
|
+
starts one run of `triage`, the Workflow of [A model decides](../get-started/a-model-decides.md). Then it waits for the
|
|
13
|
+
next report:
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { assign } from "xstate";
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
import { defineEvent, dispatch, jr2Setup, type DispatchOutput } from "@jr2/orchestrator";
|
|
19
|
+
|
|
20
|
+
// The run input of the triage Workflow, as this slot claims it. `jr2 up` compares it with the
|
|
21
|
+
// input that triage declares.
|
|
22
|
+
const triageInput = z.object({ request: z.string() });
|
|
23
|
+
|
|
24
|
+
// The Gate takes these events. A person, a script or a webhook reports a request.
|
|
25
|
+
const report = defineEvent({
|
|
26
|
+
name: "report",
|
|
27
|
+
description: "Report a request. A run of triage starts for it.",
|
|
28
|
+
input: triageInput,
|
|
29
|
+
});
|
|
30
|
+
const close = defineEvent({
|
|
31
|
+
name: "close",
|
|
32
|
+
description: "Stop the intake. The runs that it started continue.",
|
|
33
|
+
input: z.object({}),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
type Context = { request?: string; started: string[]; last?: DispatchOutput };
|
|
37
|
+
|
|
38
|
+
export const machine = jr2Setup({
|
|
39
|
+
types: {} as { context: Context },
|
|
40
|
+
events: [report, close],
|
|
41
|
+
actors: {
|
|
42
|
+
// Each invoke of this slot starts one run of triage. That run is a run of its own.
|
|
43
|
+
triage: dispatch("triage", { input: triageInput }),
|
|
44
|
+
},
|
|
45
|
+
}).createMachine({
|
|
46
|
+
id: "intake",
|
|
47
|
+
context: { started: [] },
|
|
48
|
+
initial: "listening",
|
|
49
|
+
states: {
|
|
50
|
+
listening: {
|
|
51
|
+
invoke: { src: "gate" },
|
|
52
|
+
on: {
|
|
53
|
+
report: { target: "starting", actions: assign({ request: ({ event }) => event.request }) },
|
|
54
|
+
close: "closed",
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
starting: {
|
|
58
|
+
invoke: {
|
|
59
|
+
src: "triage",
|
|
60
|
+
input: ({ context }) => ({ request: context.request ?? "" }),
|
|
61
|
+
// Each outcome is output: started, refused, unreachable or unknown.
|
|
62
|
+
onDone: {
|
|
63
|
+
target: "listening",
|
|
64
|
+
actions: assign({
|
|
65
|
+
last: ({ event }) => event.output,
|
|
66
|
+
started: ({ context, event }) =>
|
|
67
|
+
event.output.outcome === "started" ? [...context.started, event.output.run] : context.started,
|
|
68
|
+
}),
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
closed: { type: "final" },
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The Instance must also have `workflows/triage.ts`. The example does not need a model of its own: the runs of `triage`
|
|
78
|
+
use the model of `triage`.
|
|
79
|
+
|
|
80
|
+
## Converge it
|
|
81
|
+
|
|
82
|
+
Run [`jr2 up`](../reference/cli.md#up). Its `effects:` lines tell where the Effect runs:
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
jr2 up
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
```text
|
|
89
|
+
…
|
|
90
|
+
effects: workflow "intake" — what it runs outside itself (ADR-0067)
|
|
91
|
+
triage: dispatch triage → this Orchestrator — 30s, in the Orchestrator's own process
|
|
92
|
+
…
|
|
93
|
+
converged — `jr2 run <workflow>` when ready
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`jr2 up` checks that the [Assembly](../reference/glossary.md#assembly) has a Workflow `triage`. It also compares the
|
|
97
|
+
`input` schema of the slot with the input that `triage` declares. When they do not agree, it stops before it changes the
|
|
98
|
+
cluster.
|
|
99
|
+
|
|
100
|
+
## Start the runs
|
|
101
|
+
|
|
102
|
+
Start the run of `intake` in one terminal. It stays at its Gate, `listening`, until you send `close`:
|
|
103
|
+
|
|
104
|
+
```sh
|
|
105
|
+
jr2 run intake
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
In a second terminal, send a report. `<run id>` is the id that `jr2 run` printed, or its first 4 characters or more:
|
|
109
|
+
|
|
110
|
+
```sh
|
|
111
|
+
jr2 send <run id> --gate listening --event report --input '{"request":"The greeting looks wrong sometimes."}'
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The Effect starts a run of `triage` with the input `{"request":"The greeting looks wrong sometimes."}`. When the
|
|
115
|
+
[Orchestrator](../reference/glossary.md#orchestrator) accepts the run, the Effect ends with `started`, and `intake` goes
|
|
116
|
+
back to `listening`.
|
|
117
|
+
|
|
118
|
+
## See the runs
|
|
119
|
+
|
|
120
|
+
[`jr2 runs`](../reference/cli.md#runs) lists the two runs. The run of `triage` has `dispatchedBy` after its id:
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
jr2 runs
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
```text
|
|
127
|
+
…
|
|
128
|
+
→ context kind-jr2 / namespace my-instance
|
|
129
|
+
workflows:
|
|
130
|
+
intake (machine)
|
|
131
|
+
ping (machine)
|
|
132
|
+
triage (machine)
|
|
133
|
+
[{"runId":"91ca85e1-5092-4e10-9ec6-d14e37811ca1","workflow":"intake","instanceId":"e51d124b-88e5-461c-b464-6a3660ee13dc","status":"active","value":"listening","context":{"started":["45b52048-0848-4015-ad56-6ff8ae33d817"],"request":"The greeting looks wrong sometimes.","last":{"outcome":"started","run":"45b52048-0848-4015-ad56-6ff8ae33d817"}},"children":[],"waiting":[],"held":[],"assembly":"3229103a2952","dispatched":[{"slot":"triage","run":"45b52048-0848-4015-ad56-6ff8ae33d817","at":"2026-10-24T06:20:43.465Z"}]},{"runId":"45b52048-0848-4015-ad56-6ff8ae33d817","dispatchedBy":{"run":"91ca85e1-5092-4e10-9ec6-d14e37811ca1","slot":"triage","effect":"08423831-751f-41e5-9d93-1fa063faaf61","depth":1},"workflow":"triage","instanceId":"a2ad6e54-6a52-45c2-81f4-89f408a27d1f","status":"active","value":"triaging","context":{"request":"The greeting looks wrong sometimes.","exchange":[]},"children":[],"waiting":[],"held":[],"assembly":"3229103a2952"}]
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The first line, `…`, is the line `→ .env:`, with the keys that the CLI took from `.env`. The lines on stderr list the
|
|
137
|
+
Workflows of the Instance. In `dispatchedBy`, `run` is the run that started it, `slot` is the slot of the Effect, and
|
|
138
|
+
`effect` is the id of that Effect in the record of the run that started it. jr2 uses it as the key of the start, so that
|
|
139
|
+
a start that jr2 sends again starts no second run. `depth` is the number of runs before it in the chain. `dispatched` of
|
|
140
|
+
`intake` lists each run that it started. Your ids, your time and your hash are different.
|
|
141
|
+
|
|
142
|
+
[`jr2 status`](../reference/cli.md#status) prints the link in both directions, on stderr. For the run of `intake`:
|
|
143
|
+
|
|
144
|
+
```text
|
|
145
|
+
dispatched: 45b52048-0848-4015-ad56-6ff8ae33d817 (triage)
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
For the run of `triage`:
|
|
149
|
+
|
|
150
|
+
```text
|
|
151
|
+
dispatched by: 91ca85e1-5092-4e10-9ec6-d14e37811ca1 (triage), depth 1
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
The two runs are independent. A `CANCEL` of `intake` does not cancel the run of `triage`. Answer the `clarify` Gate of
|
|
155
|
+
each run of `triage` as [Answer a Gate](answer-a-gate.md) tells.
|
|
156
|
+
|
|
157
|
+
## Wait for the run to end
|
|
158
|
+
|
|
159
|
+
To use the result of the run, add `wait: true` to the definition:
|
|
160
|
+
`dispatch("triage", { input: triageInput, wait: true })`.
|
|
161
|
+
|
|
162
|
+
The Effect then ends when the run of `triage` ends, with `{ outcome: "settled", run, status, output }`. `status` is
|
|
163
|
+
`done`, `failed`, `error`, `cancelled`, `lost` or `drifted`. `output` is the output of the Machine of that run, and for
|
|
164
|
+
`failed` it is the Failure, `{ reason, detail? }`. The default timeout is then 10 minutes. Set a different one with
|
|
165
|
+
`timeout`, such as `timeout: "1h"`. When the timeout comes first, `status` is `live`, and the run continues. On a
|
|
166
|
+
different Orchestrator, the Effect reads the run every 5 seconds. When its last read got no answer, the outcome is
|
|
167
|
+
`unknown`, not `settled`.
|
|
168
|
+
|
|
169
|
+
`wait` is fixed in the definition. A Machine that starts the same Workflow in the two ways has two slots.
|
|
170
|
+
|
|
171
|
+
## Start a run on a different Instance
|
|
172
|
+
|
|
173
|
+
To start a run on the Orchestrator of a different [Instance](../reference/glossary.md#instance), give a `target` in the
|
|
174
|
+
definition: `target: { url: "https://ops.example.com", token: secret("ops-instance") }`.
|
|
175
|
+
|
|
176
|
+
- `url` is the origin of the other Orchestrator: the scheme, the host and the port. It has no path.
|
|
177
|
+
- `token` names a secret that holds the Instance token of the other Instance. Put the secret in the
|
|
178
|
+
[`secrets`](../reference/config.md#secrets) list of `jr2.config.ts`, as for an `http` Effect. See
|
|
179
|
+
[Run a command or call a URL with an Effect](run-a-command-or-call-a-url.md).
|
|
180
|
+
- The Effect runs in the [Instance Effector](../reference/glossary.md#instance-effector), which holds the token.
|
|
181
|
+
`jr2 up` converges the Instance Effector for it.
|
|
182
|
+
- `jr2 up` asks the other Orchestrator for `GET /workflows/<name>` with no token, and compares its input. Each problem
|
|
183
|
+
is a warning, not a refusal: the other Instance can be down, or you can converge it later.
|
|
184
|
+
|
|
185
|
+
A Machine that you publish as a package can leave the target Open with `target: open`. The composer binds the url and
|
|
186
|
+
the token together:
|
|
187
|
+
`customize(<import>, { effects: { <slot>: { target: { url: "https://<host>", token: secret("<name>") } } } })`. See
|
|
188
|
+
[Bind a shipped Machine's Open parts](bind-open-parts.md).
|
|
189
|
+
|
|
190
|
+
## Rules
|
|
191
|
+
|
|
192
|
+
- The name of the Workflow is a constant, as `jr2 run` writes it:
|
|
193
|
+
``dispatch("<name>"): the Workflow is named as `jr2 run` names it — a Machine's filename stem ("review"), or "<wrapper>/<name>" for a named Chart: lowercase letters, digits and "-" (ADR-0071)``
|
|
194
|
+
- `wait` is a boolean: `dispatch("<name>", { wait }): wait is true or false — a slot that needs both declares two`
|
|
195
|
+
- The `input` option is a `z.object()`:
|
|
196
|
+
`dispatch("<name>", { input }): the input is a z.object(...) — the run's body is a JSON object (ADR-0071)`
|
|
197
|
+
- `timeout` is a positive duration:
|
|
198
|
+
`dispatch("<name>"): timeout "<timeout>" is not a positive duration (like "30s", "10m", "1h")`
|
|
199
|
+
- A target is an object with a `url` and a `token`, or `open`:
|
|
200
|
+
`dispatch("<name>", { target }): a target is { url: "https://<host>", token: secret("<name>") }, or open (ADR-0071)`
|
|
201
|
+
- The `url` of a target is an origin. The refusal starts with
|
|
202
|
+
`dispatch("<name>", { target }): "<url>" is not an origin — write the scheme and the host, with a port if it is not the scheme's, and no path, query or userinfo`.
|
|
203
|
+
- The `token` of a target is a secret:
|
|
204
|
+
`dispatch("<name>", { target }): the token is a secret("<name>") holding the target's Instance token (ADR-0071)`
|
|
205
|
+
- An Open target is the whole target, not its secret:
|
|
206
|
+
``dispatch("<name>", { target }): secret(open) in a target — the target is the Open part, not its secret: leave the whole target Open (`target: open`) and let the composer bind its url and token together (ADR-0071)``
|
|
207
|
+
- With no target, the Assembly must have the Workflow. `jr2 up` stops:
|
|
208
|
+
`refusing: workflow "<workflow>" dispatches "<name>" which no Workflow in the Assembly has — add workflows/<name>.ts, or name one it registers: <workflows> (ADR-0071)`
|
|
209
|
+
- With no target, the `input` schema of the slot must agree with the input that the Workflow declares. `jr2 up` stops,
|
|
210
|
+
with one line for each problem:
|
|
211
|
+
``refusing: workflow "<workflow>" dispatches "<name>" with input its door does not take: <problem> — align the slot's `input` with the door (derive it from the door's schema, `door.pick({ ... })`) (ADR-0071)``
|
|
212
|
+
- For a named Chart that `jr2 up` cannot see, it warns and continues. A runtime Chart is only on the volume of the
|
|
213
|
+
Orchestrator, and the Orchestrator checks it when `jr2 up` publishes. The warning starts with
|
|
214
|
+
`warning: workflow "<workflow>" dispatches "<wrapper>/<name>": the Assembly has no Chart file workflows/<wrapper>/<name>.chart.json`.
|
|
215
|
+
- For a target, each problem that `jr2 up` finds is a warning. For example, when the other Orchestrator does not answer:
|
|
216
|
+
`warning: dispatch "<name>" at <url>: no answer from this host (<error>) — the other Instance may be down, or reached only from inside its cluster; while no door answers, the dispatch settles "unreachable" (ADR-0071)`
|
|
217
|
+
- When the Orchestrator starts no run, the Effect ends with `refused`, not with an error. `report` holds the lines of
|
|
218
|
+
the refusal, and `status` is its status code:
|
|
219
|
+
- `400`: the Workflow does not take the input.
|
|
220
|
+
- `404`: the current Assembly has no Workflow of that name.
|
|
221
|
+
- `409`: the named Chart cannot run now, or a run of a different Workflow has the key of this start.
|
|
222
|
+
- `413`: the start is larger than the Effector reads.
|
|
223
|
+
- `422`: the door refuses the Chart in the input.
|
|
224
|
+
- `0`: the Effector refused the start before it sent it.
|
|
225
|
+
|
|
226
|
+
## Read next
|
|
227
|
+
|
|
228
|
+
- [Effects](../concepts/effects.md)
|
|
229
|
+
- [Machines and Workflows](../concepts/machines-and-workflows.md)
|
|
230
|
+
- [Durable runs](../concepts/durable-runs.md): `CANCEL`, and how long jr2 keeps a run.
|
|
231
|
+
- Reference: [`dispatch`](../reference/authoring-surface/dispatch.md),
|
|
232
|
+
[`DispatchOutput`](../reference/authoring-surface/type-dispatchoutput.md),
|
|
233
|
+
[`POST /workflows/:name/runs`](../reference/http-api.md#post-workflows-name-runs)
|
|
234
|
+
- [ADR-0071](../reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md): a run starts a run through a
|
|
235
|
+
`dispatch` Effect.
|
|
236
|
+
- [ADR-0049](../reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md): a Machine inside a run
|
|
237
|
+
is composed by invoke.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Start a run
|
|
3
|
+
description: Start a run of a Workflow from the CLI, from the Console, or with a call to the HTTP API.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Start a run
|
|
7
|
+
|
|
8
|
+
Start a run of a [Workflow](../reference/glossary.md#workflow) from the CLI, from the
|
|
9
|
+
[Console](../reference/glossary.md#console), or with a call to the HTTP API.
|
|
10
|
+
|
|
11
|
+
A Workflow is a [Machine](../reference/glossary.md#machine) that your [Instance](../reference/glossary.md#instance)
|
|
12
|
+
registers. Its name is the name of its file in `workflows/`, without `.ts`. Thus `workflows/ping.ts` is the Workflow
|
|
13
|
+
`ping`. A named [Chart](../reference/glossary.md#chart) is a Workflow too, with the name `<wrapper>/<name>`: start it
|
|
14
|
+
with `jr2 run <wrapper>/<name>`. See [Run a Chart by name](run-a-chart-by-name.md). A run is one execution of that
|
|
15
|
+
Machine. The run input is a JSON object, and the Machine reads it when the run starts.
|
|
16
|
+
|
|
17
|
+
The examples on this page start `ping`, the Workflow that `jr2 init` writes. In the commands, replace `<namespace>` with
|
|
18
|
+
the namespace of your Instance. It is the [`name`](../reference/config.md#name) in `jr2.config.ts`. When `jr2.config.ts`
|
|
19
|
+
sets no `name`, it is the name of the Instance folder.
|
|
20
|
+
|
|
21
|
+
## Start a run from the CLI
|
|
22
|
+
|
|
23
|
+
Run [`jr2 run`](../reference/cli.md#run) in the Instance folder, with the name of the Workflow. Give the run input in
|
|
24
|
+
`--input`:
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
jr2 run ping --input '{"message":"hi"}'
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
→ context <context> / namespace <namespace>
|
|
32
|
+
run e3972b4c-eef9-4e7d-9068-3556332d2ba6 (ping) — attached
|
|
33
|
+
→ done "done"
|
|
34
|
+
{"runId":"e3972b4c-eef9-4e7d-9068-3556332d2ba6","workflow":"ping","instanceId":"8e13475a-d325-45d4-bc64-0627086e97ba","status":"done","value":"done","context":{"message":"hi","reply":"pong: hi"},"children":[],"waiting":[],"held":[],"assembly":"16f4181d70d9"}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Your run id, your instance id and your `assembly` hash are different. When your Instance folder has a `.env` file, the
|
|
38
|
+
output starts with one more line, `→ .env:`, with the keys that the CLI took from it.
|
|
39
|
+
|
|
40
|
+
- `jr2 run` finds the [Orchestrator](../reference/glossary.md#orchestrator) in the current kubectl context, in the
|
|
41
|
+
namespace of the Instance. The first line names the two. To use a different context or namespace, add
|
|
42
|
+
`--context <ctx>` or `-n <ns>`.
|
|
43
|
+
- The lines before the last are activity, on stderr. An indented line that starts with `→` is a change of the run's
|
|
44
|
+
status and its state. [Watch a run](watch-a-run.md) gives each kind of activity line.
|
|
45
|
+
- The last line is the result, on stdout: the status of the run when it ends, as one JSON object. Thus
|
|
46
|
+
`jr2 run ping … | jq` gets only the result.
|
|
47
|
+
- `jr2 run` stays attached until the run ends. A run that waits at a [Gate](../reference/glossary.md#gate) does not end,
|
|
48
|
+
so `jr2 run` waits too. To answer the Gate, use a second terminal. See [Answer a Gate](answer-a-gate.md).
|
|
49
|
+
- When you stop `jr2 run`, for example with Ctrl-C, the run continues in the Orchestrator. To attach again, run
|
|
50
|
+
`jr2 logs -f <run id>`.
|
|
51
|
+
- `jr2 run` exits with `0` only when the run ends with the status `done`. It exits with `1` for each other end:
|
|
52
|
+
`failed`, `error`, `cancelled`, `lost` and `drifted`, and also when the run stops before it ends. For a run that ends
|
|
53
|
+
`failed`, the line `failed: <reason>` on stderr gives the reason.
|
|
54
|
+
|
|
55
|
+
### Start a run and return at once
|
|
56
|
+
|
|
57
|
+
Add `--detach`. `jr2 run` starts the run, prints its run id on stdout, and returns:
|
|
58
|
+
|
|
59
|
+
```sh
|
|
60
|
+
jr2 run ping --input '{"message":"hi"}' --detach
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
→ context <context> / namespace <namespace>
|
|
65
|
+
{"runId":"fc8b82d1-bd73-498d-9057-ef13cf962240"}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Use the run id, or its first 4 characters or more, with `jr2 status`, `jr2 logs` and `jr2 send`.
|
|
69
|
+
|
|
70
|
+
## Start a run from the Console
|
|
71
|
+
|
|
72
|
+
You need the Instance token to start a run from the Console. [Open the Console](open-the-console.md) tells how to open
|
|
73
|
+
it and how to get the token.
|
|
74
|
+
|
|
75
|
+
1. Open the Console.
|
|
76
|
+
2. Type the Instance token in the `instance token` box in the nav.
|
|
77
|
+
3. Push Enter. The badge beside the box shows `…`, then `live`.
|
|
78
|
+
4. In the Fleet rail on the left, find the Workflow. Click `start` beside its name.
|
|
79
|
+
5. Fill in the form. When the Machine declares its input, the form has one field for each property of the input. A field
|
|
80
|
+
that has `*` after its name is necessary. When the Machine declares no input, the form has a box for the run input as
|
|
81
|
+
JSON. An empty box starts the run with `{}`.
|
|
82
|
+
6. Click `start run`.
|
|
83
|
+
|
|
84
|
+
While the run continues, the number beside the name of the Workflow counts it. To see the run, click the name of the
|
|
85
|
+
Workflow, or click `▸` beside it. When the Orchestrator refuses the input, the form shows the refusal text below the
|
|
86
|
+
`start run` button, and no run starts.
|
|
87
|
+
|
|
88
|
+
The form makes a text field for a property that is an object or an array. Thus the Orchestrator refuses the text,
|
|
89
|
+
because it is a string. For such an input, start the run from the CLI or with the HTTP API.
|
|
90
|
+
|
|
91
|
+
The `start` button shows only while the badge shows `live`. Without the token, the Console shows the runs, but you
|
|
92
|
+
cannot start one.
|
|
93
|
+
|
|
94
|
+
## Start a run with the HTTP API
|
|
95
|
+
|
|
96
|
+
Send [`POST /workflows/:name/runs`](../reference/http-api.md#post-workflows-name-runs) to the Orchestrator, with the
|
|
97
|
+
Instance token. The body is the run input. A script, a webhook handler or a CI job can start a run this way.
|
|
98
|
+
|
|
99
|
+
`jr2 up` makes the Service `jr2-orchestrator` on port 4000, with no address outside the cluster. Thus a caller outside
|
|
100
|
+
the cluster uses a port forward, or an address that you make for the Service.
|
|
101
|
+
|
|
102
|
+
Forward a port to the Orchestrator. Keep this command open:
|
|
103
|
+
|
|
104
|
+
```sh
|
|
105
|
+
kubectl -n <namespace> port-forward svc/jr2-orchestrator 4000:4000
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
In a second terminal, get the Instance token into a variable:
|
|
109
|
+
|
|
110
|
+
```sh
|
|
111
|
+
TOKEN=$(kubectl -n <namespace> get secret jr2-instance -o jsonpath='{.data.JR2_INSTANCE_TOKEN}' | base64 -d)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Start the run:
|
|
115
|
+
|
|
116
|
+
```sh
|
|
117
|
+
curl -s -X POST http://localhost:4000/workflows/ping/runs \
|
|
118
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
119
|
+
-H "Content-Type: application/json" \
|
|
120
|
+
-d '{"message":"hi"}'
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
{"runId":"41cfa794-3501-43f3-8b0d-48c83d9fea88","instanceId":"4e334e60-c4ba-4f63-8560-d86d649675f6"}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The status code is `201`. `runId` is the id of the run. `instanceId` is the
|
|
128
|
+
[Instance ID](../reference/glossary.md#instance-id) that the run starts with. It is not the run id.
|
|
129
|
+
|
|
130
|
+
When the Machine declares its input, the run starts with the input as the schema reads it. A `z.object` schema removes a
|
|
131
|
+
property that it does not name, and it adds each default that it sets. When the Machine declares no input, the run
|
|
132
|
+
starts with the JSON object that you send.
|
|
133
|
+
|
|
134
|
+
To find the input that a Workflow takes, send [`GET /workflows/:name`](../reference/http-api.md#get-workflows-name) with
|
|
135
|
+
`Accept: application/json`. This route needs no token. `input` is the input schema of the Machine, as JSON Schema, or
|
|
136
|
+
`null` when the Machine declares no input:
|
|
137
|
+
|
|
138
|
+
```sh
|
|
139
|
+
curl -s http://localhost:4000/workflows/ping -H "Accept: application/json"
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
```text
|
|
143
|
+
{"name":"ping","machineId":"ping","input":null}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
[`GET /workflows`](../reference/http-api.md#get-workflows) gives all the Workflows, each with where it comes from, and
|
|
147
|
+
the named Charts of each Chart wrapper. It also needs no token. [`jr2 runs`](../reference/cli.md#runs) prints the same
|
|
148
|
+
list on stderr.
|
|
149
|
+
|
|
150
|
+
### Use the CLI without the Instance folder
|
|
151
|
+
|
|
152
|
+
The CLI can also speak to an Orchestrator at a URL. Then it does not look for the Instance folder or for a kubectl
|
|
153
|
+
context. Give the URL in `--url`, or in `JR2_URL`. Give the Instance token in `JR2_TOKEN`:
|
|
154
|
+
|
|
155
|
+
```sh
|
|
156
|
+
JR2_URL=http://localhost:4000 JR2_TOKEN=$TOKEN jr2 run ping --input '{"message":"hi"}' --detach
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
```text
|
|
160
|
+
→ http://localhost:4000
|
|
161
|
+
{"runId":"d28309a1-f8bc-4e15-b4c6-3f2b1642e826"}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Rules
|
|
165
|
+
|
|
166
|
+
- `jr2 run` with no Workflow name starts no run. It prints its usage and exits with `2`:
|
|
167
|
+
`usage: jr2 run <workflow> [--input <json>] [--detach] [--url <u>] [-n <ns>] [--context <ctx>]`
|
|
168
|
+
- The Orchestrator refuses a name that no file in `workflows/` registers, with the status code `404`:
|
|
169
|
+
`no workflow registered as "<workflow>"`. `jr2 run` prints `error: no workflow registered as "<workflow>"` and exits
|
|
170
|
+
with `1`. It also prints the version of the Instance in one more line:
|
|
171
|
+
``instance: <version> (<hash>) — if it predates this CLI, `jr2 up` converges the cluster to this kit``. `<hash>` is
|
|
172
|
+
the hash of the current [Assembly](../reference/glossary.md#assembly).
|
|
173
|
+
- When the Machine declares its input, the Orchestrator checks each run input against it. It refuses an input that does
|
|
174
|
+
not agree, with the status code `400`: `invalid input for workflow "<workflow>": <issues>`. `<issues>` is the list of
|
|
175
|
+
the problems as JSON. The Console shows the same text below its form.
|
|
176
|
+
- The Console form starts no run when its box holds text that is not a JSON object. It shows `not valid JSON` or
|
|
177
|
+
`the body must be a JSON object`.
|
|
178
|
+
- `jr2 run` starts no run when `--input` is not valid JSON. It prints `error: <message>`, where `<message>` is the
|
|
179
|
+
message of the JSON parser, and exits with `1`.
|
|
180
|
+
- The Orchestrator refuses a start without the Instance token, with the status code `401`: `unauthorized`.
|
|
181
|
+
- The Orchestrator refuses a start with the token of a [Sandbox](../reference/glossary.md#sandbox), with the status code
|
|
182
|
+
`403`: `run state and control need the Instance token — a Sandbox token has neither`. Thus an
|
|
183
|
+
[Agent](../reference/glossary.md#agent) cannot start a run.
|
|
184
|
+
- `jr2 run` outside an Instance folder, with no `--url` and no `JR2_URL`, starts no run:
|
|
185
|
+
`error: not inside a jr2 instance — no jr2.config.ts found walking up from cwd`
|
|
186
|
+
- `jr2 run` starts no run when the namespace holds no Instance:
|
|
187
|
+
``error: not deployed here — right context? (context <context>, namespace <namespace>; `jr2 up` deploys)``
|
|
188
|
+
- `jr2 run` starts no run when kubectl has no current context:
|
|
189
|
+
``error: no kube context — `kind create cluster` (or point kubectl at one), then `jr2 up` ``
|
|
190
|
+
- When the connection to the Orchestrator ends before the run ends, for example when the Orchestrator stops, `jr2 run`
|
|
191
|
+
prints `error: <message>` and exits with `1`. The run continues when the Orchestrator starts again. To attach again,
|
|
192
|
+
run `jr2 logs -f <run id>`.
|
|
193
|
+
- When the Orchestrator holds the run but did not continue it, `jr2 run` exits with `1`:
|
|
194
|
+
``run <run id> is parked: stopped before it settled — `jr2 logs -f <run id>` follows it once restored``
|
|
195
|
+
|
|
196
|
+
## Read next
|
|
197
|
+
|
|
198
|
+
- [Machines and Workflows](../concepts/machines-and-workflows.md)
|
|
199
|
+
- [ADR-0009](../reference/decisions/0009-cli-and-instance-interface.md): `jr2 run`, its output, and its exit codes.
|
|
200
|
+
- [ADR-0019](../reference/decisions/0019-one-converging-command-against-the-current-context.md): how the CLI finds the
|
|
201
|
+
Orchestrator.
|
|
202
|
+
- [ADR-0033](../reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md): the input that a Machine
|
|
203
|
+
declares.
|
|
204
|
+
- [ADR-0058](../reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md): why only the Instance token
|
|
205
|
+
starts a run.
|
|
206
|
+
- [Answer a Gate](answer-a-gate.md)
|
|
207
|
+
- [Watch a run](watch-a-run.md)
|