@gzoo/cortex 0.5.9

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 (377) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/CLAUDE.md +180 -0
  3. package/CONTRIBUTING.md +52 -0
  4. package/LICENSE +21 -0
  5. package/README.md +259 -0
  6. package/dist/cortex-mcp.mjs +3153 -0
  7. package/dist/cortex.mjs +8213 -0
  8. package/icon.png +0 -0
  9. package/logo.png +0 -0
  10. package/package.json +86 -0
  11. package/packages/cli/dist/commands/config.d.ts +4 -0
  12. package/packages/cli/dist/commands/config.d.ts.map +1 -0
  13. package/packages/cli/dist/commands/config.js +419 -0
  14. package/packages/cli/dist/commands/config.js.map +1 -0
  15. package/packages/cli/dist/commands/contradictions.d.ts +3 -0
  16. package/packages/cli/dist/commands/contradictions.d.ts.map +1 -0
  17. package/packages/cli/dist/commands/contradictions.js +74 -0
  18. package/packages/cli/dist/commands/contradictions.js.map +1 -0
  19. package/packages/cli/dist/commands/costs.d.ts +3 -0
  20. package/packages/cli/dist/commands/costs.d.ts.map +1 -0
  21. package/packages/cli/dist/commands/costs.js +168 -0
  22. package/packages/cli/dist/commands/costs.js.map +1 -0
  23. package/packages/cli/dist/commands/db.d.ts +3 -0
  24. package/packages/cli/dist/commands/db.d.ts.map +1 -0
  25. package/packages/cli/dist/commands/db.js +139 -0
  26. package/packages/cli/dist/commands/db.js.map +1 -0
  27. package/packages/cli/dist/commands/find.d.ts +3 -0
  28. package/packages/cli/dist/commands/find.d.ts.map +1 -0
  29. package/packages/cli/dist/commands/find.js +139 -0
  30. package/packages/cli/dist/commands/find.js.map +1 -0
  31. package/packages/cli/dist/commands/ingest.d.ts +3 -0
  32. package/packages/cli/dist/commands/ingest.d.ts.map +1 -0
  33. package/packages/cli/dist/commands/ingest.js +179 -0
  34. package/packages/cli/dist/commands/ingest.js.map +1 -0
  35. package/packages/cli/dist/commands/init.d.ts +3 -0
  36. package/packages/cli/dist/commands/init.d.ts.map +1 -0
  37. package/packages/cli/dist/commands/init.js +285 -0
  38. package/packages/cli/dist/commands/init.js.map +1 -0
  39. package/packages/cli/dist/commands/mcp.d.ts +3 -0
  40. package/packages/cli/dist/commands/mcp.d.ts.map +1 -0
  41. package/packages/cli/dist/commands/mcp.js +65 -0
  42. package/packages/cli/dist/commands/mcp.js.map +1 -0
  43. package/packages/cli/dist/commands/models.d.ts +3 -0
  44. package/packages/cli/dist/commands/models.d.ts.map +1 -0
  45. package/packages/cli/dist/commands/models.js +245 -0
  46. package/packages/cli/dist/commands/models.js.map +1 -0
  47. package/packages/cli/dist/commands/privacy.d.ts +3 -0
  48. package/packages/cli/dist/commands/privacy.d.ts.map +1 -0
  49. package/packages/cli/dist/commands/privacy.js +140 -0
  50. package/packages/cli/dist/commands/privacy.js.map +1 -0
  51. package/packages/cli/dist/commands/projects.d.ts +3 -0
  52. package/packages/cli/dist/commands/projects.d.ts.map +1 -0
  53. package/packages/cli/dist/commands/projects.js +142 -0
  54. package/packages/cli/dist/commands/projects.js.map +1 -0
  55. package/packages/cli/dist/commands/query.d.ts +3 -0
  56. package/packages/cli/dist/commands/query.d.ts.map +1 -0
  57. package/packages/cli/dist/commands/query.js +153 -0
  58. package/packages/cli/dist/commands/query.js.map +1 -0
  59. package/packages/cli/dist/commands/report.d.ts +3 -0
  60. package/packages/cli/dist/commands/report.d.ts.map +1 -0
  61. package/packages/cli/dist/commands/report.js +144 -0
  62. package/packages/cli/dist/commands/report.js.map +1 -0
  63. package/packages/cli/dist/commands/resolve.d.ts +3 -0
  64. package/packages/cli/dist/commands/resolve.d.ts.map +1 -0
  65. package/packages/cli/dist/commands/resolve.js +119 -0
  66. package/packages/cli/dist/commands/resolve.js.map +1 -0
  67. package/packages/cli/dist/commands/serve.d.ts +3 -0
  68. package/packages/cli/dist/commands/serve.d.ts.map +1 -0
  69. package/packages/cli/dist/commands/serve.js +108 -0
  70. package/packages/cli/dist/commands/serve.js.map +1 -0
  71. package/packages/cli/dist/commands/status.d.ts +3 -0
  72. package/packages/cli/dist/commands/status.d.ts.map +1 -0
  73. package/packages/cli/dist/commands/status.js +230 -0
  74. package/packages/cli/dist/commands/status.js.map +1 -0
  75. package/packages/cli/dist/commands/stop.d.ts +5 -0
  76. package/packages/cli/dist/commands/stop.d.ts.map +1 -0
  77. package/packages/cli/dist/commands/stop.js +80 -0
  78. package/packages/cli/dist/commands/stop.js.map +1 -0
  79. package/packages/cli/dist/commands/watch.d.ts +3 -0
  80. package/packages/cli/dist/commands/watch.d.ts.map +1 -0
  81. package/packages/cli/dist/commands/watch.js +235 -0
  82. package/packages/cli/dist/commands/watch.js.map +1 -0
  83. package/packages/cli/dist/index.d.ts +9 -0
  84. package/packages/cli/dist/index.d.ts.map +1 -0
  85. package/packages/cli/dist/index.js +68 -0
  86. package/packages/cli/dist/index.js.map +1 -0
  87. package/packages/cli/package.json +37 -0
  88. package/packages/cli/tsconfig.json +16 -0
  89. package/packages/core/dist/config/loader.d.ts +11 -0
  90. package/packages/core/dist/config/loader.d.ts.map +1 -0
  91. package/packages/core/dist/config/loader.js +133 -0
  92. package/packages/core/dist/config/loader.js.map +1 -0
  93. package/packages/core/dist/config/project-registry.d.ts +71 -0
  94. package/packages/core/dist/config/project-registry.d.ts.map +1 -0
  95. package/packages/core/dist/config/project-registry.js +89 -0
  96. package/packages/core/dist/config/project-registry.js.map +1 -0
  97. package/packages/core/dist/config/schema.d.ts +909 -0
  98. package/packages/core/dist/config/schema.d.ts.map +1 -0
  99. package/packages/core/dist/config/schema.js +125 -0
  100. package/packages/core/dist/config/schema.js.map +1 -0
  101. package/packages/core/dist/errors/cortex-error.d.ts +58 -0
  102. package/packages/core/dist/errors/cortex-error.d.ts.map +1 -0
  103. package/packages/core/dist/errors/cortex-error.js +68 -0
  104. package/packages/core/dist/errors/cortex-error.js.map +1 -0
  105. package/packages/core/dist/events/event-bus.d.ts +10 -0
  106. package/packages/core/dist/events/event-bus.d.ts.map +1 -0
  107. package/packages/core/dist/events/event-bus.js +42 -0
  108. package/packages/core/dist/events/event-bus.js.map +1 -0
  109. package/packages/core/dist/index.d.ts +8 -0
  110. package/packages/core/dist/index.d.ts.map +1 -0
  111. package/packages/core/dist/index.js +22 -0
  112. package/packages/core/dist/index.js.map +1 -0
  113. package/packages/core/dist/logger.d.ts +16 -0
  114. package/packages/core/dist/logger.d.ts.map +1 -0
  115. package/packages/core/dist/logger.js +57 -0
  116. package/packages/core/dist/logger.js.map +1 -0
  117. package/packages/core/dist/types/config.d.ts +107 -0
  118. package/packages/core/dist/types/config.d.ts.map +1 -0
  119. package/packages/core/dist/types/config.js +2 -0
  120. package/packages/core/dist/types/config.js.map +1 -0
  121. package/packages/core/dist/types/entity.d.ts +35 -0
  122. package/packages/core/dist/types/entity.d.ts.map +1 -0
  123. package/packages/core/dist/types/entity.js +2 -0
  124. package/packages/core/dist/types/entity.js.map +1 -0
  125. package/packages/core/dist/types/events.d.ts +76 -0
  126. package/packages/core/dist/types/events.d.ts.map +1 -0
  127. package/packages/core/dist/types/events.js +2 -0
  128. package/packages/core/dist/types/events.js.map +1 -0
  129. package/packages/core/dist/types/file.d.ts +15 -0
  130. package/packages/core/dist/types/file.d.ts.map +1 -0
  131. package/packages/core/dist/types/file.js +2 -0
  132. package/packages/core/dist/types/file.js.map +1 -0
  133. package/packages/core/dist/types/graph.d.ts +93 -0
  134. package/packages/core/dist/types/graph.d.ts.map +1 -0
  135. package/packages/core/dist/types/graph.js +2 -0
  136. package/packages/core/dist/types/graph.js.map +1 -0
  137. package/packages/core/dist/types/index.d.ts +10 -0
  138. package/packages/core/dist/types/index.d.ts.map +1 -0
  139. package/packages/core/dist/types/index.js +2 -0
  140. package/packages/core/dist/types/index.js.map +1 -0
  141. package/packages/core/dist/types/llm.d.ts +95 -0
  142. package/packages/core/dist/types/llm.d.ts.map +1 -0
  143. package/packages/core/dist/types/llm.js +10 -0
  144. package/packages/core/dist/types/llm.js.map +1 -0
  145. package/packages/core/dist/types/project.d.ts +11 -0
  146. package/packages/core/dist/types/project.d.ts.map +1 -0
  147. package/packages/core/dist/types/project.js +2 -0
  148. package/packages/core/dist/types/project.js.map +1 -0
  149. package/packages/core/dist/types/relationship.d.ts +26 -0
  150. package/packages/core/dist/types/relationship.d.ts.map +1 -0
  151. package/packages/core/dist/types/relationship.js +2 -0
  152. package/packages/core/dist/types/relationship.js.map +1 -0
  153. package/packages/core/package.json +22 -0
  154. package/packages/core/tsconfig.json +9 -0
  155. package/packages/graph/dist/index.d.ts +4 -0
  156. package/packages/graph/dist/index.d.ts.map +1 -0
  157. package/packages/graph/dist/index.js +4 -0
  158. package/packages/graph/dist/index.js.map +1 -0
  159. package/packages/graph/dist/migrations/001-initial.d.ts +4 -0
  160. package/packages/graph/dist/migrations/001-initial.d.ts.map +1 -0
  161. package/packages/graph/dist/migrations/001-initial.js +134 -0
  162. package/packages/graph/dist/migrations/001-initial.js.map +1 -0
  163. package/packages/graph/dist/query-engine.d.ts +35 -0
  164. package/packages/graph/dist/query-engine.d.ts.map +1 -0
  165. package/packages/graph/dist/query-engine.js +185 -0
  166. package/packages/graph/dist/query-engine.js.map +1 -0
  167. package/packages/graph/dist/sqlite-store.d.ts +125 -0
  168. package/packages/graph/dist/sqlite-store.d.ts.map +1 -0
  169. package/packages/graph/dist/sqlite-store.js +632 -0
  170. package/packages/graph/dist/sqlite-store.js.map +1 -0
  171. package/packages/graph/dist/vector-store.d.ts +27 -0
  172. package/packages/graph/dist/vector-store.d.ts.map +1 -0
  173. package/packages/graph/dist/vector-store.js +85 -0
  174. package/packages/graph/dist/vector-store.js.map +1 -0
  175. package/packages/graph/package.json +27 -0
  176. package/packages/graph/tsconfig.json +12 -0
  177. package/packages/ingest/dist/chunker.d.ts +21 -0
  178. package/packages/ingest/dist/chunker.d.ts.map +1 -0
  179. package/packages/ingest/dist/chunker.js +118 -0
  180. package/packages/ingest/dist/chunker.js.map +1 -0
  181. package/packages/ingest/dist/index.d.ts +11 -0
  182. package/packages/ingest/dist/index.d.ts.map +1 -0
  183. package/packages/ingest/dist/index.js +14 -0
  184. package/packages/ingest/dist/index.js.map +1 -0
  185. package/packages/ingest/dist/parsers/conversation.d.ts +10 -0
  186. package/packages/ingest/dist/parsers/conversation.d.ts.map +1 -0
  187. package/packages/ingest/dist/parsers/conversation.js +150 -0
  188. package/packages/ingest/dist/parsers/conversation.js.map +1 -0
  189. package/packages/ingest/dist/parsers/index.d.ts +11 -0
  190. package/packages/ingest/dist/parsers/index.d.ts.map +1 -0
  191. package/packages/ingest/dist/parsers/index.js +42 -0
  192. package/packages/ingest/dist/parsers/index.js.map +1 -0
  193. package/packages/ingest/dist/parsers/json-parser.d.ts +6 -0
  194. package/packages/ingest/dist/parsers/json-parser.d.ts.map +1 -0
  195. package/packages/ingest/dist/parsers/json-parser.js +114 -0
  196. package/packages/ingest/dist/parsers/json-parser.js.map +1 -0
  197. package/packages/ingest/dist/parsers/markdown.d.ts +6 -0
  198. package/packages/ingest/dist/parsers/markdown.d.ts.map +1 -0
  199. package/packages/ingest/dist/parsers/markdown.js +116 -0
  200. package/packages/ingest/dist/parsers/markdown.js.map +1 -0
  201. package/packages/ingest/dist/parsers/types.d.ts +18 -0
  202. package/packages/ingest/dist/parsers/types.d.ts.map +1 -0
  203. package/packages/ingest/dist/parsers/types.js +2 -0
  204. package/packages/ingest/dist/parsers/types.js.map +1 -0
  205. package/packages/ingest/dist/parsers/typescript.d.ts +11 -0
  206. package/packages/ingest/dist/parsers/typescript.d.ts.map +1 -0
  207. package/packages/ingest/dist/parsers/typescript.js +197 -0
  208. package/packages/ingest/dist/parsers/typescript.js.map +1 -0
  209. package/packages/ingest/dist/parsers/yaml-parser.d.ts +6 -0
  210. package/packages/ingest/dist/parsers/yaml-parser.d.ts.map +1 -0
  211. package/packages/ingest/dist/parsers/yaml-parser.js +52 -0
  212. package/packages/ingest/dist/parsers/yaml-parser.js.map +1 -0
  213. package/packages/ingest/dist/pipeline.d.ts +30 -0
  214. package/packages/ingest/dist/pipeline.d.ts.map +1 -0
  215. package/packages/ingest/dist/pipeline.js +311 -0
  216. package/packages/ingest/dist/pipeline.js.map +1 -0
  217. package/packages/ingest/dist/post-ingest.d.ts +25 -0
  218. package/packages/ingest/dist/post-ingest.d.ts.map +1 -0
  219. package/packages/ingest/dist/post-ingest.js +171 -0
  220. package/packages/ingest/dist/post-ingest.js.map +1 -0
  221. package/packages/ingest/dist/watcher.d.ts +26 -0
  222. package/packages/ingest/dist/watcher.d.ts.map +1 -0
  223. package/packages/ingest/dist/watcher.js +142 -0
  224. package/packages/ingest/dist/watcher.js.map +1 -0
  225. package/packages/ingest/package.json +30 -0
  226. package/packages/ingest/tsconfig.json +14 -0
  227. package/packages/llm/dist/cache.d.ts +26 -0
  228. package/packages/llm/dist/cache.d.ts.map +1 -0
  229. package/packages/llm/dist/cache.js +60 -0
  230. package/packages/llm/dist/cache.js.map +1 -0
  231. package/packages/llm/dist/index.d.ts +15 -0
  232. package/packages/llm/dist/index.d.ts.map +1 -0
  233. package/packages/llm/dist/index.js +19 -0
  234. package/packages/llm/dist/index.js.map +1 -0
  235. package/packages/llm/dist/output-parser.d.ts +4 -0
  236. package/packages/llm/dist/output-parser.d.ts.map +1 -0
  237. package/packages/llm/dist/output-parser.js +207 -0
  238. package/packages/llm/dist/output-parser.js.map +1 -0
  239. package/packages/llm/dist/prompts/context-ranking.d.ts +33 -0
  240. package/packages/llm/dist/prompts/context-ranking.d.ts.map +1 -0
  241. package/packages/llm/dist/prompts/context-ranking.js +30 -0
  242. package/packages/llm/dist/prompts/context-ranking.js.map +1 -0
  243. package/packages/llm/dist/prompts/contradiction-detection.d.ts +46 -0
  244. package/packages/llm/dist/prompts/contradiction-detection.d.ts.map +1 -0
  245. package/packages/llm/dist/prompts/contradiction-detection.js +45 -0
  246. package/packages/llm/dist/prompts/contradiction-detection.js.map +1 -0
  247. package/packages/llm/dist/prompts/conversational-query.d.ts +29 -0
  248. package/packages/llm/dist/prompts/conversational-query.d.ts.map +1 -0
  249. package/packages/llm/dist/prompts/conversational-query.js +34 -0
  250. package/packages/llm/dist/prompts/conversational-query.js.map +1 -0
  251. package/packages/llm/dist/prompts/entity-extraction.d.ts +67 -0
  252. package/packages/llm/dist/prompts/entity-extraction.d.ts.map +1 -0
  253. package/packages/llm/dist/prompts/entity-extraction.js +76 -0
  254. package/packages/llm/dist/prompts/entity-extraction.js.map +1 -0
  255. package/packages/llm/dist/prompts/follow-up-generation.d.ts +25 -0
  256. package/packages/llm/dist/prompts/follow-up-generation.d.ts.map +1 -0
  257. package/packages/llm/dist/prompts/follow-up-generation.js +25 -0
  258. package/packages/llm/dist/prompts/follow-up-generation.js.map +1 -0
  259. package/packages/llm/dist/prompts/merge-detection.d.ts +41 -0
  260. package/packages/llm/dist/prompts/merge-detection.d.ts.map +1 -0
  261. package/packages/llm/dist/prompts/merge-detection.js +31 -0
  262. package/packages/llm/dist/prompts/merge-detection.js.map +1 -0
  263. package/packages/llm/dist/prompts/relationship-inference.d.ts +60 -0
  264. package/packages/llm/dist/prompts/relationship-inference.d.ts.map +1 -0
  265. package/packages/llm/dist/prompts/relationship-inference.js +66 -0
  266. package/packages/llm/dist/prompts/relationship-inference.js.map +1 -0
  267. package/packages/llm/dist/providers/anthropic.d.ts +39 -0
  268. package/packages/llm/dist/providers/anthropic.d.ts.map +1 -0
  269. package/packages/llm/dist/providers/anthropic.js +157 -0
  270. package/packages/llm/dist/providers/anthropic.js.map +1 -0
  271. package/packages/llm/dist/providers/ollama.d.ts +52 -0
  272. package/packages/llm/dist/providers/ollama.d.ts.map +1 -0
  273. package/packages/llm/dist/providers/ollama.js +297 -0
  274. package/packages/llm/dist/providers/ollama.js.map +1 -0
  275. package/packages/llm/dist/providers/openai-compatible.d.ts +40 -0
  276. package/packages/llm/dist/providers/openai-compatible.d.ts.map +1 -0
  277. package/packages/llm/dist/providers/openai-compatible.js +164 -0
  278. package/packages/llm/dist/providers/openai-compatible.js.map +1 -0
  279. package/packages/llm/dist/router.d.ts +87 -0
  280. package/packages/llm/dist/router.d.ts.map +1 -0
  281. package/packages/llm/dist/router.js +399 -0
  282. package/packages/llm/dist/router.js.map +1 -0
  283. package/packages/llm/dist/token-tracker.d.ts +24 -0
  284. package/packages/llm/dist/token-tracker.d.ts.map +1 -0
  285. package/packages/llm/dist/token-tracker.js +114 -0
  286. package/packages/llm/dist/token-tracker.js.map +1 -0
  287. package/packages/llm/package.json +25 -0
  288. package/packages/llm/tsconfig.json +12 -0
  289. package/packages/mcp/dist/index.d.ts +10 -0
  290. package/packages/mcp/dist/index.d.ts.map +1 -0
  291. package/packages/mcp/dist/index.js +33 -0
  292. package/packages/mcp/dist/index.js.map +1 -0
  293. package/packages/mcp/dist/server.d.ts +5 -0
  294. package/packages/mcp/dist/server.d.ts.map +1 -0
  295. package/packages/mcp/dist/server.js +87 -0
  296. package/packages/mcp/dist/server.js.map +1 -0
  297. package/packages/mcp/dist/store-factory.d.ts +8 -0
  298. package/packages/mcp/dist/store-factory.d.ts.map +1 -0
  299. package/packages/mcp/dist/store-factory.js +24 -0
  300. package/packages/mcp/dist/store-factory.js.map +1 -0
  301. package/packages/mcp/dist/tools/contradictions.d.ts +14 -0
  302. package/packages/mcp/dist/tools/contradictions.d.ts.map +1 -0
  303. package/packages/mcp/dist/tools/contradictions.js +33 -0
  304. package/packages/mcp/dist/tools/contradictions.js.map +1 -0
  305. package/packages/mcp/dist/tools/find.d.ts +37 -0
  306. package/packages/mcp/dist/tools/find.d.ts.map +1 -0
  307. package/packages/mcp/dist/tools/find.js +52 -0
  308. package/packages/mcp/dist/tools/find.js.map +1 -0
  309. package/packages/mcp/dist/tools/projects.d.ts +16 -0
  310. package/packages/mcp/dist/tools/projects.d.ts.map +1 -0
  311. package/packages/mcp/dist/tools/projects.js +17 -0
  312. package/packages/mcp/dist/tools/projects.js.map +1 -0
  313. package/packages/mcp/dist/tools/query.d.ts +20 -0
  314. package/packages/mcp/dist/tools/query.d.ts.map +1 -0
  315. package/packages/mcp/dist/tools/query.js +65 -0
  316. package/packages/mcp/dist/tools/query.js.map +1 -0
  317. package/packages/mcp/dist/tools/status.d.ts +15 -0
  318. package/packages/mcp/dist/tools/status.d.ts.map +1 -0
  319. package/packages/mcp/dist/tools/status.js +17 -0
  320. package/packages/mcp/dist/tools/status.js.map +1 -0
  321. package/packages/mcp/package.json +27 -0
  322. package/packages/mcp/tsconfig.json +14 -0
  323. package/packages/server/dist/index.d.ts +17 -0
  324. package/packages/server/dist/index.d.ts.map +1 -0
  325. package/packages/server/dist/index.js +170 -0
  326. package/packages/server/dist/index.js.map +1 -0
  327. package/packages/server/dist/middleware/auth.d.ts +9 -0
  328. package/packages/server/dist/middleware/auth.d.ts.map +1 -0
  329. package/packages/server/dist/middleware/auth.js +94 -0
  330. package/packages/server/dist/middleware/auth.js.map +1 -0
  331. package/packages/server/dist/routes/contradictions.d.ts +4 -0
  332. package/packages/server/dist/routes/contradictions.d.ts.map +1 -0
  333. package/packages/server/dist/routes/contradictions.js +63 -0
  334. package/packages/server/dist/routes/contradictions.js.map +1 -0
  335. package/packages/server/dist/routes/entities.d.ts +4 -0
  336. package/packages/server/dist/routes/entities.d.ts.map +1 -0
  337. package/packages/server/dist/routes/entities.js +61 -0
  338. package/packages/server/dist/routes/entities.js.map +1 -0
  339. package/packages/server/dist/routes/projects.d.ts +4 -0
  340. package/packages/server/dist/routes/projects.d.ts.map +1 -0
  341. package/packages/server/dist/routes/projects.js +35 -0
  342. package/packages/server/dist/routes/projects.js.map +1 -0
  343. package/packages/server/dist/routes/query.d.ts +4 -0
  344. package/packages/server/dist/routes/query.d.ts.map +1 -0
  345. package/packages/server/dist/routes/query.js +93 -0
  346. package/packages/server/dist/routes/query.js.map +1 -0
  347. package/packages/server/dist/routes/relationships.d.ts +4 -0
  348. package/packages/server/dist/routes/relationships.d.ts.map +1 -0
  349. package/packages/server/dist/routes/relationships.js +52 -0
  350. package/packages/server/dist/routes/relationships.js.map +1 -0
  351. package/packages/server/dist/routes/status.d.ts +4 -0
  352. package/packages/server/dist/routes/status.d.ts.map +1 -0
  353. package/packages/server/dist/routes/status.js +85 -0
  354. package/packages/server/dist/routes/status.js.map +1 -0
  355. package/packages/server/dist/ws/event-relay.d.ts +10 -0
  356. package/packages/server/dist/ws/event-relay.d.ts.map +1 -0
  357. package/packages/server/dist/ws/event-relay.js +83 -0
  358. package/packages/server/dist/ws/event-relay.js.map +1 -0
  359. package/packages/server/package.json +32 -0
  360. package/packages/server/tsconfig.json +15 -0
  361. package/packages/web/dist/assets/index-Bxjfq4I0.css +1 -0
  362. package/packages/web/dist/assets/index-MqwNS5FD.js +248 -0
  363. package/packages/web/dist/assets/index-MqwNS5FD.js.map +1 -0
  364. package/packages/web/dist/cortex-icon.svg +9 -0
  365. package/packages/web/dist/icon.png +0 -0
  366. package/packages/web/dist/index.html +14 -0
  367. package/packages/web/dist/logo.png +0 -0
  368. package/packages/web/index.html +13 -0
  369. package/packages/web/package.json +34 -0
  370. package/packages/web/public/cortex-icon.svg +9 -0
  371. package/packages/web/public/icon.png +0 -0
  372. package/packages/web/public/logo.png +0 -0
  373. package/packages/web/tsconfig.json +22 -0
  374. package/packages/web/vite.config.ts +20 -0
  375. package/tsconfig.base.json +18 -0
  376. package/tsconfig.json +12 -0
  377. package/vitest.config.ts +14 -0
@@ -0,0 +1,632 @@
1
+ import Database from 'better-sqlite3';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { copyFileSync, statSync, mkdirSync, chmodSync } from 'node:fs';
4
+ import { dirname } from 'node:path';
5
+ import { homedir } from 'node:os';
6
+ import { CortexError, GRAPH_DB_ERROR, GRAPH_ENTITY_NOT_FOUND, } from '@cortex/core';
7
+ import { up as applyInitialMigration } from './migrations/001-initial.js';
8
+ function resolveHomePath(p) {
9
+ return p.startsWith('~') ? p.replace('~', homedir()) : p;
10
+ }
11
+ function now() {
12
+ return new Date().toISOString();
13
+ }
14
+ function rowToContradiction(row) {
15
+ return {
16
+ id: row.id,
17
+ entityIds: [row.entity_id_a, row.entity_id_b],
18
+ description: row.description,
19
+ severity: row.severity,
20
+ suggestedResolution: row.suggested_resolution ?? undefined,
21
+ status: row.status,
22
+ resolvedAction: row.resolved_action ?? undefined,
23
+ resolvedAt: row.resolved_at ?? undefined,
24
+ detectedAt: row.detected_at,
25
+ };
26
+ }
27
+ function rowToEntity(row) {
28
+ return {
29
+ id: row.id,
30
+ type: row.type,
31
+ name: row.name,
32
+ content: row.content,
33
+ summary: row.summary ?? undefined,
34
+ properties: row.properties ? JSON.parse(row.properties) : {},
35
+ confidence: row.confidence,
36
+ sourceFile: row.source_file,
37
+ sourceRange: row.source_start_line != null && row.source_end_line != null
38
+ ? { startLine: row.source_start_line, endLine: row.source_end_line }
39
+ : undefined,
40
+ projectId: row.project_id,
41
+ extractedBy: JSON.parse(row.extracted_by),
42
+ tags: row.tags ? JSON.parse(row.tags) : [],
43
+ status: row.status,
44
+ createdAt: row.created_at,
45
+ updatedAt: row.updated_at,
46
+ };
47
+ }
48
+ function rowToRelationship(row) {
49
+ return {
50
+ id: row.id,
51
+ type: row.type,
52
+ sourceEntityId: row.source_entity_id,
53
+ targetEntityId: row.target_entity_id,
54
+ description: row.description ?? undefined,
55
+ confidence: row.confidence,
56
+ properties: row.properties ? JSON.parse(row.properties) : {},
57
+ extractedBy: JSON.parse(row.extracted_by),
58
+ createdAt: row.created_at,
59
+ updatedAt: row.updated_at,
60
+ };
61
+ }
62
+ function rowToFile(row) {
63
+ return {
64
+ id: row.id,
65
+ path: row.path,
66
+ relativePath: row.relative_path,
67
+ projectId: row.project_id,
68
+ contentHash: row.content_hash,
69
+ fileType: row.file_type,
70
+ sizeBytes: row.size_bytes,
71
+ lastModified: row.last_modified,
72
+ lastIngestedAt: row.last_ingested_at ?? undefined,
73
+ entityIds: row.entity_ids ? JSON.parse(row.entity_ids) : [],
74
+ status: row.status,
75
+ parseError: row.parse_error ?? undefined,
76
+ };
77
+ }
78
+ function rowToProject(row) {
79
+ return {
80
+ id: row.id,
81
+ name: row.name,
82
+ rootPath: row.root_path,
83
+ privacyLevel: row.privacy_level,
84
+ fileCount: row.file_count,
85
+ entityCount: row.entity_count,
86
+ lastIngestedAt: row.last_ingested_at ?? undefined,
87
+ createdAt: row.created_at,
88
+ };
89
+ }
90
+ export class SQLiteStore {
91
+ db;
92
+ dbPath;
93
+ constructor(options = {}) {
94
+ const { dbPath = '~/.cortex/cortex.db', walMode = true, backupOnStartup = true, } = options;
95
+ this.dbPath = resolveHomePath(dbPath);
96
+ mkdirSync(dirname(this.dbPath), { recursive: true });
97
+ if (backupOnStartup) {
98
+ this.backupSync();
99
+ }
100
+ this.db = new Database(this.dbPath);
101
+ if (walMode) {
102
+ this.db.pragma('journal_mode = WAL');
103
+ }
104
+ this.db.pragma('foreign_keys = ON');
105
+ this.db.pragma('busy_timeout = 5000');
106
+ this.migrate();
107
+ }
108
+ migrate() {
109
+ try {
110
+ applyInitialMigration(this.db);
111
+ }
112
+ catch (err) {
113
+ throw new CortexError(GRAPH_DB_ERROR, 'critical', 'graph', `Migration failed: ${err instanceof Error ? err.message : String(err)}`, undefined, 'Delete the database and restart.');
114
+ }
115
+ }
116
+ backupSync() {
117
+ try {
118
+ const stat = statSync(this.dbPath);
119
+ if (stat.isFile()) {
120
+ const backupPath = `${this.dbPath}.backup`;
121
+ copyFileSync(this.dbPath, backupPath);
122
+ try {
123
+ chmodSync(backupPath, 0o600);
124
+ }
125
+ catch { /* Windows — ignore */ }
126
+ }
127
+ }
128
+ catch {
129
+ // DB doesn't exist yet — no backup needed
130
+ }
131
+ }
132
+ close() {
133
+ this.db.close();
134
+ }
135
+ // --- Entities ---
136
+ async createEntity(entity) {
137
+ const id = randomUUID();
138
+ const ts = now();
139
+ this.db.prepare(`
140
+ INSERT INTO entities (
141
+ id, type, name, content, summary, properties, confidence,
142
+ source_file, source_start_line, source_end_line,
143
+ project_id, extracted_by, tags, status, created_at, updated_at
144
+ ) VALUES (
145
+ ?, ?, ?, ?, ?, ?, ?,
146
+ ?, ?, ?,
147
+ ?, ?, ?, ?, ?, ?
148
+ )
149
+ `).run(id, entity.type, entity.name, entity.content, entity.summary ?? null, JSON.stringify(entity.properties), entity.confidence, entity.sourceFile, entity.sourceRange?.startLine ?? null, entity.sourceRange?.endLine ?? null, entity.projectId, JSON.stringify(entity.extractedBy), JSON.stringify(entity.tags), entity.status, ts, ts);
150
+ // Sync to FTS
151
+ this.db.prepare(`
152
+ INSERT INTO entities_fts (rowid, name, content, summary, tags)
153
+ VALUES (
154
+ (SELECT rowid FROM entities WHERE id = ?),
155
+ ?, ?, ?, ?
156
+ )
157
+ `).run(id, entity.name, entity.content, entity.summary ?? '', entity.tags.join(' '));
158
+ return { ...entity, id, createdAt: ts, updatedAt: ts };
159
+ }
160
+ async getEntity(id) {
161
+ const row = this.db.prepare('SELECT * FROM entities WHERE id = ? AND deleted_at IS NULL').get(id);
162
+ return row ? rowToEntity(row) : null;
163
+ }
164
+ async updateEntity(id, updates) {
165
+ const existing = await this.getEntity(id);
166
+ if (!existing) {
167
+ throw new CortexError(GRAPH_ENTITY_NOT_FOUND, 'low', 'graph', `Entity not found: ${id}`, { entityId: id });
168
+ }
169
+ const merged = { ...existing, ...updates, updatedAt: now() };
170
+ this.db.prepare(`
171
+ UPDATE entities SET
172
+ type = ?, name = ?, content = ?, summary = ?,
173
+ properties = ?, confidence = ?,
174
+ source_file = ?, source_start_line = ?, source_end_line = ?,
175
+ extracted_by = ?, tags = ?, status = ?, updated_at = ?
176
+ WHERE id = ?
177
+ `).run(merged.type, merged.name, merged.content, merged.summary ?? null, JSON.stringify(merged.properties), merged.confidence, merged.sourceFile, merged.sourceRange?.startLine ?? null, merged.sourceRange?.endLine ?? null, JSON.stringify(merged.extractedBy), JSON.stringify(merged.tags), merged.status, merged.updatedAt, id);
178
+ // Re-sync FTS
179
+ this.db.prepare(`
180
+ UPDATE entities_fts SET name = ?, content = ?, summary = ?, tags = ?
181
+ WHERE rowid = (SELECT rowid FROM entities WHERE id = ?)
182
+ `).run(merged.name, merged.content, merged.summary ?? '', merged.tags.join(' '), id);
183
+ return merged;
184
+ }
185
+ async deleteEntity(id, soft = true) {
186
+ if (soft) {
187
+ this.db.prepare('UPDATE entities SET deleted_at = ?, status = ? WHERE id = ?').run(now(), 'deleted', id);
188
+ }
189
+ else {
190
+ // Remove FTS entry before deleting the entity
191
+ this.db.prepare('DELETE FROM entities_fts WHERE rowid = (SELECT rowid FROM entities WHERE id = ?)').run(id);
192
+ this.db.prepare('DELETE FROM entities WHERE id = ?').run(id);
193
+ }
194
+ }
195
+ async findEntities(query) {
196
+ const conditions = ['deleted_at IS NULL'];
197
+ const params = [];
198
+ if (query.type) {
199
+ conditions.push('type = ?');
200
+ params.push(query.type);
201
+ }
202
+ if (query.projectId) {
203
+ conditions.push('project_id = ?');
204
+ params.push(query.projectId);
205
+ }
206
+ if (query.status) {
207
+ conditions.push('status = ?');
208
+ params.push(query.status);
209
+ }
210
+ if (query.since) {
211
+ conditions.push('created_at >= ?');
212
+ params.push(query.since);
213
+ }
214
+ if (query.before) {
215
+ conditions.push('created_at < ?');
216
+ params.push(query.before);
217
+ }
218
+ let sql;
219
+ if (query.search) {
220
+ // Use FTS for text search
221
+ sql = `
222
+ SELECT e.* FROM entities e
223
+ JOIN entities_fts fts ON fts.rowid = e.rowid
224
+ WHERE fts.entities_fts MATCH ? AND ${conditions.join(' AND ')}
225
+ ORDER BY rank
226
+ `;
227
+ params.unshift(query.search);
228
+ }
229
+ else {
230
+ sql = `
231
+ SELECT * FROM entities
232
+ WHERE ${conditions.join(' AND ')}
233
+ ORDER BY created_at DESC
234
+ `;
235
+ }
236
+ if (query.limit) {
237
+ sql += ' LIMIT ?';
238
+ params.push(query.limit);
239
+ }
240
+ if (query.offset) {
241
+ sql += ' OFFSET ?';
242
+ params.push(query.offset);
243
+ }
244
+ const rows = this.db.prepare(sql).all(...params);
245
+ return rows.map(rowToEntity);
246
+ }
247
+ // --- Relationships ---
248
+ async createRelationship(rel) {
249
+ const id = randomUUID();
250
+ const ts = now();
251
+ this.db.prepare(`
252
+ INSERT INTO relationships (
253
+ id, type, source_entity_id, target_entity_id,
254
+ description, confidence, properties, extracted_by,
255
+ created_at, updated_at
256
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
257
+ `).run(id, rel.type, rel.sourceEntityId, rel.targetEntityId, rel.description ?? null, rel.confidence, JSON.stringify(rel.properties), JSON.stringify(rel.extractedBy), ts, ts);
258
+ return { ...rel, id, createdAt: ts, updatedAt: ts };
259
+ }
260
+ async getRelationship(id) {
261
+ const row = this.db.prepare('SELECT * FROM relationships WHERE id = ?').get(id);
262
+ return row ? rowToRelationship(row) : null;
263
+ }
264
+ async getRelationshipsForEntity(entityId, direction = 'both') {
265
+ let sql;
266
+ let params;
267
+ if (direction === 'out') {
268
+ sql = 'SELECT * FROM relationships WHERE source_entity_id = ?';
269
+ params = [entityId];
270
+ }
271
+ else if (direction === 'in') {
272
+ sql = 'SELECT * FROM relationships WHERE target_entity_id = ?';
273
+ params = [entityId];
274
+ }
275
+ else {
276
+ sql = 'SELECT * FROM relationships WHERE source_entity_id = ? OR target_entity_id = ?';
277
+ params = [entityId, entityId];
278
+ }
279
+ const rows = this.db.prepare(sql).all(...params);
280
+ return rows.map(rowToRelationship);
281
+ }
282
+ async deleteRelationship(id) {
283
+ this.db.prepare('DELETE FROM relationships WHERE id = ?').run(id);
284
+ }
285
+ deleteBySourcePath(pathPrefix) {
286
+ // Normalize to backslashes (Windows DB storage), escape LIKE wildcards, then add wildcard
287
+ const normalized = pathPrefix.replace(/\//g, '\\');
288
+ const escaped = normalized.replace(/[%_\\]/g, '\\$&');
289
+ const pattern = escaped + '%';
290
+ return this.db.transaction(() => {
291
+ const relResult = this.db.prepare(`
292
+ DELETE FROM relationships
293
+ WHERE source_entity_id IN (SELECT id FROM entities WHERE source_file LIKE ? ESCAPE '\\')
294
+ OR target_entity_id IN (SELECT id FROM entities WHERE source_file LIKE ? ESCAPE '\\')
295
+ `).run(pattern, pattern);
296
+ this.db.prepare(`
297
+ DELETE FROM entities_fts
298
+ WHERE rowid IN (SELECT rowid FROM entities WHERE source_file LIKE ? ESCAPE '\\' AND deleted_at IS NULL)
299
+ `).run(pattern);
300
+ const entityResult = this.db.prepare("DELETE FROM entities WHERE source_file LIKE ? ESCAPE '\\'").run(pattern);
301
+ const fileResult = this.db.prepare("DELETE FROM files WHERE path LIKE ? ESCAPE '\\'").run(pattern);
302
+ return {
303
+ deletedEntities: entityResult.changes,
304
+ deletedRelationships: relResult.changes,
305
+ deletedFiles: fileResult.changes,
306
+ };
307
+ })();
308
+ }
309
+ resetDatabase() {
310
+ this.db.transaction(() => {
311
+ this.db.prepare('DELETE FROM contradictions').run();
312
+ this.db.prepare('DELETE FROM relationships').run();
313
+ this.db.prepare('DELETE FROM entities_fts').run();
314
+ this.db.prepare('DELETE FROM entities').run();
315
+ this.db.prepare('DELETE FROM files').run();
316
+ })();
317
+ }
318
+ pruneSoftDeleted() {
319
+ return this.db.transaction(() => {
320
+ const relResult = this.db.prepare(`
321
+ DELETE FROM relationships
322
+ WHERE source_entity_id IN (SELECT id FROM entities WHERE deleted_at IS NOT NULL)
323
+ OR target_entity_id IN (SELECT id FROM entities WHERE deleted_at IS NOT NULL)
324
+ `).run();
325
+ this.db.prepare(`
326
+ DELETE FROM entities_fts
327
+ WHERE rowid IN (SELECT rowid FROM entities WHERE deleted_at IS NOT NULL)
328
+ `).run();
329
+ const entityResult = this.db.prepare('DELETE FROM entities WHERE deleted_at IS NOT NULL').run();
330
+ return {
331
+ deletedEntities: entityResult.changes,
332
+ deletedRelationships: relResult.changes,
333
+ };
334
+ })();
335
+ }
336
+ // --- Files ---
337
+ async upsertFile(file) {
338
+ const existing = this.db.prepare('SELECT * FROM files WHERE path = ?').get(file.path);
339
+ if (existing) {
340
+ this.db.prepare(`
341
+ UPDATE files SET
342
+ relative_path = ?, project_id = ?, content_hash = ?,
343
+ file_type = ?, size_bytes = ?, last_modified = ?,
344
+ last_ingested_at = ?, entity_ids = ?, status = ?, parse_error = ?
345
+ WHERE path = ?
346
+ `).run(file.relativePath, file.projectId, file.contentHash, file.fileType, file.sizeBytes, file.lastModified, file.lastIngestedAt ?? null, JSON.stringify(file.entityIds), file.status, file.parseError ?? null, file.path);
347
+ return { ...file, id: existing.id };
348
+ }
349
+ const id = randomUUID();
350
+ this.db.prepare(`
351
+ INSERT INTO files (
352
+ id, path, relative_path, project_id, content_hash,
353
+ file_type, size_bytes, last_modified, last_ingested_at,
354
+ entity_ids, status, parse_error
355
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
356
+ `).run(id, file.path, file.relativePath, file.projectId, file.contentHash, file.fileType, file.sizeBytes, file.lastModified, file.lastIngestedAt ?? null, JSON.stringify(file.entityIds), file.status, file.parseError ?? null);
357
+ return { ...file, id };
358
+ }
359
+ async getFile(path) {
360
+ const row = this.db.prepare('SELECT * FROM files WHERE path = ?').get(path);
361
+ return row ? rowToFile(row) : null;
362
+ }
363
+ async getFilesByProject(projectId) {
364
+ const rows = this.db.prepare('SELECT * FROM files WHERE project_id = ?').all(projectId);
365
+ return rows.map(rowToFile);
366
+ }
367
+ // --- Projects ---
368
+ async createProject(project) {
369
+ const id = randomUUID();
370
+ const ts = now();
371
+ this.db.prepare(`
372
+ INSERT INTO projects (
373
+ id, name, root_path, privacy_level,
374
+ file_count, entity_count, last_ingested_at, created_at
375
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
376
+ `).run(id, project.name, project.rootPath, project.privacyLevel, project.fileCount, project.entityCount, project.lastIngestedAt ?? null, ts);
377
+ return { ...project, id, createdAt: ts };
378
+ }
379
+ async getProject(id) {
380
+ const row = this.db.prepare('SELECT * FROM projects WHERE id = ?').get(id);
381
+ return row ? rowToProject(row) : null;
382
+ }
383
+ async listProjects() {
384
+ const rows = this.db.prepare('SELECT * FROM projects ORDER BY created_at DESC').all();
385
+ return rows.map(rowToProject);
386
+ }
387
+ // --- Contradictions ---
388
+ async createContradiction(contradiction) {
389
+ const id = randomUUID();
390
+ this.db.prepare(`
391
+ INSERT INTO contradictions (
392
+ id, entity_id_a, entity_id_b, description, severity,
393
+ suggested_resolution, status, resolved_action, resolved_at, detected_at
394
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
395
+ `).run(id, contradiction.entityIds[0], contradiction.entityIds[1], contradiction.description, contradiction.severity, contradiction.suggestedResolution ?? null, contradiction.status, contradiction.resolvedAction ?? null, contradiction.resolvedAt ?? null, contradiction.detectedAt);
396
+ return { ...contradiction, id };
397
+ }
398
+ async findContradictions(query = {}) {
399
+ const conditions = [];
400
+ const params = [];
401
+ if (query.status) {
402
+ conditions.push('status = ?');
403
+ params.push(query.status);
404
+ }
405
+ if (query.entityId) {
406
+ conditions.push('(entity_id_a = ? OR entity_id_b = ?)');
407
+ params.push(query.entityId, query.entityId);
408
+ }
409
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
410
+ let sql = `SELECT * FROM contradictions ${where} ORDER BY detected_at DESC`;
411
+ if (query.limit) {
412
+ sql += ' LIMIT ?';
413
+ params.push(query.limit);
414
+ }
415
+ const rows = this.db.prepare(sql).all(...params);
416
+ return rows.map(rowToContradiction);
417
+ }
418
+ async updateContradiction(id, update) {
419
+ this.db.prepare(`
420
+ UPDATE contradictions SET status = ?, resolved_action = ?, resolved_at = ? WHERE id = ?
421
+ `).run(update.status, update.resolvedAction ?? null, update.resolvedAt ?? null, id);
422
+ }
423
+ // --- Search ---
424
+ async searchEntities(text, limit = 20) {
425
+ // Sanitize input: strip FTS5 operators to prevent injection via MATCH syntax
426
+ const sanitized = text.replace(/[^a-zA-Z0-9\s]/g, ' ').trim();
427
+ if (!sanitized)
428
+ return [];
429
+ const rows = this.db.prepare(`
430
+ SELECT e.* FROM entities e
431
+ JOIN entities_fts fts ON fts.rowid = e.rowid
432
+ WHERE fts.entities_fts MATCH ? AND e.deleted_at IS NULL
433
+ ORDER BY rank
434
+ LIMIT ?
435
+ `).all(sanitized, limit);
436
+ return rows.map(rowToEntity);
437
+ }
438
+ async semanticSearch(_embedding, _limit = 20) {
439
+ // Vector search is delegated to VectorStore.
440
+ // This method exists to satisfy the GraphStore interface.
441
+ // The QueryEngine will combine results from both stores.
442
+ return [];
443
+ }
444
+ // --- Stats ---
445
+ async getStats() {
446
+ const entityCount = this.db.prepare("SELECT COUNT(*) as count FROM entities WHERE deleted_at IS NULL AND status != 'deleted'").get().count;
447
+ const relationshipCount = this.db.prepare('SELECT COUNT(*) as count FROM relationships').get().count;
448
+ const fileCount = this.db.prepare('SELECT COUNT(*) as count FROM files').get().count;
449
+ const projectCount = this.db.prepare('SELECT COUNT(*) as count FROM projects').get().count;
450
+ const contradictionCount = this.db.prepare("SELECT COUNT(*) as count FROM contradictions WHERE status = 'active'").get().count;
451
+ let dbSizeBytes = 0;
452
+ try {
453
+ dbSizeBytes = statSync(this.dbPath).size;
454
+ }
455
+ catch {
456
+ // DB file may not exist yet
457
+ }
458
+ return {
459
+ entityCount,
460
+ relationshipCount,
461
+ fileCount,
462
+ projectCount,
463
+ contradictionCount,
464
+ dbSizeBytes,
465
+ vectorDbSizeBytes: 0, // Managed by VectorStore
466
+ };
467
+ }
468
+ // --- Report ---
469
+ getReportData() {
470
+ // File status breakdown
471
+ const fileRows = this.db.prepare('SELECT status, COUNT(*) as count FROM files GROUP BY status').all();
472
+ const fileStatus = { ingested: 0, failed: 0, skipped: 0, pending: 0 };
473
+ for (const row of fileRows) {
474
+ if (row.status in fileStatus) {
475
+ fileStatus[row.status] = row.count;
476
+ }
477
+ }
478
+ // Failed files with error messages
479
+ const failedFiles = this.db.prepare(`SELECT path, relative_path, parse_error FROM files
480
+ WHERE status = 'failed' AND parse_error IS NOT NULL
481
+ ORDER BY path LIMIT 50`).all()
482
+ .map((r) => ({ path: r.path, relativePath: r.relative_path, parseError: r.parse_error }));
483
+ // Entity breakdown by type (active only)
484
+ const entityRows = this.db.prepare(`SELECT type, COUNT(*) as count, AVG(confidence) as avg_confidence
485
+ FROM entities WHERE deleted_at IS NULL AND status = 'active'
486
+ GROUP BY type ORDER BY count DESC`).all();
487
+ const entityBreakdown = entityRows.map((r) => ({
488
+ type: r.type, count: r.count, avgConfidence: r.avg_confidence,
489
+ }));
490
+ // Superseded entity count (proxy for merges)
491
+ const supersededCount = this.db.prepare("SELECT COUNT(*) as count FROM entities WHERE status = 'superseded'").get().count;
492
+ // Relationship breakdown by type
493
+ const relRows = this.db.prepare('SELECT type, COUNT(*) as count FROM relationships GROUP BY type ORDER BY count DESC').all();
494
+ const relationshipBreakdown = relRows.map((r) => ({ type: r.type, count: r.count }));
495
+ // Contradictions breakdown by status and severity
496
+ const contrRows = this.db.prepare('SELECT status, severity, COUNT(*) as count FROM contradictions GROUP BY status, severity').all();
497
+ const contradictions = {
498
+ active: 0, resolved: 0, dismissed: 0,
499
+ highSeverity: 0, mediumSeverity: 0, lowSeverity: 0,
500
+ };
501
+ for (const r of contrRows) {
502
+ if (r.status === 'active')
503
+ contradictions.active += r.count;
504
+ if (r.status === 'resolved')
505
+ contradictions.resolved += r.count;
506
+ if (r.status === 'dismissed')
507
+ contradictions.dismissed += r.count;
508
+ if (r.severity === 'high' || r.severity === 'critical')
509
+ contradictions.highSeverity += r.count;
510
+ if (r.severity === 'medium')
511
+ contradictions.mediumSeverity += r.count;
512
+ if (r.severity === 'low')
513
+ contradictions.lowSeverity += r.count;
514
+ }
515
+ // Top active contradictions (high first, then medium, limit 10)
516
+ const topContrRows = this.db.prepare(`SELECT c.id, c.severity, c.description, ea.name as entity_a, eb.name as entity_b
517
+ FROM contradictions c
518
+ LEFT JOIN entities ea ON c.entity_id_a = ea.id
519
+ LEFT JOIN entities eb ON c.entity_id_b = eb.id
520
+ WHERE c.status = 'active'
521
+ ORDER BY CASE c.severity
522
+ WHEN 'critical' THEN 0 WHEN 'high' THEN 1 WHEN 'medium' THEN 2 ELSE 3
523
+ END, c.detected_at DESC
524
+ LIMIT 10`).all();
525
+ const topContradictions = topContrRows.map((r) => ({
526
+ id: r.id.slice(0, 8),
527
+ severity: r.severity,
528
+ description: r.description,
529
+ entityA: r.entity_a ?? 'unknown',
530
+ entityB: r.entity_b ?? 'unknown',
531
+ }));
532
+ // Token estimate from entity extracted_by JSON
533
+ const tokenRow = this.db.prepare(`SELECT
534
+ SUM(CAST(JSON_EXTRACT(extracted_by, '$.tokensUsed.input') AS INTEGER)) as total_input,
535
+ SUM(CAST(JSON_EXTRACT(extracted_by, '$.tokensUsed.output') AS INTEGER)) as total_output
536
+ FROM entities WHERE deleted_at IS NULL`).get();
537
+ return {
538
+ generatedAt: new Date().toISOString(),
539
+ fileStatus,
540
+ failedFiles,
541
+ entityBreakdown,
542
+ supersededCount,
543
+ relationshipBreakdown,
544
+ contradictions,
545
+ topContradictions,
546
+ tokenEstimate: {
547
+ totalInput: tokenRow.total_input ?? 0,
548
+ totalOutput: tokenRow.total_output ?? 0,
549
+ },
550
+ };
551
+ }
552
+ // --- Maintenance ---
553
+ async backup() {
554
+ const backupPath = `${this.dbPath}.backup-${Date.now()}`;
555
+ await this.db.backup(backupPath);
556
+ try {
557
+ chmodSync(backupPath, 0o600);
558
+ }
559
+ catch { /* Windows — ignore */ }
560
+ return backupPath;
561
+ }
562
+ async integrityCheck() {
563
+ const details = [];
564
+ // Check for orphaned relationships
565
+ const orphanedRels = this.db.prepare(`
566
+ SELECT COUNT(*) as count FROM relationships r
567
+ WHERE NOT EXISTS (SELECT 1 FROM entities WHERE id = r.source_entity_id)
568
+ OR NOT EXISTS (SELECT 1 FROM entities WHERE id = r.target_entity_id)
569
+ `).get().count;
570
+ if (orphanedRels > 0) {
571
+ details.push(`Found ${orphanedRels} orphaned relationships`);
572
+ }
573
+ // Check for files referencing missing projects
574
+ const missingProjects = this.db.prepare(`
575
+ SELECT COUNT(*) as count FROM files f
576
+ WHERE NOT EXISTS (SELECT 1 FROM projects WHERE id = f.project_id)
577
+ `).get().count;
578
+ if (missingProjects > 0) {
579
+ details.push(`Found ${missingProjects} files referencing missing projects`);
580
+ }
581
+ // SQLite integrity check
582
+ const integrityResult = this.db.pragma('integrity_check');
583
+ const sqliteOk = integrityResult.length === 1 && integrityResult[0].integrity_check === 'ok';
584
+ if (!sqliteOk) {
585
+ details.push('SQLite integrity check failed');
586
+ }
587
+ return {
588
+ ok: orphanedRels === 0 && missingProjects === 0 && sqliteOk,
589
+ orphanedRelationships: orphanedRels,
590
+ missingFiles: missingProjects,
591
+ details,
592
+ };
593
+ }
594
+ // --- Graph visualization data ---
595
+ getGraphData(options = {}) {
596
+ const limit = options.limit ?? 2000;
597
+ let entitySql = `SELECT id, name, type, confidence, source_file FROM entities WHERE status = 'active'`;
598
+ const params = [];
599
+ if (options.projectId) {
600
+ entitySql += ` AND project_id = ?`;
601
+ params.push(options.projectId);
602
+ }
603
+ entitySql += ` ORDER BY confidence DESC LIMIT ?`;
604
+ params.push(limit);
605
+ const entityRows = this.db.prepare(entitySql).all(...params);
606
+ const entityIds = new Set(entityRows.map(e => e.id));
607
+ const relRows = this.db.prepare(`SELECT id, type, source_entity_id, target_entity_id, confidence
608
+ FROM relationships
609
+ LIMIT ?`).all(limit * 2);
610
+ // Only include edges where both endpoints are in our node set
611
+ const edges = relRows
612
+ .filter(r => entityIds.has(r.source_entity_id) && entityIds.has(r.target_entity_id))
613
+ .map(r => ({
614
+ id: r.id,
615
+ source: r.source_entity_id,
616
+ target: r.target_entity_id,
617
+ type: r.type,
618
+ confidence: r.confidence,
619
+ }));
620
+ return {
621
+ nodes: entityRows.map(e => ({
622
+ id: e.id,
623
+ name: e.name,
624
+ type: e.type,
625
+ confidence: e.confidence,
626
+ sourceFile: e.source_file,
627
+ })),
628
+ edges,
629
+ };
630
+ }
631
+ }
632
+ //# sourceMappingURL=sqlite-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.js","sourceRoot":"","sources":["../src/sqlite-store.ts"],"names":[],"mappings":"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"}