agent-relay 2.3.4 → 2.3.5

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.
Files changed (297) hide show
  1. package/README.md +1 -1
  2. package/dist/src/cli/index.js +124 -7
  3. package/dist/src/cli/index.js.map +1 -1
  4. package/package.json +20 -26
  5. package/packages/acp-bridge/package.json +2 -2
  6. package/packages/bridge/package.json +7 -7
  7. package/packages/config/package.json +2 -2
  8. package/packages/continuity/package.json +2 -2
  9. package/packages/daemon/package.json +12 -12
  10. package/packages/hooks/package.json +4 -4
  11. package/packages/mcp/package.json +5 -5
  12. package/packages/memory/package.json +2 -2
  13. package/packages/policy/package.json +2 -2
  14. package/packages/protocol/package.json +1 -1
  15. package/packages/resiliency/package.json +1 -1
  16. package/packages/sdk/dist/index.d.ts +1 -29
  17. package/packages/sdk/dist/index.d.ts.map +1 -1
  18. package/packages/sdk/dist/index.js +1 -38
  19. package/packages/sdk/dist/index.js.map +1 -1
  20. package/packages/sdk/package.json +4 -25
  21. package/packages/sdk/src/index.ts +1 -69
  22. package/packages/sdk-py/README.md +56 -0
  23. package/packages/sdk-py/pyproject.toml +23 -0
  24. package/packages/sdk-py/src/agent_relay/__init__.py +27 -0
  25. package/packages/sdk-py/src/agent_relay/builder.py +367 -0
  26. package/packages/sdk-py/src/agent_relay/types.py +92 -0
  27. package/packages/sdk-py/tests/__init__.py +0 -0
  28. package/packages/sdk-py/tests/test_builder.py +101 -0
  29. package/packages/sdk-ts/dist/index.d.ts +1 -0
  30. package/packages/sdk-ts/dist/index.d.ts.map +1 -1
  31. package/packages/sdk-ts/dist/index.js +1 -0
  32. package/packages/sdk-ts/dist/index.js.map +1 -1
  33. package/packages/sdk-ts/dist/workflows/barrier.d.ts +72 -0
  34. package/packages/sdk-ts/dist/workflows/barrier.d.ts.map +1 -0
  35. package/packages/sdk-ts/dist/workflows/barrier.js +162 -0
  36. package/packages/sdk-ts/dist/workflows/barrier.js.map +1 -0
  37. package/packages/sdk-ts/dist/workflows/builder.d.ts +101 -0
  38. package/packages/sdk-ts/dist/workflows/builder.d.ts.map +1 -0
  39. package/packages/sdk-ts/dist/workflows/builder.js +179 -0
  40. package/packages/sdk-ts/dist/workflows/builder.js.map +1 -0
  41. package/packages/sdk-ts/dist/workflows/cli.d.ts +10 -0
  42. package/packages/sdk-ts/dist/workflows/cli.d.ts.map +1 -0
  43. package/packages/sdk-ts/dist/workflows/cli.js +82 -0
  44. package/packages/sdk-ts/dist/workflows/cli.js.map +1 -0
  45. package/packages/sdk-ts/dist/workflows/coordinator.d.ts +68 -0
  46. package/packages/sdk-ts/dist/workflows/coordinator.d.ts.map +1 -0
  47. package/packages/sdk-ts/dist/workflows/coordinator.js +353 -0
  48. package/packages/sdk-ts/dist/workflows/coordinator.js.map +1 -0
  49. package/packages/sdk-ts/dist/workflows/index.d.ts +10 -0
  50. package/packages/sdk-ts/dist/workflows/index.d.ts.map +1 -0
  51. package/packages/sdk-ts/dist/workflows/index.js +10 -0
  52. package/packages/sdk-ts/dist/workflows/index.js.map +1 -0
  53. package/packages/sdk-ts/dist/workflows/memory-db.d.ts +17 -0
  54. package/packages/sdk-ts/dist/workflows/memory-db.d.ts.map +1 -0
  55. package/packages/sdk-ts/dist/workflows/memory-db.js +33 -0
  56. package/packages/sdk-ts/dist/workflows/memory-db.js.map +1 -0
  57. package/packages/sdk-ts/dist/workflows/run.d.ts +31 -0
  58. package/packages/sdk-ts/dist/workflows/run.d.ts.map +1 -0
  59. package/packages/sdk-ts/dist/workflows/run.js +24 -0
  60. package/packages/sdk-ts/dist/workflows/run.js.map +1 -0
  61. package/packages/sdk-ts/dist/workflows/runner.d.ts +119 -0
  62. package/packages/sdk-ts/dist/workflows/runner.d.ts.map +1 -0
  63. package/packages/sdk-ts/dist/workflows/runner.js +650 -0
  64. package/packages/sdk-ts/dist/workflows/runner.js.map +1 -0
  65. package/packages/sdk-ts/dist/workflows/state.d.ts +77 -0
  66. package/packages/sdk-ts/dist/workflows/state.d.ts.map +1 -0
  67. package/packages/sdk-ts/dist/workflows/state.js +140 -0
  68. package/packages/sdk-ts/dist/workflows/state.js.map +1 -0
  69. package/packages/sdk-ts/dist/workflows/templates.d.ts +47 -0
  70. package/packages/sdk-ts/dist/workflows/templates.d.ts.map +1 -0
  71. package/packages/sdk-ts/dist/workflows/templates.js +395 -0
  72. package/packages/sdk-ts/dist/workflows/templates.js.map +1 -0
  73. package/packages/sdk-ts/dist/workflows/types.d.ts +126 -0
  74. package/packages/sdk-ts/dist/workflows/types.d.ts.map +1 -0
  75. package/packages/sdk-ts/dist/workflows/types.js +8 -0
  76. package/packages/sdk-ts/dist/workflows/types.js.map +1 -0
  77. package/packages/sdk-ts/package.json +8 -2
  78. package/packages/sdk-ts/src/__tests__/error-scenarios.test.ts +682 -0
  79. package/packages/sdk-ts/src/__tests__/swarm-coordinator.test.ts +416 -0
  80. package/packages/sdk-ts/src/__tests__/workflow-runner.test.ts +333 -0
  81. package/packages/sdk-ts/src/index.ts +1 -0
  82. package/packages/sdk-ts/src/workflows/README.md +450 -0
  83. package/packages/sdk-ts/src/workflows/barrier.ts +254 -0
  84. package/packages/sdk-ts/src/workflows/builder.ts +241 -0
  85. package/packages/sdk-ts/src/workflows/builtin-templates/bug-fix.yaml +75 -0
  86. package/packages/sdk-ts/src/workflows/builtin-templates/code-review.yaml +82 -0
  87. package/packages/sdk-ts/src/workflows/builtin-templates/documentation.yaml +70 -0
  88. package/packages/sdk-ts/src/workflows/builtin-templates/feature-dev.yaml +76 -0
  89. package/packages/sdk-ts/src/workflows/builtin-templates/refactor.yaml +82 -0
  90. package/packages/sdk-ts/src/workflows/builtin-templates/security-audit.yaml +84 -0
  91. package/packages/sdk-ts/src/workflows/cli.ts +93 -0
  92. package/packages/sdk-ts/src/workflows/coordinator.ts +520 -0
  93. package/packages/sdk-ts/src/workflows/index.ts +9 -0
  94. package/packages/sdk-ts/src/workflows/memory-db.ts +39 -0
  95. package/packages/sdk-ts/src/workflows/run.ts +47 -0
  96. package/packages/sdk-ts/src/workflows/runner.ts +873 -0
  97. package/packages/sdk-ts/src/workflows/schema.json +321 -0
  98. package/packages/sdk-ts/src/workflows/state.ts +279 -0
  99. package/packages/sdk-ts/src/workflows/templates.ts +544 -0
  100. package/packages/sdk-ts/src/workflows/types.ts +178 -0
  101. package/packages/sdk-ts/tsconfig.json +6 -1
  102. package/packages/spawner/package.json +1 -1
  103. package/packages/state/package.json +1 -1
  104. package/packages/storage/package.json +2 -2
  105. package/packages/telemetry/package.json +1 -1
  106. package/packages/trajectory/package.json +2 -2
  107. package/packages/user-directory/package.json +2 -2
  108. package/packages/utils/package.json +3 -3
  109. package/packages/wrapper/package.json +5 -6
  110. package/packages/api-types/.trajectories/active/traj_xbsvuzogscey.json +0 -15
  111. package/packages/api-types/.trajectories/index.json +0 -12
  112. package/packages/api-types/dist/index.d.ts +0 -21
  113. package/packages/api-types/dist/index.d.ts.map +0 -1
  114. package/packages/api-types/dist/index.js +0 -22
  115. package/packages/api-types/dist/index.js.map +0 -1
  116. package/packages/api-types/dist/schemas/agent.d.ts +0 -259
  117. package/packages/api-types/dist/schemas/agent.d.ts.map +0 -1
  118. package/packages/api-types/dist/schemas/agent.js +0 -102
  119. package/packages/api-types/dist/schemas/agent.js.map +0 -1
  120. package/packages/api-types/dist/schemas/api.d.ts +0 -290
  121. package/packages/api-types/dist/schemas/api.d.ts.map +0 -1
  122. package/packages/api-types/dist/schemas/api.js +0 -162
  123. package/packages/api-types/dist/schemas/api.js.map +0 -1
  124. package/packages/api-types/dist/schemas/decision.d.ts +0 -230
  125. package/packages/api-types/dist/schemas/decision.d.ts.map +0 -1
  126. package/packages/api-types/dist/schemas/decision.js +0 -104
  127. package/packages/api-types/dist/schemas/decision.js.map +0 -1
  128. package/packages/api-types/dist/schemas/fleet.d.ts +0 -615
  129. package/packages/api-types/dist/schemas/fleet.d.ts.map +0 -1
  130. package/packages/api-types/dist/schemas/fleet.js +0 -71
  131. package/packages/api-types/dist/schemas/fleet.js.map +0 -1
  132. package/packages/api-types/dist/schemas/history.d.ts +0 -180
  133. package/packages/api-types/dist/schemas/history.d.ts.map +0 -1
  134. package/packages/api-types/dist/schemas/history.js +0 -72
  135. package/packages/api-types/dist/schemas/history.js.map +0 -1
  136. package/packages/api-types/dist/schemas/index.d.ts +0 -14
  137. package/packages/api-types/dist/schemas/index.d.ts.map +0 -1
  138. package/packages/api-types/dist/schemas/index.js +0 -22
  139. package/packages/api-types/dist/schemas/index.js.map +0 -1
  140. package/packages/api-types/dist/schemas/message.d.ts +0 -456
  141. package/packages/api-types/dist/schemas/message.d.ts.map +0 -1
  142. package/packages/api-types/dist/schemas/message.js +0 -88
  143. package/packages/api-types/dist/schemas/message.js.map +0 -1
  144. package/packages/api-types/dist/schemas/session.d.ts +0 -60
  145. package/packages/api-types/dist/schemas/session.d.ts.map +0 -1
  146. package/packages/api-types/dist/schemas/session.js +0 -36
  147. package/packages/api-types/dist/schemas/session.js.map +0 -1
  148. package/packages/api-types/dist/schemas/task.d.ts +0 -111
  149. package/packages/api-types/dist/schemas/task.d.ts.map +0 -1
  150. package/packages/api-types/dist/schemas/task.js +0 -64
  151. package/packages/api-types/dist/schemas/task.js.map +0 -1
  152. package/packages/api-types/package.json +0 -61
  153. package/packages/api-types/scripts/generate-openapi.ts +0 -106
  154. package/packages/api-types/src/index.ts +0 -22
  155. package/packages/api-types/src/schemas/agent.test.ts +0 -164
  156. package/packages/api-types/src/schemas/agent.ts +0 -110
  157. package/packages/api-types/src/schemas/api.test.ts +0 -372
  158. package/packages/api-types/src/schemas/api.ts +0 -194
  159. package/packages/api-types/src/schemas/decision.test.ts +0 -324
  160. package/packages/api-types/src/schemas/decision.ts +0 -136
  161. package/packages/api-types/src/schemas/fleet.test.ts +0 -212
  162. package/packages/api-types/src/schemas/fleet.ts +0 -83
  163. package/packages/api-types/src/schemas/history.test.ts +0 -242
  164. package/packages/api-types/src/schemas/history.ts +0 -84
  165. package/packages/api-types/src/schemas/index.ts +0 -148
  166. package/packages/api-types/src/schemas/message.test.ts +0 -192
  167. package/packages/api-types/src/schemas/message.ts +0 -98
  168. package/packages/api-types/src/schemas/session.test.ts +0 -104
  169. package/packages/api-types/src/schemas/session.ts +0 -40
  170. package/packages/api-types/src/schemas/task.test.ts +0 -192
  171. package/packages/api-types/src/schemas/task.ts +0 -78
  172. package/packages/api-types/tsconfig.json +0 -19
  173. package/packages/api-types/vitest.config.ts +0 -9
  174. package/packages/benchmark/README.md +0 -200
  175. package/packages/benchmark/datasets/coding-tasks.yaml +0 -127
  176. package/packages/benchmark/datasets/coordination-tasks.yaml +0 -122
  177. package/packages/benchmark/datasets/quick-test.yaml +0 -20
  178. package/packages/benchmark/dist/benchmark.d.ts +0 -47
  179. package/packages/benchmark/dist/benchmark.d.ts.map +0 -1
  180. package/packages/benchmark/dist/benchmark.js +0 -224
  181. package/packages/benchmark/dist/benchmark.js.map +0 -1
  182. package/packages/benchmark/dist/cli.d.ts +0 -8
  183. package/packages/benchmark/dist/cli.d.ts.map +0 -1
  184. package/packages/benchmark/dist/cli.js +0 -185
  185. package/packages/benchmark/dist/cli.js.map +0 -1
  186. package/packages/benchmark/dist/harbor.d.ts +0 -53
  187. package/packages/benchmark/dist/harbor.d.ts.map +0 -1
  188. package/packages/benchmark/dist/harbor.js +0 -127
  189. package/packages/benchmark/dist/harbor.js.map +0 -1
  190. package/packages/benchmark/dist/index.d.ts +0 -48
  191. package/packages/benchmark/dist/index.d.ts.map +0 -1
  192. package/packages/benchmark/dist/index.js +0 -50
  193. package/packages/benchmark/dist/index.js.map +0 -1
  194. package/packages/benchmark/dist/runners/base.d.ts +0 -63
  195. package/packages/benchmark/dist/runners/base.d.ts.map +0 -1
  196. package/packages/benchmark/dist/runners/base.js +0 -156
  197. package/packages/benchmark/dist/runners/base.js.map +0 -1
  198. package/packages/benchmark/dist/runners/index.d.ts +0 -10
  199. package/packages/benchmark/dist/runners/index.d.ts.map +0 -1
  200. package/packages/benchmark/dist/runners/index.js +0 -10
  201. package/packages/benchmark/dist/runners/index.js.map +0 -1
  202. package/packages/benchmark/dist/runners/single.d.ts +0 -19
  203. package/packages/benchmark/dist/runners/single.d.ts.map +0 -1
  204. package/packages/benchmark/dist/runners/single.js +0 -111
  205. package/packages/benchmark/dist/runners/single.js.map +0 -1
  206. package/packages/benchmark/dist/runners/subagent.d.ts +0 -32
  207. package/packages/benchmark/dist/runners/subagent.d.ts.map +0 -1
  208. package/packages/benchmark/dist/runners/subagent.js +0 -212
  209. package/packages/benchmark/dist/runners/subagent.js.map +0 -1
  210. package/packages/benchmark/dist/runners/swarm.d.ts +0 -36
  211. package/packages/benchmark/dist/runners/swarm.d.ts.map +0 -1
  212. package/packages/benchmark/dist/runners/swarm.js +0 -273
  213. package/packages/benchmark/dist/runners/swarm.js.map +0 -1
  214. package/packages/benchmark/dist/types.d.ts +0 -178
  215. package/packages/benchmark/dist/types.d.ts.map +0 -1
  216. package/packages/benchmark/dist/types.js +0 -16
  217. package/packages/benchmark/dist/types.js.map +0 -1
  218. package/packages/benchmark/package.json +0 -80
  219. package/packages/benchmark/src/benchmark.ts +0 -298
  220. package/packages/benchmark/src/cli.ts +0 -240
  221. package/packages/benchmark/src/harbor.ts +0 -170
  222. package/packages/benchmark/src/index.ts +0 -73
  223. package/packages/benchmark/src/runners/base.ts +0 -205
  224. package/packages/benchmark/src/runners/index.ts +0 -10
  225. package/packages/benchmark/src/runners/single.ts +0 -121
  226. package/packages/benchmark/src/runners/subagent.ts +0 -240
  227. package/packages/benchmark/src/runners/swarm.ts +0 -326
  228. package/packages/benchmark/src/types.ts +0 -205
  229. package/packages/benchmark/tsconfig.json +0 -20
  230. package/packages/cli-tester/README.md +0 -277
  231. package/packages/cli-tester/dist/index.d.ts +0 -21
  232. package/packages/cli-tester/dist/index.d.ts.map +0 -1
  233. package/packages/cli-tester/dist/index.js +0 -21
  234. package/packages/cli-tester/dist/index.js.map +0 -1
  235. package/packages/cli-tester/dist/utils/credential-check.d.ts +0 -56
  236. package/packages/cli-tester/dist/utils/credential-check.d.ts.map +0 -1
  237. package/packages/cli-tester/dist/utils/credential-check.js +0 -230
  238. package/packages/cli-tester/dist/utils/credential-check.js.map +0 -1
  239. package/packages/cli-tester/dist/utils/socket-client.d.ts +0 -76
  240. package/packages/cli-tester/dist/utils/socket-client.d.ts.map +0 -1
  241. package/packages/cli-tester/dist/utils/socket-client.js +0 -153
  242. package/packages/cli-tester/dist/utils/socket-client.js.map +0 -1
  243. package/packages/cli-tester/docker/Dockerfile +0 -61
  244. package/packages/cli-tester/docker/docker-compose.yml +0 -71
  245. package/packages/cli-tester/docker/entrypoint.sh +0 -58
  246. package/packages/cli-tester/package.json +0 -32
  247. package/packages/cli-tester/scripts/clear-auth.sh +0 -101
  248. package/packages/cli-tester/scripts/inject-message.sh +0 -42
  249. package/packages/cli-tester/scripts/start.sh +0 -71
  250. package/packages/cli-tester/scripts/test-cli.sh +0 -56
  251. package/packages/cli-tester/scripts/test-full-spawn.sh +0 -238
  252. package/packages/cli-tester/scripts/test-registration.sh +0 -182
  253. package/packages/cli-tester/scripts/test-setup-flow.sh +0 -202
  254. package/packages/cli-tester/scripts/test-spawn.sh +0 -140
  255. package/packages/cli-tester/scripts/test-with-daemon.sh +0 -247
  256. package/packages/cli-tester/scripts/verify-auth.sh +0 -112
  257. package/packages/cli-tester/src/index.ts +0 -40
  258. package/packages/cli-tester/src/utils/credential-check.ts +0 -284
  259. package/packages/cli-tester/src/utils/socket-client.ts +0 -211
  260. package/packages/cli-tester/tests/credential-check.test.ts +0 -56
  261. package/packages/cli-tester/tsconfig.json +0 -11
  262. package/packages/sdk/dist/browser-client.d.ts +0 -212
  263. package/packages/sdk/dist/browser-client.d.ts.map +0 -1
  264. package/packages/sdk/dist/browser-client.js +0 -750
  265. package/packages/sdk/dist/browser-client.js.map +0 -1
  266. package/packages/sdk/dist/browser-framing.d.ts +0 -46
  267. package/packages/sdk/dist/browser-framing.d.ts.map +0 -1
  268. package/packages/sdk/dist/browser-framing.js +0 -122
  269. package/packages/sdk/dist/browser-framing.js.map +0 -1
  270. package/packages/sdk/dist/standalone.d.ts +0 -89
  271. package/packages/sdk/dist/standalone.d.ts.map +0 -1
  272. package/packages/sdk/dist/standalone.js +0 -131
  273. package/packages/sdk/dist/standalone.js.map +0 -1
  274. package/packages/sdk/dist/transports/index.d.ts +0 -92
  275. package/packages/sdk/dist/transports/index.d.ts.map +0 -1
  276. package/packages/sdk/dist/transports/index.js +0 -129
  277. package/packages/sdk/dist/transports/index.js.map +0 -1
  278. package/packages/sdk/dist/transports/socket-transport.d.ts +0 -30
  279. package/packages/sdk/dist/transports/socket-transport.d.ts.map +0 -1
  280. package/packages/sdk/dist/transports/socket-transport.js +0 -94
  281. package/packages/sdk/dist/transports/socket-transport.js.map +0 -1
  282. package/packages/sdk/dist/transports/types.d.ts +0 -69
  283. package/packages/sdk/dist/transports/types.d.ts.map +0 -1
  284. package/packages/sdk/dist/transports/types.js +0 -10
  285. package/packages/sdk/dist/transports/types.js.map +0 -1
  286. package/packages/sdk/dist/transports/websocket-transport.d.ts +0 -55
  287. package/packages/sdk/dist/transports/websocket-transport.d.ts.map +0 -1
  288. package/packages/sdk/dist/transports/websocket-transport.js +0 -180
  289. package/packages/sdk/dist/transports/websocket-transport.js.map +0 -1
  290. package/packages/sdk/src/browser-client.ts +0 -985
  291. package/packages/sdk/src/browser-framing.test.ts +0 -115
  292. package/packages/sdk/src/browser-framing.ts +0 -150
  293. package/packages/sdk/src/standalone.ts +0 -183
  294. package/packages/sdk/src/transports/index.ts +0 -197
  295. package/packages/sdk/src/transports/socket-transport.ts +0 -115
  296. package/packages/sdk/src/transports/types.ts +0 -77
  297. package/packages/sdk/src/transports/websocket-transport.ts +0 -245
@@ -1,372 +0,0 @@
1
- /**
2
- * API Request/Response Schema Tests
3
- */
4
-
5
- import { describe, it, expect } from 'vitest';
6
- import {
7
- SimpleApiResponseSchema,
8
- SendMessageRequestSchema,
9
- SpeakOnTriggerSchema,
10
- ShadowModeSchema,
11
- SpawnAgentRequestSchema,
12
- SpawnAgentResponseSchema,
13
- CreateTaskRequestSchema,
14
- CreateBeadRequestSchema,
15
- SendRelayMessageRequestSchema,
16
- ActivityEventTypeSchema,
17
- ActorTypeSchema,
18
- ActivityEventSchema,
19
- WSMessageTypeSchema,
20
- WSMessageSchema,
21
- DashboardStateSchema,
22
- } from './api.js';
23
-
24
- describe('API Schemas', () => {
25
- describe('SimpleApiResponseSchema', () => {
26
- it('should validate success response', () => {
27
- const response = { success: true };
28
- const result = SimpleApiResponseSchema.parse(response);
29
- expect(result.success).toBe(true);
30
- expect(result.error).toBeUndefined();
31
- });
32
-
33
- it('should validate error response', () => {
34
- const response = { success: false, error: 'Something went wrong' };
35
- const result = SimpleApiResponseSchema.parse(response);
36
- expect(result.success).toBe(false);
37
- expect(result.error).toBe('Something went wrong');
38
- });
39
- });
40
-
41
- describe('SendMessageRequestSchema', () => {
42
- it('should validate basic message', () => {
43
- const request = {
44
- to: 'Agent1',
45
- message: 'Hello, Agent1!',
46
- };
47
- const result = SendMessageRequestSchema.parse(request);
48
- expect(result.to).toBe('Agent1');
49
- expect(result.message).toBe('Hello, Agent1!');
50
- });
51
-
52
- it('should validate message with thread', () => {
53
- const request = {
54
- to: '#general',
55
- message: 'Channel message',
56
- thread: 'thread-123',
57
- };
58
- const result = SendMessageRequestSchema.parse(request);
59
- expect(result.thread).toBe('thread-123');
60
- });
61
-
62
- it('should validate message with attachments', () => {
63
- const request = {
64
- to: 'Agent2',
65
- message: 'See attached files',
66
- attachments: ['file-001', 'file-002'],
67
- };
68
- const result = SendMessageRequestSchema.parse(request);
69
- expect(result.attachments).toHaveLength(2);
70
- });
71
- });
72
-
73
- describe('SpeakOnTriggerSchema', () => {
74
- it('should validate all triggers', () => {
75
- expect(SpeakOnTriggerSchema.parse('SESSION_END')).toBe('SESSION_END');
76
- expect(SpeakOnTriggerSchema.parse('CODE_WRITTEN')).toBe('CODE_WRITTEN');
77
- expect(SpeakOnTriggerSchema.parse('REVIEW_REQUEST')).toBe('REVIEW_REQUEST');
78
- expect(SpeakOnTriggerSchema.parse('EXPLICIT_ASK')).toBe('EXPLICIT_ASK');
79
- expect(SpeakOnTriggerSchema.parse('ALL_MESSAGES')).toBe('ALL_MESSAGES');
80
- });
81
- });
82
-
83
- describe('ShadowModeSchema', () => {
84
- it('should validate shadow modes', () => {
85
- expect(ShadowModeSchema.parse('subagent')).toBe('subagent');
86
- expect(ShadowModeSchema.parse('process')).toBe('process');
87
- });
88
- });
89
-
90
- describe('SpawnAgentRequestSchema', () => {
91
- it('should validate basic spawn request', () => {
92
- const request = {
93
- name: 'Worker1',
94
- };
95
- const result = SpawnAgentRequestSchema.parse(request);
96
- expect(result.name).toBe('Worker1');
97
- });
98
-
99
- it('should validate full spawn request', () => {
100
- const request = {
101
- name: 'ShadowAgent',
102
- cli: 'claude',
103
- task: 'Review code changes',
104
- team: 'backend',
105
- shadowMode: 'subagent',
106
- shadowOf: 'FullStack',
107
- shadowAgent: 'reviewer',
108
- shadowTriggers: ['CODE_WRITTEN', 'REVIEW_REQUEST'],
109
- shadowSpeakOn: ['SESSION_END'],
110
- };
111
- const result = SpawnAgentRequestSchema.parse(request);
112
- expect(result.shadowMode).toBe('subagent');
113
- expect(result.shadowOf).toBe('FullStack');
114
- expect(result.shadowTriggers).toHaveLength(2);
115
- });
116
-
117
- it('should validate non-shadow spawn request', () => {
118
- const request = {
119
- name: 'Backend',
120
- cli: 'codex',
121
- task: 'Build API endpoints',
122
- team: 'api',
123
- };
124
- const result = SpawnAgentRequestSchema.parse(request);
125
- expect(result.cli).toBe('codex');
126
- expect(result.shadowOf).toBeUndefined();
127
- });
128
- });
129
-
130
- describe('SpawnAgentResponseSchema', () => {
131
- it('should validate success response', () => {
132
- const response = {
133
- success: true,
134
- name: 'Worker1',
135
- };
136
- const result = SpawnAgentResponseSchema.parse(response);
137
- expect(result.success).toBe(true);
138
- expect(result.name).toBe('Worker1');
139
- });
140
-
141
- it('should validate error response', () => {
142
- const response = {
143
- success: false,
144
- name: 'Worker1',
145
- error: 'Agent already exists',
146
- };
147
- const result = SpawnAgentResponseSchema.parse(response);
148
- expect(result.success).toBe(false);
149
- expect(result.error).toBe('Agent already exists');
150
- });
151
- });
152
-
153
- describe('CreateTaskRequestSchema', () => {
154
- it('should validate complete task request', () => {
155
- const request = {
156
- agentName: 'FullStack',
157
- title: 'Implement feature X',
158
- description: 'Build the new feature',
159
- priority: 'high',
160
- };
161
- const result = CreateTaskRequestSchema.parse(request);
162
- expect(result.agentName).toBe('FullStack');
163
- expect(result.priority).toBe('high');
164
- });
165
-
166
- it('should validate task without description', () => {
167
- const request = {
168
- agentName: 'Worker',
169
- title: 'Quick fix',
170
- priority: 'critical',
171
- };
172
- const result = CreateTaskRequestSchema.parse(request);
173
- expect(result.description).toBeUndefined();
174
- });
175
-
176
- it('should reject invalid priority', () => {
177
- const request = {
178
- agentName: 'Worker',
179
- title: 'Task',
180
- priority: 'urgent',
181
- };
182
- expect(() => CreateTaskRequestSchema.parse(request)).toThrow();
183
- });
184
- });
185
-
186
- describe('CreateBeadRequestSchema', () => {
187
- it('should validate complete bead request', () => {
188
- const request = {
189
- title: 'New feature',
190
- assignee: 'FullStack',
191
- priority: 2,
192
- type: 'feature',
193
- description: 'Implement the new feature',
194
- };
195
- const result = CreateBeadRequestSchema.parse(request);
196
- expect(result.title).toBe('New feature');
197
- expect(result.priority).toBe(2);
198
- expect(result.type).toBe('feature');
199
- });
200
-
201
- it('should validate minimal bead request', () => {
202
- const request = {
203
- title: 'Bug fix',
204
- };
205
- const result = CreateBeadRequestSchema.parse(request);
206
- expect(result.assignee).toBeUndefined();
207
- expect(result.type).toBeUndefined();
208
- });
209
-
210
- it('should reject invalid bead type', () => {
211
- const request = {
212
- title: 'Task',
213
- type: 'epic',
214
- };
215
- expect(() => CreateBeadRequestSchema.parse(request)).toThrow();
216
- });
217
- });
218
-
219
- describe('SendRelayMessageRequestSchema', () => {
220
- it('should validate relay message', () => {
221
- const request = {
222
- to: 'Agent1',
223
- content: 'Hello from relay',
224
- thread: 'thread-456',
225
- };
226
- const result = SendRelayMessageRequestSchema.parse(request);
227
- expect(result.to).toBe('Agent1');
228
- expect(result.content).toBe('Hello from relay');
229
- });
230
- });
231
-
232
- describe('ActivityEventTypeSchema', () => {
233
- it('should validate all event types', () => {
234
- expect(ActivityEventTypeSchema.parse('agent_spawned')).toBe('agent_spawned');
235
- expect(ActivityEventTypeSchema.parse('agent_released')).toBe('agent_released');
236
- expect(ActivityEventTypeSchema.parse('agent_online')).toBe('agent_online');
237
- expect(ActivityEventTypeSchema.parse('agent_offline')).toBe('agent_offline');
238
- expect(ActivityEventTypeSchema.parse('user_joined')).toBe('user_joined');
239
- expect(ActivityEventTypeSchema.parse('user_left')).toBe('user_left');
240
- expect(ActivityEventTypeSchema.parse('broadcast')).toBe('broadcast');
241
- expect(ActivityEventTypeSchema.parse('error')).toBe('error');
242
- });
243
- });
244
-
245
- describe('ActorTypeSchema', () => {
246
- it('should validate actor types', () => {
247
- expect(ActorTypeSchema.parse('user')).toBe('user');
248
- expect(ActorTypeSchema.parse('agent')).toBe('agent');
249
- expect(ActorTypeSchema.parse('system')).toBe('system');
250
- });
251
- });
252
-
253
- describe('ActivityEventSchema', () => {
254
- it('should validate complete activity event', () => {
255
- const event = {
256
- id: 'event-001',
257
- type: 'agent_spawned',
258
- timestamp: '2025-01-22T10:00:00Z',
259
- actor: 'Lead',
260
- actorAvatarUrl: 'https://example.com/avatar.png',
261
- actorType: 'agent',
262
- title: 'Agent Worker spawned',
263
- description: 'New agent Worker was spawned by Lead',
264
- metadata: { cli: 'claude', team: 'backend' },
265
- };
266
- const result = ActivityEventSchema.parse(event);
267
- expect(result.type).toBe('agent_spawned');
268
- expect(result.actorType).toBe('agent');
269
- expect(result.metadata).toEqual({ cli: 'claude', team: 'backend' });
270
- });
271
-
272
- it('should validate user event', () => {
273
- const event = {
274
- id: 'event-002',
275
- type: 'user_joined',
276
- timestamp: '2025-01-22T09:00:00Z',
277
- actor: 'john@example.com',
278
- actorType: 'user',
279
- title: 'User joined',
280
- };
281
- const result = ActivityEventSchema.parse(event);
282
- expect(result.actorType).toBe('user');
283
- expect(result.description).toBeUndefined();
284
- });
285
-
286
- it('should validate system event', () => {
287
- const event = {
288
- id: 'event-003',
289
- type: 'error',
290
- timestamp: '2025-01-22T10:30:00Z',
291
- actor: 'system',
292
- actorType: 'system',
293
- title: 'Connection error',
294
- description: 'Failed to connect to remote server',
295
- };
296
- const result = ActivityEventSchema.parse(event);
297
- expect(result.type).toBe('error');
298
- expect(result.actorType).toBe('system');
299
- });
300
- });
301
-
302
- describe('WSMessageTypeSchema', () => {
303
- it('should validate message types', () => {
304
- expect(WSMessageTypeSchema.parse('data')).toBe('data');
305
- expect(WSMessageTypeSchema.parse('agents')).toBe('agents');
306
- expect(WSMessageTypeSchema.parse('messages')).toBe('messages');
307
- expect(WSMessageTypeSchema.parse('fleet')).toBe('fleet');
308
- expect(WSMessageTypeSchema.parse('error')).toBe('error');
309
- });
310
- });
311
-
312
- describe('WSMessageSchema', () => {
313
- it('should validate websocket message', () => {
314
- const message = {
315
- type: 'agents',
316
- payload: [{ name: 'Agent1', status: 'online' }],
317
- };
318
- const result = WSMessageSchema.parse(message);
319
- expect(result.type).toBe('agents');
320
- });
321
-
322
- it('should validate error message', () => {
323
- const message = {
324
- type: 'error',
325
- payload: { code: 'UNAUTHORIZED', message: 'Not logged in' },
326
- };
327
- const result = WSMessageSchema.parse(message);
328
- expect(result.type).toBe('error');
329
- });
330
- });
331
-
332
- describe('DashboardStateSchema', () => {
333
- it('should validate dashboard state', () => {
334
- const state = {
335
- agents: [{ name: 'Agent1', status: 'online' }],
336
- messages: [],
337
- currentChannel: '#general',
338
- currentThread: null,
339
- isConnected: true,
340
- viewMode: 'local',
341
- fleetData: null,
342
- sessions: [],
343
- summaries: [],
344
- };
345
- const result = DashboardStateSchema.parse(state);
346
- expect(result.currentChannel).toBe('#general');
347
- expect(result.isConnected).toBe(true);
348
- expect(result.viewMode).toBe('local');
349
- });
350
-
351
- it('should validate fleet view state', () => {
352
- const state = {
353
- agents: [],
354
- messages: [],
355
- currentChannel: '#fleet',
356
- currentThread: 'thread-123',
357
- isConnected: true,
358
- viewMode: 'fleet',
359
- fleetData: {
360
- servers: [],
361
- agents: [],
362
- totalMessages: 0,
363
- },
364
- sessions: [],
365
- summaries: [],
366
- };
367
- const result = DashboardStateSchema.parse(state);
368
- expect(result.viewMode).toBe('fleet');
369
- expect(result.currentThread).toBe('thread-123');
370
- });
371
- });
372
- });
@@ -1,194 +0,0 @@
1
- /**
2
- * API Request/Response Schemas
3
- *
4
- * Zod schemas for API request and response types.
5
- */
6
-
7
- import { z } from 'zod';
8
-
9
- /**
10
- * Generic API response schema
11
- */
12
- export const ApiResponseSchema = <T extends z.ZodTypeAny>(dataSchema: T) =>
13
- z.object({
14
- success: z.boolean(),
15
- data: dataSchema.optional(),
16
- error: z.string().optional(),
17
- });
18
-
19
- /**
20
- * Simple success/error response
21
- */
22
- export const SimpleApiResponseSchema = z.object({
23
- success: z.boolean(),
24
- error: z.string().optional(),
25
- });
26
- export type SimpleApiResponse = z.infer<typeof SimpleApiResponseSchema>;
27
-
28
- /**
29
- * Send message request schema
30
- */
31
- export const SendMessageRequestSchema = z.object({
32
- to: z.string(),
33
- message: z.string(),
34
- thread: z.string().optional(),
35
- /** Attachment IDs to include with the message */
36
- attachments: z.array(z.string()).optional(),
37
- });
38
- export type SendMessageRequest = z.infer<typeof SendMessageRequestSchema>;
39
-
40
- /**
41
- * Speak on trigger enum (for shadow agents)
42
- */
43
- export const SpeakOnTriggerSchema = z.enum([
44
- 'SESSION_END',
45
- 'CODE_WRITTEN',
46
- 'REVIEW_REQUEST',
47
- 'EXPLICIT_ASK',
48
- 'ALL_MESSAGES',
49
- ]);
50
- export type SpeakOnTrigger = z.infer<typeof SpeakOnTriggerSchema>;
51
-
52
- /**
53
- * Shadow mode enum
54
- */
55
- export const ShadowModeSchema = z.enum(['subagent', 'process']);
56
- export type ShadowMode = z.infer<typeof ShadowModeSchema>;
57
-
58
- /**
59
- * Spawn agent request schema
60
- */
61
- export const SpawnAgentRequestSchema = z.object({
62
- name: z.string(),
63
- cli: z.string().optional(),
64
- task: z.string().optional(),
65
- team: z.string().optional(),
66
- /** Shadow execution mode */
67
- shadowMode: ShadowModeSchema.optional(),
68
- /** Primary agent to shadow */
69
- shadowOf: z.string().optional(),
70
- /** Shadow agent profile to use */
71
- shadowAgent: z.string().optional(),
72
- /** When the shadow should be invoked */
73
- shadowTriggers: z.array(SpeakOnTriggerSchema).optional(),
74
- /** When the shadow should speak */
75
- shadowSpeakOn: z.array(SpeakOnTriggerSchema).optional(),
76
- });
77
- export type SpawnAgentRequest = z.infer<typeof SpawnAgentRequestSchema>;
78
-
79
- /**
80
- * Spawn agent response schema
81
- */
82
- export const SpawnAgentResponseSchema = z.object({
83
- success: z.boolean(),
84
- name: z.string(),
85
- error: z.string().optional(),
86
- });
87
- export type SpawnAgentResponse = z.infer<typeof SpawnAgentResponseSchema>;
88
-
89
- /**
90
- * Create task request schema
91
- */
92
- export const CreateTaskRequestSchema = z.object({
93
- agentName: z.string(),
94
- title: z.string(),
95
- description: z.string().optional(),
96
- priority: z.enum(['low', 'medium', 'high', 'critical']),
97
- });
98
- export type CreateTaskRequest = z.infer<typeof CreateTaskRequestSchema>;
99
-
100
- /**
101
- * Create bead request schema
102
- */
103
- export const CreateBeadRequestSchema = z.object({
104
- title: z.string(),
105
- assignee: z.string().optional(),
106
- priority: z.number().optional(),
107
- type: z.enum(['task', 'bug', 'feature']).optional(),
108
- description: z.string().optional(),
109
- });
110
- export type CreateBeadRequest = z.infer<typeof CreateBeadRequestSchema>;
111
-
112
- /**
113
- * Send relay message request schema
114
- */
115
- export const SendRelayMessageRequestSchema = z.object({
116
- to: z.string(),
117
- content: z.string(),
118
- thread: z.string().optional(),
119
- });
120
- export type SendRelayMessageRequest = z.infer<typeof SendRelayMessageRequestSchema>;
121
-
122
- /**
123
- * Activity event type enum
124
- */
125
- export const ActivityEventTypeSchema = z.enum([
126
- 'agent_spawned',
127
- 'agent_released',
128
- 'agent_online',
129
- 'agent_offline',
130
- 'user_joined',
131
- 'user_left',
132
- 'broadcast',
133
- 'error',
134
- ]);
135
- export type ActivityEventType = z.infer<typeof ActivityEventTypeSchema>;
136
-
137
- /**
138
- * Actor type enum
139
- */
140
- export const ActorTypeSchema = z.enum(['user', 'agent', 'system']);
141
- export type ActorType = z.infer<typeof ActorTypeSchema>;
142
-
143
- /**
144
- * Activity event schema
145
- */
146
- export const ActivityEventSchema = z.object({
147
- id: z.string(),
148
- type: ActivityEventTypeSchema,
149
- timestamp: z.string(),
150
- /** Actor who triggered the event */
151
- actor: z.string(),
152
- /** Optional avatar URL for the actor */
153
- actorAvatarUrl: z.string().optional(),
154
- /** Whether actor is a user or agent */
155
- actorType: ActorTypeSchema,
156
- /** Event title for display */
157
- title: z.string(),
158
- /** Optional detailed description */
159
- description: z.string().optional(),
160
- /** Optional metadata */
161
- metadata: z.record(z.unknown()).optional(),
162
- });
163
- export type ActivityEvent = z.infer<typeof ActivityEventSchema>;
164
-
165
- /**
166
- * WebSocket message type enum
167
- */
168
- export const WSMessageTypeSchema = z.enum(['data', 'agents', 'messages', 'fleet', 'error']);
169
- export type WSMessageType = z.infer<typeof WSMessageTypeSchema>;
170
-
171
- /**
172
- * WebSocket message schema
173
- */
174
- export const WSMessageSchema = z.object({
175
- type: WSMessageTypeSchema,
176
- payload: z.unknown(),
177
- });
178
- export type WSMessage = z.infer<typeof WSMessageSchema>;
179
-
180
- /**
181
- * Dashboard state schema
182
- */
183
- export const DashboardStateSchema = z.object({
184
- agents: z.array(z.lazy(() => z.any())), // References AgentSchema
185
- messages: z.array(z.lazy(() => z.any())), // References MessageSchema
186
- currentChannel: z.string(),
187
- currentThread: z.string().nullable(),
188
- isConnected: z.boolean(),
189
- viewMode: z.enum(['local', 'fleet']),
190
- fleetData: z.lazy(() => z.any()).nullable(), // References FleetDataSchema
191
- sessions: z.array(z.lazy(() => z.any())), // References SessionSchema
192
- summaries: z.array(z.lazy(() => z.any())), // References AgentSummarySchema
193
- });
194
- export type DashboardState = z.infer<typeof DashboardStateSchema>;