agent-relay 2.3.13 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -176
- 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 +50288 -63371
- 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 +84 -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 +305 -0
- package/packages/sdk/dist/__tests__/facade.test.js.map +1 -0
- package/packages/sdk/dist/__tests__/integration.test.js +169 -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 +347 -0
- package/packages/sdk/dist/__tests__/unit.test.js.map +1 -0
- package/packages/sdk/dist/client.d.ts +140 -526
- package/packages/sdk/dist/client.d.ts.map +1 -1
- package/packages/sdk/dist/client.js +416 -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 +304 -0
- package/packages/sdk/dist/relay.d.ts.map +1 -0
- package/packages/sdk/dist/relay.js +910 -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 +364 -0
- package/packages/sdk/src/__tests__/idle-nudge.test.ts +438 -0
- package/packages/sdk/src/__tests__/integration.test.ts +204 -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 +435 -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 +514 -1912
- 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 +1147 -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 +2 -2
- 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 +44 -171
- 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 -254
- 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 -172
- package/packages/broker-sdk/dist/relay.d.ts.map +0 -1
- package/packages/broker-sdk/dist/relay.js +0 -486
- package/packages/broker-sdk/dist/relay.js.map +0 -1
- package/packages/broker-sdk/dist/relaycast.d.ts +0 -67
- package/packages/broker-sdk/dist/relaycast.d.ts.map +0 -1
- package/packages/broker-sdk/dist/relaycast.js +0 -150
- 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 -136
- package/packages/broker-sdk/dist/workflows/runner.d.ts.map +0 -1
- package/packages/broker-sdk/dist/workflows/runner.js +0 -900
- 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 -271
- package/packages/broker-sdk/src/pty.ts +0 -16
- package/packages/broker-sdk/src/relay.ts +0 -614
- package/packages/broker-sdk/src/relaycast.ts +0 -185
- package/packages/broker-sdk/src/shadow.ts +0 -230
- package/packages/broker-sdk/src/workflows/README.md +0 -514
- 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 -1184
- 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,673 @@
|
|
|
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;
|
|
211
|
-
|
|
212
|
-
if (this.ids.size >= this.capacity) {
|
|
213
|
-
const oldest = this.ring[this.head];
|
|
214
|
-
if (oldest) this.ids.delete(oldest);
|
|
215
|
-
}
|
|
95
|
+
export class AgentRelayProtocolError extends Error {
|
|
96
|
+
code: string;
|
|
97
|
+
retryable: boolean;
|
|
98
|
+
data?: unknown;
|
|
216
99
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
this.
|
|
220
|
-
|
|
221
|
-
|
|
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
|
+
/** The workspace key returned by the broker in its hello_ack response. */
|
|
131
|
+
workspaceKey?: string;
|
|
132
|
+
|
|
133
|
+
constructor(options: AgentRelayClientOptions = {}) {
|
|
134
|
+
this.options = {
|
|
135
|
+
binaryPath: options.binaryPath ?? resolveDefaultBinaryPath(),
|
|
136
|
+
binaryArgs: options.binaryArgs ?? [],
|
|
137
|
+
brokerName: options.brokerName ?? (path.basename(options.cwd ?? process.cwd()) || 'project'),
|
|
138
|
+
channels: options.channels ?? ['general'],
|
|
139
|
+
cwd: options.cwd ?? process.cwd(),
|
|
140
|
+
env: options.env ?? process.env,
|
|
141
|
+
requestTimeoutMs: options.requestTimeoutMs ?? 10_000,
|
|
142
|
+
shutdownTimeoutMs: options.shutdownTimeoutMs ?? 3_000,
|
|
143
|
+
clientName: options.clientName ?? '@agent-relay/sdk',
|
|
144
|
+
clientVersion: options.clientVersion ?? '0.1.0',
|
|
145
|
+
};
|
|
334
146
|
}
|
|
335
147
|
|
|
336
|
-
|
|
337
|
-
|
|
148
|
+
static async start(options: AgentRelayClientOptions = {}): Promise<AgentRelayClient> {
|
|
149
|
+
const client = new AgentRelayClient(options);
|
|
150
|
+
await client.start();
|
|
151
|
+
return client;
|
|
338
152
|
}
|
|
339
153
|
|
|
340
|
-
|
|
341
|
-
|
|
154
|
+
onEvent(listener: (event: BrokerEvent) => void): () => void {
|
|
155
|
+
this.eventListeners.add(listener);
|
|
156
|
+
return () => {
|
|
157
|
+
this.eventListeners.delete(listener);
|
|
158
|
+
};
|
|
342
159
|
}
|
|
343
160
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
if (this._state !== 'DISCONNECTED' && this._state !== 'BACKOFF') {
|
|
349
|
-
return Promise.resolve();
|
|
161
|
+
queryEvents(filter?: { kind?: string; name?: string; since?: number; limit?: number }): BrokerEvent[] {
|
|
162
|
+
let events = [...this.eventBuffer];
|
|
163
|
+
if (filter?.kind) {
|
|
164
|
+
events = events.filter((event) => event.kind === filter.kind);
|
|
350
165
|
}
|
|
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;
|
|
166
|
+
if (filter?.name) {
|
|
167
|
+
events = events.filter((event) => 'name' in event && event.name === filter.name);
|
|
415
168
|
}
|
|
416
|
-
|
|
417
|
-
if (
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
id: generateId(),
|
|
422
|
-
ts: Date.now(),
|
|
423
|
-
payload: {},
|
|
424
|
-
});
|
|
425
|
-
this.socket.end();
|
|
426
|
-
this.socket = undefined;
|
|
169
|
+
const since = filter?.since;
|
|
170
|
+
if (since !== undefined) {
|
|
171
|
+
events = events.filter(
|
|
172
|
+
(event) => 'timestamp' in event && typeof event.timestamp === 'number' && event.timestamp >= since
|
|
173
|
+
);
|
|
427
174
|
}
|
|
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;
|
|
175
|
+
const limit = filter?.limit;
|
|
176
|
+
if (limit !== undefined) {
|
|
177
|
+
events = events.slice(-limit);
|
|
453
178
|
}
|
|
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);
|
|
179
|
+
return events;
|
|
471
180
|
}
|
|
472
181
|
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
182
|
+
getLastEvent(kind: string, name?: string): BrokerEvent | undefined {
|
|
183
|
+
for (let i = this.eventBuffer.length - 1; i >= 0; i -= 1) {
|
|
184
|
+
const event = this.eventBuffer[i];
|
|
185
|
+
if (event.kind === kind && (!name || ('name' in event && event.name === name))) {
|
|
186
|
+
return event;
|
|
187
|
+
}
|
|
479
188
|
}
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
480
191
|
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
ts: Date.now(),
|
|
486
|
-
payload,
|
|
192
|
+
onBrokerStderr(listener: (line: string) => void): () => void {
|
|
193
|
+
this.stderrListeners.add(listener);
|
|
194
|
+
return () => {
|
|
195
|
+
this.stderrListeners.delete(listener);
|
|
487
196
|
};
|
|
488
|
-
|
|
489
|
-
return this.send(envelope);
|
|
490
197
|
}
|
|
491
198
|
|
|
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');
|
|
199
|
+
async start(): Promise<void> {
|
|
200
|
+
if (this.child) {
|
|
201
|
+
return;
|
|
498
202
|
}
|
|
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');
|
|
203
|
+
if (this.startingPromise) {
|
|
204
|
+
return this.startingPromise;
|
|
572
205
|
}
|
|
573
206
|
|
|
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
|
-
}
|
|
207
|
+
this.startingPromise = this.startInternal();
|
|
208
|
+
try {
|
|
209
|
+
await this.startingPromise;
|
|
210
|
+
} finally {
|
|
211
|
+
this.startingPromise = undefined;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Pre-register a batch of agents with Relaycast before their steps execute.
|
|
217
|
+
* The broker warms its token cache in parallel; subsequent spawn_agent calls
|
|
218
|
+
* hit the cache rather than waiting on individual HTTP registrations.
|
|
219
|
+
* Fire-and-forget from the caller's perspective — broker responds immediately
|
|
220
|
+
* and registers in the background.
|
|
221
|
+
*/
|
|
222
|
+
async preflightAgents(agents: Array<{ name: string; cli: string | AgentRuntime }>): Promise<void> {
|
|
223
|
+
if (agents.length === 0) return;
|
|
224
|
+
await this.start();
|
|
225
|
+
await this.requestOk<void>('preflight_agents', { agents });
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
async spawnPty(input: SpawnPtyInput): Promise<{ name: string; runtime: AgentRuntime }> {
|
|
229
|
+
await this.start();
|
|
230
|
+
const args = buildPtyArgsWithModel(input.cli, input.args ?? [], input.model);
|
|
231
|
+
const agent: AgentSpec = {
|
|
232
|
+
name: input.name,
|
|
233
|
+
runtime: 'pty',
|
|
234
|
+
cli: input.cli,
|
|
235
|
+
args,
|
|
236
|
+
channels: input.channels ?? [],
|
|
237
|
+
model: input.model,
|
|
238
|
+
cwd: input.cwd ?? this.options.cwd,
|
|
239
|
+
team: input.team,
|
|
240
|
+
shadow_of: input.shadowOf,
|
|
241
|
+
shadow_mode: input.shadowMode,
|
|
242
|
+
restart_policy: input.restartPolicy,
|
|
243
|
+
};
|
|
244
|
+
const result = await this.requestOk<{ name: string; runtime: AgentRuntime }>('spawn_agent', {
|
|
245
|
+
agent,
|
|
246
|
+
...(input.task != null ? { initial_task: input.task } : {}),
|
|
247
|
+
...(input.idleThresholdSecs != null ? { idle_threshold_secs: input.idleThresholdSecs } : {}),
|
|
248
|
+
...(input.continueFrom != null ? { continue_from: input.continueFrom } : {}),
|
|
617
249
|
});
|
|
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
|
-
},
|
|
250
|
+
return result;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async spawnHeadlessClaude(
|
|
254
|
+
input: SpawnHeadlessClaudeInput
|
|
255
|
+
): Promise<{ name: string; runtime: AgentRuntime }> {
|
|
256
|
+
await this.start();
|
|
257
|
+
const agent: AgentSpec = {
|
|
258
|
+
name: input.name,
|
|
259
|
+
runtime: 'headless_claude',
|
|
260
|
+
args: input.args ?? [],
|
|
261
|
+
channels: input.channels ?? [],
|
|
655
262
|
};
|
|
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: {},
|
|
263
|
+
const result = await this.requestOk<{ name: string; runtime: AgentRuntime }>('spawn_agent', {
|
|
264
|
+
agent,
|
|
265
|
+
...(input.task != null ? { initial_task: input.task } : {}),
|
|
680
266
|
});
|
|
267
|
+
return result;
|
|
681
268
|
}
|
|
682
269
|
|
|
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
|
-
});
|
|
270
|
+
async release(name: string, reason?: string): Promise<{ name: string }> {
|
|
271
|
+
await this.start();
|
|
272
|
+
return this.requestOk<{ name: string }>('release_agent', { name, reason });
|
|
697
273
|
}
|
|
698
274
|
|
|
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
|
-
});
|
|
275
|
+
async sendInput(name: string, data: string): Promise<{ name: string; bytes_written: number }> {
|
|
276
|
+
await this.start();
|
|
277
|
+
return this.requestOk<{ name: string; bytes_written: number }>('send_input', { name, data });
|
|
724
278
|
}
|
|
725
279
|
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
return this.
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
ts: Date.now(),
|
|
737
|
-
payload: {
|
|
738
|
-
primaryAgent,
|
|
739
|
-
},
|
|
280
|
+
async setModel(
|
|
281
|
+
name: string,
|
|
282
|
+
model: string,
|
|
283
|
+
opts?: { timeoutMs?: number }
|
|
284
|
+
): Promise<{ name: string; model: string; success: boolean }> {
|
|
285
|
+
await this.start();
|
|
286
|
+
return this.requestOk<{ name: string; model: string; success: boolean }>('set_model', {
|
|
287
|
+
name,
|
|
288
|
+
model,
|
|
289
|
+
timeout_ms: opts?.timeoutMs,
|
|
740
290
|
});
|
|
741
291
|
}
|
|
742
292
|
|
|
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);
|
|
293
|
+
async getMetrics(agent?: string): Promise<{
|
|
294
|
+
agents: Array<{ name: string; pid: number; memory_bytes: number; uptime_secs: number }>;
|
|
295
|
+
broker?: BrokerStats;
|
|
296
|
+
}> {
|
|
297
|
+
await this.start();
|
|
298
|
+
return this.requestOk<{
|
|
299
|
+
agents: Array<{ name: string; pid: number; memory_bytes: number; uptime_secs: number }>;
|
|
300
|
+
broker?: BrokerStats;
|
|
301
|
+
}>('get_metrics', { agent });
|
|
763
302
|
}
|
|
764
303
|
|
|
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);
|
|
304
|
+
async getCrashInsights(): Promise<CrashInsightsResponse> {
|
|
305
|
+
await this.start();
|
|
306
|
+
return this.requestOk<CrashInsightsResponse>('get_crash_insights', {});
|
|
307
|
+
}
|
|
838
308
|
|
|
839
|
-
|
|
309
|
+
async sendMessage(input: SendMessageInput): Promise<{ event_id: string; targets: string[] }> {
|
|
310
|
+
await this.start();
|
|
311
|
+
try {
|
|
312
|
+
return await this.requestOk<{ event_id: string; targets: string[] }>('send_message', {
|
|
313
|
+
to: input.to,
|
|
314
|
+
text: input.text,
|
|
315
|
+
from: input.from,
|
|
316
|
+
thread_id: input.threadId,
|
|
317
|
+
priority: input.priority,
|
|
318
|
+
data: input.data,
|
|
840
319
|
});
|
|
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
|
-
}
|
|
320
|
+
} catch (error) {
|
|
321
|
+
if (error instanceof AgentRelayProtocolError && error.code === 'unsupported_operation') {
|
|
322
|
+
return { event_id: 'unsupported_operation', targets: [] };
|
|
909
323
|
}
|
|
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
|
-
};
|
|
324
|
+
throw error;
|
|
928
325
|
}
|
|
929
326
|
}
|
|
930
327
|
|
|
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
|
-
});
|
|
328
|
+
async listAgents(): Promise<ListAgent[]> {
|
|
329
|
+
await this.start();
|
|
330
|
+
const result = await this.requestOk<{ agents: ListAgent[] }>('list_agents', {});
|
|
331
|
+
return result.agents;
|
|
970
332
|
}
|
|
971
333
|
|
|
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
|
-
});
|
|
334
|
+
async getStatus(): Promise<BrokerStatus> {
|
|
335
|
+
await this.start();
|
|
336
|
+
return this.requestOk<BrokerStatus>('get_status', {});
|
|
1010
337
|
}
|
|
1011
338
|
|
|
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');
|
|
339
|
+
async shutdown(): Promise<void> {
|
|
340
|
+
if (!this.child) {
|
|
341
|
+
return;
|
|
1021
342
|
}
|
|
1022
343
|
|
|
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');
|
|
344
|
+
try {
|
|
345
|
+
await this.requestOk('shutdown', {});
|
|
346
|
+
} catch {
|
|
347
|
+
// Continue shutdown path if broker is already unhealthy.
|
|
1070
348
|
}
|
|
1071
349
|
|
|
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'));
|
|
350
|
+
const child = this.child;
|
|
351
|
+
const wait = this.exitPromise ?? Promise.resolve();
|
|
352
|
+
const timeout = setTimeout(() => {
|
|
353
|
+
if (!child.killed) {
|
|
354
|
+
child.kill('SIGTERM');
|
|
1099
355
|
}
|
|
1100
|
-
});
|
|
1101
|
-
}
|
|
356
|
+
}, this.options.shutdownTimeoutMs);
|
|
1102
357
|
|
|
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'));
|
|
358
|
+
try {
|
|
359
|
+
await wait;
|
|
360
|
+
} finally {
|
|
361
|
+
clearTimeout(timeout);
|
|
362
|
+
if (this.child) {
|
|
363
|
+
this.child.kill('SIGKILL');
|
|
1135
364
|
}
|
|
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
|
-
}
|
|
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
|
-
}
|
|
1190
|
-
|
|
1191
|
-
/**
|
|
1192
|
-
* Leave a channel.
|
|
1193
|
-
* @param channel - Channel name to leave
|
|
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;
|
|
1221
365
|
}
|
|
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);
|
|
1235
366
|
}
|
|
1236
367
|
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
* @param body - Message content
|
|
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>;
|
|
1251
|
-
}
|
|
1252
|
-
): boolean {
|
|
1253
|
-
if (this._state !== 'READY') {
|
|
1254
|
-
return false;
|
|
368
|
+
async waitForExit(): Promise<void> {
|
|
369
|
+
if (!this.child) {
|
|
370
|
+
return;
|
|
1255
371
|
}
|
|
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);
|
|
372
|
+
await this.exitPromise;
|
|
1273
373
|
}
|
|
1274
374
|
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
/**
|
|
1280
|
-
* Create a consensus proposal.
|
|
1281
|
-
*
|
|
1282
|
-
* The proposal will be broadcast to all participants. They can vote using
|
|
1283
|
-
* the `vote()` method. Results are delivered via `onMessage` callback.
|
|
1284
|
-
*
|
|
1285
|
-
* @example
|
|
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;
|
|
375
|
+
private async startInternal(): Promise<void> {
|
|
376
|
+
const resolvedBinary = expandTilde(this.options.binaryPath);
|
|
377
|
+
if (isExplicitPath(this.options.binaryPath) && !fs.existsSync(resolvedBinary)) {
|
|
378
|
+
throw new AgentRelayProcessError(`broker binary not found: ${this.options.binaryPath}`);
|
|
1301
379
|
}
|
|
380
|
+
this.lastStderrLine = undefined;
|
|
1302
381
|
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
382
|
+
const args = [
|
|
383
|
+
'init',
|
|
384
|
+
'--name',
|
|
385
|
+
this.options.brokerName,
|
|
386
|
+
'--channels',
|
|
387
|
+
this.options.channels.join(','),
|
|
388
|
+
...this.options.binaryArgs,
|
|
1309
389
|
];
|
|
1310
390
|
|
|
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');
|
|
391
|
+
// Ensure the SDK bin directory (containing agent-relay-broker + relay_send) is on
|
|
392
|
+
// PATH so spawned workers can find relay_send without any user setup.
|
|
393
|
+
const env = { ...this.options.env };
|
|
394
|
+
if (isExplicitPath(this.options.binaryPath)) {
|
|
395
|
+
const binDir = path.dirname(path.resolve(resolvedBinary));
|
|
396
|
+
const currentPath = env.PATH ?? env.Path ?? '';
|
|
397
|
+
if (!currentPath.split(path.delimiter).includes(binDir)) {
|
|
398
|
+
env.PATH = `${binDir}${path.delimiter}${currentPath}`;
|
|
399
|
+
}
|
|
1372
400
|
}
|
|
1373
401
|
|
|
1374
|
-
|
|
402
|
+
console.log(`[broker] Starting: ${resolvedBinary} ${args.join(' ')}`);
|
|
403
|
+
const child = spawn(resolvedBinary, args, {
|
|
404
|
+
cwd: this.options.cwd,
|
|
405
|
+
env,
|
|
406
|
+
stdio: 'pipe',
|
|
407
|
+
});
|
|
1375
408
|
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
reject(new Error(`Query timeout after ${timeoutMs}ms`));
|
|
1380
|
-
}, timeoutMs);
|
|
409
|
+
this.child = child;
|
|
410
|
+
this.stdoutRl = createInterface({ input: child.stdout, crlfDelay: Infinity });
|
|
411
|
+
this.stderrRl = createInterface({ input: child.stderr, crlfDelay: Infinity });
|
|
1381
412
|
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
timeoutHandle,
|
|
1386
|
-
});
|
|
413
|
+
this.stdoutRl.on('line', (line) => {
|
|
414
|
+
this.handleStdoutLine(line);
|
|
415
|
+
});
|
|
1387
416
|
|
|
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`));
|
|
417
|
+
this.stderrRl.on('line', (line) => {
|
|
418
|
+
const trimmed = line.trim();
|
|
419
|
+
if (trimmed) {
|
|
420
|
+
this.lastStderrLine = trimmed;
|
|
421
|
+
}
|
|
422
|
+
for (const listener of this.stderrListeners) {
|
|
423
|
+
listener(line);
|
|
1401
424
|
}
|
|
1402
425
|
});
|
|
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
426
|
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
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
|
-
|
|
1508
|
-
/**
|
|
1509
|
-
* Get resource metrics for agents.
|
|
1510
|
-
* @param options - Filter options
|
|
1511
|
-
* @param options.agent - Filter to a specific agent
|
|
1512
|
-
* @returns Metrics including memory, CPU, and system info
|
|
1513
|
-
*/
|
|
1514
|
-
async getMetrics(options: {
|
|
1515
|
-
agent?: string;
|
|
1516
|
-
} = {}): Promise<MetricsResponsePayload> {
|
|
1517
|
-
const payload: MetricsPayload = {
|
|
1518
|
-
agent: options.agent,
|
|
1519
|
-
};
|
|
1520
|
-
return this.query<MetricsResponsePayload>('METRICS', payload);
|
|
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
|
|
427
|
+
this.exitPromise = new Promise<void>((resolve) => {
|
|
428
|
+
child.once('exit', (code, signal) => {
|
|
429
|
+
const detail = this.lastStderrLine ? `: ${this.lastStderrLine}` : '';
|
|
430
|
+
const error = new AgentRelayProcessError(
|
|
431
|
+
`broker exited (code=${code ?? 'null'}, signal=${signal ?? 'null'})${detail}`
|
|
432
|
+
);
|
|
433
|
+
this.failAllPending(error);
|
|
434
|
+
this.disposeProcessHandles();
|
|
435
|
+
resolve();
|
|
436
|
+
});
|
|
437
|
+
child.once('error', (error) => {
|
|
438
|
+
this.failAllPending(error);
|
|
439
|
+
this.disposeProcessHandles();
|
|
440
|
+
resolve();
|
|
441
|
+
});
|
|
442
|
+
});
|
|
1559
443
|
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
if (
|
|
1563
|
-
this.
|
|
444
|
+
const helloAck = await this.requestHello();
|
|
445
|
+
console.log('[broker] Broker ready (hello handshake complete)');
|
|
446
|
+
if (helloAck.workspace_key) {
|
|
447
|
+
this.workspaceKey = helloAck.workspace_key;
|
|
1564
448
|
}
|
|
1565
449
|
}
|
|
1566
450
|
|
|
1567
|
-
private
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
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
|
-
};
|
|
1594
|
-
|
|
1595
|
-
this.send(hello);
|
|
1596
|
-
}
|
|
1597
|
-
|
|
1598
|
-
private send(envelope: Envelope): boolean {
|
|
1599
|
-
if (!this.socket) return false;
|
|
1600
|
-
|
|
1601
|
-
try {
|
|
1602
|
-
const frame = encodeFrameLegacy(envelope);
|
|
1603
|
-
this.writeQueue.push(frame);
|
|
1604
|
-
|
|
1605
|
-
if (!this.writeScheduled) {
|
|
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
|
-
}
|
|
451
|
+
private disposeProcessHandles(): void {
|
|
452
|
+
this.stdoutRl?.close();
|
|
453
|
+
this.stderrRl?.close();
|
|
454
|
+
this.stdoutRl = undefined;
|
|
455
|
+
this.stderrRl = undefined;
|
|
456
|
+
this.lastStderrLine = undefined;
|
|
457
|
+
this.child = undefined;
|
|
458
|
+
this.exitPromise = undefined;
|
|
1614
459
|
}
|
|
1615
460
|
|
|
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));
|
|
461
|
+
private failAllPending(error: Error): void {
|
|
462
|
+
for (const pending of this.pending.values()) {
|
|
463
|
+
clearTimeout(pending.timeout);
|
|
464
|
+
pending.reject(error);
|
|
1624
465
|
}
|
|
1625
|
-
this.
|
|
466
|
+
this.pending.clear();
|
|
1626
467
|
}
|
|
1627
468
|
|
|
1628
|
-
private
|
|
469
|
+
private handleStdoutLine(line: string): void {
|
|
470
|
+
let parsed: ParsedEnvelope;
|
|
1629
471
|
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;
|
|
472
|
+
parsed = JSON.parse(line) as ParsedEnvelope;
|
|
473
|
+
} catch {
|
|
474
|
+
// Non-protocol output should not crash the SDK.
|
|
475
|
+
return;
|
|
1705
476
|
}
|
|
1706
|
-
}
|
|
1707
477
|
|
|
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})`);
|
|
478
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
479
|
+
return;
|
|
1716
480
|
}
|
|
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) {
|
|
481
|
+
if (parsed.v !== PROTOCOL_VERSION || typeof parsed.type !== 'string') {
|
|
1734
482
|
return;
|
|
1735
483
|
}
|
|
1736
484
|
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
});
|
|
1753
|
-
// Still call onMessage so the app is aware of the response if needed
|
|
485
|
+
const envelope: ProtocolEnvelope<unknown> = {
|
|
486
|
+
v: parsed.v,
|
|
487
|
+
type: parsed.type,
|
|
488
|
+
request_id: parsed.request_id,
|
|
489
|
+
payload: parsed.payload,
|
|
490
|
+
};
|
|
491
|
+
|
|
492
|
+
if (envelope.type === 'event') {
|
|
493
|
+
const payload = envelope.payload as BrokerEvent;
|
|
494
|
+
this.eventBuffer.push(payload);
|
|
495
|
+
if (this.eventBuffer.length > this.maxBufferSize) {
|
|
496
|
+
this.eventBuffer.shift();
|
|
497
|
+
}
|
|
498
|
+
for (const listener of this.eventListeners) {
|
|
499
|
+
listener(payload);
|
|
1754
500
|
}
|
|
501
|
+
return;
|
|
1755
502
|
}
|
|
1756
503
|
|
|
1757
|
-
if (
|
|
1758
|
-
|
|
1759
|
-
envelope.from,
|
|
1760
|
-
envelope.payload,
|
|
1761
|
-
envelope.id,
|
|
1762
|
-
envelope.payload_meta,
|
|
1763
|
-
envelope.delivery.originalTo
|
|
1764
|
-
);
|
|
504
|
+
if (!envelope.request_id) {
|
|
505
|
+
return;
|
|
1765
506
|
}
|
|
1766
|
-
}
|
|
1767
507
|
|
|
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;
|
|
508
|
+
const pending = this.pending.get(envelope.request_id);
|
|
509
|
+
if (!pending) {
|
|
510
|
+
return;
|
|
1780
511
|
}
|
|
1781
|
-
return undefined;
|
|
1782
|
-
}
|
|
1783
512
|
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
513
|
+
if (envelope.type === 'error') {
|
|
514
|
+
clearTimeout(pending.timeout);
|
|
515
|
+
this.pending.delete(envelope.request_id);
|
|
516
|
+
pending.reject(new AgentRelayProtocolError(envelope.payload as ProtocolError));
|
|
1787
517
|
return;
|
|
1788
518
|
}
|
|
1789
519
|
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
this.
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
520
|
+
if (envelope.type !== pending.expectedType) {
|
|
521
|
+
clearTimeout(pending.timeout);
|
|
522
|
+
this.pending.delete(envelope.request_id);
|
|
523
|
+
pending.reject(
|
|
524
|
+
new AgentRelayProcessError(
|
|
525
|
+
`unexpected response type '${envelope.type}' for request '${envelope.request_id}' (expected '${pending.expectedType}')`
|
|
526
|
+
)
|
|
1797
527
|
);
|
|
528
|
+
return;
|
|
1798
529
|
}
|
|
1799
530
|
|
|
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
|
-
}
|
|
1814
|
-
}
|
|
1815
|
-
|
|
1816
|
-
private handleAck(envelope: Envelope<AckPayload>): void {
|
|
1817
|
-
const correlationId = envelope.payload.correlationId;
|
|
1818
|
-
if (!correlationId) return;
|
|
1819
|
-
|
|
1820
|
-
const pending = this.pendingSyncAcks.get(correlationId);
|
|
1821
|
-
if (!pending) return;
|
|
1822
|
-
|
|
1823
|
-
clearTimeout(pending.timeoutHandle);
|
|
1824
|
-
this.pendingSyncAcks.delete(correlationId);
|
|
1825
|
-
pending.resolve(envelope.payload);
|
|
531
|
+
clearTimeout(pending.timeout);
|
|
532
|
+
this.pending.delete(envelope.request_id);
|
|
533
|
+
pending.resolve(envelope);
|
|
1826
534
|
}
|
|
1827
535
|
|
|
1828
|
-
private
|
|
1829
|
-
const
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
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);
|
|
536
|
+
private async requestHello(): Promise<{ broker_version: string; protocol_version: number; workspace_key?: string }> {
|
|
537
|
+
const payload = {
|
|
538
|
+
client_name: this.options.clientName,
|
|
539
|
+
client_version: this.options.clientVersion,
|
|
540
|
+
};
|
|
541
|
+
const frame = await this.sendRequest('hello', payload, 'hello_ack');
|
|
542
|
+
return frame.payload as { broker_version: string; protocol_version: number; workspace_key?: string };
|
|
1874
543
|
}
|
|
1875
544
|
|
|
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);
|
|
545
|
+
private async requestOk<T = unknown>(type: string, payload: unknown): Promise<T> {
|
|
546
|
+
const frame = await this.sendRequest(type, payload, 'ok');
|
|
547
|
+
const result = frame.payload as { result: T };
|
|
548
|
+
return result.result;
|
|
1886
549
|
}
|
|
1887
550
|
|
|
1888
|
-
private
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
if (
|
|
1894
|
-
|
|
1895
|
-
this.pendingAgentReady.delete(agentName);
|
|
1896
|
-
pending.resolve(envelope.payload);
|
|
551
|
+
private async sendRequest(
|
|
552
|
+
type: string,
|
|
553
|
+
payload: unknown,
|
|
554
|
+
expectedType: 'ok' | 'hello_ack'
|
|
555
|
+
): Promise<ProtocolEnvelope<unknown>> {
|
|
556
|
+
if (!this.child) {
|
|
557
|
+
throw new AgentRelayProcessError('broker is not running');
|
|
1897
558
|
}
|
|
1898
559
|
|
|
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;
|
|
560
|
+
const requestId = `req_${++this.requestSeq}`;
|
|
561
|
+
const message: ProtocolEnvelope<unknown> = {
|
|
562
|
+
v: PROTOCOL_VERSION,
|
|
563
|
+
type,
|
|
564
|
+
request_id: requestId,
|
|
565
|
+
payload,
|
|
566
|
+
};
|
|
1909
567
|
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
568
|
+
const responsePromise = new Promise<ProtocolEnvelope<unknown>>((resolve, reject) => {
|
|
569
|
+
const timeout = setTimeout(() => {
|
|
570
|
+
this.pending.delete(requestId);
|
|
571
|
+
reject(
|
|
572
|
+
new AgentRelayProcessError(
|
|
573
|
+
`request timed out after ${this.options.requestTimeoutMs}ms (type='${type}', request_id='${requestId}')`
|
|
574
|
+
)
|
|
575
|
+
);
|
|
576
|
+
}, this.options.requestTimeoutMs);
|
|
1914
577
|
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
payload: (envelope.payload as { nonce?: string }) ?? {},
|
|
578
|
+
this.pending.set(requestId, {
|
|
579
|
+
expectedType,
|
|
580
|
+
resolve,
|
|
581
|
+
reject,
|
|
582
|
+
timeout,
|
|
583
|
+
});
|
|
1922
584
|
});
|
|
1923
|
-
}
|
|
1924
|
-
|
|
1925
|
-
private handleErrorFrame(envelope: Envelope<ErrorPayload>): void {
|
|
1926
|
-
if (!this.config.quiet) {
|
|
1927
|
-
console.error('[sdk] Server error:', envelope.payload);
|
|
1928
|
-
}
|
|
1929
585
|
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
this.
|
|
586
|
+
const line = `${JSON.stringify(message)}\n`;
|
|
587
|
+
if (!this.child.stdin.write(line)) {
|
|
588
|
+
await once(this.child.stdin, 'drain');
|
|
1933
589
|
}
|
|
1934
590
|
|
|
1935
|
-
|
|
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
|
-
}
|
|
591
|
+
return responsePromise;
|
|
1942
592
|
}
|
|
593
|
+
}
|
|
1943
594
|
|
|
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
|
-
}
|
|
595
|
+
const CLI_MODEL_FLAG_CLIS = new Set(['claude', 'codex', 'gemini', 'goose', 'aider']);
|
|
1961
596
|
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
this.setState('DISCONNECTED');
|
|
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
|
-
}
|
|
1972
|
-
}
|
|
597
|
+
const CLI_DEFAULT_ARGS: Record<string, string[]> = {
|
|
598
|
+
codex: ['-c', 'check_for_update_on_startup=false'],
|
|
599
|
+
};
|
|
1973
600
|
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
}
|
|
601
|
+
function buildPtyArgsWithModel(cli: string, args: string[], model?: string): string[] {
|
|
602
|
+
const cliName = cli.split(':')[0].trim().toLowerCase();
|
|
603
|
+
const defaultArgs = CLI_DEFAULT_ARGS[cliName] ?? [];
|
|
604
|
+
const baseArgs = [...defaultArgs, ...args];
|
|
605
|
+
if (!model) {
|
|
606
|
+
return baseArgs;
|
|
1981
607
|
}
|
|
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
|
-
}
|
|
608
|
+
if (!CLI_MODEL_FLAG_CLIS.has(cliName)) {
|
|
609
|
+
return baseArgs;
|
|
1989
610
|
}
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
for (const [id, pending] of this.pendingSpawns.entries()) {
|
|
1993
|
-
clearTimeout(pending.timeoutHandle);
|
|
1994
|
-
pending.reject(error);
|
|
1995
|
-
this.pendingSpawns.delete(id);
|
|
1996
|
-
}
|
|
611
|
+
if (hasModelArg(baseArgs)) {
|
|
612
|
+
return baseArgs;
|
|
1997
613
|
}
|
|
614
|
+
return ['--model', model, ...baseArgs];
|
|
615
|
+
}
|
|
1998
616
|
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
617
|
+
function hasModelArg(args: string[]): boolean {
|
|
618
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
619
|
+
const arg = args[i];
|
|
620
|
+
if (arg === '--model') {
|
|
621
|
+
return true;
|
|
2004
622
|
}
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
private rejectPendingSendInputs(error: Error): void {
|
|
2008
|
-
for (const [id, pending] of this.pendingSendInputs.entries()) {
|
|
2009
|
-
clearTimeout(pending.timeoutHandle);
|
|
2010
|
-
pending.reject(error);
|
|
2011
|
-
this.pendingSendInputs.delete(id);
|
|
623
|
+
if (arg.startsWith('--model=')) {
|
|
624
|
+
return true;
|
|
2012
625
|
}
|
|
2013
626
|
}
|
|
627
|
+
return false;
|
|
628
|
+
}
|
|
2014
629
|
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
this.pendingSetModels.delete(id);
|
|
2020
|
-
}
|
|
630
|
+
function expandTilde(p: string): string {
|
|
631
|
+
if (p === '~' || p.startsWith('~/') || p.startsWith('~\\')) {
|
|
632
|
+
const home = os.homedir();
|
|
633
|
+
return path.join(home, p.slice(2));
|
|
2021
634
|
}
|
|
635
|
+
return p;
|
|
636
|
+
}
|
|
2022
637
|
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
638
|
+
function isExplicitPath(binaryPath: string): boolean {
|
|
639
|
+
return (
|
|
640
|
+
binaryPath.includes('/') ||
|
|
641
|
+
binaryPath.includes('\\') ||
|
|
642
|
+
binaryPath.startsWith('.') ||
|
|
643
|
+
binaryPath.startsWith('~')
|
|
644
|
+
);
|
|
645
|
+
}
|
|
2030
646
|
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
pending.reject(error);
|
|
2035
|
-
this.pendingQueries.delete(id);
|
|
2036
|
-
}
|
|
2037
|
-
}
|
|
647
|
+
function resolveDefaultBinaryPath(): string {
|
|
648
|
+
const brokerExe = process.platform === 'win32' ? 'agent-relay-broker.exe' : 'agent-relay-broker';
|
|
649
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
2038
650
|
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
}
|
|
651
|
+
// 1. In a source checkout, prefer Cargo's release binary to avoid stale bundled
|
|
652
|
+
// copies when local dev rebuilds happen while broker processes are running.
|
|
653
|
+
const workspaceRelease = path.resolve(moduleDir, '..', '..', '..', 'target', 'release', brokerExe);
|
|
654
|
+
if (fs.existsSync(workspaceRelease)) {
|
|
655
|
+
return workspaceRelease;
|
|
2045
656
|
}
|
|
2046
657
|
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
this.pendingAgentReady.delete(agentName);
|
|
2052
|
-
}
|
|
658
|
+
// 2. Check for bundled broker binary in SDK package (npm install)
|
|
659
|
+
const bundled = path.resolve(moduleDir, '..', 'bin', brokerExe);
|
|
660
|
+
if (fs.existsSync(bundled)) {
|
|
661
|
+
return bundled;
|
|
2053
662
|
}
|
|
2054
663
|
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
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);
|
|
664
|
+
// 3. Check for standalone broker binary in ~/.agent-relay/bin/ (install.sh)
|
|
665
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '';
|
|
666
|
+
const standaloneBroker = path.join(homeDir, '.agent-relay', 'bin', brokerExe);
|
|
667
|
+
if (fs.existsSync(standaloneBroker)) {
|
|
668
|
+
return standaloneBroker;
|
|
2070
669
|
}
|
|
670
|
+
|
|
671
|
+
// 4. Fall back to agent-relay on PATH (may be Node CLI — will fail for broker ops)
|
|
672
|
+
return 'agent-relay';
|
|
2071
673
|
}
|