@pella-labs/pinakes 0.1.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 (174) hide show
  1. package/README.md +208 -0
  2. package/dist/cli/audit.d.ts +30 -0
  3. package/dist/cli/audit.d.ts.map +1 -0
  4. package/dist/cli/audit.js +49 -0
  5. package/dist/cli/audit.js.map +1 -0
  6. package/dist/cli/export.d.ts +32 -0
  7. package/dist/cli/export.d.ts.map +1 -0
  8. package/dist/cli/export.js +73 -0
  9. package/dist/cli/export.js.map +1 -0
  10. package/dist/cli/import.d.ts +24 -0
  11. package/dist/cli/import.d.ts.map +1 -0
  12. package/dist/cli/import.js +96 -0
  13. package/dist/cli/import.js.map +1 -0
  14. package/dist/cli/index.d.ts +3 -0
  15. package/dist/cli/index.d.ts.map +1 -0
  16. package/dist/cli/index.js +172 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/cli/purge.d.ts +23 -0
  19. package/dist/cli/purge.d.ts.map +1 -0
  20. package/dist/cli/purge.js +57 -0
  21. package/dist/cli/purge.js.map +1 -0
  22. package/dist/cli/rebuild.d.ts +54 -0
  23. package/dist/cli/rebuild.d.ts.map +1 -0
  24. package/dist/cli/rebuild.js +113 -0
  25. package/dist/cli/rebuild.js.map +1 -0
  26. package/dist/cli/serve.d.ts +49 -0
  27. package/dist/cli/serve.d.ts.map +1 -0
  28. package/dist/cli/serve.js +296 -0
  29. package/dist/cli/serve.js.map +1 -0
  30. package/dist/cli/status.d.ts +39 -0
  31. package/dist/cli/status.d.ts.map +1 -0
  32. package/dist/cli/status.js +108 -0
  33. package/dist/cli/status.js.map +1 -0
  34. package/dist/db/client.d.ts +109 -0
  35. package/dist/db/client.d.ts.map +1 -0
  36. package/dist/db/client.js +175 -0
  37. package/dist/db/client.js.map +1 -0
  38. package/dist/db/repository.d.ts +82 -0
  39. package/dist/db/repository.d.ts.map +1 -0
  40. package/dist/db/repository.js +173 -0
  41. package/dist/db/repository.js.map +1 -0
  42. package/dist/db/schema.d.ts +990 -0
  43. package/dist/db/schema.d.ts.map +1 -0
  44. package/dist/db/schema.js +259 -0
  45. package/dist/db/schema.js.map +1 -0
  46. package/dist/db/types.d.ts +28 -0
  47. package/dist/db/types.d.ts.map +1 -0
  48. package/dist/db/types.js +11 -0
  49. package/dist/db/types.js.map +1 -0
  50. package/dist/gaps/detector.d.ts +67 -0
  51. package/dist/gaps/detector.d.ts.map +1 -0
  52. package/dist/gaps/detector.js +160 -0
  53. package/dist/gaps/detector.js.map +1 -0
  54. package/dist/gate/budget.d.ts +90 -0
  55. package/dist/gate/budget.d.ts.map +1 -0
  56. package/dist/gate/budget.js +145 -0
  57. package/dist/gate/budget.js.map +1 -0
  58. package/dist/ingest/chokidar.d.ts +33 -0
  59. package/dist/ingest/chokidar.d.ts.map +1 -0
  60. package/dist/ingest/chokidar.js +152 -0
  61. package/dist/ingest/chokidar.js.map +1 -0
  62. package/dist/ingest/ingester.d.ts +117 -0
  63. package/dist/ingest/ingester.d.ts.map +1 -0
  64. package/dist/ingest/ingester.js +312 -0
  65. package/dist/ingest/ingester.js.map +1 -0
  66. package/dist/ingest/manifest.d.ts +87 -0
  67. package/dist/ingest/manifest.d.ts.map +1 -0
  68. package/dist/ingest/manifest.js +223 -0
  69. package/dist/ingest/manifest.js.map +1 -0
  70. package/dist/ingest/memory-store.d.ts +55 -0
  71. package/dist/ingest/memory-store.d.ts.map +1 -0
  72. package/dist/ingest/memory-store.js +94 -0
  73. package/dist/ingest/memory-store.js.map +1 -0
  74. package/dist/ingest/parse/chunk.d.ts +15 -0
  75. package/dist/ingest/parse/chunk.d.ts.map +1 -0
  76. package/dist/ingest/parse/chunk.js +88 -0
  77. package/dist/ingest/parse/chunk.js.map +1 -0
  78. package/dist/ingest/parse/markdown.d.ts +64 -0
  79. package/dist/ingest/parse/markdown.d.ts.map +1 -0
  80. package/dist/ingest/parse/markdown.js +152 -0
  81. package/dist/ingest/parse/markdown.js.map +1 -0
  82. package/dist/ingest/queue.d.ts +21 -0
  83. package/dist/ingest/queue.d.ts.map +1 -0
  84. package/dist/ingest/queue.js +24 -0
  85. package/dist/ingest/queue.js.map +1 -0
  86. package/dist/ingest/source.d.ts +42 -0
  87. package/dist/ingest/source.d.ts.map +1 -0
  88. package/dist/ingest/source.js +19 -0
  89. package/dist/ingest/source.js.map +1 -0
  90. package/dist/mcp/envelope.d.ts +73 -0
  91. package/dist/mcp/envelope.d.ts.map +1 -0
  92. package/dist/mcp/envelope.js +46 -0
  93. package/dist/mcp/envelope.js.map +1 -0
  94. package/dist/mcp/tools/execute.d.ts +55 -0
  95. package/dist/mcp/tools/execute.d.ts.map +1 -0
  96. package/dist/mcp/tools/execute.js +232 -0
  97. package/dist/mcp/tools/execute.js.map +1 -0
  98. package/dist/mcp/tools/search.d.ts +53 -0
  99. package/dist/mcp/tools/search.d.ts.map +1 -0
  100. package/dist/mcp/tools/search.js +114 -0
  101. package/dist/mcp/tools/search.js.map +1 -0
  102. package/dist/observability/audit.d.ts +25 -0
  103. package/dist/observability/audit.d.ts.map +1 -0
  104. package/dist/observability/audit.js +38 -0
  105. package/dist/observability/audit.js.map +1 -0
  106. package/dist/observability/logger.d.ts +4 -0
  107. package/dist/observability/logger.d.ts.map +1 -0
  108. package/dist/observability/logger.js +56 -0
  109. package/dist/observability/logger.js.map +1 -0
  110. package/dist/observability/metrics.d.ts +38 -0
  111. package/dist/observability/metrics.d.ts.map +1 -0
  112. package/dist/observability/metrics.js +64 -0
  113. package/dist/observability/metrics.js.map +1 -0
  114. package/dist/retrieval/embedder.d.ts +130 -0
  115. package/dist/retrieval/embedder.d.ts.map +1 -0
  116. package/dist/retrieval/embedder.js +278 -0
  117. package/dist/retrieval/embedder.js.map +1 -0
  118. package/dist/retrieval/fts.d.ts +42 -0
  119. package/dist/retrieval/fts.d.ts.map +1 -0
  120. package/dist/retrieval/fts.js +46 -0
  121. package/dist/retrieval/fts.js.map +1 -0
  122. package/dist/retrieval/hybrid.d.ts +43 -0
  123. package/dist/retrieval/hybrid.d.ts.map +1 -0
  124. package/dist/retrieval/hybrid.js +120 -0
  125. package/dist/retrieval/hybrid.js.map +1 -0
  126. package/dist/retrieval/vec.d.ts +39 -0
  127. package/dist/retrieval/vec.d.ts.map +1 -0
  128. package/dist/retrieval/vec.js +50 -0
  129. package/dist/retrieval/vec.js.map +1 -0
  130. package/dist/sandbox/bindings/budget.d.ts +10 -0
  131. package/dist/sandbox/bindings/budget.d.ts.map +1 -0
  132. package/dist/sandbox/bindings/budget.js +44 -0
  133. package/dist/sandbox/bindings/budget.js.map +1 -0
  134. package/dist/sandbox/bindings/install.d.ts +23 -0
  135. package/dist/sandbox/bindings/install.d.ts.map +1 -0
  136. package/dist/sandbox/bindings/install.js +15 -0
  137. package/dist/sandbox/bindings/install.js.map +1 -0
  138. package/dist/sandbox/bindings/kg.d.ts +29 -0
  139. package/dist/sandbox/bindings/kg.d.ts.map +1 -0
  140. package/dist/sandbox/bindings/kg.js +323 -0
  141. package/dist/sandbox/bindings/kg.js.map +1 -0
  142. package/dist/sandbox/bindings/logger.d.ts +11 -0
  143. package/dist/sandbox/bindings/logger.d.ts.map +1 -0
  144. package/dist/sandbox/bindings/logger.js +33 -0
  145. package/dist/sandbox/bindings/logger.js.map +1 -0
  146. package/dist/sandbox/bindings/write.d.ts +34 -0
  147. package/dist/sandbox/bindings/write.d.ts.map +1 -0
  148. package/dist/sandbox/bindings/write.js +195 -0
  149. package/dist/sandbox/bindings/write.js.map +1 -0
  150. package/dist/sandbox/executor.d.ts +68 -0
  151. package/dist/sandbox/executor.d.ts.map +1 -0
  152. package/dist/sandbox/executor.js +280 -0
  153. package/dist/sandbox/executor.js.map +1 -0
  154. package/dist/sandbox/helpers.d.ts +26 -0
  155. package/dist/sandbox/helpers.d.ts.map +1 -0
  156. package/dist/sandbox/helpers.js +131 -0
  157. package/dist/sandbox/helpers.js.map +1 -0
  158. package/dist/sandbox/pool.d.ts +63 -0
  159. package/dist/sandbox/pool.d.ts.map +1 -0
  160. package/dist/sandbox/pool.js +98 -0
  161. package/dist/sandbox/pool.js.map +1 -0
  162. package/dist/sandbox/vendored-codemode.d.ts +99 -0
  163. package/dist/sandbox/vendored-codemode.d.ts.map +1 -0
  164. package/dist/sandbox/vendored-codemode.js +471 -0
  165. package/dist/sandbox/vendored-codemode.js.map +1 -0
  166. package/dist/server.d.ts +3 -0
  167. package/dist/server.d.ts.map +1 -0
  168. package/dist/server.js +74 -0
  169. package/dist/server.js.map +1 -0
  170. package/dist/spike.d.ts +15 -0
  171. package/dist/spike.d.ts.map +1 -0
  172. package/dist/spike.js +90 -0
  173. package/dist/spike.js.map +1 -0
  174. package/package.json +60 -0
@@ -0,0 +1,990 @@
1
+ /**
2
+ * KG-MCP Drizzle schema (presearch.md §2.3, CLAUDE.md §Database Rules).
3
+ *
4
+ * 8 logical tables + `kg_meta` for schema versioning. Two of the eight are
5
+ * virtual tables (`kg_chunks_fts`, `kg_chunks_vec`) that drizzle-kit can't
6
+ * model — they're created via raw SQL appended to the initial migration in
7
+ * src/db/migrations. The drizzle code below covers the 7 regular tables
8
+ * plus kg_meta.
9
+ *
10
+ * Invariants this schema MUST preserve:
11
+ *
12
+ * - `kg_nodes.id` is `sha1(scope + ':' + source_uri + ':' + section_path)`,
13
+ * set by the ingester (NOT auto-generated). Re-ingesting the same
14
+ * markdown produces identical ids — Phase 2's idempotent upsert relies
15
+ * on this. The DB never sees the hashing logic; it just stores the value
16
+ * and enforces uniqueness via the PK.
17
+ *
18
+ * - `kg_chunks.id` is `sha1(node_id + ':' + chunk_index)`, same idea.
19
+ *
20
+ * - `chunk_sha = sha1(chunk_text)` is the LOAD-BEARING field for the
21
+ * per-chunk skip-unchanged optimization (CLAUDE.md §Database Rules #3,
22
+ * Loop 6.5 A4). On a Pharos wiki-updater whole-file rewrite we look up
23
+ * the existing chunk_shas for the file's nodes and only re-embed chunks
24
+ * whose sha changed. Without this, every turn re-embeds 60 chunks ×
25
+ * ~50ms = 3s of blocking work that competes with the active coding LLM
26
+ * for Ollama. Do not remove this column.
27
+ *
28
+ * - `last_accessed_at` on `kg_nodes` exists for the Phase 5 personal-KG
29
+ * LRU eviction (Loop 6.5 A2). Phase 2 just stamps it on insert/update.
30
+ *
31
+ * - `source_sha` on `kg_nodes` is the file-level hash; staleness detection
32
+ * on the query path compares this against the current on-disk hash.
33
+ *
34
+ * - All FK relationships use `ON DELETE CASCADE` so deleting a node cleans
35
+ * up its chunks and edges in one statement (verified by schema test #5).
36
+ * Foreign keys are enforced via PRAGMA foreign_keys=ON, mandatory on
37
+ * every connection in client.ts.
38
+ */
39
+ /**
40
+ * Tiny key/value table holding `schema_version`, `last_full_rebuild`, and
41
+ * any other one-off bookkeeping. Sized for handfuls of rows.
42
+ *
43
+ * Stamped at first openDb() call by client.ts if absent. The schema_version
44
+ * value lets us detect drift on startup and either run new migrations or
45
+ * (in the worst case for sqlite-vec breaking changes) drop + rebuild the
46
+ * vec virtual table from markdown.
47
+ */
48
+ export declare const kgMeta: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
49
+ name: "kg_meta";
50
+ schema: undefined;
51
+ columns: {
52
+ key: import("drizzle-orm/sqlite-core").SQLiteColumn<{
53
+ name: "key";
54
+ tableName: "kg_meta";
55
+ dataType: "string";
56
+ columnType: "SQLiteText";
57
+ data: string;
58
+ driverParam: string;
59
+ notNull: true;
60
+ hasDefault: false;
61
+ isPrimaryKey: true;
62
+ isAutoincrement: false;
63
+ hasRuntimeDefault: false;
64
+ enumValues: [string, ...string[]];
65
+ baseColumn: never;
66
+ identity: undefined;
67
+ generated: undefined;
68
+ }, {}, {
69
+ length: number | undefined;
70
+ }>;
71
+ value: import("drizzle-orm/sqlite-core").SQLiteColumn<{
72
+ name: "value";
73
+ tableName: "kg_meta";
74
+ dataType: "string";
75
+ columnType: "SQLiteText";
76
+ data: string;
77
+ driverParam: string;
78
+ notNull: false;
79
+ hasDefault: false;
80
+ isPrimaryKey: false;
81
+ isAutoincrement: false;
82
+ hasRuntimeDefault: false;
83
+ enumValues: [string, ...string[]];
84
+ baseColumn: never;
85
+ identity: undefined;
86
+ generated: undefined;
87
+ }, {}, {
88
+ length: number | undefined;
89
+ }>;
90
+ };
91
+ dialect: "sqlite";
92
+ }>;
93
+ /**
94
+ * One row per markdown section. The "primary unit" of the KG — chunks belong
95
+ * to nodes, edges connect nodes.
96
+ *
97
+ * `kind` is open-ended for forward compatibility:
98
+ * - `'section'` — the only kind Phase 2 writes; one per ATX heading
99
+ * - `'entity' | 'concept' | 'decision' | 'log_entry' | 'gap'` — Phase 4-6
100
+ *
101
+ * `section_path` is the ATX heading hierarchy joined by ` / ` (e.g.
102
+ * `"Authentication / Login flow"` for an `## Login flow` under `# Authentication`).
103
+ * Empty string for top-of-file content above any heading.
104
+ *
105
+ * `content` stores the full section markdown (heading + body). Chunks are
106
+ * derived from this and stored separately in kg_chunks. We keep both because
107
+ * `kg_execute` callers may want the whole section (`kg.get(node_id)`) instead
108
+ * of paragraph-sized chunks.
109
+ */
110
+ export declare const kgNodes: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
111
+ name: "kg_nodes";
112
+ schema: undefined;
113
+ columns: {
114
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
115
+ name: "id";
116
+ tableName: "kg_nodes";
117
+ dataType: "string";
118
+ columnType: "SQLiteText";
119
+ data: string;
120
+ driverParam: string;
121
+ notNull: true;
122
+ hasDefault: false;
123
+ isPrimaryKey: true;
124
+ isAutoincrement: false;
125
+ hasRuntimeDefault: false;
126
+ enumValues: [string, ...string[]];
127
+ baseColumn: never;
128
+ identity: undefined;
129
+ generated: undefined;
130
+ }, {}, {
131
+ length: number | undefined;
132
+ }>;
133
+ scope: import("drizzle-orm/sqlite-core").SQLiteColumn<{
134
+ name: "scope";
135
+ tableName: "kg_nodes";
136
+ dataType: "string";
137
+ columnType: "SQLiteText";
138
+ data: string;
139
+ driverParam: string;
140
+ notNull: true;
141
+ hasDefault: false;
142
+ isPrimaryKey: false;
143
+ isAutoincrement: false;
144
+ hasRuntimeDefault: false;
145
+ enumValues: [string, ...string[]];
146
+ baseColumn: never;
147
+ identity: undefined;
148
+ generated: undefined;
149
+ }, {}, {
150
+ length: number | undefined;
151
+ }>;
152
+ sourceUri: import("drizzle-orm/sqlite-core").SQLiteColumn<{
153
+ name: "source_uri";
154
+ tableName: "kg_nodes";
155
+ dataType: "string";
156
+ columnType: "SQLiteText";
157
+ data: string;
158
+ driverParam: string;
159
+ notNull: true;
160
+ hasDefault: false;
161
+ isPrimaryKey: false;
162
+ isAutoincrement: false;
163
+ hasRuntimeDefault: false;
164
+ enumValues: [string, ...string[]];
165
+ baseColumn: never;
166
+ identity: undefined;
167
+ generated: undefined;
168
+ }, {}, {
169
+ length: number | undefined;
170
+ }>;
171
+ sectionPath: import("drizzle-orm/sqlite-core").SQLiteColumn<{
172
+ name: "section_path";
173
+ tableName: "kg_nodes";
174
+ dataType: "string";
175
+ columnType: "SQLiteText";
176
+ data: string;
177
+ driverParam: string;
178
+ notNull: true;
179
+ hasDefault: false;
180
+ isPrimaryKey: false;
181
+ isAutoincrement: false;
182
+ hasRuntimeDefault: false;
183
+ enumValues: [string, ...string[]];
184
+ baseColumn: never;
185
+ identity: undefined;
186
+ generated: undefined;
187
+ }, {}, {
188
+ length: number | undefined;
189
+ }>;
190
+ kind: import("drizzle-orm/sqlite-core").SQLiteColumn<{
191
+ name: "kind";
192
+ tableName: "kg_nodes";
193
+ dataType: "string";
194
+ columnType: "SQLiteText";
195
+ data: string;
196
+ driverParam: string;
197
+ notNull: true;
198
+ hasDefault: true;
199
+ isPrimaryKey: false;
200
+ isAutoincrement: false;
201
+ hasRuntimeDefault: false;
202
+ enumValues: [string, ...string[]];
203
+ baseColumn: never;
204
+ identity: undefined;
205
+ generated: undefined;
206
+ }, {}, {
207
+ length: number | undefined;
208
+ }>;
209
+ title: import("drizzle-orm/sqlite-core").SQLiteColumn<{
210
+ name: "title";
211
+ tableName: "kg_nodes";
212
+ dataType: "string";
213
+ columnType: "SQLiteText";
214
+ data: string;
215
+ driverParam: string;
216
+ notNull: false;
217
+ hasDefault: false;
218
+ isPrimaryKey: false;
219
+ isAutoincrement: false;
220
+ hasRuntimeDefault: false;
221
+ enumValues: [string, ...string[]];
222
+ baseColumn: never;
223
+ identity: undefined;
224
+ generated: undefined;
225
+ }, {}, {
226
+ length: number | undefined;
227
+ }>;
228
+ content: import("drizzle-orm/sqlite-core").SQLiteColumn<{
229
+ name: "content";
230
+ tableName: "kg_nodes";
231
+ dataType: "string";
232
+ columnType: "SQLiteText";
233
+ data: string;
234
+ driverParam: string;
235
+ notNull: true;
236
+ hasDefault: false;
237
+ isPrimaryKey: false;
238
+ isAutoincrement: false;
239
+ hasRuntimeDefault: false;
240
+ enumValues: [string, ...string[]];
241
+ baseColumn: never;
242
+ identity: undefined;
243
+ generated: undefined;
244
+ }, {}, {
245
+ length: number | undefined;
246
+ }>;
247
+ sourceSha: import("drizzle-orm/sqlite-core").SQLiteColumn<{
248
+ name: "source_sha";
249
+ tableName: "kg_nodes";
250
+ dataType: "string";
251
+ columnType: "SQLiteText";
252
+ data: string;
253
+ driverParam: string;
254
+ notNull: true;
255
+ hasDefault: false;
256
+ isPrimaryKey: false;
257
+ isAutoincrement: false;
258
+ hasRuntimeDefault: false;
259
+ enumValues: [string, ...string[]];
260
+ baseColumn: never;
261
+ identity: undefined;
262
+ generated: undefined;
263
+ }, {}, {
264
+ length: number | undefined;
265
+ }>;
266
+ tokenCount: import("drizzle-orm/sqlite-core").SQLiteColumn<{
267
+ name: "token_count";
268
+ tableName: "kg_nodes";
269
+ dataType: "number";
270
+ columnType: "SQLiteInteger";
271
+ data: number;
272
+ driverParam: number;
273
+ notNull: true;
274
+ hasDefault: false;
275
+ isPrimaryKey: false;
276
+ isAutoincrement: false;
277
+ hasRuntimeDefault: false;
278
+ enumValues: undefined;
279
+ baseColumn: never;
280
+ identity: undefined;
281
+ generated: undefined;
282
+ }, {}, {}>;
283
+ confidence: import("drizzle-orm/sqlite-core").SQLiteColumn<{
284
+ name: "confidence";
285
+ tableName: "kg_nodes";
286
+ dataType: "string";
287
+ columnType: "SQLiteText";
288
+ data: string;
289
+ driverParam: string;
290
+ notNull: true;
291
+ hasDefault: true;
292
+ isPrimaryKey: false;
293
+ isAutoincrement: false;
294
+ hasRuntimeDefault: false;
295
+ enumValues: [string, ...string[]];
296
+ baseColumn: never;
297
+ identity: undefined;
298
+ generated: undefined;
299
+ }, {}, {
300
+ length: number | undefined;
301
+ }>;
302
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
303
+ name: "created_at";
304
+ tableName: "kg_nodes";
305
+ dataType: "number";
306
+ columnType: "SQLiteInteger";
307
+ data: number;
308
+ driverParam: number;
309
+ notNull: true;
310
+ hasDefault: false;
311
+ isPrimaryKey: false;
312
+ isAutoincrement: false;
313
+ hasRuntimeDefault: false;
314
+ enumValues: undefined;
315
+ baseColumn: never;
316
+ identity: undefined;
317
+ generated: undefined;
318
+ }, {}, {}>;
319
+ updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
320
+ name: "updated_at";
321
+ tableName: "kg_nodes";
322
+ dataType: "number";
323
+ columnType: "SQLiteInteger";
324
+ data: number;
325
+ driverParam: number;
326
+ notNull: true;
327
+ hasDefault: false;
328
+ isPrimaryKey: false;
329
+ isAutoincrement: false;
330
+ hasRuntimeDefault: false;
331
+ enumValues: undefined;
332
+ baseColumn: never;
333
+ identity: undefined;
334
+ generated: undefined;
335
+ }, {}, {}>;
336
+ lastAccessedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
337
+ name: "last_accessed_at";
338
+ tableName: "kg_nodes";
339
+ dataType: "number";
340
+ columnType: "SQLiteInteger";
341
+ data: number;
342
+ driverParam: number;
343
+ notNull: true;
344
+ hasDefault: false;
345
+ isPrimaryKey: false;
346
+ isAutoincrement: false;
347
+ hasRuntimeDefault: false;
348
+ enumValues: undefined;
349
+ baseColumn: never;
350
+ identity: undefined;
351
+ generated: undefined;
352
+ }, {}, {}>;
353
+ };
354
+ dialect: "sqlite";
355
+ }>;
356
+ /**
357
+ * Directed edges between nodes. Composite primary key on
358
+ * `(src_id, dst_id, edge_kind)` so the same pair can have multiple edge
359
+ * kinds (e.g. one node both `cites` and `supersedes` another).
360
+ *
361
+ * Phase 2 doesn't populate this table — Phase 4 extracts wikilinks during
362
+ * markdown parsing. The table exists now so the migration is complete and
363
+ * Phase 4 doesn't have to add it as a separate migration.
364
+ */
365
+ export declare const kgEdges: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
366
+ name: "kg_edges";
367
+ schema: undefined;
368
+ columns: {
369
+ srcId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
370
+ name: "src_id";
371
+ tableName: "kg_edges";
372
+ dataType: "string";
373
+ columnType: "SQLiteText";
374
+ data: string;
375
+ driverParam: string;
376
+ notNull: true;
377
+ hasDefault: false;
378
+ isPrimaryKey: false;
379
+ isAutoincrement: false;
380
+ hasRuntimeDefault: false;
381
+ enumValues: [string, ...string[]];
382
+ baseColumn: never;
383
+ identity: undefined;
384
+ generated: undefined;
385
+ }, {}, {
386
+ length: number | undefined;
387
+ }>;
388
+ dstId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
389
+ name: "dst_id";
390
+ tableName: "kg_edges";
391
+ dataType: "string";
392
+ columnType: "SQLiteText";
393
+ data: string;
394
+ driverParam: string;
395
+ notNull: true;
396
+ hasDefault: false;
397
+ isPrimaryKey: false;
398
+ isAutoincrement: false;
399
+ hasRuntimeDefault: false;
400
+ enumValues: [string, ...string[]];
401
+ baseColumn: never;
402
+ identity: undefined;
403
+ generated: undefined;
404
+ }, {}, {
405
+ length: number | undefined;
406
+ }>;
407
+ edgeKind: import("drizzle-orm/sqlite-core").SQLiteColumn<{
408
+ name: "edge_kind";
409
+ tableName: "kg_edges";
410
+ dataType: "string";
411
+ columnType: "SQLiteText";
412
+ data: string;
413
+ driverParam: string;
414
+ notNull: true;
415
+ hasDefault: false;
416
+ isPrimaryKey: false;
417
+ isAutoincrement: false;
418
+ hasRuntimeDefault: false;
419
+ enumValues: [string, ...string[]];
420
+ baseColumn: never;
421
+ identity: undefined;
422
+ generated: undefined;
423
+ }, {}, {
424
+ length: number | undefined;
425
+ }>;
426
+ };
427
+ dialect: "sqlite";
428
+ }>;
429
+ /**
430
+ * One row per ~500-token chunk derived from a node's `content`. The
431
+ * chunker (src/ingest/parse/chunk.ts) splits on paragraph boundaries and
432
+ * accumulates until adding the next paragraph would exceed `target_tokens`.
433
+ *
434
+ * The implicit SQLite `rowid` (auto-assigned for tables without
435
+ * INTEGER PRIMARY KEY) is what FTS5 and sqlite-vec join on:
436
+ * - `kg_chunks_fts` is `content='kg_chunks', content_rowid='rowid'`
437
+ * - `kg_chunks_vec.rowid` matches `kg_chunks.rowid`
438
+ *
439
+ * `chunk_sha = sha1(text)` is the per-chunk skip-unchanged key. On a
440
+ * file rewrite, the ingester compares each new chunk's chunk_sha against
441
+ * the existing chunk_shas for the file's nodes; matching chunks reuse
442
+ * the existing embedding (no embedder call), only changed chunks get
443
+ * re-embedded. This is the load-bearing optimization for Pharos's
444
+ * whole-file-rewrite-per-turn pattern (CLAUDE.md §Database Rules #3).
445
+ */
446
+ export declare const kgChunks: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
447
+ name: "kg_chunks";
448
+ schema: undefined;
449
+ columns: {
450
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
451
+ name: "id";
452
+ tableName: "kg_chunks";
453
+ dataType: "string";
454
+ columnType: "SQLiteText";
455
+ data: string;
456
+ driverParam: string;
457
+ notNull: true;
458
+ hasDefault: false;
459
+ isPrimaryKey: true;
460
+ isAutoincrement: false;
461
+ hasRuntimeDefault: false;
462
+ enumValues: [string, ...string[]];
463
+ baseColumn: never;
464
+ identity: undefined;
465
+ generated: undefined;
466
+ }, {}, {
467
+ length: number | undefined;
468
+ }>;
469
+ nodeId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
470
+ name: "node_id";
471
+ tableName: "kg_chunks";
472
+ dataType: "string";
473
+ columnType: "SQLiteText";
474
+ data: string;
475
+ driverParam: string;
476
+ notNull: true;
477
+ hasDefault: false;
478
+ isPrimaryKey: false;
479
+ isAutoincrement: false;
480
+ hasRuntimeDefault: false;
481
+ enumValues: [string, ...string[]];
482
+ baseColumn: never;
483
+ identity: undefined;
484
+ generated: undefined;
485
+ }, {}, {
486
+ length: number | undefined;
487
+ }>;
488
+ chunkIndex: import("drizzle-orm/sqlite-core").SQLiteColumn<{
489
+ name: "chunk_index";
490
+ tableName: "kg_chunks";
491
+ dataType: "number";
492
+ columnType: "SQLiteInteger";
493
+ data: number;
494
+ driverParam: number;
495
+ notNull: true;
496
+ hasDefault: false;
497
+ isPrimaryKey: false;
498
+ isAutoincrement: false;
499
+ hasRuntimeDefault: false;
500
+ enumValues: undefined;
501
+ baseColumn: never;
502
+ identity: undefined;
503
+ generated: undefined;
504
+ }, {}, {}>;
505
+ text: import("drizzle-orm/sqlite-core").SQLiteColumn<{
506
+ name: "text";
507
+ tableName: "kg_chunks";
508
+ dataType: "string";
509
+ columnType: "SQLiteText";
510
+ data: string;
511
+ driverParam: string;
512
+ notNull: true;
513
+ hasDefault: false;
514
+ isPrimaryKey: false;
515
+ isAutoincrement: false;
516
+ hasRuntimeDefault: false;
517
+ enumValues: [string, ...string[]];
518
+ baseColumn: never;
519
+ identity: undefined;
520
+ generated: undefined;
521
+ }, {}, {
522
+ length: number | undefined;
523
+ }>;
524
+ chunkSha: import("drizzle-orm/sqlite-core").SQLiteColumn<{
525
+ name: "chunk_sha";
526
+ tableName: "kg_chunks";
527
+ dataType: "string";
528
+ columnType: "SQLiteText";
529
+ data: string;
530
+ driverParam: string;
531
+ notNull: true;
532
+ hasDefault: false;
533
+ isPrimaryKey: false;
534
+ isAutoincrement: false;
535
+ hasRuntimeDefault: false;
536
+ enumValues: [string, ...string[]];
537
+ baseColumn: never;
538
+ identity: undefined;
539
+ generated: undefined;
540
+ }, {}, {
541
+ length: number | undefined;
542
+ }>;
543
+ tokenCount: import("drizzle-orm/sqlite-core").SQLiteColumn<{
544
+ name: "token_count";
545
+ tableName: "kg_chunks";
546
+ dataType: "number";
547
+ columnType: "SQLiteInteger";
548
+ data: number;
549
+ driverParam: number;
550
+ notNull: true;
551
+ hasDefault: false;
552
+ isPrimaryKey: false;
553
+ isAutoincrement: false;
554
+ hasRuntimeDefault: false;
555
+ enumValues: undefined;
556
+ baseColumn: never;
557
+ identity: undefined;
558
+ generated: undefined;
559
+ }, {}, {}>;
560
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
561
+ name: "created_at";
562
+ tableName: "kg_chunks";
563
+ dataType: "number";
564
+ columnType: "SQLiteInteger";
565
+ data: number;
566
+ driverParam: number;
567
+ notNull: true;
568
+ hasDefault: false;
569
+ isPrimaryKey: false;
570
+ isAutoincrement: false;
571
+ hasRuntimeDefault: false;
572
+ enumValues: undefined;
573
+ baseColumn: never;
574
+ identity: undefined;
575
+ generated: undefined;
576
+ }, {}, {}>;
577
+ };
578
+ dialect: "sqlite";
579
+ }>;
580
+ /**
581
+ * Append-only event stream. Phase 2 writes:
582
+ * - `'ingest:done'` — successful file ingest
583
+ * - `'ingest:error'` — failed file ingest
584
+ * - `'rebuild:start' | 'rebuild:done'` — full-rebuild markers
585
+ *
586
+ * `payload` is opaque JSON shaped per `kind`. The reader is the LLM via
587
+ * `kg.log.recent(n, opts)` in Phase 4+; Phase 2 just appends.
588
+ */
589
+ export declare const kgLog: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
590
+ name: "kg_log";
591
+ schema: undefined;
592
+ columns: {
593
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
594
+ name: "id";
595
+ tableName: "kg_log";
596
+ dataType: "number";
597
+ columnType: "SQLiteInteger";
598
+ data: number;
599
+ driverParam: number;
600
+ notNull: true;
601
+ hasDefault: true;
602
+ isPrimaryKey: true;
603
+ isAutoincrement: false;
604
+ hasRuntimeDefault: false;
605
+ enumValues: undefined;
606
+ baseColumn: never;
607
+ identity: undefined;
608
+ generated: undefined;
609
+ }, {}, {}>;
610
+ ts: import("drizzle-orm/sqlite-core").SQLiteColumn<{
611
+ name: "ts";
612
+ tableName: "kg_log";
613
+ dataType: "number";
614
+ columnType: "SQLiteInteger";
615
+ data: number;
616
+ driverParam: number;
617
+ notNull: true;
618
+ hasDefault: false;
619
+ isPrimaryKey: false;
620
+ isAutoincrement: false;
621
+ hasRuntimeDefault: false;
622
+ enumValues: undefined;
623
+ baseColumn: never;
624
+ identity: undefined;
625
+ generated: undefined;
626
+ }, {}, {}>;
627
+ scope: import("drizzle-orm/sqlite-core").SQLiteColumn<{
628
+ name: "scope";
629
+ tableName: "kg_log";
630
+ dataType: "string";
631
+ columnType: "SQLiteText";
632
+ data: string;
633
+ driverParam: string;
634
+ notNull: true;
635
+ hasDefault: false;
636
+ isPrimaryKey: false;
637
+ isAutoincrement: false;
638
+ hasRuntimeDefault: false;
639
+ enumValues: [string, ...string[]];
640
+ baseColumn: never;
641
+ identity: undefined;
642
+ generated: undefined;
643
+ }, {}, {
644
+ length: number | undefined;
645
+ }>;
646
+ kind: import("drizzle-orm/sqlite-core").SQLiteColumn<{
647
+ name: "kind";
648
+ tableName: "kg_log";
649
+ dataType: "string";
650
+ columnType: "SQLiteText";
651
+ data: string;
652
+ driverParam: string;
653
+ notNull: true;
654
+ hasDefault: false;
655
+ isPrimaryKey: false;
656
+ isAutoincrement: false;
657
+ hasRuntimeDefault: false;
658
+ enumValues: [string, ...string[]];
659
+ baseColumn: never;
660
+ identity: undefined;
661
+ generated: undefined;
662
+ }, {}, {
663
+ length: number | undefined;
664
+ }>;
665
+ sourceUri: import("drizzle-orm/sqlite-core").SQLiteColumn<{
666
+ name: "source_uri";
667
+ tableName: "kg_log";
668
+ dataType: "string";
669
+ columnType: "SQLiteText";
670
+ data: string;
671
+ driverParam: string;
672
+ notNull: false;
673
+ hasDefault: false;
674
+ isPrimaryKey: false;
675
+ isAutoincrement: false;
676
+ hasRuntimeDefault: false;
677
+ enumValues: [string, ...string[]];
678
+ baseColumn: never;
679
+ identity: undefined;
680
+ generated: undefined;
681
+ }, {}, {
682
+ length: number | undefined;
683
+ }>;
684
+ payload: import("drizzle-orm/sqlite-core").SQLiteColumn<{
685
+ name: "payload";
686
+ tableName: "kg_log";
687
+ dataType: "string";
688
+ columnType: "SQLiteText";
689
+ data: string;
690
+ driverParam: string;
691
+ notNull: false;
692
+ hasDefault: false;
693
+ isPrimaryKey: false;
694
+ isAutoincrement: false;
695
+ hasRuntimeDefault: false;
696
+ enumValues: [string, ...string[]];
697
+ baseColumn: never;
698
+ identity: undefined;
699
+ generated: undefined;
700
+ }, {}, {
701
+ length: number | undefined;
702
+ }>;
703
+ };
704
+ dialect: "sqlite";
705
+ }>;
706
+ /**
707
+ * Concept gaps detected by the Phase 6 gap-detection sub-agent. Phase 2
708
+ * creates the table; Phase 6 wires the writes.
709
+ *
710
+ * `mentions_count` lets the dashboard prioritize gaps that appear across
711
+ * multiple turns. `resolved_at` is set when a gap is closed (either by
712
+ * the LLM writing about the topic or by a manual dismissal).
713
+ */
714
+ export declare const kgGaps: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
715
+ name: "kg_gaps";
716
+ schema: undefined;
717
+ columns: {
718
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
719
+ name: "id";
720
+ tableName: "kg_gaps";
721
+ dataType: "number";
722
+ columnType: "SQLiteInteger";
723
+ data: number;
724
+ driverParam: number;
725
+ notNull: true;
726
+ hasDefault: true;
727
+ isPrimaryKey: true;
728
+ isAutoincrement: false;
729
+ hasRuntimeDefault: false;
730
+ enumValues: undefined;
731
+ baseColumn: never;
732
+ identity: undefined;
733
+ generated: undefined;
734
+ }, {}, {}>;
735
+ scope: import("drizzle-orm/sqlite-core").SQLiteColumn<{
736
+ name: "scope";
737
+ tableName: "kg_gaps";
738
+ dataType: "string";
739
+ columnType: "SQLiteText";
740
+ data: string;
741
+ driverParam: string;
742
+ notNull: true;
743
+ hasDefault: false;
744
+ isPrimaryKey: false;
745
+ isAutoincrement: false;
746
+ hasRuntimeDefault: false;
747
+ enumValues: [string, ...string[]];
748
+ baseColumn: never;
749
+ identity: undefined;
750
+ generated: undefined;
751
+ }, {}, {
752
+ length: number | undefined;
753
+ }>;
754
+ topic: import("drizzle-orm/sqlite-core").SQLiteColumn<{
755
+ name: "topic";
756
+ tableName: "kg_gaps";
757
+ dataType: "string";
758
+ columnType: "SQLiteText";
759
+ data: string;
760
+ driverParam: string;
761
+ notNull: true;
762
+ hasDefault: false;
763
+ isPrimaryKey: false;
764
+ isAutoincrement: false;
765
+ hasRuntimeDefault: false;
766
+ enumValues: [string, ...string[]];
767
+ baseColumn: never;
768
+ identity: undefined;
769
+ generated: undefined;
770
+ }, {}, {
771
+ length: number | undefined;
772
+ }>;
773
+ firstSeenAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
774
+ name: "first_seen_at";
775
+ tableName: "kg_gaps";
776
+ dataType: "number";
777
+ columnType: "SQLiteInteger";
778
+ data: number;
779
+ driverParam: number;
780
+ notNull: true;
781
+ hasDefault: false;
782
+ isPrimaryKey: false;
783
+ isAutoincrement: false;
784
+ hasRuntimeDefault: false;
785
+ enumValues: undefined;
786
+ baseColumn: never;
787
+ identity: undefined;
788
+ generated: undefined;
789
+ }, {}, {}>;
790
+ mentionsCount: import("drizzle-orm/sqlite-core").SQLiteColumn<{
791
+ name: "mentions_count";
792
+ tableName: "kg_gaps";
793
+ dataType: "number";
794
+ columnType: "SQLiteInteger";
795
+ data: number;
796
+ driverParam: number;
797
+ notNull: true;
798
+ hasDefault: true;
799
+ isPrimaryKey: false;
800
+ isAutoincrement: false;
801
+ hasRuntimeDefault: false;
802
+ enumValues: undefined;
803
+ baseColumn: never;
804
+ identity: undefined;
805
+ generated: undefined;
806
+ }, {}, {}>;
807
+ resolvedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
808
+ name: "resolved_at";
809
+ tableName: "kg_gaps";
810
+ dataType: "number";
811
+ columnType: "SQLiteInteger";
812
+ data: number;
813
+ driverParam: number;
814
+ notNull: false;
815
+ hasDefault: false;
816
+ isPrimaryKey: false;
817
+ isAutoincrement: false;
818
+ hasRuntimeDefault: false;
819
+ enumValues: undefined;
820
+ baseColumn: never;
821
+ identity: undefined;
822
+ generated: undefined;
823
+ }, {}, {}>;
824
+ };
825
+ dialect: "sqlite";
826
+ }>;
827
+ /**
828
+ * Audit log of every MCP tool call. Phase 5 wires the dispatcher to write
829
+ * one row per call as part of the privacy invariant verification surface
830
+ * (CLAUDE.md §Security #7). Phase 2 creates the table.
831
+ *
832
+ * NB: per CLAUDE.md §Security #7, the JSONL mirror path differs by scope —
833
+ * project rows mirror to `.pharos/kg-audit.jsonl` (in the repo, safe for
834
+ * `git add .`), personal/both rows mirror to `~/.pharos/profile/kg-audit.jsonl`.
835
+ * Personal-scope audit rows go to a separate kg_audit table in the personal
836
+ * DB, never the project DB. This split is enforced at the app layer.
837
+ */
838
+ export declare const kgAudit: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
839
+ name: "kg_audit";
840
+ schema: undefined;
841
+ columns: {
842
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
843
+ name: "id";
844
+ tableName: "kg_audit";
845
+ dataType: "number";
846
+ columnType: "SQLiteInteger";
847
+ data: number;
848
+ driverParam: number;
849
+ notNull: true;
850
+ hasDefault: true;
851
+ isPrimaryKey: true;
852
+ isAutoincrement: false;
853
+ hasRuntimeDefault: false;
854
+ enumValues: undefined;
855
+ baseColumn: never;
856
+ identity: undefined;
857
+ generated: undefined;
858
+ }, {}, {}>;
859
+ ts: import("drizzle-orm/sqlite-core").SQLiteColumn<{
860
+ name: "ts";
861
+ tableName: "kg_audit";
862
+ dataType: "number";
863
+ columnType: "SQLiteInteger";
864
+ data: number;
865
+ driverParam: number;
866
+ notNull: true;
867
+ hasDefault: false;
868
+ isPrimaryKey: false;
869
+ isAutoincrement: false;
870
+ hasRuntimeDefault: false;
871
+ enumValues: undefined;
872
+ baseColumn: never;
873
+ identity: undefined;
874
+ generated: undefined;
875
+ }, {}, {}>;
876
+ toolName: import("drizzle-orm/sqlite-core").SQLiteColumn<{
877
+ name: "tool_name";
878
+ tableName: "kg_audit";
879
+ dataType: "string";
880
+ columnType: "SQLiteText";
881
+ data: string;
882
+ driverParam: string;
883
+ notNull: true;
884
+ hasDefault: false;
885
+ isPrimaryKey: false;
886
+ isAutoincrement: false;
887
+ hasRuntimeDefault: false;
888
+ enumValues: [string, ...string[]];
889
+ baseColumn: never;
890
+ identity: undefined;
891
+ generated: undefined;
892
+ }, {}, {
893
+ length: number | undefined;
894
+ }>;
895
+ scopeRequested: import("drizzle-orm/sqlite-core").SQLiteColumn<{
896
+ name: "scope_requested";
897
+ tableName: "kg_audit";
898
+ dataType: "string";
899
+ columnType: "SQLiteText";
900
+ data: string;
901
+ driverParam: string;
902
+ notNull: true;
903
+ hasDefault: false;
904
+ isPrimaryKey: false;
905
+ isAutoincrement: false;
906
+ hasRuntimeDefault: false;
907
+ enumValues: [string, ...string[]];
908
+ baseColumn: never;
909
+ identity: undefined;
910
+ generated: undefined;
911
+ }, {}, {
912
+ length: number | undefined;
913
+ }>;
914
+ callerCtx: import("drizzle-orm/sqlite-core").SQLiteColumn<{
915
+ name: "caller_ctx";
916
+ tableName: "kg_audit";
917
+ dataType: "string";
918
+ columnType: "SQLiteText";
919
+ data: string;
920
+ driverParam: string;
921
+ notNull: false;
922
+ hasDefault: false;
923
+ isPrimaryKey: false;
924
+ isAutoincrement: false;
925
+ hasRuntimeDefault: false;
926
+ enumValues: [string, ...string[]];
927
+ baseColumn: never;
928
+ identity: undefined;
929
+ generated: undefined;
930
+ }, {}, {
931
+ length: number | undefined;
932
+ }>;
933
+ responseTokens: import("drizzle-orm/sqlite-core").SQLiteColumn<{
934
+ name: "response_tokens";
935
+ tableName: "kg_audit";
936
+ dataType: "number";
937
+ columnType: "SQLiteInteger";
938
+ data: number;
939
+ driverParam: number;
940
+ notNull: false;
941
+ hasDefault: false;
942
+ isPrimaryKey: false;
943
+ isAutoincrement: false;
944
+ hasRuntimeDefault: false;
945
+ enumValues: undefined;
946
+ baseColumn: never;
947
+ identity: undefined;
948
+ generated: undefined;
949
+ }, {}, {}>;
950
+ error: import("drizzle-orm/sqlite-core").SQLiteColumn<{
951
+ name: "error";
952
+ tableName: "kg_audit";
953
+ dataType: "string";
954
+ columnType: "SQLiteText";
955
+ data: string;
956
+ driverParam: string;
957
+ notNull: false;
958
+ hasDefault: false;
959
+ isPrimaryKey: false;
960
+ isAutoincrement: false;
961
+ hasRuntimeDefault: false;
962
+ enumValues: [string, ...string[]];
963
+ baseColumn: never;
964
+ identity: undefined;
965
+ generated: undefined;
966
+ }, {}, {
967
+ length: number | undefined;
968
+ }>;
969
+ };
970
+ dialect: "sqlite";
971
+ }>;
972
+ export type KgNode = typeof kgNodes.$inferSelect;
973
+ export type NewKgNode = typeof kgNodes.$inferInsert;
974
+ export type KgChunk = typeof kgChunks.$inferSelect;
975
+ export type NewKgChunk = typeof kgChunks.$inferInsert;
976
+ export type KgEdge = typeof kgEdges.$inferSelect;
977
+ export type NewKgEdge = typeof kgEdges.$inferInsert;
978
+ export type KgLogRow = typeof kgLog.$inferSelect;
979
+ export type NewKgLogRow = typeof kgLog.$inferInsert;
980
+ /**
981
+ * The list of all schema-managed tables, useful for the schema test that
982
+ * verifies the migration creates every expected table.
983
+ */
984
+ export declare const KG_TABLES: readonly ["kg_meta", "kg_nodes", "kg_edges", "kg_chunks", "kg_log", "kg_gaps", "kg_audit"];
985
+ /**
986
+ * The two virtual tables created via raw SQL in the migration (drizzle-kit
987
+ * doesn't emit virtual table DDL). Schema test verifies they exist.
988
+ */
989
+ export declare const KG_VIRTUAL_TABLES: readonly ["kg_chunks_fts", "kg_chunks_vec"];
990
+ //# sourceMappingURL=schema.d.ts.map