@undefineds.co/xpod 0.3.5 → 0.3.14

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 (253) hide show
  1. package/config/cli.json +1 -1
  2. package/config/cloud.json +54 -22
  3. package/config/local.json +56 -12
  4. package/config/resolver.json +10 -2
  5. package/config/xpod.base.json +50 -0
  6. package/config/xpod.json +8 -8
  7. package/dist/agents/config/resolve.js +10 -10
  8. package/dist/agents/config/resolve.js.map +1 -1
  9. package/dist/api/chatkit/index.d.ts +1 -1
  10. package/dist/api/chatkit/index.js.map +1 -1
  11. package/dist/api/chatkit/pod-store.d.ts +14 -11
  12. package/dist/api/chatkit/pod-store.js +114 -78
  13. package/dist/api/chatkit/pod-store.js.map +1 -1
  14. package/dist/api/chatkit/runtime/AcpAgentRuntime.js +1 -1
  15. package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
  16. package/dist/api/chatkit/service.js +1 -1
  17. package/dist/api/chatkit/service.js.map +1 -1
  18. package/dist/api/chatkit/types.d.ts +11 -11
  19. package/dist/api/chatkit/types.js +3 -3
  20. package/dist/api/chatkit/types.js.map +1 -1
  21. package/dist/api/container/cloud.js +0 -8
  22. package/dist/api/container/cloud.js.map +1 -1
  23. package/dist/api/container/index.js +2 -1
  24. package/dist/api/container/index.js.map +1 -1
  25. package/dist/api/container/local.js +0 -7
  26. package/dist/api/container/local.js.map +1 -1
  27. package/dist/api/container/routes.js +3 -17
  28. package/dist/api/container/routes.js.map +1 -1
  29. package/dist/api/container/types.d.ts +0 -2
  30. package/dist/api/container/types.js.map +1 -1
  31. package/dist/api/handlers/PodManagementHandler.d.ts +3 -0
  32. package/dist/api/handlers/PodManagementHandler.js +71 -1
  33. package/dist/api/handlers/PodManagementHandler.js.map +1 -1
  34. package/dist/api/handlers/RunHandler.js +5 -5
  35. package/dist/api/handlers/RunHandler.js.map +1 -1
  36. package/dist/api/runs/AgentRuntimeTypes.d.ts +7 -8
  37. package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
  38. package/dist/api/runs/InngestRunExecutionBackend.d.ts +2 -2
  39. package/dist/api/runs/ManagedRunWorker.d.ts +1 -1
  40. package/dist/api/runs/ManagedRunWorker.js +6 -6
  41. package/dist/api/runs/ManagedRunWorker.js.map +1 -1
  42. package/dist/api/runs/PiAgentRuntimeDriver.d.ts +16 -1
  43. package/dist/api/runs/PiAgentRuntimeDriver.js +182 -23
  44. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
  45. package/dist/api/runs/RunStateCenter.d.ts +3 -3
  46. package/dist/api/runs/RunStateCenter.js +13 -13
  47. package/dist/api/runs/RunStateCenter.js.map +1 -1
  48. package/dist/api/runs/store.d.ts +4 -4
  49. package/dist/api/runs/store.js +2 -2
  50. package/dist/api/runs/store.js.map +1 -1
  51. package/dist/api/service/VectorStoreService.d.ts +1 -1
  52. package/dist/api/service/VectorStoreService.js +16 -16
  53. package/dist/api/service/VectorStoreService.js.map +1 -1
  54. package/dist/api/tasks/InngestTaskScheduler.d.ts +4 -4
  55. package/dist/api/tasks/TaskMaterializer.d.ts +3 -3
  56. package/dist/api/tasks/TaskMaterializer.js +11 -11
  57. package/dist/api/tasks/TaskMaterializer.js.map +1 -1
  58. package/dist/api/tasks/TaskService.d.ts +3 -3
  59. package/dist/api/tasks/TaskService.js +11 -7
  60. package/dist/api/tasks/TaskService.js.map +1 -1
  61. package/dist/api/tasks/store.d.ts +10 -4
  62. package/dist/api/tasks/store.js +14 -4
  63. package/dist/api/tasks/store.js.map +1 -1
  64. package/dist/api/workspace/types.d.ts +3 -3
  65. package/dist/api/workspace/types.js +6 -6
  66. package/dist/api/workspace/types.js.map +1 -1
  67. package/dist/cli/commands/config.js +2 -2
  68. package/dist/cli/commands/config.js.map +1 -1
  69. package/dist/cli/commands/start.js +9 -3
  70. package/dist/cli/commands/start.js.map +1 -1
  71. package/dist/components/components.jsonld +8 -2
  72. package/dist/components/context.jsonld +302 -51
  73. package/dist/http/search/SearchHttpHandler.js +8 -8
  74. package/dist/http/search/SearchHttpHandler.js.map +1 -1
  75. package/dist/identity/drizzle/PodLookupRepository.d.ts +11 -1
  76. package/dist/identity/drizzle/PodLookupRepository.js +95 -4
  77. package/dist/identity/drizzle/PodLookupRepository.js.map +1 -1
  78. package/dist/identity/drizzle/db.js +4 -43
  79. package/dist/identity/drizzle/db.js.map +1 -1
  80. package/dist/identity/drizzle/schema.pg.d.ts +0 -5
  81. package/dist/identity/drizzle/schema.pg.js +2 -16
  82. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  83. package/dist/identity/drizzle/schema.sqlite.d.ts +19 -176
  84. package/dist/identity/drizzle/schema.sqlite.js +2 -16
  85. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  86. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +4 -4
  87. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +7 -7
  88. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  89. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +6 -6
  90. package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +4 -4
  91. package/dist/identity/oidc/AutoDetectOidcHandler.js +6 -6
  92. package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
  93. package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +6 -6
  94. package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +37 -0
  95. package/dist/identity/oidc/ScopedPickWebIdHandler.js +211 -0
  96. package/dist/identity/oidc/ScopedPickWebIdHandler.js.map +1 -0
  97. package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +158 -0
  98. package/dist/index.d.ts +12 -2
  99. package/dist/index.js +16 -4
  100. package/dist/index.js.map +1 -1
  101. package/dist/main.js +8 -2
  102. package/dist/main.js.map +1 -1
  103. package/dist/provision/ProvisionPodCreator.d.ts +3 -4
  104. package/dist/provision/ProvisionPodCreator.js +8 -13
  105. package/dist/provision/ProvisionPodCreator.js.map +1 -1
  106. package/dist/provision/ProvisionPodCreator.jsonld +7 -7
  107. package/dist/runtime/Proxy.d.ts +0 -1
  108. package/dist/runtime/Proxy.js +0 -9
  109. package/dist/runtime/Proxy.js.map +1 -1
  110. package/dist/runtime/bootstrap.d.ts +1 -0
  111. package/dist/runtime/bootstrap.js +5 -2
  112. package/dist/runtime/bootstrap.js.map +1 -1
  113. package/dist/runtime/css-process.d.ts +12 -4
  114. package/dist/runtime/css-process.js +61 -14
  115. package/dist/runtime/css-process.js.map +1 -1
  116. package/dist/runtime/oidc-issuer.d.ts +3 -2
  117. package/dist/runtime/oidc-issuer.js +3 -2
  118. package/dist/runtime/oidc-issuer.js.map +1 -1
  119. package/dist/runtime/runtime-types.d.ts +1 -0
  120. package/dist/runtime/runtime-types.js.map +1 -1
  121. package/dist/solidfs/LocalFirstRdfRepresentationResolver.d.ts +21 -0
  122. package/dist/solidfs/LocalFirstRdfRepresentationResolver.js +38 -0
  123. package/dist/solidfs/LocalFirstRdfRepresentationResolver.js.map +1 -0
  124. package/dist/solidfs/LocalSolidFS.d.ts +18 -0
  125. package/dist/solidfs/LocalSolidFS.js +539 -0
  126. package/dist/solidfs/LocalSolidFS.js.map +1 -0
  127. package/dist/solidfs/PodSolidFsHttpClient.d.ts +16 -0
  128. package/dist/solidfs/PodSolidFsHttpClient.js +93 -0
  129. package/dist/solidfs/PodSolidFsHttpClient.js.map +1 -0
  130. package/dist/solidfs/PodSolidFsHydrator.d.ts +27 -0
  131. package/dist/solidfs/PodSolidFsHydrator.js +127 -0
  132. package/dist/solidfs/PodSolidFsHydrator.js.map +1 -0
  133. package/dist/solidfs/PodSolidFsSyncer.d.ts +21 -0
  134. package/dist/solidfs/PodSolidFsSyncer.js +78 -0
  135. package/dist/solidfs/PodSolidFsSyncer.js.map +1 -0
  136. package/dist/solidfs/RdfIndexSolidFsSyncer.d.ts +22 -0
  137. package/dist/solidfs/RdfIndexSolidFsSyncer.js +131 -0
  138. package/dist/solidfs/RdfIndexSolidFsSyncer.js.map +1 -0
  139. package/dist/solidfs/index.d.ts +7 -0
  140. package/dist/solidfs/index.js +24 -0
  141. package/dist/solidfs/index.js.map +1 -0
  142. package/dist/solidfs/types.d.ts +131 -0
  143. package/dist/solidfs/types.js +19 -0
  144. package/dist/solidfs/types.js.map +1 -0
  145. package/dist/storage/RepresentationPartialConvertingStore.js +6 -13
  146. package/dist/storage/RepresentationPartialConvertingStore.js.map +1 -1
  147. package/dist/storage/SparqlUpdateResourceStore.d.ts +4 -0
  148. package/dist/storage/SparqlUpdateResourceStore.js +13 -0
  149. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  150. package/dist/storage/SparqlUpdateResourceStore.jsonld +26 -0
  151. package/dist/storage/accessors/MinioDataAccessor.d.ts +2 -0
  152. package/dist/storage/accessors/MinioDataAccessor.js +13 -7
  153. package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
  154. package/dist/storage/accessors/MinioDataAccessor.jsonld +8 -0
  155. package/dist/storage/accessors/MixDataAccessor.d.ts +85 -4
  156. package/dist/storage/accessors/MixDataAccessor.js +511 -16
  157. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  158. package/dist/storage/accessors/MixDataAccessor.jsonld +176 -1
  159. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.d.ts +7 -0
  160. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +72 -4
  161. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js.map +1 -1
  162. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.jsonld +24 -0
  163. package/dist/storage/quint/BaseQuintStore.d.ts +3 -0
  164. package/dist/storage/quint/BaseQuintStore.js +51 -27
  165. package/dist/storage/quint/BaseQuintStore.js.map +1 -1
  166. package/dist/storage/quint/PgQuintStore.d.ts +1 -0
  167. package/dist/storage/quint/PgQuintStore.js +50 -32
  168. package/dist/storage/quint/PgQuintStore.js.map +1 -1
  169. package/dist/storage/quint/PgQuintStore.jsonld +4 -3
  170. package/dist/storage/quint/SqliteQuintStore.d.ts +5 -0
  171. package/dist/storage/quint/SqliteQuintStore.js +100 -0
  172. package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
  173. package/dist/storage/quint/SqliteQuintStore.jsonld +20 -0
  174. package/dist/storage/quint/types.d.ts +16 -0
  175. package/dist/storage/quint/types.js.map +1 -1
  176. package/dist/storage/rdf/Rdf3xTripleIndex.d.ts +55 -0
  177. package/dist/storage/rdf/Rdf3xTripleIndex.js +1235 -0
  178. package/dist/storage/rdf/Rdf3xTripleIndex.js.map +1 -0
  179. package/dist/storage/rdf/RdfContentTypes.d.ts +9 -0
  180. package/dist/storage/rdf/RdfContentTypes.js +79 -0
  181. package/dist/storage/rdf/RdfContentTypes.js.map +1 -0
  182. package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +76 -0
  183. package/dist/storage/rdf/RdfLocalQueryEngine.js +2636 -0
  184. package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -0
  185. package/dist/storage/rdf/RdfQuadIndex.d.ts +98 -0
  186. package/dist/storage/rdf/RdfQuadIndex.js +1840 -0
  187. package/dist/storage/rdf/RdfQuadIndex.js.map +1 -0
  188. package/dist/storage/rdf/RdfQuadIndex.jsonld +416 -0
  189. package/dist/storage/rdf/RdfShadowComparator.d.ts +12 -0
  190. package/dist/storage/rdf/RdfShadowComparator.js +47 -0
  191. package/dist/storage/rdf/RdfShadowComparator.js.map +1 -0
  192. package/dist/storage/rdf/RdfSparqlAdapter.d.ts +147 -0
  193. package/dist/storage/rdf/RdfSparqlAdapter.js +2420 -0
  194. package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -0
  195. package/dist/storage/rdf/RdfSparqlAdapter.jsonld +414 -0
  196. package/dist/storage/rdf/RdfTermDictionary.d.ts +27 -0
  197. package/dist/storage/rdf/RdfTermDictionary.js +352 -0
  198. package/dist/storage/rdf/RdfTermDictionary.js.map +1 -0
  199. package/dist/storage/rdf/RdfTermDictionary.jsonld +114 -0
  200. package/dist/storage/rdf/RdfTermSemantics.d.ts +6 -0
  201. package/dist/storage/rdf/RdfTermSemantics.js +40 -0
  202. package/dist/storage/rdf/RdfTermSemantics.js.map +1 -0
  203. package/dist/storage/rdf/RdfTextIndex.d.ts +23 -0
  204. package/dist/storage/rdf/RdfTextIndex.js +569 -0
  205. package/dist/storage/rdf/RdfTextIndex.js.map +1 -0
  206. package/dist/storage/rdf/RdfVectorIndex.d.ts +22 -0
  207. package/dist/storage/rdf/RdfVectorIndex.js +631 -0
  208. package/dist/storage/rdf/RdfVectorIndex.js.map +1 -0
  209. package/dist/storage/rdf/RdfXmlSerializer.d.ts +2 -0
  210. package/dist/storage/rdf/RdfXmlSerializer.js +123 -0
  211. package/dist/storage/rdf/RdfXmlSerializer.js.map +1 -0
  212. package/dist/storage/rdf/ShadowRdfQuintStore.d.ts +58 -0
  213. package/dist/storage/rdf/ShadowRdfQuintStore.js +202 -0
  214. package/dist/storage/rdf/ShadowRdfQuintStore.js.map +1 -0
  215. package/dist/storage/rdf/ShadowRdfQuintStore.jsonld +308 -0
  216. package/dist/storage/rdf/SolidRdfEngine.d.ts +51 -0
  217. package/dist/storage/rdf/SolidRdfEngine.js +264 -0
  218. package/dist/storage/rdf/SolidRdfEngine.js.map +1 -0
  219. package/dist/storage/rdf/SolidRdfEngine.jsonld +338 -0
  220. package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +92 -0
  221. package/dist/storage/rdf/SolidRdfSparqlEngine.js +477 -0
  222. package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -0
  223. package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +257 -0
  224. package/dist/storage/rdf/index.d.ts +15 -0
  225. package/dist/storage/rdf/index.js +61 -0
  226. package/dist/storage/rdf/index.js.map +1 -0
  227. package/dist/storage/rdf/models-benchmark.d.ts +260 -0
  228. package/dist/storage/rdf/models-benchmark.js +1405 -0
  229. package/dist/storage/rdf/models-benchmark.js.map +1 -0
  230. package/dist/storage/rdf/types.d.ts +726 -0
  231. package/dist/storage/rdf/types.js +3 -0
  232. package/dist/storage/rdf/types.js.map +1 -0
  233. package/dist/storage/rdf/types.jsonld +316 -0
  234. package/dist/storage/vector/VectorIndexingListener.d.ts +5 -5
  235. package/dist/storage/vector/VectorIndexingListener.js +19 -19
  236. package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
  237. package/package.json +3 -2
  238. package/templates/pod/acp/.acr.hbs +39 -0
  239. package/templates/pod/acp/README.acr +18 -0
  240. package/templates/pod/acp/profile/card.acr +22 -0
  241. package/templates/pod/base/README$.md.hbs +27 -0
  242. package/templates/pod/base/profile/card$.ttl.hbs +13 -0
  243. package/templates/pod/wac/.acl.hbs +26 -0
  244. package/templates/pod/wac/README.acl.hbs +14 -0
  245. package/templates/pod/wac/profile/card.acl.hbs +19 -0
  246. package/dist/api/handlers/WebIdProfileHandler.d.ts +0 -16
  247. package/dist/api/handlers/WebIdProfileHandler.js +0 -423
  248. package/dist/api/handlers/WebIdProfileHandler.js.map +0 -1
  249. package/dist/identity/drizzle/WebIdProfileRepository.d.ts +0 -63
  250. package/dist/identity/drizzle/WebIdProfileRepository.js +0 -168
  251. package/dist/identity/drizzle/WebIdProfileRepository.js.map +0 -1
  252. package/dist/identity/drizzle/WebIdProfileRepository.jsonld +0 -112
  253. package/dist/storage/quint/BaseQuintStore.jsonld +0 -257
@@ -0,0 +1,631 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RdfVectorIndex = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ const SqliteRuntime_1 = require("../SqliteRuntime");
7
+ class RdfVectorIndex {
8
+ constructor(options) {
9
+ this.options = options;
10
+ this.sqliteRuntime = (0, SqliteRuntime_1.createSqliteRuntime)();
11
+ this.db = null;
12
+ }
13
+ open() {
14
+ if (this.db) {
15
+ return;
16
+ }
17
+ if (this.options.path !== ':memory:') {
18
+ const dir = (0, node_path_1.dirname)(this.options.path);
19
+ if (!(0, node_fs_1.existsSync)(dir)) {
20
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
21
+ }
22
+ }
23
+ this.db = this.sqliteRuntime.openDatabase(this.options.path);
24
+ this.initializeSchema();
25
+ }
26
+ close() {
27
+ this.db?.close();
28
+ this.db = null;
29
+ }
30
+ clear() {
31
+ this.requireDb().exec('DELETE FROM rdf_vector_components; DELETE FROM rdf_vector_chunks; DELETE FROM rdf_vector_sources;');
32
+ }
33
+ indexVector(source, chunks) {
34
+ const db = this.requireDb();
35
+ const sourceId = this.upsertSource(source);
36
+ const insertChunk = db.prepare(`
37
+ INSERT INTO rdf_vector_chunks (
38
+ source_id,
39
+ chunk_key,
40
+ ordinal,
41
+ level,
42
+ heading,
43
+ path,
44
+ content,
45
+ start_offset,
46
+ end_offset,
47
+ embedding_json,
48
+ dimensions,
49
+ magnitude,
50
+ model,
51
+ updated_at
52
+ )
53
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
54
+ `);
55
+ const insertComponent = db.prepare(`
56
+ INSERT INTO rdf_vector_components (
57
+ chunk_id,
58
+ dimension,
59
+ value,
60
+ updated_at
61
+ )
62
+ VALUES (?, ?, ?, strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
63
+ `);
64
+ db.transaction(() => {
65
+ db.prepare(`
66
+ DELETE FROM rdf_vector_components
67
+ WHERE chunk_id IN (
68
+ SELECT id FROM rdf_vector_chunks WHERE source_id = ?
69
+ )
70
+ `).run(sourceId);
71
+ db.prepare('DELETE FROM rdf_vector_chunks WHERE source_id = ?').run(sourceId);
72
+ for (const chunk of chunks) {
73
+ const embedding = normalizeEmbedding(chunk.embedding);
74
+ const result = insertChunk.run(sourceId, chunk.chunkKey, chunk.ordinal, chunk.level, chunk.heading || null, JSON.stringify(chunk.path ?? []), chunk.content, chunk.startOffset, chunk.endOffset, JSON.stringify(embedding), embedding.length, vectorMagnitude(embedding), chunk.model ?? '');
75
+ insertVectorComponents(insertComponent, Number(result.lastInsertRowid), embedding);
76
+ }
77
+ })();
78
+ }
79
+ deleteSource(source) {
80
+ const db = this.requireDb();
81
+ const row = db.prepare('SELECT id FROM rdf_vector_sources WHERE source = ?').get(source);
82
+ if (!row) {
83
+ return 0;
84
+ }
85
+ return db.transaction(() => {
86
+ db.prepare(`
87
+ DELETE FROM rdf_vector_components
88
+ WHERE chunk_id IN (
89
+ SELECT id FROM rdf_vector_chunks WHERE source_id = ?
90
+ )
91
+ `).run(row.id);
92
+ const deletedChunks = db.prepare('DELETE FROM rdf_vector_chunks WHERE source_id = ?').run(row.id).changes;
93
+ db.prepare('DELETE FROM rdf_vector_sources WHERE id = ?').run(row.id);
94
+ return deletedChunks;
95
+ })();
96
+ }
97
+ search(options) {
98
+ const embedding = normalizeEmbedding(options.embedding);
99
+ if (embedding.length === 0) {
100
+ return [];
101
+ }
102
+ const metric = options.metric ?? this.options.defaultMetric ?? 'cosine';
103
+ if (metric === 'cosine' && vectorMagnitude(embedding) === 0) {
104
+ return [];
105
+ }
106
+ const scoredQuery = buildVectorScoredRowsQuery(embedding, metric, options);
107
+ return this.requireDb()
108
+ .prepare(scoredQuery.sql)
109
+ .all(...scoredQuery.params)
110
+ .map((row) => {
111
+ const rowEmbedding = parseEmbedding(row.embedding_json);
112
+ const distance = scoredVectorDistance(row, metric);
113
+ return this.toSearchResult(row, rowEmbedding, vectorScore(distance, metric), distance);
114
+ });
115
+ }
116
+ estimateSearchCardinality(options) {
117
+ const embedding = normalizeEmbedding(options.embedding);
118
+ if (embedding.length === 0) {
119
+ return {
120
+ rows: 0,
121
+ source: 'vector-candidate-count',
122
+ indexChoice: 'vector-candidate-count',
123
+ };
124
+ }
125
+ const metric = options.metric ?? this.options.defaultMetric ?? 'cosine';
126
+ if (metric === 'cosine' && vectorMagnitude(embedding) === 0) {
127
+ return {
128
+ rows: 0,
129
+ source: 'vector-candidate-count',
130
+ indexChoice: 'vector-candidate-count',
131
+ };
132
+ }
133
+ if (options.threshold !== undefined) {
134
+ const countQuery = buildVectorScoredCountQuery(embedding, metric, options);
135
+ const rows = this.requireDb().prepare(countQuery.sql).get(...countQuery.params)?.count ?? 0;
136
+ return {
137
+ rows: applyResultWindow(rows, options.offset, options.limit),
138
+ source: 'vector-component-score',
139
+ indexChoice: 'vector-component-score',
140
+ };
141
+ }
142
+ const params = [embedding.length];
143
+ const conditions = ['chunk.dimensions = ?'];
144
+ if (options.workspace) {
145
+ conditions.push('source.workspace = ?');
146
+ params.push(options.workspace);
147
+ }
148
+ if (options.source) {
149
+ conditions.push('source.source = ?');
150
+ params.push(options.source);
151
+ }
152
+ if (options.sourcePrefix) {
153
+ conditions.push('source.source >= ? AND source.source < ?');
154
+ params.push(options.sourcePrefix, `${options.sourcePrefix}\uffff`);
155
+ }
156
+ if (options.model !== undefined) {
157
+ conditions.push('chunk.model = ?');
158
+ params.push(options.model);
159
+ }
160
+ const rows = this.requireDb().prepare(`
161
+ SELECT COUNT(*) AS count
162
+ FROM rdf_vector_chunks chunk
163
+ JOIN rdf_vector_sources source ON source.id = chunk.source_id
164
+ WHERE ${conditions.join(' AND ')}
165
+ `).get(...params)?.count ?? 0;
166
+ return {
167
+ rows: applyResultWindow(rows, options.offset, options.limit),
168
+ source: 'vector-candidate-count',
169
+ indexChoice: 'vector-candidate-count',
170
+ };
171
+ }
172
+ stats() {
173
+ const db = this.requireDb();
174
+ return {
175
+ sourceCount: db.prepare('SELECT COUNT(*) AS count FROM rdf_vector_sources').get()?.count ?? 0,
176
+ chunkCount: db.prepare('SELECT COUNT(*) AS count FROM rdf_vector_chunks').get()?.count ?? 0,
177
+ componentCount: db.prepare('SELECT COUNT(*) AS count FROM rdf_vector_components').get()?.count ?? 0,
178
+ databaseBytes: this.estimateDatabaseBytes(),
179
+ modelDistribution: this.modelDistribution(),
180
+ };
181
+ }
182
+ modelDistribution() {
183
+ const rows = this.requireDb().prepare(`
184
+ SELECT
185
+ chunk.model,
186
+ chunk.dimensions,
187
+ COUNT(DISTINCT chunk.source_id) AS source_count,
188
+ COUNT(*) AS chunk_count,
189
+ MIN(chunk.magnitude) AS min_magnitude,
190
+ MAX(chunk.magnitude) AS max_magnitude,
191
+ AVG(chunk.magnitude) AS average_magnitude
192
+ FROM rdf_vector_chunks chunk
193
+ GROUP BY chunk.model, chunk.dimensions
194
+ ORDER BY chunk_count DESC, source_count DESC, chunk.model ASC, chunk.dimensions ASC
195
+ `).all();
196
+ return rows.map((row) => ({
197
+ model: row.model,
198
+ dimensions: row.dimensions,
199
+ sourceCount: row.source_count,
200
+ chunkCount: row.chunk_count,
201
+ minMagnitude: row.min_magnitude ?? 0,
202
+ maxMagnitude: row.max_magnitude ?? 0,
203
+ averageMagnitude: row.average_magnitude ?? 0,
204
+ }));
205
+ }
206
+ initializeSchema() {
207
+ this.requireDb().exec(`
208
+ CREATE TABLE IF NOT EXISTS rdf_vector_sources (
209
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
210
+ source TEXT NOT NULL UNIQUE,
211
+ workspace TEXT NOT NULL,
212
+ local_path TEXT,
213
+ content_type TEXT,
214
+ source_version TEXT,
215
+ source_hash TEXT,
216
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
217
+ );
218
+
219
+ CREATE TABLE IF NOT EXISTS rdf_vector_chunks (
220
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
221
+ source_id INTEGER NOT NULL,
222
+ chunk_key TEXT NOT NULL,
223
+ ordinal INTEGER NOT NULL,
224
+ level INTEGER NOT NULL,
225
+ heading TEXT,
226
+ path TEXT,
227
+ content TEXT NOT NULL,
228
+ start_offset INTEGER NOT NULL,
229
+ end_offset INTEGER NOT NULL,
230
+ embedding_json TEXT NOT NULL,
231
+ dimensions INTEGER NOT NULL,
232
+ magnitude REAL NOT NULL,
233
+ model TEXT NOT NULL,
234
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
235
+ UNIQUE (source_id, chunk_key),
236
+ FOREIGN KEY (source_id) REFERENCES rdf_vector_sources(id)
237
+ );
238
+
239
+ CREATE TABLE IF NOT EXISTS rdf_vector_components (
240
+ chunk_id INTEGER NOT NULL,
241
+ dimension INTEGER NOT NULL,
242
+ value REAL NOT NULL,
243
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
244
+ PRIMARY KEY (chunk_id, dimension),
245
+ FOREIGN KEY (chunk_id) REFERENCES rdf_vector_chunks(id)
246
+ );
247
+
248
+ CREATE INDEX IF NOT EXISTS rdf_vector_sources_workspace ON rdf_vector_sources(workspace);
249
+ CREATE INDEX IF NOT EXISTS rdf_vector_sources_source ON rdf_vector_sources(source);
250
+ CREATE INDEX IF NOT EXISTS rdf_vector_chunks_source ON rdf_vector_chunks(source_id, ordinal);
251
+ CREATE INDEX IF NOT EXISTS rdf_vector_chunks_model_dimensions ON rdf_vector_chunks(model, dimensions);
252
+ CREATE INDEX IF NOT EXISTS rdf_vector_components_dimension ON rdf_vector_components(dimension, chunk_id);
253
+ `);
254
+ this.backfillVectorComponents();
255
+ }
256
+ backfillVectorComponents() {
257
+ const db = this.requireDb();
258
+ const rows = db.prepare(`
259
+ SELECT
260
+ chunk.id,
261
+ chunk.dimensions,
262
+ chunk.embedding_json,
263
+ COUNT(component.dimension) AS component_count
264
+ FROM rdf_vector_chunks chunk
265
+ LEFT JOIN rdf_vector_components component ON component.chunk_id = chunk.id
266
+ WHERE chunk.dimensions > 0
267
+ GROUP BY chunk.id
268
+ HAVING component_count <> chunk.dimensions
269
+ `).all();
270
+ if (rows.length === 0) {
271
+ return;
272
+ }
273
+ const deleteComponents = db.prepare('DELETE FROM rdf_vector_components WHERE chunk_id = ?');
274
+ const insertComponent = db.prepare(`
275
+ INSERT INTO rdf_vector_components (
276
+ chunk_id,
277
+ dimension,
278
+ value,
279
+ updated_at
280
+ )
281
+ VALUES (?, ?, ?, strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
282
+ `);
283
+ db.transaction(() => {
284
+ for (const row of rows) {
285
+ deleteComponents.run(row.id);
286
+ insertVectorComponents(insertComponent, row.id, parseEmbedding(row.embedding_json));
287
+ }
288
+ })();
289
+ }
290
+ upsertSource(source) {
291
+ const db = this.requireDb();
292
+ db.prepare(`
293
+ INSERT INTO rdf_vector_sources (
294
+ source,
295
+ workspace,
296
+ local_path,
297
+ content_type,
298
+ source_version,
299
+ source_hash,
300
+ updated_at
301
+ )
302
+ VALUES (?, ?, ?, ?, ?, ?, strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
303
+ ON CONFLICT (source)
304
+ DO UPDATE SET
305
+ workspace = excluded.workspace,
306
+ local_path = excluded.local_path,
307
+ content_type = excluded.content_type,
308
+ source_version = excluded.source_version,
309
+ source_hash = excluded.source_hash,
310
+ updated_at = excluded.updated_at
311
+ `).run(source.source, source.workspace, source.localPath ?? null, source.contentType ?? null, source.sourceVersion ?? null, source.sourceHash ?? null);
312
+ const row = db.prepare('SELECT * FROM rdf_vector_sources WHERE source = ?').get(source.source);
313
+ if (!row) {
314
+ throw new Error(`Failed to upsert RDF vector source: ${source.source}`);
315
+ }
316
+ return row.id;
317
+ }
318
+ estimateDatabaseBytes() {
319
+ const db = this.requireDb();
320
+ try {
321
+ const pageCount = db.prepare('PRAGMA page_count').get()?.page_count ?? 0;
322
+ const pageSize = db.prepare('PRAGMA page_size').get()?.page_size ?? 0;
323
+ return pageCount * pageSize;
324
+ }
325
+ catch {
326
+ return 0;
327
+ }
328
+ }
329
+ toSearchResult(row, embedding, score, distance) {
330
+ return {
331
+ source: row.source,
332
+ workspace: row.workspace,
333
+ localPath: row.local_path ?? undefined,
334
+ contentType: row.content_type ?? undefined,
335
+ sourceVersion: row.source_version ?? undefined,
336
+ sourceHash: row.source_hash ?? undefined,
337
+ chunkKey: row.chunk_key,
338
+ ordinal: row.ordinal,
339
+ level: row.level,
340
+ heading: row.heading ?? undefined,
341
+ path: parsePath(row.path),
342
+ content: row.content,
343
+ startOffset: row.start_offset,
344
+ endOffset: row.end_offset,
345
+ embedding,
346
+ model: row.model || undefined,
347
+ score,
348
+ distance,
349
+ };
350
+ }
351
+ requireDb() {
352
+ if (!this.db) {
353
+ throw new Error('RdfVectorIndex is not open');
354
+ }
355
+ return this.db;
356
+ }
357
+ }
358
+ exports.RdfVectorIndex = RdfVectorIndex;
359
+ function normalizeEmbedding(embedding) {
360
+ return embedding.filter((value) => Number.isFinite(value));
361
+ }
362
+ function parseEmbedding(value) {
363
+ try {
364
+ const parsed = JSON.parse(value);
365
+ return Array.isArray(parsed) ? normalizeEmbedding(parsed) : [];
366
+ }
367
+ catch {
368
+ return [];
369
+ }
370
+ }
371
+ function vectorMagnitude(embedding) {
372
+ return Math.sqrt(embedding.reduce((sum, value) => sum + value * value, 0));
373
+ }
374
+ function vectorScore(distance, metric) {
375
+ if (!Number.isFinite(distance)) {
376
+ return Number.NEGATIVE_INFINITY;
377
+ }
378
+ if (metric === 'cosine') {
379
+ return 1 - distance;
380
+ }
381
+ return -distance;
382
+ }
383
+ function scoredVectorDistance(row, metric) {
384
+ if (metric === 'euclidean') {
385
+ const squared = row.vector_distance_squared ?? Number.POSITIVE_INFINITY;
386
+ const stableSquared = Math.abs(squared) < 1e-12 ? 0 : squared;
387
+ return Math.sqrt(Math.max(0, stableSquared));
388
+ }
389
+ return row.vector_distance ?? Number.POSITIVE_INFINITY;
390
+ }
391
+ function dotProduct(left, right) {
392
+ let sum = 0;
393
+ for (let index = 0; index < left.length; index++) {
394
+ sum += left[index] * right[index];
395
+ }
396
+ return sum;
397
+ }
398
+ function insertVectorComponents(insertComponent, chunkId, embedding) {
399
+ for (let dimension = 0; dimension < embedding.length; dimension++) {
400
+ insertComponent.run(chunkId, dimension, embedding[dimension]);
401
+ }
402
+ }
403
+ function parsePath(value) {
404
+ if (!value) {
405
+ return [];
406
+ }
407
+ try {
408
+ const parsed = JSON.parse(value);
409
+ return Array.isArray(parsed) ? parsed.filter((item) => typeof item === 'string') : [];
410
+ }
411
+ catch {
412
+ return [];
413
+ }
414
+ }
415
+ function buildVectorScoredRowsQuery(embedding, metric, options) {
416
+ const scored = buildVectorScoredBaseQuery(embedding, metric, options);
417
+ const orderBy = buildVectorOrderClause(metric, options.orderBy);
418
+ const window = buildVectorWindowClause(options.limit, options.offset);
419
+ return {
420
+ sql: `
421
+ ${scored.withSql}
422
+ SELECT
423
+ scored.*,
424
+ scored.dot_product AS dot_product,
425
+ ${vectorScoreSql(metric, scored.queryMagnitude)} AS vector_score,
426
+ ${vectorDistanceSql(metric, scored.queryMagnitude)} AS vector_distance,
427
+ ${vectorSquaredDistanceSql(scored.queryMagnitude)} AS vector_distance_squared
428
+ FROM scored
429
+ ${scored.thresholdWhere}
430
+ ORDER BY ${orderBy}
431
+ ${window.sql}
432
+ `,
433
+ params: [...scored.params, ...window.params],
434
+ };
435
+ }
436
+ function buildVectorScoredCountQuery(embedding, metric, options) {
437
+ const scored = buildVectorScoredBaseQuery(embedding, metric, options);
438
+ return {
439
+ sql: `
440
+ ${scored.withSql}
441
+ SELECT COUNT(*) AS count
442
+ FROM scored
443
+ ${scored.thresholdWhere}
444
+ `,
445
+ params: scored.params,
446
+ };
447
+ }
448
+ function buildVectorScoredBaseQuery(embedding, metric, options) {
449
+ const queryMagnitude = vectorMagnitude(embedding);
450
+ const vectorValues = embedding.map(() => '(?, ?)').join(', ');
451
+ const vectorParams = embedding.flatMap((value, dimension) => [dimension, value]);
452
+ const conditions = ['chunk.dimensions = ?'];
453
+ const params = [...vectorParams, embedding.length];
454
+ if (metric === 'cosine') {
455
+ conditions.push('chunk.magnitude > 0');
456
+ }
457
+ if (options.workspace) {
458
+ conditions.push('source.workspace = ?');
459
+ params.push(options.workspace);
460
+ }
461
+ if (options.source) {
462
+ conditions.push('source.source = ?');
463
+ params.push(options.source);
464
+ }
465
+ if (options.sourcePrefix) {
466
+ conditions.push('source.source >= ? AND source.source < ?');
467
+ params.push(options.sourcePrefix, `${options.sourcePrefix}\uffff`);
468
+ }
469
+ if (options.model !== undefined) {
470
+ conditions.push('chunk.model = ?');
471
+ params.push(options.model);
472
+ }
473
+ const thresholdWhere = options.threshold === undefined
474
+ ? ''
475
+ : `WHERE ${vectorThresholdSql(metric, queryMagnitude, options.threshold)}`;
476
+ return {
477
+ withSql: `
478
+ WITH query_vector(dimension, value) AS (
479
+ VALUES ${vectorValues}
480
+ ),
481
+ scored AS (
482
+ SELECT
483
+ chunk.id,
484
+ chunk.source_id,
485
+ source.source,
486
+ source.workspace,
487
+ source.local_path,
488
+ source.content_type,
489
+ source.source_version,
490
+ source.source_hash,
491
+ chunk.chunk_key,
492
+ chunk.ordinal,
493
+ chunk.level,
494
+ chunk.heading,
495
+ chunk.path,
496
+ chunk.content,
497
+ chunk.start_offset,
498
+ chunk.end_offset,
499
+ chunk.embedding_json,
500
+ chunk.dimensions,
501
+ chunk.magnitude,
502
+ chunk.model,
503
+ chunk.updated_at,
504
+ SUM(component.value * query_vector.value) AS dot_product
505
+ FROM rdf_vector_chunks chunk
506
+ JOIN rdf_vector_sources source ON source.id = chunk.source_id
507
+ JOIN rdf_vector_components component ON component.chunk_id = chunk.id
508
+ JOIN query_vector ON query_vector.dimension = component.dimension
509
+ WHERE ${conditions.join(' AND ')}
510
+ GROUP BY chunk.id
511
+ HAVING COUNT(component.dimension) = ${sqlInteger(embedding.length)}
512
+ )
513
+ `,
514
+ params,
515
+ thresholdWhere,
516
+ queryMagnitude,
517
+ };
518
+ }
519
+ function buildVectorOrderClause(metric, orderBy) {
520
+ const order = orderBy?.length ? orderBy : [{ field: 'score', direction: 'desc' }];
521
+ const entries = order.map((entry) => `${vectorOrderExpression(metric, entry.field)} ${entry.direction === 'desc' ? 'DESC' : 'ASC'}`);
522
+ return [...entries, 'source_id ASC', 'ordinal ASC'].join(', ');
523
+ }
524
+ function vectorOrderExpression(metric, field) {
525
+ switch (field) {
526
+ case 'score':
527
+ return 'vector_score';
528
+ case 'distance':
529
+ return metric === 'euclidean' ? 'vector_distance_squared' : 'vector_distance';
530
+ case 'source':
531
+ return 'source';
532
+ case 'localPath':
533
+ return "COALESCE(local_path, '')";
534
+ case 'ordinal':
535
+ return 'ordinal';
536
+ case 'startOffset':
537
+ return 'start_offset';
538
+ case 'endOffset':
539
+ return 'end_offset';
540
+ default: {
541
+ const exhaustive = field;
542
+ throw new Error(`Unsupported RDF vector search order field: ${exhaustive}`);
543
+ }
544
+ }
545
+ }
546
+ function buildVectorWindowClause(limit, offset) {
547
+ const hasLimit = limit !== undefined;
548
+ const hasOffset = offset !== undefined;
549
+ if (!hasLimit && !hasOffset) {
550
+ return { sql: '', params: [] };
551
+ }
552
+ if (hasLimit) {
553
+ const params = [Math.max(0, limit)];
554
+ if (hasOffset) {
555
+ params.push(Math.max(0, offset));
556
+ return { sql: 'LIMIT ? OFFSET ?', params };
557
+ }
558
+ return { sql: 'LIMIT ?', params };
559
+ }
560
+ return { sql: 'LIMIT -1 OFFSET ?', params: [Math.max(0, offset ?? 0)] };
561
+ }
562
+ function vectorScoreSql(metric, queryMagnitude) {
563
+ switch (metric) {
564
+ case 'cosine':
565
+ return `dot_product / (${sqlNumber(queryMagnitude)} * magnitude)`;
566
+ case 'dot':
567
+ return 'dot_product';
568
+ case 'euclidean':
569
+ return `-(${vectorSquaredDistanceSql(queryMagnitude)})`;
570
+ default: {
571
+ const exhaustive = metric;
572
+ throw new Error(`Unsupported RDF vector distance metric: ${exhaustive}`);
573
+ }
574
+ }
575
+ }
576
+ function vectorDistanceSql(metric, queryMagnitude) {
577
+ switch (metric) {
578
+ case 'cosine':
579
+ return `1 - (${vectorScoreSql(metric, queryMagnitude)})`;
580
+ case 'dot':
581
+ return '-dot_product';
582
+ case 'euclidean':
583
+ return 'NULL';
584
+ default: {
585
+ const exhaustive = metric;
586
+ throw new Error(`Unsupported RDF vector distance metric: ${exhaustive}`);
587
+ }
588
+ }
589
+ }
590
+ function vectorSquaredDistanceSql(queryMagnitude) {
591
+ return `(${sqlNumber(queryMagnitude * queryMagnitude)} + magnitude * magnitude - 2 * dot_product)`;
592
+ }
593
+ function vectorThresholdSql(metric, queryMagnitude, threshold) {
594
+ if (!Number.isFinite(threshold)) {
595
+ return threshold === Number.NEGATIVE_INFINITY ? '1 = 1' : '1 = 0';
596
+ }
597
+ switch (metric) {
598
+ case 'cosine':
599
+ case 'dot':
600
+ return `${vectorScoreSql(metric, queryMagnitude)} >= ${sqlNumber(threshold)}`;
601
+ case 'euclidean':
602
+ return threshold <= 0
603
+ ? `${vectorSquaredDistanceSql(queryMagnitude)} <= ${sqlNumber(threshold * threshold)}`
604
+ : '1 = 0';
605
+ default: {
606
+ const exhaustive = metric;
607
+ throw new Error(`Unsupported RDF vector distance metric: ${exhaustive}`);
608
+ }
609
+ }
610
+ }
611
+ function applyResultWindow(rows, offset, limit) {
612
+ const start = Math.max(0, offset ?? 0);
613
+ if (rows <= start) {
614
+ return 0;
615
+ }
616
+ const remaining = rows - start;
617
+ return limit === undefined ? remaining : Math.min(remaining, Math.max(0, limit));
618
+ }
619
+ function sqlInteger(value) {
620
+ if (!Number.isSafeInteger(value) || value < 0) {
621
+ throw new Error(`Invalid RDF vector SQL integer: ${value}`);
622
+ }
623
+ return String(value);
624
+ }
625
+ function sqlNumber(value) {
626
+ if (!Number.isFinite(value)) {
627
+ throw new Error(`Invalid RDF vector SQL number: ${value}`);
628
+ }
629
+ return String(value);
630
+ }
631
+ //# sourceMappingURL=RdfVectorIndex.js.map