claude-test-bench 1.0.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.
Files changed (314) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +474 -0
  3. package/dist/bin/ctb.d.ts +3 -0
  4. package/dist/bin/ctb.d.ts.map +1 -0
  5. package/dist/bin/ctb.js +107 -0
  6. package/dist/bin/ctb.js.map +1 -0
  7. package/dist/server/index.d.ts +13 -0
  8. package/dist/server/index.d.ts.map +1 -0
  9. package/dist/server/index.js +72 -0
  10. package/dist/server/index.js.map +1 -0
  11. package/dist/server/interfaces/evaluator.d.ts +15 -0
  12. package/dist/server/interfaces/evaluator.d.ts.map +1 -0
  13. package/dist/server/interfaces/evaluator.js +2 -0
  14. package/dist/server/interfaces/evaluator.js.map +1 -0
  15. package/dist/server/interfaces/logger.d.ts +9 -0
  16. package/dist/server/interfaces/logger.d.ts.map +1 -0
  17. package/dist/server/interfaces/logger.js +2 -0
  18. package/dist/server/interfaces/logger.js.map +1 -0
  19. package/dist/server/interfaces/runner.d.ts +9 -0
  20. package/dist/server/interfaces/runner.d.ts.map +1 -0
  21. package/dist/server/interfaces/runner.js +2 -0
  22. package/dist/server/interfaces/runner.js.map +1 -0
  23. package/dist/server/interfaces/storage.d.ts +36 -0
  24. package/dist/server/interfaces/storage.d.ts.map +1 -0
  25. package/dist/server/interfaces/storage.js +2 -0
  26. package/dist/server/interfaces/storage.js.map +1 -0
  27. package/dist/server/interfaces/workspace.d.ts +9 -0
  28. package/dist/server/interfaces/workspace.d.ts.map +1 -0
  29. package/dist/server/interfaces/workspace.js +2 -0
  30. package/dist/server/interfaces/workspace.js.map +1 -0
  31. package/dist/server/routes/eval-queue.d.ts +23 -0
  32. package/dist/server/routes/eval-queue.d.ts.map +1 -0
  33. package/dist/server/routes/eval-queue.js +45 -0
  34. package/dist/server/routes/eval-queue.js.map +1 -0
  35. package/dist/server/routes/evaluations.d.ts +8 -0
  36. package/dist/server/routes/evaluations.d.ts.map +1 -0
  37. package/dist/server/routes/evaluations.js +217 -0
  38. package/dist/server/routes/evaluations.js.map +1 -0
  39. package/dist/server/routes/providers.d.ts +5 -0
  40. package/dist/server/routes/providers.d.ts.map +1 -0
  41. package/dist/server/routes/providers.js +194 -0
  42. package/dist/server/routes/providers.js.map +1 -0
  43. package/dist/server/routes/run-queue.d.ts +17 -0
  44. package/dist/server/routes/run-queue.d.ts.map +1 -0
  45. package/dist/server/routes/run-queue.js +34 -0
  46. package/dist/server/routes/run-queue.js.map +1 -0
  47. package/dist/server/routes/run-sse.d.ts +18 -0
  48. package/dist/server/routes/run-sse.d.ts.map +1 -0
  49. package/dist/server/routes/run-sse.js +57 -0
  50. package/dist/server/routes/run-sse.js.map +1 -0
  51. package/dist/server/routes/runs.d.ts +9 -0
  52. package/dist/server/routes/runs.d.ts.map +1 -0
  53. package/dist/server/routes/runs.js +379 -0
  54. package/dist/server/routes/runs.js.map +1 -0
  55. package/dist/server/routes/scenarios.d.ts +5 -0
  56. package/dist/server/routes/scenarios.d.ts.map +1 -0
  57. package/dist/server/routes/scenarios.js +209 -0
  58. package/dist/server/routes/scenarios.js.map +1 -0
  59. package/dist/server/routes/setups.d.ts +5 -0
  60. package/dist/server/routes/setups.d.ts.map +1 -0
  61. package/dist/server/routes/setups.js +194 -0
  62. package/dist/server/routes/setups.js.map +1 -0
  63. package/dist/server/services/agent-mapper.d.ts +12 -0
  64. package/dist/server/services/agent-mapper.d.ts.map +1 -0
  65. package/dist/server/services/agent-mapper.js +75 -0
  66. package/dist/server/services/agent-mapper.js.map +1 -0
  67. package/dist/server/services/env-builder.d.ts +10 -0
  68. package/dist/server/services/env-builder.d.ts.map +1 -0
  69. package/dist/server/services/env-builder.js +50 -0
  70. package/dist/server/services/env-builder.js.map +1 -0
  71. package/dist/server/services/eval-helpers.d.ts +22 -0
  72. package/dist/server/services/eval-helpers.d.ts.map +1 -0
  73. package/dist/server/services/eval-helpers.js +75 -0
  74. package/dist/server/services/eval-helpers.js.map +1 -0
  75. package/dist/server/services/eval-parsers-debate-impl.d.ts +11 -0
  76. package/dist/server/services/eval-parsers-debate-impl.d.ts.map +1 -0
  77. package/dist/server/services/eval-parsers-debate-impl.js +133 -0
  78. package/dist/server/services/eval-parsers-debate-impl.js.map +1 -0
  79. package/dist/server/services/eval-parsers.d.ts +24 -0
  80. package/dist/server/services/eval-parsers.d.ts.map +1 -0
  81. package/dist/server/services/eval-parsers.js +153 -0
  82. package/dist/server/services/eval-parsers.js.map +1 -0
  83. package/dist/server/services/eval-prompts.d.ts +9 -0
  84. package/dist/server/services/eval-prompts.d.ts.map +1 -0
  85. package/dist/server/services/eval-prompts.js +170 -0
  86. package/dist/server/services/eval-prompts.js.map +1 -0
  87. package/dist/server/services/evaluator.d.ts +10 -0
  88. package/dist/server/services/evaluator.d.ts.map +1 -0
  89. package/dist/server/services/evaluator.js +156 -0
  90. package/dist/server/services/evaluator.js.map +1 -0
  91. package/dist/server/services/fs-adapter.d.ts +20 -0
  92. package/dist/server/services/fs-adapter.d.ts.map +1 -0
  93. package/dist/server/services/fs-adapter.js +13 -0
  94. package/dist/server/services/fs-adapter.js.map +1 -0
  95. package/dist/server/services/instruction-parser.d.ts +26 -0
  96. package/dist/server/services/instruction-parser.d.ts.map +1 -0
  97. package/dist/server/services/instruction-parser.js +121 -0
  98. package/dist/server/services/instruction-parser.js.map +1 -0
  99. package/dist/server/services/log-rotator.d.ts +20 -0
  100. package/dist/server/services/log-rotator.d.ts.map +1 -0
  101. package/dist/server/services/log-rotator.js +60 -0
  102. package/dist/server/services/log-rotator.js.map +1 -0
  103. package/dist/server/services/logger.d.ts +15 -0
  104. package/dist/server/services/logger.d.ts.map +1 -0
  105. package/dist/server/services/logger.js +69 -0
  106. package/dist/server/services/logger.js.map +1 -0
  107. package/dist/server/services/runner.d.ts +12 -0
  108. package/dist/server/services/runner.d.ts.map +1 -0
  109. package/dist/server/services/runner.js +161 -0
  110. package/dist/server/services/runner.js.map +1 -0
  111. package/dist/server/services/seeder.d.ts +5 -0
  112. package/dist/server/services/seeder.d.ts.map +1 -0
  113. package/dist/server/services/seeder.js +79 -0
  114. package/dist/server/services/seeder.js.map +1 -0
  115. package/dist/server/services/storage-test-helpers.d.ts +21 -0
  116. package/dist/server/services/storage-test-helpers.d.ts.map +1 -0
  117. package/dist/server/services/storage-test-helpers.js +158 -0
  118. package/dist/server/services/storage-test-helpers.js.map +1 -0
  119. package/dist/server/services/storage.d.ts +35 -0
  120. package/dist/server/services/storage.d.ts.map +1 -0
  121. package/dist/server/services/storage.js +219 -0
  122. package/dist/server/services/storage.js.map +1 -0
  123. package/dist/server/services/transcript-formatter.d.ts +18 -0
  124. package/dist/server/services/transcript-formatter.d.ts.map +1 -0
  125. package/dist/server/services/transcript-formatter.js +156 -0
  126. package/dist/server/services/transcript-formatter.js.map +1 -0
  127. package/dist/server/services/workspace.d.ts +11 -0
  128. package/dist/server/services/workspace.d.ts.map +1 -0
  129. package/dist/server/services/workspace.js +113 -0
  130. package/dist/server/services/workspace.js.map +1 -0
  131. package/dist/server/types/evaluation.d.ts +108 -0
  132. package/dist/server/types/evaluation.d.ts.map +1 -0
  133. package/dist/server/types/evaluation.js +5 -0
  134. package/dist/server/types/evaluation.js.map +1 -0
  135. package/dist/server/types/index.d.ts +5 -0
  136. package/dist/server/types/index.d.ts.map +1 -0
  137. package/dist/server/types/index.js +5 -0
  138. package/dist/server/types/index.js.map +1 -0
  139. package/dist/server/types/provider.d.ts +99 -0
  140. package/dist/server/types/provider.d.ts.map +1 -0
  141. package/dist/server/types/provider.js +5 -0
  142. package/dist/server/types/provider.js.map +1 -0
  143. package/dist/server/types/run.d.ts +31 -0
  144. package/dist/server/types/run.d.ts.map +1 -0
  145. package/dist/server/types/run.js +5 -0
  146. package/dist/server/types/run.js.map +1 -0
  147. package/dist/server/types/scenario.d.ts +32 -0
  148. package/dist/server/types/scenario.d.ts.map +1 -0
  149. package/dist/server/types/scenario.js +5 -0
  150. package/dist/server/types/scenario.js.map +1 -0
  151. package/dist/server/types/setup.d.ts +99 -0
  152. package/dist/server/types/setup.d.ts.map +1 -0
  153. package/dist/server/types/setup.js +5 -0
  154. package/dist/server/types/setup.js.map +1 -0
  155. package/dist/src/server/index.d.ts +13 -0
  156. package/dist/src/server/index.d.ts.map +1 -0
  157. package/dist/src/server/index.js +72 -0
  158. package/dist/src/server/index.js.map +1 -0
  159. package/dist/src/server/interfaces/evaluator.d.ts +15 -0
  160. package/dist/src/server/interfaces/evaluator.d.ts.map +1 -0
  161. package/dist/src/server/interfaces/evaluator.js +2 -0
  162. package/dist/src/server/interfaces/evaluator.js.map +1 -0
  163. package/dist/src/server/interfaces/logger.d.ts +9 -0
  164. package/dist/src/server/interfaces/logger.d.ts.map +1 -0
  165. package/dist/src/server/interfaces/logger.js +2 -0
  166. package/dist/src/server/interfaces/logger.js.map +1 -0
  167. package/dist/src/server/interfaces/runner.d.ts +9 -0
  168. package/dist/src/server/interfaces/runner.d.ts.map +1 -0
  169. package/dist/src/server/interfaces/runner.js +2 -0
  170. package/dist/src/server/interfaces/runner.js.map +1 -0
  171. package/dist/src/server/interfaces/storage.d.ts +36 -0
  172. package/dist/src/server/interfaces/storage.d.ts.map +1 -0
  173. package/dist/src/server/interfaces/storage.js +2 -0
  174. package/dist/src/server/interfaces/storage.js.map +1 -0
  175. package/dist/src/server/interfaces/workspace.d.ts +9 -0
  176. package/dist/src/server/interfaces/workspace.d.ts.map +1 -0
  177. package/dist/src/server/interfaces/workspace.js +2 -0
  178. package/dist/src/server/interfaces/workspace.js.map +1 -0
  179. package/dist/src/server/routes/eval-queue.d.ts +23 -0
  180. package/dist/src/server/routes/eval-queue.d.ts.map +1 -0
  181. package/dist/src/server/routes/eval-queue.js +45 -0
  182. package/dist/src/server/routes/eval-queue.js.map +1 -0
  183. package/dist/src/server/routes/evaluations.d.ts +8 -0
  184. package/dist/src/server/routes/evaluations.d.ts.map +1 -0
  185. package/dist/src/server/routes/evaluations.js +217 -0
  186. package/dist/src/server/routes/evaluations.js.map +1 -0
  187. package/dist/src/server/routes/providers.d.ts +5 -0
  188. package/dist/src/server/routes/providers.d.ts.map +1 -0
  189. package/dist/src/server/routes/providers.js +194 -0
  190. package/dist/src/server/routes/providers.js.map +1 -0
  191. package/dist/src/server/routes/run-queue.d.ts +17 -0
  192. package/dist/src/server/routes/run-queue.d.ts.map +1 -0
  193. package/dist/src/server/routes/run-queue.js +34 -0
  194. package/dist/src/server/routes/run-queue.js.map +1 -0
  195. package/dist/src/server/routes/run-sse.d.ts +18 -0
  196. package/dist/src/server/routes/run-sse.d.ts.map +1 -0
  197. package/dist/src/server/routes/run-sse.js +57 -0
  198. package/dist/src/server/routes/run-sse.js.map +1 -0
  199. package/dist/src/server/routes/runs.d.ts +9 -0
  200. package/dist/src/server/routes/runs.d.ts.map +1 -0
  201. package/dist/src/server/routes/runs.js +379 -0
  202. package/dist/src/server/routes/runs.js.map +1 -0
  203. package/dist/src/server/routes/scenarios.d.ts +5 -0
  204. package/dist/src/server/routes/scenarios.d.ts.map +1 -0
  205. package/dist/src/server/routes/scenarios.js +209 -0
  206. package/dist/src/server/routes/scenarios.js.map +1 -0
  207. package/dist/src/server/routes/setups.d.ts +5 -0
  208. package/dist/src/server/routes/setups.d.ts.map +1 -0
  209. package/dist/src/server/routes/setups.js +194 -0
  210. package/dist/src/server/routes/setups.js.map +1 -0
  211. package/dist/src/server/services/agent-mapper.d.ts +12 -0
  212. package/dist/src/server/services/agent-mapper.d.ts.map +1 -0
  213. package/dist/src/server/services/agent-mapper.js +75 -0
  214. package/dist/src/server/services/agent-mapper.js.map +1 -0
  215. package/dist/src/server/services/env-builder.d.ts +10 -0
  216. package/dist/src/server/services/env-builder.d.ts.map +1 -0
  217. package/dist/src/server/services/env-builder.js +50 -0
  218. package/dist/src/server/services/env-builder.js.map +1 -0
  219. package/dist/src/server/services/eval-helpers.d.ts +22 -0
  220. package/dist/src/server/services/eval-helpers.d.ts.map +1 -0
  221. package/dist/src/server/services/eval-helpers.js +75 -0
  222. package/dist/src/server/services/eval-helpers.js.map +1 -0
  223. package/dist/src/server/services/eval-parsers-debate-impl.d.ts +11 -0
  224. package/dist/src/server/services/eval-parsers-debate-impl.d.ts.map +1 -0
  225. package/dist/src/server/services/eval-parsers-debate-impl.js +133 -0
  226. package/dist/src/server/services/eval-parsers-debate-impl.js.map +1 -0
  227. package/dist/src/server/services/eval-parsers.d.ts +24 -0
  228. package/dist/src/server/services/eval-parsers.d.ts.map +1 -0
  229. package/dist/src/server/services/eval-parsers.js +153 -0
  230. package/dist/src/server/services/eval-parsers.js.map +1 -0
  231. package/dist/src/server/services/eval-prompts.d.ts +9 -0
  232. package/dist/src/server/services/eval-prompts.d.ts.map +1 -0
  233. package/dist/src/server/services/eval-prompts.js +170 -0
  234. package/dist/src/server/services/eval-prompts.js.map +1 -0
  235. package/dist/src/server/services/evaluator.d.ts +10 -0
  236. package/dist/src/server/services/evaluator.d.ts.map +1 -0
  237. package/dist/src/server/services/evaluator.js +156 -0
  238. package/dist/src/server/services/evaluator.js.map +1 -0
  239. package/dist/src/server/services/fs-adapter.d.ts +20 -0
  240. package/dist/src/server/services/fs-adapter.d.ts.map +1 -0
  241. package/dist/src/server/services/fs-adapter.js +13 -0
  242. package/dist/src/server/services/fs-adapter.js.map +1 -0
  243. package/dist/src/server/services/instruction-parser.d.ts +26 -0
  244. package/dist/src/server/services/instruction-parser.d.ts.map +1 -0
  245. package/dist/src/server/services/instruction-parser.js +121 -0
  246. package/dist/src/server/services/instruction-parser.js.map +1 -0
  247. package/dist/src/server/services/log-rotator.d.ts +20 -0
  248. package/dist/src/server/services/log-rotator.d.ts.map +1 -0
  249. package/dist/src/server/services/log-rotator.js +60 -0
  250. package/dist/src/server/services/log-rotator.js.map +1 -0
  251. package/dist/src/server/services/logger.d.ts +15 -0
  252. package/dist/src/server/services/logger.d.ts.map +1 -0
  253. package/dist/src/server/services/logger.js +69 -0
  254. package/dist/src/server/services/logger.js.map +1 -0
  255. package/dist/src/server/services/runner.d.ts +12 -0
  256. package/dist/src/server/services/runner.d.ts.map +1 -0
  257. package/dist/src/server/services/runner.js +161 -0
  258. package/dist/src/server/services/runner.js.map +1 -0
  259. package/dist/src/server/services/seeder.d.ts +5 -0
  260. package/dist/src/server/services/seeder.d.ts.map +1 -0
  261. package/dist/src/server/services/seeder.js +79 -0
  262. package/dist/src/server/services/seeder.js.map +1 -0
  263. package/dist/src/server/services/storage.d.ts +35 -0
  264. package/dist/src/server/services/storage.d.ts.map +1 -0
  265. package/dist/src/server/services/storage.js +219 -0
  266. package/dist/src/server/services/storage.js.map +1 -0
  267. package/dist/src/server/services/transcript-formatter.d.ts +18 -0
  268. package/dist/src/server/services/transcript-formatter.d.ts.map +1 -0
  269. package/dist/src/server/services/transcript-formatter.js +156 -0
  270. package/dist/src/server/services/transcript-formatter.js.map +1 -0
  271. package/dist/src/server/services/workspace.d.ts +11 -0
  272. package/dist/src/server/services/workspace.d.ts.map +1 -0
  273. package/dist/src/server/services/workspace.js +113 -0
  274. package/dist/src/server/services/workspace.js.map +1 -0
  275. package/dist/src/server/types/evaluation.d.ts +108 -0
  276. package/dist/src/server/types/evaluation.d.ts.map +1 -0
  277. package/dist/src/server/types/evaluation.js +5 -0
  278. package/dist/src/server/types/evaluation.js.map +1 -0
  279. package/dist/src/server/types/index.d.ts +5 -0
  280. package/dist/src/server/types/index.d.ts.map +1 -0
  281. package/dist/src/server/types/index.js +5 -0
  282. package/dist/src/server/types/index.js.map +1 -0
  283. package/dist/src/server/types/provider.d.ts +99 -0
  284. package/dist/src/server/types/provider.d.ts.map +1 -0
  285. package/dist/src/server/types/provider.js +5 -0
  286. package/dist/src/server/types/provider.js.map +1 -0
  287. package/dist/src/server/types/run.d.ts +31 -0
  288. package/dist/src/server/types/run.d.ts.map +1 -0
  289. package/dist/src/server/types/run.js +5 -0
  290. package/dist/src/server/types/run.js.map +1 -0
  291. package/dist/src/server/types/scenario.d.ts +32 -0
  292. package/dist/src/server/types/scenario.d.ts.map +1 -0
  293. package/dist/src/server/types/scenario.js +5 -0
  294. package/dist/src/server/types/scenario.js.map +1 -0
  295. package/dist/src/server/types/setup.d.ts +99 -0
  296. package/dist/src/server/types/setup.d.ts.map +1 -0
  297. package/dist/src/server/types/setup.js +5 -0
  298. package/dist/src/server/types/setup.js.map +1 -0
  299. package/dist/web/assets/index-C4dw8OpW.css +1 -0
  300. package/dist/web/assets/index-wve8IczO.js +76 -0
  301. package/dist/web/index.html +15 -0
  302. package/docs/schemas/provider-api.example.json +16 -0
  303. package/docs/schemas/provider-oauth.example.json +15 -0
  304. package/docs/schemas/provider.example.json +16 -0
  305. package/docs/schemas/scenario-baseline.example.json +35 -0
  306. package/docs/schemas/scenario-carwash-baseline.example.json +33 -0
  307. package/docs/schemas/scenario-carwash-with-claude-md.example.json +40 -0
  308. package/docs/schemas/scenario-golden-rules-baseline.example.json +51 -0
  309. package/docs/schemas/scenario-golden-rules-with-claude-md.example.json +61 -0
  310. package/docs/schemas/scenario-negative-analysis-baseline.example.json +34 -0
  311. package/docs/schemas/scenario-negative-analysis-with-claude-md.example.json +41 -0
  312. package/docs/schemas/scenario-with-claude-md.example.json +41 -0
  313. package/docs/schemas/scenario.example.json +33 -0
  314. package/package.json +92 -0
@@ -0,0 +1,194 @@
1
+ import { Router } from 'express';
2
+ import { v4 as uuidv4 } from 'uuid';
3
+ // ─── Helpers ───────────────────────────────────────────────────────────
4
+ function paramId(req) {
5
+ const raw = req.params.id;
6
+ return Array.isArray(raw) ? raw[0] : raw;
7
+ }
8
+ function maskSecret(value) {
9
+ if (value.length <= 4)
10
+ return '****';
11
+ return '****' + value.slice(-4);
12
+ }
13
+ function maskSetup(setup) {
14
+ const provider = { ...setup.provider };
15
+ if (provider.kind === 'api') {
16
+ return {
17
+ ...setup,
18
+ provider: { ...provider, apiKey: maskSecret(provider.apiKey) },
19
+ };
20
+ }
21
+ // oauth
22
+ return {
23
+ ...setup,
24
+ provider: { ...provider, oauthToken: maskSecret(provider.oauthToken) },
25
+ };
26
+ }
27
+ function maskSetupMetadata(setup) {
28
+ return {
29
+ id: setup.id,
30
+ name: setup.name,
31
+ providerType: setup.provider.kind,
32
+ model: setup.provider.model,
33
+ createdAt: setup.createdAt,
34
+ };
35
+ }
36
+ function validateProviderConfig(provider) {
37
+ const errors = [];
38
+ if (typeof provider !== 'object' || provider === null) {
39
+ errors.push({ field: 'provider', message: 'provider is required and must be an object' });
40
+ return errors;
41
+ }
42
+ const p = provider;
43
+ if (p.kind !== 'api' && p.kind !== 'oauth') {
44
+ errors.push({ field: 'provider.kind', message: "provider.kind must be 'api' or 'oauth'" });
45
+ return errors;
46
+ }
47
+ if (typeof p.model !== 'string' || p.model.length === 0) {
48
+ errors.push({ field: 'provider.model', message: 'provider.model is required' });
49
+ }
50
+ if (p.kind === 'api') {
51
+ if (typeof p.apiKey !== 'string' || p.apiKey.length === 0) {
52
+ errors.push({ field: 'provider.apiKey', message: 'provider.apiKey is required for api provider' });
53
+ }
54
+ if (typeof p.baseUrl !== 'string' || p.baseUrl.length === 0) {
55
+ errors.push({ field: 'provider.baseUrl', message: 'provider.baseUrl is required for api provider' });
56
+ }
57
+ }
58
+ if (p.kind === 'oauth') {
59
+ if (typeof p.oauthToken !== 'string' || p.oauthToken.length === 0) {
60
+ errors.push({ field: 'provider.oauthToken', message: 'provider.oauthToken is required for oauth provider' });
61
+ }
62
+ }
63
+ return errors;
64
+ }
65
+ function validateSetupBody(body) {
66
+ const errors = [];
67
+ if (typeof body !== 'object' || body === null) {
68
+ errors.push({ field: 'body', message: 'Request body must be a JSON object' });
69
+ return errors;
70
+ }
71
+ const b = body;
72
+ if (typeof b.name !== 'string' || b.name.trim().length === 0) {
73
+ errors.push({ field: 'name', message: 'name is required' });
74
+ }
75
+ errors.push(...validateProviderConfig(b.provider));
76
+ if (b.timeoutSeconds !== undefined) {
77
+ if (typeof b.timeoutSeconds !== 'number' || b.timeoutSeconds <= 0) {
78
+ errors.push({ field: 'timeoutSeconds', message: 'timeoutSeconds must be a positive number' });
79
+ }
80
+ }
81
+ return errors;
82
+ }
83
+ // ─── Router factory ────────────────────────────────────────────────────
84
+ export function createSetupRoutes(storage, logger) {
85
+ const router = Router();
86
+ // GET / — list all setups (metadata only)
87
+ router.get('/', async (_req, res) => {
88
+ try {
89
+ const setups = await storage.listSetups();
90
+ res.json(setups.map(maskSetupMetadata));
91
+ }
92
+ catch (err) {
93
+ logger.error('Failed to list setups', { error: String(err) });
94
+ res.status(500).json({ error: 'Failed to list setups' });
95
+ }
96
+ });
97
+ // GET /:id — get full setup (with masked secrets)
98
+ router.get('/:id', async (req, res) => {
99
+ try {
100
+ const id = paramId(req);
101
+ const setup = await storage.getSetup(id);
102
+ if (!setup) {
103
+ res.status(404).json({ error: 'Setup not found' });
104
+ return;
105
+ }
106
+ res.json(maskSetup(setup));
107
+ }
108
+ catch (err) {
109
+ logger.error('Failed to get setup', { id: paramId(req), error: String(err) });
110
+ res.status(500).json({ error: 'Failed to get setup' });
111
+ }
112
+ });
113
+ // POST / — create setup
114
+ router.post('/', async (req, res) => {
115
+ const errors = validateSetupBody(req.body);
116
+ if (errors.length > 0) {
117
+ res.status(400).json({ errors });
118
+ return;
119
+ }
120
+ try {
121
+ const body = req.body;
122
+ const now = new Date().toISOString();
123
+ const setup = {
124
+ id: uuidv4(),
125
+ name: body.name.trim(),
126
+ description: body.description ?? '',
127
+ provider: body.provider,
128
+ thinking: body.thinking,
129
+ effort: body.effort,
130
+ timeoutSeconds: typeof body.timeoutSeconds === 'number' ? body.timeoutSeconds : 300,
131
+ createdAt: now,
132
+ updatedAt: now,
133
+ };
134
+ await storage.saveSetup(setup);
135
+ res.status(201).json(maskSetup(setup));
136
+ }
137
+ catch (err) {
138
+ logger.error('Failed to create setup', { error: String(err) });
139
+ res.status(500).json({ error: 'Failed to create setup' });
140
+ }
141
+ });
142
+ // PUT /:id — update setup
143
+ router.put('/:id', async (req, res) => {
144
+ try {
145
+ const id = paramId(req);
146
+ const existing = await storage.getSetup(id);
147
+ if (!existing) {
148
+ res.status(404).json({ error: 'Setup not found' });
149
+ return;
150
+ }
151
+ const errors = validateSetupBody(req.body);
152
+ if (errors.length > 0) {
153
+ res.status(400).json({ errors });
154
+ return;
155
+ }
156
+ const body = req.body;
157
+ const updated = {
158
+ id: existing.id,
159
+ createdAt: existing.createdAt,
160
+ name: body.name.trim(),
161
+ description: body.description ?? '',
162
+ provider: body.provider,
163
+ thinking: body.thinking,
164
+ effort: body.effort,
165
+ timeoutSeconds: typeof body.timeoutSeconds === 'number' ? body.timeoutSeconds : 300,
166
+ updatedAt: new Date().toISOString(),
167
+ };
168
+ await storage.saveSetup(updated);
169
+ res.json(maskSetup(updated));
170
+ }
171
+ catch (err) {
172
+ logger.error('Failed to update setup', { id: paramId(req), error: String(err) });
173
+ res.status(500).json({ error: 'Failed to update setup' });
174
+ }
175
+ });
176
+ // DELETE /:id — delete setup
177
+ router.delete('/:id', async (req, res) => {
178
+ try {
179
+ const id = paramId(req);
180
+ const deleted = await storage.deleteSetup(id);
181
+ if (!deleted) {
182
+ res.status(404).json({ error: 'Setup not found' });
183
+ return;
184
+ }
185
+ res.status(204).send();
186
+ }
187
+ catch (err) {
188
+ logger.error('Failed to delete setup', { id: paramId(req), error: String(err) });
189
+ res.status(500).json({ error: 'Failed to delete setup' });
190
+ }
191
+ });
192
+ return router;
193
+ }
194
+ //# sourceMappingURL=setups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setups.js","sourceRoot":"","sources":["../../../src/server/routes/setups.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { AgentDefinition, McpServerConfig as SDKMcpServerConfig } from '@anthropic-ai/claude-agent-sdk';
2
+ import type { SubagentEntry, McpServerEntry } from '../types/index.js';
3
+ /**
4
+ * Convert our SubagentEntry[] into the SDK's Record<string, AgentDefinition>.
5
+ * If `loadFromFile` is set, the prompt is read from that path at build time.
6
+ */
7
+ export declare function buildAgentsMap(subagents: readonly SubagentEntry[]): Promise<Record<string, AgentDefinition>>;
8
+ /**
9
+ * Convert our McpServerEntry[] into the SDK's Record<string, McpServerConfig>.
10
+ */
11
+ export declare function buildMcpMap(servers: readonly McpServerEntry[]): Record<string, SDKMcpServerConfig>;
12
+ //# sourceMappingURL=agent-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-mapper.d.ts","sourceRoot":"","sources":["../../../src/server/services/agent-mapper.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,IAAI,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAC7G,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEvE;;;GAGG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,SAAS,aAAa,EAAE,GAClC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CA0C1C;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,SAAS,cAAc,EAAE,GACjC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CA+BpC"}
@@ -0,0 +1,75 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Map scenario types to SDK option types for agents and MCP servers
3
+ // ---------------------------------------------------------------------------
4
+ import fs from 'node:fs/promises';
5
+ /**
6
+ * Convert our SubagentEntry[] into the SDK's Record<string, AgentDefinition>.
7
+ * If `loadFromFile` is set, the prompt is read from that path at build time.
8
+ */
9
+ export async function buildAgentsMap(subagents) {
10
+ const result = {};
11
+ for (const sa of subagents) {
12
+ let prompt = sa.prompt;
13
+ if (sa.loadFromFile) {
14
+ prompt = await fs.readFile(sa.loadFromFile, 'utf-8');
15
+ }
16
+ const def = {
17
+ description: sa.description,
18
+ prompt,
19
+ };
20
+ if (sa.tools && sa.tools.length > 0) {
21
+ def.tools = [...sa.tools];
22
+ }
23
+ if (sa.disallowedTools && sa.disallowedTools.length > 0) {
24
+ def.disallowedTools = [...sa.disallowedTools];
25
+ }
26
+ if (sa.model) {
27
+ def.model = sa.model;
28
+ }
29
+ if (sa.mcpServers && sa.mcpServers.length > 0) {
30
+ def.mcpServers = [...sa.mcpServers];
31
+ }
32
+ if (sa.skills && sa.skills.length > 0) {
33
+ def.skills = [...sa.skills];
34
+ }
35
+ if (sa.maxTurns !== undefined) {
36
+ def.maxTurns = sa.maxTurns;
37
+ }
38
+ result[sa.name] = def;
39
+ }
40
+ return result;
41
+ }
42
+ /**
43
+ * Convert our McpServerEntry[] into the SDK's Record<string, McpServerConfig>.
44
+ */
45
+ export function buildMcpMap(servers) {
46
+ const result = {};
47
+ for (const entry of servers) {
48
+ const cfg = entry.config;
49
+ switch (cfg.transport) {
50
+ case 'stdio':
51
+ result[entry.name] = {
52
+ command: cfg.command,
53
+ args: cfg.args ? [...cfg.args] : undefined,
54
+ env: cfg.env ? { ...cfg.env } : undefined,
55
+ };
56
+ break;
57
+ case 'http':
58
+ result[entry.name] = {
59
+ type: 'http',
60
+ url: cfg.url,
61
+ headers: cfg.headers ? { ...cfg.headers } : undefined,
62
+ };
63
+ break;
64
+ case 'sse':
65
+ result[entry.name] = {
66
+ type: 'sse',
67
+ url: cfg.url,
68
+ headers: cfg.headers ? { ...cfg.headers } : undefined,
69
+ };
70
+ break;
71
+ }
72
+ }
73
+ return result;
74
+ }
75
+ //# sourceMappingURL=agent-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-mapper.js","sourceRoot":"","sources":["../../../src/server/services/agent-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ProviderConfig } from '../types/index.js';
2
+ /**
3
+ * Build a clean environment for an SDK run.
4
+ *
5
+ * - Copies only allow-listed variables from `process.env`
6
+ * - Injects authentication variables based on provider kind
7
+ * - Sets ANTHROPIC_DEFAULT_*_MODEL to the configured model
8
+ */
9
+ export declare function buildRunEnv(provider: ProviderConfig): Record<string, string>;
10
+ //# sourceMappingURL=env-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-builder.d.ts","sourceRoot":"","sources":["../../../src/server/services/env-builder.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAmBxD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyB5E"}
@@ -0,0 +1,50 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Environment variable construction for SDK runs
3
+ // ---------------------------------------------------------------------------
4
+ /**
5
+ * Environment variables safe to inherit from the host process.
6
+ * Kept minimal to avoid leaking secrets.
7
+ */
8
+ const ENV_ALLOWLIST = [
9
+ 'HOME',
10
+ 'PATH',
11
+ 'SHELL',
12
+ 'TERM',
13
+ 'LANG',
14
+ 'LC_ALL',
15
+ 'NODE_ENV',
16
+ 'TMPDIR',
17
+ 'XDG_CONFIG_HOME',
18
+ 'XDG_DATA_HOME',
19
+ ];
20
+ /**
21
+ * Build a clean environment for an SDK run.
22
+ *
23
+ * - Copies only allow-listed variables from `process.env`
24
+ * - Injects authentication variables based on provider kind
25
+ * - Sets ANTHROPIC_DEFAULT_*_MODEL to the configured model
26
+ */
27
+ export function buildRunEnv(provider) {
28
+ const env = {};
29
+ // Copy safe host variables
30
+ for (const key of ENV_ALLOWLIST) {
31
+ const value = process.env[key];
32
+ if (value !== undefined) {
33
+ env[key] = value;
34
+ }
35
+ }
36
+ // Provider-specific auth
37
+ if (provider.kind === 'api') {
38
+ env['ANTHROPIC_API_KEY'] = provider.apiKey;
39
+ env['ANTHROPIC_BASE_URL'] = provider.baseUrl;
40
+ }
41
+ else {
42
+ env['CLAUDE_CODE_OAUTH_TOKEN'] = provider.oauthToken;
43
+ }
44
+ // Set all default model slots to the configured model
45
+ env['ANTHROPIC_DEFAULT_MODEL'] = provider.model;
46
+ env['ANTHROPIC_DEFAULT_FAST_MODEL'] = provider.model;
47
+ env['ANTHROPIC_DEFAULT_SLOW_MODEL'] = provider.model;
48
+ return env;
49
+ }
50
+ //# sourceMappingURL=env-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-builder.js","sourceRoot":"","sources":["../../../src/server/services/env-builder.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,iDAAiD;AACjD,8EAA8E;AAI9E;;;GAGG;AACH,MAAM,aAAa,GAAsB;IACvC,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,iBAAiB;IACjB,eAAe;CACP,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,QAAwB;IAClD,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,2BAA2B;IAC3B,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC5B,GAAG,CAAC,mBAAmB,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC3C,GAAG,CAAC,oBAAoB,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,yBAAyB,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC;IACvD,CAAC;IAED,sDAAsD;IACtD,GAAG,CAAC,yBAAyB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IAChD,GAAG,CAAC,8BAA8B,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACrD,GAAG,CAAC,8BAA8B,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IAErD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Scenario, AnswerComparison, CriticalPartResult, InstructionCompliance } from '../types/index.js';
2
+ import type { ScoreParseResult, ComplianceParseResult } from './eval-parsers.js';
3
+ /** Shared state accumulated per evaluator across rounds. */
4
+ export interface EvaluatorAccumulator {
5
+ role: string;
6
+ costUsd: number;
7
+ tokensIn: number;
8
+ tokensOut: number;
9
+ rounds: number;
10
+ scoreResult: Partial<ScoreParseResult>;
11
+ complianceResult: Partial<ComplianceParseResult>;
12
+ assessmentText: string;
13
+ }
14
+ /** Check whether evaluator scores have converged (within 1 point per dimension). */
15
+ export declare function checkConsensus(accumulators: readonly EvaluatorAccumulator[]): boolean;
16
+ /** Aggregate answer closeness from all evaluators into a comparison. */
17
+ export declare function buildAnswerComparison(accumulators: readonly EvaluatorAccumulator[]): AnswerComparison;
18
+ /** Build critical requirement results by checking evaluator-flagged misses. */
19
+ export declare function buildCriticalResults(accumulators: readonly EvaluatorAccumulator[], scenario: Scenario): CriticalPartResult[];
20
+ /** Merge compliance results from all evaluators into a single report. */
21
+ export declare function mergeCompliance(accumulators: readonly EvaluatorAccumulator[]): InstructionCompliance;
22
+ //# sourceMappingURL=eval-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-helpers.d.ts","sourceRoot":"","sources":["../../../src/server/services/eval-helpers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAEjF,4DAA4D;AAC5D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvC,gBAAgB,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,YAAY,EAAE,SAAS,oBAAoB,EAAE,GAAG,OAAO,CAerF;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,SAAS,oBAAoB,EAAE,GAC5C,gBAAgB,CAgBlB;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,SAAS,oBAAoB,EAAE,EAC7C,QAAQ,EAAE,QAAQ,GACjB,kBAAkB,EAAE,CAStB;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAC7B,YAAY,EAAE,SAAS,oBAAoB,EAAE,GAC5C,qBAAqB,CAwBvB"}
@@ -0,0 +1,75 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Evaluation Helpers — result aggregation extracted from the orchestrator
3
+ // ---------------------------------------------------------------------------
4
+ import { toInstructionCompliance } from './eval-parsers.js';
5
+ /** Check whether evaluator scores have converged (within 1 point per dimension). */
6
+ export function checkConsensus(accumulators) {
7
+ if (accumulators.length < 2)
8
+ return true;
9
+ // Require ALL evaluators to have parsed scores before declaring consensus.
10
+ // If any evaluator's score result is missing, consensus is false.
11
+ const allScores = accumulators.map((a) => a.scoreResult.scores ?? {});
12
+ if (allScores.some((s) => Object.keys(s).length === 0))
13
+ return false;
14
+ const dimensions = new Set(allScores.flatMap((s) => Object.keys(s)));
15
+ for (const dim of dimensions) {
16
+ const vals = allScores.map((s) => s[dim]).filter((v) => v !== undefined);
17
+ if (vals.length < 2)
18
+ continue;
19
+ const range = Math.max(...vals) - Math.min(...vals);
20
+ if (range > 1)
21
+ return false;
22
+ }
23
+ return true;
24
+ }
25
+ /** Aggregate answer closeness from all evaluators into a comparison. */
26
+ export function buildAnswerComparison(accumulators) {
27
+ const closenessValues = accumulators
28
+ .map((a) => a.scoreResult.overallCloseness)
29
+ .filter((v) => v !== undefined && v > 0);
30
+ const avgCloseness = closenessValues.length > 0
31
+ ? closenessValues.reduce((a, b) => a + b, 0) / closenessValues.length
32
+ : 0;
33
+ const summaries = accumulators
34
+ .map((a) => a.scoreResult.summary)
35
+ .filter((s) => !!s);
36
+ return {
37
+ matches: avgCloseness >= 0.7,
38
+ explanation: summaries[0] ?? 'No explanation available',
39
+ similarity: avgCloseness,
40
+ };
41
+ }
42
+ /** Build critical requirement results by checking evaluator-flagged misses. */
43
+ export function buildCriticalResults(accumulators, scenario) {
44
+ const allMissed = new Set(accumulators.flatMap((a) => a.scoreResult.missedCritical ?? []));
45
+ return scenario.criticalRequirements.map((req) => ({
46
+ requirement: req,
47
+ met: !allMissed.has(req),
48
+ evidence: allMissed.has(req) ? 'Flagged as missed by evaluator' : 'Not flagged',
49
+ }));
50
+ }
51
+ /** Merge compliance results from all evaluators into a single report. */
52
+ export function mergeCompliance(accumulators) {
53
+ const followed = new Set();
54
+ const violated = new Set();
55
+ const notApplicable = new Set();
56
+ let complianceSum = 0;
57
+ let complianceCount = 0;
58
+ for (const acc of accumulators) {
59
+ const c = acc.complianceResult;
60
+ (c.followed ?? []).forEach((s) => followed.add(s));
61
+ (c.violated ?? []).forEach((s) => violated.add(s));
62
+ (c.notApplicable ?? []).forEach((s) => notApplicable.add(s));
63
+ if (c.overallCompliance !== undefined) {
64
+ complianceSum += c.overallCompliance;
65
+ complianceCount++;
66
+ }
67
+ }
68
+ return toInstructionCompliance({
69
+ followed: [...followed],
70
+ violated: [...violated],
71
+ notApplicable: [...notApplicable],
72
+ overallCompliance: complianceCount > 0 ? complianceSum / complianceCount : 0,
73
+ });
74
+ }
75
+ //# sourceMappingURL=eval-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-helpers.js","sourceRoot":"","sources":["../../../src/server/services/eval-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { EvaluationSynthesis } from '../types/evaluation.js';
2
+ export type Verdict = 'AGREE' | 'DISAGREE' | 'PARTIAL';
3
+ export interface DebateParseResult {
4
+ readonly verdict: Verdict;
5
+ readonly updatedScores: Readonly<Record<string, number>>;
6
+ readonly critiques: readonly string[];
7
+ readonly reasoning: string;
8
+ }
9
+ export declare function parseSynthesisResponse(response: string): Partial<EvaluationSynthesis>;
10
+ export declare function parseDebateResponse(response: string): Partial<DebateParseResult>;
11
+ //# sourceMappingURL=eval-parsers-debate-impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-parsers-debate-impl.d.ts","sourceRoot":"","sources":["../../../src/server/services/eval-parsers-debate-impl.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAMlE,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAMD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAWrF;AAMD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAahF"}
@@ -0,0 +1,133 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Debate & Synthesis parsers — extracted from eval-parsers.ts
3
+ // ---------------------------------------------------------------------------
4
+ // ---------------------------------------------------------------------------
5
+ // Synthesis response
6
+ // ---------------------------------------------------------------------------
7
+ export function parseSynthesisResponse(response) {
8
+ const parsed = tryParseJson(response);
9
+ if (parsed) {
10
+ return {
11
+ dimensionScores: validScores(parsed.dimensionScores),
12
+ weightedTotal: clampScore(parsed.weightedTotal),
13
+ confidence: clamp01(parsed.confidence),
14
+ dissenting: toStringArray(parsed.dissenting),
15
+ };
16
+ }
17
+ return parseSynthesisFromText(response);
18
+ }
19
+ // ---------------------------------------------------------------------------
20
+ // Debate verdict parsing
21
+ // ---------------------------------------------------------------------------
22
+ export function parseDebateResponse(response) {
23
+ const parsed = tryParseJson(response);
24
+ if (parsed) {
25
+ return {
26
+ verdict: parseVerdict(parsed.verdict),
27
+ updatedScores: validScores(parsed.updatedScores),
28
+ critiques: toStringArray(parsed.critiques),
29
+ reasoning: typeof parsed.reasoning === 'string' ? parsed.reasoning : undefined,
30
+ };
31
+ }
32
+ // Fallback: extract verdict and scores from text patterns
33
+ return parseDebateFromText(response);
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // Internal: Text fallback parsers
37
+ // ---------------------------------------------------------------------------
38
+ function parseDebateFromText(text) {
39
+ // Try to extract verdict from text patterns like "VERDICT: AGREE"
40
+ const verdictMatch = text.match(/VERDICT\s*:\s*(AGREE|DISAGREE|PARTIAL)/i);
41
+ const verdict = verdictMatch ? parseVerdict(verdictMatch[1]) : 'PARTIAL';
42
+ // Try to extract scores using the same pattern as score text fallback
43
+ const scores = {};
44
+ const scorePattern = /(\w[\w\s]*?):\s*(\d+(?:\.\d+)?)\s*(?:\/\s*10)?/g;
45
+ let match;
46
+ while ((match = scorePattern.exec(text)) !== null) {
47
+ const dim = match[1].trim();
48
+ // Skip the VERDICT line we already parsed
49
+ if (/^verdict$/i.test(dim))
50
+ continue;
51
+ const val = parseFloat(match[2]);
52
+ if (!isNaN(val) && val <= 10)
53
+ scores[dim] = val;
54
+ }
55
+ return {
56
+ verdict,
57
+ updatedScores: Object.keys(scores).length > 0 ? scores : undefined,
58
+ };
59
+ }
60
+ function parseSynthesisFromText(text) {
61
+ const scoreMatch = text.match(/weighted\s*(?:total|average|score)\s*:?\s*(\d+(?:\.\d+)?)/i);
62
+ return {
63
+ weightedTotal: scoreMatch ? clampScore(parseFloat(scoreMatch[1])) : undefined,
64
+ };
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Internal: JSON parsing
68
+ // ---------------------------------------------------------------------------
69
+ function tryParseJson(text) {
70
+ try {
71
+ return JSON.parse(text);
72
+ }
73
+ catch {
74
+ // fall through
75
+ }
76
+ const jsonMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/);
77
+ if (jsonMatch) {
78
+ try {
79
+ return JSON.parse(jsonMatch[1]);
80
+ }
81
+ catch {
82
+ // fall through
83
+ }
84
+ }
85
+ const braceMatch = text.match(/\{[\s\S]*\}/);
86
+ if (braceMatch) {
87
+ try {
88
+ return JSON.parse(braceMatch[0]);
89
+ }
90
+ catch {
91
+ // fall through
92
+ }
93
+ }
94
+ return undefined;
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Internal: Utilities
98
+ // ---------------------------------------------------------------------------
99
+ function validScores(scores) {
100
+ if (!scores || typeof scores !== 'object')
101
+ return {};
102
+ const result = {};
103
+ for (const [k, v] of Object.entries(scores)) {
104
+ if (typeof v === 'number' && !isNaN(v))
105
+ result[k] = clampScore(v);
106
+ }
107
+ return result;
108
+ }
109
+ function clamp01(val) {
110
+ if (val === undefined || isNaN(val))
111
+ return 0;
112
+ return Math.max(0, Math.min(1, val));
113
+ }
114
+ function clampScore(val) {
115
+ if (val === undefined || isNaN(val))
116
+ return 0;
117
+ return Math.max(0, Math.min(10, val));
118
+ }
119
+ function toStringArray(arr) {
120
+ if (!Array.isArray(arr))
121
+ return [];
122
+ return arr.filter((x) => typeof x === 'string');
123
+ }
124
+ function parseVerdict(val) {
125
+ if (typeof val === 'string') {
126
+ const upper = val.toUpperCase();
127
+ if (upper === 'AGREE' || upper === 'DISAGREE' || upper === 'PARTIAL') {
128
+ return upper;
129
+ }
130
+ }
131
+ return 'PARTIAL';
132
+ }
133
+ //# sourceMappingURL=eval-parsers-debate-impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-parsers-debate-impl.js","sourceRoot":"","sources":["../../../src/server/services/eval-parsers-debate-impl.ts"],"names":[],"mappings":"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"}