@claude-flow/cli 3.10.3 → 3.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts +18 -0
  2. package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts.map +1 -0
  3. package/dist/src/benchmarks/gaia-agent-planning.smoke.js +253 -0
  4. package/dist/src/benchmarks/gaia-agent-planning.smoke.js.map +1 -0
  5. package/dist/src/benchmarks/gaia-agent.d.ts +198 -0
  6. package/dist/src/benchmarks/gaia-agent.d.ts.map +1 -0
  7. package/dist/src/benchmarks/gaia-agent.js +651 -0
  8. package/dist/src/benchmarks/gaia-agent.js.map +1 -0
  9. package/dist/src/benchmarks/gaia-causal-memory.d.ts +133 -0
  10. package/dist/src/benchmarks/gaia-causal-memory.d.ts.map +1 -0
  11. package/dist/src/benchmarks/gaia-causal-memory.js +281 -0
  12. package/dist/src/benchmarks/gaia-causal-memory.js.map +1 -0
  13. package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts +22 -0
  14. package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts.map +1 -0
  15. package/dist/src/benchmarks/gaia-causal-memory.smoke.js +300 -0
  16. package/dist/src/benchmarks/gaia-causal-memory.smoke.js.map +1 -0
  17. package/dist/src/benchmarks/gaia-convergence.d.ts +138 -0
  18. package/dist/src/benchmarks/gaia-convergence.d.ts.map +1 -0
  19. package/dist/src/benchmarks/gaia-convergence.js +260 -0
  20. package/dist/src/benchmarks/gaia-convergence.js.map +1 -0
  21. package/dist/src/benchmarks/gaia-convergence.smoke.d.ts +19 -0
  22. package/dist/src/benchmarks/gaia-convergence.smoke.d.ts.map +1 -0
  23. package/dist/src/benchmarks/gaia-convergence.smoke.js +246 -0
  24. package/dist/src/benchmarks/gaia-convergence.smoke.js.map +1 -0
  25. package/dist/src/benchmarks/gaia-critic.d.ts +123 -0
  26. package/dist/src/benchmarks/gaia-critic.d.ts.map +1 -0
  27. package/dist/src/benchmarks/gaia-critic.js +312 -0
  28. package/dist/src/benchmarks/gaia-critic.js.map +1 -0
  29. package/dist/src/benchmarks/gaia-critic.smoke.d.ts +21 -0
  30. package/dist/src/benchmarks/gaia-critic.smoke.d.ts.map +1 -0
  31. package/dist/src/benchmarks/gaia-critic.smoke.js +327 -0
  32. package/dist/src/benchmarks/gaia-critic.smoke.js.map +1 -0
  33. package/dist/src/benchmarks/gaia-decomposer.d.ts +125 -0
  34. package/dist/src/benchmarks/gaia-decomposer.d.ts.map +1 -0
  35. package/dist/src/benchmarks/gaia-decomposer.js +350 -0
  36. package/dist/src/benchmarks/gaia-decomposer.js.map +1 -0
  37. package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts +21 -0
  38. package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts.map +1 -0
  39. package/dist/src/benchmarks/gaia-decomposer.smoke.js +228 -0
  40. package/dist/src/benchmarks/gaia-decomposer.smoke.js.map +1 -0
  41. package/dist/src/benchmarks/gaia-e2e-smoke.d.ts +27 -0
  42. package/dist/src/benchmarks/gaia-e2e-smoke.d.ts.map +1 -0
  43. package/dist/src/benchmarks/gaia-e2e-smoke.js +136 -0
  44. package/dist/src/benchmarks/gaia-e2e-smoke.js.map +1 -0
  45. package/dist/src/benchmarks/gaia-extract.smoke.d.ts +45 -0
  46. package/dist/src/benchmarks/gaia-extract.smoke.d.ts.map +1 -0
  47. package/dist/src/benchmarks/gaia-extract.smoke.js +242 -0
  48. package/dist/src/benchmarks/gaia-extract.smoke.js.map +1 -0
  49. package/dist/src/benchmarks/gaia-hardness/features.d.ts +46 -0
  50. package/dist/src/benchmarks/gaia-hardness/features.d.ts.map +1 -0
  51. package/dist/src/benchmarks/gaia-hardness/features.js +170 -0
  52. package/dist/src/benchmarks/gaia-hardness/features.js.map +1 -0
  53. package/dist/src/benchmarks/gaia-hardness/predictor.d.ts +105 -0
  54. package/dist/src/benchmarks/gaia-hardness/predictor.d.ts.map +1 -0
  55. package/dist/src/benchmarks/gaia-hardness/predictor.js +260 -0
  56. package/dist/src/benchmarks/gaia-hardness/predictor.js.map +1 -0
  57. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts +20 -0
  58. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts.map +1 -0
  59. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js +235 -0
  60. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js.map +1 -0
  61. package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts +51 -0
  62. package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts.map +1 -0
  63. package/dist/src/benchmarks/gaia-hardness/train-data-loader.js +179 -0
  64. package/dist/src/benchmarks/gaia-hardness/train-data-loader.js.map +1 -0
  65. package/dist/src/benchmarks/gaia-judge.d.ts +88 -0
  66. package/dist/src/benchmarks/gaia-judge.d.ts.map +1 -0
  67. package/dist/src/benchmarks/gaia-judge.js +437 -0
  68. package/dist/src/benchmarks/gaia-judge.js.map +1 -0
  69. package/dist/src/benchmarks/gaia-loader.d.ts +87 -0
  70. package/dist/src/benchmarks/gaia-loader.d.ts.map +1 -0
  71. package/dist/src/benchmarks/gaia-loader.js +326 -0
  72. package/dist/src/benchmarks/gaia-loader.js.map +1 -0
  73. package/dist/src/benchmarks/gaia-tools/file_read.d.ts +35 -0
  74. package/dist/src/benchmarks/gaia-tools/file_read.d.ts.map +1 -0
  75. package/dist/src/benchmarks/gaia-tools/file_read.js +403 -0
  76. package/dist/src/benchmarks/gaia-tools/file_read.js.map +1 -0
  77. package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts +126 -0
  78. package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts.map +1 -0
  79. package/dist/src/benchmarks/gaia-tools/grounded_query.js +225 -0
  80. package/dist/src/benchmarks/gaia-tools/grounded_query.js.map +1 -0
  81. package/dist/src/benchmarks/gaia-tools/index.d.ts +32 -0
  82. package/dist/src/benchmarks/gaia-tools/index.d.ts.map +1 -0
  83. package/dist/src/benchmarks/gaia-tools/index.js +36 -0
  84. package/dist/src/benchmarks/gaia-tools/index.js.map +1 -0
  85. package/dist/src/benchmarks/gaia-tools/types.d.ts +62 -0
  86. package/dist/src/benchmarks/gaia-tools/types.d.ts.map +1 -0
  87. package/dist/src/benchmarks/gaia-tools/types.js +12 -0
  88. package/dist/src/benchmarks/gaia-tools/types.js.map +1 -0
  89. package/dist/src/benchmarks/gaia-tools/web_search.d.ts +30 -0
  90. package/dist/src/benchmarks/gaia-tools/web_search.d.ts.map +1 -0
  91. package/dist/src/benchmarks/gaia-tools/web_search.js +210 -0
  92. package/dist/src/benchmarks/gaia-tools/web_search.js.map +1 -0
  93. package/dist/src/benchmarks/gaia-voting.d.ts +88 -0
  94. package/dist/src/benchmarks/gaia-voting.d.ts.map +1 -0
  95. package/dist/src/benchmarks/gaia-voting.js +297 -0
  96. package/dist/src/benchmarks/gaia-voting.js.map +1 -0
  97. package/dist/src/benchmarks/gaia-voting.smoke.d.ts +20 -0
  98. package/dist/src/benchmarks/gaia-voting.smoke.d.ts.map +1 -0
  99. package/dist/src/benchmarks/gaia-voting.smoke.js +332 -0
  100. package/dist/src/benchmarks/gaia-voting.smoke.js.map +1 -0
  101. package/dist/src/commands/gaia-bench.d.ts +40 -0
  102. package/dist/src/commands/gaia-bench.d.ts.map +1 -0
  103. package/dist/src/commands/gaia-bench.js +597 -0
  104. package/dist/src/commands/gaia-bench.js.map +1 -0
  105. package/dist/src/commands/index.d.ts.map +1 -1
  106. package/dist/src/commands/index.js +2 -0
  107. package/dist/src/commands/index.js.map +1 -1
  108. package/dist/src/commands/init.d.ts.map +1 -1
  109. package/dist/src/commands/init.js +41 -4
  110. package/dist/src/commands/init.js.map +1 -1
  111. package/dist/src/init/executor.d.ts.map +1 -1
  112. package/dist/src/init/executor.js +25 -6
  113. package/dist/src/init/executor.js.map +1 -1
  114. package/dist/src/init/mcp-generator.d.ts.map +1 -1
  115. package/dist/src/init/mcp-generator.js +9 -4
  116. package/dist/src/init/mcp-generator.js.map +1 -1
  117. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  118. package/dist/src/init/statusline-generator.js +287 -642
  119. package/dist/src/init/statusline-generator.js.map +1 -1
  120. package/dist/tsconfig.tsbuildinfo +1 -1
  121. package/package.json +1 -1
@@ -0,0 +1,27 @@
1
+ /**
2
+ * GAIA End-to-End Smoke — ADR-133
3
+ *
4
+ * Wires gaia-agent.ts + gaia-judge.ts into a single end-to-end pipeline:
5
+ *
6
+ * for each question in SMOKE_FIXTURE:
7
+ * 1. runGaiaAgent(question) — Haiku agent loop, ≤8 turns
8
+ * 2. judgeAnswer(question, result.finalAnswer) — exact-match fast-path,
9
+ * Sonnet LLM-judge only if exact-match misses
10
+ *
11
+ * Reports: pass rate, total cost, mean turn count.
12
+ * Asserts: ≥ 3/5 questions pass (lenient — smoke fixture is not trivial).
13
+ *
14
+ * Cost discipline:
15
+ * - Agent: claude-haiku-4-5 at $0.25/$1.25 per M tokens
16
+ * - Judge: claude-sonnet-4-6 at $3/$15 per M tokens (only when needed)
17
+ * - Expected total for 5 questions × ~2 turns × Haiku + 1-2 Sonnet
18
+ * judge calls ≈ $0.02
19
+ *
20
+ * Usage:
21
+ * ANTHROPIC_API_KEY=sk-ant-... npx tsx src/benchmarks/gaia-e2e-smoke.ts
22
+ *
23
+ * Refs: ADR-133, #2156
24
+ */
25
+ declare function runE2ESmoke(): Promise<void>;
26
+ export { runE2ESmoke };
27
+ //# sourceMappingURL=gaia-e2e-smoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gaia-e2e-smoke.d.ts","sourceRoot":"","sources":["../../../src/benchmarks/gaia-e2e-smoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAqDH,iBAAe,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA0G1C;AAiBD,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * GAIA End-to-End Smoke — ADR-133
3
+ *
4
+ * Wires gaia-agent.ts + gaia-judge.ts into a single end-to-end pipeline:
5
+ *
6
+ * for each question in SMOKE_FIXTURE:
7
+ * 1. runGaiaAgent(question) — Haiku agent loop, ≤8 turns
8
+ * 2. judgeAnswer(question, result.finalAnswer) — exact-match fast-path,
9
+ * Sonnet LLM-judge only if exact-match misses
10
+ *
11
+ * Reports: pass rate, total cost, mean turn count.
12
+ * Asserts: ≥ 3/5 questions pass (lenient — smoke fixture is not trivial).
13
+ *
14
+ * Cost discipline:
15
+ * - Agent: claude-haiku-4-5 at $0.25/$1.25 per M tokens
16
+ * - Judge: claude-sonnet-4-6 at $3/$15 per M tokens (only when needed)
17
+ * - Expected total for 5 questions × ~2 turns × Haiku + 1-2 Sonnet
18
+ * judge calls ≈ $0.02
19
+ *
20
+ * Usage:
21
+ * ANTHROPIC_API_KEY=sk-ant-... npx tsx src/benchmarks/gaia-e2e-smoke.ts
22
+ *
23
+ * Refs: ADR-133, #2156
24
+ */
25
+ import * as os from 'node:os';
26
+ import * as path from 'node:path';
27
+ import { SMOKE_FIXTURE, } from './gaia-loader.js';
28
+ import { runGaiaAgent, } from './gaia-agent.js';
29
+ import { judgeAnswer, } from './gaia-judge.js';
30
+ // ---------------------------------------------------------------------------
31
+ // Configuration
32
+ // ---------------------------------------------------------------------------
33
+ /** Agent model — Haiku only for cost discipline. */
34
+ const AGENT_MODEL = 'claude-haiku-4-5';
35
+ /** Judge model — Sonnet for semantic judgments (only when exact-match fails). */
36
+ const JUDGE_MODEL = 'claude-sonnet-4-6';
37
+ /** Minimum pass rate for smoke to succeed. */
38
+ const MIN_PASS_RATE = 3 / 5;
39
+ // Haiku pricing ($/M tokens)
40
+ const HAIKU_IN = 0.25;
41
+ const HAIKU_OUT = 1.25;
42
+ // Sonnet pricing ($/M tokens)
43
+ const SONNET_IN = 3.0;
44
+ const SONNET_OUT = 15.0;
45
+ // ---------------------------------------------------------------------------
46
+ // Runner
47
+ // ---------------------------------------------------------------------------
48
+ async function runE2ESmoke() {
49
+ const hasKey = !!(process.env.ANTHROPIC_API_KEY?.trim());
50
+ if (!hasKey) {
51
+ console.error('ANTHROPIC_API_KEY is required for the end-to-end smoke.\n' +
52
+ 'Set it with: export ANTHROPIC_API_KEY=sk-ant-...');
53
+ process.exit(1);
54
+ }
55
+ const cacheDir = path.join(os.homedir(), '.cache', 'ruflo', 'gaia', 'judgments');
56
+ const judgeOpts = { judgeModel: JUDGE_MODEL, cacheDir };
57
+ const questions = SMOKE_FIXTURE;
58
+ const rows = [];
59
+ console.log(`\n=== GAIA End-to-End Smoke (${questions.length} questions) ===\n`);
60
+ console.log(`Agent: ${AGENT_MODEL} | Judge: ${JUDGE_MODEL}\n` +
61
+ `Questions: ${questions.length} | Min pass rate: ${(MIN_PASS_RATE * 100).toFixed(0)}%\n`);
62
+ for (const q of questions) {
63
+ process.stdout.write(`[${q.task_id}] "${q.question.slice(0, 60)}..." `);
64
+ // Run agent
65
+ const agentResult = await runGaiaAgent(q, { model: AGENT_MODEL });
66
+ // Judge
67
+ const judgeResult = await judgeAnswer({ id: q.task_id, expected: q.final_answer, questionText: q.question }, agentResult.finalAnswer, judgeOpts);
68
+ rows.push({ question: q, agentResult, judgeResult });
69
+ const verdict = judgeResult.passed ? '\x1b[32mPASS\x1b[0m' : '\x1b[31mFAIL\x1b[0m';
70
+ const path_ = judgeResult.scoringPath;
71
+ console.log(`${verdict} (turns=${agentResult.turns}, ` +
72
+ `answer="${agentResult.finalAnswer ?? 'null'}", ` +
73
+ `expected="${q.final_answer}", path=${path_})`);
74
+ }
75
+ // ── Summary ──
76
+ console.log('\n--- Summary ---\n');
77
+ const passed = rows.filter((r) => r.judgeResult.passed).length;
78
+ const total = rows.length;
79
+ const passRate = passed / total;
80
+ let totalAgentCostUsd = 0;
81
+ let totalJudgeCostUsd = 0;
82
+ let totalTurns = 0;
83
+ for (const row of rows) {
84
+ const { agentResult, judgeResult } = row;
85
+ totalTurns += agentResult.turns;
86
+ totalAgentCostUsd +=
87
+ (agentResult.totalInputTokens / 1_000_000) * HAIKU_IN +
88
+ (agentResult.totalOutputTokens / 1_000_000) * HAIKU_OUT;
89
+ totalJudgeCostUsd += judgeResult.judgeCostUsd ?? 0;
90
+ }
91
+ const totalCostUsd = totalAgentCostUsd + totalJudgeCostUsd;
92
+ const meanTurns = totalTurns / total;
93
+ console.log(`Pass rate : ${passed}/${total} (${(passRate * 100).toFixed(0)}%)`);
94
+ console.log(`Mean turns : ${meanTurns.toFixed(1)}`);
95
+ console.log(`Agent cost : $${totalAgentCostUsd.toFixed(5)} (Haiku)`);
96
+ console.log(`Judge cost : $${totalJudgeCostUsd.toFixed(5)} (Sonnet, only when needed)`);
97
+ console.log(`Total cost : $${totalCostUsd.toFixed(5)}`);
98
+ // ── Per-row detail ──
99
+ console.log('\n--- Per-question detail ---\n');
100
+ for (const row of rows) {
101
+ const { question, agentResult, judgeResult } = row;
102
+ const verdict = judgeResult.passed ? 'PASS' : 'FAIL';
103
+ console.log(` ${verdict} ${question.task_id} turns=${agentResult.turns} ` +
104
+ `path=${judgeResult.scoringPath} ` +
105
+ `answer="${agentResult.finalAnswer ?? 'null'}" ` +
106
+ `expected="${question.final_answer}"`);
107
+ if (judgeResult.judgeReason) {
108
+ console.log(` reason: ${judgeResult.judgeReason}`);
109
+ }
110
+ if (agentResult.error) {
111
+ console.log(` error : ${agentResult.error}`);
112
+ }
113
+ }
114
+ // ── Assertion ──
115
+ console.log('');
116
+ if (passRate >= MIN_PASS_RATE) {
117
+ console.log(`\x1b[32mSmoke PASSED\x1b[0m — ${passed}/${total} ≥ ${(MIN_PASS_RATE * 100).toFixed(0)}% required.\n`);
118
+ }
119
+ else {
120
+ console.error(`\x1b[31mSmoke FAILED\x1b[0m — ${passed}/${total} < ${(MIN_PASS_RATE * 100).toFixed(0)}% required.\n`);
121
+ process.exit(1);
122
+ }
123
+ }
124
+ // ---------------------------------------------------------------------------
125
+ // Entry point
126
+ // ---------------------------------------------------------------------------
127
+ const isMain = process.argv[1] && (process.argv[1].endsWith('gaia-e2e-smoke.ts') ||
128
+ process.argv[1].endsWith('gaia-e2e-smoke.js'));
129
+ if (isMain) {
130
+ runE2ESmoke().catch((err) => {
131
+ console.error('E2E smoke failed:', err);
132
+ process.exit(1);
133
+ });
134
+ }
135
+ export { runE2ESmoke };
136
+ //# sourceMappingURL=gaia-e2e-smoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gaia-e2e-smoke.js","sourceRoot":"","sources":["../../../src/benchmarks/gaia-e2e-smoke.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Smoke tests for extractFinalAnswer + buildUserMessage (iter 53a T2 narrowed).
3
+ *
4
+ * Iter 53a changes vs iter 52 T2:
5
+ * - Stage 2/3 (prose fallback) REMOVED — extractFinalAnswer is Stage 1 only.
6
+ * - Commitment prompt no longer has "FINAL_ANSWER: unknown" surrender instruction.
7
+ * - Reversed-text preprocessor PRESERVED (not the source of regressions).
8
+ *
9
+ * Anti-regression suite (7 cases):
10
+ * These are the exact failure modes from iter 52 T2 that must not regress.
11
+ * They test that the extraction logic is stable and correct for the 7 questions
12
+ * where iter 52 broke but iter 51 was correct.
13
+ *
14
+ * Run (after build):
15
+ * node dist/benchmarks/gaia-extract.smoke.js
16
+ *
17
+ * Exit 0 on all pass, 1 on any failure.
18
+ *
19
+ * Refs: ADR-133, ADR-135, iter 52 T2, iter 53a, #2156
20
+ */
21
+ interface AnthropicResponse {
22
+ id: string;
23
+ model: string;
24
+ stop_reason: string;
25
+ content: Array<{
26
+ type: string;
27
+ text?: string;
28
+ }>;
29
+ usage: {
30
+ input_tokens: number;
31
+ output_tokens: number;
32
+ };
33
+ }
34
+ declare let _extractFinalAnswer: (resp: AnthropicResponse) => string | null;
35
+ declare let _buildUserMessage: (question: string) => string;
36
+ declare function makeResp(text: string): AnthropicResponse;
37
+ interface TestCase {
38
+ label: string;
39
+ input: string;
40
+ expected: string | null;
41
+ isUserMsg?: boolean;
42
+ }
43
+ declare const CASES: TestCase[];
44
+ declare function main(): Promise<void>;
45
+ //# sourceMappingURL=gaia-extract.smoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gaia-extract.smoke.d.ts","sourceRoot":"","sources":["../../../src/benchmarks/gaia-extract.smoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAID,QAAA,IAAI,mBAAmB,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,MAAM,GAAG,IAAI,CAAC;AAEpE,QAAA,IAAI,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;AAEpD,iBAAS,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAQjD;AAOD,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,KAAK,EAAE,QAAQ,EAuJpB,CAAC;AAMF,iBAAe,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA8DnC"}
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ /**
3
+ * Smoke tests for extractFinalAnswer + buildUserMessage (iter 53a T2 narrowed).
4
+ *
5
+ * Iter 53a changes vs iter 52 T2:
6
+ * - Stage 2/3 (prose fallback) REMOVED — extractFinalAnswer is Stage 1 only.
7
+ * - Commitment prompt no longer has "FINAL_ANSWER: unknown" surrender instruction.
8
+ * - Reversed-text preprocessor PRESERVED (not the source of regressions).
9
+ *
10
+ * Anti-regression suite (7 cases):
11
+ * These are the exact failure modes from iter 52 T2 that must not regress.
12
+ * They test that the extraction logic is stable and correct for the 7 questions
13
+ * where iter 52 broke but iter 51 was correct.
14
+ *
15
+ * Run (after build):
16
+ * node dist/benchmarks/gaia-extract.smoke.js
17
+ *
18
+ * Exit 0 on all pass, 1 on any failure.
19
+ *
20
+ * Refs: ADR-133, ADR-135, iter 52 T2, iter 53a, #2156
21
+ */
22
+ // Dynamic import so this file can run either as TS source (tsx) or compiled JS.
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ let _extractFinalAnswer;
25
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
+ let _buildUserMessage;
27
+ function makeResp(text) {
28
+ return {
29
+ id: 'test',
30
+ model: 'test',
31
+ stop_reason: 'end_turn',
32
+ content: [{ type: 'text', text }],
33
+ usage: { input_tokens: 0, output_tokens: 0 },
34
+ };
35
+ }
36
+ const CASES = [
37
+ // ---------------------------------------------------------------------------
38
+ // Stage 1: primary FINAL_ANSWER: pattern (iter 53a: this is the ONLY stage)
39
+ // ---------------------------------------------------------------------------
40
+ {
41
+ label: 'Stage1 basic FINAL_ANSWER:',
42
+ input: 'I searched and found the capital.\nFINAL_ANSWER: Paris',
43
+ expected: 'Paris',
44
+ },
45
+ {
46
+ label: 'Stage1 case-insensitive final_answer:',
47
+ input: 'The result is known.\nfinal_answer: 42',
48
+ expected: '42',
49
+ },
50
+ {
51
+ label: 'Stage1 with leading whitespace',
52
+ input: 'Done.\n FINAL_ANSWER: Tokyo ',
53
+ expected: 'Tokyo',
54
+ },
55
+ // ---------------------------------------------------------------------------
56
+ // Prose-only outputs with no FINAL_ANSWER: tag — must return null (iter 53a).
57
+ // These were previously handled by Stage 2/3 (iter 52 T2).
58
+ // In iter 53a, we rely on the agent committing with the tag instead.
59
+ // ---------------------------------------------------------------------------
60
+ {
61
+ label: 'Prose-only "The answer is X" — null in iter 53a (no Stage 2)',
62
+ input: 'After analysis, the answer is Right.',
63
+ expected: null,
64
+ },
65
+ {
66
+ label: 'Prose-only "Therefore X" — null in iter 53a (no Stage 2)',
67
+ input: 'Based on the clues, therefore the answer is Berlin.',
68
+ expected: null,
69
+ },
70
+ {
71
+ label: 'Prose-only "Answer: X" — null in iter 53a (no Stage 2)',
72
+ input: 'Let me compute this.\nAnswer: 17',
73
+ expected: null,
74
+ },
75
+ {
76
+ label: 'Prose-only all-caps last line — null in iter 53a (no Stage 3)',
77
+ input: 'I computed the value based on many steps.\nRIGHT',
78
+ expected: null,
79
+ },
80
+ {
81
+ label: 'Prose-only numeric last line — null in iter 53a (no Stage 3)',
82
+ input: 'The final calculation gives us:\n346',
83
+ expected: null,
84
+ },
85
+ {
86
+ label: 'Prose-only short-phrase last line — null in iter 53a (no Stage 3)',
87
+ input: 'After extensive research, the result is:\nBerlin, Germany',
88
+ expected: null,
89
+ },
90
+ // Null case: no answer extractable (verbose prose, no commitment)
91
+ {
92
+ label: 'Null case: only tool-call reasoning, no commitment',
93
+ input: 'I tried searching but could not find the specific information requested.',
94
+ expected: null,
95
+ },
96
+ // ---------------------------------------------------------------------------
97
+ // Reversed text pre-processor (buildUserMessage) — PRESERVED in iter 53a
98
+ // ---------------------------------------------------------------------------
99
+ {
100
+ label: 'Reversed text: adds decoded hint',
101
+ input: '.rewsna eht sa "tfel" drow eht fo etisoppo eht etirw ,ecnetnes siht dnatsrednu uoy fI',
102
+ expected: '[NOTE:',
103
+ isUserMsg: true,
104
+ },
105
+ {
106
+ label: 'Normal text: no hint added',
107
+ input: 'What is the capital of France?',
108
+ expected: 'What is the capital of France?',
109
+ isUserMsg: true,
110
+ },
111
+ // ---------------------------------------------------------------------------
112
+ // Anti-regression suite (iter 53a) — 7 cases for iter 52 regressions.
113
+ //
114
+ // These represent the exact regression patterns from iter 52 T2:
115
+ // a1e91b78: agent surrendered with "unknown" (commitment prompt over-trigger)
116
+ // 935e2cff: agent gave empty answer (Stage 2/3 failed after extraction)
117
+ // 305ac316: agent gave empty answer (Stage 2/3 failed after extraction)
118
+ // 7673d772: agent gave empty answer (Stage 2/3 failed after extraction)
119
+ // 3f57289b: Stage 3 grabbed wrong number from prose
120
+ // 50ec8903: Stage 3 grabbed markdown fragment instead of correct answer
121
+ // 5a0c1adf: Stage 3 grabbed "Claus Peter" instead of correct "Claus"
122
+ //
123
+ // Each test constructs a synthetic response that mimics the failure mode
124
+ // and asserts the correct Stage 1 extraction behavior.
125
+ // ---------------------------------------------------------------------------
126
+ // AR-1: a1e91b78 — agent used to surrender with "FINAL_ANSWER: unknown"
127
+ // In iter 52, system prompt said to output "FINAL_ANSWER: unknown" if unsure.
128
+ // With that instruction removed, the agent reasons further and finds the answer.
129
+ // This test verifies: if the agent DOES output a correct FINAL_ANSWER, we extract it.
130
+ {
131
+ label: 'AR-1 (a1e91b78): Stage1 extracts correct answer — not "unknown"',
132
+ input: 'I found the video. The maximum number of bird species seen together is 3.\nFINAL_ANSWER: 3',
133
+ expected: '3',
134
+ },
135
+ // AR-2: 935e2cff — agent had the answer but Stage 2 produced empty string
136
+ // In iter 53a, agent should output FINAL_ANSWER: Research correctly.
137
+ {
138
+ label: 'AR-2 (935e2cff): Stage1 extracts "Research" correctly',
139
+ input: 'After reviewing the policy document, R stands for Research.\nFINAL_ANSWER: Research',
140
+ expected: 'Research',
141
+ },
142
+ // AR-3: 305ac316 — agent had "Wojciech" but extraction failed
143
+ {
144
+ label: 'AR-3 (305ac316): Stage1 extracts Polish name correctly',
145
+ input: 'The actor played Wojciech in the movie.\nFINAL_ANSWER: Wojciech',
146
+ expected: 'Wojciech',
147
+ },
148
+ // AR-4: 7673d772 — agent had "inference" but extraction failed
149
+ {
150
+ label: 'AR-4 (7673d772): Stage1 extracts legal term correctly',
151
+ input: 'The fifth section of the federal rule uses the word "inference".\nFINAL_ANSWER: inference',
152
+ expected: 'inference',
153
+ },
154
+ // AR-5: 3f57289b — Stage 3 grabbed wrong number (525 instead of 519)
155
+ // The regression was caused by Stage 3 picking a wrong number from prose.
156
+ // With Stage 3 removed, Stage 1 is the only source — agent must use the tag.
157
+ {
158
+ label: 'AR-5 (3f57289b): Stage1 extracts correct at-bat count',
159
+ input: 'Reggie Jackson had 525 at-bats but the player with most walks had 519.\nFINAL_ANSWER: 519',
160
+ expected: '519',
161
+ },
162
+ // AR-6: 50ec8903 — Stage 3 grabbed "- Orange-Green edge →" (markdown fragment)
163
+ // With Stage 3 removed, only FINAL_ANSWER: tag is extracted.
164
+ {
165
+ label: 'AR-6 (50ec8903): Stage1 extracts Rubik cube colors correctly',
166
+ input: 'After solving the cube configuration, the answer is green, white.\nFINAL_ANSWER: green, white',
167
+ expected: 'green, white',
168
+ },
169
+ // AR-7: 5a0c1adf — Stage 3 grabbed "Claus Peter" (too many words)
170
+ // With Stage 3 removed, only FINAL_ANSWER: tag is extracted.
171
+ {
172
+ label: 'AR-7 (5a0c1adf): Stage1 extracts first name only, not "Claus Peter"',
173
+ input: 'The conductor\'s full name is Claus Peter Flor, but his first name is Claus.\nFINAL_ANSWER: Claus',
174
+ expected: 'Claus',
175
+ },
176
+ ];
177
+ // ---------------------------------------------------------------------------
178
+ // Runner
179
+ // ---------------------------------------------------------------------------
180
+ async function main() {
181
+ // Import at runtime to work with both tsx and compiled JS.
182
+ const mod = await import('./gaia-agent.js');
183
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
184
+ const m = mod;
185
+ _extractFinalAnswer = m._extractFinalAnswerForTest;
186
+ _buildUserMessage = m._buildUserMessageForTest;
187
+ if (typeof _extractFinalAnswer !== 'function' || typeof _buildUserMessage !== 'function') {
188
+ console.error('ERROR: _extractFinalAnswerForTest / _buildUserMessageForTest not exported from gaia-agent.' +
189
+ '\nAdd `export { extractFinalAnswer as _extractFinalAnswerForTest, ' +
190
+ 'buildUserMessage as _buildUserMessageForTest }` to gaia-agent.ts.');
191
+ process.exit(1);
192
+ }
193
+ let failures = 0;
194
+ const PASS = '\x1b[32mPASS\x1b[0m';
195
+ const FAIL = '\x1b[31mFAIL\x1b[0m';
196
+ console.log('\n=== gaia-extract smoke (iter 53a T2 narrowed) ===\n');
197
+ console.log('Suite: 12 original + 7 anti-regression = 19 cases\n');
198
+ for (const tc of CASES) {
199
+ let actual;
200
+ if (tc.isUserMsg) {
201
+ actual = _buildUserMessage(tc.input);
202
+ // For user message tests, check startsWith instead of exact equality.
203
+ const pass = tc.expected === null
204
+ ? actual === null
205
+ : actual !== null && (tc.expected === actual || actual.startsWith(tc.expected));
206
+ if (pass) {
207
+ console.log(` ${PASS} ${tc.label}`);
208
+ }
209
+ else {
210
+ console.log(` ${FAIL} ${tc.label}`);
211
+ console.log(` expected starts-with: ${JSON.stringify(tc.expected)}`);
212
+ console.log(` actual: ${JSON.stringify((actual ?? '').slice(0, 80))}`);
213
+ failures++;
214
+ }
215
+ }
216
+ else {
217
+ actual = _extractFinalAnswer(makeResp(tc.input));
218
+ const pass = tc.expected === null
219
+ ? actual === null
220
+ : actual !== null && actual === tc.expected;
221
+ if (pass) {
222
+ console.log(` ${PASS} ${tc.label}`);
223
+ }
224
+ else {
225
+ console.log(` ${FAIL} ${tc.label}`);
226
+ console.log(` expected: ${JSON.stringify(tc.expected)}`);
227
+ console.log(` actual: ${JSON.stringify(actual)}`);
228
+ failures++;
229
+ }
230
+ }
231
+ }
232
+ const total = CASES.length;
233
+ const passed = total - failures;
234
+ console.log(`\n=== ${failures === 0 ? 'ALL PASSED' : `${failures} FAILED`} (${passed}/${total} cases) ===\n`);
235
+ if (failures > 0)
236
+ process.exit(1);
237
+ }
238
+ main().catch((err) => {
239
+ console.error('Smoke crashed:', err);
240
+ process.exit(2);
241
+ });
242
+ //# sourceMappingURL=gaia-extract.smoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gaia-extract.smoke.js","sourceRoot":"","sources":["../../../src/benchmarks/gaia-extract.smoke.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
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
+ import type { GaiaQuestion } from '../gaia-loader.js';
34
+ export interface FeatureVector {
35
+ /** Raw 17-element array in [0, 1]. */
36
+ values: number[];
37
+ /** Human-readable labels matching values index. */
38
+ labels: string[];
39
+ }
40
+ export declare const FEATURE_LABELS: readonly string[];
41
+ /**
42
+ * Extract the 17-dimensional feature vector from a GaiaQuestion.
43
+ * All features are in [0, 1]. Never throws.
44
+ */
45
+ export declare function extractFeatures(q: GaiaQuestion): FeatureVector;
46
+ //# sourceMappingURL=features.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../../../src/benchmarks/gaia-hardness/features.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMtD,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mDAAmD;IACnD,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAkBlC,CAAC;AA+CX;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,GAAG,aAAa,CAmF9D"}