@claude-flow/cli 3.10.4 → 3.10.6

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 (242) hide show
  1. package/dist/src/benchmarks/capability-tasks.d.ts +126 -0
  2. package/dist/src/benchmarks/capability-tasks.d.ts.map +1 -0
  3. package/dist/src/benchmarks/capability-tasks.js +147 -0
  4. package/dist/src/benchmarks/capability-tasks.js.map +1 -0
  5. package/dist/src/benchmarks/gaia-agent-contrastive.d.ts +53 -0
  6. package/dist/src/benchmarks/gaia-agent-contrastive.d.ts.map +1 -0
  7. package/dist/src/benchmarks/gaia-agent-contrastive.js +177 -0
  8. package/dist/src/benchmarks/gaia-agent-contrastive.js.map +1 -0
  9. package/dist/src/benchmarks/gaia-agent-gemini.d.ts +51 -0
  10. package/dist/src/benchmarks/gaia-agent-gemini.d.ts.map +1 -0
  11. package/dist/src/benchmarks/gaia-agent-gemini.js +352 -0
  12. package/dist/src/benchmarks/gaia-agent-gemini.js.map +1 -0
  13. package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts +18 -0
  14. package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts.map +1 -0
  15. package/dist/src/benchmarks/gaia-agent-planning.smoke.js +253 -0
  16. package/dist/src/benchmarks/gaia-agent-planning.smoke.js.map +1 -0
  17. package/dist/src/benchmarks/gaia-agent.d.ts +198 -0
  18. package/dist/src/benchmarks/gaia-agent.d.ts.map +1 -0
  19. package/dist/src/benchmarks/gaia-agent.js +651 -0
  20. package/dist/src/benchmarks/gaia-agent.js.map +1 -0
  21. package/dist/src/benchmarks/gaia-causal-memory.d.ts +133 -0
  22. package/dist/src/benchmarks/gaia-causal-memory.d.ts.map +1 -0
  23. package/dist/src/benchmarks/gaia-causal-memory.js +281 -0
  24. package/dist/src/benchmarks/gaia-causal-memory.js.map +1 -0
  25. package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts +22 -0
  26. package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts.map +1 -0
  27. package/dist/src/benchmarks/gaia-causal-memory.smoke.js +300 -0
  28. package/dist/src/benchmarks/gaia-causal-memory.smoke.js.map +1 -0
  29. package/dist/src/benchmarks/gaia-claude-p.d.ts +105 -0
  30. package/dist/src/benchmarks/gaia-claude-p.d.ts.map +1 -0
  31. package/dist/src/benchmarks/gaia-claude-p.js +269 -0
  32. package/dist/src/benchmarks/gaia-claude-p.js.map +1 -0
  33. package/dist/src/benchmarks/gaia-claude-p.smoke.d.ts +20 -0
  34. package/dist/src/benchmarks/gaia-claude-p.smoke.d.ts.map +1 -0
  35. package/dist/src/benchmarks/gaia-claude-p.smoke.js +168 -0
  36. package/dist/src/benchmarks/gaia-claude-p.smoke.js.map +1 -0
  37. package/dist/src/benchmarks/gaia-codeagent-runner.py +556 -0
  38. package/dist/src/benchmarks/gaia-codeagent.d.ts +129 -0
  39. package/dist/src/benchmarks/gaia-codeagent.d.ts.map +1 -0
  40. package/dist/src/benchmarks/gaia-codeagent.js +590 -0
  41. package/dist/src/benchmarks/gaia-codeagent.js.map +1 -0
  42. package/dist/src/benchmarks/gaia-codeagent.smoke.d.ts +33 -0
  43. package/dist/src/benchmarks/gaia-codeagent.smoke.d.ts.map +1 -0
  44. package/dist/src/benchmarks/gaia-codeagent.smoke.js +241 -0
  45. package/dist/src/benchmarks/gaia-codeagent.smoke.js.map +1 -0
  46. package/dist/src/benchmarks/gaia-convergence.d.ts +138 -0
  47. package/dist/src/benchmarks/gaia-convergence.d.ts.map +1 -0
  48. package/dist/src/benchmarks/gaia-convergence.js +260 -0
  49. package/dist/src/benchmarks/gaia-convergence.js.map +1 -0
  50. package/dist/src/benchmarks/gaia-convergence.smoke.d.ts +19 -0
  51. package/dist/src/benchmarks/gaia-convergence.smoke.d.ts.map +1 -0
  52. package/dist/src/benchmarks/gaia-convergence.smoke.js +246 -0
  53. package/dist/src/benchmarks/gaia-convergence.smoke.js.map +1 -0
  54. package/dist/src/benchmarks/gaia-critic.d.ts +123 -0
  55. package/dist/src/benchmarks/gaia-critic.d.ts.map +1 -0
  56. package/dist/src/benchmarks/gaia-critic.js +312 -0
  57. package/dist/src/benchmarks/gaia-critic.js.map +1 -0
  58. package/dist/src/benchmarks/gaia-critic.smoke.d.ts +21 -0
  59. package/dist/src/benchmarks/gaia-critic.smoke.d.ts.map +1 -0
  60. package/dist/src/benchmarks/gaia-critic.smoke.js +327 -0
  61. package/dist/src/benchmarks/gaia-critic.smoke.js.map +1 -0
  62. package/dist/src/benchmarks/gaia-dag-pilot.d.ts +22 -0
  63. package/dist/src/benchmarks/gaia-dag-pilot.d.ts.map +1 -0
  64. package/dist/src/benchmarks/gaia-dag-pilot.js +158 -0
  65. package/dist/src/benchmarks/gaia-dag-pilot.js.map +1 -0
  66. package/dist/src/benchmarks/gaia-dag.d.ts +110 -0
  67. package/dist/src/benchmarks/gaia-dag.d.ts.map +1 -0
  68. package/dist/src/benchmarks/gaia-dag.js +658 -0
  69. package/dist/src/benchmarks/gaia-dag.js.map +1 -0
  70. package/dist/src/benchmarks/gaia-dag.smoke.d.ts +21 -0
  71. package/dist/src/benchmarks/gaia-dag.smoke.d.ts.map +1 -0
  72. package/dist/src/benchmarks/gaia-dag.smoke.js +290 -0
  73. package/dist/src/benchmarks/gaia-dag.smoke.js.map +1 -0
  74. package/dist/src/benchmarks/gaia-decomposer.d.ts +125 -0
  75. package/dist/src/benchmarks/gaia-decomposer.d.ts.map +1 -0
  76. package/dist/src/benchmarks/gaia-decomposer.js +350 -0
  77. package/dist/src/benchmarks/gaia-decomposer.js.map +1 -0
  78. package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts +21 -0
  79. package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts.map +1 -0
  80. package/dist/src/benchmarks/gaia-decomposer.smoke.js +228 -0
  81. package/dist/src/benchmarks/gaia-decomposer.smoke.js.map +1 -0
  82. package/dist/src/benchmarks/gaia-e2e-smoke.d.ts +27 -0
  83. package/dist/src/benchmarks/gaia-e2e-smoke.d.ts.map +1 -0
  84. package/dist/src/benchmarks/gaia-e2e-smoke.js +136 -0
  85. package/dist/src/benchmarks/gaia-e2e-smoke.js.map +1 -0
  86. package/dist/src/benchmarks/gaia-ensemble-pilot.d.ts +17 -0
  87. package/dist/src/benchmarks/gaia-ensemble-pilot.d.ts.map +1 -0
  88. package/dist/src/benchmarks/gaia-ensemble-pilot.js +106 -0
  89. package/dist/src/benchmarks/gaia-ensemble-pilot.js.map +1 -0
  90. package/dist/src/benchmarks/gaia-ensemble.d.ts +103 -0
  91. package/dist/src/benchmarks/gaia-ensemble.d.ts.map +1 -0
  92. package/dist/src/benchmarks/gaia-ensemble.js +462 -0
  93. package/dist/src/benchmarks/gaia-ensemble.js.map +1 -0
  94. package/dist/src/benchmarks/gaia-extract.smoke.d.ts +45 -0
  95. package/dist/src/benchmarks/gaia-extract.smoke.d.ts.map +1 -0
  96. package/dist/src/benchmarks/gaia-extract.smoke.js +242 -0
  97. package/dist/src/benchmarks/gaia-extract.smoke.js.map +1 -0
  98. package/dist/src/benchmarks/gaia-gemini-pilot.d.ts +17 -0
  99. package/dist/src/benchmarks/gaia-gemini-pilot.d.ts.map +1 -0
  100. package/dist/src/benchmarks/gaia-gemini-pilot.js +168 -0
  101. package/dist/src/benchmarks/gaia-gemini-pilot.js.map +1 -0
  102. package/dist/src/benchmarks/gaia-hardness/features.d.ts +46 -0
  103. package/dist/src/benchmarks/gaia-hardness/features.d.ts.map +1 -0
  104. package/dist/src/benchmarks/gaia-hardness/features.js +170 -0
  105. package/dist/src/benchmarks/gaia-hardness/features.js.map +1 -0
  106. package/dist/src/benchmarks/gaia-hardness/predictor.d.ts +105 -0
  107. package/dist/src/benchmarks/gaia-hardness/predictor.d.ts.map +1 -0
  108. package/dist/src/benchmarks/gaia-hardness/predictor.js +260 -0
  109. package/dist/src/benchmarks/gaia-hardness/predictor.js.map +1 -0
  110. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts +20 -0
  111. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts.map +1 -0
  112. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js +235 -0
  113. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js.map +1 -0
  114. package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts +51 -0
  115. package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts.map +1 -0
  116. package/dist/src/benchmarks/gaia-hardness/train-data-loader.js +179 -0
  117. package/dist/src/benchmarks/gaia-hardness/train-data-loader.js.map +1 -0
  118. package/dist/src/benchmarks/gaia-judge.d.ts +88 -0
  119. package/dist/src/benchmarks/gaia-judge.d.ts.map +1 -0
  120. package/dist/src/benchmarks/gaia-judge.js +437 -0
  121. package/dist/src/benchmarks/gaia-judge.js.map +1 -0
  122. package/dist/src/benchmarks/gaia-loader.d.ts +87 -0
  123. package/dist/src/benchmarks/gaia-loader.d.ts.map +1 -0
  124. package/dist/src/benchmarks/gaia-loader.js +326 -0
  125. package/dist/src/benchmarks/gaia-loader.js.map +1 -0
  126. package/dist/src/benchmarks/gaia-mode-router.d.ts +67 -0
  127. package/dist/src/benchmarks/gaia-mode-router.d.ts.map +1 -0
  128. package/dist/src/benchmarks/gaia-mode-router.js +126 -0
  129. package/dist/src/benchmarks/gaia-mode-router.js.map +1 -0
  130. package/dist/src/benchmarks/gaia-mode-router.smoke.d.ts +15 -0
  131. package/dist/src/benchmarks/gaia-mode-router.smoke.d.ts.map +1 -0
  132. package/dist/src/benchmarks/gaia-mode-router.smoke.js +131 -0
  133. package/dist/src/benchmarks/gaia-mode-router.smoke.js.map +1 -0
  134. package/dist/src/benchmarks/gaia-tools/file_read.d.ts +35 -0
  135. package/dist/src/benchmarks/gaia-tools/file_read.d.ts.map +1 -0
  136. package/dist/src/benchmarks/gaia-tools/file_read.js +403 -0
  137. package/dist/src/benchmarks/gaia-tools/file_read.js.map +1 -0
  138. package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts +126 -0
  139. package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts.map +1 -0
  140. package/dist/src/benchmarks/gaia-tools/grounded_query.js +225 -0
  141. package/dist/src/benchmarks/gaia-tools/grounded_query.js.map +1 -0
  142. package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.d.ts +24 -0
  143. package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.d.ts.map +1 -0
  144. package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.js +276 -0
  145. package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.js.map +1 -0
  146. package/dist/src/benchmarks/gaia-tools/image_describe.d.ts +45 -0
  147. package/dist/src/benchmarks/gaia-tools/image_describe.d.ts.map +1 -0
  148. package/dist/src/benchmarks/gaia-tools/image_describe.js +222 -0
  149. package/dist/src/benchmarks/gaia-tools/image_describe.js.map +1 -0
  150. package/dist/src/benchmarks/gaia-tools/image_describe.smoke.d.ts +24 -0
  151. package/dist/src/benchmarks/gaia-tools/image_describe.smoke.d.ts.map +1 -0
  152. package/dist/src/benchmarks/gaia-tools/image_describe.smoke.js +169 -0
  153. package/dist/src/benchmarks/gaia-tools/image_describe.smoke.js.map +1 -0
  154. package/dist/src/benchmarks/gaia-tools/index.d.ts +32 -0
  155. package/dist/src/benchmarks/gaia-tools/index.d.ts.map +1 -0
  156. package/dist/src/benchmarks/gaia-tools/index.js +36 -0
  157. package/dist/src/benchmarks/gaia-tools/index.js.map +1 -0
  158. package/dist/src/benchmarks/gaia-tools/pdf_read.d.ts +27 -0
  159. package/dist/src/benchmarks/gaia-tools/pdf_read.d.ts.map +1 -0
  160. package/dist/src/benchmarks/gaia-tools/pdf_read.js +226 -0
  161. package/dist/src/benchmarks/gaia-tools/pdf_read.js.map +1 -0
  162. package/dist/src/benchmarks/gaia-tools/python_exec.d.ts +31 -0
  163. package/dist/src/benchmarks/gaia-tools/python_exec.d.ts.map +1 -0
  164. package/dist/src/benchmarks/gaia-tools/python_exec.js +94 -0
  165. package/dist/src/benchmarks/gaia-tools/python_exec.js.map +1 -0
  166. package/dist/src/benchmarks/gaia-tools/python_exec.smoke.d.ts +13 -0
  167. package/dist/src/benchmarks/gaia-tools/python_exec.smoke.d.ts.map +1 -0
  168. package/dist/src/benchmarks/gaia-tools/python_exec.smoke.js +98 -0
  169. package/dist/src/benchmarks/gaia-tools/python_exec.smoke.js.map +1 -0
  170. package/dist/src/benchmarks/gaia-tools/types.d.ts +62 -0
  171. package/dist/src/benchmarks/gaia-tools/types.d.ts.map +1 -0
  172. package/dist/src/benchmarks/gaia-tools/types.js +12 -0
  173. package/dist/src/benchmarks/gaia-tools/types.js.map +1 -0
  174. package/dist/src/benchmarks/gaia-tools/visit_webpage.d.ts +52 -0
  175. package/dist/src/benchmarks/gaia-tools/visit_webpage.d.ts.map +1 -0
  176. package/dist/src/benchmarks/gaia-tools/visit_webpage.js +304 -0
  177. package/dist/src/benchmarks/gaia-tools/visit_webpage.js.map +1 -0
  178. package/dist/src/benchmarks/gaia-tools/web_browse.d.ts +61 -0
  179. package/dist/src/benchmarks/gaia-tools/web_browse.d.ts.map +1 -0
  180. package/dist/src/benchmarks/gaia-tools/web_browse.js +217 -0
  181. package/dist/src/benchmarks/gaia-tools/web_browse.js.map +1 -0
  182. package/dist/src/benchmarks/gaia-tools/web_browse.smoke.d.ts +26 -0
  183. package/dist/src/benchmarks/gaia-tools/web_browse.smoke.d.ts.map +1 -0
  184. package/dist/src/benchmarks/gaia-tools/web_browse.smoke.js +152 -0
  185. package/dist/src/benchmarks/gaia-tools/web_browse.smoke.js.map +1 -0
  186. package/dist/src/benchmarks/gaia-tools/web_search.d.ts +30 -0
  187. package/dist/src/benchmarks/gaia-tools/web_search.d.ts.map +1 -0
  188. package/dist/src/benchmarks/gaia-tools/web_search.js +210 -0
  189. package/dist/src/benchmarks/gaia-tools/web_search.js.map +1 -0
  190. package/dist/src/benchmarks/gaia-tools/web_search.smoke.d.ts +24 -0
  191. package/dist/src/benchmarks/gaia-tools/web_search.smoke.d.ts.map +1 -0
  192. package/dist/src/benchmarks/gaia-tools/web_search.smoke.js +311 -0
  193. package/dist/src/benchmarks/gaia-tools/web_search.smoke.js.map +1 -0
  194. package/dist/src/benchmarks/gaia-visit-webpage.smoke.d.ts +25 -0
  195. package/dist/src/benchmarks/gaia-visit-webpage.smoke.d.ts.map +1 -0
  196. package/dist/src/benchmarks/gaia-visit-webpage.smoke.js +304 -0
  197. package/dist/src/benchmarks/gaia-visit-webpage.smoke.js.map +1 -0
  198. package/dist/src/benchmarks/gaia-voting.d.ts +88 -0
  199. package/dist/src/benchmarks/gaia-voting.d.ts.map +1 -0
  200. package/dist/src/benchmarks/gaia-voting.js +297 -0
  201. package/dist/src/benchmarks/gaia-voting.js.map +1 -0
  202. package/dist/src/benchmarks/gaia-voting.smoke.d.ts +20 -0
  203. package/dist/src/benchmarks/gaia-voting.smoke.d.ts.map +1 -0
  204. package/dist/src/benchmarks/gaia-voting.smoke.js +332 -0
  205. package/dist/src/benchmarks/gaia-voting.smoke.js.map +1 -0
  206. package/dist/src/commands/gaia-bench.d.ts +40 -0
  207. package/dist/src/commands/gaia-bench.d.ts.map +1 -0
  208. package/dist/src/commands/gaia-bench.js +597 -0
  209. package/dist/src/commands/gaia-bench.js.map +1 -0
  210. package/dist/src/commands/index.d.ts.map +1 -1
  211. package/dist/src/commands/index.js +2 -0
  212. package/dist/src/commands/index.js.map +1 -1
  213. package/dist/src/commands/init.d.ts.map +1 -1
  214. package/dist/src/commands/init.js +41 -4
  215. package/dist/src/commands/init.js.map +1 -1
  216. package/dist/src/commands/performance-capability.d.ts +30 -0
  217. package/dist/src/commands/performance-capability.d.ts.map +1 -0
  218. package/dist/src/commands/performance-capability.js +349 -0
  219. package/dist/src/commands/performance-capability.js.map +1 -0
  220. package/dist/src/commands/route.d.ts.map +1 -1
  221. package/dist/src/commands/route.js +9 -0
  222. package/dist/src/commands/route.js.map +1 -1
  223. package/dist/src/init/executor.d.ts.map +1 -1
  224. package/dist/src/init/executor.js +25 -6
  225. package/dist/src/init/executor.js.map +1 -1
  226. package/dist/src/init/mcp-generator.d.ts.map +1 -1
  227. package/dist/src/init/mcp-generator.js +9 -4
  228. package/dist/src/init/mcp-generator.js.map +1 -1
  229. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  230. package/dist/src/init/statusline-generator.js +25 -2
  231. package/dist/src/init/statusline-generator.js.map +1 -1
  232. package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -1
  233. package/dist/src/mcp-tools/agentdb-tools.js +20 -3
  234. package/dist/src/mcp-tools/agentdb-tools.js.map +1 -1
  235. package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
  236. package/dist/src/mcp-tools/system-tools.js +12 -1
  237. package/dist/src/mcp-tools/system-tools.js.map +1 -1
  238. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  239. package/dist/src/memory/memory-bridge.js +34 -0
  240. package/dist/src/memory/memory-bridge.js.map +1 -1
  241. package/dist/tsconfig.tsbuildinfo +1 -1
  242. package/package.json +1 -1
@@ -0,0 +1,170 @@
1
+ /**
2
+ * GAIA Hardness Predictor — Feature Extraction (ADR-136 Track Q)
3
+ *
4
+ * Extracts a 17-dimensional feature vector from a GaiaQuestion for use
5
+ * in the linear hardness classifier. Deliberately avoids external
6
+ * dependencies (no spacy, no heavy NLP) — all extraction is regex-based
7
+ * with O(1) per question.
8
+ *
9
+ * Feature vector layout (17 dims):
10
+ * [0] question length in characters (normalised / 500)
11
+ * [1] question length in words (normalised / 100)
12
+ * [2] sentence count (normalised / 5)
13
+ * [3] question word: "what" (0/1)
14
+ * [4] question word: "how" (0/1)
15
+ * [5] question word: "who/when/where" (0/1)
16
+ * [6] question word: "calculate/compute/how many/what percentage" (0/1)
17
+ * [7] has numeric token (0/1)
18
+ * [8] has year token (4-digit) (0/1)
19
+ * [9] has comparison keyword (0/1)
20
+ * [10] estimated named-entity count (normalised / 5)
21
+ * [11] digit-token count (normalised / 5)
22
+ * [12] multi-hop signal (0/1) — bridge/relative clause pattern
23
+ * [13] requires math (0/1) — "how many/much/percentage/calculate/compute"
24
+ * [14] temporal chain (0/1) — "before/after X happened / since / until"
25
+ * [15] tool implication count (normalised / 4) — PDF/image/video/URL markers
26
+ * [16] file attachment present (0/1)
27
+ *
28
+ * All continuous values are min-max normalised to [0, 1] using fixed
29
+ * divisors chosen so typical GAIA questions fall in [0.1, 0.9].
30
+ *
31
+ * Refs: ADR-136, #2156
32
+ */
33
+ // ---------------------------------------------------------------------------
34
+ // Feature labels (in order, matches values array)
35
+ // ---------------------------------------------------------------------------
36
+ export const FEATURE_LABELS = [
37
+ 'len_chars_norm',
38
+ 'len_words_norm',
39
+ 'sentence_count_norm',
40
+ 'qword_what',
41
+ 'qword_how',
42
+ 'qword_who_when_where',
43
+ 'qword_calc_compute',
44
+ 'has_numeric',
45
+ 'has_year',
46
+ 'has_comparison',
47
+ 'entity_count_norm',
48
+ 'digit_token_norm',
49
+ 'multi_hop_signal',
50
+ 'requires_math',
51
+ 'temporal_chain',
52
+ 'tool_implication_norm',
53
+ 'has_file_attachment',
54
+ ];
55
+ // ---------------------------------------------------------------------------
56
+ // Regex catalogue (compiled once at module load)
57
+ // ---------------------------------------------------------------------------
58
+ // Named entity proxy: capitalised word sequences (not at sentence start)
59
+ // e.g. "Barack Obama", "New York City", "United States of America"
60
+ const RE_ENTITY = /(?<!^|\.\s{1,3})(?:[A-Z][a-z]+(?:\s+[A-Z][a-z]+){0,4})/g;
61
+ const RE_YEAR = /\b(1[0-9]{3}|20[0-9]{2})\b/g;
62
+ const RE_DIGIT_TOKEN = /\b\d[\d,._]*/g;
63
+ const RE_NUMERIC = /\b\d/;
64
+ const RE_COMPARISON = /\b(more|fewer|greater|less|compare|versus|vs\.?|differ|increase|decrease|ratio|proportion)\b/i;
65
+ const RE_MULTI_HOP = /\b(the\s+\w+\s+that\s+|which\s+was\s+|who\s+was\s+|whose\s+|of\s+the\s+\w+\s+that\s+)/i;
66
+ // Requires math: stems without trailing \b to handle "calculate", "multiply", "division", etc.
67
+ const RE_MATH = /\b(how\s+many|how\s+much|what\s+percentage|what\s+fraction|what\s+proportion|calculat|comput|multipli|divis|subtract|sum\s+of|total\s+of|average\s+of|product\s+of|express\s+as\s+a\s+decimal)/i;
68
+ const RE_TEMPORAL = /\b(before|after|since|until|during|between\s+\d|in\s+the\s+year|by\s+the\s+time|at\s+the\s+time)\b/i;
69
+ // Tool implication markers
70
+ const RE_TOOL_FILE = /\b(pdf|\.docx|\.xlsx|\.csv|file|attachment|document|spreadsheet)\b/i;
71
+ const RE_TOOL_IMAGE = /\b(image|photo|picture|screenshot|figure|diagram|chart)\b/i;
72
+ const RE_TOOL_VIDEO = /\b(video|youtube|clip|footage)\b/i;
73
+ const RE_TOOL_URL = /https?:\/\//i;
74
+ // Question-word detection (first word of question, or full-text for calc/compute)
75
+ const RE_QWORD_WHAT = /^(what|which)\b/i;
76
+ const RE_QWORD_HOW = /^how\b/i;
77
+ const RE_QWORD_WHO_WHEN_WHERE = /^(who|when|where|why|whom)\b/i;
78
+ // calc/compute: fires if question contains calculate/compute anywhere (stems, no trailing \b)
79
+ const RE_QWORD_CALC = /\b(calculat|comput|how\s+many|what\s+percentage|how\s+much)/i;
80
+ // Sentence boundary (rough — period/exclamation/question-mark followed by space+capital)
81
+ const RE_SENTENCE = /[.!?]\s+[A-Z]/g;
82
+ // ---------------------------------------------------------------------------
83
+ // Helper: clamp value to [0, 1]
84
+ // ---------------------------------------------------------------------------
85
+ function clamp(v, max) {
86
+ return Math.min(v / max, 1.0);
87
+ }
88
+ // ---------------------------------------------------------------------------
89
+ // Public API
90
+ // ---------------------------------------------------------------------------
91
+ /**
92
+ * Extract the 17-dimensional feature vector from a GaiaQuestion.
93
+ * All features are in [0, 1]. Never throws.
94
+ */
95
+ export function extractFeatures(q) {
96
+ const text = q.question ?? '';
97
+ // ── Syntactic scalars ──────────────────────────────────────────────────
98
+ const lenChars = text.length;
99
+ const words = text.trim().split(/\s+/).filter(Boolean);
100
+ const lenWords = words.length;
101
+ const sentenceMatches = text.match(RE_SENTENCE);
102
+ const sentenceCount = 1 + (sentenceMatches ? sentenceMatches.length : 0);
103
+ // ── Question-word one-hot ─────────────────────────────────────────────
104
+ const firstWord = text.trim();
105
+ const qwWhat = RE_QWORD_WHAT.test(firstWord) ? 1 : 0;
106
+ const qwHow = RE_QWORD_HOW.test(firstWord) ? 1 : 0;
107
+ const qwWhoWhenWhere = RE_QWORD_WHO_WHEN_WHERE.test(firstWord) ? 1 : 0;
108
+ const qwCalcCompute = RE_QWORD_CALC.test(text) ? 1 : 0;
109
+ // ── Lexical booleans ──────────────────────────────────────────────────
110
+ const hasNumeric = RE_NUMERIC.test(text) ? 1 : 0;
111
+ // Count year tokens
112
+ const yearMatches = text.match(RE_YEAR);
113
+ const hasYear = yearMatches && yearMatches.length > 0 ? 1 : 0;
114
+ const hasComparison = RE_COMPARISON.test(text) ? 1 : 0;
115
+ // ── Named entity proxy (capitalised word sequences) ───────────────────
116
+ // Reset lastIndex for global regex
117
+ RE_ENTITY.lastIndex = 0;
118
+ let entityCount = 0;
119
+ // eslint-disable-next-line no-constant-condition
120
+ while (true) {
121
+ const m = RE_ENTITY.exec(text);
122
+ if (!m)
123
+ break;
124
+ entityCount++;
125
+ }
126
+ // ── Digit token count ─────────────────────────────────────────────────
127
+ RE_DIGIT_TOKEN.lastIndex = 0;
128
+ const digitTokenMatches = text.match(RE_DIGIT_TOKEN);
129
+ const digitTokenCount = digitTokenMatches ? digitTokenMatches.length : 0;
130
+ // ── Multi-hop signal ──────────────────────────────────────────────────
131
+ const multiHopSignal = RE_MULTI_HOP.test(text) ? 1 : 0;
132
+ // ── Math requirement ──────────────────────────────────────────────────
133
+ const requiresMath = RE_MATH.test(text) ? 1 : 0;
134
+ // ── Temporal chain ────────────────────────────────────────────────────
135
+ const temporalChain = RE_TEMPORAL.test(text) ? 1 : 0;
136
+ // ── Tool implication (PDF/image/video/URL → file_read/web_browse/image_describe) ──
137
+ let toolImplication = 0;
138
+ if (RE_TOOL_FILE.test(text) || q.file_name)
139
+ toolImplication++;
140
+ if (RE_TOOL_IMAGE.test(text))
141
+ toolImplication++;
142
+ if (RE_TOOL_VIDEO.test(text))
143
+ toolImplication++;
144
+ if (RE_TOOL_URL.test(text))
145
+ toolImplication++;
146
+ // ── File attachment ───────────────────────────────────────────────────
147
+ const hasFileAttachment = q.file_name && q.file_name.trim() ? 1 : 0;
148
+ // ── Assemble normalised vector ────────────────────────────────────────
149
+ const values = [
150
+ clamp(lenChars, 500), // [0]
151
+ clamp(lenWords, 100), // [1]
152
+ clamp(sentenceCount, 5), // [2]
153
+ qwWhat, // [3]
154
+ qwHow, // [4]
155
+ qwWhoWhenWhere, // [5]
156
+ qwCalcCompute, // [6]
157
+ hasNumeric, // [7]
158
+ hasYear, // [8]
159
+ hasComparison, // [9]
160
+ clamp(entityCount, 5), // [10]
161
+ clamp(digitTokenCount, 5), // [11]
162
+ multiHopSignal, // [12]
163
+ requiresMath, // [13]
164
+ temporalChain, // [14]
165
+ clamp(toolImplication, 4), // [15]
166
+ hasFileAttachment ? 1 : 0, // [16]
167
+ ];
168
+ return { values, labels: FEATURE_LABELS };
169
+ }
170
+ //# sourceMappingURL=features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../../../src/benchmarks/gaia-hardness/features.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * GAIA Hardness Predictor — Linear Classifier (ADR-136 Track Q)
3
+ *
4
+ * Classifies GAIA questions into easy / medium / hard using a
5
+ * hand-rolled logistic regression (no external ML dependencies).
6
+ *
7
+ * Training:
8
+ * `predictor.train(labeledData)` — fits weights via gradient descent
9
+ * on cross-entropy loss using the 17-dim feature vectors.
10
+ *
11
+ * Inference:
12
+ * `predictor.predict(question)` — returns difficulty class + confidence
13
+ * + a ComputeBudget that drives model/turns/voting choices in gaia-bench.
14
+ *
15
+ * Cold-start:
16
+ * When untrained (weights = null), classifies everything as "medium".
17
+ * This is the correct safe default: no wasted Haiku-on-hard, no missed
18
+ * Sonnet-on-easy.
19
+ *
20
+ * Compute budget policy (from ADR-136 Track Q research):
21
+ * easy → Haiku, max 4 turns, 1 attempt
22
+ * medium → Sonnet, max 8 turns, 1 attempt
23
+ * hard → Sonnet, max 12 turns, 3-vote (Track A)
24
+ *
25
+ * Conservative threshold:
26
+ * If in doubt, classify UP (medium→hard preferred over medium→easy).
27
+ * `conservativeMode: true` (default) shifts the easy/medium boundary
28
+ * so fewer questions fall into "easy".
29
+ *
30
+ * Refs: ADR-136, ADR-135, #2156
31
+ */
32
+ import type { GaiaQuestion } from '../gaia-loader.js';
33
+ import { type FeatureVector } from './features.js';
34
+ export type DifficultyClass = 'easy' | 'medium' | 'hard';
35
+ export interface ComputeBudget {
36
+ model: 'haiku' | 'sonnet';
37
+ maxTurns: number;
38
+ votingAttempts: number;
39
+ }
40
+ export interface PredictionResult {
41
+ difficulty: DifficultyClass;
42
+ confidence: number;
43
+ budget: ComputeBudget;
44
+ features: FeatureVector;
45
+ }
46
+ export interface LabeledExample {
47
+ question: GaiaQuestion;
48
+ wasCorrect: boolean;
49
+ /** Number of turns the agent used (optional; used to refine label). */
50
+ turns?: number;
51
+ }
52
+ export declare const COMPUTE_BUDGETS: Record<DifficultyClass, ComputeBudget>;
53
+ export declare class HardnessPredictor {
54
+ /**
55
+ * Weight matrix: weights[classIdx][featureIdx].
56
+ * null = untrained (cold-start: return medium for everything).
57
+ */
58
+ private weights;
59
+ /** Bias terms per class. */
60
+ private biases;
61
+ /** Whether conservative mode is active (default: true). */
62
+ private readonly conservativeMode;
63
+ constructor(options?: {
64
+ conservativeMode?: boolean;
65
+ });
66
+ /**
67
+ * Returns true when the predictor has been trained and is ready
68
+ * to make non-trivial predictions.
69
+ */
70
+ get isTrained(): boolean;
71
+ /**
72
+ * Train the linear classifier using labelled examples from prior runs.
73
+ *
74
+ * Labelling strategy (weak supervision):
75
+ * - All correct + turns ≤ median turns → easy
76
+ * - All correct + turns > median turns → medium
77
+ * - Incorrect → hard
78
+ *
79
+ * With < 10 examples, refuses to train (cold-start is safer).
80
+ * With 10-50 examples, trains but sets `conservativeMode`-threshold high.
81
+ */
82
+ train(labeledData: LabeledExample[]): void;
83
+ /**
84
+ * Predict the hardness class of a single GAIA question.
85
+ *
86
+ * Cold-start (untrained): returns medium with confidence=0.5.
87
+ */
88
+ predict(question: GaiaQuestion): PredictionResult;
89
+ /**
90
+ * Export weights as a plain JSON-serialisable object.
91
+ * Returns null if untrained.
92
+ */
93
+ export(): {
94
+ weights: number[][];
95
+ biases: number[];
96
+ } | null;
97
+ /**
98
+ * Import previously exported weights.
99
+ */
100
+ import(state: {
101
+ weights: number[][];
102
+ biases: number[];
103
+ }): void;
104
+ }
105
+ //# sourceMappingURL=predictor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predictor.d.ts","sourceRoot":"","sources":["../../../../src/benchmarks/gaia-hardness/predictor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAMpE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,aAAa,CAgBlE,CAAC;AAyCF,qBAAa,iBAAiB;IAC5B;;;OAGG;IACH,OAAO,CAAC,OAAO,CAA2B;IAE1C,4BAA4B;IAC5B,OAAO,CAAC,MAAM,CAAyB;IAEvC,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;gBAE/B,OAAO,GAAE;QAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAO;IAIxD;;;OAGG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAID;;;;;;;;;;OAUG;IACH,KAAK,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,IAAI;IA+E1C;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,gBAAgB;IAgDjD;;;OAGG;IACH,MAAM,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;IAK1D;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;CAc/D"}
@@ -0,0 +1,260 @@
1
+ /**
2
+ * GAIA Hardness Predictor — Linear Classifier (ADR-136 Track Q)
3
+ *
4
+ * Classifies GAIA questions into easy / medium / hard using a
5
+ * hand-rolled logistic regression (no external ML dependencies).
6
+ *
7
+ * Training:
8
+ * `predictor.train(labeledData)` — fits weights via gradient descent
9
+ * on cross-entropy loss using the 17-dim feature vectors.
10
+ *
11
+ * Inference:
12
+ * `predictor.predict(question)` — returns difficulty class + confidence
13
+ * + a ComputeBudget that drives model/turns/voting choices in gaia-bench.
14
+ *
15
+ * Cold-start:
16
+ * When untrained (weights = null), classifies everything as "medium".
17
+ * This is the correct safe default: no wasted Haiku-on-hard, no missed
18
+ * Sonnet-on-easy.
19
+ *
20
+ * Compute budget policy (from ADR-136 Track Q research):
21
+ * easy → Haiku, max 4 turns, 1 attempt
22
+ * medium → Sonnet, max 8 turns, 1 attempt
23
+ * hard → Sonnet, max 12 turns, 3-vote (Track A)
24
+ *
25
+ * Conservative threshold:
26
+ * If in doubt, classify UP (medium→hard preferred over medium→easy).
27
+ * `conservativeMode: true` (default) shifts the easy/medium boundary
28
+ * so fewer questions fall into "easy".
29
+ *
30
+ * Refs: ADR-136, ADR-135, #2156
31
+ */
32
+ import { extractFeatures } from './features.js';
33
+ // ---------------------------------------------------------------------------
34
+ // Compute budget policy
35
+ // ---------------------------------------------------------------------------
36
+ export const COMPUTE_BUDGETS = {
37
+ easy: {
38
+ model: 'haiku',
39
+ maxTurns: 4,
40
+ votingAttempts: 1,
41
+ },
42
+ medium: {
43
+ model: 'sonnet',
44
+ maxTurns: 8,
45
+ votingAttempts: 1,
46
+ },
47
+ hard: {
48
+ model: 'sonnet',
49
+ maxTurns: 12,
50
+ votingAttempts: 3,
51
+ },
52
+ };
53
+ // ---------------------------------------------------------------------------
54
+ // Internal constants
55
+ // ---------------------------------------------------------------------------
56
+ const FEATURE_DIM = 17;
57
+ const NUM_CLASSES = 3; // easy=0, medium=1, hard=2
58
+ const CLASS_NAMES = ['easy', 'medium', 'hard'];
59
+ // Learning-rate and regularisation tuned for ~300-example datasets
60
+ const LEARNING_RATE = 0.05;
61
+ const REGULARISATION_LAMBDA = 0.01;
62
+ const TRAINING_EPOCHS = 200;
63
+ // Conservative mode: shift the probability threshold so fewer questions
64
+ // are classified as "easy" (reduces risk of underpowering hard questions).
65
+ // With conservativeMode: the easy threshold is 0.6 (not 0.5).
66
+ const EASY_THRESHOLD_CONSERVATIVE = 0.55;
67
+ // ---------------------------------------------------------------------------
68
+ // Math helpers (pure functions, no deps)
69
+ // ---------------------------------------------------------------------------
70
+ function softmax(logits) {
71
+ const maxLogit = Math.max(...logits);
72
+ const exps = logits.map((l) => Math.exp(l - maxLogit));
73
+ const sumExps = exps.reduce((a, b) => a + b, 0);
74
+ return exps.map((e) => e / sumExps);
75
+ }
76
+ function dot(a, b) {
77
+ let sum = 0;
78
+ for (let i = 0; i < a.length; i++)
79
+ sum += a[i] * b[i];
80
+ return sum;
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // HardnessPredictor
84
+ // ---------------------------------------------------------------------------
85
+ export class HardnessPredictor {
86
+ /**
87
+ * Weight matrix: weights[classIdx][featureIdx].
88
+ * null = untrained (cold-start: return medium for everything).
89
+ */
90
+ weights = null;
91
+ /** Bias terms per class. */
92
+ biases = null;
93
+ /** Whether conservative mode is active (default: true). */
94
+ conservativeMode;
95
+ constructor(options = {}) {
96
+ this.conservativeMode = options.conservativeMode ?? true;
97
+ }
98
+ /**
99
+ * Returns true when the predictor has been trained and is ready
100
+ * to make non-trivial predictions.
101
+ */
102
+ get isTrained() {
103
+ return this.weights !== null;
104
+ }
105
+ // ── Training ─────────────────────────────────────────────────────────────
106
+ /**
107
+ * Train the linear classifier using labelled examples from prior runs.
108
+ *
109
+ * Labelling strategy (weak supervision):
110
+ * - All correct + turns ≤ median turns → easy
111
+ * - All correct + turns > median turns → medium
112
+ * - Incorrect → hard
113
+ *
114
+ * With < 10 examples, refuses to train (cold-start is safer).
115
+ * With 10-50 examples, trains but sets `conservativeMode`-threshold high.
116
+ */
117
+ train(labeledData) {
118
+ if (labeledData.length < 10) {
119
+ // Too few examples for meaningful generalisation.
120
+ this.weights = null;
121
+ this.biases = null;
122
+ return;
123
+ }
124
+ // Derive labels using weak-supervision strategy.
125
+ const allTurns = labeledData
126
+ .filter((d) => d.turns !== undefined)
127
+ .map((d) => d.turns);
128
+ const medianTurns = allTurns.length > 0 ? median(allTurns) : 6;
129
+ const X = [];
130
+ const y = [];
131
+ for (const example of labeledData) {
132
+ const fv = extractFeatures(example.question);
133
+ X.push(fv.values);
134
+ let classIdx;
135
+ if (example.wasCorrect) {
136
+ const t = example.turns ?? medianTurns;
137
+ classIdx = t <= medianTurns ? 0 : 1; // easy=0, medium=1
138
+ }
139
+ else {
140
+ classIdx = 2; // hard
141
+ }
142
+ y.push(classIdx);
143
+ }
144
+ // Initialise weights to 0.
145
+ const W = Array.from({ length: NUM_CLASSES }, () => new Array(FEATURE_DIM).fill(0));
146
+ const b = new Array(NUM_CLASSES).fill(0);
147
+ // Mini-batch gradient descent (batch = full dataset for small sizes).
148
+ for (let epoch = 0; epoch < TRAINING_EPOCHS; epoch++) {
149
+ // Accumulate gradients.
150
+ const dW = Array.from({ length: NUM_CLASSES }, () => new Array(FEATURE_DIM).fill(0));
151
+ const db = new Array(NUM_CLASSES).fill(0);
152
+ for (let n = 0; n < X.length; n++) {
153
+ const x = X[n];
154
+ const trueClass = y[n];
155
+ // Compute logits and softmax probabilities.
156
+ const logits = W.map((w, k) => dot(w, x) + b[k]);
157
+ const probs = softmax(logits);
158
+ // Cross-entropy gradient for each class.
159
+ for (let k = 0; k < NUM_CLASSES; k++) {
160
+ const grad = probs[k] - (k === trueClass ? 1 : 0);
161
+ for (let f = 0; f < FEATURE_DIM; f++) {
162
+ dW[k][f] += grad * x[f];
163
+ }
164
+ db[k] += grad;
165
+ }
166
+ }
167
+ // Update weights with L2 regularisation.
168
+ const N = X.length;
169
+ for (let k = 0; k < NUM_CLASSES; k++) {
170
+ for (let f = 0; f < FEATURE_DIM; f++) {
171
+ W[k][f] -= LEARNING_RATE * (dW[k][f] / N + REGULARISATION_LAMBDA * W[k][f]);
172
+ }
173
+ b[k] -= LEARNING_RATE * (db[k] / N);
174
+ }
175
+ }
176
+ this.weights = W;
177
+ this.biases = b;
178
+ }
179
+ // ── Inference ─────────────────────────────────────────────────────────────
180
+ /**
181
+ * Predict the hardness class of a single GAIA question.
182
+ *
183
+ * Cold-start (untrained): returns medium with confidence=0.5.
184
+ */
185
+ predict(question) {
186
+ const features = extractFeatures(question);
187
+ if (!this.weights || !this.biases) {
188
+ // Cold-start fallback: medium for everything.
189
+ return {
190
+ difficulty: 'medium',
191
+ confidence: 0.5,
192
+ budget: COMPUTE_BUDGETS.medium,
193
+ features,
194
+ };
195
+ }
196
+ const logits = this.weights.map((w, k) => dot(w, features.values) + this.biases[k]);
197
+ const probs = softmax(logits);
198
+ // Conservative mode: down-weight easy probability.
199
+ let adjustedProbs = [...probs];
200
+ if (this.conservativeMode) {
201
+ // Transfer a fraction of easy probability to medium.
202
+ const easyExcess = Math.max(0, probs[0] - EASY_THRESHOLD_CONSERVATIVE);
203
+ adjustedProbs[0] = probs[0] - easyExcess;
204
+ adjustedProbs[1] = probs[1] + easyExcess;
205
+ }
206
+ // Re-normalise after adjustment.
207
+ const sumAdj = adjustedProbs.reduce((a, b) => a + b, 0);
208
+ adjustedProbs = adjustedProbs.map((p) => p / sumAdj);
209
+ // Pick argmax.
210
+ let bestClass = 0;
211
+ for (let k = 1; k < NUM_CLASSES; k++) {
212
+ if (adjustedProbs[k] > adjustedProbs[bestClass])
213
+ bestClass = k;
214
+ }
215
+ const difficulty = CLASS_NAMES[bestClass];
216
+ const confidence = adjustedProbs[bestClass];
217
+ return {
218
+ difficulty,
219
+ confidence,
220
+ budget: COMPUTE_BUDGETS[difficulty],
221
+ features,
222
+ };
223
+ }
224
+ // ── Serialisation ─────────────────────────────────────────────────────────
225
+ /**
226
+ * Export weights as a plain JSON-serialisable object.
227
+ * Returns null if untrained.
228
+ */
229
+ export() {
230
+ if (!this.weights || !this.biases)
231
+ return null;
232
+ return { weights: this.weights, biases: this.biases };
233
+ }
234
+ /**
235
+ * Import previously exported weights.
236
+ */
237
+ import(state) {
238
+ if (!Array.isArray(state.weights) ||
239
+ state.weights.length !== NUM_CLASSES ||
240
+ !Array.isArray(state.biases) ||
241
+ state.biases.length !== NUM_CLASSES) {
242
+ throw new Error(`Invalid weight state: expected ${NUM_CLASSES}×${FEATURE_DIM} matrix + ${NUM_CLASSES} biases`);
243
+ }
244
+ this.weights = state.weights.map((row) => [...row]);
245
+ this.biases = [...state.biases];
246
+ }
247
+ }
248
+ // ---------------------------------------------------------------------------
249
+ // Utility
250
+ // ---------------------------------------------------------------------------
251
+ function median(values) {
252
+ if (values.length === 0)
253
+ return 0;
254
+ const sorted = [...values].sort((a, b) => a - b);
255
+ const mid = Math.floor(sorted.length / 2);
256
+ return sorted.length % 2 === 0
257
+ ? (sorted[mid - 1] + sorted[mid]) / 2
258
+ : sorted[mid];
259
+ }
260
+ //# sourceMappingURL=predictor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predictor.js","sourceRoot":"","sources":["../../../../src/benchmarks/gaia-hardness/predictor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,EAAE,eAAe,EAAsB,MAAM,eAAe,CAAC;AA4BpE,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,eAAe,GAA2C;IACrE,IAAI,EAAE;QACJ,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,CAAC;QACX,cAAc,EAAE,CAAC;KAClB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,CAAC;QACX,cAAc,EAAE,CAAC;KAClB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,CAAC;KAClB;CACF,CAAC;AAEF,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,2BAA2B;AAClD,MAAM,WAAW,GAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAElE,mEAAmE;AACnE,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,wEAAwE;AACxE,2EAA2E;AAC3E,8DAA8D;AAC9D,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAEzC,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E,SAAS,OAAO,CAAC,MAAgB;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,GAAG,CAAC,CAAW,EAAE,CAAW;IACnC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,MAAM,OAAO,iBAAiB;IAC5B;;;OAGG;IACK,OAAO,GAAsB,IAAI,CAAC;IAE1C,4BAA4B;IACpB,MAAM,GAAoB,IAAI,CAAC;IAEvC,2DAA2D;IAC1C,gBAAgB,CAAU;IAE3C,YAAY,UAA0C,EAAE;QACtD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;IAC/B,CAAC;IAED,4EAA4E;IAE5E;;;;;;;;;;OAUG;IACH,KAAK,CAAC,WAA6B;QACjC,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC5B,kDAAkD;YAClD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,OAAO;QACT,CAAC;QAED,iDAAiD;QACjD,MAAM,QAAQ,GAAG,WAAW;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAe,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/D,MAAM,CAAC,GAAe,EAAE,CAAC;QACzB,MAAM,CAAC,GAAa,EAAE,CAAC;QAEvB,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC7C,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAElB,IAAI,QAAgB,CAAC;YACrB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC;gBACvC,QAAQ,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;YAC1D,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,CAAC,CAAC,CAAC,OAAO;YACvB,CAAC;YACD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnB,CAAC;QAED,2BAA2B;QAC3B,MAAM,CAAC,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAC7D,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC/B,CAAC;QACF,MAAM,CAAC,GAAa,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnD,sEAAsE;QACtE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,wBAAwB;YACxB,MAAM,EAAE,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAC9D,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC/B,CAAC;YACF,MAAM,EAAE,GAAa,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACf,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEvB,4CAA4C;gBAC5C,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;gBAE9B,yCAAyC;gBACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;wBACrC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1B,CAAC;oBACD,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBAChB,CAAC;YACH,CAAC;YAED,yCAAyC;YACzC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,qBAAqB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9E,CAAC;gBACD,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,6EAA6E;IAE7E;;;;OAIG;IACH,OAAO,CAAC,QAAsB;QAC5B,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClC,8CAA8C;YAC9C,OAAO;gBACL,UAAU,EAAE,QAAQ;gBACpB,UAAU,EAAE,GAAG;gBACf,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,QAAQ;aACT,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAE9B,mDAAmD;QACnD,IAAI,aAAa,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,qDAAqD;YACrD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,2BAA2B,CAAC,CAAC;YACvE,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;YACzC,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QAC3C,CAAC;QAED,iCAAiC;QACjC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAErD,eAAe;QACf,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC;gBAAE,SAAS,GAAG,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QAE5C,OAAO;YACL,UAAU;YACV,UAAU;YACV,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC;YACnC,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,6EAA6E;IAE7E;;;OAGG;IACH,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAgD;QACrD,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;YAC7B,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,WAAW;YACpC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YAC5B,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,EACnC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,kCAAkC,WAAW,IAAI,WAAW,aAAa,WAAW,SAAS,CAC9F,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;CACF;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,MAAM,CAAC,MAAgB;IAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;QAC5B,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;QACrC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Smoke tests for gaia-hardness predictor — ADR-136 Track Q
3
+ *
4
+ * All tests are mock-based (no live API calls, no HF token, $0 cost).
5
+ *
6
+ * Test matrix:
7
+ * 1. Feature extraction: math question fires requiresMath + qword_calc
8
+ * 2. Feature extraction: simple factual question has low complexity signal
9
+ * 3. Feature extraction: question with file attachment fires has_file_attachment
10
+ * 4. Feature extraction: multi-hop question fires multi_hop_signal
11
+ * 5. Cold-start fallback: untrained predictor returns medium with confidence=0.5
12
+ * 6. Train on mock data: predictor becomes trained after ≥ 10 examples
13
+ * 7. Trained predictor: math-heavy question predicts harder than trivial question
14
+ * 8. Export/import: weights round-trip through JSON without loss
15
+ *
16
+ * Refs: ADR-136, #2156
17
+ */
18
+ declare function runSmoke(): Promise<void>;
19
+ export { runSmoke };
20
+ //# sourceMappingURL=predictor.smoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predictor.smoke.d.ts","sourceRoot":"","sources":["../../../../src/benchmarks/gaia-hardness/predictor.smoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA2PH,iBAAe,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA+BvC;AAaD,OAAO,EAAE,QAAQ,EAAE,CAAC"}