@jr2/orchestrator 0.6.0 → 0.7.0
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/console/components/app.ts +55 -15
- package/console/components/bottom-drawer.ts +259 -0
- package/console/components/drawer.ts +14 -6
- package/console/components/fleet.ts +36 -13
- package/console/components/machine-pane.ts +61 -5
- package/console/components/nav.ts +54 -8
- package/console/conversation.ts +161 -0
- package/console/login.ts +123 -0
- package/console/main.ts +600 -60
- package/console/store.ts +611 -64
- package/console/style.css +231 -0
- package/docs/agents-block.md +2 -2
- package/docs/concepts/agents-and-turns.md +86 -9
- package/docs/concepts/architecture.md +41 -28
- package/docs/concepts/callers-and-hooks.md +205 -0
- package/docs/concepts/charts.md +7 -5
- package/docs/concepts/composition.md +10 -1
- package/docs/concepts/converge.md +4 -2
- package/docs/concepts/durable-runs.md +43 -16
- package/docs/concepts/effects.md +50 -22
- package/docs/concepts/gates.md +95 -25
- package/docs/concepts/machines-and-workflows.md +5 -4
- package/docs/concepts/pools-and-sources.md +187 -11
- package/docs/concepts/secrets-and-trust.md +73 -33
- package/docs/concepts/the-menu.md +11 -0
- package/docs/concepts/workspaces.md +6 -5
- package/docs/get-started/a-model-decides.md +14 -13
- package/docs/get-started/an-agent-in-a-sandbox.md +43 -34
- package/docs/get-started/connect-a-model.md +1 -1
- package/docs/get-started/create-an-instance.md +17 -14
- package/docs/guides/add-tools-to-the-sandbox.md +55 -11
- package/docs/guides/answer-a-gate-from-a-forge.md +304 -0
- package/docs/guides/answer-a-gate.md +74 -37
- package/docs/guides/bind-open-parts.md +24 -8
- package/docs/guides/call-an-mcp-tool-from-a-machine.md +572 -0
- package/docs/guides/cancel-a-run.md +26 -16
- package/docs/guides/fix-a-failed-converge.md +18 -6
- package/docs/guides/give-a-caller-a-scope.md +203 -0
- package/docs/guides/give-an-agent-mcp-tools.md +422 -0
- package/docs/guides/iterate-on-a-machine-on-kind.md +10 -9
- package/docs/guides/let-an-agent-write-a-chart.md +9 -6
- package/docs/guides/look-inside-a-sandbox.md +101 -31
- package/docs/guides/open-the-console.md +63 -14
- package/docs/guides/read-a-conversation.md +225 -0
- package/docs/guides/run-a-chart-by-name.md +17 -16
- package/docs/guides/run-one-worker-per-item.md +15 -9
- package/docs/guides/set-an-agents-access-and-dials.md +2 -0
- package/docs/guides/start-a-run-for-each-alert.md +290 -0
- package/docs/guides/start-a-run-from-a-run.md +18 -16
- package/docs/guides/start-a-run.md +24 -18
- package/docs/guides/steer-an-agent.md +332 -0
- package/docs/guides/use-a-hosted-provider.md +1 -1
- package/docs/guides/watch-a-run.md +127 -121
- package/docs/guides/write-a-hook-kind.md +238 -0
- package/docs/guides/write-a-tool-as-an-mcp-server.md +351 -0
- package/docs/guides/write-a-workflow.md +17 -7
- package/docs/llms.txt +81 -15
- package/docs/reference/authoring-surface/agent.md +1 -1
- package/docs/reference/authoring-surface/answer.md +1 -1
- package/docs/reference/authoring-surface/arg.md +1 -1
- package/docs/reference/authoring-surface/basic.md +1 -1
- package/docs/reference/authoring-surface/bearer.md +1 -1
- package/docs/reference/authoring-surface/branchname.md +1 -1
- package/docs/reference/authoring-surface/carry.md +23 -0
- package/docs/reference/authoring-surface/chartschema.md +1 -1
- package/docs/reference/authoring-surface/chartschemafor.md +1 -1
- package/docs/reference/authoring-surface/command.md +1 -1
- package/docs/reference/authoring-surface/customize.md +4 -1
- package/docs/reference/authoring-surface/defineconfig.md +1 -1
- package/docs/reference/authoring-surface/defineevent.md +1 -1
- package/docs/reference/authoring-surface/dispatch.md +5 -4
- package/docs/reference/authoring-surface/fail.md +1 -1
- package/docs/reference/authoring-surface/file.md +1 -1
- package/docs/reference/authoring-surface/frompick.md +1 -1
- package/docs/reference/authoring-surface/gate.md +118 -0
- package/docs/reference/authoring-surface/group-agents.md +15 -0
- package/docs/reference/authoring-surface/group-charts.md +16 -0
- package/docs/reference/authoring-surface/group-composition.md +25 -0
- package/docs/reference/authoring-surface/group-config.md +17 -0
- package/docs/reference/authoring-surface/group-effects.md +48 -0
- package/docs/reference/authoring-surface/group-failure.md +13 -0
- package/docs/reference/authoring-surface/group-gates.md +16 -0
- package/docs/reference/authoring-surface/group-machine-and-events.md +15 -0
- package/docs/reference/authoring-surface/group-steering.md +12 -0
- package/docs/reference/authoring-surface/group-types-these-signatures-name.md +137 -0
- package/docs/reference/authoring-surface/group-workspaces-and-repos.md +15 -0
- package/docs/reference/authoring-surface/http.md +1 -1
- package/docs/reference/authoring-surface/isfailure.md +1 -1
- package/docs/reference/authoring-surface/isready.md +1 -1
- package/docs/reference/authoring-surface/jr2setup.md +13 -3
- package/docs/reference/authoring-surface/mcp.md +107 -0
- package/docs/reference/authoring-surface/open.md +5 -3
- package/docs/reference/authoring-surface/openbody.md +1 -1
- package/docs/reference/authoring-surface/paramsof.md +1 -1
- package/docs/reference/authoring-surface/pool.md +77 -9
- package/docs/reference/authoring-surface/push.md +1 -1
- package/docs/reference/authoring-surface/readyof.md +1 -1
- package/docs/reference/authoring-surface/reread.md +19 -0
- package/docs/reference/authoring-surface/secret.md +1 -1
- package/docs/reference/authoring-surface/sentby.md +1 -1
- package/docs/reference/authoring-surface/skip.md +22 -0
- package/docs/reference/authoring-surface/source.md +56 -1
- package/docs/reference/authoring-surface/steer.md +93 -0
- package/docs/reference/authoring-surface/text.md +1 -1
- package/docs/reference/authoring-surface/type-agentdefinition.md +14 -1
- package/docs/reference/authoring-surface/type-agentmcpserver.md +54 -0
- package/docs/reference/authoring-surface/type-anyframepath.md +1 -1
- package/docs/reference/authoring-surface/type-anyworktreepath.md +1 -1
- package/docs/reference/authoring-surface/type-binding.md +1 -1
- package/docs/reference/authoring-surface/type-caller.md +40 -0
- package/docs/reference/authoring-surface/type-callerrecord.md +32 -0
- package/docs/reference/authoring-surface/type-carry.md +19 -0
- package/docs/reference/authoring-surface/type-chainlink.md +3 -3
- package/docs/reference/authoring-surface/type-commandoutput.md +1 -1
- package/docs/reference/authoring-surface/type-customize.md +16 -1
- package/docs/reference/authoring-surface/type-delivered.md +17 -0
- package/docs/reference/authoring-surface/type-deliveredevent.md +18 -0
- package/docs/reference/authoring-surface/type-dispatchdefinition.md +4 -3
- package/docs/reference/authoring-surface/type-dispatchoutput.md +1 -1
- package/docs/reference/authoring-surface/type-effectbinding.md +12 -2
- package/docs/reference/authoring-surface/type-framepath.md +1 -1
- package/docs/reference/authoring-surface/type-gatebinding.md +15 -0
- package/docs/reference/authoring-surface/type-gatehooks.md +12 -0
- package/docs/reference/authoring-surface/type-gatelook.md +37 -0
- package/docs/reference/authoring-surface/type-gateoutcome.md +32 -0
- package/docs/reference/authoring-surface/type-gatereply.md +19 -0
- package/docs/reference/authoring-surface/type-gateslot.md +21 -0
- package/docs/reference/authoring-surface/type-gateslotinput.md +13 -0
- package/docs/reference/authoring-surface/type-gateslotparts.md +18 -0
- package/docs/reference/authoring-surface/type-gateslots.md +12 -0
- package/docs/reference/authoring-surface/type-gatetypesat.md +13 -0
- package/docs/reference/authoring-surface/type-hostinjectedinput.md +1 -1
- package/docs/reference/authoring-surface/type-httpoutput.md +1 -1
- package/docs/reference/authoring-surface/type-jr2config.md +37 -2
- package/docs/reference/authoring-surface/type-lateroutcome.md +1 -1
- package/docs/reference/authoring-surface/type-lends.md +5 -1
- package/docs/reference/authoring-surface/type-lookoutput.md +14 -0
- package/docs/reference/authoring-surface/type-mcpcalloutput.md +78 -0
- package/docs/reference/authoring-surface/type-mcpnotreturned.md +42 -0
- package/docs/reference/authoring-surface/type-mcpoptions.md +47 -0
- package/docs/reference/authoring-surface/type-mcpoutput.md +50 -0
- package/docs/reference/authoring-surface/type-mcpreadoutput.md +53 -0
- package/docs/reference/authoring-surface/type-mcpremoteserver.md +50 -0
- package/docs/reference/authoring-surface/type-mcpserver.md +41 -0
- package/docs/reference/authoring-surface/type-mcpstdioserver.md +42 -0
- package/docs/reference/authoring-surface/type-namedsecret.md +4 -4
- package/docs/reference/authoring-surface/type-openbodydeclaration.md +1 -1
- package/docs/reference/authoring-surface/type-openbodyoutput.md +1 -1
- package/docs/reference/authoring-surface/type-poolnextinput.md +1 -1
- package/docs/reference/authoring-surface/type-poolspec.md +11 -6
- package/docs/reference/authoring-surface/type-pushoutput.md +1 -1
- package/docs/reference/authoring-surface/type-pushsourcespec.md +38 -0
- package/docs/reference/authoring-surface/type-readsourcespec.md +47 -0
- package/docs/reference/authoring-surface/type-reposlot.md +1 -1
- package/docs/reference/authoring-surface/type-reread.md +18 -0
- package/docs/reference/authoring-surface/type-runsconfig.md +41 -0
- package/docs/reference/authoring-surface/type-sender.md +26 -1
- package/docs/reference/authoring-surface/type-sendercallerfield.md +14 -0
- package/docs/reference/authoring-surface/type-size.md +1 -1
- package/docs/reference/authoring-surface/type-skip.md +19 -0
- package/docs/reference/authoring-surface/type-sourcehooks.md +23 -0
- package/docs/reference/authoring-surface/type-sourcein.md +25 -0
- package/docs/reference/authoring-surface/type-sourcereply.md +18 -0
- package/docs/reference/authoring-surface/type-sourcespec.md +16 -7
- package/docs/reference/authoring-surface/type-sourceverdict.md +49 -0
- package/docs/reference/authoring-surface/type-standingpoolmachine.md +12 -0
- package/docs/reference/authoring-surface/type-standingpoolspec.md +51 -0
- package/docs/reference/authoring-surface/type-steerargs.md +20 -0
- package/docs/reference/authoring-surface/type-thinkinglevel.md +1 -1
- package/docs/reference/authoring-surface/type-usercontainer.md +1 -1
- package/docs/reference/authoring-surface/type-workspaced.md +1 -1
- package/docs/reference/authoring-surface/type-worktreefound.md +3 -3
- package/docs/reference/authoring-surface/type-worktreeinput.md +1 -1
- package/docs/reference/authoring-surface/type-worktreeoptions.md +1 -1
- package/docs/reference/authoring-surface/type-worktreeoutput.md +1 -1
- package/docs/reference/authoring-surface/type-worktreepath.md +1 -1
- package/docs/reference/authoring-surface/type-worktreeready.md +1 -1
- package/docs/reference/authoring-surface/type-worktreerefused.md +4 -4
- package/docs/reference/authoring-surface/workspace.md +1 -1
- package/docs/reference/authoring-surface/worktree.md +1 -1
- package/docs/reference/authoring-surface.md +88 -167
- package/docs/reference/cli.md +413 -74
- package/docs/reference/config.md +235 -2
- package/docs/reference/decisions/0002-duplex-streaming-actor.md +71 -11
- package/docs/reference/decisions/0005-sandbox-pod-composition.md +14 -10
- package/docs/reference/decisions/0006-agent-control-surface.md +4 -4
- package/docs/reference/decisions/0007-durable-machine-state.md +1 -1
- package/docs/reference/decisions/0009-cli-and-instance-interface.md +150 -49
- package/docs/reference/decisions/0010-bdd-acceptance-tests.md +5 -3
- package/docs/reference/decisions/0011-workflow-defined-events.md +256 -12
- package/docs/reference/decisions/0012-workspace-wrapper-machine.md +9 -2
- package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +20 -14
- package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +53 -27
- package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +18 -14
- package/docs/reference/decisions/0017-pool-over-a-source-port.md +226 -12
- package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +15 -7
- package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +32 -18
- package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +14 -1
- package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +4 -4
- package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +116 -34
- package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +38 -37
- package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +10 -5
- package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +7 -6
- package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +23 -7
- package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +18 -10
- package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +3 -2
- package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +23 -18
- package/docs/reference/decisions/0032-the-console-unlocks-with-a-callers-credential.md +101 -0
- package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +4 -3
- package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +6 -6
- package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +5 -4
- package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +19 -19
- package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +6 -1
- package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +55 -40
- package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +14 -13
- package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +7 -0
- package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +13 -7
- package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +38 -30
- package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +64 -17
- package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +2 -1
- package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +2 -2
- package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-kept-for-a-set-time.md +109 -0
- package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +51 -23
- package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +94 -54
- package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +101 -47
- package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +32 -9
- package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +17 -13
- package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +56 -30
- package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +35 -25
- package/docs/reference/decisions/0075-a-machine-cuts-a-worktree-and-the-workspace-only-clones.md +4 -3
- package/docs/reference/decisions/0076-an-agents-control-credential-lives-only-where-no-workspace-code-runs.md +37 -10
- package/docs/reference/decisions/0078-a-caller-comes-from-one-authenticator-seam-and-acts-within-its-scopes.md +285 -0
- package/docs/reference/decisions/0079-an-agent-holds-mcp-tools-a-machine-calls-them-as-an-effect-and-the-machine-is-the-approval.md +198 -0
- package/docs/reference/decisions.md +6 -4
- package/docs/reference/glossary.md +96 -42
- package/docs/reference/hooks.md +1077 -0
- package/docs/reference/http-api.md +976 -149
- package/docs/why.md +2 -1
- package/package.json +10 -3
- package/src/actor.ts +36 -10
- package/src/agent.ts +50 -0
- package/src/assembly-checks.ts +530 -4
- package/src/callers.ts +245 -0
- package/src/chart.ts +52 -7
- package/src/config.ts +550 -1
- package/src/conversations.ts +453 -0
- package/src/custodian.ts +8 -2
- package/src/customize.ts +143 -4
- package/src/dispatch-effect.ts +142 -26
- package/src/durability.ts +2 -0
- package/src/duration.ts +20 -0
- package/src/effect-checks.ts +2 -1
- package/src/effect.ts +60 -7
- package/src/effector-wire.ts +272 -27
- package/src/gate-brand.ts +16 -0
- package/src/gate.ts +634 -48
- package/src/harness-client.ts +10 -4
- package/src/held-secrets.ts +72 -23
- package/src/holds.ts +2 -2
- package/src/hook-kinds/discord.ts +92 -0
- package/src/hook-kinds/door.ts +107 -0
- package/src/hook-kinds/github.ts +89 -0
- package/src/hook-kinds/gitlab.ts +72 -0
- package/src/hook-kinds/hook.ts +7 -0
- package/src/hook-kinds/index.ts +465 -0
- package/src/hook-kinds/slack.ts +151 -0
- package/src/hook-kinds/webhook.ts +113 -0
- package/src/hooks.ts +506 -0
- package/src/http-effect.ts +76 -38
- package/src/http.ts +889 -94
- package/src/index.ts +16 -5
- package/src/instance.ts +196 -26
- package/src/internal.ts +22 -3
- package/src/machine-doc.ts +26 -1
- package/src/mcp-effect.ts +424 -0
- package/src/mount-digest.ts +41 -7
- package/src/names.ts +64 -2
- package/src/notices.ts +138 -10
- package/src/open-body.ts +25 -11
- package/src/open-effect.ts +17 -4
- package/src/open.ts +4 -2
- package/src/parts.ts +87 -9
- package/src/party.ts +2 -1
- package/src/pick.ts +2 -2
- package/src/pool.ts +1142 -163
- package/src/registration.ts +203 -13
- package/src/run-host.ts +1509 -171
- package/src/run-list.ts +191 -0
- package/src/sandbox-kube.ts +53 -5
- package/src/secret-placement.ts +239 -33
- package/src/server.ts +53 -4
- package/src/setup.ts +72 -32
- package/src/snapshot-store.ts +565 -48
- package/src/steer.ts +111 -0
- package/src/stub-harness.ts +6 -2
- package/src/tokens.ts +263 -22
- package/src/wire.ts +17 -0
- package/src/workspace.ts +50 -6
- package/src/worktree.ts +3 -3
- package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +0 -61
- package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +0 -65
|
@@ -5,7 +5,7 @@ description: "The parts of one Machine that `customize()` can retune: its Agents
|
|
|
5
5
|
|
|
6
6
|
# `Customize`
|
|
7
7
|
|
|
8
|
-
Type, in `@jr2/orchestrator/src/customize.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Type, in `@jr2/orchestrator/src/customize.ts`. It is an export of `@jr2/orchestrator`, in the [Composition](group-composition.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
11
|
type Customize<M extends AnyStateMachine> = {
|
|
@@ -15,6 +15,14 @@ type Customize<M extends AnyStateMachine> = {
|
|
|
15
15
|
effects?: [OpenEffectSlots<Reached<M>>] extends [never]
|
|
16
16
|
? never
|
|
17
17
|
: { [K in OpenEffectSlots<Reached<M>>]?: BindingOf<LogicAt<Reached<M>, K>> };
|
|
18
|
+
gates?: [GateSlots<Reached<M>>] extends [never]
|
|
19
|
+
? never
|
|
20
|
+
: {
|
|
21
|
+
[K in GateSlots<Reached<M>>]?: GateBinding<
|
|
22
|
+
GateTypesAt<Reached<M>, K>["meta"],
|
|
23
|
+
GateTypesAt<Reached<M>, K>["ev"]
|
|
24
|
+
>;
|
|
25
|
+
};
|
|
18
26
|
actors?: [ChildSlots<Reached<M>>] extends [never]
|
|
19
27
|
? never
|
|
20
28
|
: { [K in ChildSlots<Reached<M>>]?: Customize<ChildAt<Reached<M>, K>> };
|
|
@@ -54,6 +62,13 @@ Every key is optional. Write only what you change.
|
|
|
54
62
|
whose target is Open. For an Effect with two Open parts, one object holds both keys, and
|
|
55
63
|
a binding that leaves one out does not compile. Only Effects with an Open part are offered.
|
|
56
64
|
See [`EffectBinding`](type-effectbinding.md) for the values and the refusals.
|
|
65
|
+
- `gates` (optional): `[ GateSlots<Reached<M>> ] extends [ never ] ? never : { [K in GateSlots<Reached<M>>]?: GateBinding<GateTypesAt<Reached<M>, K>["meta"], GateTypesAt<Reached<M>, K>["ev"]>; }`
|
|
66
|
+
|
|
67
|
+
Bind the look of a Gate slot (`gate({ … })`) that a package left `open`, and add, replace or
|
|
68
|
+
remove its handlers by Hook kind id and event key (`null` removes one), by slot name:
|
|
69
|
+
`{ review: { look, hooks: { gitlab: { "note.MergeRequest": null } } } }`. At run time,
|
|
70
|
+
`customize()` refuses a slot that holds no Gate slot: `customize(): machine "<id>" carries no
|
|
71
|
+
Gate slot "<slot>" — its Gate slots are: <slots>`.
|
|
57
72
|
- `actors` (optional): `[ ChildSlots<Reached<M>> ] extends [ never ] ? never : { [K in ChildSlots<Reached<M>>]?: Customize<ChildAt<Reached<M>, K>>; }`
|
|
58
73
|
|
|
59
74
|
Retune a Machine that this Machine composes, by slot name. The value has the same shape as
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Delivered
|
|
3
|
+
description: "One plain event of a list of defs: `{ type: \"approve\", by }`."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `Delivered`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/gate.ts`. It is an export of `@jr2/orchestrator`, in the [Gates](group-gates.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type Delivered<D extends readonly EventDef[]> = {
|
|
12
|
+
[K in keyof D]: D[K] extends EventDef ? EventFrom<D[K]> : never;
|
|
13
|
+
}[number];
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
One plain event of a list of defs: `{ type: "approve", by }`. What a handler, a look's `until`
|
|
17
|
+
and a Gate's `reply` see.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: DeliveredEvent
|
|
3
|
+
description: "A workflow event as delivered into a Machine: the def's name as `type`, plus its payload."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `DeliveredEvent`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/registration.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type DeliveredEvent = { type: string } & Record<string, unknown>;
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
A workflow event as delivered into a Machine: the def's name as `type`, plus its payload.
|
|
15
|
+
|
|
16
|
+
**Fields**
|
|
17
|
+
|
|
18
|
+
- `type`: `string`
|
|
@@ -34,6 +34,7 @@ The definition of a `dispatch` Effect ([ADR-0071](../decisions/0071-a-run-starts
|
|
|
34
34
|
How long the Effect waits: by default 30s for the start, and 10m with `wait`.
|
|
35
35
|
- `target` (optional): `{ url: string; token: NamedSecret; } | typeof open`
|
|
36
36
|
|
|
37
|
-
A different Orchestrator: `url` is its origin, and `token` is the secret that holds
|
|
38
|
-
|
|
39
|
-
<slot>: { target: { url, token
|
|
37
|
+
A different Orchestrator: `url` is its origin, and `token` is the secret that holds the token
|
|
38
|
+
of a Caller of it with `start` for the Workflow, and `read` too when `wait` is true. Or `open`,
|
|
39
|
+
which the composer binds with `customize(<import>, { effects: { <slot>: { target: { url, token
|
|
40
|
+
} } } })`. Without it, the run starts in this Orchestrator.
|
|
@@ -5,7 +5,7 @@ description: The output of a `dispatch` Effect.
|
|
|
5
5
|
|
|
6
6
|
# `DispatchOutput`
|
|
7
7
|
|
|
8
|
-
Type, in `@jr2/orchestrator/src/effect.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Type, in `@jr2/orchestrator/src/effect.ts`. It is an export of `@jr2/orchestrator`, in the [Effects](group-effects.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
11
|
type DispatchOutput =
|
|
@@ -5,7 +5,7 @@ description: The values that bind the Open parts of one Effect.
|
|
|
5
5
|
|
|
6
6
|
# `EffectBinding`
|
|
7
7
|
|
|
8
|
-
Type, in `@jr2/orchestrator/src/open-effect.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Type, in `@jr2/orchestrator/src/open-effect.ts`. It is an export of `@jr2/orchestrator`, in the [Composition](group-composition.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
11
|
type EffectBinding = {
|
|
@@ -13,13 +13,16 @@ type EffectBinding = {
|
|
|
13
13
|
readonly argv?: readonly (string | Arg)[];
|
|
14
14
|
readonly secret?: string;
|
|
15
15
|
readonly target?: { readonly url: string; readonly token: Secret };
|
|
16
|
+
readonly server?: string;
|
|
17
|
+
readonly tool?: string;
|
|
16
18
|
};
|
|
17
19
|
```
|
|
18
20
|
|
|
19
21
|
The values that bind the Open parts of one Effect. A packaged Machine leaves a part of an Effect
|
|
20
22
|
Open when it cannot know it. That part is the url of an `http` Effect, the argv of a `command`,
|
|
21
23
|
the name of a secret, written `secret(open)`, or the target of a `dispatch`: the url of another
|
|
22
|
-
Orchestrator and the secret that holds its Instance token, bound as one
|
|
24
|
+
Orchestrator and the secret that holds its Instance token, bound as one, or the server or the tool
|
|
25
|
+
of an `mcp` Effect. You bind it once, where you register the
|
|
23
26
|
Machine, with `customize(machine, { effects: { <slot>: binding } })`. Each key binds one Open
|
|
24
27
|
part. For an Effect with two Open parts, one object holds both keys.
|
|
25
28
|
|
|
@@ -63,6 +66,13 @@ check that a part written in the definition gets.
|
|
|
63
66
|
|
|
64
67
|
- `url`: `string`
|
|
65
68
|
- `token`: [`Secret`](type-secret.md)
|
|
69
|
+
- `server` (optional): `string`
|
|
70
|
+
|
|
71
|
+
The server of an `mcp` Effect whose server is Open: a name of the `mcp` block of
|
|
72
|
+
`jr2.config.ts`. The server's url and its secret are the config's.
|
|
73
|
+
- `tool` (optional): `string`
|
|
74
|
+
|
|
75
|
+
The tool of an `mcp.call` Effect whose tool is Open: a tool name of the server.
|
|
66
76
|
|
|
67
77
|
**Example**
|
|
68
78
|
|
|
@@ -5,7 +5,7 @@ description: "A Turn's Frame in a Workspace with the Repo Slots `S`."
|
|
|
5
5
|
|
|
6
6
|
# `FramePath`
|
|
7
7
|
|
|
8
|
-
Type, in `@jr2/orchestrator/src/worktree.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Type, in `@jr2/orchestrator/src/worktree.ts`. It is an export of `@jr2/orchestrator`, in the [Effects](group-effects.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
11
|
type FramePath<S extends string> = WorktreePath<S> | "/work";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: GateBinding
|
|
3
|
+
description: A type that the Authoring surface names.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `GateBinding`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/customize.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type GateBinding<Meta, Ev> = {
|
|
12
|
+
readonly look?: GateLook<Meta, Ev> | "none";
|
|
13
|
+
readonly hooks?: GateHooksPatch<Meta, Ev>;
|
|
14
|
+
};
|
|
15
|
+
```
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: GateHooks
|
|
3
|
+
description: A type that the Authoring surface names.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `GateHooks`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/gate.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type GateHooks<Meta, Ev> = KindHooks<GateIn<Meta>, Ev | undefined>;
|
|
12
|
+
```
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: GateLook
|
|
3
|
+
description: "A Gate's read of the fact that it waits for (ADR-0011)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `GateLook`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/gate.ts`. It is an export of `@jr2/orchestrator`, in the [Gates](group-gates.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type GateLook<Meta, Ev, R extends AnyActorLogic = AnyActorLogic> = {
|
|
12
|
+
readonly read: R;
|
|
13
|
+
readonly input: (meta: Meta) => InputFrom<R>;
|
|
14
|
+
readonly every?: Duration;
|
|
15
|
+
readonly until: (output: LookOutput<R>, meta: Meta) => Ev | undefined;
|
|
16
|
+
};
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
A Gate's read of the fact that it waits for ([ADR-0011](../decisions/0011-workflow-defined-events.md)).
|
|
20
|
+
|
|
21
|
+
- `read`: an `http` Effect marked `idempotent: true`, or a promise actor (`fromPromise`), which the
|
|
22
|
+
Machine can invoke anyway and which a restore runs again. `gate()` refuses any other logic.
|
|
23
|
+
- `input`: the read's input, from the Gate's meta.
|
|
24
|
+
- `every`: how often the Gate looks again while it is open. Default: `"10m"`.
|
|
25
|
+
- `until`: the read's output as one event of `delivers`, or `undefined` for "not yet". Pure and
|
|
26
|
+
synchronous, as a guard is.
|
|
27
|
+
|
|
28
|
+
The look runs once after the Gate registers, again after each restore, and every `every` while the
|
|
29
|
+
Gate is open. It stops after the run takes its event, until the Gate opens again. A looked event
|
|
30
|
+
has the Gate as its Sender and no Caller, and the feed marks it `looked`.
|
|
31
|
+
|
|
32
|
+
**Fields**
|
|
33
|
+
|
|
34
|
+
- `read`: `R`
|
|
35
|
+
- `input`: `(meta: Meta) => InputFrom<R>`
|
|
36
|
+
- `every` (optional): [`Duration`](type-duration.md)
|
|
37
|
+
- `until`: `(output: LookOutput<R>, meta: Meta) => Ev | undefined`
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: GateOutcome
|
|
3
|
+
description: What a delivery did at one open Gate.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `GateOutcome`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/gate.ts`. It is an export of `@jr2/orchestrator`, in the [Gates](group-gates.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type GateOutcome<Ev> =
|
|
12
|
+
| { readonly state: "delivered"; readonly event: Ev; readonly run: string }
|
|
13
|
+
| { readonly state: "refused"; readonly event?: Ev; readonly reason: string; readonly run: string };
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
What a delivery did at one open Gate. The run took the event, or it did not: the handler threw,
|
|
17
|
+
its event is not in `delivers`, or the run does not take it now. A Gate whose handler gave
|
|
18
|
+
`undefined` was not a target, and its `reply` does not run.
|
|
19
|
+
|
|
20
|
+
**Forms**: it is one of these objects.
|
|
21
|
+
|
|
22
|
+
- Form 1: `state`, `event`, `run`
|
|
23
|
+
|
|
24
|
+
- `state`: `"delivered"`
|
|
25
|
+
- `event`: `Ev`
|
|
26
|
+
- `run`: `string`
|
|
27
|
+
- Form 2: `state`, `event`, `reason`, `run`
|
|
28
|
+
|
|
29
|
+
- `state`: `"refused"`
|
|
30
|
+
- `event` (optional): `Ev`
|
|
31
|
+
- `reason`: `string`
|
|
32
|
+
- `run`: `string`
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: GateReply
|
|
3
|
+
description: The text that the person who acted reads.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `GateReply`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/gate.ts`. It is an export of `@jr2/orchestrator`, in the [Gates](group-gates.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type GateReply<Meta, Ev> = (
|
|
12
|
+
outcome: GateOutcome<Ev>,
|
|
13
|
+
at: { readonly meta: Meta; readonly caller: CallerRecord },
|
|
14
|
+
) => string | undefined;
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The text that the person who acted reads. Plain text: the Hook kind
|
|
18
|
+
escapes it and puts it in its envelope. Pure and synchronous. `undefined` or `""`: this Gate says
|
|
19
|
+
nothing. It runs only for a delivery whose answer a person reads (`slack`, `discord`).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: GateSlot
|
|
3
|
+
description: A Gate with parts that the Machine carries.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `GateSlot`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/gate.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type GateSlot<Meta, Ev> = CallbackActorLogic<
|
|
12
|
+
DeliveredEvent,
|
|
13
|
+
{} extends Meta ? GateSlotInput<Meta> | undefined : GateSlotInput<Meta>
|
|
14
|
+
> & {
|
|
15
|
+
readonly gateSlot: GateSlotParts;
|
|
16
|
+
readonly [gateSlotMark]?: { readonly meta: Meta; readonly ev: Ev };
|
|
17
|
+
};
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
A Gate with parts that the Machine carries. Put it in `actors` and invoke it by its key. The
|
|
21
|
+
brand `gateSlot` holds its parts.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: GateSlotInput
|
|
3
|
+
description: A type that the Authoring surface names.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `GateSlotInput`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/gate.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type GateSlotInput<Meta> = Omit<GateInput, "meta"> &
|
|
12
|
+
({} extends Meta ? { readonly meta?: Meta } : { readonly meta: Meta });
|
|
13
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: GateSlotParts
|
|
3
|
+
description: A type that the Authoring surface names.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `GateSlotParts`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/gate.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type GateSlotParts = {
|
|
12
|
+
readonly meta?: z.ZodType;
|
|
13
|
+
readonly delivers: readonly EventDef[];
|
|
14
|
+
readonly hooks: Readonly<Record<string, Readonly<Record<string, AnyHandler>>>>;
|
|
15
|
+
readonly look?: LooseLook | typeof open | "none";
|
|
16
|
+
readonly reply?: (outcome: GateOutcome<DeliveredEvent>, at: { meta: unknown; caller: CallerRecord }) => unknown;
|
|
17
|
+
};
|
|
18
|
+
```
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: GateSlots
|
|
3
|
+
description: A type that the Authoring surface names.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `GateSlots`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/customize.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type GateSlots<M extends AnyStateMachine> = Extract<SlotsOf<M>, { logic: GateSlot<any, any> }>["src"];
|
|
12
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: GateTypesAt
|
|
3
|
+
description: A type that the Authoring surface names.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `GateTypesAt`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/customize.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type GateTypesAt<M extends AnyStateMachine, K extends string> =
|
|
12
|
+
LogicAt<M, K> extends GateSlot<infer Meta, infer Ev> ? { meta: Meta; ev: Ev } : never;
|
|
13
|
+
```
|
|
@@ -5,7 +5,7 @@ description: The fields that jr2 adds to the input of the Machine that a run sta
|
|
|
5
5
|
|
|
6
6
|
# `HostInjectedInput`
|
|
7
7
|
|
|
8
|
-
Type, in `@jr2/orchestrator/src/vocabulary.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Type, in `@jr2/orchestrator/src/vocabulary.ts`. It is an export of `@jr2/orchestrator`, in the [Machine and events](group-machine-and-events.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
11
|
type HostInjectedInput = { instanceId: string };
|
|
@@ -5,7 +5,7 @@ description: "The output of an `http` Effect: what the `onDone` of its state get
|
|
|
5
5
|
|
|
6
6
|
# `HttpOutput`
|
|
7
7
|
|
|
8
|
-
Type, in `@jr2/orchestrator/src/effector-wire.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Type, in `@jr2/orchestrator/src/effector-wire.ts`. It is an export of `@jr2/orchestrator`, in the [Effects](group-effects.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
11
|
type HttpOutput = LaterOutcome | {
|
|
@@ -5,7 +5,7 @@ description: "The shape of `jr2.config.ts`: the deployment facts of an Instance,
|
|
|
5
5
|
|
|
6
6
|
# `JR2Config`
|
|
7
7
|
|
|
8
|
-
Type, in `@jr2/orchestrator/src/config.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Type, in `@jr2/orchestrator/src/config.ts`. It is an export of `@jr2/orchestrator`, in the [Config](group-config.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
11
|
type JR2Config = {
|
|
@@ -15,6 +15,11 @@ type JR2Config = {
|
|
|
15
15
|
harness?: HarnessConfig;
|
|
16
16
|
sandbox?: SandboxConfig;
|
|
17
17
|
priorityClasses?: PriorityClasses;
|
|
18
|
+
callers?: CallersConfig;
|
|
19
|
+
cors?: readonly string[];
|
|
20
|
+
hooks?: Readonly<Record<string, Hook>>;
|
|
21
|
+
mcp?: Readonly<Record<string, McpServer>>;
|
|
22
|
+
runs?: RunsConfig;
|
|
18
23
|
registry?: string;
|
|
19
24
|
kitRegistry?: string;
|
|
20
25
|
platforms?: readonly string[];
|
|
@@ -32,7 +37,7 @@ Sandbox Image: a Machine names those itself.
|
|
|
32
37
|
Every field is optional, and an Instance can run with no `jr2.config.ts`. Write the file as
|
|
33
38
|
`export default defineConfig({ … })`. When the config loads, a file with no default export is
|
|
34
39
|
refused: `` <file> has no default export (use `export default defineConfig({…})`) ``. The load also
|
|
35
|
-
checks the shape of `git.credentials`, `secrets`, `harness.catalog` and `
|
|
40
|
+
checks the shape of `git.credentials`, `secrets`, `harness.catalog`, `priorityClasses` and `mcp`. It
|
|
36
41
|
checks that `sandbox` is an object, and checks its `resources`. Each refusal names the field.
|
|
37
42
|
`jr2 up` checks the rest.
|
|
38
43
|
|
|
@@ -67,6 +72,36 @@ checks that `sandbox` is an object, and checks its `resources`. Each refusal nam
|
|
|
67
72
|
|
|
68
73
|
Existing PriorityClasses to use in place of the two that `jr2 up` creates. See
|
|
69
74
|
[`PriorityClasses`](../config.md#priorityclasses).
|
|
75
|
+
- `callers` (optional): [`CallersConfig`](../config.md#callers)
|
|
76
|
+
|
|
77
|
+
The Callers that act on the Instance with a credential of their own, and what each may do.
|
|
78
|
+
Default: none; only the Instance token acts. See [`CallersConfig`](../config.md#callers).
|
|
79
|
+
- `cors` (optional): `readonly string[]`
|
|
80
|
+
|
|
81
|
+
The origins from which a browser app may call the Instance's HTTP API, such as
|
|
82
|
+
`https://ops.example.com`. Each entry is an origin alone: a scheme, a host and an optional port,
|
|
83
|
+
with no path. Default: none. The Console is served from the Orchestrator's own origin, so it
|
|
84
|
+
needs no entry. The config load refuses an entry that is not an origin:
|
|
85
|
+
`<file> at cors[<i>]: <entry> is not an origin — scheme://host[:port], with no path`.
|
|
86
|
+
- `hooks` (optional): `Readonly<Record<string, Hook>>`
|
|
87
|
+
|
|
88
|
+
The Hooks of the Instance, by name: each one is a door, `POST /hooks/<name>`, for one outside
|
|
89
|
+
service. A Hook's value comes from its kind's constructor, which the config imports:
|
|
90
|
+
`github({ secret: secret("GH_HOOK") })`, `gitlab({ secret: secret("GL_HOOK"), may })`,
|
|
91
|
+
`discord({ publicKey: "…" })`. `may.answer` names the Workflows whose Gates the Hook may answer,
|
|
92
|
+
every Workflow by default. A Hook never starts a run. A name has the rule of a Caller token's
|
|
93
|
+
name. When the config loads, a bad entry is refused: `<file> at hooks.<name>: <problem>`.
|
|
94
|
+
Default: none.
|
|
95
|
+
- `mcp` (optional): `Readonly<Record<string, McpServer>>`
|
|
96
|
+
|
|
97
|
+
The MCP servers, by a name of yours: `[a-z][a-z0-9-]*`, not `jr2`. A remote server has a
|
|
98
|
+
`url` (`https://` with a secret), a `secret` (a name of the `secrets` list; with no `hosts`, it
|
|
99
|
+
is bound to the url's host) and a `timeout` (default `"60s"`). A stdio server has a `command`
|
|
100
|
+
of the Sandbox Image, its `args` and a `timeout`. An Agent names a server in its `mcp` list.
|
|
101
|
+
Default: none. See [`McpServer`](type-mcpserver.md).
|
|
102
|
+
- `runs` (optional): [`RunsConfig`](type-runsconfig.md)
|
|
103
|
+
|
|
104
|
+
How long ended runs are kept, and the volume size. Default: `{ retain: "30d", volume: "5Gi" }`.
|
|
70
105
|
- `registry` (optional): `string`
|
|
71
106
|
|
|
72
107
|
The image registry prefix to which `jr2 up` pushes the images that it builds, such as
|
|
@@ -5,7 +5,7 @@ description: A value of `outcome` that this kit does not give.
|
|
|
5
5
|
|
|
6
6
|
# `LaterOutcome`
|
|
7
7
|
|
|
8
|
-
Type, in `@jr2/orchestrator/src/effect.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Type, in `@jr2/orchestrator/src/effect.ts`. It is an export of `@jr2/orchestrator`, in the [Effects](group-effects.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
11
|
type LaterOutcome = { outcome: "(a later outcome)"; reason?: string };
|
|
@@ -12,6 +12,7 @@ type Lends = {
|
|
|
12
12
|
agents?: string[];
|
|
13
13
|
effects?: string[];
|
|
14
14
|
machines?: string[];
|
|
15
|
+
gates?: string[];
|
|
15
16
|
guards?: string[];
|
|
16
17
|
actions?: string[];
|
|
17
18
|
delays?: string[];
|
|
@@ -21,7 +22,9 @@ type Lends = {
|
|
|
21
22
|
```
|
|
22
23
|
|
|
23
24
|
The parts of the Chart wrapper that a Chart can use, by their keys in `actors`, `guards`,
|
|
24
|
-
`actions` and `delays`. `
|
|
25
|
+
`actions` and `delays`. `gates` lends Gate slots (`gate({ … })`) that hear a Hook, by slot name:
|
|
26
|
+
the door refuses a Chart that invokes one whose `delivers` names an event that is not in the
|
|
27
|
+
Chart's `events`. `gate: true` lends the Gate, so that a Chart can wait for an answer from
|
|
25
28
|
outside the run. `fail: true` lends the Part that fails the run, so that a Chart can end its run
|
|
26
29
|
as a Failure ([ADR-0073](../decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md)): the Machine decides which ends a Chart can choose. A Chart can use no
|
|
27
30
|
other part.
|
|
@@ -31,6 +34,7 @@ other part.
|
|
|
31
34
|
- `agents` (optional): `string[]`
|
|
32
35
|
- `effects` (optional): `string[]`
|
|
33
36
|
- `machines` (optional): `string[]`
|
|
37
|
+
- `gates` (optional): `string[]`
|
|
34
38
|
- `guards` (optional): `string[]`
|
|
35
39
|
- `actions` (optional): `string[]`
|
|
36
40
|
- `delays` (optional): `string[]`
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: LookOutput
|
|
3
|
+
description: A type that the Authoring surface names.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `LookOutput`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/gate.ts`. It is type plumbing: it computes a type from the types of a Machine or of its parts, and a workflow module does not write it. The signature of an export, or a type that it names, names this type, so its declaration is here. The [Authoring surface](../authoring-surface.md) page lists each export.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type LookOutput<R> = R extends { getInitialSnapshot: (...a: never[]) => { output?: infer O } }
|
|
12
|
+
? Exclude<O, undefined>
|
|
13
|
+
: unknown;
|
|
14
|
+
```
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: McpCallOutput
|
|
3
|
+
description: "The output of an `mcp.call` Effect: what the `onDone` of its state gets as `event.output`."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `McpCallOutput`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/effector-wire.ts`. It is an export of `@jr2/orchestrator`, in the [Effects](group-effects.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type McpCallOutput =
|
|
12
|
+
| { outcome: "returned"; isError: boolean; text: string; structured?: unknown; truncated?: boolean }
|
|
13
|
+
| McpNotReturned;
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The output of an `mcp.call` Effect: what the `onDone` of its state gets as `event.output`. Every
|
|
17
|
+
outcome is output. Route on `outcome`:
|
|
18
|
+
|
|
19
|
+
- `returned`: the server answered the call. `isError` is the tool's own `isError`: the tool ran
|
|
20
|
+
and says that it failed. `text` joins the text of the result's content; a part that is not text
|
|
21
|
+
is one line that names its type. `structured` is the result's `structuredContent`, when it has
|
|
22
|
+
one. `text` and `structured` each have the byte bound of the Effect's `maxBody`: past it, jr2
|
|
23
|
+
cuts `text`, drops `structured`, and sets `truncated`.
|
|
24
|
+
- `refused`: the request did not run. The server answered an HTTP 3xx or 4xx status (a 401 or a
|
|
25
|
+
403 included) at any step, the handshake too; it refused the handshake; or it answered the
|
|
26
|
+
request with the JSON-RPC error `-32700`, `-32600`, `-32601` or `-32602`: a request that it
|
|
27
|
+
could not read, an unknown method, an unknown tool, or bad arguments; or it answered a read with
|
|
28
|
+
`-32002`: the resource does not exist. It is also the Effector's
|
|
29
|
+
own refusal, with nothing sent: the server or its secret is not in its `effector.json`.
|
|
30
|
+
- `unreachable`: nothing of the request was sent: the name did not resolve, or the connection,
|
|
31
|
+
TLS or the handshake failed otherwise (a 5xx, the timeout, an answer that is not MCP's, a
|
|
32
|
+
revision of MCP that jr2 does not speak).
|
|
33
|
+
- `input-required`: the server asked for input, which jr2 does not give. After the error
|
|
34
|
+
`-32042`, the tool did not run. After an `elicitation/create` request, which comes while the
|
|
35
|
+
tool runs, the tool may have begun. jr2 does not send the request again: a Machine that
|
|
36
|
+
invokes the Effect again after a Gate can run a part of the tool two times.
|
|
37
|
+
- `unknown`: the request was sent and no answer came (the timeout, a reset, a stream that ended
|
|
38
|
+
first), or the server answered with a 5xx or another JSON-RPC error. The tool may have acted.
|
|
39
|
+
jr2 does not send it again unless it is marked `idempotent`.
|
|
40
|
+
|
|
41
|
+
jr2 replaces each value of an Effect secret that the Effector holds with `[secret:<name>]`, in
|
|
42
|
+
every string of the output. The union is open ([`LaterOutcome`](type-lateroutcome.md)): give the rest a last arm
|
|
43
|
+
with no guard.
|
|
44
|
+
|
|
45
|
+
**Forms**: it is one of these objects.
|
|
46
|
+
|
|
47
|
+
- Form 1: `outcome`, `isError`, `text`, `structured`, `truncated`
|
|
48
|
+
|
|
49
|
+
- `outcome`: `"returned"`
|
|
50
|
+
- `isError`: `boolean`
|
|
51
|
+
- `text`: `string`
|
|
52
|
+
- `structured` (optional): `unknown`
|
|
53
|
+
- `truncated` (optional): `boolean`
|
|
54
|
+
- Form 2: `outcome`, `reason`
|
|
55
|
+
|
|
56
|
+
- `outcome`: `"refused"`
|
|
57
|
+
- `reason`: `string`
|
|
58
|
+
- Form 3: `outcome`, `reason`
|
|
59
|
+
|
|
60
|
+
- `outcome`: `"unreachable"`
|
|
61
|
+
- `reason`: `string`
|
|
62
|
+
- Form 4: `outcome`, `reason`
|
|
63
|
+
|
|
64
|
+
- `outcome`: `"input-required"`
|
|
65
|
+
- `reason`: `string`
|
|
66
|
+
- Form 5: `outcome`, `reason`
|
|
67
|
+
|
|
68
|
+
- `outcome`: `"unknown"`
|
|
69
|
+
- `reason`: `string`
|
|
70
|
+
- Form 6: `outcome`, `reason`
|
|
71
|
+
|
|
72
|
+
- `outcome`: `"(a later outcome)"`
|
|
73
|
+
- `reason` (optional): `string`
|
|
74
|
+
|
|
75
|
+
**See also**
|
|
76
|
+
|
|
77
|
+
- [Effects](../../concepts/effects.md)
|
|
78
|
+
- [ADR-0079: An Agent holds MCP tools, a Machine calls them as an Effect, and the Machine is the approval](../decisions/0079-an-agent-holds-mcp-tools-a-machine-calls-them-as-an-effect-and-the-machine-is-the-approval.md)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: McpNotReturned
|
|
3
|
+
description: The outcomes that an `mcp` Effect gives besides `returned`.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `McpNotReturned`
|
|
7
|
+
|
|
8
|
+
Type, in `@jr2/orchestrator/src/effector-wire.ts`. The signature of an export, or a type that it names, names this type. The [Authoring surface](../authoring-surface.md) page lists each export. This type is not an export of `@jr2/orchestrator`, so a workflow module does not import it by name.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
type McpNotReturned =
|
|
12
|
+
| { outcome: "refused"; reason: string }
|
|
13
|
+
| { outcome: "unreachable"; reason: string }
|
|
14
|
+
| { outcome: "input-required"; reason: string }
|
|
15
|
+
| { outcome: "unknown"; reason: string }
|
|
16
|
+
| LaterOutcome;
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The outcomes that an `mcp` Effect gives besides `returned`. Each one has a `reason` in words.
|
|
20
|
+
|
|
21
|
+
**Forms**: it is one of these objects.
|
|
22
|
+
|
|
23
|
+
- Form 1: `outcome`, `reason`
|
|
24
|
+
|
|
25
|
+
- `outcome`: `"refused"`
|
|
26
|
+
- `reason`: `string`
|
|
27
|
+
- Form 2: `outcome`, `reason`
|
|
28
|
+
|
|
29
|
+
- `outcome`: `"unreachable"`
|
|
30
|
+
- `reason`: `string`
|
|
31
|
+
- Form 3: `outcome`, `reason`
|
|
32
|
+
|
|
33
|
+
- `outcome`: `"input-required"`
|
|
34
|
+
- `reason`: `string`
|
|
35
|
+
- Form 4: `outcome`, `reason`
|
|
36
|
+
|
|
37
|
+
- `outcome`: `"unknown"`
|
|
38
|
+
- `reason`: `string`
|
|
39
|
+
- Form 5: `outcome`, `reason`
|
|
40
|
+
|
|
41
|
+
- `outcome`: `"(a later outcome)"`
|
|
42
|
+
- `reason` (optional): `string`
|