agent-relay 2.3.14 → 3.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 +183 -102
- 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/dist/index.cjs +50241 -63377
- package/dist/src/cli/bootstrap.d.ts +6 -0
- package/dist/src/cli/bootstrap.d.ts.map +1 -0
- package/dist/src/cli/bootstrap.js +109 -0
- package/dist/src/cli/bootstrap.js.map +1 -0
- package/dist/src/cli/commands/agent-management.d.ts +51 -0
- package/dist/src/cli/commands/agent-management.d.ts.map +1 -0
- package/dist/src/cli/commands/agent-management.js +290 -0
- package/dist/src/cli/commands/agent-management.js.map +1 -0
- package/dist/src/cli/commands/auth.d.ts +9 -0
- package/dist/src/cli/commands/auth.d.ts.map +1 -0
- package/dist/src/cli/commands/auth.js +33 -0
- package/dist/src/cli/commands/auth.js.map +1 -0
- package/dist/src/cli/commands/cloud.d.ts +18 -0
- package/dist/src/cli/commands/cloud.d.ts.map +1 -0
- package/dist/src/cli/commands/cloud.js +392 -0
- package/dist/src/cli/commands/cloud.js.map +1 -0
- package/dist/src/cli/commands/core.d.ts +107 -0
- package/dist/src/cli/commands/core.d.ts.map +1 -0
- package/dist/src/cli/commands/core.js +299 -0
- package/dist/src/cli/commands/core.js.map +1 -0
- package/dist/src/cli/commands/doctor.d.ts +1 -1
- package/dist/src/cli/commands/doctor.d.ts.map +1 -1
- package/dist/src/cli/commands/doctor.js +1 -485
- package/dist/src/cli/commands/doctor.js.map +1 -1
- package/dist/src/cli/commands/messaging.d.ts +61 -0
- package/dist/src/cli/commands/messaging.d.ts.map +1 -0
- package/dist/src/cli/commands/messaging.js +213 -0
- package/dist/src/cli/commands/messaging.js.map +1 -0
- package/dist/src/cli/commands/monitoring.d.ts +57 -0
- package/dist/src/cli/commands/monitoring.d.ts.map +1 -0
- package/dist/src/cli/commands/monitoring.js +350 -0
- package/dist/src/cli/commands/monitoring.js.map +1 -0
- package/dist/src/cli/commands/setup.d.ts +29 -0
- package/dist/src/cli/commands/setup.d.ts.map +1 -0
- package/dist/src/cli/commands/setup.js +324 -0
- package/dist/src/cli/commands/setup.js.map +1 -0
- package/dist/src/cli/commands/swarm.d.ts +3 -0
- package/dist/src/cli/commands/swarm.d.ts.map +1 -0
- package/dist/src/cli/commands/swarm.js +108 -0
- package/dist/src/cli/commands/swarm.js.map +1 -0
- package/dist/src/cli/index.d.ts +1 -28
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +4 -4936
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/lib/agent-management-listing.d.ts +39 -0
- package/dist/src/cli/lib/agent-management-listing.d.ts.map +1 -0
- package/dist/src/cli/lib/agent-management-listing.js +253 -0
- package/dist/src/cli/lib/agent-management-listing.js.map +1 -0
- package/dist/src/cli/lib/auth-ssh.d.ts +48 -0
- package/dist/src/cli/lib/auth-ssh.d.ts.map +1 -0
- package/dist/src/cli/lib/auth-ssh.js +572 -0
- package/dist/src/cli/lib/auth-ssh.js.map +1 -0
- package/dist/src/cli/lib/bridge.d.ts +8 -0
- package/dist/src/cli/lib/bridge.d.ts.map +1 -0
- package/dist/src/cli/lib/bridge.js +100 -0
- package/dist/src/cli/lib/bridge.js.map +1 -0
- package/dist/src/cli/lib/broker-lifecycle.d.ts +20 -0
- package/dist/src/cli/lib/broker-lifecycle.d.ts.map +1 -0
- package/dist/src/cli/lib/broker-lifecycle.js +843 -0
- package/dist/src/cli/lib/broker-lifecycle.js.map +1 -0
- package/dist/src/cli/lib/client-factory.d.ts +24 -0
- package/dist/src/cli/lib/client-factory.d.ts.map +1 -0
- package/dist/src/cli/lib/client-factory.js +20 -0
- package/dist/src/cli/lib/client-factory.js.map +1 -0
- package/dist/src/cli/lib/cloud-client.d.ts +39 -0
- package/dist/src/cli/lib/cloud-client.d.ts.map +1 -0
- package/dist/src/cli/lib/cloud-client.js +120 -0
- package/dist/src/cli/lib/cloud-client.js.map +1 -0
- package/dist/src/cli/lib/core-maintenance.d.ts +13 -0
- package/dist/src/cli/lib/core-maintenance.d.ts.map +1 -0
- package/dist/src/cli/lib/core-maintenance.js +250 -0
- package/dist/src/cli/lib/core-maintenance.js.map +1 -0
- package/dist/src/cli/lib/doctor.d.ts +2 -0
- package/dist/src/cli/lib/doctor.d.ts.map +1 -0
- package/dist/src/cli/lib/doctor.js +484 -0
- package/dist/src/cli/lib/doctor.js.map +1 -0
- package/dist/src/cli/lib/formatting.d.ts +8 -0
- package/dist/src/cli/lib/formatting.d.ts.map +1 -0
- package/dist/src/cli/lib/formatting.js +48 -0
- package/dist/src/cli/lib/formatting.js.map +1 -0
- package/dist/src/cli/lib/index.d.ts +5 -0
- package/dist/src/cli/lib/index.d.ts.map +1 -0
- package/dist/src/cli/lib/index.js +5 -0
- package/dist/src/cli/lib/index.js.map +1 -0
- package/dist/src/cli/lib/jsonc.d.ts +8 -0
- package/dist/src/cli/lib/jsonc.d.ts.map +1 -0
- package/dist/src/cli/lib/jsonc.js +88 -0
- package/dist/src/cli/lib/jsonc.js.map +1 -0
- package/dist/src/cli/lib/monitoring-health.d.ts +32 -0
- package/dist/src/cli/lib/monitoring-health.d.ts.map +1 -0
- package/dist/src/cli/lib/monitoring-health.js +2 -0
- package/dist/src/cli/lib/monitoring-health.js.map +1 -0
- package/dist/src/cli/lib/paths.d.ts +2 -0
- package/dist/src/cli/lib/paths.d.ts.map +1 -0
- package/dist/src/cli/lib/paths.js +5 -0
- package/dist/src/cli/lib/paths.js.map +1 -0
- package/dist/src/index.d.ts +1 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -5
- package/dist/src/index.js.map +1 -1
- package/install.sh +0 -30
- package/package.json +83 -98
- package/packages/acp-bridge/README.md +8 -8
- package/packages/acp-bridge/dist/acp-agent.d.ts +8 -7
- package/packages/acp-bridge/dist/acp-agent.d.ts.map +1 -1
- package/packages/acp-bridge/dist/acp-agent.js +118 -143
- package/packages/acp-bridge/dist/acp-agent.js.map +1 -1
- package/packages/acp-bridge/dist/cli.d.ts +1 -1
- package/packages/acp-bridge/dist/cli.js +3 -3
- package/packages/acp-bridge/dist/index.d.ts +2 -2
- package/packages/acp-bridge/dist/index.d.ts.map +1 -1
- package/packages/acp-bridge/dist/index.js +1 -1
- package/packages/acp-bridge/dist/index.js.map +1 -1
- package/packages/acp-bridge/dist/types.d.ts +3 -3
- package/packages/acp-bridge/package.json +3 -3
- package/packages/acp-bridge/src/acp-agent.ts +123 -160
- package/packages/acp-bridge/src/cli.ts +3 -3
- package/packages/acp-bridge/src/index.ts +2 -2
- package/packages/acp-bridge/src/types.ts +3 -3
- package/packages/config/dist/bridge-config.d.ts +5 -5
- package/packages/config/dist/bridge-config.d.ts.map +1 -1
- package/packages/config/dist/bridge-config.js +16 -9
- package/packages/config/dist/bridge-config.js.map +1 -1
- package/packages/config/dist/cli-auth-config.d.ts +1 -1
- package/packages/config/dist/cli-auth-config.js +1 -1
- package/packages/config/dist/cli-registry.generated.d.ts +340 -0
- package/packages/config/dist/cli-registry.generated.d.ts.map +1 -0
- package/packages/config/dist/cli-registry.generated.js +297 -0
- package/packages/config/dist/cli-registry.generated.js.map +1 -0
- package/packages/config/dist/index.d.ts +1 -0
- package/packages/config/dist/index.d.ts.map +1 -1
- package/packages/config/dist/index.js +1 -0
- package/packages/config/dist/index.js.map +1 -1
- package/packages/config/dist/project-namespace.d.ts +9 -9
- package/packages/config/dist/project-namespace.js +3 -3
- package/packages/config/dist/relay-config.d.ts +1 -1
- package/packages/config/dist/relay-config.js +1 -1
- package/packages/config/dist/schemas.js +1 -1
- package/packages/config/dist/shadow-config.d.ts +2 -1
- package/packages/config/dist/shadow-config.d.ts.map +1 -1
- package/packages/config/dist/shadow-config.js.map +1 -1
- package/packages/config/package.json +2 -3
- package/packages/config/src/bridge-config.test.ts +20 -6
- package/packages/config/src/bridge-config.ts +20 -10
- package/packages/config/src/cli-auth-config.ts +1 -1
- package/packages/config/src/cli-registry.generated.ts +328 -0
- package/packages/config/src/index.ts +1 -0
- package/packages/config/src/project-namespace.ts +9 -9
- package/packages/config/src/relay-config.ts +1 -1
- package/packages/config/src/schemas.ts +1 -1
- package/packages/config/src/shadow-config.ts +8 -1
- package/packages/contracts/fixtures/error-fixtures.json +42 -0
- package/packages/contracts/fixtures/event-fixtures.json +161 -0
- package/packages/contracts/fixtures/health-fixtures.json +35 -0
- package/packages/contracts/fixtures/identity-fixtures.json +58 -0
- package/packages/contracts/fixtures/replay-fixtures.json +33 -0
- package/packages/hooks/dist/inbox-check/types.d.ts +2 -2
- package/packages/hooks/dist/types.d.ts +9 -3
- package/packages/hooks/dist/types.d.ts.map +1 -1
- package/packages/hooks/dist/types.js +1 -1
- package/packages/hooks/dist/types.js.map +1 -1
- package/packages/hooks/package.json +5 -5
- package/packages/hooks/src/inbox-check/types.ts +2 -2
- package/packages/hooks/src/types.ts +11 -3
- package/packages/memory/package.json +2 -2
- package/packages/policy/package.json +2 -2
- package/packages/sdk/.mcp.json +14 -0
- package/packages/sdk/.trajectories/active/traj_1771875803391_84ca57b2.json +50 -0
- package/packages/sdk/.trajectories/active/traj_1771891934534_06504121.json +50 -0
- package/packages/sdk/.trajectories/active/traj_1771891957929_211afc4e.json +50 -0
- package/packages/sdk/.trajectories/active/traj_1771891982509_38c84638.json +50 -0
- package/packages/sdk/.trajectories/completed/traj_1771875803188_cd6d181c.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771875803204_f2aeb8c8.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771875803210_d65f3f1a.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771875803218_e454a25d.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771875803223_d7a64815.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771875803227_7e56da5b.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771875803235_4fbf93b4.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771875803243_47931c71.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771875803258_3816f3fe.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771875803268_8061140e.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771875803326_ae6f9c78.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771875808396_cbde0a6c.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771875812026_aa2442bb.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771875815431_c2c656c5.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771875818645_3a4dbf02.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771891934403_24923c03.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891934421_dca16e24.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891934430_057706f7.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891934442_faf97382.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891934454_5542ecd5.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891934464_12202a08.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891934487_94378275.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891934503_ca728c13.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891934519_100af69a.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891934536_62ad39d9.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891934553_d6798a52.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891939537_541c8096.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771891942985_36ab9a4d.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771891946453_e8a6e05f.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771891949838_5de0de84.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771891957807_0ecfb4f4.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891957827_c4539239.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891957836_91168b48.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891957848_8c5cad0b.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891957857_0986b293.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891957872_8a3113af.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891957884_0bb85208.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891957892_86c75e2e.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891957907_98ca0e6f.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891957918_d9091231.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891957931_dcaf77ed.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891962931_eb1fdee2.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771891966262_9061a93f.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771891969915_1adaba19.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771891973588_f08b79e9.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771891982421_f1985bce.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891982432_e7a84163.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891982447_369b842a.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891982469_5fc45199.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891982495_454c7cb3.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891982514_08098e03.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891982526_b351d778.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891982533_fa542d83.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891982540_18ab24dc.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891982544_5b4fa163.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891982548_c13f089a.json +80 -0
- package/packages/sdk/.trajectories/completed/traj_1771891987510_23f6da1f.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771891991466_912c2e04.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771891994891_60604be2.json +91 -0
- package/packages/sdk/.trajectories/completed/traj_1771891998370_cfaf9b8b.json +91 -0
- package/packages/sdk/README.md +68 -838
- package/packages/sdk/bin/agent-relay-broker +0 -0
- package/packages/sdk/dist/__tests__/contract-fixtures.test.d.ts +2 -0
- package/packages/sdk/dist/__tests__/contract-fixtures.test.d.ts.map +1 -0
- package/packages/sdk/dist/__tests__/contract-fixtures.test.js +85 -0
- package/packages/sdk/dist/__tests__/contract-fixtures.test.js.map +1 -0
- package/packages/sdk/dist/__tests__/facade.test.js +257 -0
- package/packages/sdk/dist/__tests__/facade.test.js.map +1 -0
- package/packages/sdk/dist/__tests__/integration.test.js +164 -0
- package/packages/sdk/dist/__tests__/integration.test.js.map +1 -0
- package/packages/sdk/dist/__tests__/pty.test.d.ts +2 -0
- package/packages/sdk/dist/__tests__/pty.test.d.ts.map +1 -0
- package/packages/sdk/dist/__tests__/pty.test.js +20 -0
- package/packages/sdk/dist/__tests__/pty.test.js.map +1 -0
- package/packages/sdk/dist/__tests__/quickstart.test.js +176 -0
- package/packages/sdk/dist/__tests__/quickstart.test.js.map +1 -0
- package/packages/sdk/dist/__tests__/spawn-from-env.test.d.ts +2 -0
- package/packages/sdk/dist/__tests__/spawn-from-env.test.d.ts.map +1 -0
- package/packages/sdk/dist/__tests__/spawn-from-env.test.js +206 -0
- package/packages/sdk/dist/__tests__/spawn-from-env.test.js.map +1 -0
- package/packages/sdk/dist/__tests__/unit.test.js +311 -0
- package/packages/sdk/dist/__tests__/unit.test.js.map +1 -0
- package/packages/sdk/dist/client.d.ts +138 -526
- package/packages/sdk/dist/client.d.ts.map +1 -1
- package/packages/sdk/dist/client.js +407 -1509
- package/packages/sdk/dist/client.js.map +1 -1
- package/packages/sdk/dist/examples/workflow-superiority.d.ts +32 -0
- package/packages/sdk/dist/examples/workflow-superiority.d.ts.map +1 -0
- package/packages/sdk/dist/examples/workflow-superiority.js +1421 -0
- package/packages/sdk/dist/examples/workflow-superiority.js.map +1 -0
- package/packages/sdk/dist/index.d.ts +13 -20
- package/packages/sdk/dist/index.d.ts.map +1 -1
- package/packages/sdk/dist/index.js +12 -26
- package/packages/sdk/dist/index.js.map +1 -1
- package/packages/sdk/dist/logs.d.ts +70 -25
- package/packages/sdk/dist/logs.d.ts.map +1 -1
- package/packages/sdk/dist/logs.js +238 -42
- package/packages/sdk/dist/logs.js.map +1 -1
- package/packages/sdk/dist/models.d.ts +9 -0
- package/packages/sdk/dist/models.d.ts.map +1 -0
- package/packages/sdk/dist/models.js +17 -0
- package/packages/sdk/dist/models.js.map +1 -0
- package/packages/sdk/dist/protocol.d.ts +366 -0
- package/packages/sdk/dist/protocol.d.ts.map +1 -0
- package/packages/sdk/dist/pty.d.ts.map +1 -0
- package/packages/sdk/dist/pty.js +26 -0
- package/packages/sdk/dist/pty.js.map +1 -0
- package/packages/sdk/dist/relay-adapter.d.ts +139 -0
- package/packages/sdk/dist/relay-adapter.d.ts.map +1 -0
- package/packages/sdk/dist/relay-adapter.js +210 -0
- package/packages/sdk/dist/relay-adapter.js.map +1 -0
- package/packages/sdk/dist/relay.d.ts +277 -0
- package/packages/sdk/dist/relay.d.ts.map +1 -0
- package/packages/sdk/dist/relay.js +853 -0
- package/packages/sdk/dist/relay.js.map +1 -0
- package/packages/sdk/dist/shadow.d.ts +101 -0
- package/packages/sdk/dist/shadow.d.ts.map +1 -0
- package/packages/sdk/dist/shadow.js.map +1 -0
- package/packages/sdk/dist/spawn-from-env.d.ts +77 -0
- package/packages/sdk/dist/spawn-from-env.d.ts.map +1 -0
- package/packages/sdk/dist/spawn-from-env.js +172 -0
- package/packages/sdk/dist/spawn-from-env.js.map +1 -0
- package/packages/sdk/dist/workflows/builder.d.ts +114 -0
- package/packages/sdk/dist/workflows/builder.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/builder.js +201 -0
- package/packages/sdk/dist/workflows/builder.js.map +1 -0
- package/packages/sdk/dist/workflows/cli.d.ts +11 -0
- package/packages/sdk/dist/workflows/cli.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/cli.js +144 -0
- package/packages/sdk/dist/workflows/cli.js.map +1 -0
- package/packages/sdk/dist/workflows/coordinator.d.ts +73 -0
- package/packages/sdk/dist/workflows/coordinator.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/coordinator.js +647 -0
- package/packages/sdk/dist/workflows/coordinator.js.map +1 -0
- package/packages/sdk/dist/workflows/custom-steps.d.ts +73 -0
- package/packages/sdk/dist/workflows/custom-steps.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/custom-steps.js +321 -0
- package/packages/sdk/dist/workflows/custom-steps.js.map +1 -0
- package/packages/sdk/dist/workflows/dry-run-format.d.ts +6 -0
- package/packages/sdk/dist/workflows/dry-run-format.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/dry-run-format.js +68 -0
- package/packages/sdk/dist/workflows/dry-run-format.js.map +1 -0
- package/packages/sdk/dist/workflows/file-db.d.ts +33 -0
- package/packages/sdk/dist/workflows/file-db.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/file-db.js +108 -0
- package/packages/sdk/dist/workflows/file-db.js.map +1 -0
- package/packages/sdk/dist/workflows/index.d.ts +15 -0
- package/packages/sdk/dist/workflows/index.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/index.js +15 -0
- package/packages/sdk/dist/workflows/index.js.map +1 -0
- package/packages/sdk/dist/workflows/run.d.ts +38 -0
- package/packages/sdk/dist/workflows/run.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/run.js +25 -0
- package/packages/sdk/dist/workflows/run.js.map +1 -0
- package/packages/sdk/dist/workflows/runner.d.ts +320 -0
- package/packages/sdk/dist/workflows/runner.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/runner.js +2821 -0
- package/packages/sdk/dist/workflows/runner.js.map +1 -0
- package/packages/sdk/dist/workflows/templates.d.ts +47 -0
- package/packages/sdk/dist/workflows/templates.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/templates.js +405 -0
- package/packages/sdk/dist/workflows/templates.js.map +1 -0
- package/packages/sdk/dist/workflows/trajectory.d.ts +87 -0
- package/packages/sdk/dist/workflows/trajectory.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/trajectory.js +441 -0
- package/packages/sdk/dist/workflows/trajectory.js.map +1 -0
- package/packages/sdk/dist/workflows/types.d.ts +306 -0
- package/packages/sdk/dist/workflows/types.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/types.js +23 -0
- package/packages/sdk/dist/workflows/types.js.map +1 -0
- package/packages/sdk/dist/workflows/validator.d.ts +11 -0
- package/packages/sdk/dist/workflows/validator.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/validator.js +128 -0
- package/packages/sdk/dist/workflows/validator.js.map +1 -0
- package/packages/sdk/package.json +59 -53
- package/packages/sdk/scripts/bundle-agent-relay.mjs +53 -0
- package/packages/sdk/src/__tests__/contract-fixtures.test.ts +122 -0
- package/packages/sdk/src/__tests__/error-scenarios.test.ts +682 -0
- package/packages/sdk/src/__tests__/facade.test.ts +296 -0
- package/packages/sdk/src/__tests__/idle-nudge.test.ts +438 -0
- package/packages/sdk/src/__tests__/integration.test.ts +199 -0
- package/packages/sdk/src/__tests__/orchestration-upgrades.test.ts +797 -0
- package/packages/sdk/src/__tests__/pty.test.ts +24 -0
- package/packages/sdk/src/__tests__/quickstart.test.ts +198 -0
- package/packages/sdk/src/__tests__/spawn-from-env.test.ts +282 -0
- package/packages/sdk/src/__tests__/swarm-coordinator.test.ts +909 -0
- package/packages/sdk/src/__tests__/unit.test.ts +391 -0
- package/packages/sdk/src/__tests__/workflow-runner.test.ts +489 -0
- package/packages/sdk/src/__tests__/yaml-validation.test.ts +890 -0
- package/packages/sdk/src/client.ts +505 -1913
- package/packages/sdk/src/examples/workflow-superiority.ts +1485 -0
- package/packages/sdk/src/examples/workflows/README.md +156 -0
- package/packages/sdk/src/examples/workflows/ralph-overnight.yaml +421 -0
- package/packages/sdk/src/examples/workflows/ralph-swarm.yaml +411 -0
- package/packages/sdk/src/examples/workflows/ralph-tdd.yaml +259 -0
- package/packages/sdk/src/index.ts +13 -116
- package/packages/sdk/src/logs.ts +282 -54
- package/packages/sdk/src/models.ts +36 -0
- package/packages/sdk/src/protocol.ts +385 -0
- package/packages/sdk/src/pty.ts +35 -0
- package/packages/sdk/src/relay-adapter.ts +316 -0
- package/packages/sdk/src/relay.ts +1076 -0
- package/packages/sdk/src/shadow.ts +228 -0
- package/packages/sdk/src/spawn-from-env.ts +245 -0
- package/packages/sdk/src/workflows/README.md +656 -0
- package/packages/sdk/src/workflows/builder.ts +278 -0
- package/packages/sdk/src/workflows/builtin-templates/bug-fix.yaml +135 -0
- package/packages/sdk/src/workflows/builtin-templates/code-review.yaml +133 -0
- package/packages/sdk/src/workflows/builtin-templates/competitive.yaml +103 -0
- package/packages/sdk/src/workflows/builtin-templates/documentation.yaml +120 -0
- package/packages/sdk/src/workflows/builtin-templates/feature-dev.yaml +142 -0
- package/packages/sdk/src/workflows/builtin-templates/refactor.yaml +141 -0
- package/packages/sdk/src/workflows/builtin-templates/review-loop.yaml +223 -0
- package/packages/sdk/src/workflows/builtin-templates/security-audit.yaml +129 -0
- package/packages/sdk/src/workflows/cli.ts +162 -0
- package/packages/sdk/src/workflows/coordinator.ts +842 -0
- package/packages/sdk/src/workflows/custom-steps.ts +450 -0
- package/packages/sdk/src/workflows/dry-run-format.ts +75 -0
- package/packages/sdk/src/workflows/file-db.ts +117 -0
- package/packages/sdk/src/workflows/index.ts +24 -0
- package/packages/sdk/src/workflows/run.ts +72 -0
- package/packages/sdk/src/workflows/runner.ts +3409 -0
- package/packages/sdk/src/workflows/schema.json +651 -0
- package/packages/sdk/src/workflows/templates.ts +552 -0
- package/packages/sdk/src/workflows/trajectory.ts +631 -0
- package/packages/sdk/src/workflows/types.ts +389 -0
- package/packages/sdk/src/workflows/validator.ts +151 -0
- package/packages/sdk/tsconfig.build.json +25 -0
- package/packages/sdk/tsconfig.json +17 -18
- package/packages/sdk/vitest.config.ts +1 -1
- package/packages/sdk-py/README.md +106 -21
- package/packages/sdk-py/agent_relay/__init__.py +21 -0
- package/packages/sdk-py/agent_relay/models.py +206 -0
- package/packages/sdk-py/pyproject.toml +1 -1
- package/packages/sdk-py/src/agent_relay/__init__.py +76 -0
- package/packages/sdk-py/src/agent_relay/builder.py +430 -109
- package/packages/sdk-py/src/agent_relay/templates.py +197 -0
- package/packages/sdk-py/src/agent_relay/types.py +489 -15
- package/packages/sdk-py/tests/test_builder.py +115 -1
- package/packages/sdk-py/tests/test_workflow_templates.py +450 -0
- package/packages/shared/cli-registry.yaml +193 -0
- package/packages/shared/codegen-py.mjs +215 -0
- package/packages/shared/codegen-ts.mjs +227 -0
- package/packages/telemetry/dist/events.d.ts +8 -8
- package/packages/telemetry/dist/index.d.ts +1 -1
- package/packages/telemetry/package.json +2 -2
- package/packages/telemetry/src/events.ts +9 -9
- package/packages/telemetry/src/index.ts +2 -2
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/dist/user-directory.js +1 -1
- package/packages/user-directory/dist/user-directory.js.map +1 -1
- package/packages/user-directory/package.json +2 -2
- package/packages/user-directory/src/user-directory.ts +1 -1
- package/packages/utils/dist/cjs/client-helpers.js +4 -4
- package/packages/utils/dist/cjs/discovery.js +9 -6
- package/packages/utils/dist/cjs/errors.js +5 -5
- package/packages/utils/dist/cjs/legacy-protocol.js +70 -0
- package/packages/utils/dist/cjs/logger.js +3 -3
- package/packages/utils/dist/cjs/precompiled-patterns.js +33 -2
- package/packages/utils/dist/cjs/relay-pty-path.js +0 -6
- package/packages/utils/dist/client-helpers.d.ts +1 -1
- package/packages/utils/dist/client-helpers.d.ts.map +1 -1
- package/packages/utils/dist/client-helpers.js +1 -1
- package/packages/utils/dist/client-helpers.js.map +1 -1
- package/packages/utils/dist/discovery.d.ts +7 -7
- package/packages/utils/dist/discovery.d.ts.map +1 -1
- package/packages/utils/dist/discovery.js +20 -17
- package/packages/utils/dist/discovery.js.map +1 -1
- package/packages/utils/dist/errors.d.ts +1 -1
- package/packages/utils/dist/errors.js +3 -3
- package/packages/utils/dist/legacy-protocol.d.ts +46 -0
- package/packages/utils/dist/legacy-protocol.d.ts.map +1 -0
- package/packages/utils/dist/legacy-protocol.js +47 -0
- package/packages/utils/dist/legacy-protocol.js.map +1 -0
- package/packages/utils/dist/logger.d.ts +2 -2
- package/packages/utils/dist/logger.js +2 -2
- package/packages/utils/dist/precompiled-patterns.d.ts.map +1 -1
- package/packages/utils/dist/precompiled-patterns.js +28 -2
- package/packages/utils/dist/precompiled-patterns.js.map +1 -1
- package/packages/utils/dist/relay-pty-path.d.ts.map +1 -1
- package/packages/utils/dist/relay-pty-path.js +1 -10
- package/packages/utils/dist/relay-pty-path.js.map +1 -1
- package/packages/utils/package.json +2 -3
- package/packages/utils/src/client-helpers.ts +1 -1
- package/packages/utils/src/consolidation.test.ts +3 -3
- package/packages/utils/src/discovery.test.ts +3 -3
- package/packages/utils/src/discovery.ts +21 -18
- package/packages/utils/src/errors.test.ts +6 -11
- package/packages/utils/src/errors.ts +3 -3
- package/packages/utils/src/legacy-protocol.ts +151 -0
- package/packages/utils/src/logger.ts +2 -2
- package/packages/utils/src/precompiled-patterns.test.ts +8 -0
- package/packages/utils/src/precompiled-patterns.ts +40 -2
- package/packages/utils/src/relay-pty-path.test.ts +23 -34
- package/packages/utils/src/relay-pty-path.ts +1 -11
- package/relay-snippets/agent-relay-protocol.md +6 -43
- package/relay-snippets/agent-relay-snippet.md +59 -203
- package/scripts/postinstall.js +10 -10
- package/bin/relay-pty-darwin-arm64 +0 -0
- package/bin/relay-pty-darwin-x64 +0 -0
- package/bin/relay-pty-linux-arm64 +0 -0
- package/bin/relay-pty-linux-x64 +0 -0
- package/dist/src/bridge/index.d.ts +0 -8
- package/dist/src/bridge/index.d.ts.map +0 -1
- package/dist/src/bridge/index.js +0 -8
- package/dist/src/bridge/index.js.map +0 -1
- package/dist/src/continuity/index.d.ts +0 -5
- package/dist/src/continuity/index.d.ts.map +0 -1
- package/dist/src/continuity/index.js +0 -5
- package/dist/src/continuity/index.js.map +0 -1
- package/dist/src/daemon/index.d.ts +0 -8
- package/dist/src/daemon/index.d.ts.map +0 -1
- package/dist/src/daemon/index.js +0 -9
- package/dist/src/daemon/index.js.map +0 -1
- package/dist/src/protocol/index.d.ts +0 -8
- package/dist/src/protocol/index.d.ts.map +0 -1
- package/dist/src/protocol/index.js +0 -8
- package/dist/src/protocol/index.js.map +0 -1
- package/dist/src/resiliency/index.d.ts +0 -5
- package/dist/src/resiliency/index.d.ts.map +0 -1
- package/dist/src/resiliency/index.js +0 -5
- package/dist/src/resiliency/index.js.map +0 -1
- package/dist/src/state/index.d.ts +0 -5
- package/dist/src/state/index.d.ts.map +0 -1
- package/dist/src/state/index.js +0 -5
- package/dist/src/state/index.js.map +0 -1
- package/dist/src/storage/index.d.ts +0 -8
- package/dist/src/storage/index.d.ts.map +0 -1
- package/dist/src/storage/index.js +0 -8
- package/dist/src/storage/index.js.map +0 -1
- package/dist/src/wrapper/index.d.ts +0 -8
- package/dist/src/wrapper/index.d.ts.map +0 -1
- package/dist/src/wrapper/index.js +0 -11
- package/dist/src/wrapper/index.js.map +0 -1
- package/packages/bridge/dist/cli-resolution.d.ts +0 -32
- package/packages/bridge/dist/cli-resolution.d.ts.map +0 -1
- package/packages/bridge/dist/cli-resolution.js +0 -88
- package/packages/bridge/dist/cli-resolution.js.map +0 -1
- package/packages/bridge/dist/index.d.ts +0 -9
- package/packages/bridge/dist/index.d.ts.map +0 -1
- package/packages/bridge/dist/index.js +0 -11
- package/packages/bridge/dist/index.js.map +0 -1
- package/packages/bridge/dist/multi-project-client.d.ts +0 -99
- package/packages/bridge/dist/multi-project-client.d.ts.map +0 -1
- package/packages/bridge/dist/multi-project-client.js +0 -389
- package/packages/bridge/dist/multi-project-client.js.map +0 -1
- package/packages/bridge/dist/shadow-cli.d.ts +0 -17
- package/packages/bridge/dist/shadow-cli.d.ts.map +0 -1
- package/packages/bridge/dist/shadow-cli.js +0 -75
- package/packages/bridge/dist/shadow-cli.js.map +0 -1
- package/packages/bridge/dist/spawner.d.ts +0 -263
- package/packages/bridge/dist/spawner.d.ts.map +0 -1
- package/packages/bridge/dist/spawner.js +0 -1758
- package/packages/bridge/dist/spawner.js.map +0 -1
- package/packages/bridge/dist/types.d.ts +0 -141
- package/packages/bridge/dist/types.d.ts.map +0 -1
- package/packages/bridge/dist/types.js +0 -6
- package/packages/bridge/dist/types.js.map +0 -1
- package/packages/bridge/dist/utils.d.ts +0 -39
- package/packages/bridge/dist/utils.d.ts.map +0 -1
- package/packages/bridge/dist/utils.js +0 -98
- package/packages/bridge/dist/utils.js.map +0 -1
- package/packages/bridge/package.json +0 -45
- package/packages/bridge/src/cli-resolution.test.ts +0 -225
- package/packages/bridge/src/cli-resolution.ts +0 -100
- package/packages/bridge/src/index.ts +0 -34
- package/packages/bridge/src/multi-project-client.test.ts +0 -340
- package/packages/bridge/src/multi-project-client.ts +0 -469
- package/packages/bridge/src/shadow-cli.ts +0 -95
- package/packages/bridge/src/spawner-mcp.test.ts +0 -505
- package/packages/bridge/src/spawner.ts +0 -2067
- package/packages/bridge/src/types.ts +0 -153
- package/packages/bridge/src/utils.test.ts +0 -235
- package/packages/bridge/src/utils.ts +0 -113
- package/packages/bridge/tsconfig.json +0 -29
- package/packages/bridge/vitest.config.ts +0 -9
- package/packages/broker-sdk/README.md +0 -97
- package/packages/broker-sdk/dist/__tests__/facade.test.js +0 -257
- package/packages/broker-sdk/dist/__tests__/facade.test.js.map +0 -1
- package/packages/broker-sdk/dist/__tests__/integration.test.js +0 -139
- package/packages/broker-sdk/dist/__tests__/integration.test.js.map +0 -1
- package/packages/broker-sdk/dist/__tests__/quickstart.test.js +0 -176
- package/packages/broker-sdk/dist/__tests__/quickstart.test.js.map +0 -1
- package/packages/broker-sdk/dist/__tests__/unit.test.js +0 -192
- package/packages/broker-sdk/dist/__tests__/unit.test.js.map +0 -1
- package/packages/broker-sdk/dist/client.d.ts +0 -95
- package/packages/broker-sdk/dist/client.d.ts.map +0 -1
- package/packages/broker-sdk/dist/client.js +0 -372
- package/packages/broker-sdk/dist/client.js.map +0 -1
- package/packages/broker-sdk/dist/index.d.ts +0 -10
- package/packages/broker-sdk/dist/index.d.ts.map +0 -1
- package/packages/broker-sdk/dist/index.js +0 -10
- package/packages/broker-sdk/dist/index.js.map +0 -1
- package/packages/broker-sdk/dist/logs.d.ts +0 -47
- package/packages/broker-sdk/dist/logs.d.ts.map +0 -1
- package/packages/broker-sdk/dist/logs.js +0 -137
- package/packages/broker-sdk/dist/logs.js.map +0 -1
- package/packages/broker-sdk/dist/protocol.d.ts +0 -258
- package/packages/broker-sdk/dist/protocol.d.ts.map +0 -1
- package/packages/broker-sdk/dist/pty.d.ts.map +0 -1
- package/packages/broker-sdk/dist/pty.js +0 -14
- package/packages/broker-sdk/dist/pty.js.map +0 -1
- package/packages/broker-sdk/dist/relay.d.ts +0 -178
- package/packages/broker-sdk/dist/relay.d.ts.map +0 -1
- package/packages/broker-sdk/dist/relay.js +0 -494
- package/packages/broker-sdk/dist/relay.js.map +0 -1
- package/packages/broker-sdk/dist/relaycast.d.ts +0 -73
- package/packages/broker-sdk/dist/relaycast.d.ts.map +0 -1
- package/packages/broker-sdk/dist/relaycast.js +0 -184
- package/packages/broker-sdk/dist/relaycast.js.map +0 -1
- package/packages/broker-sdk/dist/shadow.d.ts +0 -100
- package/packages/broker-sdk/dist/shadow.d.ts.map +0 -1
- package/packages/broker-sdk/dist/shadow.js.map +0 -1
- package/packages/broker-sdk/dist/workflows/builder.d.ts +0 -101
- package/packages/broker-sdk/dist/workflows/builder.d.ts.map +0 -1
- package/packages/broker-sdk/dist/workflows/builder.js +0 -179
- package/packages/broker-sdk/dist/workflows/builder.js.map +0 -1
- package/packages/broker-sdk/dist/workflows/cli.d.ts +0 -10
- package/packages/broker-sdk/dist/workflows/cli.d.ts.map +0 -1
- package/packages/broker-sdk/dist/workflows/cli.js +0 -82
- package/packages/broker-sdk/dist/workflows/cli.js.map +0 -1
- package/packages/broker-sdk/dist/workflows/coordinator.d.ts +0 -69
- package/packages/broker-sdk/dist/workflows/coordinator.d.ts.map +0 -1
- package/packages/broker-sdk/dist/workflows/coordinator.js +0 -585
- package/packages/broker-sdk/dist/workflows/coordinator.js.map +0 -1
- package/packages/broker-sdk/dist/workflows/index.d.ts +0 -11
- package/packages/broker-sdk/dist/workflows/index.d.ts.map +0 -1
- package/packages/broker-sdk/dist/workflows/index.js +0 -11
- package/packages/broker-sdk/dist/workflows/index.js.map +0 -1
- package/packages/broker-sdk/dist/workflows/run.d.ts +0 -33
- package/packages/broker-sdk/dist/workflows/run.d.ts.map +0 -1
- package/packages/broker-sdk/dist/workflows/run.js +0 -28
- package/packages/broker-sdk/dist/workflows/run.js.map +0 -1
- package/packages/broker-sdk/dist/workflows/runner.d.ts +0 -140
- package/packages/broker-sdk/dist/workflows/runner.d.ts.map +0 -1
- package/packages/broker-sdk/dist/workflows/runner.js +0 -962
- package/packages/broker-sdk/dist/workflows/runner.js.map +0 -1
- package/packages/broker-sdk/dist/workflows/templates.d.ts +0 -47
- package/packages/broker-sdk/dist/workflows/templates.d.ts.map +0 -1
- package/packages/broker-sdk/dist/workflows/templates.js +0 -395
- package/packages/broker-sdk/dist/workflows/templates.js.map +0 -1
- package/packages/broker-sdk/dist/workflows/trajectory.d.ts +0 -80
- package/packages/broker-sdk/dist/workflows/trajectory.d.ts.map +0 -1
- package/packages/broker-sdk/dist/workflows/trajectory.js +0 -362
- package/packages/broker-sdk/dist/workflows/trajectory.js.map +0 -1
- package/packages/broker-sdk/dist/workflows/types.d.ts +0 -140
- package/packages/broker-sdk/dist/workflows/types.d.ts.map +0 -1
- package/packages/broker-sdk/dist/workflows/types.js +0 -8
- package/packages/broker-sdk/dist/workflows/types.js.map +0 -1
- package/packages/broker-sdk/package.json +0 -81
- package/packages/broker-sdk/scripts/bundle-agent-relay.mjs +0 -53
- package/packages/broker-sdk/src/__tests__/error-scenarios.test.ts +0 -682
- package/packages/broker-sdk/src/__tests__/facade.test.ts +0 -296
- package/packages/broker-sdk/src/__tests__/integration.test.ts +0 -170
- package/packages/broker-sdk/src/__tests__/quickstart.test.ts +0 -198
- package/packages/broker-sdk/src/__tests__/swarm-coordinator.test.ts +0 -772
- package/packages/broker-sdk/src/__tests__/unit.test.ts +0 -243
- package/packages/broker-sdk/src/__tests__/workflow-runner.test.ts +0 -333
- package/packages/broker-sdk/src/client.ts +0 -510
- package/packages/broker-sdk/src/index.ts +0 -9
- package/packages/broker-sdk/src/logs.ts +0 -163
- package/packages/broker-sdk/src/protocol.ts +0 -276
- package/packages/broker-sdk/src/pty.ts +0 -16
- package/packages/broker-sdk/src/relay.ts +0 -625
- package/packages/broker-sdk/src/relaycast.ts +0 -221
- package/packages/broker-sdk/src/shadow.ts +0 -230
- package/packages/broker-sdk/src/workflows/README.md +0 -544
- package/packages/broker-sdk/src/workflows/builder.ts +0 -241
- package/packages/broker-sdk/src/workflows/builtin-templates/bug-fix.yaml +0 -75
- package/packages/broker-sdk/src/workflows/builtin-templates/code-review.yaml +0 -82
- package/packages/broker-sdk/src/workflows/builtin-templates/documentation.yaml +0 -70
- package/packages/broker-sdk/src/workflows/builtin-templates/feature-dev.yaml +0 -76
- package/packages/broker-sdk/src/workflows/builtin-templates/refactor.yaml +0 -82
- package/packages/broker-sdk/src/workflows/builtin-templates/security-audit.yaml +0 -84
- package/packages/broker-sdk/src/workflows/cli.ts +0 -93
- package/packages/broker-sdk/src/workflows/coordinator.ts +0 -758
- package/packages/broker-sdk/src/workflows/index.ts +0 -10
- package/packages/broker-sdk/src/workflows/run.ts +0 -55
- package/packages/broker-sdk/src/workflows/runner.ts +0 -1271
- package/packages/broker-sdk/src/workflows/schema.json +0 -333
- package/packages/broker-sdk/src/workflows/templates.ts +0 -544
- package/packages/broker-sdk/src/workflows/trajectory.ts +0 -507
- package/packages/broker-sdk/src/workflows/types.ts +0 -208
- package/packages/broker-sdk/tsconfig.json +0 -22
- package/packages/broker-sdk/vitest.config.ts +0 -9
- package/packages/continuity/dist/formatter.d.ts +0 -57
- package/packages/continuity/dist/formatter.d.ts.map +0 -1
- package/packages/continuity/dist/formatter.js +0 -448
- package/packages/continuity/dist/formatter.js.map +0 -1
- package/packages/continuity/dist/handoff-store.d.ts +0 -67
- package/packages/continuity/dist/handoff-store.d.ts.map +0 -1
- package/packages/continuity/dist/handoff-store.js +0 -472
- package/packages/continuity/dist/handoff-store.js.map +0 -1
- package/packages/continuity/dist/index.d.ts +0 -10
- package/packages/continuity/dist/index.d.ts.map +0 -1
- package/packages/continuity/dist/index.js +0 -11
- package/packages/continuity/dist/index.js.map +0 -1
- package/packages/continuity/dist/ledger-store.d.ts +0 -110
- package/packages/continuity/dist/ledger-store.d.ts.map +0 -1
- package/packages/continuity/dist/ledger-store.js +0 -500
- package/packages/continuity/dist/ledger-store.js.map +0 -1
- package/packages/continuity/dist/manager.d.ts +0 -183
- package/packages/continuity/dist/manager.d.ts.map +0 -1
- package/packages/continuity/dist/manager.js +0 -616
- package/packages/continuity/dist/manager.js.map +0 -1
- package/packages/continuity/dist/parser.d.ts +0 -76
- package/packages/continuity/dist/parser.d.ts.map +0 -1
- package/packages/continuity/dist/parser.js +0 -579
- package/packages/continuity/dist/parser.js.map +0 -1
- package/packages/continuity/dist/types.d.ts +0 -180
- package/packages/continuity/dist/types.d.ts.map +0 -1
- package/packages/continuity/dist/types.js +0 -2
- package/packages/continuity/dist/types.js.map +0 -1
- package/packages/continuity/package.json +0 -40
- package/packages/continuity/src/formatter.ts +0 -536
- package/packages/continuity/src/handoff-store.ts +0 -523
- package/packages/continuity/src/index.ts +0 -12
- package/packages/continuity/src/ledger-store.ts +0 -594
- package/packages/continuity/src/manager.test.ts +0 -291
- package/packages/continuity/src/manager.ts +0 -774
- package/packages/continuity/src/parser.test.ts +0 -292
- package/packages/continuity/src/parser.ts +0 -680
- package/packages/continuity/src/types.ts +0 -211
- package/packages/continuity/tsconfig.json +0 -21
- package/packages/continuity/vitest.config.ts +0 -9
- package/packages/daemon/dist/agent-manager.d.ts +0 -134
- package/packages/daemon/dist/agent-manager.d.ts.map +0 -1
- package/packages/daemon/dist/agent-manager.js +0 -578
- package/packages/daemon/dist/agent-manager.js.map +0 -1
- package/packages/daemon/dist/agent-registry.d.ts +0 -99
- package/packages/daemon/dist/agent-registry.d.ts.map +0 -1
- package/packages/daemon/dist/agent-registry.js +0 -213
- package/packages/daemon/dist/agent-registry.js.map +0 -1
- package/packages/daemon/dist/agent-signing.d.ts +0 -158
- package/packages/daemon/dist/agent-signing.d.ts.map +0 -1
- package/packages/daemon/dist/agent-signing.js +0 -523
- package/packages/daemon/dist/agent-signing.js.map +0 -1
- package/packages/daemon/dist/api.d.ts +0 -106
- package/packages/daemon/dist/api.d.ts.map +0 -1
- package/packages/daemon/dist/api.js +0 -895
- package/packages/daemon/dist/api.js.map +0 -1
- package/packages/daemon/dist/auth.d.ts +0 -94
- package/packages/daemon/dist/auth.d.ts.map +0 -1
- package/packages/daemon/dist/auth.js +0 -197
- package/packages/daemon/dist/auth.js.map +0 -1
- package/packages/daemon/dist/channel-membership-store.d.ts +0 -55
- package/packages/daemon/dist/channel-membership-store.d.ts.map +0 -1
- package/packages/daemon/dist/channel-membership-store.js +0 -176
- package/packages/daemon/dist/channel-membership-store.js.map +0 -1
- package/packages/daemon/dist/cli-auth.d.ts +0 -97
- package/packages/daemon/dist/cli-auth.d.ts.map +0 -1
- package/packages/daemon/dist/cli-auth.js +0 -808
- package/packages/daemon/dist/cli-auth.js.map +0 -1
- package/packages/daemon/dist/cloud-sync.d.ts +0 -263
- package/packages/daemon/dist/cloud-sync.d.ts.map +0 -1
- package/packages/daemon/dist/cloud-sync.js +0 -820
- package/packages/daemon/dist/cloud-sync.js.map +0 -1
- package/packages/daemon/dist/connection.d.ts +0 -137
- package/packages/daemon/dist/connection.d.ts.map +0 -1
- package/packages/daemon/dist/connection.js +0 -465
- package/packages/daemon/dist/connection.js.map +0 -1
- package/packages/daemon/dist/consensus-integration.d.ts +0 -168
- package/packages/daemon/dist/consensus-integration.d.ts.map +0 -1
- package/packages/daemon/dist/consensus-integration.js +0 -371
- package/packages/daemon/dist/consensus-integration.js.map +0 -1
- package/packages/daemon/dist/consensus.d.ts +0 -269
- package/packages/daemon/dist/consensus.d.ts.map +0 -1
- package/packages/daemon/dist/consensus.js +0 -632
- package/packages/daemon/dist/consensus.js.map +0 -1
- package/packages/daemon/dist/delivery-tracker.d.ts +0 -34
- package/packages/daemon/dist/delivery-tracker.d.ts.map +0 -1
- package/packages/daemon/dist/delivery-tracker.js +0 -104
- package/packages/daemon/dist/delivery-tracker.js.map +0 -1
- package/packages/daemon/dist/enhanced-features.d.ts +0 -118
- package/packages/daemon/dist/enhanced-features.d.ts.map +0 -1
- package/packages/daemon/dist/enhanced-features.js +0 -177
- package/packages/daemon/dist/enhanced-features.js.map +0 -1
- package/packages/daemon/dist/index.d.ts +0 -29
- package/packages/daemon/dist/index.d.ts.map +0 -1
- package/packages/daemon/dist/index.js +0 -34
- package/packages/daemon/dist/index.js.map +0 -1
- package/packages/daemon/dist/orchestrator.d.ts +0 -217
- package/packages/daemon/dist/orchestrator.d.ts.map +0 -1
- package/packages/daemon/dist/orchestrator.js +0 -1172
- package/packages/daemon/dist/orchestrator.js.map +0 -1
- package/packages/daemon/dist/rate-limiter.d.ts +0 -68
- package/packages/daemon/dist/rate-limiter.d.ts.map +0 -1
- package/packages/daemon/dist/rate-limiter.js +0 -130
- package/packages/daemon/dist/rate-limiter.js.map +0 -1
- package/packages/daemon/dist/registry.d.ts +0 -9
- package/packages/daemon/dist/registry.d.ts.map +0 -1
- package/packages/daemon/dist/registry.js +0 -9
- package/packages/daemon/dist/registry.js.map +0 -1
- package/packages/daemon/dist/repo-manager.d.ts +0 -116
- package/packages/daemon/dist/repo-manager.d.ts.map +0 -1
- package/packages/daemon/dist/repo-manager.js +0 -384
- package/packages/daemon/dist/repo-manager.js.map +0 -1
- package/packages/daemon/dist/router.d.ts +0 -389
- package/packages/daemon/dist/router.d.ts.map +0 -1
- package/packages/daemon/dist/router.js +0 -1607
- package/packages/daemon/dist/router.js.map +0 -1
- package/packages/daemon/dist/server.d.ts +0 -201
- package/packages/daemon/dist/server.d.ts.map +0 -1
- package/packages/daemon/dist/server.js +0 -1791
- package/packages/daemon/dist/server.js.map +0 -1
- package/packages/daemon/dist/spawn-manager.d.ts +0 -119
- package/packages/daemon/dist/spawn-manager.d.ts.map +0 -1
- package/packages/daemon/dist/spawn-manager.js +0 -319
- package/packages/daemon/dist/spawn-manager.js.map +0 -1
- package/packages/daemon/dist/sync-queue.d.ts +0 -116
- package/packages/daemon/dist/sync-queue.d.ts.map +0 -1
- package/packages/daemon/dist/sync-queue.js +0 -361
- package/packages/daemon/dist/sync-queue.js.map +0 -1
- package/packages/daemon/dist/types.d.ts +0 -133
- package/packages/daemon/dist/types.d.ts.map +0 -1
- package/packages/daemon/dist/types.js +0 -6
- package/packages/daemon/dist/types.js.map +0 -1
- package/packages/daemon/dist/workspace-manager.d.ts +0 -80
- package/packages/daemon/dist/workspace-manager.d.ts.map +0 -1
- package/packages/daemon/dist/workspace-manager.js +0 -314
- package/packages/daemon/dist/workspace-manager.js.map +0 -1
- package/packages/daemon/package.json +0 -56
- package/packages/daemon/src/agent-manager.ts +0 -679
- package/packages/daemon/src/agent-registry.ts +0 -284
- package/packages/daemon/src/agent-signing.ts +0 -707
- package/packages/daemon/src/api.ts +0 -1034
- package/packages/daemon/src/auth.ts +0 -276
- package/packages/daemon/src/channel-membership-store.ts +0 -217
- package/packages/daemon/src/cli-auth.ts +0 -945
- package/packages/daemon/src/cloud-sync.ts +0 -1100
- package/packages/daemon/src/connection.ts +0 -561
- package/packages/daemon/src/consensus-integration.ts +0 -510
- package/packages/daemon/src/consensus.ts +0 -848
- package/packages/daemon/src/delivery-tracker.ts +0 -145
- package/packages/daemon/src/enhanced-features.ts +0 -390
- package/packages/daemon/src/index.ts +0 -48
- package/packages/daemon/src/orchestrator.test.ts +0 -231
- package/packages/daemon/src/orchestrator.ts +0 -1376
- package/packages/daemon/src/rate-limiter.ts +0 -172
- package/packages/daemon/src/registry.ts +0 -8
- package/packages/daemon/src/repo-manager.ts +0 -468
- package/packages/daemon/src/router.test.ts +0 -181
- package/packages/daemon/src/router.ts +0 -1925
- package/packages/daemon/src/server.ts +0 -2051
- package/packages/daemon/src/spawn-manager-set-model.test.ts +0 -144
- package/packages/daemon/src/spawn-manager.ts +0 -415
- package/packages/daemon/src/sync-queue.ts +0 -477
- package/packages/daemon/src/types.ts +0 -158
- package/packages/daemon/src/workspace-manager.ts +0 -371
- package/packages/daemon/tsconfig.json +0 -21
- package/packages/daemon/vitest.config.ts +0 -9
- package/packages/mcp/CHANGELOG.md +0 -28
- package/packages/mcp/LICENSE +0 -190
- package/packages/mcp/README.md +0 -266
- package/packages/mcp/dist/bin.d.ts +0 -12
- package/packages/mcp/dist/bin.d.ts.map +0 -1
- package/packages/mcp/dist/bin.js +0 -179
- package/packages/mcp/dist/bin.js.map +0 -1
- package/packages/mcp/dist/client-adapter.d.ts +0 -164
- package/packages/mcp/dist/client-adapter.d.ts.map +0 -1
- package/packages/mcp/dist/client-adapter.js +0 -231
- package/packages/mcp/dist/client-adapter.js.map +0 -1
- package/packages/mcp/dist/cloud.d.ts +0 -13
- package/packages/mcp/dist/cloud.d.ts.map +0 -1
- package/packages/mcp/dist/cloud.js +0 -25
- package/packages/mcp/dist/cloud.js.map +0 -1
- package/packages/mcp/dist/errors.d.ts +0 -9
- package/packages/mcp/dist/errors.d.ts.map +0 -1
- package/packages/mcp/dist/errors.js +0 -9
- package/packages/mcp/dist/errors.js.map +0 -1
- package/packages/mcp/dist/file-transport.d.ts +0 -103
- package/packages/mcp/dist/file-transport.d.ts.map +0 -1
- package/packages/mcp/dist/file-transport.js +0 -204
- package/packages/mcp/dist/file-transport.js.map +0 -1
- package/packages/mcp/dist/hybrid-client.d.ts +0 -5
- package/packages/mcp/dist/hybrid-client.d.ts.map +0 -1
- package/packages/mcp/dist/hybrid-client.js +0 -23
- package/packages/mcp/dist/hybrid-client.js.map +0 -1
- package/packages/mcp/dist/index.d.ts +0 -11
- package/packages/mcp/dist/index.d.ts.map +0 -1
- package/packages/mcp/dist/index.js +0 -25
- package/packages/mcp/dist/index.js.map +0 -1
- package/packages/mcp/dist/install-cli.d.ts +0 -35
- package/packages/mcp/dist/install-cli.d.ts.map +0 -1
- package/packages/mcp/dist/install-cli.js +0 -157
- package/packages/mcp/dist/install-cli.js.map +0 -1
- package/packages/mcp/dist/install.d.ts +0 -123
- package/packages/mcp/dist/install.d.ts.map +0 -1
- package/packages/mcp/dist/install.js +0 -661
- package/packages/mcp/dist/install.js.map +0 -1
- package/packages/mcp/dist/prompts/index.d.ts +0 -2
- package/packages/mcp/dist/prompts/index.d.ts.map +0 -1
- package/packages/mcp/dist/prompts/index.js +0 -2
- package/packages/mcp/dist/prompts/index.js.map +0 -1
- package/packages/mcp/dist/prompts/protocol.d.ts +0 -11
- package/packages/mcp/dist/prompts/protocol.d.ts.map +0 -1
- package/packages/mcp/dist/prompts/protocol.js +0 -160
- package/packages/mcp/dist/prompts/protocol.js.map +0 -1
- package/packages/mcp/dist/resources/agents.d.ts +0 -11
- package/packages/mcp/dist/resources/agents.d.ts.map +0 -1
- package/packages/mcp/dist/resources/agents.js +0 -17
- package/packages/mcp/dist/resources/agents.js.map +0 -1
- package/packages/mcp/dist/resources/inbox.d.ts +0 -11
- package/packages/mcp/dist/resources/inbox.d.ts.map +0 -1
- package/packages/mcp/dist/resources/inbox.js +0 -17
- package/packages/mcp/dist/resources/inbox.js.map +0 -1
- package/packages/mcp/dist/resources/index.d.ts +0 -4
- package/packages/mcp/dist/resources/index.d.ts.map +0 -1
- package/packages/mcp/dist/resources/index.js +0 -4
- package/packages/mcp/dist/resources/index.js.map +0 -1
- package/packages/mcp/dist/resources/project.d.ts +0 -11
- package/packages/mcp/dist/resources/project.d.ts.map +0 -1
- package/packages/mcp/dist/resources/project.js +0 -21
- package/packages/mcp/dist/resources/project.js.map +0 -1
- package/packages/mcp/dist/server.d.ts +0 -23
- package/packages/mcp/dist/server.d.ts.map +0 -1
- package/packages/mcp/dist/server.js +0 -317
- package/packages/mcp/dist/server.js.map +0 -1
- package/packages/mcp/dist/simple.d.ts +0 -170
- package/packages/mcp/dist/simple.d.ts.map +0 -1
- package/packages/mcp/dist/simple.js +0 -120
- package/packages/mcp/dist/simple.js.map +0 -1
- package/packages/mcp/dist/tools/index.d.ts +0 -20
- package/packages/mcp/dist/tools/index.d.ts.map +0 -1
- package/packages/mcp/dist/tools/index.js +0 -20
- package/packages/mcp/dist/tools/index.js.map +0 -1
- package/packages/mcp/dist/tools/relay-broadcast.d.ts +0 -20
- package/packages/mcp/dist/tools/relay-broadcast.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-broadcast.js +0 -25
- package/packages/mcp/dist/tools/relay-broadcast.js.map +0 -1
- package/packages/mcp/dist/tools/relay-channel.d.ts +0 -75
- package/packages/mcp/dist/tools/relay-channel.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-channel.js +0 -124
- package/packages/mcp/dist/tools/relay-channel.js.map +0 -1
- package/packages/mcp/dist/tools/relay-connected.d.ts +0 -17
- package/packages/mcp/dist/tools/relay-connected.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-connected.js +0 -54
- package/packages/mcp/dist/tools/relay-connected.js.map +0 -1
- package/packages/mcp/dist/tools/relay-consensus.d.ts +0 -45
- package/packages/mcp/dist/tools/relay-consensus.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-consensus.js +0 -80
- package/packages/mcp/dist/tools/relay-consensus.js.map +0 -1
- package/packages/mcp/dist/tools/relay-continuity.d.ts +0 -35
- package/packages/mcp/dist/tools/relay-continuity.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-continuity.js +0 -101
- package/packages/mcp/dist/tools/relay-continuity.js.map +0 -1
- package/packages/mcp/dist/tools/relay-health.d.ts +0 -20
- package/packages/mcp/dist/tools/relay-health.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-health.js +0 -130
- package/packages/mcp/dist/tools/relay-health.js.map +0 -1
- package/packages/mcp/dist/tools/relay-inbox.d.ts +0 -26
- package/packages/mcp/dist/tools/relay-inbox.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-inbox.js +0 -58
- package/packages/mcp/dist/tools/relay-inbox.js.map +0 -1
- package/packages/mcp/dist/tools/relay-logs.d.ts +0 -20
- package/packages/mcp/dist/tools/relay-logs.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-logs.js +0 -90
- package/packages/mcp/dist/tools/relay-logs.js.map +0 -1
- package/packages/mcp/dist/tools/relay-messages.d.ts +0 -32
- package/packages/mcp/dist/tools/relay-messages.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-messages.js +0 -61
- package/packages/mcp/dist/tools/relay-messages.js.map +0 -1
- package/packages/mcp/dist/tools/relay-metrics.d.ts +0 -17
- package/packages/mcp/dist/tools/relay-metrics.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-metrics.js +0 -124
- package/packages/mcp/dist/tools/relay-metrics.js.map +0 -1
- package/packages/mcp/dist/tools/relay-release.d.ts +0 -20
- package/packages/mcp/dist/tools/relay-release.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-release.js +0 -44
- package/packages/mcp/dist/tools/relay-release.js.map +0 -1
- package/packages/mcp/dist/tools/relay-remove-agent.d.ts +0 -20
- package/packages/mcp/dist/tools/relay-remove-agent.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-remove-agent.js +0 -50
- package/packages/mcp/dist/tools/relay-remove-agent.js.map +0 -1
- package/packages/mcp/dist/tools/relay-send.d.ts +0 -29
- package/packages/mcp/dist/tools/relay-send.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-send.js +0 -73
- package/packages/mcp/dist/tools/relay-send.js.map +0 -1
- package/packages/mcp/dist/tools/relay-set-model.d.ts +0 -23
- package/packages/mcp/dist/tools/relay-set-model.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-set-model.js +0 -52
- package/packages/mcp/dist/tools/relay-set-model.js.map +0 -1
- package/packages/mcp/dist/tools/relay-shadow.d.ts +0 -30
- package/packages/mcp/dist/tools/relay-shadow.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-shadow.js +0 -55
- package/packages/mcp/dist/tools/relay-shadow.js.map +0 -1
- package/packages/mcp/dist/tools/relay-spawn.d.ts +0 -36
- package/packages/mcp/dist/tools/relay-spawn.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-spawn.js +0 -73
- package/packages/mcp/dist/tools/relay-spawn.js.map +0 -1
- package/packages/mcp/dist/tools/relay-status.d.ts +0 -11
- package/packages/mcp/dist/tools/relay-status.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-status.js +0 -43
- package/packages/mcp/dist/tools/relay-status.js.map +0 -1
- package/packages/mcp/dist/tools/relay-subscribe.d.ts +0 -27
- package/packages/mcp/dist/tools/relay-subscribe.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-subscribe.js +0 -49
- package/packages/mcp/dist/tools/relay-subscribe.js.map +0 -1
- package/packages/mcp/dist/tools/relay-who.d.ts +0 -20
- package/packages/mcp/dist/tools/relay-who.d.ts.map +0 -1
- package/packages/mcp/dist/tools/relay-who.js +0 -62
- package/packages/mcp/dist/tools/relay-who.js.map +0 -1
- package/packages/mcp/package.json +0 -82
- package/packages/mcp/src/bin.ts +0 -200
- package/packages/mcp/src/client-adapter.ts +0 -358
- package/packages/mcp/src/cloud.ts +0 -41
- package/packages/mcp/src/errors.ts +0 -17
- package/packages/mcp/src/file-transport.ts +0 -275
- package/packages/mcp/src/hybrid-client.ts +0 -25
- package/packages/mcp/src/index.ts +0 -143
- package/packages/mcp/src/install-cli.ts +0 -210
- package/packages/mcp/src/install.ts +0 -820
- package/packages/mcp/src/prompts/index.ts +0 -1
- package/packages/mcp/src/prompts/protocol.ts +0 -164
- package/packages/mcp/src/resources/agents.ts +0 -21
- package/packages/mcp/src/resources/inbox.ts +0 -21
- package/packages/mcp/src/resources/index.ts +0 -3
- package/packages/mcp/src/resources/project.ts +0 -29
- package/packages/mcp/src/server.ts +0 -475
- package/packages/mcp/src/simple.ts +0 -214
- package/packages/mcp/src/tools/index.ts +0 -155
- package/packages/mcp/src/tools/relay-broadcast.ts +0 -32
- package/packages/mcp/src/tools/relay-channel.ts +0 -151
- package/packages/mcp/src/tools/relay-connected.ts +0 -67
- package/packages/mcp/src/tools/relay-consensus.ts +0 -92
- package/packages/mcp/src/tools/relay-continuity.ts +0 -127
- package/packages/mcp/src/tools/relay-health.ts +0 -148
- package/packages/mcp/src/tools/relay-inbox.ts +0 -70
- package/packages/mcp/src/tools/relay-logs.ts +0 -106
- package/packages/mcp/src/tools/relay-messages.ts +0 -66
- package/packages/mcp/src/tools/relay-metrics.ts +0 -142
- package/packages/mcp/src/tools/relay-release.ts +0 -54
- package/packages/mcp/src/tools/relay-remove-agent.ts +0 -58
- package/packages/mcp/src/tools/relay-send.ts +0 -84
- package/packages/mcp/src/tools/relay-set-model.ts +0 -62
- package/packages/mcp/src/tools/relay-shadow.ts +0 -67
- package/packages/mcp/src/tools/relay-spawn.ts +0 -87
- package/packages/mcp/src/tools/relay-status.ts +0 -57
- package/packages/mcp/src/tools/relay-subscribe.ts +0 -61
- package/packages/mcp/src/tools/relay-who.ts +0 -75
- package/packages/mcp/tests/client.test.ts +0 -451
- package/packages/mcp/tests/discover.test.ts +0 -256
- package/packages/mcp/tests/install.test.ts +0 -123
- package/packages/mcp/tests/prompts.test.ts +0 -12
- package/packages/mcp/tests/resources.test.ts +0 -53
- package/packages/mcp/tests/tools.test.ts +0 -1516
- package/packages/mcp/tsconfig.json +0 -22
- package/packages/mcp/vitest.config.ts +0 -9
- package/packages/protocol/dist/channels.d.ts +0 -137
- package/packages/protocol/dist/channels.d.ts.map +0 -1
- package/packages/protocol/dist/channels.js +0 -154
- package/packages/protocol/dist/channels.js.map +0 -1
- package/packages/protocol/dist/framing.d.ts +0 -80
- package/packages/protocol/dist/framing.d.ts.map +0 -1
- package/packages/protocol/dist/framing.js +0 -206
- package/packages/protocol/dist/framing.js.map +0 -1
- package/packages/protocol/dist/id-generator.d.ts +0 -35
- package/packages/protocol/dist/id-generator.d.ts.map +0 -1
- package/packages/protocol/dist/id-generator.js +0 -60
- package/packages/protocol/dist/id-generator.js.map +0 -1
- package/packages/protocol/dist/index.d.ts +0 -5
- package/packages/protocol/dist/index.d.ts.map +0 -1
- package/packages/protocol/dist/index.js +0 -5
- package/packages/protocol/dist/index.js.map +0 -1
- package/packages/protocol/dist/relay-pty-schemas.d.ts +0 -340
- package/packages/protocol/dist/relay-pty-schemas.d.ts.map +0 -1
- package/packages/protocol/dist/relay-pty-schemas.js +0 -60
- package/packages/protocol/dist/relay-pty-schemas.js.map +0 -1
- package/packages/protocol/dist/types.d.ts +0 -793
- package/packages/protocol/dist/types.d.ts.map +0 -1
- package/packages/protocol/dist/types.js +0 -8
- package/packages/protocol/dist/types.js.map +0 -1
- package/packages/protocol/package.json +0 -61
- package/packages/protocol/src/channels.test.ts +0 -330
- package/packages/protocol/src/channels.ts +0 -270
- package/packages/protocol/src/framing.test.ts +0 -164
- package/packages/protocol/src/framing.ts +0 -242
- package/packages/protocol/src/id-generator.ts +0 -69
- package/packages/protocol/src/index.ts +0 -4
- package/packages/protocol/src/relay-pty-schemas.ts +0 -400
- package/packages/protocol/src/types.test.ts +0 -271
- package/packages/protocol/src/types.ts +0 -988
- package/packages/protocol/tsconfig.json +0 -21
- package/packages/protocol/vitest.config.ts +0 -9
- package/packages/resiliency/dist/cgroup-manager.d.ts +0 -152
- package/packages/resiliency/dist/cgroup-manager.d.ts.map +0 -1
- package/packages/resiliency/dist/cgroup-manager.js +0 -394
- package/packages/resiliency/dist/cgroup-manager.js.map +0 -1
- package/packages/resiliency/dist/context-persistence.d.ts +0 -140
- package/packages/resiliency/dist/context-persistence.d.ts.map +0 -1
- package/packages/resiliency/dist/context-persistence.js +0 -397
- package/packages/resiliency/dist/context-persistence.js.map +0 -1
- package/packages/resiliency/dist/crash-insights.d.ts +0 -156
- package/packages/resiliency/dist/crash-insights.d.ts.map +0 -1
- package/packages/resiliency/dist/crash-insights.js +0 -492
- package/packages/resiliency/dist/crash-insights.js.map +0 -1
- package/packages/resiliency/dist/gossip-health.d.ts +0 -137
- package/packages/resiliency/dist/gossip-health.d.ts.map +0 -1
- package/packages/resiliency/dist/gossip-health.js +0 -241
- package/packages/resiliency/dist/gossip-health.js.map +0 -1
- package/packages/resiliency/dist/health-monitor.d.ts +0 -97
- package/packages/resiliency/dist/health-monitor.d.ts.map +0 -1
- package/packages/resiliency/dist/health-monitor.js +0 -291
- package/packages/resiliency/dist/health-monitor.js.map +0 -1
- package/packages/resiliency/dist/index.d.ts +0 -69
- package/packages/resiliency/dist/index.d.ts.map +0 -1
- package/packages/resiliency/dist/index.js +0 -69
- package/packages/resiliency/dist/index.js.map +0 -1
- package/packages/resiliency/dist/leader-watchdog.d.ts +0 -109
- package/packages/resiliency/dist/leader-watchdog.d.ts.map +0 -1
- package/packages/resiliency/dist/leader-watchdog.js +0 -189
- package/packages/resiliency/dist/leader-watchdog.js.map +0 -1
- package/packages/resiliency/dist/logger.d.ts +0 -114
- package/packages/resiliency/dist/logger.d.ts.map +0 -1
- package/packages/resiliency/dist/logger.js +0 -250
- package/packages/resiliency/dist/logger.js.map +0 -1
- package/packages/resiliency/dist/memory-monitor.d.ts +0 -172
- package/packages/resiliency/dist/memory-monitor.d.ts.map +0 -1
- package/packages/resiliency/dist/memory-monitor.js +0 -599
- package/packages/resiliency/dist/memory-monitor.js.map +0 -1
- package/packages/resiliency/dist/metrics.d.ts +0 -115
- package/packages/resiliency/dist/metrics.d.ts.map +0 -1
- package/packages/resiliency/dist/metrics.js +0 -239
- package/packages/resiliency/dist/metrics.js.map +0 -1
- package/packages/resiliency/dist/provider-context.d.ts +0 -100
- package/packages/resiliency/dist/provider-context.d.ts.map +0 -1
- package/packages/resiliency/dist/provider-context.js +0 -362
- package/packages/resiliency/dist/provider-context.js.map +0 -1
- package/packages/resiliency/dist/stateless-lead.d.ts +0 -149
- package/packages/resiliency/dist/stateless-lead.d.ts.map +0 -1
- package/packages/resiliency/dist/stateless-lead.js +0 -308
- package/packages/resiliency/dist/stateless-lead.js.map +0 -1
- package/packages/resiliency/dist/supervisor.d.ts +0 -147
- package/packages/resiliency/dist/supervisor.d.ts.map +0 -1
- package/packages/resiliency/dist/supervisor.js +0 -459
- package/packages/resiliency/dist/supervisor.js.map +0 -1
- package/packages/resiliency/package.json +0 -38
- package/packages/resiliency/src/cgroup-manager.ts +0 -468
- package/packages/resiliency/src/context-persistence.ts +0 -538
- package/packages/resiliency/src/crash-insights.test.ts +0 -620
- package/packages/resiliency/src/crash-insights.ts +0 -660
- package/packages/resiliency/src/gossip-health.ts +0 -333
- package/packages/resiliency/src/health-monitor.ts +0 -371
- package/packages/resiliency/src/index.ts +0 -157
- package/packages/resiliency/src/leader-watchdog.ts +0 -260
- package/packages/resiliency/src/logger.ts +0 -320
- package/packages/resiliency/src/memory-monitor.test.ts +0 -637
- package/packages/resiliency/src/memory-monitor.ts +0 -740
- package/packages/resiliency/src/metrics.ts +0 -311
- package/packages/resiliency/src/provider-context.ts +0 -452
- package/packages/resiliency/src/stateless-lead.ts +0 -408
- package/packages/resiliency/src/supervisor.ts +0 -578
- package/packages/resiliency/tsconfig.json +0 -21
- package/packages/resiliency/vitest.config.ts +0 -9
- package/packages/sdk/dist/discovery.d.ts +0 -10
- package/packages/sdk/dist/discovery.d.ts.map +0 -1
- package/packages/sdk/dist/discovery.js +0 -22
- package/packages/sdk/dist/discovery.js.map +0 -1
- package/packages/sdk/dist/errors.d.ts +0 -9
- package/packages/sdk/dist/errors.d.ts.map +0 -1
- package/packages/sdk/dist/errors.js +0 -9
- package/packages/sdk/dist/errors.js.map +0 -1
- package/packages/sdk/dist/protocol/index.d.ts +0 -8
- package/packages/sdk/dist/protocol/index.d.ts.map +0 -1
- package/packages/sdk/dist/protocol/index.js +0 -8
- package/packages/sdk/dist/protocol/index.js.map +0 -1
- package/packages/sdk/examples/SWARM_CAPABILITIES.md +0 -498
- package/packages/sdk/examples/SWARM_PATTERNS.md +0 -541
- package/packages/sdk/src/client.test.ts +0 -1041
- package/packages/sdk/src/discovery.ts +0 -38
- package/packages/sdk/src/errors.ts +0 -17
- package/packages/sdk/src/logs.test.ts +0 -98
- package/packages/sdk/src/protocol/framing.test.ts +0 -164
- package/packages/sdk/src/protocol/index.ts +0 -8
- package/packages/spawner/.trajectories/index.json +0 -5
- package/packages/spawner/API.md +0 -256
- package/packages/spawner/dist/index.d.ts +0 -8
- package/packages/spawner/dist/index.d.ts.map +0 -1
- package/packages/spawner/dist/index.js +0 -8
- package/packages/spawner/dist/index.js.map +0 -1
- package/packages/spawner/dist/types.d.ts +0 -552
- package/packages/spawner/dist/types.d.ts.map +0 -1
- package/packages/spawner/dist/types.js +0 -193
- package/packages/spawner/dist/types.js.map +0 -1
- package/packages/spawner/package.json +0 -47
- package/packages/spawner/src/index.ts +0 -8
- package/packages/spawner/src/types.test.ts +0 -385
- package/packages/spawner/src/types.ts +0 -228
- package/packages/spawner/tsconfig.json +0 -19
- package/packages/spawner/vitest.config.ts +0 -9
- package/packages/state/dist/agent-state.d.ts +0 -40
- package/packages/state/dist/agent-state.d.ts.map +0 -1
- package/packages/state/dist/agent-state.js +0 -120
- package/packages/state/dist/agent-state.js.map +0 -1
- package/packages/state/dist/index.d.ts +0 -8
- package/packages/state/dist/index.d.ts.map +0 -1
- package/packages/state/dist/index.js +0 -8
- package/packages/state/dist/index.js.map +0 -1
- package/packages/state/package.json +0 -37
- package/packages/state/src/agent-state.test.ts +0 -335
- package/packages/state/src/agent-state.ts +0 -153
- package/packages/state/src/index.ts +0 -12
- package/packages/state/tsconfig.json +0 -21
- package/packages/state/vitest.config.ts +0 -9
- package/packages/storage/dist/adapter.d.ts +0 -189
- package/packages/storage/dist/adapter.d.ts.map +0 -1
- package/packages/storage/dist/adapter.js +0 -267
- package/packages/storage/dist/adapter.js.map +0 -1
- package/packages/storage/dist/batched-sqlite-adapter.d.ts +0 -75
- package/packages/storage/dist/batched-sqlite-adapter.d.ts.map +0 -1
- package/packages/storage/dist/batched-sqlite-adapter.js +0 -189
- package/packages/storage/dist/batched-sqlite-adapter.js.map +0 -1
- package/packages/storage/dist/dead-letter-queue.d.ts +0 -196
- package/packages/storage/dist/dead-letter-queue.d.ts.map +0 -1
- package/packages/storage/dist/dead-letter-queue.js +0 -427
- package/packages/storage/dist/dead-letter-queue.js.map +0 -1
- package/packages/storage/dist/dlq-adapter.d.ts +0 -195
- package/packages/storage/dist/dlq-adapter.d.ts.map +0 -1
- package/packages/storage/dist/dlq-adapter.js +0 -664
- package/packages/storage/dist/dlq-adapter.js.map +0 -1
- package/packages/storage/dist/index.d.ts +0 -6
- package/packages/storage/dist/index.d.ts.map +0 -1
- package/packages/storage/dist/index.js +0 -7
- package/packages/storage/dist/index.js.map +0 -1
- package/packages/storage/dist/jsonl-adapter.d.ts +0 -91
- package/packages/storage/dist/jsonl-adapter.d.ts.map +0 -1
- package/packages/storage/dist/jsonl-adapter.js +0 -580
- package/packages/storage/dist/jsonl-adapter.js.map +0 -1
- package/packages/storage/dist/sqlite-adapter.d.ts +0 -131
- package/packages/storage/dist/sqlite-adapter.d.ts.map +0 -1
- package/packages/storage/dist/sqlite-adapter.js +0 -865
- package/packages/storage/dist/sqlite-adapter.js.map +0 -1
- package/packages/storage/package.json +0 -74
- package/packages/storage/src/adapter.ts +0 -446
- package/packages/storage/src/batched-sqlite-adapter.test.ts +0 -256
- package/packages/storage/src/batched-sqlite-adapter.ts +0 -239
- package/packages/storage/src/dead-letter-queue.ts +0 -643
- package/packages/storage/src/dlq-adapter.test.ts +0 -509
- package/packages/storage/src/dlq-adapter.ts +0 -954
- package/packages/storage/src/index.ts +0 -6
- package/packages/storage/src/jsonl-adapter.test.ts +0 -239
- package/packages/storage/src/jsonl-adapter.ts +0 -704
- package/packages/storage/src/memory-adapter.test.ts +0 -36
- package/packages/storage/src/sqlite-adapter.test.ts +0 -580
- package/packages/storage/src/sqlite-adapter.ts +0 -1099
- package/packages/storage/tsconfig.json +0 -21
- package/packages/storage/vitest.config.ts +0 -9
- package/packages/wrapper/dist/__fixtures__/claude-outputs.d.ts +0 -49
- package/packages/wrapper/dist/__fixtures__/claude-outputs.d.ts.map +0 -1
- package/packages/wrapper/dist/__fixtures__/claude-outputs.js +0 -443
- package/packages/wrapper/dist/__fixtures__/claude-outputs.js.map +0 -1
- package/packages/wrapper/dist/__fixtures__/codex-outputs.d.ts +0 -9
- package/packages/wrapper/dist/__fixtures__/codex-outputs.d.ts.map +0 -1
- package/packages/wrapper/dist/__fixtures__/codex-outputs.js +0 -94
- package/packages/wrapper/dist/__fixtures__/codex-outputs.js.map +0 -1
- package/packages/wrapper/dist/__fixtures__/gemini-outputs.d.ts +0 -19
- package/packages/wrapper/dist/__fixtures__/gemini-outputs.d.ts.map +0 -1
- package/packages/wrapper/dist/__fixtures__/gemini-outputs.js +0 -144
- package/packages/wrapper/dist/__fixtures__/gemini-outputs.js.map +0 -1
- package/packages/wrapper/dist/__fixtures__/index.d.ts +0 -68
- package/packages/wrapper/dist/__fixtures__/index.d.ts.map +0 -1
- package/packages/wrapper/dist/__fixtures__/index.js +0 -44
- package/packages/wrapper/dist/__fixtures__/index.js.map +0 -1
- package/packages/wrapper/dist/auth-detection.d.ts +0 -49
- package/packages/wrapper/dist/auth-detection.d.ts.map +0 -1
- package/packages/wrapper/dist/auth-detection.js +0 -199
- package/packages/wrapper/dist/auth-detection.js.map +0 -1
- package/packages/wrapper/dist/base-wrapper.d.ts +0 -254
- package/packages/wrapper/dist/base-wrapper.d.ts.map +0 -1
- package/packages/wrapper/dist/base-wrapper.js +0 -664
- package/packages/wrapper/dist/base-wrapper.js.map +0 -1
- package/packages/wrapper/dist/client.d.ts +0 -291
- package/packages/wrapper/dist/client.d.ts.map +0 -1
- package/packages/wrapper/dist/client.js +0 -926
- package/packages/wrapper/dist/client.js.map +0 -1
- package/packages/wrapper/dist/id-generator.d.ts +0 -35
- package/packages/wrapper/dist/id-generator.d.ts.map +0 -1
- package/packages/wrapper/dist/id-generator.js +0 -60
- package/packages/wrapper/dist/id-generator.js.map +0 -1
- package/packages/wrapper/dist/idle-detector.d.ts +0 -114
- package/packages/wrapper/dist/idle-detector.d.ts.map +0 -1
- package/packages/wrapper/dist/idle-detector.js +0 -317
- package/packages/wrapper/dist/idle-detector.js.map +0 -1
- package/packages/wrapper/dist/inbox.d.ts +0 -37
- package/packages/wrapper/dist/inbox.d.ts.map +0 -1
- package/packages/wrapper/dist/inbox.js +0 -73
- package/packages/wrapper/dist/inbox.js.map +0 -1
- package/packages/wrapper/dist/index.d.ts +0 -40
- package/packages/wrapper/dist/index.d.ts.map +0 -1
- package/packages/wrapper/dist/index.js +0 -53
- package/packages/wrapper/dist/index.js.map +0 -1
- package/packages/wrapper/dist/opencode-api.d.ts +0 -106
- package/packages/wrapper/dist/opencode-api.d.ts.map +0 -1
- package/packages/wrapper/dist/opencode-api.js +0 -219
- package/packages/wrapper/dist/opencode-api.js.map +0 -1
- package/packages/wrapper/dist/opencode-wrapper.d.ts +0 -161
- package/packages/wrapper/dist/opencode-wrapper.d.ts.map +0 -1
- package/packages/wrapper/dist/opencode-wrapper.js +0 -438
- package/packages/wrapper/dist/opencode-wrapper.js.map +0 -1
- package/packages/wrapper/dist/parser.d.ts +0 -236
- package/packages/wrapper/dist/parser.d.ts.map +0 -1
- package/packages/wrapper/dist/parser.js +0 -1238
- package/packages/wrapper/dist/parser.js.map +0 -1
- package/packages/wrapper/dist/prompt-composer.d.ts +0 -67
- package/packages/wrapper/dist/prompt-composer.d.ts.map +0 -1
- package/packages/wrapper/dist/prompt-composer.js +0 -168
- package/packages/wrapper/dist/prompt-composer.js.map +0 -1
- package/packages/wrapper/dist/relay-pty-orchestrator.d.ts +0 -486
- package/packages/wrapper/dist/relay-pty-orchestrator.d.ts.map +0 -1
- package/packages/wrapper/dist/relay-pty-orchestrator.js +0 -2550
- package/packages/wrapper/dist/relay-pty-orchestrator.js.map +0 -1
- package/packages/wrapper/dist/shared.d.ts +0 -262
- package/packages/wrapper/dist/shared.d.ts.map +0 -1
- package/packages/wrapper/dist/shared.js +0 -507
- package/packages/wrapper/dist/shared.js.map +0 -1
- package/packages/wrapper/dist/stuck-detector.d.ts +0 -161
- package/packages/wrapper/dist/stuck-detector.d.ts.map +0 -1
- package/packages/wrapper/dist/stuck-detector.js +0 -402
- package/packages/wrapper/dist/stuck-detector.js.map +0 -1
- package/packages/wrapper/dist/tmux-resolver.d.ts +0 -55
- package/packages/wrapper/dist/tmux-resolver.d.ts.map +0 -1
- package/packages/wrapper/dist/tmux-resolver.js +0 -175
- package/packages/wrapper/dist/tmux-resolver.js.map +0 -1
- package/packages/wrapper/dist/tmux-wrapper.d.ts +0 -352
- package/packages/wrapper/dist/tmux-wrapper.d.ts.map +0 -1
- package/packages/wrapper/dist/tmux-wrapper.js +0 -1816
- package/packages/wrapper/dist/tmux-wrapper.js.map +0 -1
- package/packages/wrapper/dist/trajectory-integration.d.ts +0 -292
- package/packages/wrapper/dist/trajectory-integration.d.ts.map +0 -1
- package/packages/wrapper/dist/trajectory-integration.js +0 -979
- package/packages/wrapper/dist/trajectory-integration.js.map +0 -1
- package/packages/wrapper/dist/wrapper-events.d.ts +0 -489
- package/packages/wrapper/dist/wrapper-events.d.ts.map +0 -1
- package/packages/wrapper/dist/wrapper-events.js +0 -252
- package/packages/wrapper/dist/wrapper-events.js.map +0 -1
- package/packages/wrapper/dist/wrapper-types.d.ts +0 -41
- package/packages/wrapper/dist/wrapper-types.d.ts.map +0 -1
- package/packages/wrapper/dist/wrapper-types.js +0 -7
- package/packages/wrapper/dist/wrapper-types.js.map +0 -1
- package/packages/wrapper/package.json +0 -60
- package/packages/wrapper/src/__fixtures__/claude-outputs.ts +0 -471
- package/packages/wrapper/src/__fixtures__/codex-outputs.ts +0 -99
- package/packages/wrapper/src/__fixtures__/gemini-outputs.ts +0 -151
- package/packages/wrapper/src/__fixtures__/index.ts +0 -47
- package/packages/wrapper/src/auth-detection.ts +0 -244
- package/packages/wrapper/src/base-wrapper.test.ts +0 -589
- package/packages/wrapper/src/base-wrapper.ts +0 -841
- package/packages/wrapper/src/client.test.ts +0 -351
- package/packages/wrapper/src/client.ts +0 -1166
- package/packages/wrapper/src/id-generator.test.ts +0 -71
- package/packages/wrapper/src/id-generator.ts +0 -69
- package/packages/wrapper/src/idle-detector.test.ts +0 -418
- package/packages/wrapper/src/idle-detector.ts +0 -384
- package/packages/wrapper/src/inbox.test.ts +0 -233
- package/packages/wrapper/src/inbox.ts +0 -89
- package/packages/wrapper/src/index.ts +0 -199
- package/packages/wrapper/src/opencode-api.test.ts +0 -292
- package/packages/wrapper/src/opencode-api.ts +0 -285
- package/packages/wrapper/src/opencode-wrapper.ts +0 -541
- package/packages/wrapper/src/parser.regression.test.ts +0 -251
- package/packages/wrapper/src/parser.test.ts +0 -1359
- package/packages/wrapper/src/parser.ts +0 -1477
- package/packages/wrapper/src/prompt-composer.test.ts +0 -219
- package/packages/wrapper/src/prompt-composer.ts +0 -231
- package/packages/wrapper/src/relay-pty-orchestrator.test.ts +0 -1386
- package/packages/wrapper/src/relay-pty-orchestrator.ts +0 -3041
- package/packages/wrapper/src/shared.test.ts +0 -467
- package/packages/wrapper/src/shared.ts +0 -652
- package/packages/wrapper/src/stuck-detector.test.ts +0 -303
- package/packages/wrapper/src/stuck-detector.ts +0 -511
- package/packages/wrapper/src/tmux-resolver.test.ts +0 -104
- package/packages/wrapper/src/tmux-resolver.ts +0 -207
- package/packages/wrapper/src/tmux-wrapper.test.ts +0 -316
- package/packages/wrapper/src/tmux-wrapper.ts +0 -2095
- package/packages/wrapper/src/trajectory-detection.test.ts +0 -151
- package/packages/wrapper/src/trajectory-integration.ts +0 -1261
- package/packages/wrapper/src/wrapper-events.ts +0 -395
- package/packages/wrapper/src/wrapper-types.ts +0 -45
- package/packages/wrapper/tsconfig.json +0 -19
- package/packages/wrapper/vitest.config.ts +0 -9
- /package/packages/{broker-sdk → sdk}/dist/__tests__/facade.test.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/__tests__/facade.test.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/__tests__/integration.test.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/__tests__/integration.test.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/__tests__/quickstart.test.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/__tests__/quickstart.test.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/__tests__/unit.test.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/__tests__/unit.test.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/browser.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/browser.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/browser.js +0 -0
- /package/packages/{broker-sdk → sdk}/dist/browser.js.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/consensus-helpers.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/consensus-helpers.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/consensus-helpers.js +0 -0
- /package/packages/{broker-sdk → sdk}/dist/consensus-helpers.js.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/consensus.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/consensus.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/consensus.js +0 -0
- /package/packages/{broker-sdk → sdk}/dist/consensus.js.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/demo.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/demo.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/demo.js +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/demo.js.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/example.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/example.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/example.js +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/example.js.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/quickstart.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/quickstart.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/quickstart.js +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/quickstart.js.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/ralph-loop.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/ralph-loop.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/ralph-loop.js +0 -0
- /package/packages/{broker-sdk → sdk}/dist/examples/ralph-loop.js.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/protocol.js +0 -0
- /package/packages/{broker-sdk → sdk}/dist/protocol.js.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/pty.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/shadow.js +0 -0
- /package/packages/{broker-sdk → sdk}/dist/workflows/barrier.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/workflows/barrier.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/workflows/barrier.js +0 -0
- /package/packages/{broker-sdk → sdk}/dist/workflows/barrier.js.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/workflows/memory-db.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/workflows/memory-db.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/workflows/memory-db.js +0 -0
- /package/packages/{broker-sdk → sdk}/dist/workflows/memory-db.js.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/workflows/state.d.ts +0 -0
- /package/packages/{broker-sdk → sdk}/dist/workflows/state.d.ts.map +0 -0
- /package/packages/{broker-sdk → sdk}/dist/workflows/state.js +0 -0
- /package/packages/{broker-sdk → sdk}/dist/workflows/state.js.map +0 -0
- /package/packages/{broker-sdk → sdk}/src/__tests__/workflow-trajectory.test.ts +0 -0
- /package/packages/{broker-sdk → sdk}/src/browser.ts +0 -0
- /package/packages/{broker-sdk → sdk}/src/consensus-helpers.ts +0 -0
- /package/packages/{broker-sdk → sdk}/src/consensus.ts +0 -0
- /package/packages/{broker-sdk → sdk}/src/examples/demo.ts +0 -0
- /package/packages/{broker-sdk → sdk}/src/examples/example.ts +0 -0
- /package/packages/{broker-sdk → sdk}/src/examples/quickstart.ts +0 -0
- /package/packages/{broker-sdk → sdk}/src/examples/ralph-loop.ts +0 -0
- /package/packages/{broker-sdk → sdk}/src/examples/sample-prd.json +0 -0
- /package/packages/{broker-sdk → sdk}/src/workflows/barrier.ts +0 -0
- /package/packages/{broker-sdk → sdk}/src/workflows/memory-db.ts +0 -0
- /package/packages/{broker-sdk → sdk}/src/workflows/state.ts +0 -0
|
@@ -1,2071 +1,663 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import { randomUUID } from 'node:crypto';
|
|
10
|
-
import { discoverSocket } from '@agent-relay/utils/discovery';
|
|
11
|
-
import { DaemonNotRunningError, ConnectionError } from '@agent-relay/utils/errors';
|
|
12
|
-
// Import shared protocol types and framing utilities from @agent-relay/protocol
|
|
1
|
+
import { once } from 'node:events';
|
|
2
|
+
import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';
|
|
3
|
+
import { createInterface, type Interface as ReadlineInterface } from 'node:readline';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
|
|
13
9
|
import {
|
|
14
|
-
type Envelope,
|
|
15
|
-
type HelloPayload,
|
|
16
|
-
type WelcomePayload,
|
|
17
|
-
type SendPayload,
|
|
18
|
-
type SendMeta,
|
|
19
|
-
type SendEnvelope,
|
|
20
|
-
type DeliverEnvelope,
|
|
21
|
-
type AckPayload,
|
|
22
|
-
type ErrorPayload,
|
|
23
|
-
type PayloadKind,
|
|
24
|
-
type LogPayload,
|
|
25
|
-
type SpeakOnTrigger,
|
|
26
|
-
type EntityType,
|
|
27
|
-
type ChannelMessagePayload,
|
|
28
|
-
type ChannelJoinEnvelope,
|
|
29
|
-
type ChannelLeaveEnvelope,
|
|
30
|
-
type ChannelMessageEnvelope,
|
|
31
|
-
type MessageAttachment,
|
|
32
|
-
type SpawnPayload,
|
|
33
|
-
type SpawnResultPayload,
|
|
34
|
-
type ReleasePayload,
|
|
35
|
-
type ReleaseResultPayload,
|
|
36
|
-
type SendInputPayload,
|
|
37
|
-
type SendInputResultPayload,
|
|
38
|
-
type SetModelPayload,
|
|
39
|
-
type SetModelResultPayload,
|
|
40
|
-
type SetModelEnvelope,
|
|
41
|
-
type ListWorkersPayload,
|
|
42
|
-
type ListWorkersResultPayload,
|
|
43
|
-
type SpawnEnvelope,
|
|
44
|
-
type ReleaseEnvelope,
|
|
45
|
-
type SendInputEnvelope,
|
|
46
|
-
type ListWorkersEnvelope,
|
|
47
|
-
type StatusResponsePayload,
|
|
48
|
-
type InboxPayload,
|
|
49
|
-
type InboxMessage,
|
|
50
|
-
type InboxResponsePayload,
|
|
51
|
-
type MessagesQueryPayload,
|
|
52
|
-
type MessagesResponsePayload,
|
|
53
|
-
type ListAgentsPayload,
|
|
54
|
-
type AgentInfo,
|
|
55
|
-
type ListAgentsResponsePayload,
|
|
56
|
-
type ListConnectedAgentsPayload,
|
|
57
|
-
type ListConnectedAgentsResponsePayload,
|
|
58
|
-
type RemoveAgentPayload,
|
|
59
|
-
type RemoveAgentResponsePayload,
|
|
60
|
-
type HealthPayload,
|
|
61
|
-
type HealthResponsePayload,
|
|
62
|
-
type MetricsPayload,
|
|
63
|
-
type MetricsResponsePayload,
|
|
64
|
-
type CreateProposalOptions,
|
|
65
|
-
type VoteOptions,
|
|
66
|
-
type AgentReadyPayload,
|
|
67
10
|
PROTOCOL_VERSION,
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
11
|
+
type AgentRuntime,
|
|
12
|
+
type AgentSpec,
|
|
13
|
+
type BrokerEvent,
|
|
14
|
+
type BrokerStats,
|
|
15
|
+
type BrokerStatus,
|
|
16
|
+
type CrashInsightsResponse,
|
|
17
|
+
type ProtocolEnvelope,
|
|
18
|
+
type ProtocolError,
|
|
19
|
+
type RestartPolicy,
|
|
20
|
+
} from './protocol.js';
|
|
21
|
+
|
|
22
|
+
export interface AgentRelayClientOptions {
|
|
23
|
+
binaryPath?: string;
|
|
24
|
+
binaryArgs?: string[];
|
|
25
|
+
brokerName?: string;
|
|
26
|
+
channels?: string[];
|
|
27
|
+
cwd?: string;
|
|
28
|
+
env?: NodeJS.ProcessEnv;
|
|
29
|
+
requestTimeoutMs?: number;
|
|
30
|
+
shutdownTimeoutMs?: number;
|
|
31
|
+
clientName?: string;
|
|
32
|
+
clientVersion?: string;
|
|
79
33
|
}
|
|
80
34
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
35
|
+
export interface SpawnPtyInput {
|
|
36
|
+
name: string;
|
|
37
|
+
cli: string;
|
|
38
|
+
args?: string[];
|
|
39
|
+
channels?: string[];
|
|
40
|
+
task?: string;
|
|
41
|
+
model?: string;
|
|
42
|
+
cwd?: string;
|
|
43
|
+
team?: string;
|
|
44
|
+
shadowOf?: string;
|
|
45
|
+
shadowMode?: string;
|
|
46
|
+
/** Silence duration in seconds before emitting agent_idle (0 = disabled, default: 30). */
|
|
47
|
+
idleThresholdSecs?: number;
|
|
48
|
+
/** Auto-restart policy for crashed agents. */
|
|
49
|
+
restartPolicy?: RestartPolicy;
|
|
50
|
+
/** Name of a previously released agent whose continuity context should be injected. */
|
|
51
|
+
continueFrom?: string;
|
|
93
52
|
}
|
|
94
53
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
from: string;
|
|
101
|
-
/** Response body text */
|
|
102
|
-
body: string;
|
|
103
|
-
/** Optional structured data from the response */
|
|
104
|
-
data?: Record<string, unknown>;
|
|
105
|
-
/** The correlation ID used for this request/response */
|
|
106
|
-
correlationId: string;
|
|
107
|
-
/** Thread identifier if set */
|
|
108
|
-
thread?: string;
|
|
109
|
-
/** The full payload for advanced use cases */
|
|
110
|
-
payload: SendPayload;
|
|
54
|
+
export interface SpawnHeadlessClaudeInput {
|
|
55
|
+
name: string;
|
|
56
|
+
args?: string[];
|
|
57
|
+
channels?: string[];
|
|
58
|
+
task?: string;
|
|
111
59
|
}
|
|
112
60
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
ready?: boolean;
|
|
121
|
-
/** Agent ready details (only set when waitForReady is true and spawn succeeded) */
|
|
122
|
-
readyInfo?: AgentReadyPayload;
|
|
61
|
+
export interface SendMessageInput {
|
|
62
|
+
to: string;
|
|
63
|
+
text: string;
|
|
64
|
+
from?: string;
|
|
65
|
+
threadId?: string;
|
|
66
|
+
priority?: number;
|
|
67
|
+
data?: Record<string, unknown>;
|
|
123
68
|
}
|
|
124
69
|
|
|
125
|
-
export interface
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
/** Agent name */
|
|
129
|
-
agentName: string;
|
|
130
|
-
/** Entity type: 'agent' (default) or 'user' */
|
|
131
|
-
entityType?: EntityType;
|
|
132
|
-
/** CLI identifier (claude, codex, gemini, etc.) */
|
|
70
|
+
export interface ListAgent {
|
|
71
|
+
name: string;
|
|
72
|
+
runtime: AgentRuntime;
|
|
133
73
|
cli?: string;
|
|
134
|
-
/** Program identifier */
|
|
135
|
-
program?: string;
|
|
136
|
-
/** Model identifier */
|
|
137
74
|
model?: string;
|
|
138
|
-
/** Task description */
|
|
139
|
-
task?: string;
|
|
140
|
-
/** Working directory */
|
|
141
|
-
workingDirectory?: string;
|
|
142
|
-
/** Team name */
|
|
143
75
|
team?: string;
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
avatarUrl?: string;
|
|
148
|
-
/** Suppress console logging */
|
|
149
|
-
quiet?: boolean;
|
|
150
|
-
/** Auto-reconnect on disconnect */
|
|
151
|
-
reconnect: boolean;
|
|
152
|
-
/** Max reconnect attempts */
|
|
153
|
-
maxReconnectAttempts: number;
|
|
154
|
-
/** Initial reconnect delay (ms) */
|
|
155
|
-
reconnectDelayMs: number;
|
|
156
|
-
/** Max reconnect delay (ms) */
|
|
157
|
-
reconnectMaxDelayMs: number;
|
|
158
|
-
/**
|
|
159
|
-
* Mark this client as a system component.
|
|
160
|
-
* Allows using reserved agent names (Dashboard, cli, system).
|
|
161
|
-
* Should only be set by trusted system components.
|
|
162
|
-
*/
|
|
163
|
-
_isSystemComponent?: boolean;
|
|
76
|
+
channels: string[];
|
|
77
|
+
parent?: string;
|
|
78
|
+
pid?: number;
|
|
164
79
|
}
|
|
165
80
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
*/
|
|
172
|
-
function resolveSocketPath(configPath?: string): string {
|
|
173
|
-
if (configPath) return configPath;
|
|
174
|
-
const discovery = discoverSocket();
|
|
175
|
-
return discovery?.socketPath || DEFAULT_SOCKET_PATH;
|
|
81
|
+
interface PendingRequest {
|
|
82
|
+
expectedType: 'ok' | 'hello_ack';
|
|
83
|
+
resolve: (value: ProtocolEnvelope<unknown>) => void;
|
|
84
|
+
reject: (error: Error) => void;
|
|
85
|
+
timeout: ReturnType<typeof setTimeout>;
|
|
176
86
|
}
|
|
177
87
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
reconnect: true,
|
|
184
|
-
maxReconnectAttempts: 10,
|
|
185
|
-
reconnectDelayMs: 1000, // Increased from 100ms to prevent reconnect storms
|
|
186
|
-
reconnectMaxDelayMs: 30000,
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
// Simple ID generator
|
|
190
|
-
let idCounter = 0;
|
|
191
|
-
function generateId(): string {
|
|
192
|
-
return `${Date.now().toString(36)}-${(++idCounter).toString(36)}`;
|
|
88
|
+
interface ParsedEnvelope {
|
|
89
|
+
v: number;
|
|
90
|
+
type: string;
|
|
91
|
+
request_id?: string;
|
|
92
|
+
payload: unknown;
|
|
193
93
|
}
|
|
194
94
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
private ids: Set<string> = new Set();
|
|
200
|
-
private ring: string[];
|
|
201
|
-
private head = 0;
|
|
202
|
-
private readonly capacity: number;
|
|
203
|
-
|
|
204
|
-
constructor(capacity = 2000) {
|
|
205
|
-
this.capacity = capacity;
|
|
206
|
-
this.ring = new Array(capacity);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
check(id: string): boolean {
|
|
210
|
-
if (this.ids.has(id)) return true;
|
|
95
|
+
export class AgentRelayProtocolError extends Error {
|
|
96
|
+
code: string;
|
|
97
|
+
retryable: boolean;
|
|
98
|
+
data?: unknown;
|
|
211
99
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
this.
|
|
218
|
-
this.ids.add(id);
|
|
219
|
-
this.head = (this.head + 1) % this.capacity;
|
|
220
|
-
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
clear(): void {
|
|
225
|
-
this.ids.clear();
|
|
226
|
-
this.ring = new Array(this.capacity);
|
|
227
|
-
this.head = 0;
|
|
100
|
+
constructor(payload: ProtocolError) {
|
|
101
|
+
super(payload.message);
|
|
102
|
+
this.name = 'AgentRelayProtocolError';
|
|
103
|
+
this.code = payload.code;
|
|
104
|
+
this.retryable = payload.retryable;
|
|
105
|
+
this.data = payload.data;
|
|
228
106
|
}
|
|
229
107
|
}
|
|
230
108
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
private config: ClientConfig;
|
|
236
|
-
private socket?: net.Socket;
|
|
237
|
-
private parser: FrameParser;
|
|
238
|
-
|
|
239
|
-
private _state: ClientState = 'DISCONNECTED';
|
|
240
|
-
private sessionId?: string;
|
|
241
|
-
private resumeToken?: string;
|
|
242
|
-
private reconnectAttempts = 0;
|
|
243
|
-
private reconnectDelay: number;
|
|
244
|
-
private reconnectTimer?: NodeJS.Timeout;
|
|
245
|
-
private _destroyed = false;
|
|
246
|
-
|
|
247
|
-
private dedupeCache = new CircularDedupeCache(2000);
|
|
248
|
-
private writeQueue: Buffer[] = [];
|
|
249
|
-
private writeScheduled = false;
|
|
250
|
-
|
|
251
|
-
private pendingSyncAcks: Map<string, {
|
|
252
|
-
resolve: (ack: AckPayload) => void;
|
|
253
|
-
reject: (err: Error) => void;
|
|
254
|
-
timeoutHandle: NodeJS.Timeout;
|
|
255
|
-
}> = new Map();
|
|
256
|
-
|
|
257
|
-
private pendingSpawns: Map<string, {
|
|
258
|
-
resolve: (result: SpawnResultPayload) => void;
|
|
259
|
-
reject: (err: Error) => void;
|
|
260
|
-
timeoutHandle: NodeJS.Timeout;
|
|
261
|
-
}> = new Map();
|
|
262
|
-
|
|
263
|
-
private pendingReleases: Map<string, {
|
|
264
|
-
resolve: (result: ReleaseResultPayload) => void;
|
|
265
|
-
reject: (err: Error) => void;
|
|
266
|
-
timeoutHandle: NodeJS.Timeout;
|
|
267
|
-
}> = new Map();
|
|
268
|
-
|
|
269
|
-
private pendingSendInputs: Map<string, {
|
|
270
|
-
resolve: (result: SendInputResultPayload) => void;
|
|
271
|
-
reject: (err: Error) => void;
|
|
272
|
-
timeoutHandle: NodeJS.Timeout;
|
|
273
|
-
}> = new Map();
|
|
274
|
-
|
|
275
|
-
private pendingSetModels: Map<string, {
|
|
276
|
-
resolve: (result: SetModelResultPayload) => void;
|
|
277
|
-
reject: (err: Error) => void;
|
|
278
|
-
timeoutHandle: NodeJS.Timeout;
|
|
279
|
-
}> = new Map();
|
|
280
|
-
|
|
281
|
-
private pendingListWorkers: Map<string, {
|
|
282
|
-
resolve: (result: ListWorkersResultPayload) => void;
|
|
283
|
-
reject: (err: Error) => void;
|
|
284
|
-
timeoutHandle: NodeJS.Timeout;
|
|
285
|
-
}> = new Map();
|
|
286
|
-
|
|
287
|
-
private pendingQueries: Map<string, {
|
|
288
|
-
resolve: (payload: unknown) => void;
|
|
289
|
-
reject: (err: Error) => void;
|
|
290
|
-
timeoutHandle: NodeJS.Timeout;
|
|
291
|
-
}> = new Map();
|
|
292
|
-
|
|
293
|
-
private pendingRequests: Map<string, {
|
|
294
|
-
resolve: (response: RequestResponse) => void;
|
|
295
|
-
reject: (err: Error) => void;
|
|
296
|
-
timeoutHandle: NodeJS.Timeout;
|
|
297
|
-
targetAgent: string;
|
|
298
|
-
}> = new Map();
|
|
299
|
-
|
|
300
|
-
private pendingAgentReady: Map<string, {
|
|
301
|
-
resolve: (info: AgentReadyPayload) => void;
|
|
302
|
-
reject: (err: Error) => void;
|
|
303
|
-
timeoutHandle: NodeJS.Timeout;
|
|
304
|
-
}> = new Map();
|
|
305
|
-
|
|
306
|
-
// Event handlers
|
|
307
|
-
onMessage?: (from: string, payload: SendPayload, messageId: string, meta?: SendMeta, originalTo?: string) => void;
|
|
308
|
-
/**
|
|
309
|
-
* Callback for channel messages.
|
|
310
|
-
*/
|
|
311
|
-
onChannelMessage?: (from: string, channel: string, body: string, envelope: Envelope<ChannelMessagePayload>) => void;
|
|
312
|
-
onStateChange?: (state: ClientState) => void;
|
|
313
|
-
onError?: (error: Error) => void;
|
|
314
|
-
/**
|
|
315
|
-
* Callback when an agent becomes ready (completes HELLO/WELCOME handshake).
|
|
316
|
-
* This is broadcast by the daemon when any agent connects.
|
|
317
|
-
* Useful for knowing when a spawned agent is ready to receive messages.
|
|
318
|
-
*/
|
|
319
|
-
onAgentReady?: (info: AgentReadyPayload) => void;
|
|
320
|
-
|
|
321
|
-
constructor(config: Partial<ClientConfig> = {}) {
|
|
322
|
-
this.config = { ...DEFAULT_CLIENT_CONFIG, ...config };
|
|
323
|
-
// Use socket discovery if no explicit socketPath was provided
|
|
324
|
-
if (!config.socketPath) {
|
|
325
|
-
this.config.socketPath = resolveSocketPath();
|
|
326
|
-
}
|
|
327
|
-
this.parser = new FrameParser();
|
|
328
|
-
this.parser.setLegacyMode(true);
|
|
329
|
-
this.reconnectDelay = this.config.reconnectDelayMs;
|
|
109
|
+
export class AgentRelayProcessError extends Error {
|
|
110
|
+
constructor(message: string) {
|
|
111
|
+
super(message);
|
|
112
|
+
this.name = 'AgentRelayProcessError';
|
|
330
113
|
}
|
|
114
|
+
}
|
|
331
115
|
|
|
332
|
-
|
|
333
|
-
|
|
116
|
+
export class AgentRelayClient {
|
|
117
|
+
private readonly options: Required<AgentRelayClientOptions>;
|
|
118
|
+
private child?: ChildProcessWithoutNullStreams;
|
|
119
|
+
private stdoutRl?: ReadlineInterface;
|
|
120
|
+
private stderrRl?: ReadlineInterface;
|
|
121
|
+
private lastStderrLine?: string;
|
|
122
|
+
private requestSeq = 0;
|
|
123
|
+
private pending = new Map<string, PendingRequest>();
|
|
124
|
+
private startingPromise?: Promise<void>;
|
|
125
|
+
private eventListeners = new Set<(event: BrokerEvent) => void>();
|
|
126
|
+
private stderrListeners = new Set<(line: string) => void>();
|
|
127
|
+
private eventBuffer: BrokerEvent[] = [];
|
|
128
|
+
private maxBufferSize = 1000;
|
|
129
|
+
private exitPromise?: Promise<void>;
|
|
130
|
+
|
|
131
|
+
constructor(options: AgentRelayClientOptions = {}) {
|
|
132
|
+
this.options = {
|
|
133
|
+
binaryPath: options.binaryPath ?? resolveDefaultBinaryPath(),
|
|
134
|
+
binaryArgs: options.binaryArgs ?? [],
|
|
135
|
+
brokerName: options.brokerName ?? (path.basename(options.cwd ?? process.cwd()) || 'project'),
|
|
136
|
+
channels: options.channels ?? ['general'],
|
|
137
|
+
cwd: options.cwd ?? process.cwd(),
|
|
138
|
+
env: options.env ?? process.env,
|
|
139
|
+
requestTimeoutMs: options.requestTimeoutMs ?? 10_000,
|
|
140
|
+
shutdownTimeoutMs: options.shutdownTimeoutMs ?? 3_000,
|
|
141
|
+
clientName: options.clientName ?? '@agent-relay/sdk',
|
|
142
|
+
clientVersion: options.clientVersion ?? '0.1.0',
|
|
143
|
+
};
|
|
334
144
|
}
|
|
335
145
|
|
|
336
|
-
|
|
337
|
-
|
|
146
|
+
static async start(options: AgentRelayClientOptions = {}): Promise<AgentRelayClient> {
|
|
147
|
+
const client = new AgentRelayClient(options);
|
|
148
|
+
await client.start();
|
|
149
|
+
return client;
|
|
338
150
|
}
|
|
339
151
|
|
|
340
|
-
|
|
341
|
-
|
|
152
|
+
onEvent(listener: (event: BrokerEvent) => void): () => void {
|
|
153
|
+
this.eventListeners.add(listener);
|
|
154
|
+
return () => {
|
|
155
|
+
this.eventListeners.delete(listener);
|
|
156
|
+
};
|
|
342
157
|
}
|
|
343
158
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
if (this._state !== 'DISCONNECTED' && this._state !== 'BACKOFF') {
|
|
349
|
-
return Promise.resolve();
|
|
159
|
+
queryEvents(filter?: { kind?: string; name?: string; since?: number; limit?: number }): BrokerEvent[] {
|
|
160
|
+
let events = [...this.eventBuffer];
|
|
161
|
+
if (filter?.kind) {
|
|
162
|
+
events = events.filter((event) => event.kind === filter.kind);
|
|
350
163
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
let settled = false;
|
|
354
|
-
const settleResolve = (): void => {
|
|
355
|
-
if (settled) return;
|
|
356
|
-
settled = true;
|
|
357
|
-
resolve();
|
|
358
|
-
};
|
|
359
|
-
const settleReject = (err: Error): void => {
|
|
360
|
-
if (settled) return;
|
|
361
|
-
settled = true;
|
|
362
|
-
reject(err);
|
|
363
|
-
};
|
|
364
|
-
|
|
365
|
-
this.setState('CONNECTING');
|
|
366
|
-
|
|
367
|
-
this.socket = net.createConnection(this.config.socketPath, () => {
|
|
368
|
-
this.setState('HANDSHAKING');
|
|
369
|
-
this.sendHello();
|
|
370
|
-
});
|
|
371
|
-
|
|
372
|
-
this.socket.on('data', (data) => this.handleData(data));
|
|
373
|
-
|
|
374
|
-
this.socket.on('close', () => {
|
|
375
|
-
this.handleDisconnect();
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
this.socket.on('error', (err) => {
|
|
379
|
-
if (this._state === 'CONNECTING') {
|
|
380
|
-
const errno = (err as NodeJS.ErrnoException).code;
|
|
381
|
-
if (errno === 'ECONNREFUSED' || errno === 'ENOENT') {
|
|
382
|
-
settleReject(new DaemonNotRunningError(`Cannot connect to daemon at ${this.config.socketPath}`));
|
|
383
|
-
} else {
|
|
384
|
-
settleReject(new ConnectionError(err.message));
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
this.handleError(err);
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
const checkReady = setInterval(() => {
|
|
391
|
-
if (this._state === 'READY') {
|
|
392
|
-
clearInterval(checkReady);
|
|
393
|
-
clearTimeout(timeout);
|
|
394
|
-
settleResolve();
|
|
395
|
-
}
|
|
396
|
-
}, 10);
|
|
397
|
-
|
|
398
|
-
const timeout = setTimeout(() => {
|
|
399
|
-
if (this._state !== 'READY') {
|
|
400
|
-
clearInterval(checkReady);
|
|
401
|
-
this.socket?.destroy();
|
|
402
|
-
settleReject(new Error('Connection timeout'));
|
|
403
|
-
}
|
|
404
|
-
}, 5000);
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
/**
|
|
409
|
-
* Disconnect from the relay daemon.
|
|
410
|
-
*/
|
|
411
|
-
disconnect(): void {
|
|
412
|
-
if (this.reconnectTimer) {
|
|
413
|
-
clearTimeout(this.reconnectTimer);
|
|
414
|
-
this.reconnectTimer = undefined;
|
|
164
|
+
if (filter?.name) {
|
|
165
|
+
events = events.filter((event) => 'name' in event && event.name === filter.name);
|
|
415
166
|
}
|
|
416
|
-
|
|
417
|
-
if (
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
id: generateId(),
|
|
422
|
-
ts: Date.now(),
|
|
423
|
-
payload: {},
|
|
424
|
-
});
|
|
425
|
-
this.socket.end();
|
|
426
|
-
this.socket = undefined;
|
|
167
|
+
const since = filter?.since;
|
|
168
|
+
if (since !== undefined) {
|
|
169
|
+
events = events.filter(
|
|
170
|
+
(event) => 'timestamp' in event && typeof event.timestamp === 'number' && event.timestamp >= since
|
|
171
|
+
);
|
|
427
172
|
}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
/**
|
|
433
|
-
* Permanently destroy the client.
|
|
434
|
-
*/
|
|
435
|
-
destroy(): void {
|
|
436
|
-
this._destroyed = true;
|
|
437
|
-
this.disconnect();
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
/**
|
|
441
|
-
* Send a message to another agent.
|
|
442
|
-
*/
|
|
443
|
-
sendMessage(
|
|
444
|
-
to: string,
|
|
445
|
-
body: string,
|
|
446
|
-
kind: PayloadKind = 'message',
|
|
447
|
-
data?: Record<string, unknown>,
|
|
448
|
-
thread?: string,
|
|
449
|
-
meta?: SendMeta
|
|
450
|
-
): boolean {
|
|
451
|
-
if (this._state !== 'READY') {
|
|
452
|
-
return false;
|
|
173
|
+
const limit = filter?.limit;
|
|
174
|
+
if (limit !== undefined) {
|
|
175
|
+
events = events.slice(-limit);
|
|
453
176
|
}
|
|
454
|
-
|
|
455
|
-
const envelope: SendEnvelope = {
|
|
456
|
-
v: PROTOCOL_VERSION,
|
|
457
|
-
type: 'SEND',
|
|
458
|
-
id: generateId(),
|
|
459
|
-
ts: Date.now(),
|
|
460
|
-
to,
|
|
461
|
-
payload: {
|
|
462
|
-
kind,
|
|
463
|
-
body,
|
|
464
|
-
data,
|
|
465
|
-
thread,
|
|
466
|
-
},
|
|
467
|
-
payload_meta: meta,
|
|
468
|
-
};
|
|
469
|
-
|
|
470
|
-
return this.send(envelope);
|
|
177
|
+
return events;
|
|
471
178
|
}
|
|
472
179
|
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
180
|
+
getLastEvent(kind: string, name?: string): BrokerEvent | undefined {
|
|
181
|
+
for (let i = this.eventBuffer.length - 1; i >= 0; i -= 1) {
|
|
182
|
+
const event = this.eventBuffer[i];
|
|
183
|
+
if (event.kind === kind && (!name || ('name' in event && event.name === name))) {
|
|
184
|
+
return event;
|
|
185
|
+
}
|
|
479
186
|
}
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
480
189
|
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
ts: Date.now(),
|
|
486
|
-
payload,
|
|
190
|
+
onBrokerStderr(listener: (line: string) => void): () => void {
|
|
191
|
+
this.stderrListeners.add(listener);
|
|
192
|
+
return () => {
|
|
193
|
+
this.stderrListeners.delete(listener);
|
|
487
194
|
};
|
|
488
|
-
|
|
489
|
-
return this.send(envelope);
|
|
490
195
|
}
|
|
491
196
|
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
async sendAndWait(to: string, body: string, options: SyncOptions = {}): Promise<AckPayload> {
|
|
496
|
-
if (this._state !== 'READY') {
|
|
497
|
-
throw new Error('Client not ready');
|
|
197
|
+
async start(): Promise<void> {
|
|
198
|
+
if (this.child) {
|
|
199
|
+
return;
|
|
498
200
|
}
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
const timeoutMs = options.timeoutMs ?? 30000;
|
|
502
|
-
const kind = options.kind ?? 'message';
|
|
503
|
-
|
|
504
|
-
return new Promise<AckPayload>((resolve, reject) => {
|
|
505
|
-
const timeoutHandle = setTimeout(() => {
|
|
506
|
-
this.pendingSyncAcks.delete(correlationId);
|
|
507
|
-
reject(new Error(`ACK timeout after ${timeoutMs}ms`));
|
|
508
|
-
}, timeoutMs);
|
|
509
|
-
|
|
510
|
-
this.pendingSyncAcks.set(correlationId, { resolve, reject, timeoutHandle });
|
|
511
|
-
|
|
512
|
-
const envelope: SendEnvelope = {
|
|
513
|
-
v: PROTOCOL_VERSION,
|
|
514
|
-
type: 'SEND',
|
|
515
|
-
id: generateId(),
|
|
516
|
-
ts: Date.now(),
|
|
517
|
-
to,
|
|
518
|
-
payload: {
|
|
519
|
-
kind,
|
|
520
|
-
body,
|
|
521
|
-
data: options.data,
|
|
522
|
-
thread: options.thread,
|
|
523
|
-
},
|
|
524
|
-
payload_meta: {
|
|
525
|
-
sync: {
|
|
526
|
-
correlationId,
|
|
527
|
-
timeoutMs,
|
|
528
|
-
blocking: true,
|
|
529
|
-
},
|
|
530
|
-
},
|
|
531
|
-
};
|
|
532
|
-
|
|
533
|
-
const sent = this.send(envelope);
|
|
534
|
-
if (!sent) {
|
|
535
|
-
clearTimeout(timeoutHandle);
|
|
536
|
-
this.pendingSyncAcks.delete(correlationId);
|
|
537
|
-
reject(new Error('Failed to send message'));
|
|
538
|
-
}
|
|
539
|
-
});
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
/**
|
|
543
|
-
* Send a request to another agent and wait for their response.
|
|
544
|
-
*
|
|
545
|
-
* This implements a request/response pattern where the message is sent with
|
|
546
|
-
* a correlation ID, and the method waits for the target agent to respond
|
|
547
|
-
* with a message containing that correlation ID.
|
|
548
|
-
*
|
|
549
|
-
* @example
|
|
550
|
-
* ```typescript
|
|
551
|
-
* // Simple request
|
|
552
|
-
* const response = await client.request('Worker', 'Process this task');
|
|
553
|
-
* console.log(response.body); // Worker's response
|
|
554
|
-
*
|
|
555
|
-
* // With options
|
|
556
|
-
* const response = await client.request('Worker', 'Process task', {
|
|
557
|
-
* timeout: 60000,
|
|
558
|
-
* data: { taskId: '123', priority: 'high' },
|
|
559
|
-
* thread: 'task-thread-1',
|
|
560
|
-
* });
|
|
561
|
-
* ```
|
|
562
|
-
*
|
|
563
|
-
* @param to - Target agent name
|
|
564
|
-
* @param body - Request message body
|
|
565
|
-
* @param options - Request options (timeout, data, thread, kind)
|
|
566
|
-
* @returns Promise that resolves with the response from the target agent
|
|
567
|
-
* @throws Error if client is not ready, send fails, timeout occurs, or agent disconnects
|
|
568
|
-
*/
|
|
569
|
-
async request(to: string, body: string, options: RequestOptions = {}): Promise<RequestResponse> {
|
|
570
|
-
if (this._state !== 'READY') {
|
|
571
|
-
throw new Error('Client not ready');
|
|
201
|
+
if (this.startingPromise) {
|
|
202
|
+
return this.startingPromise;
|
|
572
203
|
}
|
|
573
204
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
}
|
|
205
|
+
this.startingPromise = this.startInternal();
|
|
206
|
+
try {
|
|
207
|
+
await this.startingPromise;
|
|
208
|
+
} finally {
|
|
209
|
+
this.startingPromise = undefined;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Pre-register a batch of agents with Relaycast before their steps execute.
|
|
215
|
+
* The broker warms its token cache in parallel; subsequent spawn_agent calls
|
|
216
|
+
* hit the cache rather than waiting on individual HTTP registrations.
|
|
217
|
+
* Fire-and-forget from the caller's perspective — broker responds immediately
|
|
218
|
+
* and registers in the background.
|
|
219
|
+
*/
|
|
220
|
+
async preflightAgents(agents: Array<{ name: string; cli: string | AgentRuntime }>): Promise<void> {
|
|
221
|
+
if (agents.length === 0) return;
|
|
222
|
+
await this.start();
|
|
223
|
+
await this.requestOk<void>('preflight_agents', { agents });
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
async spawnPty(input: SpawnPtyInput): Promise<{ name: string; runtime: AgentRuntime }> {
|
|
227
|
+
await this.start();
|
|
228
|
+
const args = buildPtyArgsWithModel(input.cli, input.args ?? [], input.model);
|
|
229
|
+
const agent: AgentSpec = {
|
|
230
|
+
name: input.name,
|
|
231
|
+
runtime: 'pty',
|
|
232
|
+
cli: input.cli,
|
|
233
|
+
args,
|
|
234
|
+
channels: input.channels ?? [],
|
|
235
|
+
model: input.model,
|
|
236
|
+
cwd: input.cwd ?? this.options.cwd,
|
|
237
|
+
team: input.team,
|
|
238
|
+
shadow_of: input.shadowOf,
|
|
239
|
+
shadow_mode: input.shadowMode,
|
|
240
|
+
restart_policy: input.restartPolicy,
|
|
241
|
+
};
|
|
242
|
+
const result = await this.requestOk<{ name: string; runtime: AgentRuntime }>('spawn_agent', {
|
|
243
|
+
agent,
|
|
244
|
+
...(input.task != null ? { initial_task: input.task } : {}),
|
|
245
|
+
...(input.idleThresholdSecs != null ? { idle_threshold_secs: input.idleThresholdSecs } : {}),
|
|
246
|
+
...(input.continueFrom != null ? { continue_from: input.continueFrom } : {}),
|
|
617
247
|
});
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
* @returns true if the message was sent
|
|
631
|
-
*/
|
|
632
|
-
respond(correlationId: string, to: string, body: string, data?: Record<string, unknown>): boolean {
|
|
633
|
-
if (this._state !== 'READY') {
|
|
634
|
-
return false;
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
const envelope: SendEnvelope = {
|
|
638
|
-
v: PROTOCOL_VERSION,
|
|
639
|
-
type: 'SEND',
|
|
640
|
-
id: generateId(),
|
|
641
|
-
ts: Date.now(),
|
|
642
|
-
to,
|
|
643
|
-
payload: {
|
|
644
|
-
kind: 'message',
|
|
645
|
-
body,
|
|
646
|
-
data: {
|
|
647
|
-
...data,
|
|
648
|
-
_correlationId: correlationId,
|
|
649
|
-
_isResponse: true,
|
|
650
|
-
},
|
|
651
|
-
},
|
|
652
|
-
payload_meta: {
|
|
653
|
-
replyTo: correlationId,
|
|
654
|
-
},
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
async spawnHeadlessClaude(
|
|
252
|
+
input: SpawnHeadlessClaudeInput
|
|
253
|
+
): Promise<{ name: string; runtime: AgentRuntime }> {
|
|
254
|
+
await this.start();
|
|
255
|
+
const agent: AgentSpec = {
|
|
256
|
+
name: input.name,
|
|
257
|
+
runtime: 'headless_claude',
|
|
258
|
+
args: input.args ?? [],
|
|
259
|
+
channels: input.channels ?? [],
|
|
655
260
|
};
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
/**
|
|
661
|
-
* Broadcast a message to all agents.
|
|
662
|
-
*/
|
|
663
|
-
broadcast(body: string, kind: PayloadKind = 'message', data?: Record<string, unknown>): boolean {
|
|
664
|
-
return this.sendMessage('*', body, kind, data);
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
/**
|
|
668
|
-
* Subscribe to a topic.
|
|
669
|
-
*/
|
|
670
|
-
subscribe(topic: string): boolean {
|
|
671
|
-
if (this._state !== 'READY') return false;
|
|
672
|
-
|
|
673
|
-
return this.send({
|
|
674
|
-
v: PROTOCOL_VERSION,
|
|
675
|
-
type: 'SUBSCRIBE',
|
|
676
|
-
id: generateId(),
|
|
677
|
-
ts: Date.now(),
|
|
678
|
-
topic,
|
|
679
|
-
payload: {},
|
|
261
|
+
const result = await this.requestOk<{ name: string; runtime: AgentRuntime }>('spawn_agent', {
|
|
262
|
+
agent,
|
|
263
|
+
...(input.task != null ? { initial_task: input.task } : {}),
|
|
680
264
|
});
|
|
265
|
+
return result;
|
|
681
266
|
}
|
|
682
267
|
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
unsubscribe(topic: string): boolean {
|
|
687
|
-
if (this._state !== 'READY') return false;
|
|
688
|
-
|
|
689
|
-
return this.send({
|
|
690
|
-
v: PROTOCOL_VERSION,
|
|
691
|
-
type: 'UNSUBSCRIBE',
|
|
692
|
-
id: generateId(),
|
|
693
|
-
ts: Date.now(),
|
|
694
|
-
topic,
|
|
695
|
-
payload: {},
|
|
696
|
-
});
|
|
268
|
+
async release(name: string, reason?: string): Promise<{ name: string }> {
|
|
269
|
+
await this.start();
|
|
270
|
+
return this.requestOk<{ name: string }>('release_agent', { name, reason });
|
|
697
271
|
}
|
|
698
272
|
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
bindAsShadow(
|
|
703
|
-
primaryAgent: string,
|
|
704
|
-
options: {
|
|
705
|
-
speakOn?: SpeakOnTrigger[];
|
|
706
|
-
receiveIncoming?: boolean;
|
|
707
|
-
receiveOutgoing?: boolean;
|
|
708
|
-
} = {}
|
|
709
|
-
): boolean {
|
|
710
|
-
if (this._state !== 'READY') return false;
|
|
711
|
-
|
|
712
|
-
return this.send({
|
|
713
|
-
v: PROTOCOL_VERSION,
|
|
714
|
-
type: 'SHADOW_BIND',
|
|
715
|
-
id: generateId(),
|
|
716
|
-
ts: Date.now(),
|
|
717
|
-
payload: {
|
|
718
|
-
primaryAgent,
|
|
719
|
-
speakOn: options.speakOn,
|
|
720
|
-
receiveIncoming: options.receiveIncoming,
|
|
721
|
-
receiveOutgoing: options.receiveOutgoing,
|
|
722
|
-
},
|
|
723
|
-
});
|
|
273
|
+
async sendInput(name: string, data: string): Promise<{ name: string; bytes_written: number }> {
|
|
274
|
+
await this.start();
|
|
275
|
+
return this.requestOk<{ name: string; bytes_written: number }>('send_input', { name, data });
|
|
724
276
|
}
|
|
725
277
|
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
return this.
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
ts: Date.now(),
|
|
737
|
-
payload: {
|
|
738
|
-
primaryAgent,
|
|
739
|
-
},
|
|
278
|
+
async setModel(
|
|
279
|
+
name: string,
|
|
280
|
+
model: string,
|
|
281
|
+
opts?: { timeoutMs?: number }
|
|
282
|
+
): Promise<{ name: string; model: string; success: boolean }> {
|
|
283
|
+
await this.start();
|
|
284
|
+
return this.requestOk<{ name: string; model: string; success: boolean }>('set_model', {
|
|
285
|
+
name,
|
|
286
|
+
model,
|
|
287
|
+
timeout_ms: opts?.timeoutMs,
|
|
740
288
|
});
|
|
741
289
|
}
|
|
742
290
|
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
v: PROTOCOL_VERSION,
|
|
753
|
-
type: 'LOG',
|
|
754
|
-
id: generateId(),
|
|
755
|
-
ts: Date.now(),
|
|
756
|
-
payload: {
|
|
757
|
-
data,
|
|
758
|
-
timestamp: Date.now(),
|
|
759
|
-
},
|
|
760
|
-
};
|
|
761
|
-
|
|
762
|
-
return this.send(envelope);
|
|
291
|
+
async getMetrics(agent?: string): Promise<{
|
|
292
|
+
agents: Array<{ name: string; pid: number; memory_bytes: number; uptime_secs: number }>;
|
|
293
|
+
broker?: BrokerStats;
|
|
294
|
+
}> {
|
|
295
|
+
await this.start();
|
|
296
|
+
return this.requestOk<{
|
|
297
|
+
agents: Array<{ name: string; pid: number; memory_bytes: number; uptime_secs: number }>;
|
|
298
|
+
broker?: BrokerStats;
|
|
299
|
+
}>('get_metrics', { agent });
|
|
763
300
|
}
|
|
764
301
|
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
/**
|
|
770
|
-
* Spawn a new agent via the relay daemon.
|
|
771
|
-
* @param options - Spawn options
|
|
772
|
-
* @param options.name - Name for the new agent
|
|
773
|
-
* @param options.cli - CLI to use (claude, codex, gemini, etc.)
|
|
774
|
-
* @param options.task - Task description
|
|
775
|
-
* @param options.cwd - Working directory
|
|
776
|
-
* @param options.team - Team name
|
|
777
|
-
* @param options.interactive - Interactive mode
|
|
778
|
-
* @param options.shadowMode - Shadow execution mode ('subagent' or 'process')
|
|
779
|
-
* @param options.shadowOf - Spawn as shadow of this agent
|
|
780
|
-
* @param options.shadowAgent - Shadow agent profile to use (for subagent mode)
|
|
781
|
-
* @param options.shadowTriggers - When to trigger the shadow (for subagent mode)
|
|
782
|
-
* @param options.shadowSpeakOn - Shadow speak-on triggers
|
|
783
|
-
* @param options.waitForReady - Wait for the agent to be ready before resolving (default: false)
|
|
784
|
-
* @param options.readyTimeoutMs - Timeout for agent to become ready (default: 60000ms)
|
|
785
|
-
* @param timeoutMs - Timeout for spawn operation (default: 60000ms)
|
|
786
|
-
* @returns Spawn result. When waitForReady is true, includes `ready` and `readyInfo` fields.
|
|
787
|
-
*/
|
|
788
|
-
async spawn(
|
|
789
|
-
options: {
|
|
790
|
-
name: string;
|
|
791
|
-
cli: string;
|
|
792
|
-
task?: string;
|
|
793
|
-
cwd?: string;
|
|
794
|
-
team?: string;
|
|
795
|
-
/** Model override (e.g., 'opus', 'sonnet', 'haiku'). Takes precedence over agent profile. */
|
|
796
|
-
model?: string;
|
|
797
|
-
interactive?: boolean;
|
|
798
|
-
shadowMode?: 'subagent' | 'process';
|
|
799
|
-
shadowOf?: string;
|
|
800
|
-
shadowAgent?: string;
|
|
801
|
-
shadowTriggers?: SpeakOnTrigger[];
|
|
802
|
-
shadowSpeakOn?: SpeakOnTrigger[];
|
|
803
|
-
/** User ID for cloud persistence */
|
|
804
|
-
userId?: string;
|
|
805
|
-
/** Include ACK/DONE workflow conventions in agent instructions */
|
|
806
|
-
includeWorkflowConventions?: boolean;
|
|
807
|
-
/** Override the spawner name (defaults to this client's agentName) */
|
|
808
|
-
spawnerName?: string;
|
|
809
|
-
/** Wait for the agent to complete connection before resolving */
|
|
810
|
-
waitForReady?: boolean;
|
|
811
|
-
/** Timeout for agent to become ready (default: 60000ms). Only used when waitForReady is true. */
|
|
812
|
-
readyTimeoutMs?: number;
|
|
813
|
-
},
|
|
814
|
-
timeoutMs = 60000
|
|
815
|
-
): Promise<SpawnResult> {
|
|
816
|
-
if (this._state !== 'READY') {
|
|
817
|
-
throw new Error('Client not ready');
|
|
818
|
-
}
|
|
819
|
-
|
|
820
|
-
const envelopeId = generateId();
|
|
821
|
-
const waitForReady = options.waitForReady ?? false;
|
|
822
|
-
const readyTimeoutMs = options.readyTimeoutMs ?? 60000;
|
|
823
|
-
|
|
824
|
-
// If waitForReady, set up the agent ready listener BEFORE spawning
|
|
825
|
-
// This ensures we don't miss the AGENT_READY event if it arrives quickly
|
|
826
|
-
let readyPromise: Promise<AgentReadyPayload> | undefined;
|
|
827
|
-
if (waitForReady) {
|
|
828
|
-
// Check if we're already waiting for this agent (prevents overwriting existing waiter)
|
|
829
|
-
if (this.pendingAgentReady.has(options.name)) {
|
|
830
|
-
throw new Error(`Already waiting for agent ${options.name} to be ready`);
|
|
831
|
-
}
|
|
832
|
-
|
|
833
|
-
readyPromise = new Promise<AgentReadyPayload>((resolve, reject) => {
|
|
834
|
-
const timeoutHandle = setTimeout(() => {
|
|
835
|
-
this.pendingAgentReady.delete(options.name);
|
|
836
|
-
reject(new Error(`Agent ${options.name} did not become ready within ${readyTimeoutMs}ms`));
|
|
837
|
-
}, readyTimeoutMs);
|
|
302
|
+
async getCrashInsights(): Promise<CrashInsightsResponse> {
|
|
303
|
+
await this.start();
|
|
304
|
+
return this.requestOk<CrashInsightsResponse>('get_crash_insights', {});
|
|
305
|
+
}
|
|
838
306
|
|
|
839
|
-
|
|
307
|
+
async sendMessage(input: SendMessageInput): Promise<{ event_id: string; targets: string[] }> {
|
|
308
|
+
await this.start();
|
|
309
|
+
try {
|
|
310
|
+
return await this.requestOk<{ event_id: string; targets: string[] }>('send_message', {
|
|
311
|
+
to: input.to,
|
|
312
|
+
text: input.text,
|
|
313
|
+
from: input.from,
|
|
314
|
+
thread_id: input.threadId,
|
|
315
|
+
priority: input.priority,
|
|
316
|
+
data: input.data,
|
|
840
317
|
});
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
const spawnResult = await new Promise<SpawnResultPayload>((resolve, reject) => {
|
|
845
|
-
const timeoutHandle = setTimeout(() => {
|
|
846
|
-
this.pendingSpawns.delete(envelopeId);
|
|
847
|
-
// Also clean up pending agent ready if spawn times out
|
|
848
|
-
if (waitForReady) {
|
|
849
|
-
const pending = this.pendingAgentReady.get(options.name);
|
|
850
|
-
if (pending) {
|
|
851
|
-
clearTimeout(pending.timeoutHandle);
|
|
852
|
-
this.pendingAgentReady.delete(options.name);
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
reject(new Error(`Spawn timeout after ${timeoutMs}ms`));
|
|
856
|
-
}, timeoutMs);
|
|
857
|
-
|
|
858
|
-
this.pendingSpawns.set(envelopeId, { resolve, reject, timeoutHandle });
|
|
859
|
-
|
|
860
|
-
const envelope: SpawnEnvelope = {
|
|
861
|
-
v: PROTOCOL_VERSION,
|
|
862
|
-
type: 'SPAWN',
|
|
863
|
-
id: envelopeId,
|
|
864
|
-
ts: Date.now(),
|
|
865
|
-
payload: {
|
|
866
|
-
name: options.name,
|
|
867
|
-
cli: options.cli,
|
|
868
|
-
task: options.task || '',
|
|
869
|
-
cwd: options.cwd,
|
|
870
|
-
team: options.team,
|
|
871
|
-
model: options.model,
|
|
872
|
-
interactive: options.interactive,
|
|
873
|
-
shadowMode: options.shadowMode,
|
|
874
|
-
shadowOf: options.shadowOf,
|
|
875
|
-
shadowAgent: options.shadowAgent,
|
|
876
|
-
shadowTriggers: options.shadowTriggers,
|
|
877
|
-
shadowSpeakOn: options.shadowSpeakOn,
|
|
878
|
-
userId: options.userId,
|
|
879
|
-
includeWorkflowConventions: options.includeWorkflowConventions,
|
|
880
|
-
spawnerName: options.spawnerName || this.config.agentName,
|
|
881
|
-
},
|
|
882
|
-
};
|
|
883
|
-
|
|
884
|
-
const sent = this.send(envelope);
|
|
885
|
-
if (!sent) {
|
|
886
|
-
clearTimeout(timeoutHandle);
|
|
887
|
-
this.pendingSpawns.delete(envelopeId);
|
|
888
|
-
// Also clean up pending agent ready if send fails
|
|
889
|
-
if (waitForReady) {
|
|
890
|
-
const pending = this.pendingAgentReady.get(options.name);
|
|
891
|
-
if (pending) {
|
|
892
|
-
clearTimeout(pending.timeoutHandle);
|
|
893
|
-
this.pendingAgentReady.delete(options.name);
|
|
894
|
-
}
|
|
895
|
-
}
|
|
896
|
-
reject(new Error('Failed to send spawn message'));
|
|
897
|
-
}
|
|
898
|
-
});
|
|
899
|
-
|
|
900
|
-
// If spawn failed or we don't need to wait for ready, return immediately
|
|
901
|
-
if (!spawnResult.success || !waitForReady || !readyPromise) {
|
|
902
|
-
// Clean up pending agent ready if spawn failed
|
|
903
|
-
if (!spawnResult.success && waitForReady) {
|
|
904
|
-
const pending = this.pendingAgentReady.get(options.name);
|
|
905
|
-
if (pending) {
|
|
906
|
-
clearTimeout(pending.timeoutHandle);
|
|
907
|
-
this.pendingAgentReady.delete(options.name);
|
|
908
|
-
}
|
|
318
|
+
} catch (error) {
|
|
319
|
+
if (error instanceof AgentRelayProtocolError && error.code === 'unsupported_operation') {
|
|
320
|
+
return { event_id: 'unsupported_operation', targets: [] };
|
|
909
321
|
}
|
|
910
|
-
|
|
911
|
-
}
|
|
912
|
-
|
|
913
|
-
// Wait for the agent to become ready
|
|
914
|
-
try {
|
|
915
|
-
const readyInfo = await readyPromise;
|
|
916
|
-
return {
|
|
917
|
-
...spawnResult,
|
|
918
|
-
ready: true,
|
|
919
|
-
readyInfo,
|
|
920
|
-
};
|
|
921
|
-
} catch (err) {
|
|
922
|
-
// Agent spawned but didn't become ready in time
|
|
923
|
-
// Return the spawn result with ready: false
|
|
924
|
-
return {
|
|
925
|
-
...spawnResult,
|
|
926
|
-
ready: false,
|
|
927
|
-
};
|
|
322
|
+
throw error;
|
|
928
323
|
}
|
|
929
324
|
}
|
|
930
325
|
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
*
|
|
936
|
-
* @example
|
|
937
|
-
* ```typescript
|
|
938
|
-
* // Wait for an agent that might be spawning
|
|
939
|
-
* try {
|
|
940
|
-
* const readyInfo = await client.waitForAgentReady('Worker', 30000);
|
|
941
|
-
* console.log(`Worker is ready: ${readyInfo.cli}`);
|
|
942
|
-
* } catch (err) {
|
|
943
|
-
* console.error('Worker did not become ready in time');
|
|
944
|
-
* }
|
|
945
|
-
* ```
|
|
946
|
-
*
|
|
947
|
-
* @param name - Agent name to wait for
|
|
948
|
-
* @param timeoutMs - Timeout in milliseconds (default: 60000ms)
|
|
949
|
-
* @returns Promise that resolves with AgentReadyPayload when the agent connects
|
|
950
|
-
* @throws Error if the agent doesn't become ready within the timeout
|
|
951
|
-
*/
|
|
952
|
-
async waitForAgentReady(name: string, timeoutMs = 60000): Promise<AgentReadyPayload> {
|
|
953
|
-
if (this._state !== 'READY') {
|
|
954
|
-
throw new Error('Client not ready');
|
|
955
|
-
}
|
|
956
|
-
|
|
957
|
-
// Check if we're already waiting for this agent
|
|
958
|
-
if (this.pendingAgentReady.has(name)) {
|
|
959
|
-
throw new Error(`Already waiting for agent ${name} to be ready`);
|
|
960
|
-
}
|
|
961
|
-
|
|
962
|
-
return new Promise<AgentReadyPayload>((resolve, reject) => {
|
|
963
|
-
const timeoutHandle = setTimeout(() => {
|
|
964
|
-
this.pendingAgentReady.delete(name);
|
|
965
|
-
reject(new Error(`Agent ${name} did not become ready within ${timeoutMs}ms`));
|
|
966
|
-
}, timeoutMs);
|
|
967
|
-
|
|
968
|
-
this.pendingAgentReady.set(name, { resolve, reject, timeoutHandle });
|
|
969
|
-
});
|
|
326
|
+
async listAgents(): Promise<ListAgent[]> {
|
|
327
|
+
await this.start();
|
|
328
|
+
const result = await this.requestOk<{ agents: ListAgent[] }>('list_agents', {});
|
|
329
|
+
return result.agents;
|
|
970
330
|
}
|
|
971
331
|
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
* @param timeoutMs - Timeout for release operation (default: 10000ms)
|
|
976
|
-
*/
|
|
977
|
-
async release(name: string, reason?: string, timeoutMs = 10000): Promise<ReleaseResultPayload> {
|
|
978
|
-
if (this._state !== 'READY') {
|
|
979
|
-
throw new Error('Client not ready');
|
|
980
|
-
}
|
|
981
|
-
|
|
982
|
-
const envelopeId = generateId();
|
|
983
|
-
|
|
984
|
-
return new Promise<ReleaseResultPayload>((resolve, reject) => {
|
|
985
|
-
const timeoutHandle = setTimeout(() => {
|
|
986
|
-
this.pendingReleases.delete(envelopeId);
|
|
987
|
-
reject(new Error(`Release timeout after ${timeoutMs}ms`));
|
|
988
|
-
}, timeoutMs);
|
|
989
|
-
|
|
990
|
-
this.pendingReleases.set(envelopeId, { resolve, reject, timeoutHandle });
|
|
991
|
-
|
|
992
|
-
const envelope: ReleaseEnvelope = {
|
|
993
|
-
v: PROTOCOL_VERSION,
|
|
994
|
-
type: 'RELEASE',
|
|
995
|
-
id: envelopeId,
|
|
996
|
-
ts: Date.now(),
|
|
997
|
-
payload: {
|
|
998
|
-
name,
|
|
999
|
-
reason,
|
|
1000
|
-
},
|
|
1001
|
-
};
|
|
1002
|
-
|
|
1003
|
-
const sent = this.send(envelope);
|
|
1004
|
-
if (!sent) {
|
|
1005
|
-
clearTimeout(timeoutHandle);
|
|
1006
|
-
this.pendingReleases.delete(envelopeId);
|
|
1007
|
-
reject(new Error('Failed to send release message'));
|
|
1008
|
-
}
|
|
1009
|
-
});
|
|
332
|
+
async getStatus(): Promise<BrokerStatus> {
|
|
333
|
+
await this.start();
|
|
334
|
+
return this.requestOk<BrokerStatus>('get_status', {});
|
|
1010
335
|
}
|
|
1011
336
|
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
* @param data - Input data to send
|
|
1016
|
-
* @param timeoutMs - Timeout for the operation (default: 10000ms)
|
|
1017
|
-
*/
|
|
1018
|
-
async sendWorkerInput(name: string, data: string, timeoutMs = 10000): Promise<SendInputResultPayload> {
|
|
1019
|
-
if (this._state !== 'READY') {
|
|
1020
|
-
throw new Error('Client not ready');
|
|
337
|
+
async shutdown(): Promise<void> {
|
|
338
|
+
if (!this.child) {
|
|
339
|
+
return;
|
|
1021
340
|
}
|
|
1022
341
|
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
this.pendingSendInputs.delete(envelopeId);
|
|
1028
|
-
reject(new Error(`Send input timeout after ${timeoutMs}ms`));
|
|
1029
|
-
}, timeoutMs);
|
|
1030
|
-
|
|
1031
|
-
this.pendingSendInputs.set(envelopeId, { resolve, reject, timeoutHandle });
|
|
1032
|
-
|
|
1033
|
-
const envelope: SendInputEnvelope = {
|
|
1034
|
-
v: PROTOCOL_VERSION,
|
|
1035
|
-
type: 'SEND_INPUT',
|
|
1036
|
-
id: envelopeId,
|
|
1037
|
-
ts: Date.now(),
|
|
1038
|
-
payload: {
|
|
1039
|
-
name,
|
|
1040
|
-
data,
|
|
1041
|
-
},
|
|
1042
|
-
};
|
|
1043
|
-
|
|
1044
|
-
const sent = this.send(envelope);
|
|
1045
|
-
if (!sent) {
|
|
1046
|
-
clearTimeout(timeoutHandle);
|
|
1047
|
-
this.pendingSendInputs.delete(envelopeId);
|
|
1048
|
-
reject(new Error('Failed to send input message'));
|
|
1049
|
-
}
|
|
1050
|
-
});
|
|
1051
|
-
}
|
|
1052
|
-
|
|
1053
|
-
/**
|
|
1054
|
-
* Change the model of a running spawned agent.
|
|
1055
|
-
* The command waits for the agent to be idle before sending the model switch command.
|
|
1056
|
-
*
|
|
1057
|
-
* @param name - Agent name to switch model for
|
|
1058
|
-
* @param model - Target model (e.g., 'opus', 'sonnet', 'haiku')
|
|
1059
|
-
* @param options - Options including idle wait timeout
|
|
1060
|
-
* @param operationTimeoutMs - Timeout for the overall protocol operation (default: 45000ms)
|
|
1061
|
-
*/
|
|
1062
|
-
async setWorkerModel(
|
|
1063
|
-
name: string,
|
|
1064
|
-
model: string,
|
|
1065
|
-
options?: { timeoutMs?: number },
|
|
1066
|
-
operationTimeoutMs = 45000,
|
|
1067
|
-
): Promise<SetModelResultPayload> {
|
|
1068
|
-
if (this._state !== 'READY') {
|
|
1069
|
-
throw new Error('Client not ready');
|
|
342
|
+
try {
|
|
343
|
+
await this.requestOk('shutdown', {});
|
|
344
|
+
} catch {
|
|
345
|
+
// Continue shutdown path if broker is already unhealthy.
|
|
1070
346
|
}
|
|
1071
347
|
|
|
1072
|
-
const
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
reject(new Error(`Set model timeout after ${operationTimeoutMs}ms`));
|
|
1078
|
-
}, operationTimeoutMs);
|
|
1079
|
-
|
|
1080
|
-
this.pendingSetModels.set(envelopeId, { resolve, reject, timeoutHandle });
|
|
1081
|
-
|
|
1082
|
-
const envelope: SetModelEnvelope = {
|
|
1083
|
-
v: PROTOCOL_VERSION,
|
|
1084
|
-
type: 'SET_MODEL',
|
|
1085
|
-
id: envelopeId,
|
|
1086
|
-
ts: Date.now(),
|
|
1087
|
-
payload: {
|
|
1088
|
-
name,
|
|
1089
|
-
model,
|
|
1090
|
-
timeoutMs: options?.timeoutMs,
|
|
1091
|
-
},
|
|
1092
|
-
};
|
|
1093
|
-
|
|
1094
|
-
const sent = this.send(envelope);
|
|
1095
|
-
if (!sent) {
|
|
1096
|
-
clearTimeout(timeoutHandle);
|
|
1097
|
-
this.pendingSetModels.delete(envelopeId);
|
|
1098
|
-
reject(new Error('Failed to send set model message'));
|
|
348
|
+
const child = this.child;
|
|
349
|
+
const wait = this.exitPromise ?? Promise.resolve();
|
|
350
|
+
const timeout = setTimeout(() => {
|
|
351
|
+
if (!child.killed) {
|
|
352
|
+
child.kill('SIGTERM');
|
|
1099
353
|
}
|
|
1100
|
-
});
|
|
1101
|
-
}
|
|
354
|
+
}, this.options.shutdownTimeoutMs);
|
|
1102
355
|
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
throw new Error('Client not ready');
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
const envelopeId = generateId();
|
|
1113
|
-
|
|
1114
|
-
return new Promise<ListWorkersResultPayload>((resolve, reject) => {
|
|
1115
|
-
const timeoutHandle = setTimeout(() => {
|
|
1116
|
-
this.pendingListWorkers.delete(envelopeId);
|
|
1117
|
-
reject(new Error(`List workers timeout after ${timeoutMs}ms`));
|
|
1118
|
-
}, timeoutMs);
|
|
1119
|
-
|
|
1120
|
-
this.pendingListWorkers.set(envelopeId, { resolve, reject, timeoutHandle });
|
|
1121
|
-
|
|
1122
|
-
const envelope: ListWorkersEnvelope = {
|
|
1123
|
-
v: PROTOCOL_VERSION,
|
|
1124
|
-
type: 'LIST_WORKERS',
|
|
1125
|
-
id: envelopeId,
|
|
1126
|
-
ts: Date.now(),
|
|
1127
|
-
payload: {},
|
|
1128
|
-
};
|
|
1129
|
-
|
|
1130
|
-
const sent = this.send(envelope);
|
|
1131
|
-
if (!sent) {
|
|
1132
|
-
clearTimeout(timeoutHandle);
|
|
1133
|
-
this.pendingListWorkers.delete(envelopeId);
|
|
1134
|
-
reject(new Error('Failed to send list workers message'));
|
|
356
|
+
try {
|
|
357
|
+
await wait;
|
|
358
|
+
} finally {
|
|
359
|
+
clearTimeout(timeout);
|
|
360
|
+
if (this.child) {
|
|
361
|
+
this.child.kill('SIGKILL');
|
|
1135
362
|
}
|
|
1136
|
-
});
|
|
1137
|
-
}
|
|
1138
|
-
|
|
1139
|
-
// =============================================================================
|
|
1140
|
-
// Channel Operations
|
|
1141
|
-
// =============================================================================
|
|
1142
|
-
|
|
1143
|
-
/**
|
|
1144
|
-
* Join a channel.
|
|
1145
|
-
* @param channel - Channel name (e.g., '#general', 'dm:alice:bob')
|
|
1146
|
-
* @param displayName - Optional display name for this member
|
|
1147
|
-
*/
|
|
1148
|
-
joinChannel(channel: string, displayName?: string): boolean {
|
|
1149
|
-
if (this._state !== 'READY') {
|
|
1150
|
-
return false;
|
|
1151
363
|
}
|
|
1152
|
-
|
|
1153
|
-
const envelope: ChannelJoinEnvelope = {
|
|
1154
|
-
v: PROTOCOL_VERSION,
|
|
1155
|
-
type: 'CHANNEL_JOIN',
|
|
1156
|
-
id: generateId(),
|
|
1157
|
-
ts: Date.now(),
|
|
1158
|
-
payload: {
|
|
1159
|
-
channel,
|
|
1160
|
-
displayName,
|
|
1161
|
-
},
|
|
1162
|
-
};
|
|
1163
|
-
|
|
1164
|
-
return this.send(envelope);
|
|
1165
|
-
}
|
|
1166
|
-
|
|
1167
|
-
/**
|
|
1168
|
-
* Admin join: Add any member to a channel (does not require member to be connected).
|
|
1169
|
-
* @param channel - Channel name
|
|
1170
|
-
* @param member - Name of the member to add
|
|
1171
|
-
*/
|
|
1172
|
-
adminJoinChannel(channel: string, member: string): boolean {
|
|
1173
|
-
if (this._state !== 'READY') {
|
|
1174
|
-
return false;
|
|
1175
|
-
}
|
|
1176
|
-
|
|
1177
|
-
const envelope: ChannelJoinEnvelope = {
|
|
1178
|
-
v: PROTOCOL_VERSION,
|
|
1179
|
-
type: 'CHANNEL_JOIN',
|
|
1180
|
-
id: generateId(),
|
|
1181
|
-
ts: Date.now(),
|
|
1182
|
-
payload: {
|
|
1183
|
-
channel,
|
|
1184
|
-
member,
|
|
1185
|
-
},
|
|
1186
|
-
};
|
|
1187
|
-
|
|
1188
|
-
return this.send(envelope);
|
|
1189
364
|
}
|
|
1190
365
|
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
* @param reason - Optional reason for leaving
|
|
1195
|
-
*/
|
|
1196
|
-
leaveChannel(channel: string, reason?: string): boolean {
|
|
1197
|
-
if (this._state !== 'READY') return false;
|
|
1198
|
-
|
|
1199
|
-
const envelope: ChannelLeaveEnvelope = {
|
|
1200
|
-
v: PROTOCOL_VERSION,
|
|
1201
|
-
type: 'CHANNEL_LEAVE',
|
|
1202
|
-
id: generateId(),
|
|
1203
|
-
ts: Date.now(),
|
|
1204
|
-
payload: {
|
|
1205
|
-
channel,
|
|
1206
|
-
reason,
|
|
1207
|
-
},
|
|
1208
|
-
};
|
|
1209
|
-
|
|
1210
|
-
return this.send(envelope);
|
|
1211
|
-
}
|
|
1212
|
-
|
|
1213
|
-
/**
|
|
1214
|
-
* Admin remove: Remove any member from a channel.
|
|
1215
|
-
* @param channel - Channel name
|
|
1216
|
-
* @param member - Name of the member to remove
|
|
1217
|
-
*/
|
|
1218
|
-
adminRemoveMember(channel: string, member: string): boolean {
|
|
1219
|
-
if (this._state !== 'READY') {
|
|
1220
|
-
return false;
|
|
366
|
+
async waitForExit(): Promise<void> {
|
|
367
|
+
if (!this.child) {
|
|
368
|
+
return;
|
|
1221
369
|
}
|
|
1222
|
-
|
|
1223
|
-
const envelope: ChannelLeaveEnvelope = {
|
|
1224
|
-
v: PROTOCOL_VERSION,
|
|
1225
|
-
type: 'CHANNEL_LEAVE',
|
|
1226
|
-
id: generateId(),
|
|
1227
|
-
ts: Date.now(),
|
|
1228
|
-
payload: {
|
|
1229
|
-
channel,
|
|
1230
|
-
member,
|
|
1231
|
-
},
|
|
1232
|
-
};
|
|
1233
|
-
|
|
1234
|
-
return this.send(envelope);
|
|
370
|
+
await this.exitPromise;
|
|
1235
371
|
}
|
|
1236
372
|
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
* @param options - Optional thread, mentions, attachments
|
|
1242
|
-
*/
|
|
1243
|
-
sendChannelMessage(
|
|
1244
|
-
channel: string,
|
|
1245
|
-
body: string,
|
|
1246
|
-
options?: {
|
|
1247
|
-
thread?: string;
|
|
1248
|
-
mentions?: string[];
|
|
1249
|
-
attachments?: MessageAttachment[];
|
|
1250
|
-
data?: Record<string, unknown>;
|
|
373
|
+
private async startInternal(): Promise<void> {
|
|
374
|
+
const resolvedBinary = expandTilde(this.options.binaryPath);
|
|
375
|
+
if (isExplicitPath(this.options.binaryPath) && !fs.existsSync(resolvedBinary)) {
|
|
376
|
+
throw new AgentRelayProcessError(`broker binary not found: ${this.options.binaryPath}`);
|
|
1251
377
|
}
|
|
1252
|
-
|
|
1253
|
-
if (this._state !== 'READY') {
|
|
1254
|
-
return false;
|
|
1255
|
-
}
|
|
1256
|
-
|
|
1257
|
-
const envelope: ChannelMessageEnvelope = {
|
|
1258
|
-
v: PROTOCOL_VERSION,
|
|
1259
|
-
type: 'CHANNEL_MESSAGE',
|
|
1260
|
-
id: generateId(),
|
|
1261
|
-
ts: Date.now(),
|
|
1262
|
-
payload: {
|
|
1263
|
-
channel,
|
|
1264
|
-
body,
|
|
1265
|
-
thread: options?.thread,
|
|
1266
|
-
mentions: options?.mentions,
|
|
1267
|
-
attachments: options?.attachments,
|
|
1268
|
-
data: options?.data,
|
|
1269
|
-
},
|
|
1270
|
-
};
|
|
1271
|
-
|
|
1272
|
-
return this.send(envelope);
|
|
1273
|
-
}
|
|
1274
|
-
|
|
1275
|
-
// =============================================================================
|
|
1276
|
-
// Consensus Operations
|
|
1277
|
-
// =============================================================================
|
|
378
|
+
this.lastStderrLine = undefined;
|
|
1278
379
|
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
* ```typescript
|
|
1287
|
-
* client.createProposal({
|
|
1288
|
-
* title: 'Approve API design',
|
|
1289
|
-
* description: 'Should we proceed with the REST API design?',
|
|
1290
|
-
* participants: ['Developer', 'Reviewer', 'Lead'],
|
|
1291
|
-
* consensusType: 'majority',
|
|
1292
|
-
* });
|
|
1293
|
-
* ```
|
|
1294
|
-
*
|
|
1295
|
-
* @param options - Proposal options
|
|
1296
|
-
* @returns true if the message was sent
|
|
1297
|
-
*/
|
|
1298
|
-
createProposal(options: CreateProposalOptions): boolean {
|
|
1299
|
-
if (this._state !== 'READY') {
|
|
1300
|
-
return false;
|
|
1301
|
-
}
|
|
1302
|
-
|
|
1303
|
-
// Build the PROPOSE command message
|
|
1304
|
-
const lines: string[] = [
|
|
1305
|
-
`PROPOSE: ${options.title}`,
|
|
1306
|
-
`TYPE: ${options.consensusType ?? 'majority'}`,
|
|
1307
|
-
`PARTICIPANTS: ${options.participants.join(', ')}`,
|
|
1308
|
-
`DESCRIPTION: ${options.description}`,
|
|
380
|
+
const args = [
|
|
381
|
+
'init',
|
|
382
|
+
'--name',
|
|
383
|
+
this.options.brokerName,
|
|
384
|
+
'--channels',
|
|
385
|
+
this.options.channels.join(','),
|
|
386
|
+
...this.options.binaryArgs,
|
|
1309
387
|
];
|
|
1310
388
|
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
}
|
|
1314
|
-
if (options.
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
const body = lines.join('\n');
|
|
1322
|
-
|
|
1323
|
-
// Send to the special _consensus recipient
|
|
1324
|
-
return this.sendMessage('_consensus', body, 'action');
|
|
1325
|
-
}
|
|
1326
|
-
|
|
1327
|
-
/**
|
|
1328
|
-
* Vote on a consensus proposal.
|
|
1329
|
-
*
|
|
1330
|
-
* @example
|
|
1331
|
-
* ```typescript
|
|
1332
|
-
* // Approve with a reason
|
|
1333
|
-
* client.vote({
|
|
1334
|
-
* proposalId: 'prop_123',
|
|
1335
|
-
* value: 'approve',
|
|
1336
|
-
* reason: 'Looks good to me',
|
|
1337
|
-
* });
|
|
1338
|
-
*
|
|
1339
|
-
* // Reject without reason
|
|
1340
|
-
* client.vote({ proposalId: 'prop_123', value: 'reject' });
|
|
1341
|
-
* ```
|
|
1342
|
-
*
|
|
1343
|
-
* @param options - Vote options
|
|
1344
|
-
* @returns true if the message was sent
|
|
1345
|
-
*/
|
|
1346
|
-
vote(options: VoteOptions): boolean {
|
|
1347
|
-
if (this._state !== 'READY') {
|
|
1348
|
-
return false;
|
|
1349
|
-
}
|
|
1350
|
-
|
|
1351
|
-
// Build the VOTE command
|
|
1352
|
-
let body = `VOTE ${options.proposalId} ${options.value}`;
|
|
1353
|
-
if (options.reason) {
|
|
1354
|
-
body += ` ${options.reason}`;
|
|
1355
|
-
}
|
|
1356
|
-
|
|
1357
|
-
// Send to the special _consensus recipient
|
|
1358
|
-
return this.sendMessage('_consensus', body, 'action');
|
|
1359
|
-
}
|
|
1360
|
-
|
|
1361
|
-
// =============================================================================
|
|
1362
|
-
// Query Operations
|
|
1363
|
-
// =============================================================================
|
|
1364
|
-
|
|
1365
|
-
/**
|
|
1366
|
-
* Send a query to the daemon and wait for a response.
|
|
1367
|
-
* @internal
|
|
1368
|
-
*/
|
|
1369
|
-
private async query<T>(type: string, payload: unknown, timeoutMs = 5000): Promise<T> {
|
|
1370
|
-
if (this._state !== 'READY') {
|
|
1371
|
-
throw new Error('Client not ready');
|
|
389
|
+
// Ensure the SDK bin directory (containing agent-relay-broker + relay_send) is on
|
|
390
|
+
// PATH so spawned workers can find relay_send without any user setup.
|
|
391
|
+
const env = { ...this.options.env };
|
|
392
|
+
if (isExplicitPath(this.options.binaryPath)) {
|
|
393
|
+
const binDir = path.dirname(path.resolve(resolvedBinary));
|
|
394
|
+
const currentPath = env.PATH ?? env.Path ?? '';
|
|
395
|
+
if (!currentPath.split(path.delimiter).includes(binDir)) {
|
|
396
|
+
env.PATH = `${binDir}${path.delimiter}${currentPath}`;
|
|
397
|
+
}
|
|
1372
398
|
}
|
|
1373
399
|
|
|
1374
|
-
|
|
400
|
+
console.log(`[broker] Starting: ${resolvedBinary} ${args.join(' ')}`);
|
|
401
|
+
const child = spawn(resolvedBinary, args, {
|
|
402
|
+
cwd: this.options.cwd,
|
|
403
|
+
env,
|
|
404
|
+
stdio: 'pipe',
|
|
405
|
+
});
|
|
1375
406
|
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
reject(new Error(`Query timeout after ${timeoutMs}ms`));
|
|
1380
|
-
}, timeoutMs);
|
|
407
|
+
this.child = child;
|
|
408
|
+
this.stdoutRl = createInterface({ input: child.stdout, crlfDelay: Infinity });
|
|
409
|
+
this.stderrRl = createInterface({ input: child.stderr, crlfDelay: Infinity });
|
|
1381
410
|
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
timeoutHandle,
|
|
1386
|
-
});
|
|
411
|
+
this.stdoutRl.on('line', (line) => {
|
|
412
|
+
this.handleStdoutLine(line);
|
|
413
|
+
});
|
|
1387
414
|
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
const sent = this.send(envelope);
|
|
1397
|
-
if (!sent) {
|
|
1398
|
-
clearTimeout(timeoutHandle);
|
|
1399
|
-
this.pendingQueries.delete(envelopeId);
|
|
1400
|
-
reject(new Error(`Failed to send ${type} query`));
|
|
415
|
+
this.stderrRl.on('line', (line) => {
|
|
416
|
+
const trimmed = line.trim();
|
|
417
|
+
if (trimmed) {
|
|
418
|
+
this.lastStderrLine = trimmed;
|
|
419
|
+
}
|
|
420
|
+
for (const listener of this.stderrListeners) {
|
|
421
|
+
listener(line);
|
|
1401
422
|
}
|
|
1402
423
|
});
|
|
1403
|
-
}
|
|
1404
|
-
|
|
1405
|
-
/**
|
|
1406
|
-
* Get daemon status information.
|
|
1407
|
-
* @returns Daemon status including version, uptime, and counts
|
|
1408
|
-
*/
|
|
1409
|
-
async getStatus(): Promise<StatusResponsePayload> {
|
|
1410
|
-
return this.query<StatusResponsePayload>('STATUS', {});
|
|
1411
|
-
}
|
|
1412
|
-
|
|
1413
|
-
/**
|
|
1414
|
-
* Get messages from the inbox.
|
|
1415
|
-
* @param options - Filter options
|
|
1416
|
-
* @param options.limit - Maximum number of messages to return
|
|
1417
|
-
* @param options.unreadOnly - Only return unread messages
|
|
1418
|
-
* @param options.from - Filter by sender
|
|
1419
|
-
* @param options.channel - Filter by channel
|
|
1420
|
-
* @returns Array of inbox messages
|
|
1421
|
-
*/
|
|
1422
|
-
async getInbox(options: {
|
|
1423
|
-
limit?: number;
|
|
1424
|
-
unreadOnly?: boolean;
|
|
1425
|
-
from?: string;
|
|
1426
|
-
channel?: string;
|
|
1427
|
-
} = {}): Promise<InboxMessage[]> {
|
|
1428
|
-
const payload: InboxPayload = {
|
|
1429
|
-
agent: this.config.agentName,
|
|
1430
|
-
limit: options.limit,
|
|
1431
|
-
unreadOnly: options.unreadOnly,
|
|
1432
|
-
from: options.from,
|
|
1433
|
-
channel: options.channel,
|
|
1434
|
-
};
|
|
1435
|
-
const response = await this.query<InboxResponsePayload>('INBOX', payload);
|
|
1436
|
-
return response.messages || [];
|
|
1437
|
-
}
|
|
1438
|
-
|
|
1439
|
-
/**
|
|
1440
|
-
* Query all messages (not filtered by recipient).
|
|
1441
|
-
* Used by dashboard to get message history.
|
|
1442
|
-
* @param options - Query options
|
|
1443
|
-
* @param options.limit - Maximum number of messages to return (default: 100)
|
|
1444
|
-
* @param options.sinceTs - Only return messages after this timestamp
|
|
1445
|
-
* @param options.from - Filter by sender
|
|
1446
|
-
* @param options.to - Filter by recipient
|
|
1447
|
-
* @param options.thread - Filter by thread ID
|
|
1448
|
-
* @param options.order - Sort order ('asc' or 'desc', default: 'desc')
|
|
1449
|
-
* @returns Array of messages
|
|
1450
|
-
*/
|
|
1451
|
-
async queryMessages(options: {
|
|
1452
|
-
limit?: number;
|
|
1453
|
-
sinceTs?: number;
|
|
1454
|
-
from?: string;
|
|
1455
|
-
to?: string;
|
|
1456
|
-
thread?: string;
|
|
1457
|
-
order?: 'asc' | 'desc';
|
|
1458
|
-
} = {}): Promise<MessagesResponsePayload['messages']> {
|
|
1459
|
-
const payload: MessagesQueryPayload = {
|
|
1460
|
-
limit: options.limit,
|
|
1461
|
-
sinceTs: options.sinceTs,
|
|
1462
|
-
from: options.from,
|
|
1463
|
-
to: options.to,
|
|
1464
|
-
thread: options.thread,
|
|
1465
|
-
order: options.order,
|
|
1466
|
-
};
|
|
1467
|
-
const response = await this.query<MessagesResponsePayload>('MESSAGES_QUERY', payload);
|
|
1468
|
-
return response.messages || [];
|
|
1469
|
-
}
|
|
1470
|
-
|
|
1471
|
-
/**
|
|
1472
|
-
* List online agents.
|
|
1473
|
-
* @param options - Filter options
|
|
1474
|
-
* @param options.includeIdle - Include idle agents (default: true)
|
|
1475
|
-
* @param options.project - Filter by project
|
|
1476
|
-
* @returns Array of agent info
|
|
1477
|
-
*/
|
|
1478
|
-
async listAgents(options: {
|
|
1479
|
-
includeIdle?: boolean;
|
|
1480
|
-
project?: string;
|
|
1481
|
-
} = {}): Promise<AgentInfo[]> {
|
|
1482
|
-
const payload: ListAgentsPayload = {
|
|
1483
|
-
includeIdle: options.includeIdle ?? true,
|
|
1484
|
-
project: options.project,
|
|
1485
|
-
};
|
|
1486
|
-
const response = await this.query<ListAgentsResponsePayload>('LIST_AGENTS', payload);
|
|
1487
|
-
return response.agents || [];
|
|
1488
|
-
}
|
|
1489
|
-
|
|
1490
|
-
/**
|
|
1491
|
-
* Get system health information.
|
|
1492
|
-
* @param options - Include options
|
|
1493
|
-
* @param options.includeCrashes - Include crash history (default: true)
|
|
1494
|
-
* @param options.includeAlerts - Include alerts (default: true)
|
|
1495
|
-
* @returns Health information including score, issues, and recommendations
|
|
1496
|
-
*/
|
|
1497
|
-
async getHealth(options: {
|
|
1498
|
-
includeCrashes?: boolean;
|
|
1499
|
-
includeAlerts?: boolean;
|
|
1500
|
-
} = {}): Promise<HealthResponsePayload> {
|
|
1501
|
-
const payload: HealthPayload = {
|
|
1502
|
-
includeCrashes: options.includeCrashes ?? true,
|
|
1503
|
-
includeAlerts: options.includeAlerts ?? true,
|
|
1504
|
-
};
|
|
1505
|
-
return this.query<HealthResponsePayload>('HEALTH', payload);
|
|
1506
|
-
}
|
|
1507
424
|
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
* List only currently connected agents (not historical/registered agents).
|
|
1525
|
-
* Use this instead of listAgents() when you need accurate liveness information.
|
|
1526
|
-
* @param options - Filter options
|
|
1527
|
-
* @param options.project - Filter by project
|
|
1528
|
-
* @returns Array of currently connected agent info
|
|
1529
|
-
*/
|
|
1530
|
-
async listConnectedAgents(options: {
|
|
1531
|
-
project?: string;
|
|
1532
|
-
} = {}): Promise<AgentInfo[]> {
|
|
1533
|
-
const payload: ListConnectedAgentsPayload = {
|
|
1534
|
-
project: options.project,
|
|
1535
|
-
};
|
|
1536
|
-
const response = await this.query<ListConnectedAgentsResponsePayload>('LIST_CONNECTED_AGENTS', payload);
|
|
1537
|
-
return response.agents || [];
|
|
1538
|
-
}
|
|
1539
|
-
|
|
1540
|
-
/**
|
|
1541
|
-
* Remove an agent from the registry (sessions, agents.json).
|
|
1542
|
-
* Use this to clean up stale agents that are no longer needed.
|
|
1543
|
-
* @param name - Agent name to remove
|
|
1544
|
-
* @param options - Removal options
|
|
1545
|
-
* @param options.removeMessages - Also remove all messages from/to this agent (default: false)
|
|
1546
|
-
* @returns Result indicating if the agent was removed
|
|
1547
|
-
*/
|
|
1548
|
-
async removeAgent(name: string, options: {
|
|
1549
|
-
removeMessages?: boolean;
|
|
1550
|
-
} = {}): Promise<RemoveAgentResponsePayload> {
|
|
1551
|
-
const payload: RemoveAgentPayload = {
|
|
1552
|
-
name,
|
|
1553
|
-
removeMessages: options.removeMessages,
|
|
1554
|
-
};
|
|
1555
|
-
return this.query<RemoveAgentResponsePayload>('REMOVE_AGENT', payload);
|
|
1556
|
-
}
|
|
1557
|
-
|
|
1558
|
-
// Private methods
|
|
1559
|
-
|
|
1560
|
-
private setState(state: ClientState): void {
|
|
1561
|
-
this._state = state;
|
|
1562
|
-
if (this.onStateChange) {
|
|
1563
|
-
this.onStateChange(state);
|
|
1564
|
-
}
|
|
1565
|
-
}
|
|
1566
|
-
|
|
1567
|
-
private sendHello(): void {
|
|
1568
|
-
const hello: Envelope<HelloPayload> = {
|
|
1569
|
-
v: PROTOCOL_VERSION,
|
|
1570
|
-
type: 'HELLO',
|
|
1571
|
-
id: generateId(),
|
|
1572
|
-
ts: Date.now(),
|
|
1573
|
-
payload: {
|
|
1574
|
-
agent: this.config.agentName,
|
|
1575
|
-
entityType: this.config.entityType,
|
|
1576
|
-
cli: this.config.cli,
|
|
1577
|
-
program: this.config.program,
|
|
1578
|
-
model: this.config.model,
|
|
1579
|
-
task: this.config.task,
|
|
1580
|
-
workingDirectory: this.config.workingDirectory,
|
|
1581
|
-
team: this.config.team,
|
|
1582
|
-
displayName: this.config.displayName,
|
|
1583
|
-
avatarUrl: this.config.avatarUrl,
|
|
1584
|
-
capabilities: {
|
|
1585
|
-
ack: true,
|
|
1586
|
-
resume: true,
|
|
1587
|
-
max_inflight: 256,
|
|
1588
|
-
supports_topics: true,
|
|
1589
|
-
},
|
|
1590
|
-
session: this.resumeToken ? { resume_token: this.resumeToken } : undefined,
|
|
1591
|
-
_isSystemComponent: this.config._isSystemComponent,
|
|
1592
|
-
},
|
|
1593
|
-
};
|
|
425
|
+
this.exitPromise = new Promise<void>((resolve) => {
|
|
426
|
+
child.once('exit', (code, signal) => {
|
|
427
|
+
const detail = this.lastStderrLine ? `: ${this.lastStderrLine}` : '';
|
|
428
|
+
const error = new AgentRelayProcessError(
|
|
429
|
+
`broker exited (code=${code ?? 'null'}, signal=${signal ?? 'null'})${detail}`
|
|
430
|
+
);
|
|
431
|
+
this.failAllPending(error);
|
|
432
|
+
this.disposeProcessHandles();
|
|
433
|
+
resolve();
|
|
434
|
+
});
|
|
435
|
+
child.once('error', (error) => {
|
|
436
|
+
this.failAllPending(error);
|
|
437
|
+
this.disposeProcessHandles();
|
|
438
|
+
resolve();
|
|
439
|
+
});
|
|
440
|
+
});
|
|
1594
441
|
|
|
1595
|
-
this.
|
|
442
|
+
await this.requestHello();
|
|
443
|
+
console.log('[broker] Broker ready (hello handshake complete)');
|
|
1596
444
|
}
|
|
1597
445
|
|
|
1598
|
-
private
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
this.writeScheduled = true;
|
|
1607
|
-
setImmediate(() => this.flushWrites());
|
|
1608
|
-
}
|
|
1609
|
-
return true;
|
|
1610
|
-
} catch (err) {
|
|
1611
|
-
this.handleError(err as Error);
|
|
1612
|
-
return false;
|
|
1613
|
-
}
|
|
446
|
+
private disposeProcessHandles(): void {
|
|
447
|
+
this.stdoutRl?.close();
|
|
448
|
+
this.stderrRl?.close();
|
|
449
|
+
this.stdoutRl = undefined;
|
|
450
|
+
this.stderrRl = undefined;
|
|
451
|
+
this.lastStderrLine = undefined;
|
|
452
|
+
this.child = undefined;
|
|
453
|
+
this.exitPromise = undefined;
|
|
1614
454
|
}
|
|
1615
455
|
|
|
1616
|
-
private
|
|
1617
|
-
this.
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
if (this.writeQueue.length === 1) {
|
|
1621
|
-
this.socket.write(this.writeQueue[0]);
|
|
1622
|
-
} else {
|
|
1623
|
-
this.socket.write(Buffer.concat(this.writeQueue));
|
|
456
|
+
private failAllPending(error: Error): void {
|
|
457
|
+
for (const pending of this.pending.values()) {
|
|
458
|
+
clearTimeout(pending.timeout);
|
|
459
|
+
pending.reject(error);
|
|
1624
460
|
}
|
|
1625
|
-
this.
|
|
461
|
+
this.pending.clear();
|
|
1626
462
|
}
|
|
1627
463
|
|
|
1628
|
-
private
|
|
464
|
+
private handleStdoutLine(line: string): void {
|
|
465
|
+
let parsed: ParsedEnvelope;
|
|
1629
466
|
try {
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
} catch (err) {
|
|
1635
|
-
this.handleError(err as Error);
|
|
1636
|
-
}
|
|
1637
|
-
}
|
|
1638
|
-
|
|
1639
|
-
private processFrame(envelope: Envelope): void {
|
|
1640
|
-
switch (envelope.type) {
|
|
1641
|
-
case 'WELCOME':
|
|
1642
|
-
this.handleWelcome(envelope as Envelope<WelcomePayload>);
|
|
1643
|
-
break;
|
|
1644
|
-
|
|
1645
|
-
case 'DELIVER':
|
|
1646
|
-
this.handleDeliver(envelope as DeliverEnvelope);
|
|
1647
|
-
break;
|
|
1648
|
-
|
|
1649
|
-
case 'CHANNEL_MESSAGE':
|
|
1650
|
-
this.handleChannelMessage(envelope as Envelope<ChannelMessagePayload> & { from?: string });
|
|
1651
|
-
break;
|
|
1652
|
-
|
|
1653
|
-
case 'PING':
|
|
1654
|
-
this.handlePing(envelope);
|
|
1655
|
-
break;
|
|
1656
|
-
|
|
1657
|
-
case 'ACK':
|
|
1658
|
-
this.handleAck(envelope as Envelope<AckPayload>);
|
|
1659
|
-
break;
|
|
1660
|
-
|
|
1661
|
-
case 'SPAWN_RESULT':
|
|
1662
|
-
this.handleSpawnResult(envelope as Envelope<SpawnResultPayload>);
|
|
1663
|
-
break;
|
|
1664
|
-
|
|
1665
|
-
case 'RELEASE_RESULT':
|
|
1666
|
-
this.handleReleaseResult(envelope as Envelope<ReleaseResultPayload>);
|
|
1667
|
-
break;
|
|
1668
|
-
|
|
1669
|
-
case 'SEND_INPUT_RESULT':
|
|
1670
|
-
this.handleSendInputResult(envelope as Envelope<SendInputResultPayload>);
|
|
1671
|
-
break;
|
|
1672
|
-
|
|
1673
|
-
case 'SET_MODEL_RESULT':
|
|
1674
|
-
this.handleSetModelResult(envelope as Envelope<SetModelResultPayload>);
|
|
1675
|
-
break;
|
|
1676
|
-
|
|
1677
|
-
case 'LIST_WORKERS_RESULT':
|
|
1678
|
-
this.handleListWorkersResult(envelope as Envelope<ListWorkersResultPayload>);
|
|
1679
|
-
break;
|
|
1680
|
-
|
|
1681
|
-
case 'AGENT_READY':
|
|
1682
|
-
this.handleAgentReady(envelope as Envelope<AgentReadyPayload>);
|
|
1683
|
-
break;
|
|
1684
|
-
|
|
1685
|
-
case 'ERROR':
|
|
1686
|
-
this.handleErrorFrame(envelope as Envelope<ErrorPayload>);
|
|
1687
|
-
break;
|
|
1688
|
-
|
|
1689
|
-
case 'BUSY':
|
|
1690
|
-
if (!this.config.quiet) {
|
|
1691
|
-
console.warn('[sdk] Server busy, backing off');
|
|
1692
|
-
}
|
|
1693
|
-
break;
|
|
1694
|
-
|
|
1695
|
-
case 'STATUS_RESPONSE':
|
|
1696
|
-
case 'INBOX_RESPONSE':
|
|
1697
|
-
case 'MESSAGES_RESPONSE':
|
|
1698
|
-
case 'LIST_AGENTS_RESPONSE':
|
|
1699
|
-
case 'LIST_CONNECTED_AGENTS_RESPONSE':
|
|
1700
|
-
case 'REMOVE_AGENT_RESPONSE':
|
|
1701
|
-
case 'HEALTH_RESPONSE':
|
|
1702
|
-
case 'METRICS_RESPONSE':
|
|
1703
|
-
this.handleQueryResponse(envelope);
|
|
1704
|
-
break;
|
|
467
|
+
parsed = JSON.parse(line) as ParsedEnvelope;
|
|
468
|
+
} catch {
|
|
469
|
+
// Non-protocol output should not crash the SDK.
|
|
470
|
+
return;
|
|
1705
471
|
}
|
|
1706
|
-
}
|
|
1707
472
|
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
this.resumeToken = envelope.payload.resume_token;
|
|
1711
|
-
this.reconnectAttempts = 0;
|
|
1712
|
-
this.reconnectDelay = this.config.reconnectDelayMs;
|
|
1713
|
-
this.setState('READY');
|
|
1714
|
-
if (!this.config.quiet) {
|
|
1715
|
-
console.log(`[sdk] Connected as ${this.config.agentName} (session: ${this.sessionId})`);
|
|
473
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
474
|
+
return;
|
|
1716
475
|
}
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
private handleDeliver(envelope: DeliverEnvelope): void {
|
|
1720
|
-
// Send ACK
|
|
1721
|
-
this.send({
|
|
1722
|
-
v: PROTOCOL_VERSION,
|
|
1723
|
-
type: 'ACK',
|
|
1724
|
-
id: generateId(),
|
|
1725
|
-
ts: Date.now(),
|
|
1726
|
-
payload: {
|
|
1727
|
-
ack_id: envelope.id,
|
|
1728
|
-
seq: envelope.delivery.seq,
|
|
1729
|
-
},
|
|
1730
|
-
});
|
|
1731
|
-
|
|
1732
|
-
const duplicate = this.dedupeCache.check(envelope.id);
|
|
1733
|
-
if (duplicate) {
|
|
476
|
+
if (parsed.v !== PROTOCOL_VERSION || typeof parsed.type !== 'string') {
|
|
1734
477
|
return;
|
|
1735
478
|
}
|
|
1736
479
|
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
correlationId,
|
|
1750
|
-
thread: envelope.payload.thread,
|
|
1751
|
-
payload: envelope.payload,
|
|
1752
|
-
});
|
|
1753
|
-
// Still call onMessage so the app is aware of the response if needed
|
|
480
|
+
const envelope: ProtocolEnvelope<unknown> = {
|
|
481
|
+
v: parsed.v,
|
|
482
|
+
type: parsed.type,
|
|
483
|
+
request_id: parsed.request_id,
|
|
484
|
+
payload: parsed.payload,
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
if (envelope.type === 'event') {
|
|
488
|
+
const payload = envelope.payload as BrokerEvent;
|
|
489
|
+
this.eventBuffer.push(payload);
|
|
490
|
+
if (this.eventBuffer.length > this.maxBufferSize) {
|
|
491
|
+
this.eventBuffer.shift();
|
|
1754
492
|
}
|
|
493
|
+
for (const listener of this.eventListeners) {
|
|
494
|
+
listener(payload);
|
|
495
|
+
}
|
|
496
|
+
return;
|
|
1755
497
|
}
|
|
1756
498
|
|
|
1757
|
-
if (
|
|
1758
|
-
|
|
1759
|
-
envelope.from,
|
|
1760
|
-
envelope.payload,
|
|
1761
|
-
envelope.id,
|
|
1762
|
-
envelope.payload_meta,
|
|
1763
|
-
envelope.delivery.originalTo
|
|
1764
|
-
);
|
|
499
|
+
if (!envelope.request_id) {
|
|
500
|
+
return;
|
|
1765
501
|
}
|
|
1766
|
-
}
|
|
1767
502
|
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
*/
|
|
1772
|
-
private extractCorrelationId(envelope: DeliverEnvelope): string | undefined {
|
|
1773
|
-
// Check payload_meta.replyTo first (the preferred location)
|
|
1774
|
-
if (envelope.payload_meta?.replyTo) {
|
|
1775
|
-
return envelope.payload_meta.replyTo;
|
|
1776
|
-
}
|
|
1777
|
-
// Fall back to checking data._correlationId
|
|
1778
|
-
if (envelope.payload.data && typeof envelope.payload.data._correlationId === 'string') {
|
|
1779
|
-
return envelope.payload.data._correlationId;
|
|
503
|
+
const pending = this.pending.get(envelope.request_id);
|
|
504
|
+
if (!pending) {
|
|
505
|
+
return;
|
|
1780
506
|
}
|
|
1781
|
-
return undefined;
|
|
1782
|
-
}
|
|
1783
507
|
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
508
|
+
if (envelope.type === 'error') {
|
|
509
|
+
clearTimeout(pending.timeout);
|
|
510
|
+
this.pending.delete(envelope.request_id);
|
|
511
|
+
pending.reject(new AgentRelayProtocolError(envelope.payload as ProtocolError));
|
|
1787
512
|
return;
|
|
1788
513
|
}
|
|
1789
514
|
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
this.
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
515
|
+
if (envelope.type !== pending.expectedType) {
|
|
516
|
+
clearTimeout(pending.timeout);
|
|
517
|
+
this.pending.delete(envelope.request_id);
|
|
518
|
+
pending.reject(
|
|
519
|
+
new AgentRelayProcessError(
|
|
520
|
+
`unexpected response type '${envelope.type}' for request '${envelope.request_id}' (expected '${pending.expectedType}')`
|
|
521
|
+
)
|
|
1797
522
|
);
|
|
523
|
+
return;
|
|
1798
524
|
}
|
|
1799
525
|
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
kind: 'message',
|
|
1804
|
-
body: envelope.payload.body,
|
|
1805
|
-
data: {
|
|
1806
|
-
_isChannelMessage: true,
|
|
1807
|
-
_channel: envelope.payload.channel,
|
|
1808
|
-
_mentions: envelope.payload.mentions,
|
|
1809
|
-
},
|
|
1810
|
-
thread: envelope.payload.thread,
|
|
1811
|
-
};
|
|
1812
|
-
this.onMessage(envelope.from, sendPayload, envelope.id, undefined, envelope.payload.channel);
|
|
1813
|
-
}
|
|
526
|
+
clearTimeout(pending.timeout);
|
|
527
|
+
this.pending.delete(envelope.request_id);
|
|
528
|
+
pending.resolve(envelope);
|
|
1814
529
|
}
|
|
1815
530
|
|
|
1816
|
-
private
|
|
1817
|
-
const
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
clearTimeout(pending.timeoutHandle);
|
|
1824
|
-
this.pendingSyncAcks.delete(correlationId);
|
|
1825
|
-
pending.resolve(envelope.payload);
|
|
1826
|
-
}
|
|
1827
|
-
|
|
1828
|
-
private handleSpawnResult(envelope: Envelope<SpawnResultPayload>): void {
|
|
1829
|
-
const replyTo = envelope.payload.replyTo;
|
|
1830
|
-
if (!replyTo) return;
|
|
1831
|
-
|
|
1832
|
-
const pending = this.pendingSpawns.get(replyTo);
|
|
1833
|
-
if (!pending) return;
|
|
1834
|
-
|
|
1835
|
-
clearTimeout(pending.timeoutHandle);
|
|
1836
|
-
this.pendingSpawns.delete(replyTo);
|
|
1837
|
-
pending.resolve(envelope.payload);
|
|
1838
|
-
}
|
|
1839
|
-
|
|
1840
|
-
private handleReleaseResult(envelope: Envelope<ReleaseResultPayload>): void {
|
|
1841
|
-
const replyTo = envelope.payload.replyTo;
|
|
1842
|
-
if (!replyTo) return;
|
|
1843
|
-
|
|
1844
|
-
const pending = this.pendingReleases.get(replyTo);
|
|
1845
|
-
if (!pending) return;
|
|
1846
|
-
|
|
1847
|
-
clearTimeout(pending.timeoutHandle);
|
|
1848
|
-
this.pendingReleases.delete(replyTo);
|
|
1849
|
-
pending.resolve(envelope.payload);
|
|
1850
|
-
}
|
|
1851
|
-
|
|
1852
|
-
private handleSendInputResult(envelope: Envelope<SendInputResultPayload>): void {
|
|
1853
|
-
const replyTo = envelope.payload.replyTo;
|
|
1854
|
-
if (!replyTo) return;
|
|
1855
|
-
|
|
1856
|
-
const pending = this.pendingSendInputs.get(replyTo);
|
|
1857
|
-
if (!pending) return;
|
|
1858
|
-
|
|
1859
|
-
clearTimeout(pending.timeoutHandle);
|
|
1860
|
-
this.pendingSendInputs.delete(replyTo);
|
|
1861
|
-
pending.resolve(envelope.payload);
|
|
1862
|
-
}
|
|
1863
|
-
|
|
1864
|
-
private handleSetModelResult(envelope: Envelope<SetModelResultPayload>): void {
|
|
1865
|
-
const replyTo = envelope.payload.replyTo;
|
|
1866
|
-
if (!replyTo) return;
|
|
1867
|
-
|
|
1868
|
-
const pending = this.pendingSetModels.get(replyTo);
|
|
1869
|
-
if (!pending) return;
|
|
1870
|
-
|
|
1871
|
-
clearTimeout(pending.timeoutHandle);
|
|
1872
|
-
this.pendingSetModels.delete(replyTo);
|
|
1873
|
-
pending.resolve(envelope.payload);
|
|
531
|
+
private async requestHello(): Promise<{ broker_version: string; protocol_version: number }> {
|
|
532
|
+
const payload = {
|
|
533
|
+
client_name: this.options.clientName,
|
|
534
|
+
client_version: this.options.clientVersion,
|
|
535
|
+
};
|
|
536
|
+
const frame = await this.sendRequest('hello', payload, 'hello_ack');
|
|
537
|
+
return frame.payload as { broker_version: string; protocol_version: number };
|
|
1874
538
|
}
|
|
1875
539
|
|
|
1876
|
-
private
|
|
1877
|
-
const
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
const pending = this.pendingListWorkers.get(replyTo);
|
|
1881
|
-
if (!pending) return;
|
|
1882
|
-
|
|
1883
|
-
clearTimeout(pending.timeoutHandle);
|
|
1884
|
-
this.pendingListWorkers.delete(replyTo);
|
|
1885
|
-
pending.resolve(envelope.payload);
|
|
540
|
+
private async requestOk<T = unknown>(type: string, payload: unknown): Promise<T> {
|
|
541
|
+
const frame = await this.sendRequest(type, payload, 'ok');
|
|
542
|
+
const result = frame.payload as { result: T };
|
|
543
|
+
return result.result;
|
|
1886
544
|
}
|
|
1887
545
|
|
|
1888
|
-
private
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
if (
|
|
1894
|
-
|
|
1895
|
-
this.pendingAgentReady.delete(agentName);
|
|
1896
|
-
pending.resolve(envelope.payload);
|
|
546
|
+
private async sendRequest(
|
|
547
|
+
type: string,
|
|
548
|
+
payload: unknown,
|
|
549
|
+
expectedType: 'ok' | 'hello_ack'
|
|
550
|
+
): Promise<ProtocolEnvelope<unknown>> {
|
|
551
|
+
if (!this.child) {
|
|
552
|
+
throw new AgentRelayProcessError('broker is not running');
|
|
1897
553
|
}
|
|
1898
554
|
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
// Query responses use the envelope id to match requests
|
|
1907
|
-
const pending = this.pendingQueries.get(envelope.id);
|
|
1908
|
-
if (!pending) return;
|
|
555
|
+
const requestId = `req_${++this.requestSeq}`;
|
|
556
|
+
const message: ProtocolEnvelope<unknown> = {
|
|
557
|
+
v: PROTOCOL_VERSION,
|
|
558
|
+
type,
|
|
559
|
+
request_id: requestId,
|
|
560
|
+
payload,
|
|
561
|
+
};
|
|
1909
562
|
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
563
|
+
const responsePromise = new Promise<ProtocolEnvelope<unknown>>((resolve, reject) => {
|
|
564
|
+
const timeout = setTimeout(() => {
|
|
565
|
+
this.pending.delete(requestId);
|
|
566
|
+
reject(
|
|
567
|
+
new AgentRelayProcessError(
|
|
568
|
+
`request timed out after ${this.options.requestTimeoutMs}ms (type='${type}', request_id='${requestId}')`
|
|
569
|
+
)
|
|
570
|
+
);
|
|
571
|
+
}, this.options.requestTimeoutMs);
|
|
1914
572
|
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
payload: (envelope.payload as { nonce?: string }) ?? {},
|
|
573
|
+
this.pending.set(requestId, {
|
|
574
|
+
expectedType,
|
|
575
|
+
resolve,
|
|
576
|
+
reject,
|
|
577
|
+
timeout,
|
|
578
|
+
});
|
|
1922
579
|
});
|
|
1923
|
-
}
|
|
1924
580
|
|
|
1925
|
-
|
|
1926
|
-
if (!this.
|
|
1927
|
-
|
|
581
|
+
const line = `${JSON.stringify(message)}\n`;
|
|
582
|
+
if (!this.child.stdin.write(line)) {
|
|
583
|
+
await once(this.child.stdin, 'drain');
|
|
1928
584
|
}
|
|
1929
585
|
|
|
1930
|
-
|
|
1931
|
-
this.resumeToken = undefined;
|
|
1932
|
-
this.sessionId = undefined;
|
|
1933
|
-
}
|
|
1934
|
-
|
|
1935
|
-
// Fatal errors (like DUPLICATE_CONNECTION) should prevent reconnection
|
|
1936
|
-
if (envelope.payload.fatal) {
|
|
1937
|
-
if (!this.config.quiet) {
|
|
1938
|
-
console.error('[sdk] Fatal error received, will not reconnect:', envelope.payload.message);
|
|
1939
|
-
}
|
|
1940
|
-
this._destroyed = true;
|
|
1941
|
-
}
|
|
586
|
+
return responsePromise;
|
|
1942
587
|
}
|
|
588
|
+
}
|
|
1943
589
|
|
|
1944
|
-
|
|
1945
|
-
this.parser.reset();
|
|
1946
|
-
this.socket = undefined;
|
|
1947
|
-
this.rejectPendingSyncAcks(new Error('Disconnected while awaiting ACK'));
|
|
1948
|
-
this.rejectPendingSpawns(new Error('Disconnected while awaiting spawn result'));
|
|
1949
|
-
this.rejectPendingReleases(new Error('Disconnected while awaiting release result'));
|
|
1950
|
-
this.rejectPendingSendInputs(new Error('Disconnected while awaiting send input result'));
|
|
1951
|
-
this.rejectPendingSetModels(new Error('Disconnected while awaiting set model result'));
|
|
1952
|
-
this.rejectPendingListWorkers(new Error('Disconnected while awaiting list workers result'));
|
|
1953
|
-
this.rejectPendingQueries(new Error('Disconnected while awaiting query response'));
|
|
1954
|
-
this.rejectPendingRequests(new Error('Disconnected while awaiting request response'));
|
|
1955
|
-
this.rejectPendingAgentReady(new Error('Disconnected while awaiting agent ready'));
|
|
1956
|
-
|
|
1957
|
-
if (this._destroyed) {
|
|
1958
|
-
this.setState('DISCONNECTED');
|
|
1959
|
-
return;
|
|
1960
|
-
}
|
|
590
|
+
const CLI_MODEL_FLAG_CLIS = new Set(['claude', 'codex', 'gemini', 'goose', 'aider']);
|
|
1961
591
|
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
if (this.reconnectAttempts >= this.config.maxReconnectAttempts && !this.config.quiet) {
|
|
1967
|
-
console.error(
|
|
1968
|
-
`[sdk] Max reconnect attempts reached (${this.config.maxReconnectAttempts}), giving up`
|
|
1969
|
-
);
|
|
1970
|
-
}
|
|
1971
|
-
}
|
|
592
|
+
function buildPtyArgsWithModel(cli: string, args: string[], model?: string): string[] {
|
|
593
|
+
const baseArgs = [...args];
|
|
594
|
+
if (!model) {
|
|
595
|
+
return baseArgs;
|
|
1972
596
|
}
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
console.error('[sdk] Error:', error.message);
|
|
1977
|
-
}
|
|
1978
|
-
if (this.onError) {
|
|
1979
|
-
this.onError(error);
|
|
1980
|
-
}
|
|
597
|
+
const cliName = cli.split(':')[0].trim().toLowerCase();
|
|
598
|
+
if (!CLI_MODEL_FLAG_CLIS.has(cliName)) {
|
|
599
|
+
return baseArgs;
|
|
1981
600
|
}
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
for (const [correlationId, pending] of this.pendingSyncAcks.entries()) {
|
|
1985
|
-
clearTimeout(pending.timeoutHandle);
|
|
1986
|
-
pending.reject(error);
|
|
1987
|
-
this.pendingSyncAcks.delete(correlationId);
|
|
1988
|
-
}
|
|
601
|
+
if (hasModelArg(baseArgs)) {
|
|
602
|
+
return baseArgs;
|
|
1989
603
|
}
|
|
604
|
+
return ['--model', model, ...baseArgs];
|
|
605
|
+
}
|
|
1990
606
|
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
607
|
+
function hasModelArg(args: string[]): boolean {
|
|
608
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
609
|
+
const arg = args[i];
|
|
610
|
+
if (arg === '--model') {
|
|
611
|
+
return true;
|
|
1996
612
|
}
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
private rejectPendingReleases(error: Error): void {
|
|
2000
|
-
for (const [id, pending] of this.pendingReleases.entries()) {
|
|
2001
|
-
clearTimeout(pending.timeoutHandle);
|
|
2002
|
-
pending.reject(error);
|
|
2003
|
-
this.pendingReleases.delete(id);
|
|
613
|
+
if (arg.startsWith('--model=')) {
|
|
614
|
+
return true;
|
|
2004
615
|
}
|
|
2005
616
|
}
|
|
617
|
+
return false;
|
|
618
|
+
}
|
|
2006
619
|
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
this.pendingSendInputs.delete(id);
|
|
2012
|
-
}
|
|
620
|
+
function expandTilde(p: string): string {
|
|
621
|
+
if (p === '~' || p.startsWith('~/') || p.startsWith('~\\')) {
|
|
622
|
+
const home = os.homedir();
|
|
623
|
+
return path.join(home, p.slice(2));
|
|
2013
624
|
}
|
|
625
|
+
return p;
|
|
626
|
+
}
|
|
2014
627
|
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
628
|
+
function isExplicitPath(binaryPath: string): boolean {
|
|
629
|
+
return (
|
|
630
|
+
binaryPath.includes('/') ||
|
|
631
|
+
binaryPath.includes('\\') ||
|
|
632
|
+
binaryPath.startsWith('.') ||
|
|
633
|
+
binaryPath.startsWith('~')
|
|
634
|
+
);
|
|
635
|
+
}
|
|
2022
636
|
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
pending.reject(error);
|
|
2027
|
-
this.pendingListWorkers.delete(id);
|
|
2028
|
-
}
|
|
2029
|
-
}
|
|
637
|
+
function resolveDefaultBinaryPath(): string {
|
|
638
|
+
const brokerExe = process.platform === 'win32' ? 'agent-relay-broker.exe' : 'agent-relay-broker';
|
|
639
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
2030
640
|
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
}
|
|
641
|
+
// 1. In a source checkout, prefer Cargo's release binary to avoid stale bundled
|
|
642
|
+
// copies when local dev rebuilds happen while broker processes are running.
|
|
643
|
+
const workspaceRelease = path.resolve(moduleDir, '..', '..', '..', 'target', 'release', brokerExe);
|
|
644
|
+
if (fs.existsSync(workspaceRelease)) {
|
|
645
|
+
return workspaceRelease;
|
|
2037
646
|
}
|
|
2038
647
|
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
this.pendingRequests.delete(correlationId);
|
|
2044
|
-
}
|
|
648
|
+
// 2. Check for bundled broker binary in SDK package (npm install)
|
|
649
|
+
const bundled = path.resolve(moduleDir, '..', 'bin', brokerExe);
|
|
650
|
+
if (fs.existsSync(bundled)) {
|
|
651
|
+
return bundled;
|
|
2045
652
|
}
|
|
2046
653
|
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
}
|
|
654
|
+
// 3. Check for standalone broker binary in ~/.agent-relay/bin/ (install.sh)
|
|
655
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '';
|
|
656
|
+
const standaloneBroker = path.join(homeDir, '.agent-relay', 'bin', brokerExe);
|
|
657
|
+
if (fs.existsSync(standaloneBroker)) {
|
|
658
|
+
return standaloneBroker;
|
|
2053
659
|
}
|
|
2054
660
|
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
this.reconnectAttempts++;
|
|
2058
|
-
|
|
2059
|
-
const jitter = Math.random() * 0.3 + 0.85;
|
|
2060
|
-
const delay = Math.min(this.reconnectDelay * jitter, this.config.reconnectMaxDelayMs);
|
|
2061
|
-
this.reconnectDelay *= 2;
|
|
2062
|
-
|
|
2063
|
-
if (!this.config.quiet) {
|
|
2064
|
-
console.log(`[sdk] Reconnecting in ${Math.round(delay)}ms (attempt ${this.reconnectAttempts})`);
|
|
2065
|
-
}
|
|
2066
|
-
|
|
2067
|
-
this.reconnectTimer = setTimeout(() => {
|
|
2068
|
-
this.connect().catch(() => {});
|
|
2069
|
-
}, delay);
|
|
2070
|
-
}
|
|
661
|
+
// 4. Fall back to agent-relay on PATH (may be Node CLI — will fail for broker ops)
|
|
662
|
+
return 'agent-relay';
|
|
2071
663
|
}
|