appium-mcp 1.82.2 → 1.84.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -0
  3. package/dist/create-server.d.ts.map +1 -1
  4. package/dist/create-server.js +4 -0
  5. package/dist/create-server.js.map +1 -1
  6. package/dist/server.d.ts.map +1 -1
  7. package/dist/server.js +7 -4
  8. package/dist/server.js.map +1 -1
  9. package/dist/tests/create-server.test.js +8 -0
  10. package/dist/tests/create-server.test.js.map +1 -1
  11. package/dist/tests/tools/evidence.test.d.ts +2 -0
  12. package/dist/tests/tools/evidence.test.d.ts.map +1 -0
  13. package/dist/tests/tools/evidence.test.js +158 -0
  14. package/dist/tests/tools/evidence.test.js.map +1 -0
  15. package/dist/tests/utils/paths.test.js +5 -6
  16. package/dist/tests/utils/paths.test.js.map +1 -1
  17. package/dist/tools/evidence.d.ts +82 -0
  18. package/dist/tools/evidence.d.ts.map +1 -0
  19. package/dist/tools/evidence.js +124 -0
  20. package/dist/tools/evidence.js.map +1 -0
  21. package/dist/tools/gestures/gesture.d.ts.map +1 -1
  22. package/dist/tools/gestures/gesture.js +47 -25
  23. package/dist/tools/gestures/gesture.js.map +1 -1
  24. package/dist/tools/interactions/find.d.ts.map +1 -1
  25. package/dist/tools/interactions/find.js +27 -4
  26. package/dist/tools/interactions/find.js.map +1 -1
  27. package/package.json +8 -19
  28. package/server.json +2 -2
  29. package/src/create-server.ts +4 -0
  30. package/src/server.ts +9 -4
  31. package/src/tools/evidence.ts +198 -0
  32. package/src/tools/gestures/gesture.ts +63 -26
  33. package/src/tools/interactions/find.ts +40 -6
  34. package/dist/scripts/eval-documentation-rag.d.ts +0 -50
  35. package/dist/scripts/eval-documentation-rag.d.ts.map +0 -1
  36. package/dist/scripts/eval-documentation-rag.js +0 -287
  37. package/dist/scripts/eval-documentation-rag.js.map +0 -1
  38. package/dist/scripts/generate-embeddings-cache.d.ts +0 -13
  39. package/dist/scripts/generate-embeddings-cache.d.ts.map +0 -1
  40. package/dist/scripts/generate-embeddings-cache.js +0 -24
  41. package/dist/scripts/generate-embeddings-cache.js.map +0 -1
  42. package/dist/scripts/rag-eval-dataset.json +0 -516
  43. package/dist/scripts/simple-index-documentation.d.ts +0 -21
  44. package/dist/scripts/simple-index-documentation.d.ts.map +0 -1
  45. package/dist/scripts/simple-index-documentation.js +0 -77
  46. package/dist/scripts/simple-index-documentation.js.map +0 -1
  47. package/dist/scripts/simple-query-documentation.d.ts +0 -13
  48. package/dist/scripts/simple-query-documentation.d.ts.map +0 -1
  49. package/dist/scripts/simple-query-documentation.js +0 -52
  50. package/dist/scripts/simple-query-documentation.js.map +0 -1
  51. package/dist/tests/tools/documentation/appium-skills.test.d.ts +0 -2
  52. package/dist/tests/tools/documentation/appium-skills.test.d.ts.map +0 -1
  53. package/dist/tests/tools/documentation/appium-skills.test.js +0 -106
  54. package/dist/tests/tools/documentation/appium-skills.test.js.map +0 -1
  55. package/dist/tests/tools/documentation/plugin.test.d.ts +0 -2
  56. package/dist/tests/tools/documentation/plugin.test.d.ts.map +0 -1
  57. package/dist/tests/tools/documentation/plugin.test.js +0 -34
  58. package/dist/tests/tools/documentation/plugin.test.js.map +0 -1
  59. package/dist/tests/tools/documentation/simple-pdf-indexer.test.d.ts +0 -2
  60. package/dist/tests/tools/documentation/simple-pdf-indexer.test.d.ts.map +0 -1
  61. package/dist/tests/tools/documentation/simple-pdf-indexer.test.js +0 -46
  62. package/dist/tests/tools/documentation/simple-pdf-indexer.test.js.map +0 -1
  63. package/dist/tools/documentation/answer-appium.d.ts +0 -8
  64. package/dist/tools/documentation/answer-appium.d.ts.map +0 -1
  65. package/dist/tools/documentation/answer-appium.js +0 -38
  66. package/dist/tools/documentation/answer-appium.js.map +0 -1
  67. package/dist/tools/documentation/appium-skills.d.ts +0 -5
  68. package/dist/tools/documentation/appium-skills.d.ts.map +0 -1
  69. package/dist/tools/documentation/appium-skills.js +0 -168
  70. package/dist/tools/documentation/appium-skills.js.map +0 -1
  71. package/dist/tools/documentation/index.d.ts +0 -29
  72. package/dist/tools/documentation/index.d.ts.map +0 -1
  73. package/dist/tools/documentation/index.js +0 -66
  74. package/dist/tools/documentation/index.js.map +0 -1
  75. package/dist/tools/documentation/markdown-header-splitter.d.ts +0 -32
  76. package/dist/tools/documentation/markdown-header-splitter.d.ts.map +0 -1
  77. package/dist/tools/documentation/markdown-header-splitter.js +0 -180
  78. package/dist/tools/documentation/markdown-header-splitter.js.map +0 -1
  79. package/dist/tools/documentation/plugin.d.ts +0 -14
  80. package/dist/tools/documentation/plugin.d.ts.map +0 -1
  81. package/dist/tools/documentation/plugin.js +0 -19
  82. package/dist/tools/documentation/plugin.js.map +0 -1
  83. package/dist/tools/documentation/reasoning-rag.d.ts +0 -89
  84. package/dist/tools/documentation/reasoning-rag.d.ts.map +0 -1
  85. package/dist/tools/documentation/reasoning-rag.js +0 -282
  86. package/dist/tools/documentation/reasoning-rag.js.map +0 -1
  87. package/dist/tools/documentation/sentence-transformers-embeddings.d.ts +0 -40
  88. package/dist/tools/documentation/sentence-transformers-embeddings.d.ts.map +0 -1
  89. package/dist/tools/documentation/sentence-transformers-embeddings.js +0 -119
  90. package/dist/tools/documentation/sentence-transformers-embeddings.js.map +0 -1
  91. package/dist/tools/documentation/simple-pdf-indexer.d.ts +0 -47
  92. package/dist/tools/documentation/simple-pdf-indexer.d.ts.map +0 -1
  93. package/dist/tools/documentation/simple-pdf-indexer.js +0 -572
  94. package/dist/tools/documentation/simple-pdf-indexer.js.map +0 -1
  95. package/dist/tools/documentation/uploads/documents.json +0 -1
  96. package/dist/tools/documentation/uploads/embeddings-Xenova-bge-small-en-v1.5.json +0 -1
  97. package/scripts/setup-submodules-sparse.sh +0 -53
  98. package/scripts/update-submodules.sh +0 -14
  99. package/scripts/zip-assets.mjs +0 -55
  100. package/src/resources/submodules.zip +0 -0
  101. package/src/scripts/eval-documentation-rag.ts +0 -433
  102. package/src/scripts/generate-embeddings-cache.ts +0 -24
  103. package/src/scripts/rag-eval-dataset.json +0 -516
  104. package/src/scripts/simple-index-documentation.ts +0 -93
  105. package/src/scripts/simple-query-documentation.ts +0 -61
  106. package/src/tools/documentation/answer-appium.ts +0 -47
  107. package/src/tools/documentation/appium-skills.ts +0 -244
  108. package/src/tools/documentation/index.ts +0 -99
  109. package/src/tools/documentation/markdown-header-splitter.ts +0 -209
  110. package/src/tools/documentation/plugin.ts +0 -21
  111. package/src/tools/documentation/reasoning-rag.ts +0 -438
  112. package/src/tools/documentation/sentence-transformers-embeddings.ts +0 -152
  113. package/src/tools/documentation/simple-pdf-indexer.ts +0 -755
  114. package/src/tools/documentation/uploads/documents.json +0 -1
@@ -7,6 +7,7 @@ import {
7
7
  toolErrorMessage,
8
8
  readWebElementId,
9
9
  } from '../tool-response.js';
10
+ import { withEvidence, evidenceContext } from '../evidence.js';
10
11
 
11
12
  export const findElementSchema = z.object({
12
13
  strategy: z
@@ -74,19 +75,52 @@ export default function findElement(server: FastMCP): void {
74
75
  }
75
76
  const { driver } = resolved;
76
77
 
78
+ const startedAt = Date.now();
79
+ const locator = { strategy: args.strategy, selector: args.selector };
80
+ const context = await evidenceContext(args.sessionId);
77
81
  try {
78
82
  const element = await driver.findElement(args.strategy, args.selector);
79
83
  const elementId = readWebElementId(element);
80
84
  if (!elementId) {
81
- return errorResult('Element was returned without a valid element ID');
85
+ return withEvidence(
86
+ errorResult('Element was returned without a valid element ID'),
87
+ {
88
+ name: 'appium_find_element',
89
+ stage: 'locate',
90
+ startedAt,
91
+ locator,
92
+ context,
93
+ }
94
+ );
82
95
  }
83
- return textResultWithPrimaryElementId(
84
- elementId,
85
- `Successfully found element ${args.selector} with strategy ${args.strategy}.`
96
+ return withEvidence(
97
+ textResultWithPrimaryElementId(
98
+ elementId,
99
+ `Successfully found element ${args.selector} with strategy ${args.strategy}.`
100
+ ),
101
+ {
102
+ name: 'appium_find_element',
103
+ stage: 'locate',
104
+ startedAt,
105
+ locator,
106
+ element: { webdriverId: elementId },
107
+ context,
108
+ }
86
109
  );
87
110
  } catch (err: unknown) {
88
- const errorMessage = toolErrorMessage(err);
89
- return errorResult(`Failed to find element. Error: ${errorMessage}`);
111
+ return withEvidence(
112
+ errorResult(
113
+ `Failed to find element. Error: ${toolErrorMessage(err)}`
114
+ ),
115
+ {
116
+ name: 'appium_find_element',
117
+ stage: 'locate',
118
+ startedAt,
119
+ locator,
120
+ context,
121
+ error: err,
122
+ }
123
+ );
90
124
  }
91
125
  },
92
126
  });
@@ -1,50 +0,0 @@
1
- /**
2
- * Answer-grounded RAG eval for the Appium documentation tool.
3
- *
4
- * Runs the documentation_query retrieval pipeline against a fixed set of
5
- * realistic queries and asks the only question that matters downstream:
6
- * "did the answer text actually land in the chunks an LLM would see?"
7
- *
8
- * What we measure:
9
- *
10
- * 1. answerSpanRecall@K
11
- * For each query, the dataset declares short verbatim phrases lifted
12
- * from the docs (`answerSpans`). We concatenate the top-K retrieved
13
- * chunks and check what fraction of the spans appears in that text.
14
- * "anyOf" semantics: a query that finds at least one span counts as a
15
- * hit. Spans are 30-140 chars and chosen so any reasonable chunk
16
- * containing the answer will include them, regardless of chunk
17
- * boundaries -- so the metric is splitter-neutral.
18
- *
19
- * 2. hit@{1,3,5,10}
20
- * Did any chunk at rank <= K carry any answerSpan? Direct measure of
21
- * "does the LLM see the answer" at different context budgets.
22
- *
23
- * 3. MRR
24
- * Mean reciprocal rank of the *first* chunk that carries an answerSpan.
25
- * MRR-equivalent on content, not on file paths -- a chunk from the
26
- * right file but wrong section is worth nothing here.
27
- *
28
- * 4. contextEfficiency
29
- * For queries we hit, 1000 * spansCovered / totalChars(topK). Spans-per-
30
- * kchar density. Low = lots of noise around the answer.
31
- *
32
- * 5. fileRecall@{5,10} (diagnostic only)
33
- * Did the right *file* appear in top-K? Kept so we can spot the
34
- * "right-file wrong-chunk" failure mode (right file present but no
35
- * answerSpan landed).
36
- *
37
- * Match semantics: lowercase + collapse whitespace, then substring check.
38
- *
39
- * Usage (after `npm run build`):
40
- * node dist/scripts/eval-documentation-rag.js \
41
- * [--top-k=10] [--label=NAME] [--quiet] [--no-save]
42
- *
43
- * --top-k=N number of chunks to retrieve & evaluate (default 10)
44
- * --label=N label written into the saved run, useful for comparing
45
- * index variants (e.g. --label=before, --label=after)
46
- * --quiet suppress the per-query log lines and table
47
- * --no-save don't persist results JSON to disk
48
- */
49
- export {};
50
- //# sourceMappingURL=eval-documentation-rag.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eval-documentation-rag.d.ts","sourceRoot":"","sources":["../../src/scripts/eval-documentation-rag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG"}
@@ -1,287 +0,0 @@
1
- /**
2
- * Answer-grounded RAG eval for the Appium documentation tool.
3
- *
4
- * Runs the documentation_query retrieval pipeline against a fixed set of
5
- * realistic queries and asks the only question that matters downstream:
6
- * "did the answer text actually land in the chunks an LLM would see?"
7
- *
8
- * What we measure:
9
- *
10
- * 1. answerSpanRecall@K
11
- * For each query, the dataset declares short verbatim phrases lifted
12
- * from the docs (`answerSpans`). We concatenate the top-K retrieved
13
- * chunks and check what fraction of the spans appears in that text.
14
- * "anyOf" semantics: a query that finds at least one span counts as a
15
- * hit. Spans are 30-140 chars and chosen so any reasonable chunk
16
- * containing the answer will include them, regardless of chunk
17
- * boundaries -- so the metric is splitter-neutral.
18
- *
19
- * 2. hit@{1,3,5,10}
20
- * Did any chunk at rank <= K carry any answerSpan? Direct measure of
21
- * "does the LLM see the answer" at different context budgets.
22
- *
23
- * 3. MRR
24
- * Mean reciprocal rank of the *first* chunk that carries an answerSpan.
25
- * MRR-equivalent on content, not on file paths -- a chunk from the
26
- * right file but wrong section is worth nothing here.
27
- *
28
- * 4. contextEfficiency
29
- * For queries we hit, 1000 * spansCovered / totalChars(topK). Spans-per-
30
- * kchar density. Low = lots of noise around the answer.
31
- *
32
- * 5. fileRecall@{5,10} (diagnostic only)
33
- * Did the right *file* appear in top-K? Kept so we can spot the
34
- * "right-file wrong-chunk" failure mode (right file present but no
35
- * answerSpan landed).
36
- *
37
- * Match semantics: lowercase + collapse whitespace, then substring check.
38
- *
39
- * Usage (after `npm run build`):
40
- * node dist/scripts/eval-documentation-rag.js \
41
- * [--top-k=10] [--label=NAME] [--quiet] [--no-save]
42
- *
43
- * --top-k=N number of chunks to retrieve & evaluate (default 10)
44
- * --label=N label written into the saved run, useful for comparing
45
- * index variants (e.g. --label=before, --label=after)
46
- * --quiet suppress the per-query log lines and table
47
- * --no-save don't persist results JSON to disk
48
- */
49
- import * as fs from 'node:fs';
50
- import * as path from 'node:path';
51
- import { fileURLToPath } from 'node:url';
52
- import { queryVectorStore } from '../tools/documentation/simple-pdf-indexer.js';
53
- // -- arg parsing ----------------------------------------------------------
54
- const __filename = fileURLToPath(import.meta.url);
55
- const __dirname = path.dirname(__filename);
56
- const args = process.argv.slice(2);
57
- const flagSet = new Set(args);
58
- const QUIET = flagSet.has('--quiet');
59
- const NO_SAVE = flagSet.has('--no-save');
60
- function flagValue(name, dflt) {
61
- const a = args.find((x) => x.startsWith(`${name}=`));
62
- return a ? a.split('=').slice(1).join('=') : dflt;
63
- }
64
- const TOP_K = Number(flagValue('--top-k', '10'));
65
- const LABEL = flagValue('--label', 'default');
66
- // -- paths ----------------------------------------------------------------
67
- function resolveDatasetPath() {
68
- const candidates = [
69
- path.resolve(__dirname, 'rag-eval-dataset.json'),
70
- path.resolve(__dirname, '../../src/scripts/rag-eval-dataset.json'),
71
- ];
72
- for (const p of candidates) {
73
- if (fs.existsSync(p)) {
74
- return p;
75
- }
76
- }
77
- throw new Error(`rag-eval-dataset.json not found in: ${candidates.join(', ')}`);
78
- }
79
- function resolveResultsDir() {
80
- const dir = path.resolve(__dirname, '../../src/scripts/eval-results');
81
- fs.mkdirSync(dir, { recursive: true });
82
- return dir;
83
- }
84
- // -- matching helpers -----------------------------------------------------
85
- function normalize(s) {
86
- return s.toLowerCase().replace(/\s+/g, ' ').trim();
87
- }
88
- function chunkContainsSpan(chunkText, span) {
89
- return normalize(chunkText).includes(normalize(span));
90
- }
91
- function endsWithExpected(retrievedRelPath, expected) {
92
- return retrievedRelPath === expected || retrievedRelPath.endsWith(expected);
93
- }
94
- // -- per-query evaluation -------------------------------------------------
95
- function evaluateQuery(q, chunks) {
96
- const hitRanks = [];
97
- const spansCovered = new Set();
98
- for (const chunk of chunks) {
99
- let chunkHadHit = false;
100
- for (const span of q.answerSpans) {
101
- if (chunkContainsSpan(chunk.text, span)) {
102
- spansCovered.add(span);
103
- chunkHadHit = true;
104
- }
105
- }
106
- if (chunkHadHit) {
107
- hitRanks.push(chunk.rank);
108
- }
109
- }
110
- const firstHitRank = hitRanks.length > 0 ? hitRanks[0] : null;
111
- const spansMissing = q.answerSpans.filter((s) => !spansCovered.has(s));
112
- return {
113
- hitRanks,
114
- firstHitRank,
115
- spansCovered: [...spansCovered],
116
- spansMissing,
117
- };
118
- }
119
- // -- aggregation ----------------------------------------------------------
120
- function aggregate(results) {
121
- if (results.length === 0) {
122
- return {
123
- count: 0,
124
- answerSpanRecall: 0,
125
- hitAnyAt1: 0,
126
- hitAnyAt3: 0,
127
- hitAnyAt5: 0,
128
- hitAnyAt10: 0,
129
- mrr: 0,
130
- contextEfficiency: 0,
131
- fileRecallAt5: 0,
132
- fileRecallAt10: 0,
133
- };
134
- }
135
- const n = results.length;
136
- const mean = (xs) => xs.reduce((a, b) => a + b, 0) / xs.length;
137
- const hitResults = results.filter((r) => r.hitAnyAt10 === 1);
138
- return {
139
- count: n,
140
- answerSpanRecall: mean(results.map((r) => r.answerSpanRecall)),
141
- hitAnyAt1: mean(results.map((r) => r.hitAnyAt1)),
142
- hitAnyAt3: mean(results.map((r) => r.hitAnyAt3)),
143
- hitAnyAt5: mean(results.map((r) => r.hitAnyAt5)),
144
- hitAnyAt10: mean(results.map((r) => r.hitAnyAt10)),
145
- mrr: mean(results.map((r) => r.reciprocalRank)),
146
- contextEfficiency: hitResults.length
147
- ? mean(hitResults.map((r) => r.contextEfficiency))
148
- : 0,
149
- fileRecallAt5: mean(results.map((r) => r.fileRecallAt5)),
150
- fileRecallAt10: mean(results.map((r) => r.fileRecallAt10)),
151
- };
152
- }
153
- function fmt(n, dp = 3) {
154
- return n.toFixed(dp);
155
- }
156
- function printAggregate(label, m) {
157
- const tag = `${label} (n=${m.count})`.padEnd(20);
158
- console.log(`${tag} spanRecall=${fmt(m.answerSpanRecall)} hit@1=${fmt(m.hitAnyAt1)} hit@3=${fmt(m.hitAnyAt3)} hit@5=${fmt(m.hitAnyAt5)} hit@10=${fmt(m.hitAnyAt10)} MRR=${fmt(m.mrr)} ctxEff=${fmt(m.contextEfficiency, 2)} fileR@5=${fmt(m.fileRecallAt5)}`);
159
- }
160
- function printPerQueryTable(results) {
161
- const header = 'id | diff | fhr | spans | hit@5 | unique | sources';
162
- const sep = '-'.repeat(110);
163
- console.log(sep);
164
- console.log(header);
165
- console.log(sep);
166
- for (const r of results) {
167
- const fhr = r.firstHitRank === null ? ' - ' : String(r.firstHitRank).padStart(3, ' ');
168
- const spans = `${r.spansCovered.length}/${r.answerSpans.length}`;
169
- const matched = r.retrievedSources[0]
170
- ? r.retrievedSources.slice(0, 2).join(', ')
171
- : '(empty)';
172
- console.log(`${r.id.padEnd(4)} | ${r.difficulty.padEnd(6)} | ${fhr} | ${spans.padEnd(6)} | ${String(r.hitAnyAt5).padEnd(5)} | ${String(r.uniqueFiles).padEnd(6)} | ${matched}`);
173
- }
174
- console.log(sep);
175
- }
176
- // -- main -----------------------------------------------------------------
177
- async function runEval() {
178
- const datasetPath = resolveDatasetPath();
179
- const dataset = JSON.parse(fs.readFileSync(datasetPath, 'utf-8'));
180
- console.log(`\n=== Appium RAG eval (answer-grounded) ===`);
181
- console.log(`Dataset: ${datasetPath}`);
182
- console.log(`Queries: ${dataset.queries.length} topK: ${TOP_K} label: ${LABEL}\n`);
183
- const perQuery = [];
184
- for (const q of dataset.queries) {
185
- const docs = await queryVectorStore(q.query, TOP_K);
186
- const chunks = docs.map((d, i) => ({
187
- rank: i + 1,
188
- text: d.pageContent,
189
- source: d.metadata?.relativePath ??
190
- d.metadata?.filename,
191
- charCount: d.pageContent.length,
192
- }));
193
- const retrievedSources = chunks
194
- .map((c) => c.source)
195
- .filter((s) => !!s);
196
- const topKChars = chunks.reduce((a, c) => a + c.charCount, 0);
197
- const uniqueFiles = new Set(retrievedSources).size;
198
- const { hitRanks, firstHitRank, spansCovered, spansMissing } = evaluateQuery(q, chunks);
199
- const answerSpanRecall = q.answerSpans.length === 0
200
- ? 0
201
- : spansCovered.length / q.answerSpans.length;
202
- const hitAnyAt = (k) => hitRanks.some((r) => r <= k) ? 1 : 0;
203
- const reciprocalRank = firstHitRank ? 1 / firstHitRank : 0;
204
- const contextEfficiency = firstHitRank !== null && topKChars > 0
205
- ? (1000 * spansCovered.length) / topKChars
206
- : 0;
207
- const fileMatched = (k) => {
208
- const top = retrievedSources.slice(0, k);
209
- return top.some((rs) => q.expectedSources.some((es) => endsWithExpected(rs, es)))
210
- ? 1
211
- : 0;
212
- };
213
- perQuery.push({
214
- id: q.id,
215
- query: q.query,
216
- difficulty: q.difficulty,
217
- category: q.category,
218
- expectedSources: q.expectedSources,
219
- answerSpans: q.answerSpans,
220
- retrievedSources,
221
- topKChunks: chunks.length,
222
- topKChars,
223
- uniqueFiles,
224
- hitRanks,
225
- firstHitRank,
226
- spansCovered,
227
- spansMissing,
228
- answerSpanRecall,
229
- hitAnyAt1: hitAnyAt(1),
230
- hitAnyAt3: hitAnyAt(3),
231
- hitAnyAt5: hitAnyAt(5),
232
- hitAnyAt10: hitAnyAt(10),
233
- reciprocalRank,
234
- contextEfficiency,
235
- fileRecallAt5: fileMatched(5),
236
- fileRecallAt10: fileMatched(10),
237
- });
238
- if (!QUIET) {
239
- const status = hitAnyAt(5) ? 'OK' : 'MISS';
240
- console.log(`${status.padEnd(4)} ${q.id} spans=${spansCovered.length}/${q.answerSpans.length} fhr=${firstHitRank ?? '-'}`);
241
- }
242
- }
243
- if (!QUIET) {
244
- printPerQueryTable(perQuery);
245
- }
246
- const overall = aggregate(perQuery);
247
- const byDifficulty = {};
248
- for (const d of ['easy', 'medium', 'vague']) {
249
- byDifficulty[d] = aggregate(perQuery.filter((r) => r.difficulty === d));
250
- }
251
- console.log('');
252
- printAggregate('overall', overall);
253
- for (const d of ['easy', 'medium', 'vague']) {
254
- printAggregate(d, byDifficulty[d]);
255
- }
256
- console.log('');
257
- if (!NO_SAVE) {
258
- const run = {
259
- timestamp: new Date().toISOString(),
260
- label: LABEL,
261
- datasetVersion: dataset.version,
262
- topK: TOP_K,
263
- overall,
264
- byDifficulty,
265
- perQuery,
266
- };
267
- const dir = resolveResultsDir();
268
- const stamp = run.timestamp.replace(/[:.]/g, '-');
269
- const outPath = path.join(dir, `${LABEL}-${stamp}.json`);
270
- const labelLatestPath = path.join(dir, `${LABEL}-latest.json`);
271
- const latestPath = path.join(dir, 'latest.json');
272
- fs.writeFileSync(outPath, JSON.stringify(run, null, 2));
273
- fs.writeFileSync(labelLatestPath, JSON.stringify(run, null, 2));
274
- fs.writeFileSync(latestPath, JSON.stringify(run, null, 2));
275
- console.log(`Saved: ${path.relative(process.cwd(), outPath)}`);
276
- console.log(` ${path.relative(process.cwd(), labelLatestPath)}`);
277
- console.log(` ${path.relative(process.cwd(), latestPath)}\n`);
278
- }
279
- }
280
- try {
281
- await runEval();
282
- }
283
- catch (err) {
284
- console.error('Eval failed:', err);
285
- process.exit(1);
286
- }
287
- //# sourceMappingURL=eval-documentation-rag.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eval-documentation-rag.js","sourceRoot":"","sources":["../../src/scripts/eval-documentation-rag.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- /**
2
- * Generate the embeddings cache for the currently configured model.
3
- *
4
- * Idempotent: if a valid cache already exists for the current model and the
5
- * fingerprint matches documents.json, this exits quickly. Otherwise it
6
- * embeds all chunks and writes the cache.
7
- *
8
- * Intended for the maintainer release flow:
9
- * npm run build && npm run generate-cache
10
- * to ensure the published tarball ships a warm cache for the default model.
11
- */
12
- export {};
13
- //# sourceMappingURL=generate-embeddings-cache.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-embeddings-cache.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-embeddings-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Generate the embeddings cache for the currently configured model.
3
- *
4
- * Idempotent: if a valid cache already exists for the current model and the
5
- * fingerprint matches documents.json, this exits quickly. Otherwise it
6
- * embeds all chunks and writes the cache.
7
- *
8
- * Intended for the maintainer release flow:
9
- * npm run build && npm run generate-cache
10
- * to ensure the published tarball ships a warm cache for the default model.
11
- */
12
- import { queryVectorStore } from '../tools/documentation/simple-pdf-indexer.js';
13
- const start = Date.now();
14
- try {
15
- // A single query forces the cold-start path inside queryVectorStore, which
16
- // checks the cache and embeds+saves on miss. We don't care about results.
17
- await queryVectorStore('warmup', 1);
18
- console.log(`Embeddings cache ready (${Date.now() - start}ms)`);
19
- }
20
- catch (err) {
21
- console.error('Failed to generate embeddings cache:', err);
22
- process.exit(1);
23
- }
24
- //# sourceMappingURL=generate-embeddings-cache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-embeddings-cache.js","sourceRoot":"","sources":["../../src/scripts/generate-embeddings-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAEhF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACzB,IAAI,CAAC;IACH,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC;AAClE,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}