@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.
- package/README.md +5 -3
- package/assets/skill/SKILL.md +27 -0
- package/package.json +2 -1
- package/spec/AGENTS.md +83 -0
- package/spec/CLAUDE.md +83 -0
- package/spec/bench-fixture.schema.json +137 -0
- package/spec/cli.md +2894 -0
- package/spec/db/schema.sql +442 -0
- package/spec/evals-agentic.md +510 -0
- package/spec/evals.md +1106 -0
- package/spec/mcp.md +2229 -0
- package/spec/output-schemas/activation-verification.schema.json +515 -0
- package/spec/output-schemas/ask.schema.json +366 -0
- package/spec/output-schemas/backlinks.schema.json +131 -0
- package/spec/output-schemas/bench-result.schema.json +120 -0
- package/spec/output-schemas/capture-receipt.schema.json +143 -0
- package/spec/output-schemas/collection-list.schema.json +45 -0
- package/spec/output-schemas/context-capsule-v1.schema.json +691 -0
- package/spec/output-schemas/context-capsule-verification.schema.json +1338 -0
- package/spec/output-schemas/context-list.schema.json +21 -0
- package/spec/output-schemas/doctor.schema.json +313 -0
- package/spec/output-schemas/error.schema.json +30 -0
- package/spec/output-schemas/expansion.schema.json +37 -0
- package/spec/output-schemas/get.schema.json +140 -0
- package/spec/output-schemas/graph-query.schema.json +99 -0
- package/spec/output-schemas/graph.schema.json +371 -0
- package/spec/output-schemas/links-list.schema.json +186 -0
- package/spec/output-schemas/mcp-add-collection-result.schema.json +23 -0
- package/spec/output-schemas/mcp-capture-result.schema.json +152 -0
- package/spec/output-schemas/mcp-http-error.schema.json +30 -0
- package/spec/output-schemas/mcp-job-list.schema.json +58 -0
- package/spec/output-schemas/mcp-job-status.schema.json +224 -0
- package/spec/output-schemas/mcp-remove-result.schema.json +39 -0
- package/spec/output-schemas/mcp-sync-result.schema.json +41 -0
- package/spec/output-schemas/mcp-tag-result.schema.json +33 -0
- package/spec/output-schemas/models-list.schema.json +93 -0
- package/spec/output-schemas/multi-get.schema.json +103 -0
- package/spec/output-schemas/process-status.schema.json +119 -0
- package/spec/output-schemas/query-diagnose.schema.json +123 -0
- package/spec/output-schemas/resident-status.schema.json +154 -0
- package/spec/output-schemas/retrieval-trace-common.schema.json +492 -0
- package/spec/output-schemas/retrieval-trace-delete.schema.json +16 -0
- package/spec/output-schemas/retrieval-trace-export.schema.json +61 -0
- package/spec/output-schemas/retrieval-trace-filters.schema.json +139 -0
- package/spec/output-schemas/retrieval-trace-judgment.schema.json +15 -0
- package/spec/output-schemas/retrieval-trace-list.schema.json +18 -0
- package/spec/output-schemas/retrieval-trace-payloads.schema.json +178 -0
- package/spec/output-schemas/retrieval-trace-purge.schema.json +31 -0
- package/spec/output-schemas/retrieval-trace-qrels.schema.json +303 -0
- package/spec/output-schemas/retrieval-trace-replay.schema.json +286 -0
- package/spec/output-schemas/retrieval-trace-show.schema.json +69 -0
- package/spec/output-schemas/retrieval-trace-summary.schema.json +65 -0
- package/spec/output-schemas/search-result.schema.json +154 -0
- package/spec/output-schemas/search-results.schema.json +338 -0
- package/spec/output-schemas/similar.schema.json +84 -0
- package/spec/output-schemas/status.schema.json +676 -0
- package/spec/output-schemas/tags-list.schema.json +48 -0
- package/src/app/context-runtime-types.ts +3 -0
- package/src/app/context-runtime.ts +15 -1
- package/src/cli/commands/ask.ts +106 -36
- package/src/cli/commands/context-build.ts +56 -9
- package/src/cli/commands/get.ts +64 -3
- package/src/cli/commands/query.ts +62 -23
- package/src/cli/commands/replay.ts +140 -0
- package/src/cli/commands/search.ts +48 -3
- package/src/cli/commands/shared.ts +3 -1
- package/src/cli/commands/trace.ts +200 -0
- package/src/cli/commands/vsearch.ts +75 -53
- package/src/cli/program.ts +255 -0
- package/src/config/index.ts +9 -0
- package/src/config/retrieval-traces.ts +56 -0
- package/src/config/types.ts +4 -0
- package/src/core/context-compiler.ts +11 -4
- package/src/core/retrieval-qrels.ts +405 -0
- package/src/core/retrieval-replay-candidate.ts +368 -0
- package/src/core/retrieval-replay-types.ts +109 -0
- package/src/core/retrieval-replay-validation.ts +89 -0
- package/src/core/retrieval-replay.ts +441 -0
- package/src/core/retrieval-trace-evidence-origin.ts +175 -0
- package/src/core/retrieval-trace-export.ts +113 -0
- package/src/core/retrieval-trace-filter-normalization.ts +27 -0
- package/src/core/retrieval-trace-filters.ts +19 -0
- package/src/core/retrieval-trace-management-helpers.ts +247 -0
- package/src/core/retrieval-trace-management-types.ts +132 -0
- package/src/core/retrieval-trace-management.ts +422 -0
- package/src/core/retrieval-trace-request.ts +141 -0
- package/src/core/retrieval-trace-session.ts +494 -0
- package/src/core/retrieval-trace.ts +472 -0
- package/src/mcp/tools/context.ts +59 -8
- package/src/mcp/tools/get.ts +35 -1
- package/src/mcp/tools/index.ts +74 -0
- package/src/mcp/tools/query.ts +95 -64
- package/src/mcp/tools/search.ts +36 -13
- package/src/mcp/tools/trace.ts +143 -0
- package/src/mcp/tools/vsearch.ts +71 -38
- package/src/pipeline/answer.ts +167 -26
- package/src/pipeline/graph-retrieval.ts +15 -1
- package/src/pipeline/hybrid.ts +151 -43
- package/src/pipeline/search.ts +36 -3
- package/src/pipeline/trace-metadata.ts +47 -0
- package/src/pipeline/types.ts +43 -0
- package/src/pipeline/vsearch.ts +101 -38
- package/src/sdk/client.ts +380 -71
- package/src/sdk/documents.ts +48 -1
- package/src/sdk/index.ts +17 -0
- package/src/sdk/types.ts +28 -0
- package/src/serve/context-capsule.ts +67 -8
- package/src/serve/public/app.tsx +12 -1
- package/src/serve/public/globals.built.css +1 -1
- package/src/serve/public/lib/workspace-tabs.ts +2 -0
- package/src/serve/public/pages/Dashboard.tsx +10 -0
- package/src/serve/public/pages/TraceHistory.tsx +478 -0
- package/src/serve/public/pages/trace-history-detail.tsx +224 -0
- package/src/serve/retrieval-trace.ts +28 -0
- package/src/serve/routes/api.ts +366 -72
- package/src/serve/routes/traces.ts +156 -0
- package/src/serve/server.ts +87 -2
- package/src/store/index.ts +31 -0
- package/src/store/migrations/014-retrieval-traces.ts +303 -0
- package/src/store/migrations/index.ts +2 -0
- package/src/store/retrieval-trace-codec.ts +384 -0
- package/src/store/sqlite/adapter.ts +153 -1
- package/src/store/sqlite/retrieval-trace-management-store.ts +341 -0
- package/src/store/sqlite/retrieval-trace-retention.ts +349 -0
- package/src/store/sqlite/retrieval-trace-rows.ts +267 -0
- package/src/store/sqlite/retrieval-trace-store.ts +515 -0
- package/src/store/types.ts +297 -0
- package/src/store/vector/sqlite-vec.ts +76 -1
- package/src/store/vector/types.ts +1 -1
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
-- GNO Database Schema v1
|
|
2
|
+
-- SQLite with FTS5
|
|
3
|
+
--
|
|
4
|
+
-- Tables:
|
|
5
|
+
-- schema_meta - Migration tracking and index metadata
|
|
6
|
+
-- collections - Cached collection config (synced from YAML)
|
|
7
|
+
-- contexts - Cached context config (synced from YAML)
|
|
8
|
+
-- documents - Source file identity and conversion metadata
|
|
9
|
+
-- content - Content-addressed markdown mirrors
|
|
10
|
+
-- content_chunks - Chunked content with line ranges
|
|
11
|
+
-- content_fts - FTS5 virtual table over chunks
|
|
12
|
+
-- content_vectors - Embeddings per chunk per model (EPIC 7)
|
|
13
|
+
-- llm_cache - Cached LLM responses (EPIC 6+)
|
|
14
|
+
-- ingest_errors - Conversion/indexing error records
|
|
15
|
+
-- doc_tags - Document tags (frontmatter and user-added)
|
|
16
|
+
-- doc_links - Wiki and markdown links between documents
|
|
17
|
+
-- doc_edges - Derived semantic document relationships
|
|
18
|
+
-- activation_receipts - Bounded per-collection retrieval proof receipts
|
|
19
|
+
-- retrieval_traces - Opt-in private retrieval trace headers
|
|
20
|
+
-- retrieval_trace_runs/events/judgments - Bounded trace outcome records
|
|
21
|
+
-- retrieval_trace_exports/export_traces - Export manifests and trace joins
|
|
22
|
+
|
|
23
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
24
|
+
-- Schema Metadata
|
|
25
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
26
|
+
|
|
27
|
+
CREATE TABLE IF NOT EXISTS schema_meta (
|
|
28
|
+
key TEXT PRIMARY KEY,
|
|
29
|
+
value TEXT NOT NULL,
|
|
30
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
-- Seeded by migration runner:
|
|
34
|
+
-- version = '1'
|
|
35
|
+
-- fts_tokenizer = 'unicode61' (from config)
|
|
36
|
+
-- created_at = datetime('now')
|
|
37
|
+
|
|
38
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
39
|
+
-- Collections (synced from YAML config)
|
|
40
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
41
|
+
|
|
42
|
+
CREATE TABLE IF NOT EXISTS collections (
|
|
43
|
+
name TEXT PRIMARY KEY,
|
|
44
|
+
path TEXT NOT NULL,
|
|
45
|
+
pattern TEXT NOT NULL DEFAULT '**/*',
|
|
46
|
+
include TEXT, -- JSON array of extensions
|
|
47
|
+
exclude TEXT, -- JSON array of patterns
|
|
48
|
+
update_cmd TEXT,
|
|
49
|
+
language_hint TEXT, -- BCP-47 or NULL
|
|
50
|
+
synced_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
54
|
+
-- Contexts (synced from YAML config)
|
|
55
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
56
|
+
|
|
57
|
+
CREATE TABLE IF NOT EXISTS contexts (
|
|
58
|
+
scope_type TEXT NOT NULL CHECK (scope_type IN ('global', 'collection', 'prefix')),
|
|
59
|
+
scope_key TEXT NOT NULL,
|
|
60
|
+
text TEXT NOT NULL,
|
|
61
|
+
synced_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
62
|
+
PRIMARY KEY (scope_type, scope_key)
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
66
|
+
-- Documents (source file identity)
|
|
67
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
CREATE TABLE IF NOT EXISTS documents (
|
|
70
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
71
|
+
collection TEXT NOT NULL,
|
|
72
|
+
rel_path TEXT NOT NULL,
|
|
73
|
+
|
|
74
|
+
-- Source file metadata
|
|
75
|
+
source_hash TEXT NOT NULL, -- SHA-256 of source bytes
|
|
76
|
+
source_mime TEXT NOT NULL,
|
|
77
|
+
source_ext TEXT NOT NULL,
|
|
78
|
+
source_size INTEGER NOT NULL,
|
|
79
|
+
source_mtime TEXT NOT NULL,
|
|
80
|
+
|
|
81
|
+
-- Derived identifiers
|
|
82
|
+
docid TEXT NOT NULL, -- #<8 hex> from source_hash
|
|
83
|
+
uri TEXT NOT NULL, -- gno://collection/rel_path
|
|
84
|
+
|
|
85
|
+
-- Conversion output
|
|
86
|
+
title TEXT,
|
|
87
|
+
mirror_hash TEXT, -- FK to content.mirror_hash (NULL if failed)
|
|
88
|
+
fts_mirror_hash TEXT, -- supported writers maintain transactionally; migration 013 validates legacy bodies once
|
|
89
|
+
converter_id TEXT,
|
|
90
|
+
converter_version TEXT,
|
|
91
|
+
language_hint TEXT, -- BCP-47 or NULL
|
|
92
|
+
content_type_source TEXT, -- frontmatter | rules | default | extension | null
|
|
93
|
+
|
|
94
|
+
-- Status
|
|
95
|
+
active INTEGER NOT NULL DEFAULT 1,
|
|
96
|
+
|
|
97
|
+
-- Error tracking (denormalized for quick status)
|
|
98
|
+
last_error_code TEXT,
|
|
99
|
+
last_error_message TEXT,
|
|
100
|
+
last_error_at TEXT,
|
|
101
|
+
|
|
102
|
+
-- Timestamps
|
|
103
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
104
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
105
|
+
|
|
106
|
+
UNIQUE (collection, rel_path),
|
|
107
|
+
FOREIGN KEY (collection) REFERENCES collections(name) ON DELETE CASCADE
|
|
108
|
+
-- Note: mirror_hash is NOT an FK - documents are tracked before content exists
|
|
109
|
+
-- Cleanup via cleanupOrphans() handles orphaned content
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
CREATE INDEX IF NOT EXISTS idx_documents_collection ON documents(collection);
|
|
113
|
+
CREATE INDEX IF NOT EXISTS idx_documents_active ON documents(active);
|
|
114
|
+
CREATE INDEX IF NOT EXISTS idx_documents_mirror_hash ON documents(mirror_hash);
|
|
115
|
+
CREATE INDEX IF NOT EXISTS idx_documents_docid ON documents(docid);
|
|
116
|
+
CREATE INDEX IF NOT EXISTS idx_documents_uri ON documents(uri);
|
|
117
|
+
|
|
118
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
119
|
+
-- Content (content-addressed markdown mirrors)
|
|
120
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
121
|
+
|
|
122
|
+
CREATE TABLE IF NOT EXISTS content (
|
|
123
|
+
mirror_hash TEXT PRIMARY KEY, -- SHA-256 of canonical markdown
|
|
124
|
+
markdown TEXT NOT NULL,
|
|
125
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
129
|
+
-- Content Chunks (for FTS and vectors)
|
|
130
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
131
|
+
|
|
132
|
+
CREATE TABLE IF NOT EXISTS content_chunks (
|
|
133
|
+
mirror_hash TEXT NOT NULL,
|
|
134
|
+
seq INTEGER NOT NULL, -- 0-indexed chunk sequence
|
|
135
|
+
pos INTEGER NOT NULL, -- Byte offset in markdown
|
|
136
|
+
text TEXT NOT NULL,
|
|
137
|
+
start_line INTEGER NOT NULL,
|
|
138
|
+
end_line INTEGER NOT NULL,
|
|
139
|
+
language TEXT, -- BCP-47 detected language
|
|
140
|
+
token_count INTEGER, -- Optional for debugging
|
|
141
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
142
|
+
PRIMARY KEY (mirror_hash, seq),
|
|
143
|
+
FOREIGN KEY (mirror_hash) REFERENCES content(mirror_hash) ON DELETE CASCADE
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
CREATE INDEX IF NOT EXISTS idx_chunks_mirror_hash ON content_chunks(mirror_hash);
|
|
147
|
+
|
|
148
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
149
|
+
-- FTS5 Virtual Table
|
|
150
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
151
|
+
|
|
152
|
+
-- Tokenizer is set from config (unicode61/porter/trigram)
|
|
153
|
+
-- External content mode for efficient updates
|
|
154
|
+
--
|
|
155
|
+
-- Note: FTS table created with dynamic tokenizer in migration runner:
|
|
156
|
+
-- CREATE VIRTUAL TABLE content_fts USING fts5(
|
|
157
|
+
-- text,
|
|
158
|
+
-- content='content_chunks',
|
|
159
|
+
-- content_rowid='rowid',
|
|
160
|
+
-- tokenize='unicode61' -- or porter/trigram from config
|
|
161
|
+
-- );
|
|
162
|
+
|
|
163
|
+
-- Placeholder for reference (actual creation in migration):
|
|
164
|
+
-- CREATE VIRTUAL TABLE IF NOT EXISTS content_fts USING fts5(
|
|
165
|
+
-- text,
|
|
166
|
+
-- tokenize='unicode61'
|
|
167
|
+
-- );
|
|
168
|
+
|
|
169
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
170
|
+
-- Content Vectors (embeddings - EPIC 7)
|
|
171
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
172
|
+
|
|
173
|
+
CREATE TABLE IF NOT EXISTS content_vectors (
|
|
174
|
+
mirror_hash TEXT NOT NULL,
|
|
175
|
+
seq INTEGER NOT NULL,
|
|
176
|
+
model TEXT NOT NULL, -- Model identifier (e.g., 'bge-m3')
|
|
177
|
+
embed_fingerprint TEXT NOT NULL DEFAULT '',
|
|
178
|
+
embedding BLOB NOT NULL, -- Float32Array serialized
|
|
179
|
+
embedded_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
180
|
+
PRIMARY KEY (mirror_hash, seq, model),
|
|
181
|
+
FOREIGN KEY (mirror_hash, seq) REFERENCES content_chunks(mirror_hash, seq) ON DELETE CASCADE
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
CREATE INDEX IF NOT EXISTS idx_vectors_model ON content_vectors(model);
|
|
185
|
+
CREATE INDEX IF NOT EXISTS idx_vectors_freshness
|
|
186
|
+
ON content_vectors(model, embed_fingerprint, mirror_hash, seq, embedded_at);
|
|
187
|
+
|
|
188
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
189
|
+
-- LLM Cache (EPIC 6+)
|
|
190
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
191
|
+
|
|
192
|
+
CREATE TABLE IF NOT EXISTS llm_cache (
|
|
193
|
+
key TEXT PRIMARY KEY,
|
|
194
|
+
value TEXT NOT NULL,
|
|
195
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
196
|
+
expires_at TEXT -- NULL = never expires
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
CREATE INDEX IF NOT EXISTS idx_llm_cache_expires ON llm_cache(expires_at);
|
|
200
|
+
|
|
201
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
202
|
+
-- Ingest Errors
|
|
203
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
204
|
+
|
|
205
|
+
CREATE TABLE IF NOT EXISTS ingest_errors (
|
|
206
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
207
|
+
collection TEXT NOT NULL,
|
|
208
|
+
rel_path TEXT NOT NULL,
|
|
209
|
+
occurred_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
210
|
+
code TEXT NOT NULL, -- Error code (UNSUPPORTED, TOO_LARGE, etc.)
|
|
211
|
+
message TEXT NOT NULL,
|
|
212
|
+
details_json TEXT -- Optional JSON details
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
CREATE INDEX IF NOT EXISTS idx_ingest_errors_occurred ON ingest_errors(occurred_at DESC);
|
|
216
|
+
CREATE INDEX IF NOT EXISTS idx_ingest_errors_collection ON ingest_errors(collection, rel_path);
|
|
217
|
+
|
|
218
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
219
|
+
-- Activation Receipts
|
|
220
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
221
|
+
|
|
222
|
+
-- Passive activation reads only document/FTS metadata and this owned-writer
|
|
223
|
+
-- marker; it never selects Markdown or FTS bodies. Direct post-migration
|
|
224
|
+
-- mutation of internal FTS bodies outside GNO is unsupported and may not alter
|
|
225
|
+
-- the metadata-only identity. Rebuild through the supported index writer.
|
|
226
|
+
|
|
227
|
+
CREATE TABLE IF NOT EXISTS activation_receipts (
|
|
228
|
+
collection TEXT NOT NULL,
|
|
229
|
+
connector_target TEXT NOT NULL DEFAULT '',
|
|
230
|
+
schema_version TEXT NOT NULL,
|
|
231
|
+
fingerprint TEXT NOT NULL,
|
|
232
|
+
receipt_json TEXT NOT NULL CHECK (length(receipt_json) <= 16384),
|
|
233
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
234
|
+
PRIMARY KEY (collection, connector_target),
|
|
235
|
+
FOREIGN KEY (collection) REFERENCES collections(name) ON DELETE CASCADE
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
CREATE INDEX IF NOT EXISTS idx_activation_receipts_fingerprint
|
|
239
|
+
ON activation_receipts(fingerprint);
|
|
240
|
+
|
|
241
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
242
|
+
-- Private Retrieval Trace Receipts
|
|
243
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
244
|
+
|
|
245
|
+
-- Recording is opt-in at the config/core layer. Metadata receipts keep no raw
|
|
246
|
+
-- query/goal/filter values; replay receipts require explicit consent.
|
|
247
|
+
|
|
248
|
+
CREATE TABLE IF NOT EXISTS retrieval_traces (
|
|
249
|
+
trace_id TEXT PRIMARY KEY CHECK (length(trace_id) BETWEEN 1 AND 128),
|
|
250
|
+
schema_version TEXT NOT NULL CHECK (schema_version = '1.0'),
|
|
251
|
+
redaction_mode TEXT NOT NULL CHECK (redaction_mode IN ('metadata', 'replay')),
|
|
252
|
+
replay_capable INTEGER NOT NULL CHECK (replay_capable IN (0, 1)),
|
|
253
|
+
query_text TEXT,
|
|
254
|
+
query_digest TEXT,
|
|
255
|
+
query_shape_json TEXT NOT NULL,
|
|
256
|
+
goal_text TEXT,
|
|
257
|
+
goal_digest TEXT,
|
|
258
|
+
goal_shape_json TEXT NOT NULL,
|
|
259
|
+
filters_json TEXT NOT NULL,
|
|
260
|
+
pipeline_fingerprint TEXT NOT NULL,
|
|
261
|
+
model_fingerprint TEXT NOT NULL,
|
|
262
|
+
config_fingerprint TEXT NOT NULL,
|
|
263
|
+
index_fingerprint TEXT NOT NULL,
|
|
264
|
+
status TEXT NOT NULL
|
|
265
|
+
CHECK (status IN ('open', 'completed', 'partial', 'failed', 'cancelled')),
|
|
266
|
+
created_at_ms INTEGER NOT NULL CHECK (created_at_ms >= 0),
|
|
267
|
+
updated_at_ms INTEGER NOT NULL CHECK (updated_at_ms >= created_at_ms),
|
|
268
|
+
expires_at_ms INTEGER NOT NULL CHECK (expires_at_ms > created_at_ms),
|
|
269
|
+
byte_size INTEGER NOT NULL CHECK (byte_size >= 0),
|
|
270
|
+
creation_digest TEXT NOT NULL,
|
|
271
|
+
CHECK (
|
|
272
|
+
(redaction_mode = 'metadata' AND replay_capable = 0
|
|
273
|
+
AND query_text IS NULL AND query_digest IS NULL
|
|
274
|
+
AND goal_text IS NULL AND goal_digest IS NULL)
|
|
275
|
+
OR
|
|
276
|
+
(redaction_mode = 'replay' AND replay_capable = 1
|
|
277
|
+
AND query_text IS NOT NULL AND query_digest IS NOT NULL)
|
|
278
|
+
)
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
CREATE INDEX IF NOT EXISTS idx_retrieval_traces_retention
|
|
282
|
+
ON retrieval_traces(expires_at_ms, created_at_ms, trace_id);
|
|
283
|
+
|
|
284
|
+
CREATE TABLE IF NOT EXISTS retrieval_trace_runs (
|
|
285
|
+
run_id TEXT PRIMARY KEY,
|
|
286
|
+
trace_id TEXT NOT NULL,
|
|
287
|
+
idempotency_key TEXT NOT NULL,
|
|
288
|
+
kind TEXT NOT NULL CHECK (kind IN ('retrieval', 'context', 'get')),
|
|
289
|
+
payload_json TEXT NOT NULL,
|
|
290
|
+
payload_bytes INTEGER NOT NULL
|
|
291
|
+
CHECK (payload_bytes = length(CAST(payload_json AS BLOB)))
|
|
292
|
+
CHECK (payload_bytes <= 65536),
|
|
293
|
+
canonical_digest TEXT NOT NULL,
|
|
294
|
+
created_at_ms INTEGER NOT NULL CHECK (created_at_ms >= 0),
|
|
295
|
+
UNIQUE (trace_id, idempotency_key),
|
|
296
|
+
UNIQUE (trace_id, run_id),
|
|
297
|
+
FOREIGN KEY (trace_id) REFERENCES retrieval_traces(trace_id) ON DELETE CASCADE
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
CREATE TABLE IF NOT EXISTS retrieval_trace_events (
|
|
301
|
+
event_id TEXT PRIMARY KEY,
|
|
302
|
+
trace_id TEXT NOT NULL,
|
|
303
|
+
run_id TEXT,
|
|
304
|
+
idempotency_key TEXT NOT NULL,
|
|
305
|
+
kind TEXT NOT NULL
|
|
306
|
+
CHECK (kind IN ('query', 'retrieval', 'context', 'get', 'open', 'cite',
|
|
307
|
+
'pin', 'capability', 'complete')),
|
|
308
|
+
payload_json TEXT NOT NULL,
|
|
309
|
+
payload_bytes INTEGER NOT NULL
|
|
310
|
+
CHECK (payload_bytes = length(CAST(payload_json AS BLOB)))
|
|
311
|
+
CHECK (payload_bytes <= 65536),
|
|
312
|
+
canonical_digest TEXT NOT NULL,
|
|
313
|
+
created_at_ms INTEGER NOT NULL CHECK (created_at_ms >= 0),
|
|
314
|
+
UNIQUE (trace_id, idempotency_key),
|
|
315
|
+
FOREIGN KEY (trace_id) REFERENCES retrieval_traces(trace_id) ON DELETE CASCADE,
|
|
316
|
+
FOREIGN KEY (trace_id, run_id)
|
|
317
|
+
REFERENCES retrieval_trace_runs(trace_id, run_id) ON DELETE CASCADE
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
CREATE TABLE IF NOT EXISTS retrieval_trace_judgments (
|
|
321
|
+
judgment_id TEXT PRIMARY KEY,
|
|
322
|
+
trace_id TEXT NOT NULL,
|
|
323
|
+
run_id TEXT,
|
|
324
|
+
idempotency_key TEXT NOT NULL,
|
|
325
|
+
label TEXT NOT NULL
|
|
326
|
+
CHECK (label IN ('relevant', 'irrelevant', 'missing_expected')),
|
|
327
|
+
target_kind TEXT NOT NULL
|
|
328
|
+
CHECK (target_kind IN ('document', 'chunk', 'span', 'query')),
|
|
329
|
+
target_ref TEXT NOT NULL,
|
|
330
|
+
target_json TEXT NOT NULL,
|
|
331
|
+
target_bytes INTEGER NOT NULL
|
|
332
|
+
CHECK (target_bytes = length(CAST(target_json AS BLOB)))
|
|
333
|
+
CHECK (target_bytes <= 16384),
|
|
334
|
+
canonical_digest TEXT NOT NULL,
|
|
335
|
+
created_at_ms INTEGER NOT NULL CHECK (created_at_ms >= 0),
|
|
336
|
+
UNIQUE (trace_id, idempotency_key),
|
|
337
|
+
FOREIGN KEY (trace_id) REFERENCES retrieval_traces(trace_id) ON DELETE CASCADE,
|
|
338
|
+
FOREIGN KEY (trace_id, run_id)
|
|
339
|
+
REFERENCES retrieval_trace_runs(trace_id, run_id) ON DELETE CASCADE
|
|
340
|
+
);
|
|
341
|
+
|
|
342
|
+
CREATE TABLE IF NOT EXISTS retrieval_trace_exports (
|
|
343
|
+
export_id TEXT PRIMARY KEY,
|
|
344
|
+
format TEXT NOT NULL CHECK (format IN ('agentic-receipt', 'qrels')),
|
|
345
|
+
artifact_hash TEXT NOT NULL,
|
|
346
|
+
created_at_ms INTEGER NOT NULL CHECK (created_at_ms >= 0),
|
|
347
|
+
UNIQUE (format, artifact_hash)
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
CREATE TABLE IF NOT EXISTS retrieval_trace_export_traces (
|
|
351
|
+
export_id TEXT NOT NULL,
|
|
352
|
+
trace_id TEXT NOT NULL,
|
|
353
|
+
PRIMARY KEY (export_id, trace_id),
|
|
354
|
+
FOREIGN KEY (export_id) REFERENCES retrieval_trace_exports(export_id)
|
|
355
|
+
ON DELETE CASCADE,
|
|
356
|
+
FOREIGN KEY (trace_id) REFERENCES retrieval_traces(trace_id)
|
|
357
|
+
ON DELETE CASCADE
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
-- Migration 014 also installs deterministic indexes, orphan-export cleanup,
|
|
361
|
+
-- and an absolute 100,000 subordinate-record safety cap per trace. Runtime
|
|
362
|
+
-- retention applies the lower configured maxRecordsPerTrace bound.
|
|
363
|
+
|
|
364
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
365
|
+
-- Document Tags
|
|
366
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
367
|
+
|
|
368
|
+
CREATE TABLE IF NOT EXISTS doc_tags (
|
|
369
|
+
doc_id INTEGER NOT NULL,
|
|
370
|
+
tag TEXT NOT NULL COLLATE NOCASE, -- Tag name (lowercase alphanumeric, hyphens, dots, slashes)
|
|
371
|
+
source TEXT NOT NULL DEFAULT 'frontmatter', -- 'frontmatter' or 'user'
|
|
372
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
373
|
+
PRIMARY KEY (doc_id, tag),
|
|
374
|
+
FOREIGN KEY (doc_id) REFERENCES documents(id) ON DELETE CASCADE
|
|
375
|
+
);
|
|
376
|
+
|
|
377
|
+
-- Tag grammar: lowercase, alphanumeric, hyphens, dots, slashes for hierarchy
|
|
378
|
+
-- Examples: javascript, project/web, status/draft, lang.en
|
|
379
|
+
|
|
380
|
+
CREATE INDEX IF NOT EXISTS idx_doc_tags_tag ON doc_tags(tag);
|
|
381
|
+
CREATE INDEX IF NOT EXISTS idx_doc_tags_source ON doc_tags(source);
|
|
382
|
+
|
|
383
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
384
|
+
-- Document Links (wiki links and markdown links)
|
|
385
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
386
|
+
|
|
387
|
+
-- Links extracted from document content during sync.
|
|
388
|
+
-- Resolution is done at query time (no stored target_doc_id) to handle renames.
|
|
389
|
+
--
|
|
390
|
+
-- Link types:
|
|
391
|
+
-- wiki - [[Target]], [[Target|Display]], [[Target#Heading]], [[collection:Target]]
|
|
392
|
+
-- markdown - [Display](path/to/doc.md) (relative/absolute within collection)
|
|
393
|
+
--
|
|
394
|
+
-- Note: External URLs (https://) are NOT stored.
|
|
395
|
+
|
|
396
|
+
CREATE TABLE IF NOT EXISTS doc_links (
|
|
397
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
398
|
+
source_doc_id INTEGER NOT NULL, -- Document containing the link
|
|
399
|
+
link_type TEXT NOT NULL CHECK (link_type IN ('wiki', 'markdown')),
|
|
400
|
+
target_ref TEXT NOT NULL, -- Raw reference as written
|
|
401
|
+
target_ref_norm TEXT NOT NULL, -- Normalized for matching (wiki=NFC+lowercase, md=resolved path)
|
|
402
|
+
target_anchor TEXT, -- #section if present
|
|
403
|
+
target_collection TEXT, -- Explicit collection: prefix if used
|
|
404
|
+
link_text TEXT, -- Display text if different from target
|
|
405
|
+
start_line INTEGER NOT NULL, -- 1-based line number
|
|
406
|
+
start_col INTEGER NOT NULL, -- 1-based column in line
|
|
407
|
+
end_line INTEGER NOT NULL,
|
|
408
|
+
end_col INTEGER NOT NULL,
|
|
409
|
+
source TEXT NOT NULL DEFAULT 'parsed' CHECK (source IN ('parsed', 'user', 'suggested')),
|
|
410
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
411
|
+
UNIQUE(source_doc_id, start_line, start_col, link_type),
|
|
412
|
+
FOREIGN KEY (source_doc_id) REFERENCES documents(id) ON DELETE CASCADE
|
|
413
|
+
);
|
|
414
|
+
|
|
415
|
+
-- Index for finding all links from a document
|
|
416
|
+
CREATE INDEX IF NOT EXISTS idx_doc_links_source ON doc_links(source_doc_id);
|
|
417
|
+
|
|
418
|
+
-- Index for resolving links (backlinks query)
|
|
419
|
+
CREATE INDEX IF NOT EXISTS idx_doc_links_resolve ON doc_links(link_type, target_ref_norm, target_collection);
|
|
420
|
+
|
|
421
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
422
|
+
-- Document Edges (derived semantic relationships)
|
|
423
|
+
-- ─────────────────────────────────────────────────────────────────────────────
|
|
424
|
+
|
|
425
|
+
-- Derived from links/frontmatter/config. Stores resolved target ids for bounded
|
|
426
|
+
-- traversal; reads join active source and target documents to avoid stale edges
|
|
427
|
+
-- after soft-delete/inactivation.
|
|
428
|
+
CREATE TABLE IF NOT EXISTS doc_edges (
|
|
429
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
430
|
+
src_doc_id INTEGER NOT NULL,
|
|
431
|
+
dst_doc_id INTEGER NOT NULL,
|
|
432
|
+
edge_type TEXT NOT NULL, -- free-form validated lowercase snake_case
|
|
433
|
+
confidence TEXT NOT NULL CHECK (confidence IN ('parsed', 'configured', 'manual', 'inferred')),
|
|
434
|
+
source TEXT NOT NULL CHECK (source IN ('wikilink', 'markdown-link', 'frontmatter-relation')),
|
|
435
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
436
|
+
UNIQUE(src_doc_id, dst_doc_id, edge_type, source),
|
|
437
|
+
FOREIGN KEY (src_doc_id) REFERENCES documents(id) ON DELETE CASCADE,
|
|
438
|
+
FOREIGN KEY (dst_doc_id) REFERENCES documents(id) ON DELETE CASCADE
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
CREATE INDEX IF NOT EXISTS idx_doc_edges_src_type ON doc_edges(src_doc_id, edge_type);
|
|
442
|
+
CREATE INDEX IF NOT EXISTS idx_doc_edges_dst_type ON doc_edges(dst_doc_id, edge_type);
|