@agent-relay/sdk 7.1.1 → 8.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +177 -143
- package/bin/agent-relay-broker-darwin-arm64 +0 -0
- package/bin/agent-relay-broker-darwin-x64 +0 -0
- package/bin/agent-relay-broker-linux-arm64 +0 -0
- package/bin/agent-relay-broker-linux-x64 +0 -0
- package/bin/agent-relay-broker-win32-x64.exe +0 -0
- package/dist/actions/errors.d.ts +18 -0
- package/dist/actions/errors.d.ts.map +1 -0
- package/dist/actions/errors.js +39 -0
- package/dist/actions/errors.js.map +1 -0
- package/dist/actions/index.d.ts +5 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +5 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/json-schema-lite.d.ts +13 -0
- package/dist/actions/json-schema-lite.d.ts.map +1 -0
- package/dist/actions/json-schema-lite.js +322 -0
- package/dist/actions/json-schema-lite.js.map +1 -0
- package/dist/actions/registry.d.ts +20 -0
- package/dist/actions/registry.d.ts.map +1 -0
- package/dist/actions/registry.js +267 -0
- package/dist/actions/registry.js.map +1 -0
- package/dist/actions/types.d.ts +177 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/{provisioner → actions}/types.js.map +1 -1
- package/dist/agent-relay.d.ts +86 -0
- package/dist/agent-relay.d.ts.map +1 -0
- package/dist/agent-relay.js +197 -0
- package/dist/agent-relay.js.map +1 -0
- package/dist/capabilities.d.ts +6 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +9 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/delivery/index.d.ts +4 -0
- package/dist/delivery/index.d.ts.map +1 -0
- package/dist/delivery/index.js +4 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/delivery/runner.d.ts +26 -0
- package/dist/delivery/runner.d.ts.map +1 -0
- package/dist/delivery/runner.js +177 -0
- package/dist/delivery/runner.js.map +1 -0
- package/dist/delivery/types.d.ts +45 -0
- package/dist/delivery/types.d.ts.map +1 -0
- package/dist/delivery/types.js +2 -0
- package/dist/delivery/types.js.map +1 -0
- package/dist/facade.d.ts +151 -0
- package/dist/facade.d.ts.map +1 -0
- package/dist/facade.js +280 -0
- package/dist/facade.js.map +1 -0
- package/dist/index.d.ts +9 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -23
- package/dist/index.js.map +1 -1
- package/dist/listeners.d.ts +162 -0
- package/dist/listeners.d.ts.map +1 -0
- package/dist/listeners.js +297 -0
- package/dist/listeners.js.map +1 -0
- package/dist/messaging/index.d.ts +4 -0
- package/dist/messaging/index.d.ts.map +1 -0
- package/dist/messaging/index.js +4 -0
- package/dist/messaging/index.js.map +1 -0
- package/dist/messaging/normalize.d.ts +29 -0
- package/dist/messaging/normalize.d.ts.map +1 -0
- package/dist/messaging/normalize.js +602 -0
- package/dist/messaging/normalize.js.map +1 -0
- package/dist/messaging/relaycast.d.ts +270 -0
- package/dist/messaging/relaycast.d.ts.map +1 -0
- package/dist/messaging/relaycast.js +559 -0
- package/dist/messaging/relaycast.js.map +1 -0
- package/dist/messaging/types.d.ts +672 -0
- package/dist/messaging/types.d.ts.map +1 -0
- package/dist/messaging/types.js +2 -0
- package/dist/messaging/types.js.map +1 -0
- package/dist/relaycast-errors.d.ts +39 -0
- package/dist/relaycast-errors.d.ts.map +1 -0
- package/dist/relaycast-errors.js +111 -0
- package/dist/relaycast-errors.js.map +1 -0
- package/dist/session/index.d.ts +58 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +54 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/types.d.ts +258 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +7 -0
- package/dist/session/types.js.map +1 -0
- package/package.json +31 -199
- package/dist/broker-logs.d.ts +0 -80
- package/dist/broker-logs.d.ts.map +0 -1
- package/dist/broker-logs.js +0 -189
- package/dist/broker-logs.js.map +0 -1
- package/dist/broker-path.d.ts +0 -34
- package/dist/broker-path.d.ts.map +0 -1
- package/dist/broker-path.js +0 -267
- package/dist/broker-path.js.map +0 -1
- package/dist/browser.d.ts +0 -16
- package/dist/browser.d.ts.map +0 -1
- package/dist/browser.js +0 -19
- package/dist/browser.js.map +0 -1
- package/dist/cli-registry.d.ts +0 -44
- package/dist/cli-registry.d.ts.map +0 -1
- package/dist/cli-registry.js +0 -104
- package/dist/cli-registry.js.map +0 -1
- package/dist/cli-resolver.d.ts +0 -30
- package/dist/cli-resolver.d.ts.map +0 -1
- package/dist/cli-resolver.js +0 -132
- package/dist/cli-resolver.js.map +0 -1
- package/dist/client.d.ts +0 -278
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -838
- package/dist/client.js.map +0 -1
- package/dist/communicate/a2a-bridge.d.ts +0 -25
- package/dist/communicate/a2a-bridge.d.ts.map +0 -1
- package/dist/communicate/a2a-bridge.js +0 -89
- package/dist/communicate/a2a-bridge.js.map +0 -1
- package/dist/communicate/a2a-server.d.ts +0 -31
- package/dist/communicate/a2a-server.d.ts.map +0 -1
- package/dist/communicate/a2a-server.js +0 -220
- package/dist/communicate/a2a-server.js.map +0 -1
- package/dist/communicate/a2a-transport.d.ts +0 -48
- package/dist/communicate/a2a-transport.d.ts.map +0 -1
- package/dist/communicate/a2a-transport.js +0 -305
- package/dist/communicate/a2a-transport.js.map +0 -1
- package/dist/communicate/a2a-types.d.ts +0 -107
- package/dist/communicate/a2a-types.d.ts.map +0 -1
- package/dist/communicate/a2a-types.js +0 -209
- package/dist/communicate/a2a-types.js.map +0 -1
- package/dist/communicate/adapters/ai-sdk.d.ts +0 -63
- package/dist/communicate/adapters/ai-sdk.d.ts.map +0 -1
- package/dist/communicate/adapters/ai-sdk.js +0 -114
- package/dist/communicate/adapters/ai-sdk.js.map +0 -1
- package/dist/communicate/adapters/claude-sdk.d.ts +0 -28
- package/dist/communicate/adapters/claude-sdk.d.ts.map +0 -1
- package/dist/communicate/adapters/claude-sdk.js +0 -47
- package/dist/communicate/adapters/claude-sdk.js.map +0 -1
- package/dist/communicate/adapters/crewai.d.ts +0 -42
- package/dist/communicate/adapters/crewai.d.ts.map +0 -1
- package/dist/communicate/adapters/crewai.js +0 -95
- package/dist/communicate/adapters/crewai.js.map +0 -1
- package/dist/communicate/adapters/google-adk.d.ts +0 -53
- package/dist/communicate/adapters/google-adk.d.ts.map +0 -1
- package/dist/communicate/adapters/google-adk.js +0 -77
- package/dist/communicate/adapters/google-adk.js.map +0 -1
- package/dist/communicate/adapters/index.d.ts +0 -3
- package/dist/communicate/adapters/index.d.ts.map +0 -1
- package/dist/communicate/adapters/index.js +0 -3
- package/dist/communicate/adapters/index.js.map +0 -1
- package/dist/communicate/adapters/langgraph.d.ts +0 -40
- package/dist/communicate/adapters/langgraph.d.ts.map +0 -1
- package/dist/communicate/adapters/langgraph.js +0 -77
- package/dist/communicate/adapters/langgraph.js.map +0 -1
- package/dist/communicate/adapters/openai-agents.d.ts +0 -25
- package/dist/communicate/adapters/openai-agents.d.ts.map +0 -1
- package/dist/communicate/adapters/openai-agents.js +0 -70
- package/dist/communicate/adapters/openai-agents.js.map +0 -1
- package/dist/communicate/adapters/pi.d.ts +0 -44
- package/dist/communicate/adapters/pi.d.ts.map +0 -1
- package/dist/communicate/adapters/pi.js +0 -55
- package/dist/communicate/adapters/pi.js.map +0 -1
- package/dist/communicate/core.d.ts +0 -58
- package/dist/communicate/core.d.ts.map +0 -1
- package/dist/communicate/core.js +0 -127
- package/dist/communicate/core.js.map +0 -1
- package/dist/communicate/index.d.ts +0 -20
- package/dist/communicate/index.d.ts.map +0 -1
- package/dist/communicate/index.js +0 -43
- package/dist/communicate/index.js.map +0 -1
- package/dist/communicate/transport.d.ts +0 -35
- package/dist/communicate/transport.d.ts.map +0 -1
- package/dist/communicate/transport.js +0 -279
- package/dist/communicate/transport.js.map +0 -1
- package/dist/communicate/types.d.ts +0 -58
- package/dist/communicate/types.d.ts.map +0 -1
- package/dist/communicate/types.js +0 -66
- package/dist/communicate/types.js.map +0 -1
- package/dist/consensus-helpers.d.ts +0 -103
- package/dist/consensus-helpers.d.ts.map +0 -1
- package/dist/consensus-helpers.js +0 -147
- package/dist/consensus-helpers.js.map +0 -1
- package/dist/consensus.d.ts +0 -72
- package/dist/consensus.d.ts.map +0 -1
- package/dist/consensus.js +0 -378
- package/dist/consensus.js.map +0 -1
- package/dist/event-bus.d.ts +0 -57
- package/dist/event-bus.d.ts.map +0 -1
- package/dist/event-bus.js +0 -76
- package/dist/event-bus.js.map +0 -1
- package/dist/examples/demo.d.ts +0 -2
- package/dist/examples/demo.d.ts.map +0 -1
- package/dist/examples/demo.js +0 -63
- package/dist/examples/demo.js.map +0 -1
- package/dist/examples/example.d.ts +0 -2
- package/dist/examples/example.d.ts.map +0 -1
- package/dist/examples/example.js +0 -77
- package/dist/examples/example.js.map +0 -1
- package/dist/examples/persona-spawn.d.ts +0 -2
- package/dist/examples/persona-spawn.d.ts.map +0 -1
- package/dist/examples/persona-spawn.js +0 -43
- package/dist/examples/persona-spawn.js.map +0 -1
- package/dist/examples/quickstart.d.ts +0 -2
- package/dist/examples/quickstart.d.ts.map +0 -1
- package/dist/examples/quickstart.js +0 -56
- package/dist/examples/quickstart.js.map +0 -1
- package/dist/examples/ralph-loop.d.ts +0 -2
- package/dist/examples/ralph-loop.d.ts.map +0 -1
- package/dist/examples/ralph-loop.js +0 -281
- package/dist/examples/ralph-loop.js.map +0 -1
- package/dist/examples/workflow-superiority.d.ts +0 -32
- package/dist/examples/workflow-superiority.d.ts.map +0 -1
- package/dist/examples/workflow-superiority.js +0 -1421
- package/dist/examples/workflow-superiority.js.map +0 -1
- package/dist/github.d.ts +0 -24
- package/dist/github.d.ts.map +0 -1
- package/dist/github.js +0 -24
- package/dist/github.js.map +0 -1
- package/dist/http.d.ts +0 -38
- package/dist/http.d.ts.map +0 -1
- package/dist/http.js +0 -60
- package/dist/http.js.map +0 -1
- package/dist/lifecycle-hooks.d.ts +0 -141
- package/dist/lifecycle-hooks.d.ts.map +0 -1
- package/dist/lifecycle-hooks.js +0 -29
- package/dist/lifecycle-hooks.js.map +0 -1
- package/dist/logs.d.ts +0 -106
- package/dist/logs.d.ts.map +0 -1
- package/dist/logs.js +0 -291
- package/dist/logs.js.map +0 -1
- package/dist/models.d.ts +0 -9
- package/dist/models.d.ts.map +0 -1
- package/dist/models.js +0 -17
- package/dist/models.js.map +0 -1
- package/dist/personas.d.ts +0 -160
- package/dist/personas.d.ts.map +0 -1
- package/dist/personas.js +0 -401
- package/dist/personas.js.map +0 -1
- package/dist/protocol.d.ts +0 -521
- package/dist/protocol.d.ts.map +0 -1
- package/dist/protocol.js +0 -2
- package/dist/protocol.js.map +0 -1
- package/dist/provisioner/__tests__/audit.test.d.ts +0 -2
- package/dist/provisioner/__tests__/audit.test.d.ts.map +0 -1
- package/dist/provisioner/__tests__/audit.test.js +0 -45
- package/dist/provisioner/__tests__/audit.test.js.map +0 -1
- package/dist/provisioner/__tests__/compiler.test.d.ts +0 -2
- package/dist/provisioner/__tests__/compiler.test.d.ts.map +0 -1
- package/dist/provisioner/__tests__/compiler.test.js +0 -345
- package/dist/provisioner/__tests__/compiler.test.js.map +0 -1
- package/dist/provisioner/__tests__/presets.test.d.ts +0 -2
- package/dist/provisioner/__tests__/presets.test.d.ts.map +0 -1
- package/dist/provisioner/__tests__/presets.test.js +0 -23
- package/dist/provisioner/__tests__/presets.test.js.map +0 -1
- package/dist/provisioner/__tests__/seeder.test.d.ts +0 -2
- package/dist/provisioner/__tests__/seeder.test.d.ts.map +0 -1
- package/dist/provisioner/__tests__/seeder.test.js +0 -224
- package/dist/provisioner/__tests__/seeder.test.js.map +0 -1
- package/dist/provisioner/__tests__/tar-seeder.test.d.ts +0 -2
- package/dist/provisioner/__tests__/tar-seeder.test.d.ts.map +0 -1
- package/dist/provisioner/__tests__/tar-seeder.test.js +0 -191
- package/dist/provisioner/__tests__/tar-seeder.test.js.map +0 -1
- package/dist/provisioner/__tests__/token-factory.test.d.ts +0 -2
- package/dist/provisioner/__tests__/token-factory.test.d.ts.map +0 -1
- package/dist/provisioner/__tests__/token-factory.test.js +0 -139
- package/dist/provisioner/__tests__/token-factory.test.js.map +0 -1
- package/dist/provisioner/__tests__/token.test.d.ts +0 -2
- package/dist/provisioner/__tests__/token.test.d.ts.map +0 -1
- package/dist/provisioner/__tests__/token.test.js +0 -49
- package/dist/provisioner/__tests__/token.test.js.map +0 -1
- package/dist/provisioner/audit.d.ts +0 -19
- package/dist/provisioner/audit.d.ts.map +0 -1
- package/dist/provisioner/audit.js +0 -74
- package/dist/provisioner/audit.js.map +0 -1
- package/dist/provisioner/compiler.d.ts +0 -23
- package/dist/provisioner/compiler.d.ts.map +0 -1
- package/dist/provisioner/compiler.js +0 -355
- package/dist/provisioner/compiler.js.map +0 -1
- package/dist/provisioner/index.d.ts +0 -10
- package/dist/provisioner/index.d.ts.map +0 -1
- package/dist/provisioner/index.js +0 -269
- package/dist/provisioner/index.js.map +0 -1
- package/dist/provisioner/local-jwks.d.ts +0 -25
- package/dist/provisioner/local-jwks.d.ts.map +0 -1
- package/dist/provisioner/local-jwks.js +0 -70
- package/dist/provisioner/local-jwks.js.map +0 -1
- package/dist/provisioner/mount.d.ts +0 -14
- package/dist/provisioner/mount.d.ts.map +0 -1
- package/dist/provisioner/mount.js +0 -329
- package/dist/provisioner/mount.js.map +0 -1
- package/dist/provisioner/seeder.d.ts +0 -17
- package/dist/provisioner/seeder.d.ts.map +0 -1
- package/dist/provisioner/seeder.js +0 -419
- package/dist/provisioner/seeder.js.map +0 -1
- package/dist/provisioner/token.d.ts +0 -41
- package/dist/provisioner/token.d.ts.map +0 -1
- package/dist/provisioner/token.js +0 -77
- package/dist/provisioner/token.js.map +0 -1
- package/dist/provisioner/types.d.ts +0 -134
- package/dist/provisioner/types.d.ts.map +0 -1
- package/dist/pty.d.ts +0 -8
- package/dist/pty.d.ts.map +0 -1
- package/dist/pty.js +0 -26
- package/dist/pty.js.map +0 -1
- package/dist/relay-adapter.d.ts +0 -124
- package/dist/relay-adapter.d.ts.map +0 -1
- package/dist/relay-adapter.js +0 -242
- package/dist/relay-adapter.js.map +0 -1
- package/dist/relay.d.ts +0 -550
- package/dist/relay.d.ts.map +0 -1
- package/dist/relay.js +0 -1682
- package/dist/relay.js.map +0 -1
- package/dist/shadow.d.ts +0 -101
- package/dist/shadow.d.ts.map +0 -1
- package/dist/shadow.js +0 -174
- package/dist/shadow.js.map +0 -1
- package/dist/slack.d.ts +0 -24
- package/dist/slack.d.ts.map +0 -1
- package/dist/slack.js +0 -24
- package/dist/slack.js.map +0 -1
- package/dist/spawn-from-env.d.ts +0 -78
- package/dist/spawn-from-env.d.ts.map +0 -1
- package/dist/spawn-from-env.js +0 -172
- package/dist/spawn-from-env.js.map +0 -1
- package/dist/transport.d.ts +0 -104
- package/dist/transport.d.ts.map +0 -1
- package/dist/transport.js +0 -520
- package/dist/transport.js.map +0 -1
- package/dist/types.d.ts +0 -101
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -5
- package/dist/types.js.map +0 -1
- package/dist/workers.d.ts +0 -39
- package/dist/workers.d.ts.map +0 -1
- package/dist/workers.js +0 -39
- package/dist/workers.js.map +0 -1
- package/dist/workflows/__tests__/budget-enforcement.test.d.ts +0 -2
- package/dist/workflows/__tests__/budget-enforcement.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/budget-enforcement.test.js +0 -411
- package/dist/workflows/__tests__/budget-enforcement.test.js.map +0 -1
- package/dist/workflows/__tests__/budget-tracker.test.d.ts +0 -2
- package/dist/workflows/__tests__/budget-tracker.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/budget-tracker.test.js +0 -99
- package/dist/workflows/__tests__/budget-tracker.test.js.map +0 -1
- package/dist/workflows/__tests__/builder-paths.test.d.ts +0 -2
- package/dist/workflows/__tests__/builder-paths.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/builder-paths.test.js +0 -63
- package/dist/workflows/__tests__/builder-paths.test.js.map +0 -1
- package/dist/workflows/__tests__/channel-messenger.test.d.ts +0 -2
- package/dist/workflows/__tests__/channel-messenger.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/channel-messenger.test.js +0 -123
- package/dist/workflows/__tests__/channel-messenger.test.js.map +0 -1
- package/dist/workflows/__tests__/cli-session-collector.test.d.ts +0 -2
- package/dist/workflows/__tests__/cli-session-collector.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/cli-session-collector.test.js +0 -54
- package/dist/workflows/__tests__/cli-session-collector.test.js.map +0 -1
- package/dist/workflows/__tests__/collectors/claude.test.d.ts +0 -2
- package/dist/workflows/__tests__/collectors/claude.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/collectors/claude.test.js +0 -85
- package/dist/workflows/__tests__/collectors/claude.test.js.map +0 -1
- package/dist/workflows/__tests__/collectors/codex.test.d.ts +0 -2
- package/dist/workflows/__tests__/collectors/codex.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/collectors/codex.test.js +0 -67
- package/dist/workflows/__tests__/collectors/codex.test.js.map +0 -1
- package/dist/workflows/__tests__/collectors/opencode.test.d.ts +0 -2
- package/dist/workflows/__tests__/collectors/opencode.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/collectors/opencode.test.js +0 -119
- package/dist/workflows/__tests__/collectors/opencode.test.js.map +0 -1
- package/dist/workflows/__tests__/e2big-and-verify.test.d.ts +0 -2
- package/dist/workflows/__tests__/e2big-and-verify.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/e2big-and-verify.test.js +0 -62
- package/dist/workflows/__tests__/e2big-and-verify.test.js.map +0 -1
- package/dist/workflows/__tests__/e2e-permissions.test.d.ts +0 -2
- package/dist/workflows/__tests__/e2e-permissions.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/e2e-permissions.test.js +0 -338
- package/dist/workflows/__tests__/e2e-permissions.test.js.map +0 -1
- package/dist/workflows/__tests__/permission-types.test.d.ts +0 -2
- package/dist/workflows/__tests__/permission-types.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/permission-types.test.js +0 -124
- package/dist/workflows/__tests__/permission-types.test.js.map +0 -1
- package/dist/workflows/__tests__/permissions-integration.test.d.ts +0 -2
- package/dist/workflows/__tests__/permissions-integration.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/permissions-integration.test.js +0 -577
- package/dist/workflows/__tests__/permissions-integration.test.js.map +0 -1
- package/dist/workflows/__tests__/process-backend-executor.test.d.ts +0 -2
- package/dist/workflows/__tests__/process-backend-executor.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/process-backend-executor.test.js +0 -83
- package/dist/workflows/__tests__/process-backend-executor.test.js.map +0 -1
- package/dist/workflows/__tests__/proxy-env.test.d.ts +0 -2
- package/dist/workflows/__tests__/proxy-env.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/proxy-env.test.js +0 -135
- package/dist/workflows/__tests__/proxy-env.test.js.map +0 -1
- package/dist/workflows/__tests__/run-script.test.d.ts +0 -2
- package/dist/workflows/__tests__/run-script.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/run-script.test.js +0 -426
- package/dist/workflows/__tests__/run-script.test.js.map +0 -1
- package/dist/workflows/__tests__/run-summary-table.test.d.ts +0 -2
- package/dist/workflows/__tests__/run-summary-table.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/run-summary-table.test.js +0 -131
- package/dist/workflows/__tests__/run-summary-table.test.js.map +0 -1
- package/dist/workflows/__tests__/scrub-pty-chrome.test.d.ts +0 -2
- package/dist/workflows/__tests__/scrub-pty-chrome.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/scrub-pty-chrome.test.js +0 -113
- package/dist/workflows/__tests__/scrub-pty-chrome.test.js.map +0 -1
- package/dist/workflows/__tests__/sibling-links.test.d.ts +0 -2
- package/dist/workflows/__tests__/sibling-links.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/sibling-links.test.js +0 -166
- package/dist/workflows/__tests__/sibling-links.test.js.map +0 -1
- package/dist/workflows/__tests__/step-cwd.test.d.ts +0 -2
- package/dist/workflows/__tests__/step-cwd.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/step-cwd.test.js +0 -42
- package/dist/workflows/__tests__/step-cwd.test.js.map +0 -1
- package/dist/workflows/__tests__/step-executor.test.d.ts +0 -2
- package/dist/workflows/__tests__/step-executor.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/step-executor.test.js +0 -378
- package/dist/workflows/__tests__/step-executor.test.js.map +0 -1
- package/dist/workflows/__tests__/template-resolver.test.d.ts +0 -2
- package/dist/workflows/__tests__/template-resolver.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/template-resolver.test.js +0 -145
- package/dist/workflows/__tests__/template-resolver.test.js.map +0 -1
- package/dist/workflows/__tests__/verification-custom.test.d.ts +0 -2
- package/dist/workflows/__tests__/verification-custom.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/verification-custom.test.js +0 -230
- package/dist/workflows/__tests__/verification-custom.test.js.map +0 -1
- package/dist/workflows/__tests__/verification-traceback.test.d.ts +0 -2
- package/dist/workflows/__tests__/verification-traceback.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/verification-traceback.test.js +0 -442
- package/dist/workflows/__tests__/verification-traceback.test.js.map +0 -1
- package/dist/workflows/__tests__/verification.test.d.ts +0 -2
- package/dist/workflows/__tests__/verification.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/verification.test.js +0 -272
- package/dist/workflows/__tests__/verification.test.js.map +0 -1
- package/dist/workflows/__tests__/workflow-reliability-contract.test.d.ts +0 -2
- package/dist/workflows/__tests__/workflow-reliability-contract.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/workflow-reliability-contract.test.js +0 -536
- package/dist/workflows/__tests__/workflow-reliability-contract.test.js.map +0 -1
- package/dist/workflows/__tests__/workflow-reliability-e2e.test.d.ts +0 -2
- package/dist/workflows/__tests__/workflow-reliability-e2e.test.d.ts.map +0 -1
- package/dist/workflows/__tests__/workflow-reliability-e2e.test.js +0 -199
- package/dist/workflows/__tests__/workflow-reliability-e2e.test.js.map +0 -1
- package/dist/workflows/api-executor.d.ts +0 -16
- package/dist/workflows/api-executor.d.ts.map +0 -1
- package/dist/workflows/api-executor.js +0 -94
- package/dist/workflows/api-executor.js.map +0 -1
- package/dist/workflows/barrier.d.ts +0 -72
- package/dist/workflows/barrier.d.ts.map +0 -1
- package/dist/workflows/barrier.js +0 -162
- package/dist/workflows/barrier.js.map +0 -1
- package/dist/workflows/budget-tracker.d.ts +0 -75
- package/dist/workflows/budget-tracker.d.ts.map +0 -1
- package/dist/workflows/budget-tracker.js +0 -184
- package/dist/workflows/budget-tracker.js.map +0 -1
- package/dist/workflows/builder.d.ts +0 -229
- package/dist/workflows/builder.d.ts.map +0 -1
- package/dist/workflows/builder.js +0 -430
- package/dist/workflows/builder.js.map +0 -1
- package/dist/workflows/channel-messenger.d.ts +0 -28
- package/dist/workflows/channel-messenger.d.ts.map +0 -1
- package/dist/workflows/channel-messenger.js +0 -275
- package/dist/workflows/channel-messenger.js.map +0 -1
- package/dist/workflows/cli-session-collector.d.ts +0 -39
- package/dist/workflows/cli-session-collector.d.ts.map +0 -1
- package/dist/workflows/cli-session-collector.js +0 -23
- package/dist/workflows/cli-session-collector.js.map +0 -1
- package/dist/workflows/cli.d.ts +0 -11
- package/dist/workflows/cli.d.ts.map +0 -1
- package/dist/workflows/cli.js +0 -395
- package/dist/workflows/cli.js.map +0 -1
- package/dist/workflows/cloud-runner.d.ts +0 -15
- package/dist/workflows/cloud-runner.d.ts.map +0 -1
- package/dist/workflows/cloud-runner.js +0 -41
- package/dist/workflows/cloud-runner.js.map +0 -1
- package/dist/workflows/cloud-schedules.d.ts +0 -3
- package/dist/workflows/cloud-schedules.d.ts.map +0 -1
- package/dist/workflows/cloud-schedules.js +0 -2
- package/dist/workflows/cloud-schedules.js.map +0 -1
- package/dist/workflows/collectors/claude.d.ts +0 -6
- package/dist/workflows/collectors/claude.d.ts.map +0 -1
- package/dist/workflows/collectors/claude.js +0 -330
- package/dist/workflows/collectors/claude.js.map +0 -1
- package/dist/workflows/collectors/codex.d.ts +0 -18
- package/dist/workflows/collectors/codex.d.ts.map +0 -1
- package/dist/workflows/collectors/codex.js +0 -265
- package/dist/workflows/collectors/codex.js.map +0 -1
- package/dist/workflows/collectors/opencode.d.ts +0 -6
- package/dist/workflows/collectors/opencode.d.ts.map +0 -1
- package/dist/workflows/collectors/opencode.js +0 -204
- package/dist/workflows/collectors/opencode.js.map +0 -1
- package/dist/workflows/coordinator.d.ts +0 -73
- package/dist/workflows/coordinator.d.ts.map +0 -1
- package/dist/workflows/coordinator.js +0 -647
- package/dist/workflows/coordinator.js.map +0 -1
- package/dist/workflows/custom-steps.d.ts +0 -73
- package/dist/workflows/custom-steps.d.ts.map +0 -1
- package/dist/workflows/custom-steps.js +0 -321
- package/dist/workflows/custom-steps.js.map +0 -1
- package/dist/workflows/default-logger.d.ts +0 -9
- package/dist/workflows/default-logger.d.ts.map +0 -1
- package/dist/workflows/default-logger.js +0 -104
- package/dist/workflows/default-logger.js.map +0 -1
- package/dist/workflows/dry-run-format.d.ts +0 -6
- package/dist/workflows/dry-run-format.d.ts.map +0 -1
- package/dist/workflows/dry-run-format.js +0 -76
- package/dist/workflows/dry-run-format.js.map +0 -1
- package/dist/workflows/file-db.d.ts +0 -85
- package/dist/workflows/file-db.d.ts.map +0 -1
- package/dist/workflows/file-db.js +0 -215
- package/dist/workflows/file-db.js.map +0 -1
- package/dist/workflows/index.d.ts +0 -36
- package/dist/workflows/index.d.ts.map +0 -1
- package/dist/workflows/index.js +0 -33
- package/dist/workflows/index.js.map +0 -1
- package/dist/workflows/listr-renderer.d.ts +0 -26
- package/dist/workflows/listr-renderer.d.ts.map +0 -1
- package/dist/workflows/listr-renderer.js +0 -230
- package/dist/workflows/listr-renderer.js.map +0 -1
- package/dist/workflows/memory-db.d.ts +0 -17
- package/dist/workflows/memory-db.d.ts.map +0 -1
- package/dist/workflows/memory-db.js +0 -33
- package/dist/workflows/memory-db.js.map +0 -1
- package/dist/workflows/process-backend-executor.d.ts +0 -18
- package/dist/workflows/process-backend-executor.d.ts.map +0 -1
- package/dist/workflows/process-backend-executor.js +0 -74
- package/dist/workflows/process-backend-executor.js.map +0 -1
- package/dist/workflows/process-spawner.d.ts +0 -35
- package/dist/workflows/process-spawner.d.ts.map +0 -1
- package/dist/workflows/process-spawner.js +0 -141
- package/dist/workflows/process-spawner.js.map +0 -1
- package/dist/workflows/proxy-env.d.ts +0 -52
- package/dist/workflows/proxy-env.d.ts.map +0 -1
- package/dist/workflows/proxy-env.js +0 -92
- package/dist/workflows/proxy-env.js.map +0 -1
- package/dist/workflows/run-script.d.ts +0 -82
- package/dist/workflows/run-script.d.ts.map +0 -1
- package/dist/workflows/run-script.js +0 -521
- package/dist/workflows/run-script.js.map +0 -1
- package/dist/workflows/run-summary-table.d.ts +0 -5
- package/dist/workflows/run-summary-table.d.ts.map +0 -1
- package/dist/workflows/run-summary-table.js +0 -132
- package/dist/workflows/run-summary-table.js.map +0 -1
- package/dist/workflows/run.d.ts +0 -45
- package/dist/workflows/run.d.ts.map +0 -1
- package/dist/workflows/run.js +0 -37
- package/dist/workflows/run.js.map +0 -1
- package/dist/workflows/runner.d.ts +0 -527
- package/dist/workflows/runner.d.ts.map +0 -1
- package/dist/workflows/runner.js +0 -6266
- package/dist/workflows/runner.js.map +0 -1
- package/dist/workflows/sibling-links.d.ts +0 -100
- package/dist/workflows/sibling-links.d.ts.map +0 -1
- package/dist/workflows/sibling-links.js +0 -205
- package/dist/workflows/sibling-links.js.map +0 -1
- package/dist/workflows/state.d.ts +0 -77
- package/dist/workflows/state.d.ts.map +0 -1
- package/dist/workflows/state.js +0 -140
- package/dist/workflows/state.js.map +0 -1
- package/dist/workflows/step-executor.d.ts +0 -95
- package/dist/workflows/step-executor.d.ts.map +0 -1
- package/dist/workflows/step-executor.js +0 -393
- package/dist/workflows/step-executor.js.map +0 -1
- package/dist/workflows/template-resolver.d.ts +0 -33
- package/dist/workflows/template-resolver.d.ts.map +0 -1
- package/dist/workflows/template-resolver.js +0 -144
- package/dist/workflows/template-resolver.js.map +0 -1
- package/dist/workflows/templates.d.ts +0 -47
- package/dist/workflows/templates.d.ts.map +0 -1
- package/dist/workflows/templates.js +0 -405
- package/dist/workflows/templates.js.map +0 -1
- package/dist/workflows/trajectory.d.ts +0 -87
- package/dist/workflows/trajectory.d.ts.map +0 -1
- package/dist/workflows/trajectory.js +0 -412
- package/dist/workflows/trajectory.js.map +0 -1
- package/dist/workflows/types.d.ts +0 -471
- package/dist/workflows/types.d.ts.map +0 -1
- package/dist/workflows/types.js +0 -37
- package/dist/workflows/types.js.map +0 -1
- package/dist/workflows/validator.d.ts +0 -11
- package/dist/workflows/validator.d.ts.map +0 -1
- package/dist/workflows/validator.js +0 -184
- package/dist/workflows/validator.js.map +0 -1
- package/dist/workflows/verification.d.ts +0 -53
- package/dist/workflows/verification.d.ts.map +0 -1
- package/dist/workflows/verification.js +0 -238
- package/dist/workflows/verification.js.map +0 -1
- /package/dist/{provisioner → actions}/types.js +0 -0
package/dist/client.js
DELETED
|
@@ -1,838 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AgentRelayClient — single client for communicating with an agent-relay broker
|
|
3
|
-
* over HTTP/WS. Works identically for local and remote brokers.
|
|
4
|
-
*
|
|
5
|
-
* Usage:
|
|
6
|
-
* // Remote broker (Daytona sandbox, cloud, etc.)
|
|
7
|
-
* const client = new AgentRelayClient({ baseUrl, apiKey });
|
|
8
|
-
*
|
|
9
|
-
* // Local broker (spawn and connect)
|
|
10
|
-
* const client = await AgentRelayClient.spawn({ cwd: '/my/project' });
|
|
11
|
-
*/
|
|
12
|
-
import { spawn } from 'node:child_process';
|
|
13
|
-
import { randomBytes } from 'node:crypto';
|
|
14
|
-
import { readFileSync, existsSync } from 'node:fs';
|
|
15
|
-
import path from 'node:path';
|
|
16
|
-
import { BrokerTransport, AgentRelayProtocolError, } from './transport.js';
|
|
17
|
-
import { getBrokerBinaryPath, formatBrokerNotFoundError } from './broker-path.js';
|
|
18
|
-
import { EventBus } from './event-bus.js';
|
|
19
|
-
function isHeadlessProvider(value) {
|
|
20
|
-
return value === 'claude' || value === 'opencode';
|
|
21
|
-
}
|
|
22
|
-
function resolveSpawnTransport(input) {
|
|
23
|
-
return input.transport ?? (input.provider === 'opencode' ? 'headless' : 'pty');
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Serialize a {@link SpawnPtyInput} for the broker `/api/spawn` endpoint.
|
|
27
|
-
* Factored out of {@link AgentRelayClient.spawnPty} so the same shape can
|
|
28
|
-
* be applied to the post-`beforeAgentSpawn` resolved input.
|
|
29
|
-
*/
|
|
30
|
-
function buildSpawnPtyBody(input) {
|
|
31
|
-
return {
|
|
32
|
-
name: input.name,
|
|
33
|
-
cli: input.cli,
|
|
34
|
-
...(input.model !== undefined ? { model: input.model } : {}),
|
|
35
|
-
args: input.args ?? [],
|
|
36
|
-
...(input.task !== undefined ? { task: input.task } : {}),
|
|
37
|
-
channels: input.channels ?? [],
|
|
38
|
-
...(input.cwd !== undefined ? { cwd: input.cwd } : {}),
|
|
39
|
-
...(input.team !== undefined ? { team: input.team } : {}),
|
|
40
|
-
...(input.agentToken !== undefined ? { agentToken: input.agentToken } : {}),
|
|
41
|
-
...(input.shadowOf !== undefined ? { shadowOf: input.shadowOf } : {}),
|
|
42
|
-
...(input.shadowMode !== undefined ? { shadowMode: input.shadowMode } : {}),
|
|
43
|
-
...(input.continueFrom !== undefined ? { continueFrom: input.continueFrom } : {}),
|
|
44
|
-
...(input.idleThresholdSecs !== undefined ? { idleThresholdSecs: input.idleThresholdSecs } : {}),
|
|
45
|
-
...(input.restartPolicy !== undefined ? { restartPolicy: input.restartPolicy } : {}),
|
|
46
|
-
...(input.skipRelayPrompt !== undefined ? { skipRelayPrompt: input.skipRelayPrompt } : {}),
|
|
47
|
-
...(input.agentResultSchema !== undefined ? { agentResultSchema: input.agentResultSchema } : {}),
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
function buildSpawnProviderBody(input, transport) {
|
|
51
|
-
return {
|
|
52
|
-
name: input.name,
|
|
53
|
-
cli: input.provider,
|
|
54
|
-
...(input.model !== undefined ? { model: input.model } : {}),
|
|
55
|
-
args: input.args ?? [],
|
|
56
|
-
...(input.task !== undefined ? { task: input.task } : {}),
|
|
57
|
-
channels: input.channels ?? [],
|
|
58
|
-
...(input.cwd !== undefined ? { cwd: input.cwd } : {}),
|
|
59
|
-
...(input.team !== undefined ? { team: input.team } : {}),
|
|
60
|
-
...(input.agentToken !== undefined ? { agentToken: input.agentToken } : {}),
|
|
61
|
-
...(input.shadowOf !== undefined ? { shadowOf: input.shadowOf } : {}),
|
|
62
|
-
...(input.shadowMode !== undefined ? { shadowMode: input.shadowMode } : {}),
|
|
63
|
-
...(input.continueFrom !== undefined ? { continueFrom: input.continueFrom } : {}),
|
|
64
|
-
...(input.idleThresholdSecs !== undefined ? { idleThresholdSecs: input.idleThresholdSecs } : {}),
|
|
65
|
-
...(input.restartPolicy !== undefined ? { restartPolicy: input.restartPolicy } : {}),
|
|
66
|
-
...(input.skipRelayPrompt !== undefined ? { skipRelayPrompt: input.skipRelayPrompt } : {}),
|
|
67
|
-
...(input.agentResultSchema !== undefined ? { agentResultSchema: input.agentResultSchema } : {}),
|
|
68
|
-
transport,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
function isProcessRunning(pid) {
|
|
72
|
-
if (!Number.isInteger(pid) || pid <= 0) {
|
|
73
|
-
return false;
|
|
74
|
-
}
|
|
75
|
-
try {
|
|
76
|
-
process.kill(pid, 0);
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
return error.code === 'EPERM';
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
function buildBrokerInitArgs(args) {
|
|
84
|
-
if (!args) {
|
|
85
|
-
return [];
|
|
86
|
-
}
|
|
87
|
-
const cliArgs = [];
|
|
88
|
-
if (args.persist) {
|
|
89
|
-
cliArgs.push('--persist');
|
|
90
|
-
}
|
|
91
|
-
if (args.apiPort !== undefined) {
|
|
92
|
-
cliArgs.push('--api-port', String(args.apiPort));
|
|
93
|
-
}
|
|
94
|
-
if (args.apiBind !== undefined) {
|
|
95
|
-
cliArgs.push('--api-bind', args.apiBind);
|
|
96
|
-
}
|
|
97
|
-
if (args.stateDir !== undefined) {
|
|
98
|
-
cliArgs.push('--state-dir', args.stateDir);
|
|
99
|
-
}
|
|
100
|
-
return cliArgs;
|
|
101
|
-
}
|
|
102
|
-
// ── Client ─────────────────────────────────────────────────────────────
|
|
103
|
-
export class AgentRelayClient {
|
|
104
|
-
transport;
|
|
105
|
-
/** Set after spawn() — the managed child process. */
|
|
106
|
-
child = null;
|
|
107
|
-
/** Lease renewal timer (only for spawned brokers). */
|
|
108
|
-
leaseTimer = null;
|
|
109
|
-
brokerExitInfo = null;
|
|
110
|
-
brokerExitListeners = new Set();
|
|
111
|
-
workspaceKey;
|
|
112
|
-
/** Resolved broker URL — captured so call-site lifecycle contexts can surface it. */
|
|
113
|
-
baseUrl;
|
|
114
|
-
/** Shared multi-listener registry. Created bare when no `eventBus` is passed in. */
|
|
115
|
-
eventBus;
|
|
116
|
-
constructor(options) {
|
|
117
|
-
this.baseUrl = options.baseUrl;
|
|
118
|
-
this.eventBus = options.eventBus ?? new EventBus();
|
|
119
|
-
this.transport = new BrokerTransport({
|
|
120
|
-
baseUrl: options.baseUrl,
|
|
121
|
-
apiKey: options.apiKey,
|
|
122
|
-
fetch: options.fetch,
|
|
123
|
-
requestTimeoutMs: options.requestTimeoutMs,
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
addListener(event, handler) {
|
|
127
|
-
return this.eventBus.addListener(event, handler);
|
|
128
|
-
}
|
|
129
|
-
removeListener(event, handler) {
|
|
130
|
-
this.eventBus.removeListener(event, handler);
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Fold `beforeAgentSpawn` patches into the input. Listeners run in
|
|
134
|
-
* registration order; each may return a {@link SpawnPatch} that is
|
|
135
|
-
* shallow-merged over the running result. Handler exceptions are caught
|
|
136
|
-
* and logged but do not abort the chain.
|
|
137
|
-
*/
|
|
138
|
-
async runBeforeSpawn(ctx) {
|
|
139
|
-
let resolved = { ...ctx.input };
|
|
140
|
-
for (const handler of this.eventBus.listeners('beforeAgentSpawn')) {
|
|
141
|
-
try {
|
|
142
|
-
const patch = await handler({ ...ctx, input: resolved });
|
|
143
|
-
if (patch && typeof patch === 'object') {
|
|
144
|
-
resolved = { ...resolved, ...patch };
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
catch (err) {
|
|
148
|
-
console.error('[agent-relay] beforeAgentSpawn listener threw:', err);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return resolved;
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Connect to an already-running broker by reading its connection file.
|
|
155
|
-
*
|
|
156
|
-
* The broker writes `connection.json` to its data directory ({cwd}/.agent-relay/
|
|
157
|
-
* in persist mode). This method reads that file to get the URL and API key.
|
|
158
|
-
*
|
|
159
|
-
* @param cwd — project directory (default: process.cwd())
|
|
160
|
-
* @param connectionPath — explicit path to connection.json (overrides cwd)
|
|
161
|
-
*/
|
|
162
|
-
static connect(options) {
|
|
163
|
-
const cwd = options?.cwd ?? process.cwd();
|
|
164
|
-
const stateDir = process.env.AGENT_RELAY_STATE_DIR;
|
|
165
|
-
const connPath = options?.connectionPath ?? path.join(stateDir ?? path.join(cwd, '.agent-relay'), 'connection.json');
|
|
166
|
-
if (!existsSync(connPath)) {
|
|
167
|
-
throw new Error(`No running broker found (${connPath} does not exist). Start one with 'agent-relay up' or use AgentRelayClient.spawn().`);
|
|
168
|
-
}
|
|
169
|
-
const raw = readFileSync(connPath, 'utf-8');
|
|
170
|
-
let conn;
|
|
171
|
-
try {
|
|
172
|
-
conn = JSON.parse(raw);
|
|
173
|
-
}
|
|
174
|
-
catch {
|
|
175
|
-
throw new Error(`Corrupt broker connection file (${connPath}). Remove it and start the broker again.`);
|
|
176
|
-
}
|
|
177
|
-
if (typeof conn.url !== 'string' || typeof conn.api_key !== 'string' || typeof conn.pid !== 'number') {
|
|
178
|
-
throw new Error(`Invalid broker connection metadata in ${connPath}. Remove it and start the broker again.`);
|
|
179
|
-
}
|
|
180
|
-
if (!isProcessRunning(conn.pid)) {
|
|
181
|
-
throw new Error(`Stale broker connection file (${connPath}) points to dead pid ${conn.pid}. Start the broker with 'agent-relay up' or use AgentRelayClient.spawn().`);
|
|
182
|
-
}
|
|
183
|
-
return new AgentRelayClient({
|
|
184
|
-
baseUrl: conn.url,
|
|
185
|
-
apiKey: conn.api_key,
|
|
186
|
-
...(options?.eventBus ? { eventBus: options.eventBus } : {}),
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Spawn a local broker process and return a connected client.
|
|
191
|
-
*
|
|
192
|
-
* 1. Generates a random API key
|
|
193
|
-
* 2. Spawns the broker binary (attached)
|
|
194
|
-
* 3. Parses the API port from stdout
|
|
195
|
-
* 4. Connects HTTP/WS transport
|
|
196
|
-
* 5. Fetches session metadata
|
|
197
|
-
* 6. Starts event stream + lease renewal
|
|
198
|
-
*/
|
|
199
|
-
static async spawn(options) {
|
|
200
|
-
let binaryPath = options?.binaryPath;
|
|
201
|
-
if (!binaryPath) {
|
|
202
|
-
const resolved = getBrokerBinaryPath();
|
|
203
|
-
if (!resolved) {
|
|
204
|
-
throw new Error(formatBrokerNotFoundError());
|
|
205
|
-
}
|
|
206
|
-
binaryPath = resolved;
|
|
207
|
-
}
|
|
208
|
-
const cwd = options?.cwd ?? process.cwd();
|
|
209
|
-
const brokerName = options?.brokerName ?? (path.basename(cwd) || 'project');
|
|
210
|
-
const channels = options?.channels ?? ['general'];
|
|
211
|
-
const timeoutMs = options?.startupTimeoutMs ?? 45_000;
|
|
212
|
-
const userArgs = buildBrokerInitArgs(options?.binaryArgs);
|
|
213
|
-
const apiKey = `br_${randomBytes(16).toString('hex')}`;
|
|
214
|
-
const env = {
|
|
215
|
-
...process.env,
|
|
216
|
-
...options?.env,
|
|
217
|
-
AGENT_RELAY_STARTUP_DEBUG: options?.env?.AGENT_RELAY_STARTUP_DEBUG ?? process.env.AGENT_RELAY_STARTUP_DEBUG ?? '1',
|
|
218
|
-
RELAY_BROKER_API_KEY: apiKey,
|
|
219
|
-
};
|
|
220
|
-
const args = ['init', '--name', brokerName, '--channels', channels.join(','), ...userArgs];
|
|
221
|
-
const stderrLines = [];
|
|
222
|
-
const stdoutLines = [];
|
|
223
|
-
const child = spawn(binaryPath, args, {
|
|
224
|
-
cwd,
|
|
225
|
-
env,
|
|
226
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
227
|
-
});
|
|
228
|
-
if (child.stderr) {
|
|
229
|
-
const { createInterface } = await import('node:readline');
|
|
230
|
-
const rl = createInterface({ input: child.stderr });
|
|
231
|
-
rl.on('line', (line) => {
|
|
232
|
-
pushBufferedLine(stderrLines, line);
|
|
233
|
-
options?.onStderr?.(line);
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
// Parse the API URL from stdout (the broker prints it after binding)
|
|
237
|
-
const baseUrl = await waitForApiUrl(child, timeoutMs, {
|
|
238
|
-
binaryPath,
|
|
239
|
-
args,
|
|
240
|
-
cwd,
|
|
241
|
-
stdoutLines,
|
|
242
|
-
stderrLines,
|
|
243
|
-
});
|
|
244
|
-
drainBrokerStdioAfterStartup(child);
|
|
245
|
-
const client = new AgentRelayClient({
|
|
246
|
-
baseUrl,
|
|
247
|
-
apiKey,
|
|
248
|
-
requestTimeoutMs: options?.requestTimeoutMs,
|
|
249
|
-
...(options?.eventBus ? { eventBus: options.eventBus } : {}),
|
|
250
|
-
});
|
|
251
|
-
client.child = child;
|
|
252
|
-
client.installManagedBrokerExitHandler(child, stderrLines);
|
|
253
|
-
// The broker prints "API listening on …" the moment its TCP listener is
|
|
254
|
-
// bound, but it still needs to complete a Relaycast handshake before
|
|
255
|
-
// `getSession()` will return. Two failure modes to handle:
|
|
256
|
-
//
|
|
257
|
-
// 1. Broker is alive and warming up — the startup-only API responds
|
|
258
|
-
// 503 until the handshake completes. Poll until it succeeds.
|
|
259
|
-
// 2. Broker died during the handshake (e.g. Relaycast unreachable) —
|
|
260
|
-
// the in-flight fetch sees the socket drop as `TypeError: fetch
|
|
261
|
-
// failed`, which is uninformative on its own.
|
|
262
|
-
//
|
|
263
|
-
// We race each `getSession()` against `brokerExited` so case (2) reports
|
|
264
|
-
// as the actual broker exit (with its stderr tail and exit code), not as
|
|
265
|
-
// a mystery network error. No backoff for the death case — we know it
|
|
266
|
-
// immediately. 503 polling stays simple at 1s intervals.
|
|
267
|
-
const brokerExited = new Promise((_, reject) => {
|
|
268
|
-
child.once('exit', (code) => {
|
|
269
|
-
reject(new Error(formatBrokerStartupError(`Broker process exited with code ${code} during initial handshake`, child, { binaryPath, args, cwd, stdoutLines, stderrLines })));
|
|
270
|
-
});
|
|
271
|
-
});
|
|
272
|
-
// Suppress unhandledRejection if the race is won by getSession before
|
|
273
|
-
// the broker exits later (e.g. on normal shutdown).
|
|
274
|
-
brokerExited.catch(() => { });
|
|
275
|
-
let session;
|
|
276
|
-
for (let attempt = 0; attempt < 10; attempt++) {
|
|
277
|
-
try {
|
|
278
|
-
session = await Promise.race([client.getSession(), brokerExited]);
|
|
279
|
-
break;
|
|
280
|
-
}
|
|
281
|
-
catch (err) {
|
|
282
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
283
|
-
const is503 = message.includes('503') || message.includes('Service Unavailable');
|
|
284
|
-
if (!is503 || attempt >= 9)
|
|
285
|
-
throw err;
|
|
286
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
if (!client.brokerExitInfo) {
|
|
290
|
-
client.connectEvents();
|
|
291
|
-
// Renew the owner lease so the broker doesn't auto-shutdown
|
|
292
|
-
client.leaseTimer = setInterval(() => {
|
|
293
|
-
client.renewLease().catch(() => { });
|
|
294
|
-
}, 60_000);
|
|
295
|
-
}
|
|
296
|
-
return client;
|
|
297
|
-
}
|
|
298
|
-
/** PID of the managed broker process, if spawned locally. */
|
|
299
|
-
get brokerPid() {
|
|
300
|
-
return this.child?.pid;
|
|
301
|
-
}
|
|
302
|
-
// ── Session ────────────────────────────────────────────────────────
|
|
303
|
-
async getSession() {
|
|
304
|
-
const session = await this.transport.request('/api/session');
|
|
305
|
-
this.workspaceKey = session.workspace_key;
|
|
306
|
-
return session;
|
|
307
|
-
}
|
|
308
|
-
async healthCheck() {
|
|
309
|
-
return this.transport.request('/health');
|
|
310
|
-
}
|
|
311
|
-
// ── Events ─────────────────────────────────────────────────────────
|
|
312
|
-
connectEvents(sinceSeq) {
|
|
313
|
-
this.transport.connect(sinceSeq);
|
|
314
|
-
}
|
|
315
|
-
disconnectEvents() {
|
|
316
|
-
this.transport.disconnect();
|
|
317
|
-
}
|
|
318
|
-
onEvent(listener) {
|
|
319
|
-
return this.transport.onEvent(listener);
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* Subscribe to managed broker child-process exit.
|
|
323
|
-
*
|
|
324
|
-
* Clients created with `new AgentRelayClient(...)` or `connect()` do not own a
|
|
325
|
-
* broker child process, so this is a no-op for them.
|
|
326
|
-
*/
|
|
327
|
-
onBrokerExit(listener) {
|
|
328
|
-
if (!this.child && !this.brokerExitInfo) {
|
|
329
|
-
return () => { };
|
|
330
|
-
}
|
|
331
|
-
this.brokerExitListeners.add(listener);
|
|
332
|
-
if (this.brokerExitInfo) {
|
|
333
|
-
const info = cloneBrokerExitInfo(this.brokerExitInfo);
|
|
334
|
-
queueMicrotask(() => {
|
|
335
|
-
if (this.brokerExitListeners.has(listener)) {
|
|
336
|
-
try {
|
|
337
|
-
listener(info);
|
|
338
|
-
}
|
|
339
|
-
catch {
|
|
340
|
-
// Listener failures should not interfere with SDK cleanup.
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
return () => {
|
|
346
|
-
this.brokerExitListeners.delete(listener);
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
queryEvents(filter) {
|
|
350
|
-
return this.transport.queryEvents(filter);
|
|
351
|
-
}
|
|
352
|
-
getLastEvent(kind, name) {
|
|
353
|
-
return this.transport.getLastEvent(kind, name);
|
|
354
|
-
}
|
|
355
|
-
// ── Agent lifecycle ────────────────────────────────────────────────
|
|
356
|
-
async spawnPty(input) {
|
|
357
|
-
const beforeCtx = {
|
|
358
|
-
kind: 'pty',
|
|
359
|
-
input,
|
|
360
|
-
spawnerPid: process.pid,
|
|
361
|
-
spawnStartTs: new Date().toISOString(),
|
|
362
|
-
baseUrl: this.baseUrl,
|
|
363
|
-
};
|
|
364
|
-
const t0 = Date.now();
|
|
365
|
-
const resolvedInput = (await this.runBeforeSpawn(beforeCtx));
|
|
366
|
-
try {
|
|
367
|
-
const result = await this.transport.request('/api/spawn', {
|
|
368
|
-
method: 'POST',
|
|
369
|
-
body: JSON.stringify(buildSpawnPtyBody(resolvedInput)),
|
|
370
|
-
});
|
|
371
|
-
await this.emitAfterSpawn(beforeCtx, resolvedInput, t0, result, undefined);
|
|
372
|
-
return result;
|
|
373
|
-
}
|
|
374
|
-
catch (err) {
|
|
375
|
-
await this.emitAfterSpawn(beforeCtx, resolvedInput, t0, undefined, err);
|
|
376
|
-
throw err;
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
async spawnProvider(input) {
|
|
380
|
-
const transport = resolveSpawnTransport(input);
|
|
381
|
-
if (transport === 'headless' && !isHeadlessProvider(input.provider)) {
|
|
382
|
-
throw new Error(`provider '${input.provider}' does not support headless transport (supported: claude, opencode)`);
|
|
383
|
-
}
|
|
384
|
-
const beforeCtx = {
|
|
385
|
-
kind: 'provider',
|
|
386
|
-
input,
|
|
387
|
-
spawnerPid: process.pid,
|
|
388
|
-
spawnStartTs: new Date().toISOString(),
|
|
389
|
-
baseUrl: this.baseUrl,
|
|
390
|
-
};
|
|
391
|
-
const t0 = Date.now();
|
|
392
|
-
const resolvedInput = (await this.runBeforeSpawn(beforeCtx));
|
|
393
|
-
try {
|
|
394
|
-
const result = await this.transport.request('/api/spawn', {
|
|
395
|
-
method: 'POST',
|
|
396
|
-
body: JSON.stringify(buildSpawnProviderBody(resolvedInput, transport)),
|
|
397
|
-
});
|
|
398
|
-
await this.emitAfterSpawn(beforeCtx, resolvedInput, t0, result, undefined);
|
|
399
|
-
return result;
|
|
400
|
-
}
|
|
401
|
-
catch (err) {
|
|
402
|
-
await this.emitAfterSpawn(beforeCtx, resolvedInput, t0, undefined, err);
|
|
403
|
-
throw err;
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
async spawnHeadless(input) {
|
|
407
|
-
return this.spawnProvider({ ...input, transport: 'headless' });
|
|
408
|
-
}
|
|
409
|
-
async spawnClaude(input) {
|
|
410
|
-
return this.spawnProvider({ ...input, provider: 'claude' });
|
|
411
|
-
}
|
|
412
|
-
async spawnOpencode(input) {
|
|
413
|
-
return this.spawnProvider({ ...input, provider: 'opencode' });
|
|
414
|
-
}
|
|
415
|
-
async release(name, reason) {
|
|
416
|
-
const beforeCtx = { name, reason, baseUrl: this.baseUrl };
|
|
417
|
-
const t0 = Date.now();
|
|
418
|
-
await this.eventBus.emit('beforeAgentRelease', beforeCtx);
|
|
419
|
-
try {
|
|
420
|
-
const result = await this.transport.request(`/api/spawned/${encodeURIComponent(name)}`, {
|
|
421
|
-
method: 'DELETE',
|
|
422
|
-
...(reason ? { body: JSON.stringify({ reason }) } : {}),
|
|
423
|
-
});
|
|
424
|
-
const afterCtx = {
|
|
425
|
-
...beforeCtx,
|
|
426
|
-
durationMs: Date.now() - t0,
|
|
427
|
-
};
|
|
428
|
-
await this.eventBus.emit('afterAgentRelease', afterCtx);
|
|
429
|
-
return result;
|
|
430
|
-
}
|
|
431
|
-
catch (err) {
|
|
432
|
-
const afterCtx = {
|
|
433
|
-
...beforeCtx,
|
|
434
|
-
error: err instanceof Error ? err : new Error(String(err)),
|
|
435
|
-
durationMs: Date.now() - t0,
|
|
436
|
-
};
|
|
437
|
-
await this.eventBus.emit('afterAgentRelease', afterCtx);
|
|
438
|
-
throw err;
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
async emitAfterSpawn(beforeCtx, resolvedInput, startMs, result, error) {
|
|
442
|
-
const afterCtx = {
|
|
443
|
-
...beforeCtx,
|
|
444
|
-
resolvedInput,
|
|
445
|
-
...(result ? { result } : {}),
|
|
446
|
-
...(error !== undefined ? { error: error instanceof Error ? error : new Error(String(error)) } : {}),
|
|
447
|
-
durationMs: Date.now() - startMs,
|
|
448
|
-
};
|
|
449
|
-
await this.eventBus.emit('afterAgentSpawn', afterCtx);
|
|
450
|
-
}
|
|
451
|
-
async listAgents() {
|
|
452
|
-
const result = await this.transport.request('/api/spawned');
|
|
453
|
-
return result.agents;
|
|
454
|
-
}
|
|
455
|
-
// ── PTY control ────────────────────────────────────────────────────
|
|
456
|
-
async sendInput(name, data) {
|
|
457
|
-
return this.transport.request(`/api/input/${encodeURIComponent(name)}`, {
|
|
458
|
-
method: 'POST',
|
|
459
|
-
body: JSON.stringify({ data }),
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
openInputStream(name, options) {
|
|
463
|
-
return this.transport.openInputStream(name, options);
|
|
464
|
-
}
|
|
465
|
-
async resizePty(name, rows, cols) {
|
|
466
|
-
return this.transport.request(`/api/resize/${encodeURIComponent(name)}`, {
|
|
467
|
-
method: 'POST',
|
|
468
|
-
body: JSON.stringify({ rows, cols }),
|
|
469
|
-
});
|
|
470
|
-
}
|
|
471
|
-
async getInboundDeliveryMode(name) {
|
|
472
|
-
const result = await this.transport.request(`/api/spawned/${encodeURIComponent(name)}/delivery-mode`);
|
|
473
|
-
if (result.mode !== 'auto_inject' && result.mode !== 'manual_flush') {
|
|
474
|
-
throw new AgentRelayProtocolError({
|
|
475
|
-
code: 'invalid_response',
|
|
476
|
-
message: "inbound delivery mode response missing valid 'mode'",
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
return result.mode;
|
|
480
|
-
}
|
|
481
|
-
async setInboundDeliveryMode(name, mode) {
|
|
482
|
-
const result = await this.transport.request(`/api/spawned/${encodeURIComponent(name)}/delivery-mode`, {
|
|
483
|
-
method: 'PUT',
|
|
484
|
-
body: JSON.stringify({ mode }),
|
|
485
|
-
});
|
|
486
|
-
if (result.mode !== 'auto_inject' && result.mode !== 'manual_flush') {
|
|
487
|
-
throw new AgentRelayProtocolError({
|
|
488
|
-
code: 'invalid_response',
|
|
489
|
-
message: "set inbound delivery mode response missing valid 'mode'",
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
return {
|
|
493
|
-
mode: result.mode,
|
|
494
|
-
flushed: typeof result.flushed === 'number' ? result.flushed : 0,
|
|
495
|
-
};
|
|
496
|
-
}
|
|
497
|
-
async getPending(name) {
|
|
498
|
-
const result = await this.transport.request(`/api/spawned/${encodeURIComponent(name)}/pending`);
|
|
499
|
-
return Array.isArray(result.pending) ? result.pending : [];
|
|
500
|
-
}
|
|
501
|
-
async flushPending(name) {
|
|
502
|
-
const result = await this.transport.request(`/api/spawned/${encodeURIComponent(name)}/flush`, { method: 'POST' });
|
|
503
|
-
return { flushed: typeof result.flushed === 'number' ? result.flushed : 0 };
|
|
504
|
-
}
|
|
505
|
-
async snapshot(name, format = 'plain') {
|
|
506
|
-
return this.transport.request(`/api/spawned/${encodeURIComponent(name)}/snapshot?format=${encodeURIComponent(format)}`);
|
|
507
|
-
}
|
|
508
|
-
subscribeWorkerStream(name, options = {}) {
|
|
509
|
-
this.connectEvents(options.sinceSeq);
|
|
510
|
-
return {
|
|
511
|
-
[Symbol.asyncIterator]: () => {
|
|
512
|
-
const queue = [];
|
|
513
|
-
let pending;
|
|
514
|
-
let done = false;
|
|
515
|
-
const unsubscribe = this.onEvent((event) => {
|
|
516
|
-
if (event.kind !== 'worker_stream' ||
|
|
517
|
-
event.name !== name ||
|
|
518
|
-
(options.stream !== undefined && event.stream !== options.stream)) {
|
|
519
|
-
return;
|
|
520
|
-
}
|
|
521
|
-
if (pending) {
|
|
522
|
-
const { resolve } = pending;
|
|
523
|
-
pending = undefined;
|
|
524
|
-
resolve({ done: false, value: event.chunk });
|
|
525
|
-
return;
|
|
526
|
-
}
|
|
527
|
-
queue.push(event.chunk);
|
|
528
|
-
});
|
|
529
|
-
const close = () => {
|
|
530
|
-
done = true;
|
|
531
|
-
unsubscribe();
|
|
532
|
-
if (pending) {
|
|
533
|
-
const { resolve } = pending;
|
|
534
|
-
pending = undefined;
|
|
535
|
-
resolve({ done: true, value: undefined });
|
|
536
|
-
}
|
|
537
|
-
return { done: true, value: undefined };
|
|
538
|
-
};
|
|
539
|
-
return {
|
|
540
|
-
next() {
|
|
541
|
-
if (queue.length > 0) {
|
|
542
|
-
return Promise.resolve({ done: false, value: queue.shift() });
|
|
543
|
-
}
|
|
544
|
-
if (done) {
|
|
545
|
-
return Promise.resolve({ done: true, value: undefined });
|
|
546
|
-
}
|
|
547
|
-
return new Promise((resolve, reject) => {
|
|
548
|
-
pending = { resolve, reject };
|
|
549
|
-
});
|
|
550
|
-
},
|
|
551
|
-
return() {
|
|
552
|
-
return Promise.resolve(close());
|
|
553
|
-
},
|
|
554
|
-
throw(error) {
|
|
555
|
-
done = true;
|
|
556
|
-
unsubscribe();
|
|
557
|
-
if (pending) {
|
|
558
|
-
const { reject } = pending;
|
|
559
|
-
pending = undefined;
|
|
560
|
-
reject(error);
|
|
561
|
-
}
|
|
562
|
-
return Promise.reject(error);
|
|
563
|
-
},
|
|
564
|
-
[Symbol.asyncIterator]() {
|
|
565
|
-
return this;
|
|
566
|
-
},
|
|
567
|
-
};
|
|
568
|
-
},
|
|
569
|
-
};
|
|
570
|
-
}
|
|
571
|
-
// ── Messaging ──────────────────────────────────────────────────────
|
|
572
|
-
async sendMessage(input) {
|
|
573
|
-
try {
|
|
574
|
-
return await this.transport.request('/api/send', {
|
|
575
|
-
method: 'POST',
|
|
576
|
-
body: JSON.stringify({
|
|
577
|
-
to: input.to,
|
|
578
|
-
text: input.text,
|
|
579
|
-
from: input.from,
|
|
580
|
-
threadId: input.threadId,
|
|
581
|
-
workspaceId: input.workspaceId,
|
|
582
|
-
workspaceAlias: input.workspaceAlias,
|
|
583
|
-
priority: input.priority,
|
|
584
|
-
data: input.data,
|
|
585
|
-
mode: input.mode,
|
|
586
|
-
}),
|
|
587
|
-
});
|
|
588
|
-
}
|
|
589
|
-
catch (error) {
|
|
590
|
-
if (error instanceof AgentRelayProtocolError && error.code === 'unsupported_operation') {
|
|
591
|
-
return { event_id: 'unsupported_operation', targets: [] };
|
|
592
|
-
}
|
|
593
|
-
throw error;
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
// ── Model control ──────────────────────────────────────────────────
|
|
597
|
-
async setModel(name, model, opts) {
|
|
598
|
-
return this.transport.request(`/api/spawned/${encodeURIComponent(name)}/model`, {
|
|
599
|
-
method: 'POST',
|
|
600
|
-
body: JSON.stringify({ model, timeout_ms: opts?.timeoutMs }),
|
|
601
|
-
});
|
|
602
|
-
}
|
|
603
|
-
// ── Channels ───────────────────────────────────────────────────────
|
|
604
|
-
async subscribeChannels(name, channels) {
|
|
605
|
-
await this.transport.request(`/api/spawned/${encodeURIComponent(name)}/subscribe`, {
|
|
606
|
-
method: 'POST',
|
|
607
|
-
body: JSON.stringify({ channels }),
|
|
608
|
-
});
|
|
609
|
-
}
|
|
610
|
-
async unsubscribeChannels(name, channels) {
|
|
611
|
-
await this.transport.request(`/api/spawned/${encodeURIComponent(name)}/unsubscribe`, {
|
|
612
|
-
method: 'POST',
|
|
613
|
-
body: JSON.stringify({ channels }),
|
|
614
|
-
});
|
|
615
|
-
}
|
|
616
|
-
// ── Observability ──────────────────────────────────────────────────
|
|
617
|
-
async getMetrics(agent) {
|
|
618
|
-
const query = agent ? `?agent=${encodeURIComponent(agent)}` : '';
|
|
619
|
-
return this.transport.request(`/api/metrics${query}`);
|
|
620
|
-
}
|
|
621
|
-
async getStatus() {
|
|
622
|
-
return this.transport.request('/api/status');
|
|
623
|
-
}
|
|
624
|
-
async getCrashInsights() {
|
|
625
|
-
return this.transport.request('/api/crash-insights');
|
|
626
|
-
}
|
|
627
|
-
// ── Lifecycle ──────────────────────────────────────────────────────
|
|
628
|
-
async preflight(agents) {
|
|
629
|
-
return this.transport.request('/api/preflight', {
|
|
630
|
-
method: 'POST',
|
|
631
|
-
body: JSON.stringify({ agents }),
|
|
632
|
-
});
|
|
633
|
-
}
|
|
634
|
-
async renewLease() {
|
|
635
|
-
return this.transport.request('/api/session/renew', { method: 'POST' });
|
|
636
|
-
}
|
|
637
|
-
/**
|
|
638
|
-
* Shut down and clean up.
|
|
639
|
-
* - For spawned brokers (via .spawn()): sends POST /api/shutdown to kill the broker, waits for exit.
|
|
640
|
-
* - For connected brokers (via .connect() or constructor): just disconnects the transport.
|
|
641
|
-
* Does NOT kill the broker — the caller doesn't own it.
|
|
642
|
-
*/
|
|
643
|
-
async shutdown() {
|
|
644
|
-
if (this.leaseTimer) {
|
|
645
|
-
clearInterval(this.leaseTimer);
|
|
646
|
-
this.leaseTimer = null;
|
|
647
|
-
}
|
|
648
|
-
// Only send the shutdown command if we own the broker process
|
|
649
|
-
if (this.child) {
|
|
650
|
-
try {
|
|
651
|
-
await this.transport.request('/api/shutdown', { method: 'POST' });
|
|
652
|
-
}
|
|
653
|
-
catch {
|
|
654
|
-
// Broker may already be dead
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
this.transport.disconnect();
|
|
658
|
-
if (this.child) {
|
|
659
|
-
await waitForExit(this.child, 5000);
|
|
660
|
-
this.child = null;
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
/** Disconnect without shutting down the broker. Alias for cases where the intent is clear. */
|
|
664
|
-
disconnect() {
|
|
665
|
-
if (this.leaseTimer) {
|
|
666
|
-
clearInterval(this.leaseTimer);
|
|
667
|
-
this.leaseTimer = null;
|
|
668
|
-
}
|
|
669
|
-
this.transport.disconnect();
|
|
670
|
-
}
|
|
671
|
-
async getConfig() {
|
|
672
|
-
return this.transport.request('/api/config');
|
|
673
|
-
}
|
|
674
|
-
notifyBrokerExit(info) {
|
|
675
|
-
if (this.brokerExitInfo)
|
|
676
|
-
return;
|
|
677
|
-
this.brokerExitInfo = cloneBrokerExitInfo(info);
|
|
678
|
-
for (const listener of this.brokerExitListeners) {
|
|
679
|
-
try {
|
|
680
|
-
listener(cloneBrokerExitInfo(info));
|
|
681
|
-
}
|
|
682
|
-
catch {
|
|
683
|
-
// Listener failures should not interfere with SDK cleanup.
|
|
684
|
-
}
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
installManagedBrokerExitHandler(child, stderrLines) {
|
|
688
|
-
const handleExit = (code, signal) => {
|
|
689
|
-
this.notifyBrokerExit({
|
|
690
|
-
code,
|
|
691
|
-
signal,
|
|
692
|
-
pid: child.pid,
|
|
693
|
-
recentStderr: [...stderrLines],
|
|
694
|
-
});
|
|
695
|
-
this.disconnectEvents();
|
|
696
|
-
if (this.leaseTimer) {
|
|
697
|
-
clearInterval(this.leaseTimer);
|
|
698
|
-
this.leaseTimer = null;
|
|
699
|
-
}
|
|
700
|
-
if (this.child === child) {
|
|
701
|
-
this.child = null;
|
|
702
|
-
}
|
|
703
|
-
};
|
|
704
|
-
if (child.exitCode !== null || child.signalCode !== null) {
|
|
705
|
-
handleExit(child.exitCode, child.signalCode);
|
|
706
|
-
return;
|
|
707
|
-
}
|
|
708
|
-
child.once('exit', handleExit);
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
// ── Helpers ──────────────────────────────────────────────────────────────
|
|
712
|
-
/**
|
|
713
|
-
* Parse the API URL from the broker's stdout. The broker prints:
|
|
714
|
-
* [agent-relay] API listening on http://{bind}:{port}
|
|
715
|
-
* Returns the full URL (e.g. "http://127.0.0.1:3889").
|
|
716
|
-
*/
|
|
717
|
-
async function waitForApiUrl(child, timeoutMs, debug) {
|
|
718
|
-
const { createInterface } = await import('node:readline');
|
|
719
|
-
return new Promise((resolve, reject) => {
|
|
720
|
-
if (!child.stdout) {
|
|
721
|
-
reject(new Error('Broker stdout not available'));
|
|
722
|
-
return;
|
|
723
|
-
}
|
|
724
|
-
let resolved = false;
|
|
725
|
-
const rl = createInterface({ input: child.stdout });
|
|
726
|
-
const timer = setTimeout(() => {
|
|
727
|
-
if (!resolved) {
|
|
728
|
-
resolved = true;
|
|
729
|
-
rl.close();
|
|
730
|
-
child.kill('SIGTERM');
|
|
731
|
-
reject(new Error(formatBrokerStartupError(`Broker did not report API port within ${timeoutMs}ms`, child, debug)));
|
|
732
|
-
}
|
|
733
|
-
}, timeoutMs);
|
|
734
|
-
child.on('exit', (code) => {
|
|
735
|
-
if (!resolved) {
|
|
736
|
-
resolved = true;
|
|
737
|
-
clearTimeout(timer);
|
|
738
|
-
rl.close();
|
|
739
|
-
reject(new Error(formatBrokerStartupError(`Broker process exited with code ${code} before becoming ready`, child, debug)));
|
|
740
|
-
}
|
|
741
|
-
});
|
|
742
|
-
child.on('error', (err) => {
|
|
743
|
-
if (!resolved) {
|
|
744
|
-
resolved = true;
|
|
745
|
-
clearTimeout(timer);
|
|
746
|
-
rl.close();
|
|
747
|
-
reject(new Error(formatBrokerStartupError(`Failed to start broker: ${err.message}`, child, debug)));
|
|
748
|
-
}
|
|
749
|
-
});
|
|
750
|
-
rl.on('line', (line) => {
|
|
751
|
-
if (resolved)
|
|
752
|
-
return;
|
|
753
|
-
pushBufferedLine(debug.stdoutLines, line);
|
|
754
|
-
const match = line.match(/API listening on (https?:\/\/[^\s]+)/);
|
|
755
|
-
if (match) {
|
|
756
|
-
resolved = true;
|
|
757
|
-
clearTimeout(timer);
|
|
758
|
-
rl.close();
|
|
759
|
-
resolve(match[1]);
|
|
760
|
-
}
|
|
761
|
-
});
|
|
762
|
-
});
|
|
763
|
-
}
|
|
764
|
-
function drainBrokerStdioAfterStartup(child) {
|
|
765
|
-
// Drain both stdout AND stderr after startup so high-volume broker
|
|
766
|
-
// diagnostics/events cannot fill either pipe and block the broker process.
|
|
767
|
-
// Stderr also has a readline consumer above for line buffering/onStderr; this
|
|
768
|
-
// raw drain is intentionally no-op and exists only to keep the stream flowing
|
|
769
|
-
// if that consumer is changed or removed later.
|
|
770
|
-
for (const stream of [child.stdout, child.stderr]) {
|
|
771
|
-
if (!stream)
|
|
772
|
-
continue;
|
|
773
|
-
stream.on('data', () => { });
|
|
774
|
-
stream.resume();
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
/** @internal Test-only hooks; not part of the public SDK API. */
|
|
778
|
-
export const __clientTestInternals = {
|
|
779
|
-
drainBrokerStdioAfterStartup,
|
|
780
|
-
};
|
|
781
|
-
function pushBufferedLine(lines, line) {
|
|
782
|
-
lines.push(line);
|
|
783
|
-
if (lines.length > 40) {
|
|
784
|
-
lines.splice(0, lines.length - 40);
|
|
785
|
-
}
|
|
786
|
-
}
|
|
787
|
-
function cloneBrokerExitInfo(info) {
|
|
788
|
-
return {
|
|
789
|
-
...info,
|
|
790
|
-
recentStderr: [...info.recentStderr],
|
|
791
|
-
};
|
|
792
|
-
}
|
|
793
|
-
function formatBrokerStartupError(message, child, debug) {
|
|
794
|
-
const details = [
|
|
795
|
-
`pid=${child.pid ?? 'unknown'}`,
|
|
796
|
-
`cwd=${debug.cwd}`,
|
|
797
|
-
`command=${formatCommand(debug.binaryPath, debug.args)}`,
|
|
798
|
-
`stdout_tail=${formatBufferedLines(debug.stdoutLines)}`,
|
|
799
|
-
`stderr_tail=${formatBufferedLines(debug.stderrLines)}`,
|
|
800
|
-
];
|
|
801
|
-
return `${message} (${details.join('; ')})`;
|
|
802
|
-
}
|
|
803
|
-
function formatBufferedLines(lines) {
|
|
804
|
-
if (lines.length === 0) {
|
|
805
|
-
return '<empty>';
|
|
806
|
-
}
|
|
807
|
-
return lines
|
|
808
|
-
.slice(-8)
|
|
809
|
-
.map((line) => line.trim())
|
|
810
|
-
.filter((line) => line.length > 0)
|
|
811
|
-
.join(' | ');
|
|
812
|
-
}
|
|
813
|
-
function formatCommand(binaryPath, args) {
|
|
814
|
-
const render = [binaryPath, ...args].map((value) => {
|
|
815
|
-
if (/^[A-Za-z0-9_./:@=-]+$/u.test(value)) {
|
|
816
|
-
return value;
|
|
817
|
-
}
|
|
818
|
-
return JSON.stringify(value);
|
|
819
|
-
});
|
|
820
|
-
return render.join(' ');
|
|
821
|
-
}
|
|
822
|
-
function waitForExit(child, timeoutMs) {
|
|
823
|
-
return new Promise((resolve) => {
|
|
824
|
-
if (child.exitCode !== null) {
|
|
825
|
-
resolve();
|
|
826
|
-
return;
|
|
827
|
-
}
|
|
828
|
-
const timer = setTimeout(() => {
|
|
829
|
-
child.kill('SIGKILL');
|
|
830
|
-
resolve();
|
|
831
|
-
}, timeoutMs);
|
|
832
|
-
child.on('exit', () => {
|
|
833
|
-
clearTimeout(timer);
|
|
834
|
-
resolve();
|
|
835
|
-
});
|
|
836
|
-
});
|
|
837
|
-
}
|
|
838
|
-
//# sourceMappingURL=client.js.map
|