@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.
- package/dist/src/benchmarks/capability-tasks.d.ts +126 -0
- package/dist/src/benchmarks/capability-tasks.d.ts.map +1 -0
- package/dist/src/benchmarks/capability-tasks.js +147 -0
- package/dist/src/benchmarks/capability-tasks.js.map +1 -0
- package/dist/src/benchmarks/gaia-agent-contrastive.d.ts +53 -0
- package/dist/src/benchmarks/gaia-agent-contrastive.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-agent-contrastive.js +177 -0
- package/dist/src/benchmarks/gaia-agent-contrastive.js.map +1 -0
- package/dist/src/benchmarks/gaia-agent-gemini.d.ts +51 -0
- package/dist/src/benchmarks/gaia-agent-gemini.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-agent-gemini.js +352 -0
- package/dist/src/benchmarks/gaia-agent-gemini.js.map +1 -0
- package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts +18 -0
- package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-agent-planning.smoke.js +253 -0
- package/dist/src/benchmarks/gaia-agent-planning.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-agent.d.ts +198 -0
- package/dist/src/benchmarks/gaia-agent.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-agent.js +651 -0
- package/dist/src/benchmarks/gaia-agent.js.map +1 -0
- package/dist/src/benchmarks/gaia-causal-memory.d.ts +133 -0
- package/dist/src/benchmarks/gaia-causal-memory.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-causal-memory.js +281 -0
- package/dist/src/benchmarks/gaia-causal-memory.js.map +1 -0
- package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts +22 -0
- package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-causal-memory.smoke.js +300 -0
- package/dist/src/benchmarks/gaia-causal-memory.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-claude-p.d.ts +105 -0
- package/dist/src/benchmarks/gaia-claude-p.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-claude-p.js +269 -0
- package/dist/src/benchmarks/gaia-claude-p.js.map +1 -0
- package/dist/src/benchmarks/gaia-claude-p.smoke.d.ts +20 -0
- package/dist/src/benchmarks/gaia-claude-p.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-claude-p.smoke.js +168 -0
- package/dist/src/benchmarks/gaia-claude-p.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-codeagent-runner.py +556 -0
- package/dist/src/benchmarks/gaia-codeagent.d.ts +129 -0
- package/dist/src/benchmarks/gaia-codeagent.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-codeagent.js +590 -0
- package/dist/src/benchmarks/gaia-codeagent.js.map +1 -0
- package/dist/src/benchmarks/gaia-codeagent.smoke.d.ts +33 -0
- package/dist/src/benchmarks/gaia-codeagent.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-codeagent.smoke.js +241 -0
- package/dist/src/benchmarks/gaia-codeagent.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-convergence.d.ts +138 -0
- package/dist/src/benchmarks/gaia-convergence.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-convergence.js +260 -0
- package/dist/src/benchmarks/gaia-convergence.js.map +1 -0
- package/dist/src/benchmarks/gaia-convergence.smoke.d.ts +19 -0
- package/dist/src/benchmarks/gaia-convergence.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-convergence.smoke.js +246 -0
- package/dist/src/benchmarks/gaia-convergence.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-critic.d.ts +123 -0
- package/dist/src/benchmarks/gaia-critic.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-critic.js +312 -0
- package/dist/src/benchmarks/gaia-critic.js.map +1 -0
- package/dist/src/benchmarks/gaia-critic.smoke.d.ts +21 -0
- package/dist/src/benchmarks/gaia-critic.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-critic.smoke.js +327 -0
- package/dist/src/benchmarks/gaia-critic.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-dag-pilot.d.ts +22 -0
- package/dist/src/benchmarks/gaia-dag-pilot.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-dag-pilot.js +158 -0
- package/dist/src/benchmarks/gaia-dag-pilot.js.map +1 -0
- package/dist/src/benchmarks/gaia-dag.d.ts +110 -0
- package/dist/src/benchmarks/gaia-dag.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-dag.js +658 -0
- package/dist/src/benchmarks/gaia-dag.js.map +1 -0
- package/dist/src/benchmarks/gaia-dag.smoke.d.ts +21 -0
- package/dist/src/benchmarks/gaia-dag.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-dag.smoke.js +290 -0
- package/dist/src/benchmarks/gaia-dag.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-decomposer.d.ts +125 -0
- package/dist/src/benchmarks/gaia-decomposer.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-decomposer.js +350 -0
- package/dist/src/benchmarks/gaia-decomposer.js.map +1 -0
- package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts +21 -0
- package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-decomposer.smoke.js +228 -0
- package/dist/src/benchmarks/gaia-decomposer.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-e2e-smoke.d.ts +27 -0
- package/dist/src/benchmarks/gaia-e2e-smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-e2e-smoke.js +136 -0
- package/dist/src/benchmarks/gaia-e2e-smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-ensemble-pilot.d.ts +17 -0
- package/dist/src/benchmarks/gaia-ensemble-pilot.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-ensemble-pilot.js +106 -0
- package/dist/src/benchmarks/gaia-ensemble-pilot.js.map +1 -0
- package/dist/src/benchmarks/gaia-ensemble.d.ts +103 -0
- package/dist/src/benchmarks/gaia-ensemble.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-ensemble.js +462 -0
- package/dist/src/benchmarks/gaia-ensemble.js.map +1 -0
- package/dist/src/benchmarks/gaia-extract.smoke.d.ts +45 -0
- package/dist/src/benchmarks/gaia-extract.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-extract.smoke.js +242 -0
- package/dist/src/benchmarks/gaia-extract.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-gemini-pilot.d.ts +17 -0
- package/dist/src/benchmarks/gaia-gemini-pilot.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-gemini-pilot.js +168 -0
- package/dist/src/benchmarks/gaia-gemini-pilot.js.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/features.d.ts +46 -0
- package/dist/src/benchmarks/gaia-hardness/features.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/features.js +170 -0
- package/dist/src/benchmarks/gaia-hardness/features.js.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.d.ts +105 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.js +260 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.js.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts +20 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js +235 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts +51 -0
- package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-hardness/train-data-loader.js +179 -0
- package/dist/src/benchmarks/gaia-hardness/train-data-loader.js.map +1 -0
- package/dist/src/benchmarks/gaia-judge.d.ts +88 -0
- package/dist/src/benchmarks/gaia-judge.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-judge.js +437 -0
- package/dist/src/benchmarks/gaia-judge.js.map +1 -0
- package/dist/src/benchmarks/gaia-loader.d.ts +87 -0
- package/dist/src/benchmarks/gaia-loader.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-loader.js +326 -0
- package/dist/src/benchmarks/gaia-loader.js.map +1 -0
- package/dist/src/benchmarks/gaia-mode-router.d.ts +67 -0
- package/dist/src/benchmarks/gaia-mode-router.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-mode-router.js +126 -0
- package/dist/src/benchmarks/gaia-mode-router.js.map +1 -0
- package/dist/src/benchmarks/gaia-mode-router.smoke.d.ts +15 -0
- package/dist/src/benchmarks/gaia-mode-router.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-mode-router.smoke.js +131 -0
- package/dist/src/benchmarks/gaia-mode-router.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/file_read.d.ts +35 -0
- package/dist/src/benchmarks/gaia-tools/file_read.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/file_read.js +403 -0
- package/dist/src/benchmarks/gaia-tools/file_read.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts +126 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.js +225 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.d.ts +24 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.js +276 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.d.ts +45 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.js +222 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.d.ts +24 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.js +169 -0
- package/dist/src/benchmarks/gaia-tools/image_describe.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/index.d.ts +32 -0
- package/dist/src/benchmarks/gaia-tools/index.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/index.js +36 -0
- package/dist/src/benchmarks/gaia-tools/index.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/pdf_read.d.ts +27 -0
- package/dist/src/benchmarks/gaia-tools/pdf_read.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/pdf_read.js +226 -0
- package/dist/src/benchmarks/gaia-tools/pdf_read.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.d.ts +31 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.js +94 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.d.ts +13 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.js +98 -0
- package/dist/src/benchmarks/gaia-tools/python_exec.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/types.d.ts +62 -0
- package/dist/src/benchmarks/gaia-tools/types.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/types.js +12 -0
- package/dist/src/benchmarks/gaia-tools/types.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/visit_webpage.d.ts +52 -0
- package/dist/src/benchmarks/gaia-tools/visit_webpage.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/visit_webpage.js +304 -0
- package/dist/src/benchmarks/gaia-tools/visit_webpage.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.d.ts +61 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.js +217 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.d.ts +26 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.js +152 -0
- package/dist/src/benchmarks/gaia-tools/web_browse.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_search.d.ts +30 -0
- package/dist/src/benchmarks/gaia-tools/web_search.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_search.js +210 -0
- package/dist/src/benchmarks/gaia-tools/web_search.js.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.d.ts +24 -0
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.js +311 -0
- package/dist/src/benchmarks/gaia-tools/web_search.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.d.ts +25 -0
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.js +304 -0
- package/dist/src/benchmarks/gaia-visit-webpage.smoke.js.map +1 -0
- package/dist/src/benchmarks/gaia-voting.d.ts +88 -0
- package/dist/src/benchmarks/gaia-voting.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-voting.js +297 -0
- package/dist/src/benchmarks/gaia-voting.js.map +1 -0
- package/dist/src/benchmarks/gaia-voting.smoke.d.ts +20 -0
- package/dist/src/benchmarks/gaia-voting.smoke.d.ts.map +1 -0
- package/dist/src/benchmarks/gaia-voting.smoke.js +332 -0
- package/dist/src/benchmarks/gaia-voting.smoke.js.map +1 -0
- package/dist/src/commands/gaia-bench.d.ts +40 -0
- package/dist/src/commands/gaia-bench.d.ts.map +1 -0
- package/dist/src/commands/gaia-bench.js +597 -0
- package/dist/src/commands/gaia-bench.js.map +1 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +2 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +41 -4
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/performance-capability.d.ts +30 -0
- package/dist/src/commands/performance-capability.d.ts.map +1 -0
- package/dist/src/commands/performance-capability.js +349 -0
- package/dist/src/commands/performance-capability.js.map +1 -0
- package/dist/src/commands/route.d.ts.map +1 -1
- package/dist/src/commands/route.js +9 -0
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +25 -6
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/mcp-generator.d.ts.map +1 -1
- package/dist/src/init/mcp-generator.js +9 -4
- package/dist/src/init/mcp-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +25 -2
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.js +20 -3
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +12 -1
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts.map +1 -1
- package/dist/src/memory/memory-bridge.js +34 -0
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smoke tests for visit_webpage — iter-57
|
|
3
|
+
*
|
|
4
|
+
* Tests the upgraded visit_webpage implementation WITHOUT making live HTTP calls.
|
|
5
|
+
* All fixtures use visitWebpageTestHooks.fetchHtml to inject canned HTML.
|
|
6
|
+
*
|
|
7
|
+
* Test fixtures:
|
|
8
|
+
* 1. Plain HTML article — expects >500 chars, non-empty title
|
|
9
|
+
* 2. Wikipedia-style page — expects infobox text extracted, links present
|
|
10
|
+
* 3. JS-heavy minimal shell — falls back to regex, still returns something
|
|
11
|
+
* 4. max_chars truncation — capped at 500 chars via parameter
|
|
12
|
+
* 5. PDF URL (rejection) — graceful error message, not a throw to agent
|
|
13
|
+
* 6. Invalid URL — validation rejects before fetch
|
|
14
|
+
* 7. Link extraction — up to 30 links extracted from anchor tags
|
|
15
|
+
* 8. extractTextFromHtml — direct test of the regex fallback path
|
|
16
|
+
*
|
|
17
|
+
* Run (after build):
|
|
18
|
+
* node dist/src/benchmarks/gaia-visit-webpage.smoke.js
|
|
19
|
+
*
|
|
20
|
+
* Exit 0 on all pass, 1 on any failure.
|
|
21
|
+
*
|
|
22
|
+
* Refs: ADR-138, iter-57, #2156
|
|
23
|
+
*/
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Imports — dynamic to support both tsx (source) and compiled JS at runtime
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
let _visitWebpage;
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
+
let _visitWebpageTestHooks;
|
|
31
|
+
let _createVisitWebpageTool;
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
33
|
+
let _extractTextViaRegex;
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Fixture HTML
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
const PLAIN_ARTICLE_HTML = `<!DOCTYPE html>
|
|
38
|
+
<html><head><title>The Life of Ada Lovelace</title></head>
|
|
39
|
+
<body>
|
|
40
|
+
<header><nav>Home | About | Contact</nav></header>
|
|
41
|
+
<main>
|
|
42
|
+
<article>
|
|
43
|
+
<h1>Ada Lovelace: The First Programmer</h1>
|
|
44
|
+
<p>Augusta Ada King, Countess of Lovelace, was an English mathematician and writer, chiefly known
|
|
45
|
+
for her work on Charles Babbage's proposed mechanical general-purpose computer, the Analytical Engine.</p>
|
|
46
|
+
<p>She was the first to recognise that the machine had applications beyond pure calculation, and to have
|
|
47
|
+
published the first algorithm intended to be carried out by such a machine. As a result, she is often
|
|
48
|
+
regarded as the first computer programmer.</p>
|
|
49
|
+
<p>Born on 10 December 1815, Ada was the only legitimate child of the poet Lord Byron and his wife
|
|
50
|
+
Lady Byron. All of Byron's other children were born out of wedlock to other women.</p>
|
|
51
|
+
<p>She died on 27 November 1852, at the age of 36, from what was probably uterine cancer. She was
|
|
52
|
+
buried at the Church of St. Mary Magdalene in Hucknall, Nottinghamshire.</p>
|
|
53
|
+
</article>
|
|
54
|
+
</main>
|
|
55
|
+
<footer>Copyright 2026. All rights reserved.</footer>
|
|
56
|
+
</body></html>`;
|
|
57
|
+
const WIKIPEDIA_STYLE_HTML = `<!DOCTYPE html>
|
|
58
|
+
<html><head><title>Charles Babbage - Wikipedia</title></head>
|
|
59
|
+
<body>
|
|
60
|
+
<div id="mw-content-text">
|
|
61
|
+
<table class="infobox">
|
|
62
|
+
<tr><th>Born</th><td>26 December 1791, London</td></tr>
|
|
63
|
+
<tr><th>Died</th><td>18 October 1871 (aged 79), London</td></tr>
|
|
64
|
+
<tr><th>Nationality</th><td>British</td></tr>
|
|
65
|
+
</table>
|
|
66
|
+
<p>Charles Babbage KH FRS was an English polymath. A mathematician, philosopher, inventor and
|
|
67
|
+
mechanical engineer, Babbage originated the concept of a digital programmable computer.</p>
|
|
68
|
+
<p>He invented the Difference Engine and conceived the Analytical Engine — precursors to the modern
|
|
69
|
+
computer. His work on the Analytical Engine influenced Ada Lovelace, who wrote the first published
|
|
70
|
+
algorithm for it.</p>
|
|
71
|
+
</div>
|
|
72
|
+
<div id="toc"><a href="#history">History</a><a href="#legacy">Legacy</a></div>
|
|
73
|
+
</body></html>`;
|
|
74
|
+
const JS_HEAVY_SHELL_HTML = `<!DOCTYPE html>
|
|
75
|
+
<html><head><title>React App</title></head>
|
|
76
|
+
<body>
|
|
77
|
+
<div id="root"></div>
|
|
78
|
+
<script>!function(e){function r(r){for(var n,i,s=r[0],l=r[1]}window.__WEBPACK_MODULES__={};</script>
|
|
79
|
+
</body></html>`;
|
|
80
|
+
const LINKS_HTML = `<!DOCTYPE html>
|
|
81
|
+
<html><head><title>Links Test Page</title></head>
|
|
82
|
+
<body>
|
|
83
|
+
<p>See <a href="https://example.com/article1">Article One</a> for details.</p>
|
|
84
|
+
<p>Also check <a href="https://example.com/article2">Article Two</a> and
|
|
85
|
+
<a href="https://wikipedia.org/wiki/Test">Wikipedia Test</a>.</p>
|
|
86
|
+
<p><a href="javascript:void(0)">Bad link</a> should be excluded.</p>
|
|
87
|
+
<p><a href="mailto:test@example.com">Email</a> should be excluded.</p>
|
|
88
|
+
<p>Another <a href="/relative/path">Relative link</a> should resolve.</p>
|
|
89
|
+
<p>Content text here to ensure non-empty output for the test to pass.</p>
|
|
90
|
+
</body></html>`;
|
|
91
|
+
function assert(cond, msg) {
|
|
92
|
+
if (!cond)
|
|
93
|
+
throw new Error(`Assertion failed: ${msg}`);
|
|
94
|
+
}
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
// Tests
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
const TESTS = [
|
|
99
|
+
// -------------------------------------------------------------------------
|
|
100
|
+
// Test 1: Plain HTML article — primary path
|
|
101
|
+
// -------------------------------------------------------------------------
|
|
102
|
+
{
|
|
103
|
+
label: 'T1: plain HTML article — >500 chars, non-empty title',
|
|
104
|
+
async run() {
|
|
105
|
+
_visitWebpageTestHooks.fetchHtml = async (_url) => ({
|
|
106
|
+
html: PLAIN_ARTICLE_HTML,
|
|
107
|
+
finalUrl: 'https://example.com/ada-lovelace',
|
|
108
|
+
});
|
|
109
|
+
const result = await _visitWebpage('https://example.com/ada-lovelace', 50_000);
|
|
110
|
+
assert(result.title === 'The Life of Ada Lovelace', `Expected title, got "${result.title}"`);
|
|
111
|
+
assert(result.content.length > 500, `Content too short: ${result.content.length} chars`);
|
|
112
|
+
assert(!result.truncated, 'Should not be truncated');
|
|
113
|
+
assert(result.sources_consulted.includes('https://example.com/ada-lovelace'), 'URL in sources');
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
// -------------------------------------------------------------------------
|
|
117
|
+
// Test 2: Wikipedia-style page — infobox text + links
|
|
118
|
+
// -------------------------------------------------------------------------
|
|
119
|
+
{
|
|
120
|
+
label: 'T2: Wikipedia-style page — infobox and body text extracted',
|
|
121
|
+
async run() {
|
|
122
|
+
_visitWebpageTestHooks.fetchHtml = async (_url) => ({
|
|
123
|
+
html: WIKIPEDIA_STYLE_HTML,
|
|
124
|
+
finalUrl: 'https://en.wikipedia.org/wiki/Charles_Babbage',
|
|
125
|
+
});
|
|
126
|
+
const result = await _visitWebpage('https://en.wikipedia.org/wiki/Charles_Babbage', 50_000);
|
|
127
|
+
assert(result.title === 'Charles Babbage - Wikipedia', `Title: ${result.title}`);
|
|
128
|
+
assert(result.content.length > 200, `Content too short: ${result.content.length}`);
|
|
129
|
+
// Content must contain some of the article text
|
|
130
|
+
assert(result.content.includes('Babbage') || result.content.includes('Difference Engine'), `Expected article text, got: ${result.content.slice(0, 200)}`);
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
// -------------------------------------------------------------------------
|
|
134
|
+
// Test 3: JS-heavy shell — falls back to regex, still returns something
|
|
135
|
+
// -------------------------------------------------------------------------
|
|
136
|
+
{
|
|
137
|
+
label: 'T3: JS-heavy shell — fallback extracts non-empty content',
|
|
138
|
+
async run() {
|
|
139
|
+
_visitWebpageTestHooks.fetchHtml = async (_url) => ({
|
|
140
|
+
html: JS_HEAVY_SHELL_HTML,
|
|
141
|
+
finalUrl: 'https://spa-app.example.com',
|
|
142
|
+
});
|
|
143
|
+
const tool = _createVisitWebpageTool();
|
|
144
|
+
// For JS-heavy pages, Python bs4 will extract the title at minimum.
|
|
145
|
+
// The tool should return a non-throwing response.
|
|
146
|
+
let output;
|
|
147
|
+
try {
|
|
148
|
+
output = await tool.execute({ url: 'https://spa-app.example.com' });
|
|
149
|
+
// Either returns content or the "no readable text" message — both are OK
|
|
150
|
+
assert(typeof output === 'string' && output.length > 0, 'Must return non-empty string');
|
|
151
|
+
assert(!output.toLowerCase().includes('error'), `Unexpected error in output: ${output.slice(0, 100)}`);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
throw new Error(`T3 threw unexpectedly: ${String(err)}`);
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
// -------------------------------------------------------------------------
|
|
159
|
+
// Test 4: max_chars truncation
|
|
160
|
+
// -------------------------------------------------------------------------
|
|
161
|
+
{
|
|
162
|
+
label: 'T4: max_chars truncation — content capped at 500',
|
|
163
|
+
async run() {
|
|
164
|
+
_visitWebpageTestHooks.fetchHtml = async (_url) => ({
|
|
165
|
+
html: PLAIN_ARTICLE_HTML,
|
|
166
|
+
finalUrl: 'https://example.com/ada-lovelace',
|
|
167
|
+
});
|
|
168
|
+
const result = await _visitWebpage('https://example.com/ada-lovelace', 500);
|
|
169
|
+
assert(result.truncated, 'Expected truncated=true');
|
|
170
|
+
assert(result.chars_returned <= 500, `chars_returned=${result.chars_returned} > 500`);
|
|
171
|
+
assert(result.content.length <= 500, `content.length=${result.content.length} > 500`);
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
// -------------------------------------------------------------------------
|
|
175
|
+
// Test 5: PDF URL — graceful error, not throw to agent
|
|
176
|
+
// -------------------------------------------------------------------------
|
|
177
|
+
{
|
|
178
|
+
label: 'T5: PDF URL — graceful error message returned',
|
|
179
|
+
async run() {
|
|
180
|
+
// Simulate what fetchPage would throw for a PDF
|
|
181
|
+
_visitWebpageTestHooks.fetchHtml = async (_url) => {
|
|
182
|
+
throw new Error('visit_webpage: URL returns a PDF. Use file_read with the downloaded path instead. URL: https://example.com/doc.pdf');
|
|
183
|
+
};
|
|
184
|
+
const tool = _createVisitWebpageTool();
|
|
185
|
+
let output;
|
|
186
|
+
try {
|
|
187
|
+
// The tool.execute should propagate the throw — the agent loop catches it
|
|
188
|
+
await tool.execute({ url: 'https://example.com/doc.pdf' });
|
|
189
|
+
throw new Error('T5: Expected tool to throw for PDF URL');
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
const msg = String(err);
|
|
193
|
+
assert(msg.includes('PDF') || msg.includes('visit_webpage'), `Error should mention PDF: ${msg}`);
|
|
194
|
+
output = msg;
|
|
195
|
+
}
|
|
196
|
+
assert(output.length > 0, 'Should have error message');
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
// -------------------------------------------------------------------------
|
|
200
|
+
// Test 6: Invalid URL — validation rejects
|
|
201
|
+
// -------------------------------------------------------------------------
|
|
202
|
+
{
|
|
203
|
+
label: 'T6: invalid URL — validation error thrown',
|
|
204
|
+
async run() {
|
|
205
|
+
const tool = _createVisitWebpageTool();
|
|
206
|
+
try {
|
|
207
|
+
await tool.execute({ url: 'not-a-url' });
|
|
208
|
+
throw new Error('T6: Expected validation error');
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
const msg = String(err);
|
|
212
|
+
assert(msg.includes('visit_webpage') && (msg.includes('URL') || msg.includes('url')), `Expected validation error, got: ${msg}`);
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
// -------------------------------------------------------------------------
|
|
217
|
+
// Test 7: Link extraction
|
|
218
|
+
// -------------------------------------------------------------------------
|
|
219
|
+
{
|
|
220
|
+
label: 'T7: link extraction — absolute and relative links extracted',
|
|
221
|
+
async run() {
|
|
222
|
+
_visitWebpageTestHooks.fetchHtml = async (_url) => ({
|
|
223
|
+
html: LINKS_HTML,
|
|
224
|
+
finalUrl: 'https://example.com/page',
|
|
225
|
+
});
|
|
226
|
+
const result = await _visitWebpage('https://example.com/page', 50_000);
|
|
227
|
+
assert(result.links.length >= 3, `Expected ≥3 links, got ${result.links.length}: ${JSON.stringify(result.links)}`);
|
|
228
|
+
const hrefs = result.links.map((l) => l.href);
|
|
229
|
+
assert(hrefs.some((h) => h.includes('article1')), 'Missing article1 link');
|
|
230
|
+
assert(hrefs.some((h) => h.includes('article2')), 'Missing article2 link');
|
|
231
|
+
assert(hrefs.some((h) => h.includes('wikipedia')), 'Missing wikipedia link');
|
|
232
|
+
// javascript: and mailto: links must be excluded
|
|
233
|
+
assert(!hrefs.some((h) => h.startsWith('javascript:')), 'javascript: link must be excluded');
|
|
234
|
+
assert(!hrefs.some((h) => h.startsWith('mailto:')), 'mailto: link must be excluded');
|
|
235
|
+
// Link text must be non-empty
|
|
236
|
+
for (const link of result.links) {
|
|
237
|
+
assert(link.text.length > 0, `Link with empty text: ${JSON.stringify(link)}`);
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
// -------------------------------------------------------------------------
|
|
242
|
+
// Test 8: redirect tracking
|
|
243
|
+
// -------------------------------------------------------------------------
|
|
244
|
+
{
|
|
245
|
+
label: 'T8: redirect tracking — sources_consulted includes both URLs',
|
|
246
|
+
async run() {
|
|
247
|
+
_visitWebpageTestHooks.fetchHtml = async (_url) => ({
|
|
248
|
+
html: PLAIN_ARTICLE_HTML,
|
|
249
|
+
finalUrl: 'https://example.com/redirected-page',
|
|
250
|
+
});
|
|
251
|
+
const result = await _visitWebpage('https://example.com/original', 50_000);
|
|
252
|
+
assert(result.sources_consulted.includes('https://example.com/original'), 'sources_consulted missing original URL');
|
|
253
|
+
assert(result.sources_consulted.includes('https://example.com/redirected-page'), 'sources_consulted missing final URL');
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
];
|
|
257
|
+
// ---------------------------------------------------------------------------
|
|
258
|
+
// Runner
|
|
259
|
+
// ---------------------------------------------------------------------------
|
|
260
|
+
async function main() {
|
|
261
|
+
const mod = await import('./gaia-tools/index.js');
|
|
262
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
263
|
+
const m = mod;
|
|
264
|
+
_visitWebpage = m.visitWebpage;
|
|
265
|
+
_visitWebpageTestHooks = m.visitWebpageTestHooks;
|
|
266
|
+
_createVisitWebpageTool = m.createVisitWebpageTool;
|
|
267
|
+
if (typeof _visitWebpage !== 'function') {
|
|
268
|
+
console.error('ERROR: visitWebpage not exported from gaia-tools/index.\n' +
|
|
269
|
+
'Add `export { visitWebpage, visitWebpageTestHooks } from ./visit_webpage.js` to index.ts.');
|
|
270
|
+
process.exit(1);
|
|
271
|
+
}
|
|
272
|
+
if (!_visitWebpageTestHooks || typeof _visitWebpageTestHooks !== 'object') {
|
|
273
|
+
console.error('ERROR: visitWebpageTestHooks not exported from gaia-tools/index.');
|
|
274
|
+
process.exit(1);
|
|
275
|
+
}
|
|
276
|
+
const PASS = '\x1b[32mPASS\x1b[0m';
|
|
277
|
+
const FAIL = '\x1b[31mFAIL\x1b[0m';
|
|
278
|
+
let failures = 0;
|
|
279
|
+
console.log('\n=== gaia-visit-webpage smoke (iter-57) ===\n');
|
|
280
|
+
for (const tc of TESTS) {
|
|
281
|
+
// Reset test hooks before each test
|
|
282
|
+
_visitWebpageTestHooks.fetchHtml = undefined;
|
|
283
|
+
try {
|
|
284
|
+
await tc.run();
|
|
285
|
+
console.log(` ${PASS} ${tc.label}`);
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
console.log(` ${FAIL} ${tc.label}`);
|
|
289
|
+
console.log(` ${String(err)}`);
|
|
290
|
+
failures++;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
const total = TESTS.length;
|
|
294
|
+
const passed = total - failures;
|
|
295
|
+
console.log(`\n=== ${failures === 0 ? 'ALL PASSED' : `${failures} FAILED`} (${passed}/${total} cases) ===\n`);
|
|
296
|
+
if (failures > 0)
|
|
297
|
+
process.exit(1);
|
|
298
|
+
}
|
|
299
|
+
main().catch((err) => {
|
|
300
|
+
console.error('Smoke crashed:', err);
|
|
301
|
+
process.exit(2);
|
|
302
|
+
});
|
|
303
|
+
export {};
|
|
304
|
+
//# sourceMappingURL=gaia-visit-webpage.smoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gaia-visit-webpage.smoke.js","sourceRoot":"","sources":["../../../src/benchmarks/gaia-visit-webpage.smoke.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GAIA Voting — ADR-135 Track A
|
|
3
|
+
*
|
|
4
|
+
* Multi-attempt self-consistency voting wrapper around `runGaiaAgent`.
|
|
5
|
+
*
|
|
6
|
+
* Algorithm:
|
|
7
|
+
* 1. Spawn N parallel `runGaiaAgent` calls, each with a distinct system-prompt
|
|
8
|
+
* seed (web-first / code-first / cautious) and varied temperature (0.3/0.5/0.7).
|
|
9
|
+
* 2. Collect all N final answers; filter out nulls.
|
|
10
|
+
* 3. Normalize each answer: lowercase, trim, strip punctuation, normalize numbers.
|
|
11
|
+
* 4. Count by normalized value; the highest-count non-null wins (majority vote).
|
|
12
|
+
* 5. Tie-break: pick the attempt whose normalized answer won and has the lowest
|
|
13
|
+
* error count (null/timed-out attempts score worst).
|
|
14
|
+
* 6. All-disagree: pick the attempt with the lowest error/timeout count.
|
|
15
|
+
* 7. All null: return null answer.
|
|
16
|
+
*
|
|
17
|
+
* Diversification system-prompt seeds (one per attempt, cycling if N > 3):
|
|
18
|
+
* - "web-first" — prefer web_search before reasoning
|
|
19
|
+
* - "code-first" — prefer code_exec/calculator before web
|
|
20
|
+
* - "cautious" — step-by-step, verify each sub-claim before answering
|
|
21
|
+
*
|
|
22
|
+
* Temperature schedule (cycling if N > 3):
|
|
23
|
+
* - attempt 0: 0.3 (conservative)
|
|
24
|
+
* - attempt 1: 0.5 (balanced)
|
|
25
|
+
* - attempt 2: 0.7 (exploratory)
|
|
26
|
+
*
|
|
27
|
+
* Expected L1 lift per ADR-135: +5-10pp.
|
|
28
|
+
* Cost: N× per question (default N=3 → ~3× per question).
|
|
29
|
+
*
|
|
30
|
+
* Refs: ADR-135, ADR-133, #2156
|
|
31
|
+
*/
|
|
32
|
+
import { type GaiaAgentResult } from './gaia-agent.js';
|
|
33
|
+
import type { GaiaQuestion } from './gaia-loader.js';
|
|
34
|
+
export interface VotingResult extends GaiaAgentResult {
|
|
35
|
+
/** All individual attempt results (includes failed/null attempts). */
|
|
36
|
+
attempts: GaiaAgentResult[];
|
|
37
|
+
/**
|
|
38
|
+
* How the winner was decided:
|
|
39
|
+
* - 'majority' — at least 2 attempts agreed on the winning answer
|
|
40
|
+
* - 'highest-confidence' — all attempts disagreed; winner had fewest errors/timeouts
|
|
41
|
+
* - 'all-disagree-retry' — all non-null attempts gave different answers (same as highest-confidence)
|
|
42
|
+
* - 'sole-survivor' — only one non-null attempt; used directly
|
|
43
|
+
*/
|
|
44
|
+
votingMethod: 'majority' | 'highest-confidence' | 'all-disagree-retry' | 'sole-survivor';
|
|
45
|
+
/** How many attempts produced the winning (normalized) answer. */
|
|
46
|
+
agreementCount: number;
|
|
47
|
+
}
|
|
48
|
+
export interface VotingOptions {
|
|
49
|
+
/** Number of parallel attempts (default: 3). */
|
|
50
|
+
attempts?: number;
|
|
51
|
+
/**
|
|
52
|
+
* Optional custom system-prompt seed overrides per attempt (index-aligned).
|
|
53
|
+
* Defaults to cycling through STRATEGY_SEEDS.
|
|
54
|
+
*/
|
|
55
|
+
diversityPromptSeeds?: string[];
|
|
56
|
+
/**
|
|
57
|
+
* Number of attempts to run in parallel (default: attempts — full parallel).
|
|
58
|
+
* Values < attempts cause sequential batches (useful for rate-limit avoidance).
|
|
59
|
+
*/
|
|
60
|
+
parallelism?: number;
|
|
61
|
+
/** Model ID (default: 'claude-haiku-4-5'). */
|
|
62
|
+
model?: string;
|
|
63
|
+
/** Max agent turns per attempt (default: 8). */
|
|
64
|
+
maxTurns?: number;
|
|
65
|
+
/** Anthropic API key (resolved automatically if omitted). */
|
|
66
|
+
apiKey?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Normalize a raw answer string for voting comparison.
|
|
70
|
+
*
|
|
71
|
+
* Steps:
|
|
72
|
+
* 1. Lowercase + trim.
|
|
73
|
+
* 2. Collapse internal whitespace.
|
|
74
|
+
* 3. Strip leading/trailing punctuation (commas, periods, quotes, etc.).
|
|
75
|
+
* 4. Normalize numeric representations: "1,234" → "1234", "1.0" → "1",
|
|
76
|
+
* "1.50" → "1.5".
|
|
77
|
+
*/
|
|
78
|
+
export declare function normalizeAnswer(raw: string): string;
|
|
79
|
+
/**
|
|
80
|
+
* Run a GAIA question N times in parallel with diversified strategies,
|
|
81
|
+
* then majority-vote on the answer.
|
|
82
|
+
*
|
|
83
|
+
* @param question The GAIA question to answer.
|
|
84
|
+
* @param options Voting + agent options.
|
|
85
|
+
* @returns VotingResult containing the winning answer and all attempt traces.
|
|
86
|
+
*/
|
|
87
|
+
export declare function runGaiaAgentWithVoting(question: GaiaQuestion, options?: VotingOptions): Promise<VotingResult>;
|
|
88
|
+
//# sourceMappingURL=gaia-voting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gaia-voting.d.ts","sourceRoot":"","sources":["../../../src/benchmarks/gaia-voting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAEL,KAAK,eAAe,EAGrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAqBrD,MAAM,WAAW,YAAa,SAAQ,eAAe;IACnD,sEAAsE;IACtE,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B;;;;;;OAMG;IACH,YAAY,EAAE,UAAU,GAAG,oBAAoB,GAAG,oBAAoB,GAAG,eAAe,CAAC;IACzF,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAqBnD;AAwFD;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA0IvB"}
|