@relayflows/sdk 2.0.9 → 2.0.10
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/dist/adapters/base.d.ts +46 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +15 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude.d.ts +5 -0
- package/dist/adapters/claude.d.ts.map +1 -0
- package/dist/adapters/claude.js +44 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/codex.d.ts +5 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +45 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/index.d.ts +14 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +29 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/wrapper.d.ts +12 -0
- package/dist/adapters/wrapper.d.ts.map +1 -0
- package/dist/adapters/wrapper.js +31 -0
- package/dist/adapters/wrapper.js.map +1 -0
- package/dist/agent-relay-transport.d.ts +84 -0
- package/dist/agent-relay-transport.d.ts.map +1 -0
- package/dist/agent-relay-transport.js +134 -0
- package/dist/agent-relay-transport.js.map +1 -0
- package/dist/authored-budget.d.ts +13 -0
- package/dist/authored-budget.d.ts.map +1 -0
- package/dist/authored-budget.js +78 -0
- package/dist/authored-budget.js.map +1 -0
- package/dist/authored-flow-error.d.ts +2 -21
- package/dist/authored-flow-error.d.ts.map +1 -1
- package/dist/authored-flow-error.js +1 -12
- package/dist/authored-flow-error.js.map +1 -1
- package/dist/authored-flow-executor.d.ts +13 -7
- package/dist/authored-flow-executor.d.ts.map +1 -1
- package/dist/authored-flow-executor.js +116 -235
- package/dist/authored-flow-executor.js.map +1 -1
- package/dist/authored-flow-loader.d.ts +10 -1
- package/dist/authored-flow-loader.d.ts.map +1 -1
- package/dist/authored-flow-loader.js +56 -3
- package/dist/authored-flow-loader.js.map +1 -1
- package/dist/authored-flow-operation.d.ts +9 -1
- package/dist/authored-flow-operation.d.ts.map +1 -1
- package/dist/authored-flow-operation.js +35 -4
- package/dist/authored-flow-operation.js.map +1 -1
- package/dist/authored-helper-effect.d.ts +12 -0
- package/dist/authored-helper-effect.d.ts.map +1 -0
- package/dist/authored-helper-effect.js +144 -0
- package/dist/authored-helper-effect.js.map +1 -0
- package/dist/authored-mcp.d.ts +17 -0
- package/dist/authored-mcp.d.ts.map +1 -0
- package/dist/authored-mcp.js +171 -0
- package/dist/authored-mcp.js.map +1 -0
- package/dist/authored-memory.d.ts +7 -0
- package/dist/authored-memory.d.ts.map +1 -0
- package/dist/authored-memory.js +60 -0
- package/dist/authored-memory.js.map +1 -0
- package/dist/authored-plugin-effect.d.ts +16 -0
- package/dist/authored-plugin-effect.d.ts.map +1 -0
- package/dist/authored-plugin-effect.js +163 -0
- package/dist/authored-plugin-effect.js.map +1 -0
- package/dist/authored-step-output.d.ts +23 -0
- package/dist/authored-step-output.d.ts.map +1 -0
- package/dist/authored-step-output.js +67 -0
- package/dist/authored-step-output.js.map +1 -0
- package/dist/authored-worker-step.d.ts +15 -0
- package/dist/authored-worker-step.d.ts.map +1 -0
- package/dist/authored-worker-step.js +136 -0
- package/dist/authored-worker-step.js.map +1 -0
- package/dist/budget-preflight.d.ts +5 -0
- package/dist/budget-preflight.d.ts.map +1 -0
- package/dist/budget-preflight.js +33 -0
- package/dist/budget-preflight.js.map +1 -0
- package/dist/budget.d.ts +14 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +52 -0
- package/dist/budget.js.map +1 -0
- package/dist/bundle-transport.d.ts +18 -0
- package/dist/bundle-transport.d.ts.map +1 -0
- package/dist/bundle-transport.js +111 -0
- package/dist/bundle-transport.js.map +1 -0
- package/dist/bundle-typescript.d.ts +8 -0
- package/dist/bundle-typescript.d.ts.map +1 -0
- package/dist/bundle-typescript.js +108 -0
- package/dist/bundle-typescript.js.map +1 -0
- package/dist/bundle.d.ts +25 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +199 -0
- package/dist/bundle.js.map +1 -0
- package/dist/child-stop.d.ts +59 -0
- package/dist/child-stop.d.ts.map +1 -0
- package/dist/child-stop.js +94 -0
- package/dist/child-stop.js.map +1 -0
- package/dist/cli/add.d.ts +6 -0
- package/dist/cli/add.d.ts.map +1 -0
- package/dist/cli/add.js +47 -0
- package/dist/cli/add.js.map +1 -0
- package/dist/cli/build.d.ts +13 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +224 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/bundle-preflight.d.ts +5 -0
- package/dist/cli/bundle-preflight.d.ts.map +1 -0
- package/dist/cli/bundle-preflight.js +28 -0
- package/dist/cli/bundle-preflight.js.map +1 -0
- package/dist/cli/check-helper-body.d.ts +4 -0
- package/dist/cli/check-helper-body.d.ts.map +1 -0
- package/dist/cli/check-helper-body.js +15 -0
- package/dist/cli/check-helper-body.js.map +1 -0
- package/dist/cli/check-triggers.d.ts +14 -0
- package/dist/cli/check-triggers.d.ts.map +1 -0
- package/dist/cli/check-triggers.js +37 -0
- package/dist/cli/check-triggers.js.map +1 -0
- package/dist/cli/check-typescript.d.ts +20 -0
- package/dist/cli/check-typescript.d.ts.map +1 -0
- package/dist/cli/check-typescript.js +54 -0
- package/dist/cli/check-typescript.js.map +1 -0
- package/dist/cli/check.d.ts +36 -3
- package/dist/cli/check.d.ts.map +1 -1
- package/dist/cli/check.js +122 -11
- package/dist/cli/check.js.map +1 -1
- package/dist/cli/cloud-run.d.ts +8 -0
- package/dist/cli/cloud-run.d.ts.map +1 -0
- package/dist/cli/cloud-run.js +50 -0
- package/dist/cli/cloud-run.js.map +1 -0
- package/dist/cli/deploy.d.ts +9 -0
- package/dist/cli/deploy.d.ts.map +1 -0
- package/dist/cli/deploy.js +58 -0
- package/dist/cli/deploy.js.map +1 -0
- package/dist/cli/deterministic-failure.d.ts +5 -0
- package/dist/cli/deterministic-failure.d.ts.map +1 -0
- package/dist/cli/deterministic-failure.js +66 -0
- package/dist/cli/deterministic-failure.js.map +1 -0
- package/dist/cli/direct-run.d.ts.map +1 -1
- package/dist/cli/direct-run.js +83 -18
- package/dist/cli/direct-run.js.map +1 -1
- package/dist/cli/hn-monitor.d.ts.map +1 -1
- package/dist/cli/hn-monitor.js +2 -1
- package/dist/cli/hn-monitor.js.map +1 -1
- package/dist/cli/replay.d.ts +12 -0
- package/dist/cli/replay.d.ts.map +1 -0
- package/dist/cli/replay.js +82 -0
- package/dist/cli/replay.js.map +1 -0
- package/dist/cli/reuse.d.ts +8 -0
- package/dist/cli/reuse.d.ts.map +1 -0
- package/dist/cli/reuse.js +25 -0
- package/dist/cli/reuse.js.map +1 -0
- package/dist/cli/run-digest.d.ts +4 -0
- package/dist/cli/run-digest.d.ts.map +1 -0
- package/dist/cli/run-digest.js +24 -0
- package/dist/cli/run-digest.js.map +1 -0
- package/dist/cli/run.d.ts +16 -5
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +99 -17
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/serve-webhook.d.ts +40 -0
- package/dist/cli/serve-webhook.d.ts.map +1 -0
- package/dist/cli/serve-webhook.js +233 -0
- package/dist/cli/serve-webhook.js.map +1 -0
- package/dist/cli/tick-runner.d.ts.map +1 -1
- package/dist/cli/tick-runner.js +2 -1
- package/dist/cli/tick-runner.js.map +1 -1
- package/dist/cli-adapter.d.ts +8 -14
- package/dist/cli-adapter.d.ts.map +1 -1
- package/dist/cli-adapter.js +19 -64
- package/dist/cli-adapter.js.map +1 -1
- package/dist/cli-watch.d.ts +13 -0
- package/dist/cli-watch.d.ts.map +1 -0
- package/dist/cli-watch.js +185 -0
- package/dist/cli-watch.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +387 -14
- package/dist/cli.js.map +1 -1
- package/dist/cloud-http.d.ts +22 -0
- package/dist/cloud-http.d.ts.map +1 -0
- package/dist/cloud-http.js +84 -0
- package/dist/cloud-http.js.map +1 -0
- package/dist/cloud-run.d.ts +38 -0
- package/dist/cloud-run.d.ts.map +1 -0
- package/dist/cloud-run.js +112 -0
- package/dist/cloud-run.js.map +1 -0
- package/dist/compile.d.ts +21 -3
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +97 -23
- package/dist/compile.js.map +1 -1
- package/dist/create-flow.d.ts +17 -0
- package/dist/create-flow.d.ts.map +1 -0
- package/dist/create-flow.js +72 -0
- package/dist/create-flow.js.map +1 -0
- package/dist/daemon-connection.d.ts +14 -0
- package/dist/daemon-connection.d.ts.map +1 -1
- package/dist/daemon-connection.js +33 -1
- package/dist/daemon-connection.js.map +1 -1
- package/dist/demo-hn-monitor.js +2 -1
- package/dist/demo-hn-monitor.js.map +1 -1
- package/dist/effect-channel.d.ts +30 -0
- package/dist/effect-channel.d.ts.map +1 -0
- package/dist/effect-channel.js +71 -0
- package/dist/effect-channel.js.map +1 -0
- package/dist/failure-kinds.d.ts +14 -3
- package/dist/failure-kinds.d.ts.map +1 -1
- package/dist/failure-kinds.js +27 -0
- package/dist/failure-kinds.js.map +1 -1
- package/dist/gate-contract.d.ts.map +1 -1
- package/dist/gate-contract.js +9 -0
- package/dist/gate-contract.js.map +1 -1
- package/dist/helper-preflight.d.ts +18 -0
- package/dist/helper-preflight.d.ts.map +1 -0
- package/dist/helper-preflight.js +32 -0
- package/dist/helper-preflight.js.map +1 -0
- package/dist/helper-storage.d.ts +5 -0
- package/dist/helper-storage.d.ts.map +1 -0
- package/dist/helper-storage.js +31 -0
- package/dist/helper-storage.js.map +1 -0
- package/dist/helper-writeback.d.ts +12 -0
- package/dist/helper-writeback.d.ts.map +1 -0
- package/dist/helper-writeback.js +95 -0
- package/dist/helper-writeback.js.map +1 -0
- package/dist/index.d.ts +10 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/input-binding.d.ts +4 -0
- package/dist/input-binding.d.ts.map +1 -0
- package/dist/input-binding.js +78 -0
- package/dist/input-binding.js.map +1 -0
- package/dist/journal-client.d.ts +12 -4
- package/dist/journal-client.d.ts.map +1 -1
- package/dist/journal-client.js +17 -6
- package/dist/journal-client.js.map +1 -1
- package/dist/journal-offset.d.ts +3 -0
- package/dist/journal-offset.d.ts.map +1 -0
- package/dist/journal-offset.js +69 -0
- package/dist/journal-offset.js.map +1 -0
- package/dist/journal-reader.d.ts +30 -0
- package/dist/journal-reader.d.ts.map +1 -0
- package/dist/journal-reader.js +156 -0
- package/dist/journal-reader.js.map +1 -0
- package/dist/json-schema.d.ts +2 -0
- package/dist/json-schema.d.ts.map +1 -1
- package/dist/json-schema.js +38 -22
- package/dist/json-schema.js.map +1 -1
- package/dist/llm-worker.d.ts +16 -0
- package/dist/llm-worker.d.ts.map +1 -0
- package/dist/llm-worker.js +79 -0
- package/dist/llm-worker.js.map +1 -0
- package/dist/local-agent.d.ts +8 -0
- package/dist/local-agent.d.ts.map +1 -0
- package/dist/local-agent.js +25 -0
- package/dist/local-agent.js.map +1 -0
- package/dist/mcp-client.d.ts +15 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +104 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp-config.d.ts +4 -0
- package/dist/mcp-config.d.ts.map +1 -0
- package/dist/mcp-config.js +61 -0
- package/dist/mcp-config.js.map +1 -0
- package/dist/mcp-stdio.d.ts +24 -0
- package/dist/mcp-stdio.d.ts.map +1 -0
- package/dist/mcp-stdio.js +89 -0
- package/dist/mcp-stdio.js.map +1 -0
- package/dist/model-pricing.d.ts +22 -0
- package/dist/model-pricing.d.ts.map +1 -0
- package/dist/model-pricing.js +30 -0
- package/dist/model-pricing.js.map +1 -0
- package/dist/mount-registry.d.ts +9 -0
- package/dist/mount-registry.d.ts.map +1 -0
- package/dist/mount-registry.js +47 -0
- package/dist/mount-registry.js.map +1 -0
- package/dist/named-gate-lowering.d.ts +9 -0
- package/dist/named-gate-lowering.d.ts.map +1 -0
- package/dist/named-gate-lowering.js +152 -0
- package/dist/named-gate-lowering.js.map +1 -0
- package/dist/named-gates.d.ts +10 -0
- package/dist/named-gates.d.ts.map +1 -0
- package/dist/named-gates.js +69 -0
- package/dist/named-gates.js.map +1 -0
- package/dist/observer-link.d.ts +129 -0
- package/dist/observer-link.d.ts.map +1 -0
- package/dist/observer-link.js +274 -0
- package/dist/observer-link.js.map +1 -0
- package/dist/plugin-loader.d.ts +13 -0
- package/dist/plugin-loader.d.ts.map +1 -0
- package/dist/plugin-loader.js +110 -0
- package/dist/plugin-loader.js.map +1 -0
- package/dist/plugin-manifest.d.ts +27 -0
- package/dist/plugin-manifest.d.ts.map +1 -0
- package/dist/plugin-manifest.js +89 -0
- package/dist/plugin-manifest.js.map +1 -0
- package/dist/preflight.d.ts +26 -2
- package/dist/preflight.d.ts.map +1 -1
- package/dist/preflight.js +175 -1
- package/dist/preflight.js.map +1 -1
- package/dist/progress.d.ts +14 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +39 -0
- package/dist/progress.js.map +1 -0
- package/dist/protocol.d.ts +11 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/pty-sidechannel.d.ts +14 -0
- package/dist/pty-sidechannel.d.ts.map +1 -0
- package/dist/pty-sidechannel.js +103 -0
- package/dist/pty-sidechannel.js.map +1 -0
- package/dist/scope-compiler.d.ts +52 -0
- package/dist/scope-compiler.d.ts.map +1 -0
- package/dist/scope-compiler.js +62 -0
- package/dist/scope-compiler.js.map +1 -0
- package/dist/slack-preflight.d.ts +6 -0
- package/dist/slack-preflight.d.ts.map +1 -0
- package/dist/slack-preflight.js +28 -0
- package/dist/slack-preflight.js.map +1 -0
- package/dist/slack-writeback.d.ts +40 -0
- package/dist/slack-writeback.d.ts.map +1 -0
- package/dist/slack-writeback.js +60 -0
- package/dist/slack-writeback.js.map +1 -0
- package/dist/spec.d.ts +134 -4
- package/dist/spec.d.ts.map +1 -1
- package/dist/spec.js.map +1 -1
- package/dist/step-dependencies.d.ts.map +1 -1
- package/dist/step-dependencies.js +2 -1
- package/dist/step-dependencies.js.map +1 -1
- package/dist/step-fields.d.ts +4 -4
- package/dist/step-fields.d.ts.map +1 -1
- package/dist/step-fields.js +5 -2
- package/dist/step-fields.js.map +1 -1
- package/dist/trigger-executor.d.ts +7 -0
- package/dist/trigger-executor.d.ts.map +1 -0
- package/dist/trigger-executor.js +35 -0
- package/dist/trigger-executor.js.map +1 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +53 -6
- package/dist/validate.js.map +1 -1
- package/dist/webhook-rate-limit.d.ts +29 -0
- package/dist/webhook-rate-limit.d.ts.map +1 -0
- package/dist/webhook-rate-limit.js +38 -0
- package/dist/webhook-rate-limit.js.map +1 -0
- package/dist/webhook-signature.d.ts +22 -0
- package/dist/webhook-signature.d.ts.map +1 -0
- package/dist/webhook-signature.js +53 -0
- package/dist/webhook-signature.js.map +1 -0
- package/dist/worker-cli.d.ts +13 -1
- package/dist/worker-cli.d.ts.map +1 -1
- package/dist/worker-cli.js +133 -12
- package/dist/worker-cli.js.map +1 -1
- package/dist/worker-input.d.ts +4 -0
- package/dist/worker-input.d.ts.map +1 -0
- package/dist/worker-input.js +14 -0
- package/dist/worker-input.js.map +1 -0
- package/dist/worker-lease.d.ts +5 -0
- package/dist/worker-lease.d.ts.map +1 -0
- package/dist/worker-lease.js +80 -0
- package/dist/worker-lease.js.map +1 -0
- package/dist/worker-spend.d.ts +19 -0
- package/dist/worker-spend.d.ts.map +1 -0
- package/dist/worker-spend.js +22 -0
- package/dist/worker-spend.js.map +1 -0
- package/dist/worker-usage.d.ts +7 -0
- package/dist/worker-usage.d.ts.map +1 -0
- package/dist/worker-usage.js +54 -0
- package/dist/worker-usage.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +22 -8
- package/dist/worker.js.map +1 -1
- package/dist/wrapper-session.d.ts +1 -1
- package/dist/wrapper-session.d.ts.map +1 -1
- package/dist/wrapper-session.js +56 -19
- package/dist/wrapper-session.js.map +1 -1
- package/dist/yaml-helper-effect.d.ts +8 -0
- package/dist/yaml-helper-effect.d.ts.map +1 -0
- package/dist/yaml-helper-effect.js +79 -0
- package/dist/yaml-helper-effect.js.map +1 -0
- package/dist/yaml-helpers.d.ts +18 -0
- package/dist/yaml-helpers.d.ts.map +1 -0
- package/dist/yaml-helpers.js +116 -0
- package/dist/yaml-helpers.js.map +1 -0
- package/package.json +19 -2
- package/src/adapters/base.ts +53 -0
- package/src/adapters/claude.ts +55 -0
- package/src/adapters/codex.ts +56 -0
- package/src/adapters/index.ts +36 -0
- package/src/adapters/wrapper.ts +42 -0
- package/src/agent-relay-transport.ts +187 -0
- package/src/authored-budget.ts +69 -0
- package/src/authored-flow-error.ts +10 -10
- package/src/authored-flow-executor.ts +171 -347
- package/src/authored-flow-loader.ts +60 -3
- package/src/authored-flow-operation.ts +38 -5
- package/src/authored-helper-effect.ts +143 -0
- package/src/authored-mcp.ts +166 -0
- package/src/authored-memory.ts +55 -0
- package/src/authored-plugin-effect.ts +152 -0
- package/src/authored-step-output.ts +107 -0
- package/src/authored-worker-step.ts +181 -0
- package/src/budget-preflight.ts +31 -0
- package/src/budget.ts +49 -0
- package/src/bundle-transport.ts +79 -0
- package/src/bundle-typescript.ts +98 -0
- package/src/bundle.ts +182 -0
- package/src/child-stop.ts +138 -0
- package/src/cli/add.ts +45 -0
- package/src/cli/build.ts +214 -0
- package/src/cli/bundle-preflight.ts +28 -0
- package/src/cli/check-helper-body.ts +14 -0
- package/src/cli/check-triggers.ts +41 -0
- package/src/cli/check-typescript.ts +63 -0
- package/src/cli/check.ts +132 -14
- package/src/cli/cloud-run.ts +47 -0
- package/src/cli/deploy.ts +52 -0
- package/src/cli/deterministic-failure.ts +69 -0
- package/src/cli/direct-run.ts +79 -18
- package/src/cli/hn-monitor.ts +2 -1
- package/src/cli/replay.ts +81 -0
- package/src/cli/reuse.ts +23 -0
- package/src/cli/run-digest.ts +24 -0
- package/src/cli/run.ts +104 -21
- package/src/cli/serve-webhook.ts +246 -0
- package/src/cli/tick-runner.ts +2 -1
- package/src/cli-adapter.ts +31 -74
- package/src/cli-watch.ts +174 -0
- package/src/cli.ts +396 -17
- package/src/cloud-http.ts +100 -0
- package/src/cloud-run.ts +137 -0
- package/src/compile.ts +102 -23
- package/src/create-flow.ts +82 -0
- package/src/daemon-connection.ts +32 -1
- package/src/demo-hn-monitor.ts +2 -1
- package/src/effect-channel.ts +97 -0
- package/src/failure-kinds.ts +38 -0
- package/src/gate-contract.ts +7 -0
- package/src/helper-preflight.ts +34 -0
- package/src/helper-storage.ts +23 -0
- package/src/helper-writeback.ts +83 -0
- package/src/index.ts +26 -0
- package/src/input-binding.ts +76 -0
- package/src/journal-client.ts +20 -7
- package/src/journal-offset.ts +60 -0
- package/src/journal-reader.ts +165 -0
- package/src/json-schema.ts +34 -18
- package/src/llm-worker.ts +82 -0
- package/src/local-agent.ts +30 -0
- package/src/mcp-client.ts +97 -0
- package/src/mcp-config.ts +42 -0
- package/src/mcp-stdio.ts +84 -0
- package/src/model-pricing.ts +32 -0
- package/src/mount-registry.ts +44 -0
- package/src/named-gate-lowering.ts +147 -0
- package/src/named-gates.ts +76 -0
- package/src/observer-link.ts +368 -0
- package/src/plugin-loader.ts +88 -0
- package/src/plugin-manifest.ts +76 -0
- package/src/preflight.ts +178 -4
- package/src/progress.ts +51 -0
- package/src/protocol.ts +12 -0
- package/src/pty-sidechannel.ts +92 -0
- package/src/scope-compiler.ts +105 -0
- package/src/slack-preflight.ts +25 -0
- package/src/slack-writeback.ts +63 -0
- package/src/spec.ts +112 -4
- package/src/step-dependencies.ts +3 -1
- package/src/step-fields.ts +5 -2
- package/src/trigger-executor.ts +34 -0
- package/src/validate.ts +47 -6
- package/src/webhook-rate-limit.ts +69 -0
- package/src/webhook-signature.ts +74 -0
- package/src/worker-cli.ts +156 -11
- package/src/worker-input.ts +15 -0
- package/src/worker-lease.ts +85 -0
- package/src/worker-spend.ts +23 -0
- package/src/worker-usage.ts +48 -0
- package/src/worker.ts +27 -9
- package/src/wrapper-session.ts +50 -15
- package/src/yaml-helper-effect.ts +78 -0
- package/src/yaml-helpers.ts +131 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { compileSpec, toKernelSpec } from './compile.js';
|
|
3
|
+
import { snapshotJsonValue } from './json-value.js';
|
|
4
|
+
import { McpError, openMcpSession } from './mcp-client.js';
|
|
5
|
+
import { SPEC_SCHEMA_VERSION } from './spec.js';
|
|
6
|
+
import { AuthoredFlowExecutionError } from './authored-flow-error.js';
|
|
7
|
+
import { readCompletedStepOutput } from './authored-step-output.js';
|
|
8
|
+
import { withWorkerLease } from './worker-lease.js';
|
|
9
|
+
/** Own keys expose precisely the preflight inventory, including prototype-like names. */
|
|
10
|
+
export function buildMcpProxy(inventory, invoke) {
|
|
11
|
+
const servers = Object.create(null);
|
|
12
|
+
for (const [server, names] of Object.entries(inventory)) {
|
|
13
|
+
const tools = Object.create(null);
|
|
14
|
+
const call = (tool, known) => (args) => invoke(server, tool, snapshotJsonValue(args, `f.mcp.${server}.${tool} arguments`), known);
|
|
15
|
+
for (const tool of names)
|
|
16
|
+
tools[tool] = call(tool, true);
|
|
17
|
+
servers[server] = new Proxy(Object.freeze(tools), {
|
|
18
|
+
get(target, key) {
|
|
19
|
+
if (typeof key !== 'string')
|
|
20
|
+
return undefined;
|
|
21
|
+
if (Object.hasOwn(target, key))
|
|
22
|
+
return target[key];
|
|
23
|
+
// Calling a tool outside the inventory still creates an operation,
|
|
24
|
+
// so worker_error is journaled like other runtime failures.
|
|
25
|
+
return call(key, false);
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return Object.freeze(servers);
|
|
30
|
+
}
|
|
31
|
+
export class McpStepError extends AuthoredFlowExecutionError {
|
|
32
|
+
diagnostic;
|
|
33
|
+
constructor(diagnostic, runId) {
|
|
34
|
+
super('step_failed', diagnostic, 'worker_error', runId);
|
|
35
|
+
this.diagnostic = diagnostic;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Helpers lower to an existing agent effect, never a fourth kernel primitive.
|
|
39
|
+
* The MCP receipt lives in step.completed.output: { type, input, output, ... }.
|
|
40
|
+
* A private stream routes the step to this short-lived SDK worker exclusively.
|
|
41
|
+
*/
|
|
42
|
+
export async function runMcpEffect(journal, flowName, id, server, tool, args, known, config, journalSteps) {
|
|
43
|
+
const idempotencyKey = `mcp:${server}:${tool}:${createHash('sha256').update(JSON.stringify(args)).digest('hex')}`;
|
|
44
|
+
const surfacePath = `/mcp/${pathPart(server)}/${pathPart(tool)}`;
|
|
45
|
+
const stream = `mcp-worker-${randomUUID()}`;
|
|
46
|
+
const instruction = JSON.stringify({ type: 'mcp', server, tool, input: args });
|
|
47
|
+
const peer = journal.createPeer();
|
|
48
|
+
let diagnostic;
|
|
49
|
+
let settled;
|
|
50
|
+
let failed;
|
|
51
|
+
const completed = new Promise((resolve, reject) => { settled = resolve; failed = reject; });
|
|
52
|
+
void completed.catch(() => undefined);
|
|
53
|
+
let timer;
|
|
54
|
+
let work;
|
|
55
|
+
let dispatchExpired = false;
|
|
56
|
+
const dispatch = (event) => {
|
|
57
|
+
if (dispatchExpired)
|
|
58
|
+
return;
|
|
59
|
+
const dispatched = event.spec;
|
|
60
|
+
if (event.step_id !== id || event.step_type !== 'agent' || work !== undefined
|
|
61
|
+
|| dispatched?.instruction !== instruction
|
|
62
|
+
|| !dispatched.surfaces?.streams?.some(pin => pin.stream === stream)) {
|
|
63
|
+
failed(new Error('MCP worker received an unexpected dispatch'));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
timer = undefined;
|
|
68
|
+
work = execute(event);
|
|
69
|
+
void work.then(settled, failed);
|
|
70
|
+
};
|
|
71
|
+
async function execute(event) {
|
|
72
|
+
const receipt = { type: 'mcp', server, tool, input: args, idempotencyKey };
|
|
73
|
+
let output;
|
|
74
|
+
let confirmed = false;
|
|
75
|
+
try {
|
|
76
|
+
if (!known)
|
|
77
|
+
throw new Error('mcp_unknown_tool');
|
|
78
|
+
// Renew the worker lease while the MCP tool is in flight. Without this,
|
|
79
|
+
// a tool that runs longer than the initial lease loses ownership and
|
|
80
|
+
// the write-back path fails — see worker-lease.ts for the renewal contract.
|
|
81
|
+
confirmed = await withWorkerLease(peer, event, async () => {
|
|
82
|
+
return peer.performEffect({
|
|
83
|
+
runId: event.run_id, stepId: id, attempt: event.attempt, idempotencyKey: event.idempotency_key,
|
|
84
|
+
surfacePath, revisionBefore: 'pending', revisionAfter: idempotencyKey,
|
|
85
|
+
}, async () => {
|
|
86
|
+
const session = await openMcpSession(config, 10_000);
|
|
87
|
+
try {
|
|
88
|
+
output = await session.callTool(tool, args);
|
|
89
|
+
if (typeof output === 'object' && output !== null && 'isError' in output && output.isError === true) {
|
|
90
|
+
throw new Error('mcp_tool_error');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
await session.close();
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
// A confirmed election without its receipt is an interrupted writeback,
|
|
99
|
+
// not a successful result we may invent or a call we may safely repeat.
|
|
100
|
+
if (!confirmed)
|
|
101
|
+
throw new Error('mcp_result_unavailable');
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (error instanceof McpError)
|
|
105
|
+
diagnostic = error.code;
|
|
106
|
+
else if (error instanceof Error && ['mcp_unknown_tool', 'mcp_tool_error', 'mcp_result_unavailable'].includes(error.message))
|
|
107
|
+
diagnostic = error.message;
|
|
108
|
+
else
|
|
109
|
+
throw error; // Journal failures remain fail-closed, never provider errors.
|
|
110
|
+
}
|
|
111
|
+
await peer.stepComplete(event.run_id, id, event.attempt, event.idempotency_key, diagnostic === undefined ? 'success' : 'worker_error', {
|
|
112
|
+
output: { ...receipt, output: output ?? null, ...(diagnostic ? { diagnostic } : {}) },
|
|
113
|
+
started_pins: event.pins, end_pins: event.pins,
|
|
114
|
+
...(diagnostic ? { trajectory_tail: { ...receipt, diagnostic } } : {}),
|
|
115
|
+
effects: confirmed ? [{ surface_path: surfacePath, idempotency_key: event.idempotency_key }] : [],
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
let childRunId;
|
|
119
|
+
try {
|
|
120
|
+
await peer.connect();
|
|
121
|
+
await peer.hello('flows-mcp');
|
|
122
|
+
peer.on('step.dispatch', dispatch);
|
|
123
|
+
await peer.workerAttach(stream, ['agent'], { workspace: [], streams: [{ stream, read_offset: 0 }] }, 1);
|
|
124
|
+
const spec = toKernelSpec(compileSpec({ version: SPEC_SCHEMA_VERSION, name: `${flowName}/${id}`,
|
|
125
|
+
steps: [{ id, type: 'agent', instruction,
|
|
126
|
+
surfaces: { streams: [{ stream }], external: [surfacePath] }, maxIterations: 1 }],
|
|
127
|
+
}));
|
|
128
|
+
timer = setTimeout(() => {
|
|
129
|
+
dispatchExpired = true;
|
|
130
|
+
failed(new Error('MCP worker dispatch deadline exceeded'));
|
|
131
|
+
}, 30_000);
|
|
132
|
+
// Propagate a dispatch failure even if run.start itself is still pending.
|
|
133
|
+
const starting = journal.runStart(spec);
|
|
134
|
+
await Promise.race([starting, completed]);
|
|
135
|
+
const outcome = await starting;
|
|
136
|
+
childRunId = outcome.run_id;
|
|
137
|
+
await completed;
|
|
138
|
+
if (diagnostic !== undefined) {
|
|
139
|
+
try {
|
|
140
|
+
await readCompletedStepOutput(journal, outcome.run_id, id, journalSteps);
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (!(error instanceof AuthoredFlowExecutionError) || error.code !== 'step_failed')
|
|
144
|
+
throw error;
|
|
145
|
+
throw new McpStepError(diagnostic, outcome.run_id);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const receipt = await readCompletedStepOutput(journal, outcome.run_id, id, journalSteps);
|
|
149
|
+
return receipt.output;
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
clearTimeout(timer);
|
|
153
|
+
peer.off('step.dispatch', dispatch);
|
|
154
|
+
// If the dispatch deadline fired we started a child run that will never
|
|
155
|
+
// be worked -- cancel it so its journal doesn't stay indeterminate.
|
|
156
|
+
// Best-effort: the parent flow already surfaced the deadline via the
|
|
157
|
+
// rejected `completed` promise, so a cancel error here must not mask it.
|
|
158
|
+
if (dispatchExpired && childRunId !== undefined) {
|
|
159
|
+
try {
|
|
160
|
+
await journal.runCancel(childRunId);
|
|
161
|
+
}
|
|
162
|
+
catch { /* fail-open on cleanup */ }
|
|
163
|
+
}
|
|
164
|
+
peer.close();
|
|
165
|
+
await work?.catch(() => undefined);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function pathPart(value) {
|
|
169
|
+
return encodeURIComponent(value).replaceAll('.', '%2E');
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=authored-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-mcp.js","sourceRoot":"","sources":["../src/authored-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { MemoryHelper } from '@relayflows/surface';
|
|
2
|
+
/** Stable across runs; disjoint from other flow files and other named flows. */
|
|
3
|
+
export declare function scriptMemoryScope(flowPath: string, name: string): string;
|
|
4
|
+
export declare function probeScriptMemory(): Promise<void>;
|
|
5
|
+
export declare function assertMemoryReachable(): Promise<void>;
|
|
6
|
+
export declare function authoredMemory(scope: string, assertOpen: () => void, enabled: boolean): MemoryHelper;
|
|
7
|
+
//# sourceMappingURL=authored-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-memory.d.ts","sourceRoot":"","sources":["../src/authored-memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQxD,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIxE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOvD;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAG3D;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,IAAI,EACtB,OAAO,EAAE,OAAO,GACf,YAAY,CAqBd"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { access, stat } from 'node:fs/promises';
|
|
3
|
+
import { constants } from 'node:fs';
|
|
4
|
+
import { dirname, join, resolve } from 'node:path';
|
|
5
|
+
import { AuthoredFlowExecutionError } from './authored-flow-error.js';
|
|
6
|
+
import { preflightMemory } from './preflight.js';
|
|
7
|
+
/** Stable across runs; disjoint from other flow files and other named flows. */
|
|
8
|
+
export function scriptMemoryScope(flowPath, name) {
|
|
9
|
+
const absolute = resolve(flowPath);
|
|
10
|
+
const key = createHash('sha256').update(JSON.stringify([absolute, name])).digest('hex');
|
|
11
|
+
return join(dirname(absolute), '.relayflows', 'memory', 'scripts', key);
|
|
12
|
+
}
|
|
13
|
+
export async function probeScriptMemory() {
|
|
14
|
+
const { defaultDbPath, openAiHist } = await import('ai-hist');
|
|
15
|
+
const path = defaultDbPath();
|
|
16
|
+
await access(path, constants.R_OK);
|
|
17
|
+
if (!(await stat(path)).isFile())
|
|
18
|
+
throw new Error('memory database must be a file');
|
|
19
|
+
const reader = await openAiHist({ dbPath: path, fallback: 'error' });
|
|
20
|
+
try {
|
|
21
|
+
reader.search('', { limit: 1 });
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
reader.close();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function assertMemoryReachable() {
|
|
28
|
+
const refusal = await preflightMemory(probeScriptMemory);
|
|
29
|
+
if (refusal)
|
|
30
|
+
throw new AuthoredFlowExecutionError('memory_unreachable', refusal.message);
|
|
31
|
+
}
|
|
32
|
+
export function authoredMemory(scope, assertOpen, enabled) {
|
|
33
|
+
async function read(action) {
|
|
34
|
+
assertOpen();
|
|
35
|
+
if (!enabled)
|
|
36
|
+
throw new AuthoredFlowExecutionError('unsupported_header', 'f.memory requires script memory; memory.script is false');
|
|
37
|
+
await assertMemoryReachable();
|
|
38
|
+
assertOpen();
|
|
39
|
+
const { openAiHist } = await import('ai-hist');
|
|
40
|
+
const reader = await openAiHist({ projectScope: scope, fallback: 'error' });
|
|
41
|
+
try {
|
|
42
|
+
return action(reader);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
reader.close();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
recall: (query, options) => read(reader => reader.search(query, { ...options, project: scope })),
|
|
50
|
+
why: task => read(reader => {
|
|
51
|
+
const entry = reader.whyForTask(task);
|
|
52
|
+
return entry?.projectId === scope ? [entry] : [];
|
|
53
|
+
}),
|
|
54
|
+
async learn() {
|
|
55
|
+
assertOpen();
|
|
56
|
+
throw new AuthoredFlowExecutionError('unsupported_verb', 'f.memory.learn requires the follow-up journal-backed trajectory writer');
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=authored-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-memory.js","sourceRoot":"","sources":["../src/authored-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type LoadedPlugin } from './plugin-loader.js';
|
|
2
|
+
import type { PluginVerb } from './plugin-manifest.js';
|
|
3
|
+
import type { AuthoredBudget } from './authored-budget.js';
|
|
4
|
+
import type { JournalClient } from './journal-client.js';
|
|
5
|
+
import { AuthoredFlowExecutionError } from './authored-flow-error.js';
|
|
6
|
+
import type { AuthoredFlowJournalStep } from './authored-flow-executor.js';
|
|
7
|
+
export declare class PluginStepError extends AuthoredFlowExecutionError {
|
|
8
|
+
readonly diagnostic: string;
|
|
9
|
+
constructor(diagnostic: string, runId: string);
|
|
10
|
+
}
|
|
11
|
+
/** Helpers lower to an existing agent effect, never a fourth kernel primitive.
|
|
12
|
+
* The Plugin receipt lives in step.completed.output: { type, input, output, ... }.
|
|
13
|
+
* A private stream routes the step to this short-lived SDK worker exclusively.
|
|
14
|
+
*/
|
|
15
|
+
export declare function runPluginEffect(journal: JournalClient, flowName: string, id: string, plugin: LoadedPlugin, verb: PluginVerb, args: unknown, journalSteps: AuthoredFlowJournalStep[], budget: AuthoredBudget): Promise<unknown>;
|
|
16
|
+
//# sourceMappingURL=authored-plugin-effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-plugin-effect.d.ts","sourceRoot":"","sources":["../src/authored-plugin-effect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAI3E,qBAAa,eAAgB,SAAQ,0BAA0B;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAGvD;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAC5F,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,EAAE,MAAM,EAAE,cAAc,GAC7E,OAAO,CAAC,OAAO,CAAC,CAuHlB"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { compileSpec, toKernelSpec } from './compile.js';
|
|
3
|
+
import { invokePlugin } from './plugin-loader.js';
|
|
4
|
+
import { SPEC_SCHEMA_VERSION } from './spec.js';
|
|
5
|
+
import { AuthoredFlowExecutionError } from './authored-flow-error.js';
|
|
6
|
+
import { readCompletedStepOutput } from './authored-step-output.js';
|
|
7
|
+
import { withWorkerLease } from './worker-lease.js';
|
|
8
|
+
export class PluginStepError extends AuthoredFlowExecutionError {
|
|
9
|
+
diagnostic;
|
|
10
|
+
constructor(diagnostic, runId) {
|
|
11
|
+
super('step_failed', diagnostic, 'worker_error', runId);
|
|
12
|
+
this.diagnostic = diagnostic;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Helpers lower to an existing agent effect, never a fourth kernel primitive.
|
|
16
|
+
* The Plugin receipt lives in step.completed.output: { type, input, output, ... }.
|
|
17
|
+
* A private stream routes the step to this short-lived SDK worker exclusively.
|
|
18
|
+
*/
|
|
19
|
+
export async function runPluginEffect(journal, flowName, id, plugin, verb, args, journalSteps, budget) {
|
|
20
|
+
const server = verb.namespace;
|
|
21
|
+
const tool = verb.method;
|
|
22
|
+
const idempotencyKey = `plugin:${server}:${tool}:${createHash('sha256').update(JSON.stringify(args)).digest('hex')}`;
|
|
23
|
+
const surfacePath = `/plugins/${pathPart(server)}/${pathPart(tool)}`;
|
|
24
|
+
const stream = `plugin-worker-${randomUUID()}`;
|
|
25
|
+
const instruction = JSON.stringify({ type: 'effect', server, tool, input: args });
|
|
26
|
+
const peer = journal.createPeer();
|
|
27
|
+
let diagnostic;
|
|
28
|
+
let settled;
|
|
29
|
+
let failed;
|
|
30
|
+
const completed = new Promise((resolve, reject) => { settled = resolve; failed = reject; });
|
|
31
|
+
void completed.catch(() => undefined);
|
|
32
|
+
let timer;
|
|
33
|
+
let work;
|
|
34
|
+
let dispatchExpired = false;
|
|
35
|
+
const dispatch = (event) => {
|
|
36
|
+
if (dispatchExpired)
|
|
37
|
+
return;
|
|
38
|
+
const dispatched = event.spec;
|
|
39
|
+
if (event.step_id !== id || event.step_type !== 'agent' || work !== undefined
|
|
40
|
+
|| dispatched?.instruction !== instruction
|
|
41
|
+
|| !dispatched.surfaces?.streams?.some(pin => pin.stream === stream)) {
|
|
42
|
+
failed(new Error('Plugin worker received an unexpected dispatch'));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
clearTimeout(timer);
|
|
46
|
+
timer = undefined;
|
|
47
|
+
work = execute(event);
|
|
48
|
+
void work.then(settled, failed);
|
|
49
|
+
};
|
|
50
|
+
async function execute(event) {
|
|
51
|
+
const receipt = { type: 'effect', plugin: plugin.manifest.name, version: plugin.manifest.version,
|
|
52
|
+
namespace: server, method: tool, input: args, idempotencyKey: event.idempotency_key };
|
|
53
|
+
let output;
|
|
54
|
+
let confirmed = false;
|
|
55
|
+
try {
|
|
56
|
+
// Renew the worker lease while the Plugin tool is in flight. Without this,
|
|
57
|
+
// a tool that runs longer than the initial lease loses ownership and
|
|
58
|
+
// the write-back path fails — see worker-lease.ts for the renewal contract.
|
|
59
|
+
confirmed = await withWorkerLease(peer, event, async () => {
|
|
60
|
+
return peer.performEffect({
|
|
61
|
+
runId: event.run_id, stepId: id, attempt: event.attempt, idempotencyKey: event.idempotency_key,
|
|
62
|
+
surfacePath, revisionBefore: 'pending', revisionAfter: idempotencyKey,
|
|
63
|
+
}, async () => {
|
|
64
|
+
try {
|
|
65
|
+
output = await invokePlugin(plugin, verb, args, event.idempotency_key);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
diagnostic = 'plugin_execution_failed';
|
|
69
|
+
throw new PluginExecutionFailure();
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
// A confirmed election without its receipt is an interrupted writeback,
|
|
74
|
+
// not a successful result we may invent or a call we may safely repeat.
|
|
75
|
+
if (!confirmed)
|
|
76
|
+
throw new Error('plugin_result_unavailable');
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error instanceof PluginExecutionFailure)
|
|
80
|
+
diagnostic = 'plugin_execution_failed';
|
|
81
|
+
else if (error instanceof Error && error.message === 'plugin_result_unavailable')
|
|
82
|
+
diagnostic = error.message;
|
|
83
|
+
else
|
|
84
|
+
throw error; // Journal failures remain fail-closed, never provider errors.
|
|
85
|
+
}
|
|
86
|
+
await peer.stepComplete(event.run_id, id, event.attempt, event.idempotency_key, diagnostic === undefined ? 'success' : 'worker_error', {
|
|
87
|
+
output: { ...receipt, output: output ?? null, ...(diagnostic ? { diagnostic } : {}) },
|
|
88
|
+
started_pins: event.pins, end_pins: event.pins,
|
|
89
|
+
...(diagnostic ? { trajectory_tail: { ...receipt, diagnostic } } : {}),
|
|
90
|
+
effects: confirmed ? [{ surface_path: surfacePath, idempotency_key: event.idempotency_key }] : [],
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
let childRunId;
|
|
94
|
+
async function cancelChildRun() {
|
|
95
|
+
const runId = childRunId;
|
|
96
|
+
childRunId = undefined;
|
|
97
|
+
if (runId !== undefined) {
|
|
98
|
+
try {
|
|
99
|
+
await journal.runCancel(runId);
|
|
100
|
+
}
|
|
101
|
+
catch { /* fail-open on cleanup */ }
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const deadlineError = new Error('Plugin worker dispatch deadline exceeded');
|
|
105
|
+
let finishDeadline;
|
|
106
|
+
const deadline = new Promise((resolve, reject) => {
|
|
107
|
+
finishDeadline = resolve;
|
|
108
|
+
// One deadline covers connection, initialization, run creation and dispatch.
|
|
109
|
+
timer = setTimeout(() => {
|
|
110
|
+
dispatchExpired = true;
|
|
111
|
+
failed(deadlineError);
|
|
112
|
+
reject(deadlineError);
|
|
113
|
+
}, 30_000);
|
|
114
|
+
});
|
|
115
|
+
try {
|
|
116
|
+
await Promise.race([peer.connect(), deadline]);
|
|
117
|
+
await Promise.race([peer.hello('flows-plugin'), deadline]);
|
|
118
|
+
peer.on('step.dispatch', dispatch);
|
|
119
|
+
await Promise.race([peer.workerAttach(stream, ['agent'], { workspace: [], streams: [{ stream, read_offset: 0 }] }, 1), deadline]);
|
|
120
|
+
const spec = toKernelSpec(compileSpec({ version: SPEC_SCHEMA_VERSION, name: `${flowName}/${id}`,
|
|
121
|
+
steps: [{ id, type: 'agent', instruction,
|
|
122
|
+
surfaces: { streams: [{ stream }], external: [surfacePath] }, maxIterations: 1 }],
|
|
123
|
+
}));
|
|
124
|
+
return await Promise.race([budget.execute(journal, spec, async (outcome) => {
|
|
125
|
+
childRunId = outcome.run_id;
|
|
126
|
+
// run.start may answer after the deadline and the outer cleanup.
|
|
127
|
+
if (dispatchExpired)
|
|
128
|
+
await cancelChildRun();
|
|
129
|
+
await completed;
|
|
130
|
+
if (diagnostic !== undefined) {
|
|
131
|
+
try {
|
|
132
|
+
await readCompletedStepOutput(journal, outcome.run_id, id, journalSteps);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
if (!(error instanceof AuthoredFlowExecutionError) || error.code !== 'step_failed')
|
|
136
|
+
throw error;
|
|
137
|
+
throw new PluginStepError(diagnostic, outcome.run_id);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const receipt = await readCompletedStepOutput(journal, outcome.run_id, id, journalSteps);
|
|
141
|
+
return receipt.output;
|
|
142
|
+
}), deadline]);
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
clearTimeout(timer);
|
|
146
|
+
finishDeadline();
|
|
147
|
+
peer.off('step.dispatch', dispatch);
|
|
148
|
+
// If the dispatch deadline fired we started a child run that will never
|
|
149
|
+
// be worked -- cancel it so its journal doesn't stay indeterminate.
|
|
150
|
+
// Best-effort: the parent flow already surfaced the deadline via the
|
|
151
|
+
// rejected `completed` promise, so a cancel error here must not mask it.
|
|
152
|
+
if (dispatchExpired)
|
|
153
|
+
await cancelChildRun();
|
|
154
|
+
peer.close();
|
|
155
|
+
await work?.catch(() => undefined);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function pathPart(value) {
|
|
159
|
+
return encodeURIComponent(value).replaceAll('.', '%2E');
|
|
160
|
+
}
|
|
161
|
+
class PluginExecutionFailure extends Error {
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=authored-plugin-effect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-plugin-effect.js","sourceRoot":"","sources":["../src/authored-plugin-effect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { JournalClient } from './journal-client.js';
|
|
2
|
+
import type { CompletionReason as ProtocolCompletionReason, RunCompletionReason as ProtocolRunCompletionReason, RunOutcome } from './protocol.js';
|
|
3
|
+
import type { AuthoredFlowJournalStep } from './authored-flow-executor.js';
|
|
4
|
+
/**
|
|
5
|
+
* Shared by every `f.*` verb that lowers to one kernel step run in isolation:
|
|
6
|
+
* find its `step.completed` entry, record it, and refuse anything but a
|
|
7
|
+
* clean success before handing the raw `output` back for verb-specific
|
|
8
|
+
* extraction (a plain string for `f.run`, an `AgentResult` for `f.agent`).
|
|
9
|
+
*
|
|
10
|
+
* Callers are responsible for having already established that the RUN
|
|
11
|
+
* reached a terminal, successful state before calling this — `f.run`'s
|
|
12
|
+
* caller relies on `runStart`'s own immediate response (the kernel drives a
|
|
13
|
+
* deterministic step to completion inline, no race); `f.agent`'s caller
|
|
14
|
+
* relies on `classifyOutcome` (cli/run.ts) having already polled to a true
|
|
15
|
+
* terminal state. Given that, a single read from the start of this run's
|
|
16
|
+
* (small, single-step) journal is enough — no polling here, and no run
|
|
17
|
+
* outcome ever needs re-checking.
|
|
18
|
+
*/
|
|
19
|
+
export declare function readCompletedStepOutput(journal: JournalClient, runId: string, stepId: string, journalSteps: AuthoredFlowJournalStep[]): Promise<unknown>;
|
|
20
|
+
export declare function readSuccessfulOutput(journal: JournalClient, outcome: RunOutcome, stepId: string, journalSteps: AuthoredFlowJournalStep[]): Promise<string>;
|
|
21
|
+
export declare function isSurfaceCompletionReason(value: unknown): value is ProtocolCompletionReason;
|
|
22
|
+
export declare function isSurfaceRunCompletionReason(value: unknown): value is ProtocolRunCompletionReason;
|
|
23
|
+
//# sourceMappingURL=authored-step-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-step-output.d.ts","sourceRoot":"","sources":["../src/authored-step-output.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,IAAI,wBAAwB,EAAE,mBAAmB,IAAI,2BAA2B,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClJ,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,uBAAuB,EAAE,GACtC,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,uBAAuB,EAAE,GACtC,OAAO,CAAC,MAAM,CAAC,CAajB;AAqBD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,wBAAwB,CAG3F;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,2BAA2B,CAGjG"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { COMPLETION_REASONS, RUN_COMPLETION_REASONS } from '@relayflows/surface';
|
|
2
|
+
import { AuthoredFlowExecutionError } from './authored-flow-error.js';
|
|
3
|
+
/**
|
|
4
|
+
* Shared by every `f.*` verb that lowers to one kernel step run in isolation:
|
|
5
|
+
* find its `step.completed` entry, record it, and refuse anything but a
|
|
6
|
+
* clean success before handing the raw `output` back for verb-specific
|
|
7
|
+
* extraction (a plain string for `f.run`, an `AgentResult` for `f.agent`).
|
|
8
|
+
*
|
|
9
|
+
* Callers are responsible for having already established that the RUN
|
|
10
|
+
* reached a terminal, successful state before calling this — `f.run`'s
|
|
11
|
+
* caller relies on `runStart`'s own immediate response (the kernel drives a
|
|
12
|
+
* deterministic step to completion inline, no race); `f.agent`'s caller
|
|
13
|
+
* relies on `classifyOutcome` (cli/run.ts) having already polled to a true
|
|
14
|
+
* terminal state. Given that, a single read from the start of this run's
|
|
15
|
+
* (small, single-step) journal is enough — no polling here, and no run
|
|
16
|
+
* outcome ever needs re-checking.
|
|
17
|
+
*/
|
|
18
|
+
export async function readCompletedStepOutput(journal, runId, stepId, journalSteps) {
|
|
19
|
+
const entries = (await journal.journalRead(runId, 1)).entries;
|
|
20
|
+
const completed = entries.find((entry) => isStepCompleted(entry, stepId));
|
|
21
|
+
if (!isStepCompleted(completed, stepId)) {
|
|
22
|
+
throw protocolViolation(runId, `journal has no step.completed for "${stepId}"`);
|
|
23
|
+
}
|
|
24
|
+
const reason = completed.payload.completionReason;
|
|
25
|
+
journalSteps.push(Object.freeze({ id: stepId, runId, completionReason: reason }));
|
|
26
|
+
if (reason !== 'success') {
|
|
27
|
+
throw new AuthoredFlowExecutionError('step_failed', `journal step "${stepId}" completed with ${reason}`, reason, runId);
|
|
28
|
+
}
|
|
29
|
+
return completed.payload.output;
|
|
30
|
+
}
|
|
31
|
+
export async function readSuccessfulOutput(journal, outcome, stepId, journalSteps) {
|
|
32
|
+
const output = await readCompletedStepOutput(journal, outcome.run_id, stepId, journalSteps).catch(error => {
|
|
33
|
+
if (error instanceof AuthoredFlowExecutionError
|
|
34
|
+
&& (error.completionReason === 'timeout' || error.completionReason === 'lease_expired')) {
|
|
35
|
+
throw new AuthoredFlowExecutionError('lease_exceeded', `f.run step "${stepId}" exceeded its command timeout.`, error.completionReason, error.runId);
|
|
36
|
+
}
|
|
37
|
+
throw error;
|
|
38
|
+
});
|
|
39
|
+
if (!isRecord(output) || typeof output['stdout_tail'] !== 'string') {
|
|
40
|
+
throw protocolViolation(outcome.run_id, `step "${stepId}" has no string stdout_tail`);
|
|
41
|
+
}
|
|
42
|
+
return output['stdout_tail'];
|
|
43
|
+
}
|
|
44
|
+
function isStepCompleted(value, stepId) {
|
|
45
|
+
if (!isRecord(value) || value['entry_type'] !== 'step.completed' || value['step_id'] !== stepId) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
const payload = value['payload'];
|
|
49
|
+
return isRecord(payload)
|
|
50
|
+
&& isSurfaceCompletionReason(payload['completionReason'])
|
|
51
|
+
&& 'output' in payload;
|
|
52
|
+
}
|
|
53
|
+
export function isSurfaceCompletionReason(value) {
|
|
54
|
+
return typeof value === 'string'
|
|
55
|
+
&& COMPLETION_REASONS.includes(value);
|
|
56
|
+
}
|
|
57
|
+
export function isSurfaceRunCompletionReason(value) {
|
|
58
|
+
return typeof value === 'string'
|
|
59
|
+
&& RUN_COMPLETION_REASONS.includes(value);
|
|
60
|
+
}
|
|
61
|
+
function isRecord(value) {
|
|
62
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
63
|
+
}
|
|
64
|
+
function protocolViolation(runId, detail) {
|
|
65
|
+
return new AuthoredFlowExecutionError('journal_protocol_violation', detail, undefined, runId);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=authored-step-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-step-output.js","sourceRoot":"","sources":["../src/authored-step-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AuthoredBudget } from './authored-budget.js';
|
|
2
|
+
import type { AgentOptions, AgentResult, LlmOptions, NamedGate } from '@relayflows/surface';
|
|
3
|
+
import { type RunLifecycleOptions } from './cli/run.js';
|
|
4
|
+
import type { JournalClient } from './journal-client.js';
|
|
5
|
+
import type { AuthoredFlowJournalStep } from './authored-flow-executor.js';
|
|
6
|
+
/** Agent and LLM calls share the exact declarative preflight and lease wait. */
|
|
7
|
+
export declare function authoredWorkerRunner(definition: {
|
|
8
|
+
name: string;
|
|
9
|
+
}, journal: JournalClient, flowPath: string, journalSteps: AuthoredFlowJournalStep[], waitOptions: RunLifecycleOptions, localAgentStream?: string, budget?: AuthoredBudget, headerBudget?: unknown): {
|
|
10
|
+
agent(id: string, options: AgentOptions, verification?: NamedGate): Promise<AgentResult>;
|
|
11
|
+
llm(id: string, prompt: string, options?: LlmOptions, verification?: NamedGate): Promise<unknown>;
|
|
12
|
+
};
|
|
13
|
+
/** Deterministic commands execute inline under their per-invocation lease. */
|
|
14
|
+
export declare function authoredDeterministicRunner(name: string, journal: JournalClient, journalSteps: AuthoredFlowJournalStep[], budget: AuthoredBudget): (id: string, command: string, terminal?: boolean, leaseMs?: number, verification?: NamedGate) => Promise<string>;
|
|
15
|
+
//# sourceMappingURL=authored-worker-step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-worker-step.d.ts","sourceRoot":"","sources":["../src/authored-worker-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG5F,OAAO,EAAmB,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAK3E,gFAAgF;AAChF,wBAAgB,oBAAoB,CAClC,UAAU,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EACtE,YAAY,EAAE,uBAAuB,EAAE,EAAE,WAAW,EAAE,mBAAmB,EACzE,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,OAAO;cAiExD,MAAM,WAAW,YAAY,iBAAiB,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;YAyDhF,MAAM,UAAU,MAAM,YAAY,UAAU,iBAAiB,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;EAmB1G;AAED,8EAA8E;AAC9E,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,uBAAuB,EAAE,EAAE,MAAM,EAAE,cAAc,IAEvF,IAAI,MAAM,EAAE,SAAS,MAAM,EAAE,kBAAgB,EAAE,UAAU,MAAM,EAAE,eAAe,SAAS,KAAG,OAAO,CAAC,MAAM,CAAC,CAa1H"}
|