@gmickel/gno 2.6.0 → 2.7.1
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/README.md +25 -30
- package/assets/skill/SKILL.md +5 -3
- package/assets/skill/cli-reference.md +9 -2
- package/assets/skill/mcp-reference.md +2 -1
- package/assets/spa-production.json.gz +0 -0
- package/browser-extension/artifacts/{gno-browser-clipper-v2.6.0.zip → gno-browser-clipper-v2.7.1.zip} +0 -0
- package/browser-extension/artifacts/gno-browser-clipper-v2.7.1.zip.sha256 +1 -0
- package/browser-extension/dist/manifest.json +1 -1
- package/package.json +2 -1
- package/spec/cli.md +109 -18
- package/spec/mcp.md +36 -2
- package/spec/output-schemas/ask.schema.json +1 -1
- package/spec/output-schemas/capture-receipt.schema.json +1 -1
- package/spec/output-schemas/collection-list.schema.json +2 -2
- package/spec/output-schemas/doctor.schema.json +88 -0
- package/spec/output-schemas/error.schema.json +11 -2
- package/spec/output-schemas/get.schema.json +1 -1
- package/spec/output-schemas/mcp-capture-result.schema.json +1 -2
- package/spec/output-schemas/memory-remember.schema.json +2 -2
- package/spec/output-schemas/multi-get.schema.json +4 -1
- package/spec/output-schemas/peek.schema.json +2 -9
- package/spec/output-schemas/resident-status.schema.json +22 -0
- package/spec/output-schemas/search-result.schema.json +1 -1
- package/spec/output-schemas/search-results.schema.json +1 -1
- package/spec/output-schemas/status.schema.json +110 -16
- package/src/cli/commands/ask.ts +31 -12
- package/src/cli/commands/doctor.ts +54 -20
- package/src/cli/commands/embed.ts +41 -3
- package/src/cli/commands/ls.ts +6 -1
- package/src/cli/commands/query.ts +5 -0
- package/src/cli/commands/status.ts +63 -5
- package/src/cli/commands/vec.ts +54 -0
- package/src/cli/detach.ts +29 -1
- package/src/cli/errors.ts +13 -9
- package/src/cli/program.ts +53 -1
- package/src/core/capture-sync.ts +9 -2
- package/src/core/host-paths.ts +49 -0
- package/src/core/memory-remember.ts +4 -3
- package/src/core/request-receipts.ts +63 -9
- package/src/core/shutdown-budget.ts +6 -0
- package/src/core/vector-partition-status.ts +52 -0
- package/src/core/windows-private-path.ts +136 -1
- package/src/embed/backlog.ts +145 -27
- package/src/embed/fingerprint.ts +6 -3
- package/src/embed/retry.ts +66 -27
- package/src/embed/variant-backlog.ts +48 -18
- package/src/embed/variant-retry.ts +31 -22
- package/src/index.ts +21 -2
- package/src/llm/inference-scope.ts +18 -0
- package/src/llm/native-worker/dispatcher.ts +2 -0
- package/src/llm/native-worker/embedding-identity.ts +42 -0
- package/src/llm/native-worker/protocol.ts +1 -0
- package/src/llm/types.ts +3 -0
- package/src/mcp/context.ts +9 -0
- package/src/mcp/resources/index.ts +6 -5
- package/src/mcp/tool-descriptions-core.ts +1 -1
- package/src/mcp/tools/capture.ts +1 -3
- package/src/mcp/tools/index.ts +11 -4
- package/src/mcp/tools/memory-remember.ts +1 -1
- package/src/mcp/tools/status.ts +23 -6
- package/src/pipeline/hybrid.ts +37 -7
- package/src/pipeline/vsearch.ts +14 -2
- package/src/serve/embed-scheduler.ts +133 -19
- package/src/serve/host-path-redaction.ts +116 -0
- package/src/serve/public/components/BootstrapStatus.tsx +5 -3
- package/src/serve/public/components/CaptureModal.tsx +1 -1
- package/src/serve/public/components/CollectionModelDialog.tsx +16 -13
- package/src/serve/public/components/CollectionsEmptyState.tsx +5 -3
- package/src/serve/public/components/FirstRunWizard.tsx +4 -2
- package/src/serve/public/components/sessions/SessionSearch.tsx +2 -2
- package/src/serve/public/components/sessions/SourcesPanel.tsx +77 -60
- package/src/serve/public/globals.built.css +1 -1
- package/src/serve/public/hooks/use-api.ts +17 -2
- package/src/serve/public/lib/request-intent.ts +8 -0
- package/src/serve/public/{components/sessions → lib}/snippet.tsx +2 -3
- package/src/serve/public/pages/Collections.tsx +16 -13
- package/src/serve/public/pages/Connectors.tsx +7 -4
- package/src/serve/public/pages/Dashboard.tsx +16 -11
- package/src/serve/public/pages/DocView.tsx +10 -5
- package/src/serve/public/pages/DocumentEditor.tsx +91 -14
- package/src/serve/public/pages/Search.tsx +1 -41
- package/src/serve/resident-runtime.ts +33 -1
- package/src/serve/resident-status.ts +13 -1
- package/src/serve/routes/sessions.ts +61 -5
- package/src/serve/server.ts +15 -12
- package/src/serve/status-model.ts +26 -6
- package/src/serve/status.ts +4 -7
- package/src/serve/watch-reconciliation-shared.ts +3 -0
- package/src/serve/watch-service-events.ts +3 -2
- package/src/serve/watch-service-run-flush.ts +35 -2
- package/src/serve/watch-service.ts +5 -0
- package/src/store/migrations/031-runtime-independent-vectors.ts +29 -0
- package/src/store/migrations/032-vector-runtime-callers.ts +17 -0
- package/src/store/migrations/index.ts +4 -0
- package/src/store/sqlite/adapter.ts +24 -3
- package/src/store/sqlite/change-journal-store.ts +1 -1
- package/src/store/sqlite/legacy-vector-ownership.ts +2 -1
- package/src/store/types.ts +11 -1
- package/src/store/vector/lazy.ts +46 -43
- package/src/store/vector/runtime-compat.ts +651 -0
- package/src/store/vector/sqlite-vec.ts +20 -2
- package/src/store/vector/status.ts +276 -35
- package/src/store/vector/types.ts +2 -0
- package/src/store/vector/variant-search.ts +71 -23
- package/src/store/vector/variants.ts +49 -14
- package/browser-extension/artifacts/gno-browser-clipper-v2.6.0.zip.sha256 +0 -1
package/README.md
CHANGED
|
@@ -139,7 +139,7 @@ See the [guide](docs/COMPILED-CONTEXT.md).
|
|
|
139
139
|
|
|
140
140
|
<!-- public-truth:current-version -->
|
|
141
141
|
|
|
142
|
-
> Current source version: **v2.
|
|
142
|
+
> Current source version: **v2.7.1**. See [CHANGELOG.md](./CHANGELOG.md).
|
|
143
143
|
|
|
144
144
|
<!-- /public-truth -->
|
|
145
145
|
|
|
@@ -184,9 +184,8 @@ See the [guide](docs/COMPILED-CONTEXT.md).
|
|
|
184
184
|
explicit read-only retrieval smoke from Connectors.
|
|
185
185
|
- **One resident gateway**: `gno serve` and `gno daemon` now host stateful
|
|
186
186
|
Streamable HTTP MCP at `/mcp` from the same long-lived runtime as their
|
|
187
|
-
watcher, jobs, stores, and models.
|
|
188
|
-
|
|
189
|
-
and shutdown.
|
|
187
|
+
watcher, jobs, stores, and models. Several MCP clients can share one
|
|
188
|
+
resident process and get the same results as stdio MCP.
|
|
190
189
|
- **Knowledge Delta**: `gno changes`, `gno diff`, and `gno impact` expose
|
|
191
190
|
bounded metadata-only history, structural change summaries, and explainable
|
|
192
191
|
dependency paths across CLI, REST, MCP, and SDK.
|
|
@@ -215,17 +214,13 @@ See the [guide](docs/COMPILED-CONTEXT.md).
|
|
|
215
214
|
`local_only`, `lan`, or `remote` boundary that follows mixed and derived
|
|
216
215
|
evidence through resident serving, inference, publishing, exports, Capsules,
|
|
217
216
|
and traces. Authentication never overrides policy.
|
|
218
|
-
- **Source availability (`any` | `local`)**: opt-in `local`
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
universal provider support. On the controlled 5,000-file all-local corpus,
|
|
226
|
-
production `any` regressed -1.1280% and hierarchical `local` added 1.1841%
|
|
227
|
-
median traversal overhead (2 warmups, 9 samples per lane; same corpus and
|
|
228
|
-
interleaved pre-implementation/current production walkers).
|
|
217
|
+
- **Source availability (`any` | `local`)**: opt-in `local` indexes only files
|
|
218
|
+
already on disk and never makes a cloud provider download one. Supported on
|
|
219
|
+
macOS with Google Drive, iCloud Drive, and OneDrive SharePoint library roots.
|
|
220
|
+
Cloud-only files are skipped and reported, not treated as conversion errors,
|
|
221
|
+
and documents under a cloud-only folder stay indexed. Other platforms fail
|
|
222
|
+
with an error. On a 5,000-file all-local collection, `local` scans about 1%
|
|
223
|
+
slower than `any`.
|
|
229
224
|
- **Read-only integrity audits**: `gno audit` and MCP `gno_audit` inspect local
|
|
230
225
|
links, declared provenance, and source/index freshness offline. Stable,
|
|
231
226
|
bounded findings distinguish complete, partial, unavailable, and changing
|
|
@@ -240,7 +235,7 @@ See the [guide](docs/COMPILED-CONTEXT.md).
|
|
|
240
235
|
<!-- public-truth:default-embed-model -->
|
|
241
236
|
- **Default Embed Model**: all four built-in presets use `Qwen3-Embedding-0.6B-GGUF`; see the dated, fixture-scoped evidence below
|
|
242
237
|
<!-- /public-truth -->
|
|
243
|
-
- **Regression Fixes**: tightened phrase/negation/hyphen/underscore BM25 behavior, cleaned non-TTY hyperlink output, improved `gno doctor` chunking and embedding fingerprint visibility
|
|
238
|
+
- **Regression Fixes**: tightened phrase/negation/hyphen/underscore BM25 behavior, cleaned non-TTY hyperlink output, and improved `gno doctor` chunking and embedding fingerprint visibility
|
|
244
239
|
|
|
245
240
|
### Upgrading Existing Collections
|
|
246
241
|
|
|
@@ -1318,10 +1313,10 @@ Current product stance:
|
|
|
1318
1313
|
|
|
1319
1314
|
Why Qwen is the current default:
|
|
1320
1315
|
|
|
1321
|
-
-
|
|
1322
|
-
-
|
|
1323
|
-
-
|
|
1324
|
-
-
|
|
1316
|
+
- ties `bge-m3` on the small [canonical code benchmark](./evals/fixtures/code-embedding-benchmark/canonical.md) (vector nDCG@10 `0.95` each)
|
|
1317
|
+
- beats `bge-m3` on [GNO's own web server code](./evals/fixtures/code-embedding-benchmark/repo-serve.md) (`0.8102` vs `0.1003`)
|
|
1318
|
+
- beats `bge-m3` on [pinned open-source code slices](./evals/fixtures/code-embedding-benchmark/oss-slices.md) (`1.0` vs `0.6116`)
|
|
1319
|
+
- beats `bge-m3` on the multilingual prose/docs benchmark below
|
|
1325
1320
|
|
|
1326
1321
|
Current trade-off:
|
|
1327
1322
|
|
|
@@ -1340,7 +1335,7 @@ bun run bench:general-embeddings --candidate qwen3-embedding-0.6b --write
|
|
|
1340
1335
|
|
|
1341
1336
|
<!-- public-truth:general-embedding-benchmark -->
|
|
1342
1337
|
|
|
1343
|
-
The
|
|
1338
|
+
The April 2026 FastAPI-docs run used 15 documents in five corpus
|
|
1344
1339
|
languages (`en`, `de`, `fr`, `es`, `zh`) and 13 queries:
|
|
1345
1340
|
|
|
1346
1341
|
- [bge-m3 incumbent](./evals/fixtures/general-embedding-benchmark/2026-04-06-bge-m3-incumbent.md): vector nDCG@10 `0.3503`, hybrid nDCG@10 `0.642`
|
|
@@ -1362,23 +1357,23 @@ languages.
|
|
|
1362
1357
|
|
|
1363
1358
|
<!-- public-truth:cjk-lexical-benchmark -->
|
|
1364
1359
|
|
|
1365
|
-
Lexical fallback has separate evidence. The
|
|
1360
|
+
Lexical fallback has separate evidence. The
|
|
1366
1361
|
[July 22, 2026 CJK result](./evals/fixtures/cjk-lexical-benchmark/2026-07-22.md)
|
|
1367
1362
|
uses 21 synthetic documents and 25 same-language queries across Chinese,
|
|
1368
|
-
Japanese, and Korean. Production BM25 lexical results and
|
|
1363
|
+
Japanese, and Korean. Production BM25 lexical results and the promotion floors:
|
|
1369
1364
|
|
|
1370
1365
|
- Chinese: baseline Recall@10 `0.2222`, nDCG@10 `0.1481`, zero-result `0.7778`; promotion Recall@10 `0.4722`, nDCG@10 `0.3981`, maximum zero-result `0.5278`
|
|
1371
1366
|
- Japanese: baseline Recall@10 `0.125`, nDCG@10 `0.125`, zero-result `0.875`; promotion Recall@10 `0.375`, nDCG@10 `0.375`, maximum zero-result `0.625`
|
|
1372
1367
|
- Korean: baseline Recall@10 `0.5`, nDCG@10 `0.5`, zero-result `0.5`; promotion Recall@10 `0.75`, nDCG@10 `0.75`, maximum zero-result `0.25`
|
|
1373
1368
|
|
|
1374
|
-
The
|
|
1369
|
+
The "promotion" values are the floors a CJK-aware lexical analyzer must reach
|
|
1370
|
+
before GNO ships one.
|
|
1375
1371
|
[promotion-gates.md](./evals/fixtures/cjk-lexical-benchmark/promotion-gates.md)
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
nDCG measures placement but not distinctions among positive gain
|
|
1380
|
-
|
|
1381
|
-
`fn-109`.
|
|
1372
|
+
lists them along with MRR, non-regression, and cost requirements. No analyzer
|
|
1373
|
+
has met them, so production BM25 tokenization is unchanged. These lexical
|
|
1374
|
+
numbers do not measure semantic retrieval. All positive qrels use relevance
|
|
1375
|
+
`3`, so nDCG measures placement but not distinctions among positive gain
|
|
1376
|
+
grades.
|
|
1382
1377
|
|
|
1383
1378
|
<!-- /public-truth -->
|
|
1384
1379
|
|
package/assets/skill/SKILL.md
CHANGED
|
@@ -130,8 +130,9 @@ Open without fetching content via `gno get`:
|
|
|
130
130
|
`#anchor`). Take `serveUrl` from peek `serve.url` when `serve.running` is
|
|
131
131
|
true.
|
|
132
132
|
- **Source file**: peek `recent[].absPath`, or search `--json`
|
|
133
|
-
`results[].source.absPath`. If `absPath` is absent
|
|
134
|
-
do not offer file-open for
|
|
133
|
+
`results[].source.absPath`. If `absPath` is absent (always for remote REST
|
|
134
|
+
and HTTP MCP callers), show the URI tail and do not offer file-open for
|
|
135
|
+
that row.
|
|
135
136
|
|
|
136
137
|
## Search Modes
|
|
137
138
|
|
|
@@ -557,7 +558,8 @@ Programmatic capture uses the same receipt contract:
|
|
|
557
558
|
|
|
558
559
|
MCP capture writes structured `source:` frontmatter, runs under the MCP write
|
|
559
560
|
lock, syncs the file for FTS, and preserves legacy MCP fields (`docid`,
|
|
560
|
-
`absPath
|
|
561
|
+
`absPath` over stdio only, `overwritten`, `serverInstanceId`) alongside the
|
|
562
|
+
shared receipt. It
|
|
561
563
|
does not auto-embed.
|
|
562
564
|
|
|
563
565
|
For an explicit browser capture, use the local unpacked Chromium clipper with
|
|
@@ -117,9 +117,15 @@ gno collection clear-embeddings <name> [--all] [--json]
|
|
|
117
117
|
### gno embed
|
|
118
118
|
|
|
119
119
|
```bash
|
|
120
|
-
gno embed [collection] [--collection <name>] [--force] [--model <uri>] [--batch-size <n>] [--dry-run]
|
|
120
|
+
gno embed [collection] [--collection <name>] [--force] [--model <uri>] [--batch-size <n>] [--dry-run] [--new-partition]
|
|
121
121
|
```
|
|
122
122
|
|
|
123
|
+
Switching `GNO_LLAMA_GPU`, Bun version or thread count resumes the existing
|
|
124
|
+
vector partition when a measured sample of stored chunks matches. If it does
|
|
125
|
+
not, embed refuses to build a separate partition without `--new-partition`
|
|
126
|
+
(`--yes` alone never confirms); queries from that runtime fall back to lexical
|
|
127
|
+
retrieval with a `vector_runtime_incompatible` warning.
|
|
128
|
+
|
|
123
129
|
## Indexing
|
|
124
130
|
|
|
125
131
|
### gno update
|
|
@@ -150,7 +156,7 @@ gno index [options]
|
|
|
150
156
|
Generate embeddings only.
|
|
151
157
|
|
|
152
158
|
```bash
|
|
153
|
-
gno embed [--force] [--model <uri>] [--batch-size <n>] [--dry-run]
|
|
159
|
+
gno embed [--force] [--model <uri>] [--batch-size <n>] [--dry-run] [--new-partition]
|
|
154
160
|
```
|
|
155
161
|
|
|
156
162
|
## Project Profiles
|
|
@@ -857,6 +863,7 @@ Vector index maintenance. Use when `gno similar` returns empty despite embedding
|
|
|
857
863
|
```bash
|
|
858
864
|
gno vec sync # Fast incremental sync
|
|
859
865
|
gno vec rebuild # Full rebuild
|
|
866
|
+
gno vec drop <partition> # Drop an abandoned shadow partition (id prefix from gno status)
|
|
860
867
|
```
|
|
861
868
|
|
|
862
869
|
| Option | Description |
|
|
@@ -156,7 +156,8 @@ CLI-only.
|
|
|
156
156
|
`GNO_MCP_ENABLE_WRITE=1`. It writes quick notes with structured `source:`
|
|
157
157
|
frontmatter and returns the same provenance receipt shape as CLI, REST, and SDK
|
|
158
158
|
capture, plus legacy MCP fields (`docid`, `absPath`, `overwritten`,
|
|
159
|
-
`serverInstanceId`).
|
|
159
|
+
`serverInstanceId`). `absPath` is stdio-only: HTTP MCP callers never receive
|
|
160
|
+
host paths and address the note by `uri` + `relPath`.
|
|
160
161
|
|
|
161
162
|
`presetId` accepts `blank`, `project-note`, `research-note`, `decision-note`,
|
|
162
163
|
`prompt-pattern`, `source-summary`, `idea-original`, `person`,
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0566f9eb5eb5db6a1632063e63f37dab01a9d2a0aa3dde5658356926a53c395e gno-browser-clipper-v2.7.1.zip
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gmickel/gno",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.7.1",
|
|
4
4
|
"description": "Local semantic search for your documents. Index Markdown, PDF, and Office files with hybrid BM25 + vector search.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"embeddings",
|
|
@@ -89,6 +89,7 @@
|
|
|
89
89
|
"smoke:serve-shutdown": "bun scripts/serve-shutdown-smoke.ts",
|
|
90
90
|
"test:watcher:filesystem": "bun test test/serve/watch-service-filesystem.test.ts test/serve/resident-runtime.test.ts",
|
|
91
91
|
"bench:watcher-reconciliation": "bun scripts/watcher-reconciliation-benchmark.ts",
|
|
92
|
+
"bench:session-import": "bun scripts/session-import-benchmark.ts",
|
|
92
93
|
"smoke:watcher-reconciliation": "bun scripts/watcher-reconciliation-smoke.ts",
|
|
93
94
|
"bench:code-embeddings": "bun scripts/code-embedding-benchmark.ts",
|
|
94
95
|
"bench:code-embeddings:write": "bun scripts/code-embedding-benchmark.ts --write",
|
package/spec/cli.md
CHANGED
|
@@ -9,13 +9,14 @@ This document specifies the command-line interface for GNO, a local knowledge in
|
|
|
9
9
|
|
|
10
10
|
### Exit Codes
|
|
11
11
|
|
|
12
|
-
| Code | Name
|
|
13
|
-
| ---- |
|
|
14
|
-
| 0 | SUCCESS
|
|
15
|
-
| 1 | VALIDATION
|
|
16
|
-
| 2 | RUNTIME
|
|
17
|
-
| 3 | NOT_RUNNING
|
|
18
|
-
| 4 | BUSY
|
|
12
|
+
| Code | Name | Description |
|
|
13
|
+
| ---- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
14
|
+
| 0 | SUCCESS | Command completed successfully |
|
|
15
|
+
| 1 | VALIDATION | Validation or usage error (bad args, missing required params) |
|
|
16
|
+
| 2 | RUNTIME | Runtime failure (IO, DB, conversion, model, network) |
|
|
17
|
+
| 3 | NOT_RUNNING | `--status`/`--stop` found no live matching process; `CONTEXT_STALE`: a saved Context Capsule is stale |
|
|
18
|
+
| 4 | BUSY | Write-lease contention on `index` / `update` / `embed`; a lost `remember --supersede` race; a concurrent `sessions import`; a request ID still in progress (`REQUEST_PENDING`); `AUDIT_FINDINGS`: `gno audit` found findings; `CONTEXT_CONFLICT`: a saved Context Capsule conflicts |
|
|
19
|
+
| 5 | AUDIT_PARTIAL | `gno audit` evidence is partial |
|
|
19
20
|
|
|
20
21
|
### Global Flags
|
|
21
22
|
|
|
@@ -226,9 +227,20 @@ setup and emits `setup-profile-result@1.0`.
|
|
|
226
227
|
|
|
227
228
|
Display index status and health information.
|
|
228
229
|
|
|
229
|
-
Embedding backlog follows the
|
|
230
|
-
|
|
231
|
-
|
|
230
|
+
Embedding backlog follows the partition this runtime's retrieval reads (the
|
|
231
|
+
caller's recorded identity under the shared selection rule; before any query or
|
|
232
|
+
embed has resolved it, the activated runtime-independent partition) when
|
|
233
|
+
exact-input storage is authoritative, counting pending document/chunk owners.
|
|
234
|
+
`vectorRuntime` reports `{label, state: vectors|unavailable|unresolved,
|
|
235
|
+
partition, reason?}` for the calling process.
|
|
236
|
+
`vectorPartitions` (omitted when no partition exists) lists every partition of
|
|
237
|
+
the model with `id`, `model`, `dimensions`, `state` (`active`|`shadow`),
|
|
238
|
+
`legacy` (pre-runtime-independent key), `retrieval` (this runtime reads it),
|
|
239
|
+
`droppable` (`gno vec drop` accepts it), `owners` (current chunks),
|
|
240
|
+
`provenance` (building runtime, e.g. `CUDA, Bun 1.4.2`),
|
|
241
|
+
`compatibleRuntimes` (runtimes that read it) and `incompatibleRuntimes`.
|
|
242
|
+
Terminal output prints a `Vector partitions:` block
|
|
243
|
+
unless there is exactly one healthy partition. Per-collection chunk totals remain deduplicated by canonical chunk;
|
|
232
244
|
embedded counts require matching current inputs for every active owner within
|
|
233
245
|
that collection. Status reads persisted identity and coverage without loading
|
|
234
246
|
models. Legacy storage remains the fallback before variant authority; ambiguous
|
|
@@ -259,6 +271,21 @@ gno status [--json|--md]
|
|
|
259
271
|
"totalDocuments": 100,
|
|
260
272
|
"totalChunks": 500,
|
|
261
273
|
"embeddingBacklog": 0,
|
|
274
|
+
"vectorPartitions": [
|
|
275
|
+
{
|
|
276
|
+
"id": "3f2a9c1b2d4e...",
|
|
277
|
+
"model": "hf:Qwen/Qwen3-Embedding-0.6B-GGUF/Qwen3-Embedding-0.6B-Q8_0.gguf",
|
|
278
|
+
"dimensions": 1024,
|
|
279
|
+
"state": "active",
|
|
280
|
+
"legacy": false,
|
|
281
|
+
"retrieval": true,
|
|
282
|
+
"droppable": false,
|
|
283
|
+
"owners": 500,
|
|
284
|
+
"provenance": "CUDA, Bun 1.4.2",
|
|
285
|
+
"compatibleRuntimes": ["CUDA, Bun 1.4.2", "CPU, Bun 1.3.14"],
|
|
286
|
+
"incompatibleRuntimes": []
|
|
287
|
+
}
|
|
288
|
+
],
|
|
262
289
|
"lastUpdated": "2025-12-23T10:00:00Z",
|
|
263
290
|
"healthy": true,
|
|
264
291
|
"activation": {
|
|
@@ -328,6 +355,32 @@ truthful about its lifecycle: `mode:"direct-cli"`, `resident:false`, no
|
|
|
328
355
|
listener, and zero resident counters. It does not imply attachment to a live
|
|
329
356
|
`serve` or `daemon`.
|
|
330
357
|
|
|
358
|
+
When a detached `serve` or `daemon` (found through its pid-file) has a
|
|
359
|
+
background job in trouble, JSON output adds `backgroundIssues`; the key is
|
|
360
|
+
absent otherwise. Each item is a resident-status `backgroundIssue` plus the
|
|
361
|
+
process that reported it:
|
|
362
|
+
|
|
363
|
+
```json
|
|
364
|
+
"backgroundIssues": [
|
|
365
|
+
{
|
|
366
|
+
"process": "serve",
|
|
367
|
+
"pid": 41234,
|
|
368
|
+
"job": "embed",
|
|
369
|
+
"state": "parked",
|
|
370
|
+
"consecutiveFailures": 5,
|
|
371
|
+
"runningSeconds": null
|
|
372
|
+
}
|
|
373
|
+
]
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
`state` is `failing` (background embed passes failing and retrying with
|
|
377
|
+
backoff), `parked` (retries stopped after 5 failed passes; pending chunks wait
|
|
378
|
+
for new changes or `gno embed`), `overrunning` (one pass running longer than 15
|
|
379
|
+
minutes, `runningSeconds` set), or `unresponsive` (`job:"resident"`: the process
|
|
380
|
+
is alive but did not answer its status request within 500ms). Each resident is
|
|
381
|
+
asked once with that 500ms budget, so `gno status` never waits on a hung
|
|
382
|
+
resident. Terminal output lists the same issues under `Background issues:`.
|
|
383
|
+
|
|
331
384
|
Local activation fingerprints use active-document identifiers and source/mirror
|
|
332
385
|
hashes plus schema, tokenizer, and owned FTS synchronization metadata. Passive
|
|
333
386
|
status never selects or compares stored markdown or FTS bodies. On a receipt
|
|
@@ -1006,7 +1059,7 @@ gno update [--git-pull] [--json] [--lock-wait <duration>] [--no-wait]
|
|
|
1006
1059
|
| `--lock-wait <duration>` | duration | How long to wait for the index write lease (default: `120s`). Accepts `120`, `120s`, or `2m`. |
|
|
1007
1060
|
| `--no-wait` | boolean | Do not wait; fail immediately if another writer holds the lease |
|
|
1008
1061
|
|
|
1009
|
-
**Concurrency:** One writer at a time on the shared index database. `update` waits up to `--lock-wait` for the lease (the same `.mcp-write.lock` MCP write tools use); `index`, `embed`, `cleanup`, `vec sync`, `vec rebuild`, `collection clear-embeddings`, `tags add`, and `tags rm` follow the same contract; `capture` takes the same lock internally, and single-row writes such as `collection policy set` are absorbed by `busy_timeout`. `--no-wait` opts out. Reads (`search`, `query`, `get`) never take the lease. External serialising wrappers are no longer required for CLI-vs-CLI and CLI-vs-MCP overlap.
|
|
1062
|
+
**Concurrency:** One writer at a time on the shared index database. `update` waits up to `--lock-wait` for the lease (the same `.mcp-write.lock` MCP write tools use); `index`, `embed`, `cleanup`, `vec sync`, `vec rebuild`, `vec drop`, `collection clear-embeddings`, `tags add`, and `tags rm` follow the same contract; `capture` takes the same lock internally, and single-row writes such as `collection policy set` are absorbed by `busy_timeout`. `--no-wait` opts out. Reads (`search`, `query`, `get`) never take the lease. External serialising wrappers are no longer required for CLI-vs-CLI and CLI-vs-MCP overlap. A resident (`gno serve`/`gno daemon`) takes the same lease without waiting around each watcher sync, embed preparation, background-embedding page write (never around inference), and the final vector activation; when the lease is held it defers that work (watcher retry after 5s, embed pass rescheduled) instead of writing, so resident background writes never hold a SQLite write lock outside the lease. The resident's own SQLite busy wait is capped at 500ms so a stop signal is always handled within the stop grace.
|
|
1010
1063
|
|
|
1011
1064
|
**Behavior:**
|
|
1012
1065
|
|
|
@@ -1135,9 +1188,20 @@ memory pressure prevents creating the full pool.
|
|
|
1135
1188
|
**Synopsis:**
|
|
1136
1189
|
|
|
1137
1190
|
```bash
|
|
1138
|
-
gno embed [--force] [--model <uri>] [--batch-size <n>] [--dry-run] [--yes] [--json] [--lock-wait <duration>] [--no-wait]
|
|
1191
|
+
gno embed [--force] [--model <uri>] [--batch-size <n>] [--dry-run] [--yes] [--new-partition] [--json] [--lock-wait <duration>] [--no-wait]
|
|
1139
1192
|
```
|
|
1140
1193
|
|
|
1194
|
+
Vector partitions are keyed on model weights, formatter, dimensions, context
|
|
1195
|
+
size and truncation policy. Runtime details (Bun, `node-llama-cpp`, GPU/CPU
|
|
1196
|
+
backend, threads) are provenance. A runtime meeting a partition for the first
|
|
1197
|
+
time re-embeds up to 8 stored chunks; every one must reach cosine 0.99 against
|
|
1198
|
+
its stored vector, and the verdict is cached per (partition, runtime). A
|
|
1199
|
+
compatible runtime resumes the backlog in that partition. An incompatible one
|
|
1200
|
+
(or an ambiguous one-time re-key of pre-existing partitions) would build a
|
|
1201
|
+
separate partition: embed then states the full chunk count and an estimate and
|
|
1202
|
+
requires confirmation, interactively or with `--new-partition`. `--yes` alone
|
|
1203
|
+
never confirms; without confirmation embed exits 2 and writes nothing.
|
|
1204
|
+
|
|
1141
1205
|
**Options:**
|
|
1142
1206
|
|
|
1143
1207
|
| Option | Type | Default | Description |
|
|
@@ -1146,7 +1210,8 @@ gno embed [--force] [--model <uri>] [--batch-size <n>] [--dry-run] [--yes] [--js
|
|
|
1146
1210
|
| `--model` | string | config | Override embedding model URI |
|
|
1147
1211
|
| `--batch-size` | integer | 32 | Chunks per batch |
|
|
1148
1212
|
| `--dry-run` | boolean | false | Show what would be embedded without doing it |
|
|
1149
|
-
| `--yes`, `-y` | boolean | false | Skip confirmation prompts
|
|
1213
|
+
| `--yes`, `-y` | boolean | false | Skip confirmation prompts (never confirms a separate vector partition) |
|
|
1214
|
+
| `--new-partition` | boolean | false | Confirm building a separate vector partition for an incompatible runtime |
|
|
1150
1215
|
| `--json` | boolean | false | Output result as JSON |
|
|
1151
1216
|
| `--lock-wait <duration>` | duration | `120s` | How long to wait for the index write lease. Accepts `120`, `120s`, or `2m`. |
|
|
1152
1217
|
| `--no-wait` | boolean | false | Do not wait; fail immediately if another writer holds the lease |
|
|
@@ -1316,7 +1381,9 @@ by default when the collection root and `source.relPath` can be joined; search
|
|
|
1316
1381
|
has no `--source` flag. When `absPath` is absent (unresolvable collection path,
|
|
1317
1382
|
missing relPath, or a hit without a filesystem file), consumers display the URI
|
|
1318
1383
|
tail and must disable file-open for that row — do not call `gno get` just to
|
|
1319
|
-
recover a path.
|
|
1384
|
+
recover a path. The CLI always runs on the owner's machine; the same result shape over
|
|
1385
|
+
remote REST or HTTP MCP omits `absPath` (see
|
|
1386
|
+
[docs/API.md](../docs/API.md#host-paths-and-remote-callers)).
|
|
1320
1387
|
|
|
1321
1388
|
Every structured search result may include `context`, the matching
|
|
1322
1389
|
user-configured guidance joined in deterministic global, collection, then
|
|
@@ -2705,6 +2772,31 @@ content, asset descriptors, source references, nor raster bytes.
|
|
|
2705
2772
|
|
|
2706
2773
|
---
|
|
2707
2774
|
|
|
2775
|
+
### gno vec drop
|
|
2776
|
+
|
|
2777
|
+
Drop an abandoned shadow vector partition (legacy shadows included) the calling runtime's
|
|
2778
|
+
retrieval does not read, with its vectors, owners and runtime verdicts.
|
|
2779
|
+
|
|
2780
|
+
**Synopsis:**
|
|
2781
|
+
|
|
2782
|
+
```bash
|
|
2783
|
+
gno vec drop <partition> [--json] [--lock-wait <duration>] [--no-wait]
|
|
2784
|
+
```
|
|
2785
|
+
|
|
2786
|
+
`<partition>` is an id prefix of at least 8 characters from `gno status`
|
|
2787
|
+
(`vectorPartitions[].id`). Only partitions with `droppable: true` are accepted:
|
|
2788
|
+
shadow partitions this runtime does not read; every active partition, legacy
|
|
2789
|
+
included, is refused. JSON output is
|
|
2790
|
+
`{"dropped": <vectorPartitions item>}`.
|
|
2791
|
+
|
|
2792
|
+
**Exit Codes:**
|
|
2793
|
+
|
|
2794
|
+
- 0: Dropped
|
|
2795
|
+
- 1: Unknown, ambiguous or protected partition
|
|
2796
|
+
- 4: Write lease busy with `--no-wait`
|
|
2797
|
+
|
|
2798
|
+
---
|
|
2799
|
+
|
|
2708
2800
|
### gno cleanup
|
|
2709
2801
|
|
|
2710
2802
|
Remove orphaned content, chunks, and vectors not referenced by active documents.
|
|
@@ -4436,15 +4528,14 @@ Errors are written to stderr. With `--json` flag, errors are also returned as:
|
|
|
4436
4528
|
}
|
|
4437
4529
|
```
|
|
4438
4530
|
|
|
4439
|
-
Error codes
|
|
4531
|
+
Error codes and their exit codes: `VALIDATION` (1), `RUNTIME` (2), `NOT_RUNNING` (3), `CONTEXT_STALE` (3), `BUSY` (4), `AUDIT_FINDINGS` (4), `CONTEXT_CONFLICT` (4), `AUDIT_PARTIAL` (5). `error.schema.json` lists exactly this set.
|
|
4532
|
+
`AUDIT_FINDINGS`, `AUDIT_PARTIAL`, `CONTEXT_STALE`, and `CONTEXT_CONFLICT` signal through the exit code alone, after the command's own output; they write no envelope.
|
|
4440
4533
|
Request ID errors keep their stable request code in `details.requestCode`
|
|
4441
4534
|
(see [gno request-status](#gno-request-status)).
|
|
4442
4535
|
|
|
4443
4536
|
Write-lease contention on `index` / `update` / `embed` does not use the generic envelope. Text mode writes the dedicated "index is busy" message to stderr; `--json` writes `{ success: false, error, contention }` to stdout. Both exit 4. `gno audit` also uses exit 4 for findings.
|
|
4444
4537
|
|
|
4445
|
-
**`NOT_RUNNING` is not
|
|
4446
|
-
|
|
4447
|
-
**`NOT_RUNNING` is not an error envelope.** `gno serve|daemon --status --json` returns a `process-status`-shaped payload on stdout with exit 3 when no live matching process is found (it reports observable state, not failure). `--stop` exits 3 silently when there is nothing to stop and does not accept `--json`. The error envelope above is reserved for `VALIDATION` and `RUNTIME` failures where the command could not produce its structured output at all.
|
|
4538
|
+
**`NOT_RUNNING` is not a failure payload.** `gno serve|daemon --status --json` returns a `process-status`-shaped payload on stdout with exit 3 when no live matching process is found (it reports observable state, not failure); the `NOT_RUNNING` envelope goes to stderr only. `--stop` exits 3 silently when there is nothing to stop and does not accept `--json`. The error envelope above is reserved for `VALIDATION`, `RUNTIME`, and `BUSY` failures where the command could not produce its structured output at all.
|
|
4448
4539
|
|
|
4449
4540
|
---
|
|
4450
4541
|
|
package/spec/mcp.md
CHANGED
|
@@ -267,6 +267,15 @@ Because `gno serve` shares this listener with its Web UI and REST API, it
|
|
|
267
267
|
remains loopback-only. Use the headless `gno daemon` command for an explicitly
|
|
268
268
|
authenticated non-loopback MCP listener.
|
|
269
269
|
|
|
270
|
+
HTTP MCP results never carry a host absolute path, whatever the peer zone:
|
|
271
|
+
every `absPath` field (`source.absPath` on search/query/ask/get/multi-get
|
|
272
|
+
results, top-level `absPath` on `gno_capture` and `gno_remember` receipts,
|
|
273
|
+
`similar[].absPath`, peek `recent[].absPath`) is removed from both
|
|
274
|
+
`structuredContent` and the text content, and a resource header's `source:`
|
|
275
|
+
line names the collection-relative path. Callers address documents by `uri`
|
|
276
|
+
and `relPath`. Stdio callers keep host paths. The field inventory lives in
|
|
277
|
+
[docs/API.md](../docs/API.md#host-paths-and-remote-callers).
|
|
278
|
+
|
|
270
279
|
HTTP MCP remains read-only unless `gateway.enableWrite: true` or
|
|
271
280
|
`--mcp-enable-write` is explicitly set. Bearer authentication alone does not
|
|
272
281
|
authorize mutation. Unauthorized calls to write tools fail with HTTP 403 before
|
|
@@ -1343,6 +1352,21 @@ counters; it never claims attachment to another process.
|
|
|
1343
1352
|
"totalDocuments": 150,
|
|
1344
1353
|
"totalChunks": 800,
|
|
1345
1354
|
"embeddingBacklog": 0,
|
|
1355
|
+
"vectorPartitions": [
|
|
1356
|
+
{
|
|
1357
|
+
"id": "3f2a9c1b2d4e...",
|
|
1358
|
+
"model": "hf:Qwen/Qwen3-Embedding-0.6B-GGUF/Qwen3-Embedding-0.6B-Q8_0.gguf",
|
|
1359
|
+
"dimensions": 1024,
|
|
1360
|
+
"state": "active",
|
|
1361
|
+
"legacy": false,
|
|
1362
|
+
"retrieval": true,
|
|
1363
|
+
"droppable": false,
|
|
1364
|
+
"owners": 500,
|
|
1365
|
+
"provenance": "CUDA, Bun 1.4.2",
|
|
1366
|
+
"compatibleRuntimes": ["CUDA, Bun 1.4.2", "CPU, Bun 1.3.14"],
|
|
1367
|
+
"incompatibleRuntimes": []
|
|
1368
|
+
}
|
|
1369
|
+
],
|
|
1346
1370
|
"contentTypeBoost": {
|
|
1347
1371
|
"rulesFingerprint": "<sha256>",
|
|
1348
1372
|
"rules": [{ "id": "decision", "searchBoost": 2 }]
|
|
@@ -1352,6 +1376,16 @@ counters; it never claims attachment to another process.
|
|
|
1352
1376
|
}
|
|
1353
1377
|
```
|
|
1354
1378
|
|
|
1379
|
+
`vectorPartitions` (omitted when none exist) lists the embedding model's
|
|
1380
|
+
vector partitions; `embeddingBacklog` and per-collection embedded counts use
|
|
1381
|
+
the one with `retrieval: true`, the partition this server process's queries
|
|
1382
|
+
read under the same selection rule as retrieval (`vectorRuntime` reports
|
|
1383
|
+
`vectors`, `unavailable` with a reason, or `unresolved` before its first query
|
|
1384
|
+
or embed). `droppable` marks what `gno vec drop` accepts. Other partitions carry `state`, `owners` and a
|
|
1385
|
+
readable `provenance`; `compatibleRuntimes` names the runtimes that read a
|
|
1386
|
+
partition and `incompatibleRuntimes` names runtimes measured unable to
|
|
1387
|
+
reproduce the stored vectors, whose queries use lexical retrieval only.
|
|
1388
|
+
|
|
1355
1389
|
`contentTypeBoost` is a redacted ranking-status projection. It exposes only
|
|
1356
1390
|
normalized IDs/factors plus the rules fingerprint; path prefixes are never
|
|
1357
1391
|
returned.
|
|
@@ -1682,7 +1716,7 @@ file edits update existing notes, `gno_remember` upserts a fact.
|
|
|
1682
1716
|
fact, nothing written
|
|
1683
1717
|
- `outcome: "candidates"` — likely matches and no `decision`; `candidates[]`
|
|
1684
1718
|
carry `similarity` and `match` (`exact` | `likely` | `weak`), nothing written
|
|
1685
|
-
- `outcome: "added" | "superseded"` — `record`, `absPath
|
|
1719
|
+
- `outcome: "added" | "superseded"` — `record`, `absPath` (stdio only), and
|
|
1686
1720
|
`sync.status` (`completed` before the call returns; the fact is lexically
|
|
1687
1721
|
searchable)
|
|
1688
1722
|
- `matching` — `mode` (`semantic` | `lexical`), `threshold`, and
|
|
@@ -2915,7 +2949,7 @@ Content includes optional header comment:
|
|
|
2915
2949
|
|-------|-------------|
|
|
2916
2950
|
| URI | Full gno:// URI |
|
|
2917
2951
|
| docid | Document ID |
|
|
2918
|
-
| source | Absolute path to source file |
|
|
2952
|
+
| source | Absolute path to source file (stdio); collection-relative path over HTTP |
|
|
2919
2953
|
| mime | Source file MIME type |
|
|
2920
2954
|
| language | Document language hint (if available) |
|
|
2921
2955
|
|
|
@@ -322,7 +322,7 @@
|
|
|
322
322
|
"properties": {
|
|
323
323
|
"absPath": {
|
|
324
324
|
"type": "string",
|
|
325
|
-
"description": "Absolute path (
|
|
325
|
+
"description": "Absolute source path. Host path: local callers only (CLI, stdio MCP, same-host Web UI/REST); omitted for remote REST and HTTP MCP callers, which identify the document by uri + relPath."
|
|
326
326
|
},
|
|
327
327
|
"relPath": {
|
|
328
328
|
"type": "string",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
},
|
|
44
44
|
"absPath": {
|
|
45
45
|
"type": "string",
|
|
46
|
-
"description": "Absolute path
|
|
46
|
+
"description": "Absolute path of the written file. Host path: local callers only (CLI, stdio MCP, same-host Web UI/REST); omitted for remote REST and HTTP MCP callers, which identify the document by uri + relPath."
|
|
47
47
|
},
|
|
48
48
|
"serverInstanceId": {
|
|
49
49
|
"type": "string"
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"type": "array",
|
|
7
7
|
"items": {
|
|
8
8
|
"type": "object",
|
|
9
|
-
"required": ["name", "
|
|
9
|
+
"required": ["name", "pattern", "include", "exclude"],
|
|
10
10
|
"properties": {
|
|
11
11
|
"name": {
|
|
12
12
|
"type": "string",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"path": {
|
|
17
17
|
"type": "string",
|
|
18
|
-
"description": "Absolute path to collection root directory"
|
|
18
|
+
"description": "Absolute path to collection root directory. Same-host callers only: omitted for a remote REST caller."
|
|
19
19
|
},
|
|
20
20
|
"pattern": {
|
|
21
21
|
"type": "string",
|
|
@@ -243,6 +243,94 @@
|
|
|
243
243
|
"type": "string"
|
|
244
244
|
}
|
|
245
245
|
},
|
|
246
|
+
"vectorPartitions": {
|
|
247
|
+
"type": "array",
|
|
248
|
+
"description": "Vector partitions (vector-partitions check); `retrieval` marks the one status and search use",
|
|
249
|
+
"items": {
|
|
250
|
+
"type": "object",
|
|
251
|
+
"additionalProperties": false,
|
|
252
|
+
"required": [
|
|
253
|
+
"id",
|
|
254
|
+
"model",
|
|
255
|
+
"dimensions",
|
|
256
|
+
"state",
|
|
257
|
+
"legacy",
|
|
258
|
+
"retrieval",
|
|
259
|
+
"droppable",
|
|
260
|
+
"owners",
|
|
261
|
+
"provenance",
|
|
262
|
+
"compatibleRuntimes",
|
|
263
|
+
"incompatibleRuntimes"
|
|
264
|
+
],
|
|
265
|
+
"properties": {
|
|
266
|
+
"id": {
|
|
267
|
+
"type": "string"
|
|
268
|
+
},
|
|
269
|
+
"model": {
|
|
270
|
+
"type": "string"
|
|
271
|
+
},
|
|
272
|
+
"dimensions": {
|
|
273
|
+
"type": "integer",
|
|
274
|
+
"minimum": 1
|
|
275
|
+
},
|
|
276
|
+
"state": {
|
|
277
|
+
"type": "string",
|
|
278
|
+
"enum": ["active", "shadow"]
|
|
279
|
+
},
|
|
280
|
+
"legacy": {
|
|
281
|
+
"type": "boolean"
|
|
282
|
+
},
|
|
283
|
+
"retrieval": {
|
|
284
|
+
"type": "boolean"
|
|
285
|
+
},
|
|
286
|
+
"droppable": {
|
|
287
|
+
"type": "boolean"
|
|
288
|
+
},
|
|
289
|
+
"owners": {
|
|
290
|
+
"type": "integer",
|
|
291
|
+
"minimum": 0
|
|
292
|
+
},
|
|
293
|
+
"provenance": {
|
|
294
|
+
"type": "string"
|
|
295
|
+
},
|
|
296
|
+
"compatibleRuntimes": {
|
|
297
|
+
"type": "array",
|
|
298
|
+
"items": {
|
|
299
|
+
"type": "string"
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
"incompatibleRuntimes": {
|
|
303
|
+
"type": "array",
|
|
304
|
+
"items": {
|
|
305
|
+
"type": "string"
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
"vectorRuntime": {
|
|
312
|
+
"type": "object",
|
|
313
|
+
"additionalProperties": false,
|
|
314
|
+
"required": ["label", "state", "partition"],
|
|
315
|
+
"description": "This process's runtime, resolved by the same selection rule its queries use",
|
|
316
|
+
"properties": {
|
|
317
|
+
"label": {
|
|
318
|
+
"type": ["string", "null"],
|
|
319
|
+
"description": "Runtime recorded by this caller's last query or embed"
|
|
320
|
+
},
|
|
321
|
+
"state": {
|
|
322
|
+
"type": "string",
|
|
323
|
+
"enum": ["vectors", "unavailable", "unresolved"],
|
|
324
|
+
"description": "vectors: queries read `partition`; unavailable: lexical retrieval only; unresolved: no query or embed has resolved this caller yet"
|
|
325
|
+
},
|
|
326
|
+
"partition": {
|
|
327
|
+
"type": ["string", "null"]
|
|
328
|
+
},
|
|
329
|
+
"reason": {
|
|
330
|
+
"type": "string"
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
},
|
|
246
334
|
"embeddingFingerprint": {
|
|
247
335
|
"type": "object",
|
|
248
336
|
"description": "Embedding freshness fingerprint diagnostics",
|