@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
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Authoring surface: Charts"
|
|
3
|
+
description: "The Open body a Chart wrapper places in `actors`, and the grammar a planner's pick declares, whole or narrowed to one wrapper (ADR-0070)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Authoring surface: Charts
|
|
7
|
+
|
|
8
|
+
This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
|
|
9
|
+
|
|
10
|
+
The Open body a Chart wrapper places in `actors`, and the grammar a planner's pick declares, whole or narrowed to one wrapper ([ADR-0070](../decisions/0070-a-machine-lends-its-parts-to-a-chart.md)).
|
|
11
|
+
|
|
12
|
+
- [`openBody`](openbody.md) (function): Make an Open body: the actor slot that a Chart binds.
|
|
13
|
+
- [`OpenBodyDeclaration`](type-openbodydeclaration.md) (type): What an Open body declares: the parts that it lends a Chart, what the Agents of a Chart can have, and the limits of a Chart.
|
|
14
|
+
- [`OpenBodyOutput`](type-openbodyoutput.md) (type): The output of an Open body.
|
|
15
|
+
- [`chartSchema`](chartschema.md) (constant): The Chart grammar, as a zod schema.
|
|
16
|
+
- [`chartSchemaFor`](chartschemafor.md) (function): The Chart grammar for one Open body, as a zod schema.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Authoring surface: Composition"
|
|
3
|
+
description: "A part left Open, a Machine's parts retuned, a Pool over a Source (ADR-0017, ADR-0049, ADR-0054, ADR-0060)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Authoring surface: Composition
|
|
7
|
+
|
|
8
|
+
This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
|
|
9
|
+
|
|
10
|
+
A part left Open, a Machine's parts retuned, a Pool over a Source ([ADR-0017](../decisions/0017-pool-over-a-source-port.md), [ADR-0049](../decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md), [ADR-0054](../decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md), [ADR-0060](../decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md)).
|
|
11
|
+
|
|
12
|
+
- [`open`](open.md) (constant): Leave a part of a Machine Open: for the Instance that registers the Machine to bind with `customize()`.
|
|
13
|
+
- [`customize`](customize.md) (function): Retune the parts that a Machine carries, without a change to the module that exports it.
|
|
14
|
+
- [`Customize`](type-customize.md) (type): The parts of one Machine that `customize()` can retune: its Agents, its Open Effects, the Machines it composes, and the Sandbox of its `workspace()`.
|
|
15
|
+
- [`EffectBinding`](type-effectbinding.md) (type): The values that bind the Open parts of one Effect.
|
|
16
|
+
- [`Size`](type-size.md) (type): The Size of a Workspace: the most memory and cpu that its whole Sandbox can use.
|
|
17
|
+
- [`UserContainer`](type-usercontainer.md) (type): The User Container in its object form: its image, and its part of the Workspace's Size.
|
|
18
|
+
- [`carry`](carry.md) (function): Give the item itself.
|
|
19
|
+
- [`pool`](pool.md) (function): Make a Pool: a Machine that runs one worker for each item that a Source gives, with at most `cap` workers at once.
|
|
20
|
+
- [`reread`](reread.md) (function): Read the Source again.
|
|
21
|
+
- [`skip`](skip.md) (function): Bring nothing, and say why.
|
|
22
|
+
- [`source`](source.md) (function): Declare a Source: where a `pool()` gets its work items, one at a time.
|
|
23
|
+
- [`PoolNextInput`](type-poolnextinput.md) (type): The input of a Source's `next`: the ids of the items that workers have now, the ids of the items that settled, and the Pool's input.
|
|
24
|
+
- [`SourceReply`](type-sourcereply.md) (type): The text that the person who acted reads, from this Source's verdict (ADR-0011, ADR-0017).
|
|
25
|
+
- [`SourceVerdict`](type-sourceverdict.md) (type): A Source's verdict on one delivery, as its `reply` reads it (ADR-0017).
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Authoring surface: Config"
|
|
3
|
+
description: "`jr2.config.ts`, the deployment facts a Machine cannot carry (ADR-0050)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Authoring surface: Config
|
|
7
|
+
|
|
8
|
+
This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
|
|
9
|
+
|
|
10
|
+
`jr2.config.ts`, the deployment facts a Machine cannot carry ([ADR-0050](../decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md)).
|
|
11
|
+
|
|
12
|
+
- [`defineConfig`](defineconfig.md) (function): Declare the config of an Instance: the default export of `jr2.config.ts`.
|
|
13
|
+
- [`JR2Config`](type-jr2config.md) (type): The shape of `jr2.config.ts`: the deployment facts of an Instance, which a Machine cannot carry.
|
|
14
|
+
- [`McpRemoteServer`](type-mcpremoteserver.md) (type): A remote MCP server, which the Harness reaches over Streamable HTTP.
|
|
15
|
+
- [`McpServer`](type-mcpserver.md) (type): One MCP server of the Instance: a `McpRemoteServer` (`url`) or a `McpStdioServer` (`command`).
|
|
16
|
+
- [`McpStdioServer`](type-mcpstdioserver.md) (type): A stdio MCP server: a program of the Sandbox Image that the Harness starts for each Agent conversation, through jr2's spawner, inside the Agent's confinement.
|
|
17
|
+
- [`RunsConfig`](type-runsconfig.md) (type): How long jr2 keeps an ended run, and the volume that keeps it (ADR-0065).
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Authoring surface: Effects"
|
|
3
|
+
description: Work a Machine does outside itself, as an actor slot (ADR-0067, ADR-0068, ADR-0071, ADR-0079), and what an author writes between a pick and that work.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Authoring surface: Effects
|
|
7
|
+
|
|
8
|
+
This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
|
|
9
|
+
|
|
10
|
+
Work a Machine does outside itself, as an actor slot ([ADR-0067](../decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md), [ADR-0068](../decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md), [ADR-0071](../decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md), [ADR-0079](../decisions/0079-an-agent-holds-mcp-tools-a-machine-calls-them-as-an-effect-and-the-machine-is-the-approval.md)), and what an author writes between a pick and that work.
|
|
11
|
+
|
|
12
|
+
- [`arg`](arg.md) (constant): Mark one argv entry of a `command` that the input of the Effect fills.
|
|
13
|
+
- [`CommandOutput`](type-commandoutput.md) (type): The output of a `command` Effect: what the `onDone` of its state gets as `event.output`.
|
|
14
|
+
- [`LaterOutcome`](type-lateroutcome.md) (type): A value of `outcome` that this kit does not give.
|
|
15
|
+
- [`command`](command.md) (function): Make a `command` Effect: an actor slot that runs one program in the Workspace's Sandbox when a state invokes it.
|
|
16
|
+
- [`basic`](basic.md) (function): Make the `auth` of an `http` Effect that sends `Authorization: Basic <value>`, where the value is the base64 of `user:password`.
|
|
17
|
+
- [`bearer`](bearer.md) (function): Make the `auth` of an `http` Effect that sends `Authorization: Bearer <value>`, with the value of an Effect secret.
|
|
18
|
+
- [`file`](file.md) (function): Make a Worktree file the body of an `http` Effect: `body: file("dist/report.pdf")`.
|
|
19
|
+
- [`http`](http.md) (function): Make an `http` Effect: a call to a URL, with Effect secrets that the Agent never reads.
|
|
20
|
+
- [`secret`](secret.md) (function): Name an Effect secret: `secret("jira")`.
|
|
21
|
+
- [`text`](text.md) (function): Make a string from literal text and Effect secrets, as a tagged template: `` text`Token ${secret("x")}` ``.
|
|
22
|
+
- [`HttpOutput`](type-httpoutput.md) (type): The output of an `http` Effect: what the `onDone` of its state gets as `event.output`.
|
|
23
|
+
- [`push`](push.md) (function): Make a `push` Effect: it pushes the branch of a Worktree to the Binding of its Repo Slot.
|
|
24
|
+
- [`PushOutput`](type-pushoutput.md) (type): The output of a `push` Effect: what the `onDone` of its state gets as `event.output`.
|
|
25
|
+
- [`branchName`](branchname.md) (constant): A kit schema for a pick param that names a branch.
|
|
26
|
+
- [`isReady`](isready.md) (constant): Is it `ready`?
|
|
27
|
+
- [`readyOf`](readyof.md) (function): The `ready` output of an `onDone` arm that `isReady` guards.
|
|
28
|
+
- [`worktree`](worktree.md) (function): Make a `worktree` Effect: it cuts a Worktree of a Repo Slot, or reads the one that is there.
|
|
29
|
+
- [`AnyFramePath`](type-anyframepath.md) (type): A Turn's Frame: a Worktree, or `/work`, stated.
|
|
30
|
+
- [`AnyWorktreePath`](type-anyworktreepath.md) (type): A Worktree of any Repo Slot: what a kit factory states, before `jr2Setup` narrows it to the slots of the body.
|
|
31
|
+
- [`FramePath`](type-framepath.md) (type): A Turn's Frame in a Workspace with the Repo Slots `S`.
|
|
32
|
+
- [`WorktreeFound`](type-worktreefound.md) (type): What a cut found.
|
|
33
|
+
- [`WorktreeInput`](type-worktreeinput.md) (type): The input of a `worktree()`: a branch Worktree, or a detached one.
|
|
34
|
+
- [`WorktreeOptions`](type-worktreeoptions.md) (type): The options of `worktree()`.
|
|
35
|
+
- [`WorktreeOutput`](type-worktreeoutput.md) (type): The output of a `worktree()`.
|
|
36
|
+
- [`WorktreePath`](type-worktreepath.md) (type): A Worktree of the Repo Slots `S`.
|
|
37
|
+
- [`WorktreeReady`](type-worktreeready.md) (type)
|
|
38
|
+
- [`WorktreeRefused`](type-worktreerefused.md) (type): No Worktree, and nothing changed.
|
|
39
|
+
- [`dispatch`](dispatch.md) (function): Make a `dispatch` Effect: it starts a run of a Workflow.
|
|
40
|
+
- [`DispatchOutput`](type-dispatchoutput.md) (type): The output of a `dispatch` Effect.
|
|
41
|
+
- [`mcp`](mcp.md) (constant): The `mcp` Effects (ADR-0067, ADR-0079): `mcp.call(server, tool, { input })` calls a tool, `mcp.read(server, uri)` reads a resource, and `mcp.prompt(server, name, { input })` gets a prompt.
|
|
42
|
+
- [`McpOptions`](type-mcpoptions.md) (type): The options of an `mcp` Effect.
|
|
43
|
+
- [`McpCallOutput`](type-mcpcalloutput.md) (type): The output of an `mcp.call` Effect: what the `onDone` of its state gets as `event.output`.
|
|
44
|
+
- [`McpOutput`](type-mcpoutput.md) (type): The output of any `mcp` Effect: a call's, a read's or a prompt's.
|
|
45
|
+
- [`McpReadOutput`](type-mcpreadoutput.md) (type): The output of an `mcp.read` or an `mcp.prompt` Effect.
|
|
46
|
+
- [`answer`](answer.md) (function): Set what the Agent reads when jr2 answers its pick.
|
|
47
|
+
- [`fromPick`](frompick.md) (function): Make the `input` of the invoke of a state that a pick enters: the params of the pick go to the input of the invoked actor by name.
|
|
48
|
+
- [`paramsOf`](paramsof.md) (function): Read the params of a pick from the event that entered the state.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Authoring surface: Failure"
|
|
3
|
+
description: The Part a Machine invokes to fail its run, and the guard that tells a Failure from a defect in an `onError` (ADR-0073).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Authoring surface: Failure
|
|
7
|
+
|
|
8
|
+
This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
|
|
9
|
+
|
|
10
|
+
The Part a Machine invokes to fail its run, and the guard that tells a Failure from a defect in an `onError` ([ADR-0073](../decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md)).
|
|
11
|
+
|
|
12
|
+
- [`fail`](fail.md) (function): Fail the run: the Part a Machine invokes to end work that did not succeed.
|
|
13
|
+
- [`isFailure`](isfailure.md) (function): Is this error a Failure, which a state invoked `fail` to make?
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Authoring surface: Gates"
|
|
3
|
+
description: A Gate slot hears a Hook (ADR-0011).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Authoring surface: Gates
|
|
7
|
+
|
|
8
|
+
This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
|
|
9
|
+
|
|
10
|
+
A Gate slot hears a Hook ([ADR-0011](../decisions/0011-workflow-defined-events.md)).
|
|
11
|
+
|
|
12
|
+
- [`gate`](gate.md) (function): The Gate: an input that a run waits for from outside the run (ADR-0011).
|
|
13
|
+
- [`Delivered`](type-delivered.md) (type): One plain event of a list of defs: `{ type: "approve", by }`.
|
|
14
|
+
- [`GateLook`](type-gatelook.md) (type): A Gate's read of the fact that it waits for (ADR-0011).
|
|
15
|
+
- [`GateOutcome`](type-gateoutcome.md) (type): What a delivery did at one open Gate.
|
|
16
|
+
- [`GateReply`](type-gatereply.md) (type): The text that the person who acted reads.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Authoring surface: Machine and events"
|
|
3
|
+
description: The setup a workflow writes its Machine with, the events its parties send, and the guard that makes a writing decline other senders (ADR-0011, ADR-0015).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Authoring surface: Machine and events
|
|
7
|
+
|
|
8
|
+
This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
|
|
9
|
+
|
|
10
|
+
The setup a workflow writes its Machine with, the events its parties send, and the guard that makes a writing decline other senders ([ADR-0011](../decisions/0011-workflow-defined-events.md), [ADR-0015](../decisions/0015-authoring-surface-absorbs-the-mechanism.md)).
|
|
11
|
+
|
|
12
|
+
- [`defineEvent`](defineevent.md) (function): Define one workflow event: an event that an Agent or the caller of a Gate may send into your Machine.
|
|
13
|
+
- [`jr2Setup`](jr2setup.md) (function): Set up a Machine that takes workflow events: the jr2 form of xstate's `setup()`.
|
|
14
|
+
- [`sentBy`](sentby.md) (function): A guard that is true for an event that one party sent, and false for an event that another party sent: `guard: sentBy("coder")`.
|
|
15
|
+
- [`HostInjectedInput`](type-hostinjectedinput.md) (type): The fields that jr2 adds to the input of the Machine that a run starts, beside the input that the caller sent.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Authoring surface: Steering"
|
|
3
|
+
description: "The Machine's free text to one of its Agents, which the Agent hears once (ADR-0002)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Authoring surface: Steering
|
|
7
|
+
|
|
8
|
+
This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
|
|
9
|
+
|
|
10
|
+
The Machine's free text to one of its Agents, which the Agent hears once ([ADR-0002](../decisions/0002-duplex-streaming-actor.md)).
|
|
11
|
+
|
|
12
|
+
- [`steer`](steer.md) (function): Send a Steering message to one Agent of this Machine: an action for a transition.
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Authoring surface: Types these signatures name"
|
|
3
|
+
description: The signature of an export, or a type here, names each of these types.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Authoring surface: Types these signatures name
|
|
7
|
+
|
|
8
|
+
This page is one group of the [Authoring surface](../authoring-surface.md). It gives each type its first sentence. Each type has a page of its own, in this folder.
|
|
9
|
+
|
|
10
|
+
The signature of an export, or a type here, names each of these types. They are not exports of `@jr2/orchestrator`, so a workflow module does not import them by name.
|
|
11
|
+
|
|
12
|
+
- [`EventSemantics`](type-eventsemantics.md): How the party that sends an event gets its answer.
|
|
13
|
+
- [`EventAudience`](type-eventaudience.md): Who may send an event: `"agent"` (an Agent, as a pick from its Menu), `"external"` (the caller of a Gate), or `"any"` (both).
|
|
14
|
+
- [`EventDef`](type-eventdef.md): A workflow event, as `defineEvent` gives it back: plain, frozen data and a zod schema, safe to import anywhere.
|
|
15
|
+
- [`WorkflowEvent`](type-workflowevent.md): The type of `event` in a Machine that `jr2Setup` makes: each workflow event in its `events`, and each Mechanism event.
|
|
16
|
+
- [`GateSlot`](type-gateslot.md): A Gate with parts that the Machine carries.
|
|
17
|
+
- [`Duration`](type-duration.md): A length of time: a positive number and a unit, `s`, `m` or `h`.
|
|
18
|
+
- [`CallerRecord`](type-callerrecord.md): A Caller as a run records it (ADR-0078): who acted, and the party it says it acted for.
|
|
19
|
+
- [`FailSlot`](type-failslot.md): The logic `fail()` returns: `failLogic` with the brand the walk reads.
|
|
20
|
+
- [`Failure`](type-failure.md): A Failure as `isFailure` narrows an error to it: the payload's fields, on the error itself.
|
|
21
|
+
- [`AgentDeclaration`](type-agentdeclaration.md): What `agent()` takes: an `AgentDefinition`, except that `model` can also be `open`.
|
|
22
|
+
- [`WorkspaceAccess`](type-workspaceaccess.md): What an Agent may do to the Workspace: `"write"`, `"read"` or `"none"`.
|
|
23
|
+
- [`WorkspaceOptions`](type-workspaceoptions.md): The options of a `workspace()` that declares the input that starts a run.
|
|
24
|
+
- [`NoSlotWorkspaceOptions`](type-noslotworkspaceoptions.md): The options of a `workspace()` with no Repo Slot that declares the input that starts a run.
|
|
25
|
+
- [`WithoutEmptyIndex`](type-withoutemptyindex.md): The fields of the run input `T`.
|
|
26
|
+
- [`PermissiveWorkspaceOptions`](type-permissiveworkspaceoptions.md): The options of a `workspace()` with no `input`: it starts with any input.
|
|
27
|
+
- [`PermissiveNoSlotWorkspaceOptions`](type-permissivenoslotworkspaceoptions.md): The options of a `workspace()` with no Repo Slot and no `input`: it starts with any input.
|
|
28
|
+
- [`WorkspaceHandles`](type-workspacehandles.md): What the body of a `workspace()` gets as `input.workspace`: the folder of each Repo Slot.
|
|
29
|
+
- [`ExecOutcome`](type-execoutcome.md): How an exec ended.
|
|
30
|
+
- [`Unknown`](type-unknown.md): The output `{ outcome: "unknown", reason }`: the Effect may have acted, and jr2 cannot tell.
|
|
31
|
+
- [`Arg`](type-arg.md): One entry of a command's argv that the input of the Effect fills, as `arg("name")` makes it.
|
|
32
|
+
- [`CommandOptions`](type-commandoptions.md): The options of `command()`: the Repo Slot it runs in, how long it can run, how much of its output it keeps, its Effect secrets, and the commit it runs against.
|
|
33
|
+
- [`CommandInput`](type-commandinput.md): A command's input: one string per argv slot, and with `pin` the approved commit (`{ sha }`); none when there is neither.
|
|
34
|
+
- [`OpenCommandInput`](type-opencommandinput.md): The input of a `command(open)`: a string for each `arg()` of the argv that the Instance binds, and with `pin`, the commit (`{ sha }`).
|
|
35
|
+
- [`Secret`](type-secret.md): What `secret("name")` gives: an Effect secret, by its name in the `secrets` list of `jr2.config.ts`.
|
|
36
|
+
- [`Text`](type-text.md): What the `text` template gives: a string of literal text and Effect secrets, in order.
|
|
37
|
+
- [`FromInput`](type-frominput.md): A value of a file body's part: as written, or from the Effect's input.
|
|
38
|
+
- [`FileBody`](type-filebody.md): `file(path, { segments?, contentType? })`: a Worktree file as an `http` body.
|
|
39
|
+
- [`HttpDefinition`](type-httpdefinition.md): An `http` Effect's definition.
|
|
40
|
+
- [`HttpFileInput`](type-httpfileinput.md): The input of an `http` Effect with a Worktree file as its body.
|
|
41
|
+
- [`OpenSecret`](type-opensecret.md): `secret(open)`: a secret a packaged Machine names in its auth, a header or a command's env, and leaves for its composer to name (ADR-0054).
|
|
42
|
+
- [`PushOptions`](type-pushoptions.md): The options of `push()`.
|
|
43
|
+
- [`PushInput`](type-pushinput.md): The input of a `push` Effect: the Worktree that a cut made, `{ sha }` with `pin`, and `{ message }` with `squash`.
|
|
44
|
+
- [`NameStart`](type-namestart.md): What a Worktree's name may start with: neither `.` nor `-`, and not the end of the path.
|
|
45
|
+
- [`DispatchDefinition`](type-dispatchdefinition.md): The definition of a `dispatch` Effect (ADR-0071).
|
|
46
|
+
- [`DispatchInput`](type-dispatchinput.md): A dispatch's input: the run's body — the slot's schema's type, or any JSON object.
|
|
47
|
+
- [`DispatchOpenParts`](type-dispatchopenparts.md): The Open part a dispatch definition states: its target, when it is `open`.
|
|
48
|
+
- [`McpNotReturned`](type-mcpnotreturned.md): The outcomes that an `mcp` Effect gives besides `returned`.
|
|
49
|
+
- [`ChainLink`](type-chainlink.md): One reply since the pick, as the author reads it.
|
|
50
|
+
- [`SteerArgs`](type-steerargs.md): The arguments a `steer` text or `from` function gets: the Machine's context and the event that the transition takes.
|
|
51
|
+
- [`Sender`](type-sender.md): Who delivered an event: an Agent by its slot, or a Gate by its invoke id (ADR-0015).
|
|
52
|
+
- [`Quantity`](type-quantity.md): A Kubernetes quantity: `"2Gi"`, `"1500m"`, `"2"`, or a plain number (`2` cpus, bytes of memory).
|
|
53
|
+
- [`Carry`](type-carry.md): What `carry(item)` gives.
|
|
54
|
+
- [`PoolSpec`](type-poolspec.md): What you pass to `pool()` with a child Machine as its worker.
|
|
55
|
+
- [`StandingPoolSpec`](type-standingpoolspec.md): What you pass to `pool()` for a Pool of runs.
|
|
56
|
+
- [`Reread`](type-reread.md): What `reread()` gives.
|
|
57
|
+
- [`Skip`](type-skip.md): What `skip(reason)` gives: the delivery brings nothing, and the reason says why.
|
|
58
|
+
- [`SourceSpec`](type-sourcespec.md): A pull Source.
|
|
59
|
+
- [`SourceHooks`](type-sourcehooks.md): A Source's handlers, by Hook kind and event key.
|
|
60
|
+
- [`PushSourceSpec`](type-pushsourcespec.md): A push Source.
|
|
61
|
+
- [`ReadSourceSpec`](type-readsourcespec.md): A read Source.
|
|
62
|
+
- [`OpenBodyLogic`](type-openbodylogic.md): The logic `openBody()` returns: actor logic that carries the brand.
|
|
63
|
+
- [`Lends`](type-lends.md): The parts of the Chart wrapper that a Chart can use, by their keys in `actors`, `guards`, `actions` and `delays`.
|
|
64
|
+
- [`Ceilings`](type-ceilings.md): The limits that an Open body sets on its Chart.
|
|
65
|
+
- [`ChartText`](type-charttext.md): The Chart text (ADR-0070).
|
|
66
|
+
- [`DeliveredEvent`](type-deliveredevent.md): A workflow event as delivered into a Machine: the def's name as `type`, plus its payload.
|
|
67
|
+
- [`Caller`](type-caller.md): A request's Caller (ADR-0078): who acts, through which authenticator, and what it may do.
|
|
68
|
+
- [`FailureInput`](type-failureinput.md): What a Failure carries: `reason`, text for a person, and `detail`, optional JSON for a machine reader.
|
|
69
|
+
- [`SandboxOptions`](type-sandboxoptions.md): The options of a `workspace()` that say what its Sandbox is made of and which Repos it clones.
|
|
70
|
+
- [`SlotHandles`](type-slothandles.md): The handles of a Workspace that declares Repo Slots.
|
|
71
|
+
- [`CommandEnv`](type-commandenv.md): The `env` of a `command`: for each variable, `secret("name")` for the value of an Effect secret, or `secret("name").path` for the path of a file that holds it.
|
|
72
|
+
- [`TextPart`](type-textpart.md): One part of a `Text`: `{ text }`, literal text, or `{ secret }`, the name of an Effect secret.
|
|
73
|
+
- [`HttpMethod`](type-httpmethod.md): The method of an `http` Effect: `GET`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE` or `OPTIONS`.
|
|
74
|
+
- [`HttpRequestParts`](type-httprequestparts.md): What the `request` of an `http` definition returns: the part of the request that changes for each run.
|
|
75
|
+
- [`NamedSecret`](type-namedsecret.md): A secret bound to a name, never `secret(open)`.
|
|
76
|
+
- [`SenderCallerField`](type-sendercallerfield.md): A field of a `Sender`'s Caller that jr2 can verify.
|
|
77
|
+
- [`SourceNextResult`](type-sourcenextresult.md): What the `next` of a Source resolves to: an item, to claim it; `null`, when no item is ready now; or `{ item, open }`, where `open` is the number of items that exist but are not ready.
|
|
78
|
+
- [`SourceIn`](type-sourcein.md): What a Source's handler reads beside `payload`.
|
|
79
|
+
- [`OpenBodySlot`](type-openbodyslot.md): The brand an Open body slot carries, as `definition` marks an Agent slot (ADR-0049).
|
|
80
|
+
- [`ChartJson`](type-chartjson.md): Plain JSON.
|
|
81
|
+
- [`ChartEvent`](type-chartevent.md): An event a Chart mints: its payload is a JSON Schema object, built into zod at admission.
|
|
82
|
+
- [`ChartAgent`](type-chartagent.md): An Agent a Chart mints: the plain fields of an Agent definition (ADR-0049).
|
|
83
|
+
- [`ChartState`](type-chartstate.md): A state node.
|
|
84
|
+
- [`ChartValue`](type-chartvalue.md): A value whose strings may hold `{{<root>.<path>}}` placeholders and whose objects may be `{ "$ref": "<root>.<path>" }`.
|
|
85
|
+
- [`ChartInvoke`](type-chartinvoke.md): An invoke: a lent Agent, Effect or Machine, a minted Agent, or the kit's `gate` or `fail`.
|
|
86
|
+
- [`ChartTransitions`](type-charttransitions.md): One transition or a list, in xstate's order.
|
|
87
|
+
- [`ChartAction`](type-chartaction.md): An action.
|
|
88
|
+
- [`ChartTransition`](type-charttransition.md): A transition: a target alone, or the object form.
|
|
89
|
+
- [`ChartGuard`](type-chartguard.md): A guard: a lent guard by name, with or without params, `jr2.sentBy`, `jr2.failure`, or `not`/`and`/`or`.
|
|
90
|
+
|
|
91
|
+
**Type plumbing.** These types compute a type from the types of a Machine or of its parts. A workflow module does not write them. Each has a page with its declaration:
|
|
92
|
+
|
|
93
|
+
- [`ToProvidedActor`](type-toprovidedactor.md)
|
|
94
|
+
- [`MergedActors`](type-mergedactors.md)
|
|
95
|
+
- [`ToParameterizedObject`](type-toparameterizedobject.md)
|
|
96
|
+
- [`BindActors`](type-bindactors.md)
|
|
97
|
+
- [`SentByGuards`](type-sentbyguards.md)
|
|
98
|
+
- [`GateHooks`](type-gatehooks.md)
|
|
99
|
+
- [`EventFrom`](type-eventfrom.md)
|
|
100
|
+
- [`LookOutput`](type-lookoutput.md)
|
|
101
|
+
- [`AgentLogic`](type-agentlogic.md)
|
|
102
|
+
- [`BodyAcceptsDoor`](type-bodyacceptsdoor.md)
|
|
103
|
+
- [`WorkspaceMachine`](type-workspacemachine.md)
|
|
104
|
+
- [`DoorlessInput`](type-doorlessinput.md)
|
|
105
|
+
- [`BodyAcceptsSlots`](type-bodyacceptsslots.md)
|
|
106
|
+
- [`EffectLogic`](type-effectlogic.md)
|
|
107
|
+
- [`OpenOf`](type-openof.md)
|
|
108
|
+
- [`EnvOpenParts`](type-envopenparts.md)
|
|
109
|
+
- [`OpenEffect`](type-openeffect.md)
|
|
110
|
+
- [`MarkedIf`](type-markedif.md)
|
|
111
|
+
- [`HttpOpenParts`](type-httpopenparts.md)
|
|
112
|
+
- [`HttpInput`](type-httpinput.md)
|
|
113
|
+
- [`PushWireOutput`](type-pushwireoutput.md)
|
|
114
|
+
- [`SyncState`](type-syncstate.md)
|
|
115
|
+
- [`AnswerAction`](type-answeraction.md)
|
|
116
|
+
- [`AgentSlots`](type-agentslots.md)
|
|
117
|
+
- [`Reached`](type-reached.md)
|
|
118
|
+
- [`OpenEffectSlots`](type-openeffectslots.md)
|
|
119
|
+
- [`BindingOf`](type-bindingof.md)
|
|
120
|
+
- [`LogicAt`](type-logicat.md)
|
|
121
|
+
- [`GateSlots`](type-gateslots.md)
|
|
122
|
+
- [`GateBinding`](type-gatebinding.md)
|
|
123
|
+
- [`GateTypesAt`](type-gatetypesat.md)
|
|
124
|
+
- [`ChildSlots`](type-childslots.md)
|
|
125
|
+
- [`ChildAt`](type-childat.md)
|
|
126
|
+
- [`RepoSlotsOf`](type-reposlotsof.md)
|
|
127
|
+
- [`WorkspaceOf`](type-workspaceof.md)
|
|
128
|
+
- [`PoolMachine`](type-poolmachine.md)
|
|
129
|
+
- [`StandingPoolMachine`](type-standingpoolmachine.md)
|
|
130
|
+
- [`GateSlotInput`](type-gateslotinput.md)
|
|
131
|
+
- [`GateSlotParts`](type-gateslotparts.md)
|
|
132
|
+
- [`ArgNames`](type-argnames.md)
|
|
133
|
+
- [`WorktreeKey`](type-worktreekey.md)
|
|
134
|
+
- [`NotWorktreeKeys`](type-notworktreekeys.md)
|
|
135
|
+
- [`OpenSecretMark`](type-opensecretmark.md)
|
|
136
|
+
|
|
137
|
+
These names come from a dependency: from `zod`, `z.ZodObject`, `z.output`, `z.infer`, `z.ZodType`; from `xstate`, `MachineContext`, `UnknownActorLogic`, `ParameterizedObject`, `NonReducibleUnknown`, `EventObject`, `MetaObject`, `ActionFunction`, `GuardPredicate`, `DelayConfig`, `SetupReturn`, `AnyActorLogic`, `InputFrom`, `AnyStateMachine`, `OutputFrom`, `ProvidedActor`, `AnyActorRef`, `CallbackActorLogic`, `PromiseActorLogic`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Authoring surface: Workspaces and Repos"
|
|
3
|
+
description: A Sandbox and the Repo Slots it binds (ADR-0012, ADR-0051).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Authoring surface: Workspaces and Repos
|
|
7
|
+
|
|
8
|
+
This page is one group of the names that `@jr2/orchestrator` exports from its root, on the [Authoring surface](../authoring-surface.md) page. It gives each name its kind and the first sentence of its TSDoc. Each name has a page of its own, in this folder.
|
|
9
|
+
|
|
10
|
+
A Sandbox and the Repo Slots it binds ([ADR-0012](../decisions/0012-workspace-wrapper-machine.md), [ADR-0051](../decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md)).
|
|
11
|
+
|
|
12
|
+
- [`workspace`](workspace.md) (function): Run a body Machine in a Sandbox: a pod of its own, with a clone of each Repo Slot.
|
|
13
|
+
- [`Workspaced`](type-workspaced.md) (type): The input of a `workspace()` body: the run input, plus `workspace`, the handles that the Workspace adds (`workspace.repos`, the folder of each Repo Slot).
|
|
14
|
+
- [`Binding`](type-binding.md) (type): The repository of a Repo Slot: `{ url, ref }`.
|
|
15
|
+
- [`RepoSlot`](type-reposlot.md) (type): The value of one Repo Slot in `workspace({ repos })`.
|
|
@@ -5,7 +5,7 @@ description: "Make an `http` Effect: a call to a URL, with Effect secrets that t
|
|
|
5
5
|
|
|
6
6
|
# `http`
|
|
7
7
|
|
|
8
|
-
Function, in `@jr2/orchestrator/src/http-effect.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Function, in `@jr2/orchestrator/src/http-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
|
## Overload 1
|
|
11
11
|
|
|
@@ -5,7 +5,7 @@ description: Is this error a Failure, which a state invoked `fail` to make?
|
|
|
5
5
|
|
|
6
6
|
# `isFailure`
|
|
7
7
|
|
|
8
|
-
Function, in `@jr2/orchestrator/src/fail.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Function, in `@jr2/orchestrator/src/fail.ts`. It is an export of `@jr2/orchestrator`, in the [Failure](group-failure.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
11
|
function isFailure(error: unknown): error is Failure
|
|
@@ -5,7 +5,7 @@ description: Is it `ready`?
|
|
|
5
5
|
|
|
6
6
|
# `isReady`
|
|
7
7
|
|
|
8
|
-
Constant, in `@jr2/orchestrator/src/worktree.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Constant, 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
|
const isReady: <O extends { outcome: string; }>(output: O) => output is Extract<O, { outcome: "ready"; }>
|
|
@@ -5,7 +5,7 @@ description: "Set up a Machine that takes workflow events: the jr2 form of xstat
|
|
|
5
5
|
|
|
6
6
|
# `jr2Setup`
|
|
7
7
|
|
|
8
|
-
Function, in `@jr2/orchestrator/src/setup.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Function, in `@jr2/orchestrator/src/setup.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
|
function jr2Setup<
|
|
@@ -83,7 +83,9 @@ What it adds to `setup()`:
|
|
|
83
83
|
`defineEvent` events you list, plus the events jr2 itself sends (`agent.fault`,
|
|
84
84
|
`workspace.lost`). An event that a party sent has `event.sender`. A Machine that takes no
|
|
85
85
|
workflow event leaves out `events`.
|
|
86
|
-
- The `gate` actor is ready to invoke by name: `invoke: { src: "gate" }`.
|
|
86
|
+
- The `gate` actor is ready to invoke by name: `invoke: { src: "gate" }`. A Gate slot that hears a
|
|
87
|
+
Hook (`actors: { review: gate({ … }) }`) is invoked by its key. An event in its `delivers` whose
|
|
88
|
+
def leaves `audience` unset is `audience: "external"` in this Machine.
|
|
87
89
|
- Each Agent slot (`actors: { coder: agent(…) }`) gets its Menu from the states that invoke it.
|
|
88
90
|
- The `sentBy(id)` guard is ready to use.
|
|
89
91
|
- `createMachine` also takes `input`: a zod object for the input that starts a run. jr2 checks
|
|
@@ -140,6 +142,13 @@ has no `output` (see the list below).
|
|
|
140
142
|
run an Agent`: the body sends it a Chart's unrouted `agent.fault`. When both kinds have no route,
|
|
141
143
|
one line names both, joined by `, and`. One route on the root is a route for each state. A
|
|
142
144
|
Chart's Machine does not get this refusal: in a Chart the route is optional ([ADR-0070](../decisions/0070-a-machine-lends-its-parts-to-a-chart.md)).
|
|
145
|
+
- an event in a Gate slot's `delivers` that `events` does not list: ``machine "<id>": Gate slot
|
|
146
|
+
"<slot>" delivers "<name>", which no def in jr2Setup({ events }) declares (declared: <names>) —
|
|
147
|
+
list it in events (ADR-0011)``
|
|
148
|
+
- an event in a Gate slot's `delivers` that the Gate does not accept at a state that invokes it:
|
|
149
|
+
``machine "<id>": state "<state>" invokes Gate slot "<slot>", which delivers "<name>", and its
|
|
150
|
+
Gate does not accept it (accepts: <names>) — no handler or look could deliver it: handle it on
|
|
151
|
+
that state, a state above it or a plain child, or drop it from delivers (ADR-0011)``
|
|
143
152
|
|
|
144
153
|
It also refuses a `sentBy` that names no party (see `sentBy`). It refuses a pick param that
|
|
145
154
|
nothing reads, where the pick enters a state that invokes an Effect (see `fromPick`). Shapes that
|
|
@@ -170,7 +179,8 @@ are legal but probably not what you mean, such as a mode that nothing enters, ar
|
|
|
170
179
|
- `actors` (optional): `TActors`
|
|
171
180
|
|
|
172
181
|
The actors the states invoke by name, as in `setup()`: Agent slots (`agent(…)`), Effects
|
|
173
|
-
(`command(…)`, `http(…)`, `push(…)`), child Machines, `workspace(…)`
|
|
182
|
+
(`command(…)`, `http(…)`, `push(…)`), Gate slots (`gate({ … })`), child Machines, `workspace(…)`
|
|
183
|
+
and plain xstate logic.
|
|
174
184
|
The key is the slot's name. An actor named `gate` replaces jr2's Gate.
|
|
175
185
|
- `actions` (optional): `{ [K in keyof TActions]: ActionFunction<TContext, WorkflowEvent<TDefs>, WorkflowEvent<TDefs>, TActions[K], ToProvidedActor<MergedActors<TActors>>, ToParameterizedObject<TActions>, ToParameterizedObject<TGuards>, TDelay, TEmitted>; }`
|
|
176
186
|
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: mcp
|
|
3
|
+
description: "The `mcp` Effects (ADR-0067, ADR-0079): `mcp.call(server, tool, { input })` calls a tool, `mcp.read(server, uri)` reads a resource, and `mcp.prompt(server, name, { input })` gets a prompt."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `mcp`
|
|
7
|
+
|
|
8
|
+
Constant, in `@jr2/orchestrator/src/mcp-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
|
+
|
|
10
|
+
```ts
|
|
11
|
+
const mcp: { readonly call: typeof call; readonly read: typeof read; readonly prompt: typeof prompt; }
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The `mcp` Effects ([ADR-0067](../decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md), [ADR-0079](../decisions/0079-an-agent-holds-mcp-tools-a-machine-calls-them-as-an-effect-and-the-machine-is-the-approval.md)): `mcp.call(server, tool, { input })` calls a tool,
|
|
15
|
+
`mcp.read(server, uri)` reads a resource, and `mcp.prompt(server, name, { input })` gets a
|
|
16
|
+
prompt. Each one is an Effect that the Machine runs, with no model, in the Instance Effector.
|
|
17
|
+
Put it in `actors`, and invoke it by its key.
|
|
18
|
+
|
|
19
|
+
`server` is a name of the `mcp` block of `jr2.config.ts`: a remote server, whose url and secret
|
|
20
|
+
are the config's. The Instance Effector holds that secret as an Effect secret, and sends it as
|
|
21
|
+
`Authorization: Bearer <value>`. The Agent and the Orchestrator never read it. `jr2 up` refuses
|
|
22
|
+
a server that the `mcp` block does not declare, and a stdio server. `server`, and a call's
|
|
23
|
+
`tool`, can each be `open`: the composer binds them one time with `customize(machine, { effects:
|
|
24
|
+
{ <slot>: { server, tool } } })`.
|
|
25
|
+
|
|
26
|
+
Every outcome is output ([`McpCallOutput`](type-mcpcalloutput.md), [`McpReadOutput`](type-mcpreadoutput.md)): `returned`, `refused`,
|
|
27
|
+
`unreachable`, `input-required` or `unknown`. jr2 sends the request at most one time, unless you
|
|
28
|
+
mark it `idempotent`. jr2 does not read the tool's `idempotentHint`.
|
|
29
|
+
|
|
30
|
+
An Agent that holds a server's tools (its `mcp` list) calls them with no approval. When a call
|
|
31
|
+
needs an approval, the Machine makes it: the Agent picks, a Gate waits for a person, and the
|
|
32
|
+
Effect makes the call. The Effect's output is the pick's answer.
|
|
33
|
+
|
|
34
|
+
**Example**
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
import { assign } from "xstate";
|
|
38
|
+
import { z } from "zod";
|
|
39
|
+
import { agent, defineEvent, fail, gate, jr2Setup, mcp } from "@jr2/orchestrator";
|
|
40
|
+
|
|
41
|
+
const postMessage = defineEvent({
|
|
42
|
+
name: "post_message",
|
|
43
|
+
description: "Post one message to the team's channel. A person approves it first.",
|
|
44
|
+
input: z.object({ text: z.string() }),
|
|
45
|
+
});
|
|
46
|
+
const approve = defineEvent({ name: "approve", input: z.object({ by: z.string() }) });
|
|
47
|
+
const reject = defineEvent({ name: "reject", input: z.object({ by: z.string() }) });
|
|
48
|
+
|
|
49
|
+
export const machine = jr2Setup({
|
|
50
|
+
types: {} as { context: { text: string } },
|
|
51
|
+
events: [postMessage, approve, reject],
|
|
52
|
+
actors: {
|
|
53
|
+
writer: agent({
|
|
54
|
+
model: "anthropic/claude-haiku-5-5",
|
|
55
|
+
instructions: "You write the release note for the team.",
|
|
56
|
+
workspace: "none",
|
|
57
|
+
}),
|
|
58
|
+
// A person answers it, in the Console or with `jr2 answer`.
|
|
59
|
+
approval: gate({ meta: z.object({ text: z.string() }), delivers: [approve, reject], look: "none" }),
|
|
60
|
+
// "slack-acme" is a remote server of the mcp block of jr2.config.ts.
|
|
61
|
+
post: mcp.call("slack-acme", "post_message", {
|
|
62
|
+
input: z.object({ channel: z.string(), text: z.string() }),
|
|
63
|
+
}),
|
|
64
|
+
fail: fail(),
|
|
65
|
+
},
|
|
66
|
+
}).createMachine({
|
|
67
|
+
id: "release-note",
|
|
68
|
+
context: { text: "" },
|
|
69
|
+
on: { "agent.fault": ".failed" },
|
|
70
|
+
initial: "writing",
|
|
71
|
+
states: {
|
|
72
|
+
writing: {
|
|
73
|
+
invoke: { src: "writer", input: { prompt: "Write the release note, then post it." } },
|
|
74
|
+
initial: "ready",
|
|
75
|
+
states: {
|
|
76
|
+
ready: {
|
|
77
|
+
on: {
|
|
78
|
+
post_message: { target: "approving", actions: assign({ text: ({ event }) => event.text }) },
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
approving: {
|
|
82
|
+
invoke: { src: "approval", input: ({ context }) => ({ meta: { text: context.text } }) },
|
|
83
|
+
on: { approve: "posting", reject: "ready" },
|
|
84
|
+
},
|
|
85
|
+
posting: {
|
|
86
|
+
invoke: {
|
|
87
|
+
src: "post",
|
|
88
|
+
input: ({ context }) => ({ channel: "#releases", text: context.text }),
|
|
89
|
+
// On another outcome, the Agent reads the output as the answer to its pick.
|
|
90
|
+
onDone: [
|
|
91
|
+
{ guard: ({ event }) => event.output.outcome === "returned" && !event.output.isError, target: "#posted" },
|
|
92
|
+
{ target: "ready" },
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
posted: { id: "posted", type: "final" },
|
|
99
|
+
failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**See also**
|
|
105
|
+
|
|
106
|
+
- [Effects](../../concepts/effects.md)
|
|
107
|
+
- [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)
|
|
@@ -5,7 +5,7 @@ description: "Leave a part of a Machine Open: for the Instance that registers th
|
|
|
5
5
|
|
|
6
6
|
# `open`
|
|
7
7
|
|
|
8
|
-
Constant, in `@jr2/orchestrator/src/open.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Constant, in `@jr2/orchestrator/src/open.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
|
const open: unique symbol
|
|
@@ -17,12 +17,14 @@ part that the package cannot know or pay for:
|
|
|
17
17
|
- a Repo Slot: `repos: { app: open }`, or the whole map: `repos: open`;
|
|
18
18
|
- an Agent's model: `agent({ model: open, … })`;
|
|
19
19
|
- an Effect's url or argv: `http({ url: open, … })`, `command(open)`;
|
|
20
|
-
- the secret of an Effect's auth, of a header, or of a command's `env`: `secret(open)
|
|
20
|
+
- the secret of an Effect's auth, of a header, or of a command's `env`: `secret(open)`;
|
|
21
|
+
- the look of a Gate slot: `gate({ …, look: open })`.
|
|
21
22
|
|
|
22
23
|
`jr2 up` refuses a Workflow with an Open part that nobody bound, and prints the `customize()`
|
|
23
24
|
line that binds it: ``refusing: workflow "<name>" leaves <part> open — bind it where the Machine
|
|
24
25
|
is registered: export const machine = customize(<import>, …) (<adr>)``. A run never sees an
|
|
25
|
-
Open part.
|
|
26
|
+
Open part. An Open look is the one exception: `jr2 up` warns about it and does not refuse,
|
|
27
|
+
because a person can still answer the Gate with `jr2 send`.
|
|
26
28
|
|
|
27
29
|
**Example**
|
|
28
30
|
|
|
@@ -5,7 +5,7 @@ description: "Make an Open body: the actor slot that a Chart binds."
|
|
|
5
5
|
|
|
6
6
|
# `openBody`
|
|
7
7
|
|
|
8
|
-
Function, in `@jr2/orchestrator/src/open-body.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Function, in `@jr2/orchestrator/src/open-body.ts`. It is an export of `@jr2/orchestrator`, in the [Charts](group-charts.md) group of the [Authoring surface](../authoring-surface.md) page.
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
11
|
function openBody(decl: OpenBodyDeclaration): OpenBodyLogic
|
|
@@ -5,7 +5,7 @@ description: Read the params of a pick from the event that entered the state.
|
|
|
5
5
|
|
|
6
6
|
# `paramsOf`
|
|
7
7
|
|
|
8
|
-
Function, in `@jr2/orchestrator/src/pick.ts`. It is an export of `@jr2/orchestrator`,
|
|
8
|
+
Function, in `@jr2/orchestrator/src/pick.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
|
function paramsOf<
|