@gmickel/gno 1.18.0 → 1.19.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 (129) hide show
  1. package/README.md +5 -3
  2. package/assets/skill/SKILL.md +27 -0
  3. package/package.json +2 -1
  4. package/spec/AGENTS.md +83 -0
  5. package/spec/CLAUDE.md +83 -0
  6. package/spec/bench-fixture.schema.json +137 -0
  7. package/spec/cli.md +2894 -0
  8. package/spec/db/schema.sql +442 -0
  9. package/spec/evals-agentic.md +510 -0
  10. package/spec/evals.md +1106 -0
  11. package/spec/mcp.md +2229 -0
  12. package/spec/output-schemas/activation-verification.schema.json +515 -0
  13. package/spec/output-schemas/ask.schema.json +366 -0
  14. package/spec/output-schemas/backlinks.schema.json +131 -0
  15. package/spec/output-schemas/bench-result.schema.json +120 -0
  16. package/spec/output-schemas/capture-receipt.schema.json +143 -0
  17. package/spec/output-schemas/collection-list.schema.json +45 -0
  18. package/spec/output-schemas/context-capsule-v1.schema.json +691 -0
  19. package/spec/output-schemas/context-capsule-verification.schema.json +1338 -0
  20. package/spec/output-schemas/context-list.schema.json +21 -0
  21. package/spec/output-schemas/doctor.schema.json +313 -0
  22. package/spec/output-schemas/error.schema.json +30 -0
  23. package/spec/output-schemas/expansion.schema.json +37 -0
  24. package/spec/output-schemas/get.schema.json +140 -0
  25. package/spec/output-schemas/graph-query.schema.json +99 -0
  26. package/spec/output-schemas/graph.schema.json +371 -0
  27. package/spec/output-schemas/links-list.schema.json +186 -0
  28. package/spec/output-schemas/mcp-add-collection-result.schema.json +23 -0
  29. package/spec/output-schemas/mcp-capture-result.schema.json +152 -0
  30. package/spec/output-schemas/mcp-http-error.schema.json +30 -0
  31. package/spec/output-schemas/mcp-job-list.schema.json +58 -0
  32. package/spec/output-schemas/mcp-job-status.schema.json +224 -0
  33. package/spec/output-schemas/mcp-remove-result.schema.json +39 -0
  34. package/spec/output-schemas/mcp-sync-result.schema.json +41 -0
  35. package/spec/output-schemas/mcp-tag-result.schema.json +33 -0
  36. package/spec/output-schemas/models-list.schema.json +93 -0
  37. package/spec/output-schemas/multi-get.schema.json +103 -0
  38. package/spec/output-schemas/process-status.schema.json +119 -0
  39. package/spec/output-schemas/query-diagnose.schema.json +123 -0
  40. package/spec/output-schemas/resident-status.schema.json +154 -0
  41. package/spec/output-schemas/retrieval-trace-common.schema.json +492 -0
  42. package/spec/output-schemas/retrieval-trace-delete.schema.json +16 -0
  43. package/spec/output-schemas/retrieval-trace-export.schema.json +61 -0
  44. package/spec/output-schemas/retrieval-trace-filters.schema.json +139 -0
  45. package/spec/output-schemas/retrieval-trace-judgment.schema.json +15 -0
  46. package/spec/output-schemas/retrieval-trace-list.schema.json +18 -0
  47. package/spec/output-schemas/retrieval-trace-payloads.schema.json +178 -0
  48. package/spec/output-schemas/retrieval-trace-purge.schema.json +31 -0
  49. package/spec/output-schemas/retrieval-trace-qrels.schema.json +303 -0
  50. package/spec/output-schemas/retrieval-trace-replay.schema.json +286 -0
  51. package/spec/output-schemas/retrieval-trace-show.schema.json +69 -0
  52. package/spec/output-schemas/retrieval-trace-summary.schema.json +65 -0
  53. package/spec/output-schemas/search-result.schema.json +154 -0
  54. package/spec/output-schemas/search-results.schema.json +338 -0
  55. package/spec/output-schemas/similar.schema.json +84 -0
  56. package/spec/output-schemas/status.schema.json +676 -0
  57. package/spec/output-schemas/tags-list.schema.json +48 -0
  58. package/src/app/context-runtime-types.ts +3 -0
  59. package/src/app/context-runtime.ts +15 -1
  60. package/src/cli/commands/ask.ts +106 -36
  61. package/src/cli/commands/context-build.ts +56 -9
  62. package/src/cli/commands/get.ts +64 -3
  63. package/src/cli/commands/query.ts +62 -23
  64. package/src/cli/commands/replay.ts +140 -0
  65. package/src/cli/commands/search.ts +48 -3
  66. package/src/cli/commands/shared.ts +3 -1
  67. package/src/cli/commands/trace.ts +200 -0
  68. package/src/cli/commands/vsearch.ts +75 -53
  69. package/src/cli/program.ts +255 -0
  70. package/src/config/index.ts +9 -0
  71. package/src/config/retrieval-traces.ts +56 -0
  72. package/src/config/types.ts +4 -0
  73. package/src/core/context-compiler.ts +11 -4
  74. package/src/core/retrieval-qrels.ts +405 -0
  75. package/src/core/retrieval-replay-candidate.ts +368 -0
  76. package/src/core/retrieval-replay-types.ts +109 -0
  77. package/src/core/retrieval-replay-validation.ts +89 -0
  78. package/src/core/retrieval-replay.ts +441 -0
  79. package/src/core/retrieval-trace-evidence-origin.ts +175 -0
  80. package/src/core/retrieval-trace-export.ts +113 -0
  81. package/src/core/retrieval-trace-filter-normalization.ts +27 -0
  82. package/src/core/retrieval-trace-filters.ts +19 -0
  83. package/src/core/retrieval-trace-management-helpers.ts +247 -0
  84. package/src/core/retrieval-trace-management-types.ts +132 -0
  85. package/src/core/retrieval-trace-management.ts +422 -0
  86. package/src/core/retrieval-trace-request.ts +141 -0
  87. package/src/core/retrieval-trace-session.ts +494 -0
  88. package/src/core/retrieval-trace.ts +472 -0
  89. package/src/mcp/tools/context.ts +59 -8
  90. package/src/mcp/tools/get.ts +35 -1
  91. package/src/mcp/tools/index.ts +74 -0
  92. package/src/mcp/tools/query.ts +95 -64
  93. package/src/mcp/tools/search.ts +36 -13
  94. package/src/mcp/tools/trace.ts +143 -0
  95. package/src/mcp/tools/vsearch.ts +71 -38
  96. package/src/pipeline/answer.ts +167 -26
  97. package/src/pipeline/graph-retrieval.ts +15 -1
  98. package/src/pipeline/hybrid.ts +151 -43
  99. package/src/pipeline/search.ts +36 -3
  100. package/src/pipeline/trace-metadata.ts +47 -0
  101. package/src/pipeline/types.ts +43 -0
  102. package/src/pipeline/vsearch.ts +101 -38
  103. package/src/sdk/client.ts +380 -71
  104. package/src/sdk/documents.ts +48 -1
  105. package/src/sdk/index.ts +17 -0
  106. package/src/sdk/types.ts +28 -0
  107. package/src/serve/context-capsule.ts +67 -8
  108. package/src/serve/public/app.tsx +12 -1
  109. package/src/serve/public/globals.built.css +1 -1
  110. package/src/serve/public/lib/workspace-tabs.ts +2 -0
  111. package/src/serve/public/pages/Dashboard.tsx +10 -0
  112. package/src/serve/public/pages/TraceHistory.tsx +478 -0
  113. package/src/serve/public/pages/trace-history-detail.tsx +224 -0
  114. package/src/serve/retrieval-trace.ts +28 -0
  115. package/src/serve/routes/api.ts +366 -72
  116. package/src/serve/routes/traces.ts +156 -0
  117. package/src/serve/server.ts +87 -2
  118. package/src/store/index.ts +31 -0
  119. package/src/store/migrations/014-retrieval-traces.ts +303 -0
  120. package/src/store/migrations/index.ts +2 -0
  121. package/src/store/retrieval-trace-codec.ts +384 -0
  122. package/src/store/sqlite/adapter.ts +153 -1
  123. package/src/store/sqlite/retrieval-trace-management-store.ts +341 -0
  124. package/src/store/sqlite/retrieval-trace-retention.ts +349 -0
  125. package/src/store/sqlite/retrieval-trace-rows.ts +267 -0
  126. package/src/store/sqlite/retrieval-trace-store.ts +515 -0
  127. package/src/store/types.ts +297 -0
  128. package/src/store/vector/sqlite-vec.ts +76 -1
  129. package/src/store/vector/types.ts +1 -1
@@ -0,0 +1,366 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "gno://schemas/ask@1.0",
4
+ "title": "GNO Ask Response",
5
+ "description": "Response from gno ask command",
6
+ "type": "object",
7
+ "required": ["query", "mode", "results", "meta"],
8
+ "$defs": {
9
+ "searchResult": {
10
+ "type": "object",
11
+ "required": ["docid", "score", "uri", "snippet", "source"],
12
+ "properties": {
13
+ "docid": {
14
+ "type": "string",
15
+ "description": "Document ID (short hash of source)",
16
+ "pattern": "^#[a-f0-9]{6,8}$"
17
+ },
18
+ "score": {
19
+ "type": "number",
20
+ "description": "Relevance score (0-1 normalized)",
21
+ "minimum": 0,
22
+ "maximum": 1
23
+ },
24
+ "uri": {
25
+ "type": "string",
26
+ "description": "Document URI (gno://collection/path)",
27
+ "pattern": "^gno://[^/]+/.+"
28
+ },
29
+ "title": {
30
+ "type": "string",
31
+ "description": "Extracted document title (optional)"
32
+ },
33
+ "snippetLanguage": {
34
+ "type": "string",
35
+ "description": "Language of snippet content (BCP-47 or 'und')"
36
+ },
37
+ "context": {
38
+ "type": "string",
39
+ "description": "Resolved user-configured retrieval guidance, ordered from global to collection to matching path prefixes"
40
+ },
41
+ "snippet": {
42
+ "type": "string",
43
+ "description": "Matching text snippet from document mirror"
44
+ },
45
+ "snippetRange": {
46
+ "type": "object",
47
+ "description": "Line range of snippet in mirror content",
48
+ "properties": {
49
+ "startLine": {
50
+ "type": "integer",
51
+ "description": "Start line (1-indexed)",
52
+ "minimum": 1
53
+ },
54
+ "endLine": {
55
+ "type": "integer",
56
+ "description": "End line (1-indexed, inclusive)",
57
+ "minimum": 1
58
+ }
59
+ },
60
+ "required": ["startLine", "endLine"]
61
+ },
62
+ "source": {
63
+ "type": "object",
64
+ "description": "Source file metadata",
65
+ "required": ["relPath", "mime", "ext"],
66
+ "properties": {
67
+ "absPath": {
68
+ "type": "string",
69
+ "description": "Absolute path (included with --source or in MCP)"
70
+ },
71
+ "relPath": {
72
+ "type": "string",
73
+ "description": "Path relative to collection root"
74
+ },
75
+ "mime": {
76
+ "type": "string",
77
+ "description": "MIME type of source file"
78
+ },
79
+ "ext": {
80
+ "type": "string",
81
+ "description": "File extension (including dot)",
82
+ "pattern": "^\\.[a-zA-Z0-9]+$"
83
+ },
84
+ "modifiedAt": {
85
+ "type": "string",
86
+ "description": "Last modification time (ISO 8601)",
87
+ "format": "date-time"
88
+ },
89
+ "sizeBytes": {
90
+ "type": "integer",
91
+ "description": "File size in bytes",
92
+ "minimum": 0
93
+ },
94
+ "sourceHash": {
95
+ "type": "string",
96
+ "description": "SHA-256 hash of source file"
97
+ }
98
+ }
99
+ },
100
+ "conversion": {
101
+ "type": "object",
102
+ "description": "Conversion metadata",
103
+ "properties": {
104
+ "converterId": {
105
+ "type": "string",
106
+ "description": "Converter identifier (e.g., 'adapter/markitdown-js')"
107
+ },
108
+ "converterVersion": {
109
+ "type": "string",
110
+ "description": "Converter version"
111
+ },
112
+ "mirrorHash": {
113
+ "type": "string",
114
+ "description": "SHA-256 hash of mirror content"
115
+ },
116
+ "warnings": {
117
+ "type": "array",
118
+ "description": "Conversion warnings",
119
+ "items": {
120
+ "type": "object",
121
+ "properties": {
122
+ "code": {
123
+ "type": "string",
124
+ "enum": [
125
+ "LOSSY",
126
+ "TRUNCATED",
127
+ "PARTIAL",
128
+ "UNSUPPORTED_FEATURE",
129
+ "LOW_CONFIDENCE"
130
+ ]
131
+ },
132
+ "message": {
133
+ "type": "string"
134
+ }
135
+ },
136
+ "required": ["code", "message"]
137
+ }
138
+ }
139
+ }
140
+ }
141
+ }
142
+ }
143
+ },
144
+ "properties": {
145
+ "query": {
146
+ "type": "string",
147
+ "description": "Original query"
148
+ },
149
+ "mode": {
150
+ "type": "string",
151
+ "description": "Retrieval mode used",
152
+ "enum": ["hybrid", "bm25_only"]
153
+ },
154
+ "queryLanguage": {
155
+ "type": "string",
156
+ "description": "Detected or specified query language",
157
+ "default": "auto"
158
+ },
159
+ "answer": {
160
+ "type": "string",
161
+ "description": "Grounded answer (present only if --answer and generation available)"
162
+ },
163
+ "citations": {
164
+ "type": "array",
165
+ "description": "Citations for the answer",
166
+ "items": {
167
+ "type": "object",
168
+ "required": ["docid", "uri"],
169
+ "properties": {
170
+ "docid": {
171
+ "type": "string",
172
+ "description": "Document ID",
173
+ "pattern": "^#[a-f0-9]{6,8}$"
174
+ },
175
+ "uri": {
176
+ "type": "string",
177
+ "description": "Document URI",
178
+ "pattern": "^gno://[^/]+/.+"
179
+ },
180
+ "startLine": {
181
+ "type": "integer",
182
+ "description": "Citation start line",
183
+ "minimum": 1
184
+ },
185
+ "endLine": {
186
+ "type": "integer",
187
+ "description": "Citation end line",
188
+ "minimum": 1
189
+ }
190
+ }
191
+ }
192
+ },
193
+ "results": {
194
+ "type": "array",
195
+ "description": "Search results (same shape as query results)",
196
+ "items": {
197
+ "$ref": "#/$defs/searchResult"
198
+ }
199
+ },
200
+ "meta": {
201
+ "type": "object",
202
+ "description": "Retrieval metadata",
203
+ "required": ["expanded", "reranked", "vectorsUsed"],
204
+ "properties": {
205
+ "expanded": {
206
+ "type": "boolean",
207
+ "description": "Whether query expansion was used"
208
+ },
209
+ "reranked": {
210
+ "type": "boolean",
211
+ "description": "Whether reranking was applied"
212
+ },
213
+ "vectorsUsed": {
214
+ "type": "boolean",
215
+ "description": "Whether vector search was used"
216
+ },
217
+ "intent": {
218
+ "type": "string",
219
+ "description": "Disambiguating context used to steer retrieval without being searched directly"
220
+ },
221
+ "candidateLimit": {
222
+ "type": "integer",
223
+ "description": "Max candidates sent to reranking (if applicable)",
224
+ "minimum": 1
225
+ },
226
+ "exclude": {
227
+ "type": "array",
228
+ "description": "Explicit exclusion terms applied",
229
+ "items": { "type": "string" }
230
+ },
231
+ "queryModes": {
232
+ "type": "object",
233
+ "description": "Summary of structured query modes applied",
234
+ "required": ["term", "intent", "hyde"],
235
+ "properties": {
236
+ "term": {
237
+ "type": "integer",
238
+ "minimum": 0
239
+ },
240
+ "intent": {
241
+ "type": "integer",
242
+ "minimum": 0
243
+ },
244
+ "hyde": {
245
+ "type": "boolean"
246
+ }
247
+ }
248
+ },
249
+ "answerGenerated": {
250
+ "type": "boolean",
251
+ "description": "Whether an answer was generated"
252
+ },
253
+ "totalResults": {
254
+ "type": "integer",
255
+ "description": "Number of results returned",
256
+ "minimum": 0
257
+ },
258
+ "answerContext": {
259
+ "type": "object",
260
+ "description": "Answer context selection explain payload",
261
+ "required": [
262
+ "strategy",
263
+ "targetSources",
264
+ "facets",
265
+ "selected",
266
+ "dropped"
267
+ ],
268
+ "properties": {
269
+ "strategy": {
270
+ "type": "string",
271
+ "enum": ["adaptive_coverage_v1"]
272
+ },
273
+ "targetSources": {
274
+ "type": "integer",
275
+ "minimum": 0
276
+ },
277
+ "facets": {
278
+ "type": "array",
279
+ "items": { "type": "string" }
280
+ },
281
+ "selected": {
282
+ "type": "array",
283
+ "items": {
284
+ "type": "object",
285
+ "required": [
286
+ "docid",
287
+ "uri",
288
+ "score",
289
+ "queryTokenHits",
290
+ "facetHits",
291
+ "reason"
292
+ ],
293
+ "properties": {
294
+ "docid": {
295
+ "type": "string",
296
+ "pattern": "^#[a-f0-9]{6,8}$"
297
+ },
298
+ "uri": {
299
+ "type": "string",
300
+ "pattern": "^gno://[^/]+/.+"
301
+ },
302
+ "score": {
303
+ "type": "number",
304
+ "minimum": 0,
305
+ "maximum": 1
306
+ },
307
+ "queryTokenHits": {
308
+ "type": "integer",
309
+ "minimum": 0
310
+ },
311
+ "facetHits": {
312
+ "type": "integer",
313
+ "minimum": 0
314
+ },
315
+ "reason": {
316
+ "type": "string"
317
+ }
318
+ }
319
+ }
320
+ },
321
+ "dropped": {
322
+ "type": "array",
323
+ "items": {
324
+ "type": "object",
325
+ "required": [
326
+ "docid",
327
+ "uri",
328
+ "score",
329
+ "queryTokenHits",
330
+ "facetHits",
331
+ "reason"
332
+ ],
333
+ "properties": {
334
+ "docid": {
335
+ "type": "string",
336
+ "pattern": "^#[a-f0-9]{6,8}$"
337
+ },
338
+ "uri": {
339
+ "type": "string",
340
+ "pattern": "^gno://[^/]+/.+"
341
+ },
342
+ "score": {
343
+ "type": "number",
344
+ "minimum": 0,
345
+ "maximum": 1
346
+ },
347
+ "queryTokenHits": {
348
+ "type": "integer",
349
+ "minimum": 0
350
+ },
351
+ "facetHits": {
352
+ "type": "integer",
353
+ "minimum": 0
354
+ },
355
+ "reason": {
356
+ "type": "string"
357
+ }
358
+ }
359
+ }
360
+ }
361
+ }
362
+ }
363
+ }
364
+ }
365
+ }
366
+ }
@@ -0,0 +1,131 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "gno://schemas/backlinks@1.0",
4
+ "title": "GNO Backlinks",
5
+ "description": "List of documents linking to a target document",
6
+ "type": "object",
7
+ "required": ["backlinks", "meta"],
8
+ "properties": {
9
+ "backlinks": {
10
+ "type": "array",
11
+ "description": "List of documents linking to this one",
12
+ "items": {
13
+ "oneOf": [
14
+ {
15
+ "type": "object",
16
+ "required": ["sourceDocid", "sourceUri", "startLine", "startCol"],
17
+ "additionalProperties": false,
18
+ "properties": {
19
+ "sourceDocid": {
20
+ "type": "string",
21
+ "description": "Source document ID"
22
+ },
23
+ "sourceUri": {
24
+ "type": "string",
25
+ "description": "Source document URI"
26
+ },
27
+ "sourceTitle": {
28
+ "type": "string",
29
+ "description": "Source document title"
30
+ },
31
+ "linkText": {
32
+ "type": "string",
33
+ "description": "Link display text"
34
+ },
35
+ "startLine": {
36
+ "type": "integer",
37
+ "description": "1-based line number in source",
38
+ "minimum": 1
39
+ },
40
+ "startCol": {
41
+ "type": "integer",
42
+ "description": "1-based column in source",
43
+ "minimum": 1
44
+ }
45
+ }
46
+ },
47
+ {
48
+ "type": "object",
49
+ "required": [
50
+ "sourceDocid",
51
+ "sourceUri",
52
+ "edgeType",
53
+ "confidence",
54
+ "edgeSource"
55
+ ],
56
+ "additionalProperties": false,
57
+ "properties": {
58
+ "sourceDocid": {
59
+ "type": "string",
60
+ "description": "Source document ID"
61
+ },
62
+ "sourceUri": {
63
+ "type": "string",
64
+ "description": "Source document URI"
65
+ },
66
+ "sourceTitle": {
67
+ "type": "string",
68
+ "description": "Source document title"
69
+ },
70
+ "edgeType": {
71
+ "type": "string",
72
+ "description": "Semantic relationship type"
73
+ },
74
+ "relationType": {
75
+ "type": "string",
76
+ "description": "Alias of edgeType"
77
+ },
78
+ "confidence": {
79
+ "type": "string",
80
+ "enum": ["parsed", "configured", "manual", "inferred"]
81
+ },
82
+ "edgeSource": {
83
+ "type": "string",
84
+ "enum": ["wikilink", "markdown-link", "frontmatter-relation"]
85
+ }
86
+ }
87
+ }
88
+ ]
89
+ }
90
+ },
91
+ "meta": {
92
+ "type": "object",
93
+ "required": ["docid", "totalBacklinks"],
94
+ "properties": {
95
+ "docid": {
96
+ "type": "string",
97
+ "description": "Target document ID"
98
+ },
99
+ "uri": {
100
+ "type": "string",
101
+ "description": "Target document URI"
102
+ },
103
+ "title": {
104
+ "type": "string",
105
+ "description": "Target document title"
106
+ },
107
+ "totalBacklinks": {
108
+ "type": "integer",
109
+ "description": "Total number of backlinks",
110
+ "minimum": 0
111
+ },
112
+ "collection": {
113
+ "type": "string",
114
+ "description": "Collection filter applied"
115
+ },
116
+ "edgeTypeFilter": {
117
+ "type": "string",
118
+ "description": "Semantic edge-type filter applied"
119
+ },
120
+ "relationFilter": {
121
+ "type": "string",
122
+ "description": "Semantic relation filter applied"
123
+ },
124
+ "semantic": {
125
+ "type": "boolean",
126
+ "description": "Whether backlinks came from the semantic edge layer"
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
@@ -0,0 +1,120 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "GNO Bench Result",
4
+ "type": "object",
5
+ "required": ["fixture", "generatedAt", "modes", "meta"],
6
+ "additionalProperties": false,
7
+ "properties": {
8
+ "fixture": {
9
+ "type": "object",
10
+ "required": ["path", "version", "queryCount", "topK"],
11
+ "additionalProperties": false,
12
+ "properties": {
13
+ "path": { "type": "string", "minLength": 1 },
14
+ "name": { "type": "string" },
15
+ "version": { "const": 1 },
16
+ "queryCount": { "type": "integer", "minimum": 1 },
17
+ "topK": { "type": "integer", "minimum": 1 }
18
+ }
19
+ },
20
+ "generatedAt": { "type": "string", "format": "date-time" },
21
+ "modes": {
22
+ "type": "array",
23
+ "minItems": 1,
24
+ "items": {
25
+ "type": "object",
26
+ "required": [
27
+ "name",
28
+ "type",
29
+ "status",
30
+ "queryCount",
31
+ "failures",
32
+ "metrics",
33
+ "latency",
34
+ "cases"
35
+ ],
36
+ "additionalProperties": false,
37
+ "properties": {
38
+ "name": { "type": "string", "minLength": 1 },
39
+ "type": { "type": "string", "enum": ["bm25", "vector", "hybrid"] },
40
+ "status": { "type": "string", "enum": ["ok", "failed"] },
41
+ "queryCount": { "type": "integer", "minimum": 1 },
42
+ "failures": { "type": "integer", "minimum": 0 },
43
+ "metrics": { "$ref": "#/definitions/metrics" },
44
+ "latency": { "$ref": "#/definitions/latency" },
45
+ "cases": {
46
+ "type": "array",
47
+ "minItems": 1,
48
+ "items": {
49
+ "type": "object",
50
+ "required": [
51
+ "id",
52
+ "query",
53
+ "topK",
54
+ "expected",
55
+ "hits",
56
+ "topDocs",
57
+ "metrics",
58
+ "latencyMs"
59
+ ],
60
+ "additionalProperties": false,
61
+ "properties": {
62
+ "id": { "type": "string", "minLength": 1 },
63
+ "query": { "type": "string", "minLength": 1 },
64
+ "topK": { "type": "integer", "minimum": 1 },
65
+ "expected": {
66
+ "type": "array",
67
+ "items": { "type": "string", "minLength": 1 }
68
+ },
69
+ "hits": {
70
+ "type": "array",
71
+ "items": { "type": "string", "minLength": 1 }
72
+ },
73
+ "topDocs": {
74
+ "type": "array",
75
+ "items": { "type": "string", "minLength": 1 }
76
+ },
77
+ "metrics": { "$ref": "#/definitions/metrics" },
78
+ "latencyMs": { "type": "number", "minimum": 0 },
79
+ "error": { "type": "string" }
80
+ }
81
+ }
82
+ }
83
+ }
84
+ }
85
+ },
86
+ "meta": {
87
+ "type": "object",
88
+ "required": ["indexName"],
89
+ "additionalProperties": false,
90
+ "properties": {
91
+ "indexName": { "type": "string", "minLength": 1 },
92
+ "collection": { "type": "string", "minLength": 1 }
93
+ }
94
+ }
95
+ },
96
+ "definitions": {
97
+ "metrics": {
98
+ "type": "object",
99
+ "required": ["precisionAtK", "recallAtK", "f1AtK", "mrr", "ndcgAtK"],
100
+ "additionalProperties": false,
101
+ "properties": {
102
+ "precisionAtK": { "type": "number", "minimum": 0, "maximum": 1 },
103
+ "recallAtK": { "type": "number", "minimum": 0, "maximum": 1 },
104
+ "f1AtK": { "type": "number", "minimum": 0, "maximum": 1 },
105
+ "mrr": { "type": "number", "minimum": 0, "maximum": 1 },
106
+ "ndcgAtK": { "type": "number", "minimum": 0, "maximum": 1 }
107
+ }
108
+ },
109
+ "latency": {
110
+ "type": "object",
111
+ "required": ["p50Ms", "p95Ms", "meanMs"],
112
+ "additionalProperties": false,
113
+ "properties": {
114
+ "p50Ms": { "type": "number", "minimum": 0 },
115
+ "p95Ms": { "type": "number", "minimum": 0 },
116
+ "meanMs": { "type": "number", "minimum": 0 }
117
+ }
118
+ }
119
+ }
120
+ }