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,324 +0,0 @@
1
- /**
2
- * Decision Schema Tests
3
- */
4
-
5
- import { describe, it, expect } from 'vitest';
6
- import {
7
- DecisionUrgencySchema,
8
- DecisionCategorySchema,
9
- DecisionOptionSchema,
10
- ApiDecisionSchema,
11
- DecisionSchema,
12
- PendingDecisionSchema,
13
- TrajectoryDecisionTypeSchema,
14
- TrajectoryDecisionOutcomeSchema,
15
- TrajectoryDecisionSchema,
16
- TrajectorySchema,
17
- } from './decision.js';
18
-
19
- describe('Decision Schemas', () => {
20
- describe('DecisionUrgencySchema', () => {
21
- it('should validate urgency levels', () => {
22
- expect(DecisionUrgencySchema.parse('low')).toBe('low');
23
- expect(DecisionUrgencySchema.parse('medium')).toBe('medium');
24
- expect(DecisionUrgencySchema.parse('high')).toBe('high');
25
- expect(DecisionUrgencySchema.parse('critical')).toBe('critical');
26
- });
27
-
28
- it('should reject invalid urgency', () => {
29
- expect(() => DecisionUrgencySchema.parse('urgent')).toThrow();
30
- expect(() => DecisionUrgencySchema.parse('P1')).toThrow();
31
- });
32
- });
33
-
34
- describe('DecisionCategorySchema', () => {
35
- it('should validate categories', () => {
36
- expect(DecisionCategorySchema.parse('approval')).toBe('approval');
37
- expect(DecisionCategorySchema.parse('choice')).toBe('choice');
38
- expect(DecisionCategorySchema.parse('input')).toBe('input');
39
- expect(DecisionCategorySchema.parse('confirmation')).toBe('confirmation');
40
- });
41
-
42
- it('should reject invalid category', () => {
43
- expect(() => DecisionCategorySchema.parse('question')).toThrow();
44
- });
45
- });
46
-
47
- describe('DecisionOptionSchema', () => {
48
- it('should validate option with description', () => {
49
- const option = {
50
- id: 'opt-1',
51
- label: 'Option A',
52
- description: 'This is option A',
53
- };
54
- const result = DecisionOptionSchema.parse(option);
55
- expect(result.id).toBe('opt-1');
56
- expect(result.label).toBe('Option A');
57
- });
58
-
59
- it('should allow option without description', () => {
60
- const option = {
61
- id: 'opt-2',
62
- label: 'Option B',
63
- };
64
- const result = DecisionOptionSchema.parse(option);
65
- expect(result.description).toBeUndefined();
66
- });
67
- });
68
-
69
- describe('ApiDecisionSchema', () => {
70
- it('should validate complete API decision', () => {
71
- const decision = {
72
- id: 'dec-001',
73
- agentName: 'FullStack',
74
- title: 'Choose database',
75
- description: 'Select the database to use for the project',
76
- options: [
77
- { id: 'opt-1', label: 'PostgreSQL', description: 'Relational DB' },
78
- { id: 'opt-2', label: 'MongoDB', description: 'Document DB' },
79
- ],
80
- urgency: 'high',
81
- category: 'choice',
82
- createdAt: '2025-01-22T10:00:00Z',
83
- expiresAt: '2025-01-22T12:00:00Z',
84
- context: { projectType: 'web-app' },
85
- };
86
- const result = ApiDecisionSchema.parse(decision);
87
- expect(result.options).toHaveLength(2);
88
- expect(result.urgency).toBe('high');
89
- expect(result.category).toBe('choice');
90
- });
91
-
92
- it('should allow decision without options', () => {
93
- const decision = {
94
- id: 'dec-002',
95
- agentName: 'Worker',
96
- title: 'Approve deployment',
97
- description: 'Approve the deployment to production',
98
- urgency: 'critical',
99
- category: 'approval',
100
- createdAt: '2025-01-22T11:00:00Z',
101
- };
102
- const result = ApiDecisionSchema.parse(decision);
103
- expect(result.options).toBeUndefined();
104
- expect(result.expiresAt).toBeUndefined();
105
- });
106
- });
107
-
108
- describe('DecisionSchema', () => {
109
- it('should validate decision with string timestamp', () => {
110
- const decision = {
111
- id: 'dec-003',
112
- agentName: 'Backend',
113
- timestamp: '2025-01-22T10:30:00Z',
114
- type: 'input',
115
- title: 'Enter API key',
116
- description: 'Provide the third-party API key',
117
- priority: 'medium',
118
- };
119
- const result = DecisionSchema.parse(decision);
120
- expect(result.timestamp).toBe('2025-01-22T10:30:00Z');
121
- });
122
-
123
- it('should validate decision with numeric timestamp', () => {
124
- const decision = {
125
- id: 'dec-004',
126
- agentName: 'Frontend',
127
- timestamp: 1705920600000,
128
- type: 'confirmation',
129
- title: 'Confirm delete',
130
- description: 'Are you sure you want to delete this file?',
131
- priority: 'low',
132
- };
133
- const result = DecisionSchema.parse(decision);
134
- expect(result.timestamp).toBe(1705920600000);
135
- });
136
-
137
- it('should validate decision with options and context', () => {
138
- const decision = {
139
- id: 'dec-005',
140
- agentName: 'Lead',
141
- timestamp: Date.now(),
142
- type: 'choice',
143
- title: 'Select framework',
144
- description: 'Choose the frontend framework',
145
- options: [
146
- { id: 'react', label: 'React' },
147
- { id: 'vue', label: 'Vue' },
148
- ],
149
- priority: 'high',
150
- context: { team: 'frontend' },
151
- expiresAt: '2025-01-23T10:00:00Z',
152
- };
153
- const result = DecisionSchema.parse(decision);
154
- expect(result.options).toHaveLength(2);
155
- expect(result.context).toEqual({ team: 'frontend' });
156
- });
157
- });
158
-
159
- describe('PendingDecisionSchema', () => {
160
- it('should validate pending decision', () => {
161
- const decision = {
162
- id: 'pending-001',
163
- agent: 'Worker',
164
- question: 'Which approach should we use?',
165
- options: ['Approach A', 'Approach B', 'Approach C'],
166
- context: 'Building new feature',
167
- priority: 'medium',
168
- createdAt: '2025-01-22T09:00:00Z',
169
- expiresAt: '2025-01-22T17:00:00Z',
170
- };
171
- const result = PendingDecisionSchema.parse(decision);
172
- expect(result.options).toHaveLength(3);
173
- expect(result.priority).toBe('medium');
174
- });
175
-
176
- it('should allow pending decision without options', () => {
177
- const decision = {
178
- id: 'pending-002',
179
- agent: 'Backend',
180
- question: 'What is the expected response format?',
181
- priority: 'low',
182
- createdAt: '2025-01-22T10:00:00Z',
183
- };
184
- const result = PendingDecisionSchema.parse(decision);
185
- expect(result.options).toBeUndefined();
186
- expect(result.context).toBeUndefined();
187
- });
188
- });
189
-
190
- describe('TrajectoryDecisionTypeSchema', () => {
191
- it('should validate decision types', () => {
192
- expect(TrajectoryDecisionTypeSchema.parse('tool_call')).toBe('tool_call');
193
- expect(TrajectoryDecisionTypeSchema.parse('message')).toBe('message');
194
- expect(TrajectoryDecisionTypeSchema.parse('file_edit')).toBe('file_edit');
195
- expect(TrajectoryDecisionTypeSchema.parse('command')).toBe('command');
196
- expect(TrajectoryDecisionTypeSchema.parse('question')).toBe('question');
197
- });
198
- });
199
-
200
- describe('TrajectoryDecisionOutcomeSchema', () => {
201
- it('should validate outcomes', () => {
202
- expect(TrajectoryDecisionOutcomeSchema.parse('success')).toBe('success');
203
- expect(TrajectoryDecisionOutcomeSchema.parse('error')).toBe('error');
204
- expect(TrajectoryDecisionOutcomeSchema.parse('pending')).toBe('pending');
205
- });
206
- });
207
-
208
- describe('TrajectoryDecisionSchema', () => {
209
- it('should validate simple trajectory decision', () => {
210
- const decision = {
211
- id: 'traj-001',
212
- timestamp: '2025-01-22T10:00:00Z',
213
- agent: 'FullStack',
214
- type: 'tool_call',
215
- summary: 'Read file package.json',
216
- details: 'Reading package.json to check dependencies',
217
- outcome: 'success',
218
- };
219
- const result = TrajectoryDecisionSchema.parse(decision);
220
- expect(result.id).toBe('traj-001');
221
- expect(result.type).toBe('tool_call');
222
- expect(result.outcome).toBe('success');
223
- });
224
-
225
- it('should validate trajectory decision with children (recursive)', () => {
226
- const decision = {
227
- id: 'traj-002',
228
- timestamp: '2025-01-22T10:05:00Z',
229
- agent: 'Lead',
230
- type: 'command',
231
- summary: 'Run build process',
232
- outcome: 'success',
233
- children: [
234
- {
235
- id: 'traj-003',
236
- timestamp: '2025-01-22T10:05:01Z',
237
- agent: 'Lead',
238
- type: 'tool_call',
239
- summary: 'Execute npm run build',
240
- outcome: 'success',
241
- },
242
- {
243
- id: 'traj-004',
244
- timestamp: '2025-01-22T10:05:30Z',
245
- agent: 'Lead',
246
- type: 'message',
247
- summary: 'Build completed',
248
- outcome: 'success',
249
- },
250
- ],
251
- };
252
- const result = TrajectoryDecisionSchema.parse(decision);
253
- expect(result.children).toHaveLength(2);
254
- expect(result.children?.[0].type).toBe('tool_call');
255
- });
256
-
257
- it('should validate deeply nested children', () => {
258
- const decision = {
259
- id: 'root',
260
- timestamp: '2025-01-22T10:00:00Z',
261
- agent: 'Root',
262
- type: 'command',
263
- summary: 'Root command',
264
- children: [
265
- {
266
- id: 'level-1',
267
- timestamp: '2025-01-22T10:01:00Z',
268
- agent: 'Root',
269
- type: 'tool_call',
270
- summary: 'Level 1',
271
- children: [
272
- {
273
- id: 'level-2',
274
- timestamp: '2025-01-22T10:02:00Z',
275
- agent: 'Root',
276
- type: 'file_edit',
277
- summary: 'Level 2',
278
- },
279
- ],
280
- },
281
- ],
282
- };
283
- const result = TrajectoryDecisionSchema.parse(decision);
284
- expect(result.children?.[0].children?.[0].id).toBe('level-2');
285
- });
286
- });
287
-
288
- describe('TrajectorySchema', () => {
289
- it('should validate complete trajectory', () => {
290
- const trajectory = {
291
- agentName: 'FullStack',
292
- sessionId: 'session-001',
293
- decisions: [
294
- {
295
- id: 'traj-001',
296
- timestamp: '2025-01-22T10:00:00Z',
297
- agent: 'FullStack',
298
- type: 'tool_call',
299
- summary: 'Start work',
300
- outcome: 'success',
301
- },
302
- ],
303
- startTime: '2025-01-22T10:00:00Z',
304
- endTime: '2025-01-22T12:00:00Z',
305
- };
306
- const result = TrajectorySchema.parse(trajectory);
307
- expect(result.agentName).toBe('FullStack');
308
- expect(result.decisions).toHaveLength(1);
309
- expect(result.endTime).toBe('2025-01-22T12:00:00Z');
310
- });
311
-
312
- it('should allow trajectory without endTime (in progress)', () => {
313
- const trajectory = {
314
- agentName: 'Worker',
315
- sessionId: 'session-002',
316
- decisions: [],
317
- startTime: '2025-01-22T11:00:00Z',
318
- };
319
- const result = TrajectorySchema.parse(trajectory);
320
- expect(result.endTime).toBeUndefined();
321
- expect(result.decisions).toHaveLength(0);
322
- });
323
- });
324
- });
@@ -1,136 +0,0 @@
1
- /**
2
- * Decision Schemas
3
- *
4
- * Zod schemas for decision queue types used across the dashboard and API.
5
- */
6
-
7
- import { z } from 'zod';
8
-
9
- /**
10
- * Decision urgency/priority enum
11
- */
12
- export const DecisionUrgencySchema = z.enum(['low', 'medium', 'high', 'critical']);
13
- export type DecisionUrgency = z.infer<typeof DecisionUrgencySchema>;
14
-
15
- /**
16
- * Decision category enum
17
- */
18
- export const DecisionCategorySchema = z.enum(['approval', 'choice', 'input', 'confirmation']);
19
- export type DecisionCategory = z.infer<typeof DecisionCategorySchema>;
20
-
21
- /**
22
- * Decision option schema
23
- */
24
- export const DecisionOptionSchema = z.object({
25
- id: z.string(),
26
- label: z.string(),
27
- description: z.string().optional(),
28
- });
29
- export type DecisionOption = z.infer<typeof DecisionOptionSchema>;
30
-
31
- /**
32
- * API Decision schema (from API response)
33
- */
34
- export const ApiDecisionSchema = z.object({
35
- id: z.string(),
36
- agentName: z.string(),
37
- title: z.string(),
38
- description: z.string(),
39
- options: z.array(DecisionOptionSchema).optional(),
40
- urgency: DecisionUrgencySchema,
41
- category: DecisionCategorySchema,
42
- createdAt: z.string(),
43
- expiresAt: z.string().optional(),
44
- context: z.record(z.unknown()).optional(),
45
- });
46
- export type ApiDecision = z.infer<typeof ApiDecisionSchema>;
47
-
48
- /**
49
- * Decision schema (component format)
50
- */
51
- export const DecisionSchema = z.object({
52
- id: z.string(),
53
- agentName: z.string(),
54
- timestamp: z.union([z.string(), z.number()]),
55
- type: DecisionCategorySchema,
56
- title: z.string(),
57
- description: z.string(),
58
- options: z.array(DecisionOptionSchema).optional(),
59
- priority: DecisionUrgencySchema,
60
- context: z.record(z.unknown()).optional(),
61
- expiresAt: z.union([z.string(), z.number()]).optional(),
62
- });
63
- export type Decision = z.infer<typeof DecisionSchema>;
64
-
65
- /**
66
- * Pending decision schema (simplified format)
67
- */
68
- export const PendingDecisionSchema = z.object({
69
- id: z.string(),
70
- agent: z.string(),
71
- question: z.string(),
72
- options: z.array(z.string()).optional(),
73
- context: z.string().optional(),
74
- priority: DecisionUrgencySchema,
75
- createdAt: z.string(),
76
- expiresAt: z.string().optional(),
77
- });
78
- export type PendingDecision = z.infer<typeof PendingDecisionSchema>;
79
-
80
- /**
81
- * Trajectory decision type enum (for tracking)
82
- */
83
- export const TrajectoryDecisionTypeSchema = z.enum([
84
- 'tool_call',
85
- 'message',
86
- 'file_edit',
87
- 'command',
88
- 'question',
89
- ]);
90
- export type TrajectoryDecisionType = z.infer<typeof TrajectoryDecisionTypeSchema>;
91
-
92
- /**
93
- * Trajectory decision outcome enum
94
- */
95
- export const TrajectoryDecisionOutcomeSchema = z.enum(['success', 'error', 'pending']);
96
- export type TrajectoryDecisionOutcome = z.infer<typeof TrajectoryDecisionOutcomeSchema>;
97
-
98
- /**
99
- * Trajectory decision schema (for decision tracking)
100
- */
101
- export const TrajectoryDecisionSchema: z.ZodType<TrajectoryDecision> = z.lazy(() =>
102
- z.object({
103
- id: z.string(),
104
- timestamp: z.string(),
105
- agent: z.string(),
106
- type: TrajectoryDecisionTypeSchema,
107
- summary: z.string(),
108
- details: z.string().optional(),
109
- context: z.string().optional(),
110
- outcome: TrajectoryDecisionOutcomeSchema.optional(),
111
- children: z.array(TrajectoryDecisionSchema).optional(),
112
- })
113
- );
114
- export type TrajectoryDecision = {
115
- id: string;
116
- timestamp: string;
117
- agent: string;
118
- type: TrajectoryDecisionType;
119
- summary: string;
120
- details?: string;
121
- context?: string;
122
- outcome?: TrajectoryDecisionOutcome;
123
- children?: TrajectoryDecision[];
124
- };
125
-
126
- /**
127
- * Trajectory schema
128
- */
129
- export const TrajectorySchema = z.object({
130
- agentName: z.string(),
131
- sessionId: z.string(),
132
- decisions: z.array(TrajectoryDecisionSchema),
133
- startTime: z.string(),
134
- endTime: z.string().optional(),
135
- });
136
- export type Trajectory = z.infer<typeof TrajectorySchema>;
@@ -1,212 +0,0 @@
1
- /**
2
- * Fleet Schema Tests
3
- */
4
-
5
- import { describe, it, expect } from 'vitest';
6
- import {
7
- PeerServerStatusSchema,
8
- PeerServerSchema,
9
- FleetDataSchema,
10
- ProjectSchema,
11
- FleetServerSchema,
12
- FleetStatsSchema,
13
- } from './fleet.js';
14
-
15
- describe('Fleet Schemas', () => {
16
- describe('PeerServerStatusSchema', () => {
17
- it('should validate valid statuses', () => {
18
- expect(PeerServerStatusSchema.parse('connected')).toBe('connected');
19
- expect(PeerServerStatusSchema.parse('disconnected')).toBe('disconnected');
20
- expect(PeerServerStatusSchema.parse('error')).toBe('error');
21
- });
22
-
23
- it('should reject invalid status', () => {
24
- expect(() => PeerServerStatusSchema.parse('unknown')).toThrow();
25
- });
26
- });
27
-
28
- describe('PeerServerSchema', () => {
29
- it('should validate valid peer server', () => {
30
- const server = {
31
- id: 'server-1',
32
- url: 'http://localhost:3888',
33
- name: 'Primary Server',
34
- status: 'connected',
35
- agentCount: 5,
36
- latency: 42,
37
- };
38
- const result = PeerServerSchema.parse(server);
39
- expect(result.id).toBe('server-1');
40
- expect(result.status).toBe('connected');
41
- expect(result.agentCount).toBe(5);
42
- });
43
-
44
- it('should allow optional fields', () => {
45
- const server = {
46
- id: 'server-2',
47
- url: 'http://localhost:3889',
48
- status: 'disconnected',
49
- agentCount: 0,
50
- };
51
- const result = PeerServerSchema.parse(server);
52
- expect(result.name).toBeUndefined();
53
- expect(result.latency).toBeUndefined();
54
- });
55
-
56
- it('should reject missing required fields', () => {
57
- expect(() => PeerServerSchema.parse({ id: 'server-1' })).toThrow();
58
- });
59
- });
60
-
61
- describe('FleetDataSchema', () => {
62
- it('should validate fleet data with servers and agents', () => {
63
- const fleet = {
64
- servers: [
65
- {
66
- id: 'server-1',
67
- url: 'http://localhost:3888',
68
- status: 'connected',
69
- agentCount: 2,
70
- },
71
- ],
72
- agents: [
73
- {
74
- name: 'Agent1',
75
- status: 'online',
76
- },
77
- ],
78
- totalMessages: 150,
79
- };
80
- const result = FleetDataSchema.parse(fleet);
81
- expect(result.servers).toHaveLength(1);
82
- expect(result.agents).toHaveLength(1);
83
- expect(result.totalMessages).toBe(150);
84
- });
85
-
86
- it('should allow empty arrays', () => {
87
- const fleet = {
88
- servers: [],
89
- agents: [],
90
- totalMessages: 0,
91
- };
92
- const result = FleetDataSchema.parse(fleet);
93
- expect(result.servers).toHaveLength(0);
94
- expect(result.agents).toHaveLength(0);
95
- });
96
- });
97
-
98
- describe('ProjectSchema', () => {
99
- it('should validate project with lead', () => {
100
- const project = {
101
- id: 'proj-1',
102
- path: '/workspace/project',
103
- name: 'My Project',
104
- agents: [{ name: 'Worker', status: 'online' }],
105
- lead: {
106
- name: 'Lead',
107
- connected: true,
108
- },
109
- };
110
- const result = ProjectSchema.parse(project);
111
- expect(result.lead?.name).toBe('Lead');
112
- expect(result.lead?.connected).toBe(true);
113
- });
114
-
115
- it('should allow project without lead', () => {
116
- const project = {
117
- id: 'proj-2',
118
- path: '/workspace/other',
119
- agents: [],
120
- };
121
- const result = ProjectSchema.parse(project);
122
- expect(result.lead).toBeUndefined();
123
- expect(result.name).toBeUndefined();
124
- });
125
- });
126
-
127
- describe('FleetServerSchema', () => {
128
- it('should validate fleet server with all metrics', () => {
129
- const server = {
130
- id: 'fleet-server-1',
131
- name: 'Production Server',
132
- status: 'healthy',
133
- agents: [
134
- { name: 'Agent1', status: 'online' },
135
- { name: 'Agent2', status: 'busy' },
136
- ],
137
- cpuUsage: 45.5,
138
- memoryUsage: 72.3,
139
- activeConnections: 12,
140
- uptime: 86400,
141
- lastHeartbeat: '2025-01-22T10:00:00Z',
142
- };
143
- const result = FleetServerSchema.parse(server);
144
- expect(result.status).toBe('healthy');
145
- expect(result.agents).toHaveLength(2);
146
- expect(result.cpuUsage).toBe(45.5);
147
- });
148
-
149
- it('should validate degraded status', () => {
150
- const server = {
151
- id: 'fleet-server-2',
152
- name: 'Secondary Server',
153
- status: 'degraded',
154
- agents: [],
155
- cpuUsage: 95,
156
- memoryUsage: 88,
157
- activeConnections: 3,
158
- uptime: 3600,
159
- lastHeartbeat: '2025-01-22T09:59:00Z',
160
- };
161
- const result = FleetServerSchema.parse(server);
162
- expect(result.status).toBe('degraded');
163
- });
164
-
165
- it('should reject invalid status', () => {
166
- const server = {
167
- id: 'fleet-server-3',
168
- name: 'Bad Server',
169
- status: 'unknown',
170
- agents: [],
171
- cpuUsage: 0,
172
- memoryUsage: 0,
173
- activeConnections: 0,
174
- uptime: 0,
175
- lastHeartbeat: '2025-01-22T10:00:00Z',
176
- };
177
- expect(() => FleetServerSchema.parse(server)).toThrow();
178
- });
179
- });
180
-
181
- describe('FleetStatsSchema', () => {
182
- it('should validate complete stats', () => {
183
- const stats = {
184
- totalAgents: 10,
185
- onlineAgents: 7,
186
- busyAgents: 3,
187
- pendingDecisions: 2,
188
- activeTasks: 5,
189
- };
190
- const result = FleetStatsSchema.parse(stats);
191
- expect(result.totalAgents).toBe(10);
192
- expect(result.onlineAgents).toBe(7);
193
- expect(result.busyAgents).toBe(3);
194
- });
195
-
196
- it('should validate zero stats', () => {
197
- const stats = {
198
- totalAgents: 0,
199
- onlineAgents: 0,
200
- busyAgents: 0,
201
- pendingDecisions: 0,
202
- activeTasks: 0,
203
- };
204
- const result = FleetStatsSchema.parse(stats);
205
- expect(result.totalAgents).toBe(0);
206
- });
207
-
208
- it('should reject missing fields', () => {
209
- expect(() => FleetStatsSchema.parse({ totalAgents: 5 })).toThrow();
210
- });
211
- });
212
- });