shieldcortex 2.0.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 (377) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +282 -0
  3. package/dashboard/components.json +22 -0
  4. package/dashboard/eslint.config.mjs +42 -0
  5. package/dashboard/next.config.ts +7 -0
  6. package/dashboard/package-lock.json +8053 -0
  7. package/dashboard/package.json +44 -0
  8. package/dashboard/postcss.config.mjs +7 -0
  9. package/dashboard/public/file.svg +1 -0
  10. package/dashboard/public/globe.svg +1 -0
  11. package/dashboard/public/next.svg +1 -0
  12. package/dashboard/public/vercel.svg +1 -0
  13. package/dashboard/public/window.svg +1 -0
  14. package/dashboard/scripts/ensure-api.mjs +76 -0
  15. package/dashboard/src/app/error.tsx +49 -0
  16. package/dashboard/src/app/favicon.ico +0 -0
  17. package/dashboard/src/app/globals.css +130 -0
  18. package/dashboard/src/app/layout.tsx +35 -0
  19. package/dashboard/src/app/page.tsx +364 -0
  20. package/dashboard/src/components/Providers.tsx +27 -0
  21. package/dashboard/src/components/brain/ActivityPulseSystem.tsx +229 -0
  22. package/dashboard/src/components/brain/BrainMesh.tsx +133 -0
  23. package/dashboard/src/components/brain/BrainRegions.tsx +254 -0
  24. package/dashboard/src/components/brain/BrainScene.tsx +255 -0
  25. package/dashboard/src/components/brain/CategoryLabels.tsx +103 -0
  26. package/dashboard/src/components/brain/CoreSphere.tsx +215 -0
  27. package/dashboard/src/components/brain/DataFlowParticles.tsx +123 -0
  28. package/dashboard/src/components/brain/DataStreamRings.tsx +161 -0
  29. package/dashboard/src/components/brain/ElectronFlow.tsx +323 -0
  30. package/dashboard/src/components/brain/HolographicGrid.tsx +235 -0
  31. package/dashboard/src/components/brain/MemoryLinks.tsx +271 -0
  32. package/dashboard/src/components/brain/MemoryNode.tsx +245 -0
  33. package/dashboard/src/components/brain/NeuralPathways.tsx +441 -0
  34. package/dashboard/src/components/brain/SynapseNodes.tsx +312 -0
  35. package/dashboard/src/components/brain/TimelineControls.tsx +205 -0
  36. package/dashboard/src/components/chip/ChipScene.tsx +497 -0
  37. package/dashboard/src/components/chip/ChipSubstrate.tsx +238 -0
  38. package/dashboard/src/components/chip/CortexCore.tsx +210 -0
  39. package/dashboard/src/components/chip/DataBus.tsx +416 -0
  40. package/dashboard/src/components/chip/MemoryCell.tsx +225 -0
  41. package/dashboard/src/components/chip/MemoryGrid.tsx +328 -0
  42. package/dashboard/src/components/chip/QuantumCell.tsx +316 -0
  43. package/dashboard/src/components/chip/SectionLabel.tsx +113 -0
  44. package/dashboard/src/components/chip/index.ts +14 -0
  45. package/dashboard/src/components/controls/ControlPanel.tsx +106 -0
  46. package/dashboard/src/components/controls/VersionPanel.tsx +185 -0
  47. package/dashboard/src/components/dashboard/StatsPanel.tsx +164 -0
  48. package/dashboard/src/components/debug/ActivityLog.tsx +250 -0
  49. package/dashboard/src/components/debug/DebugPanel.tsx +101 -0
  50. package/dashboard/src/components/debug/QueryTester.tsx +192 -0
  51. package/dashboard/src/components/debug/RelationshipGraph.tsx +403 -0
  52. package/dashboard/src/components/debug/SqlConsole.tsx +319 -0
  53. package/dashboard/src/components/graph/KnowledgeGraph.tsx +230 -0
  54. package/dashboard/src/components/graph/OntologyGraph.tsx +631 -0
  55. package/dashboard/src/components/insights/ActivityHeatmap.tsx +131 -0
  56. package/dashboard/src/components/insights/InsightsView.tsx +46 -0
  57. package/dashboard/src/components/insights/KnowledgeMapPanel.tsx +80 -0
  58. package/dashboard/src/components/insights/QualityPanel.tsx +116 -0
  59. package/dashboard/src/components/memories/MemoriesView.tsx +150 -0
  60. package/dashboard/src/components/memories/MemoryCard.tsx +103 -0
  61. package/dashboard/src/components/memory/MemoryDetail.tsx +325 -0
  62. package/dashboard/src/components/nav/NavRail.tsx +54 -0
  63. package/dashboard/src/components/ui/button.tsx +62 -0
  64. package/dashboard/src/components/ui/card.tsx +92 -0
  65. package/dashboard/src/components/ui/input.tsx +21 -0
  66. package/dashboard/src/hooks/useDebouncedValue.ts +24 -0
  67. package/dashboard/src/hooks/useMemories.ts +458 -0
  68. package/dashboard/src/hooks/useSuggestions.ts +46 -0
  69. package/dashboard/src/lib/category-colors.ts +84 -0
  70. package/dashboard/src/lib/position-algorithm.ts +177 -0
  71. package/dashboard/src/lib/simplex-noise.ts +217 -0
  72. package/dashboard/src/lib/store.ts +88 -0
  73. package/dashboard/src/lib/utils.ts +6 -0
  74. package/dashboard/src/lib/websocket.ts +249 -0
  75. package/dashboard/src/types/memory.ts +73 -0
  76. package/dashboard/tsconfig.json +34 -0
  77. package/dist/__tests__/consolidation-merge.test.d.ts +9 -0
  78. package/dist/__tests__/consolidation-merge.test.d.ts.map +1 -0
  79. package/dist/__tests__/consolidation-merge.test.js +137 -0
  80. package/dist/__tests__/consolidation-merge.test.js.map +1 -0
  81. package/dist/__tests__/contradictions.test.d.ts +8 -0
  82. package/dist/__tests__/contradictions.test.d.ts.map +1 -0
  83. package/dist/__tests__/contradictions.test.js +78 -0
  84. package/dist/__tests__/contradictions.test.js.map +1 -0
  85. package/dist/__tests__/salience-evolution.test.d.ts +7 -0
  86. package/dist/__tests__/salience-evolution.test.d.ts.map +1 -0
  87. package/dist/__tests__/salience-evolution.test.js +151 -0
  88. package/dist/__tests__/salience-evolution.test.js.map +1 -0
  89. package/dist/__tests__/store.test.d.ts +7 -0
  90. package/dist/__tests__/store.test.d.ts.map +1 -0
  91. package/dist/__tests__/store.test.js +582 -0
  92. package/dist/__tests__/store.test.js.map +1 -0
  93. package/dist/api/control.d.ts +27 -0
  94. package/dist/api/control.d.ts.map +1 -0
  95. package/dist/api/control.js +60 -0
  96. package/dist/api/control.js.map +1 -0
  97. package/dist/api/events.d.ts +159 -0
  98. package/dist/api/events.d.ts.map +1 -0
  99. package/dist/api/events.js +155 -0
  100. package/dist/api/events.js.map +1 -0
  101. package/dist/api/version.d.ts +36 -0
  102. package/dist/api/version.d.ts.map +1 -0
  103. package/dist/api/version.js +146 -0
  104. package/dist/api/version.js.map +1 -0
  105. package/dist/api/visualization-server.d.ts +11 -0
  106. package/dist/api/visualization-server.d.ts.map +1 -0
  107. package/dist/api/visualization-server.js +1186 -0
  108. package/dist/api/visualization-server.js.map +1 -0
  109. package/dist/context/project-context.d.ts +57 -0
  110. package/dist/context/project-context.d.ts.map +1 -0
  111. package/dist/context/project-context.js +135 -0
  112. package/dist/context/project-context.js.map +1 -0
  113. package/dist/database/init.d.ts +49 -0
  114. package/dist/database/init.d.ts.map +1 -0
  115. package/dist/database/init.js +567 -0
  116. package/dist/database/init.js.map +1 -0
  117. package/dist/defence/__tests__/firewall.test.d.ts +8 -0
  118. package/dist/defence/__tests__/firewall.test.d.ts.map +1 -0
  119. package/dist/defence/__tests__/firewall.test.js +123 -0
  120. package/dist/defence/__tests__/firewall.test.js.map +1 -0
  121. package/dist/defence/__tests__/fragmentation.test.d.ts +7 -0
  122. package/dist/defence/__tests__/fragmentation.test.d.ts.map +1 -0
  123. package/dist/defence/__tests__/fragmentation.test.js +51 -0
  124. package/dist/defence/__tests__/fragmentation.test.js.map +1 -0
  125. package/dist/defence/__tests__/pipeline.test.d.ts +8 -0
  126. package/dist/defence/__tests__/pipeline.test.d.ts.map +1 -0
  127. package/dist/defence/__tests__/pipeline.test.js +61 -0
  128. package/dist/defence/__tests__/pipeline.test.js.map +1 -0
  129. package/dist/defence/__tests__/sensitivity.test.d.ts +7 -0
  130. package/dist/defence/__tests__/sensitivity.test.d.ts.map +1 -0
  131. package/dist/defence/__tests__/sensitivity.test.js +61 -0
  132. package/dist/defence/__tests__/sensitivity.test.js.map +1 -0
  133. package/dist/defence/__tests__/trust.test.d.ts +7 -0
  134. package/dist/defence/__tests__/trust.test.d.ts.map +1 -0
  135. package/dist/defence/__tests__/trust.test.js +49 -0
  136. package/dist/defence/__tests__/trust.test.js.map +1 -0
  137. package/dist/defence/audit/index.d.ts +4 -0
  138. package/dist/defence/audit/index.d.ts.map +1 -0
  139. package/dist/defence/audit/index.js +3 -0
  140. package/dist/defence/audit/index.js.map +1 -0
  141. package/dist/defence/audit/logger.d.ts +14 -0
  142. package/dist/defence/audit/logger.d.ts.map +1 -0
  143. package/dist/defence/audit/logger.js +54 -0
  144. package/dist/defence/audit/logger.js.map +1 -0
  145. package/dist/defence/audit/queries.d.ts +33 -0
  146. package/dist/defence/audit/queries.d.ts.map +1 -0
  147. package/dist/defence/audit/queries.js +103 -0
  148. package/dist/defence/audit/queries.js.map +1 -0
  149. package/dist/defence/firewall/anomaly-scorer.d.ts +8 -0
  150. package/dist/defence/firewall/anomaly-scorer.d.ts.map +1 -0
  151. package/dist/defence/firewall/anomaly-scorer.js +58 -0
  152. package/dist/defence/firewall/anomaly-scorer.js.map +1 -0
  153. package/dist/defence/firewall/encoding-detector.d.ts +13 -0
  154. package/dist/defence/firewall/encoding-detector.d.ts.map +1 -0
  155. package/dist/defence/firewall/encoding-detector.js +120 -0
  156. package/dist/defence/firewall/encoding-detector.js.map +1 -0
  157. package/dist/defence/firewall/index.d.ts +21 -0
  158. package/dist/defence/firewall/index.d.ts.map +1 -0
  159. package/dist/defence/firewall/index.js +133 -0
  160. package/dist/defence/firewall/index.js.map +1 -0
  161. package/dist/defence/firewall/instruction-detector.d.ts +12 -0
  162. package/dist/defence/firewall/instruction-detector.d.ts.map +1 -0
  163. package/dist/defence/firewall/instruction-detector.js +99 -0
  164. package/dist/defence/firewall/instruction-detector.js.map +1 -0
  165. package/dist/defence/firewall/privilege-detector.d.ts +13 -0
  166. package/dist/defence/firewall/privilege-detector.d.ts.map +1 -0
  167. package/dist/defence/firewall/privilege-detector.js +89 -0
  168. package/dist/defence/firewall/privilege-detector.js.map +1 -0
  169. package/dist/defence/fragmentation/assembly-detector.d.ts +18 -0
  170. package/dist/defence/fragmentation/assembly-detector.d.ts.map +1 -0
  171. package/dist/defence/fragmentation/assembly-detector.js +72 -0
  172. package/dist/defence/fragmentation/assembly-detector.js.map +1 -0
  173. package/dist/defence/fragmentation/entity-extractor.d.ts +19 -0
  174. package/dist/defence/fragmentation/entity-extractor.d.ts.map +1 -0
  175. package/dist/defence/fragmentation/entity-extractor.js +86 -0
  176. package/dist/defence/fragmentation/entity-extractor.js.map +1 -0
  177. package/dist/defence/fragmentation/index.d.ts +23 -0
  178. package/dist/defence/fragmentation/index.d.ts.map +1 -0
  179. package/dist/defence/fragmentation/index.js +49 -0
  180. package/dist/defence/fragmentation/index.js.map +1 -0
  181. package/dist/defence/fragmentation/temporal-analyzer.d.ts +28 -0
  182. package/dist/defence/fragmentation/temporal-analyzer.d.ts.map +1 -0
  183. package/dist/defence/fragmentation/temporal-analyzer.js +41 -0
  184. package/dist/defence/fragmentation/temporal-analyzer.js.map +1 -0
  185. package/dist/defence/index.d.ts +12 -0
  186. package/dist/defence/index.d.ts.map +1 -0
  187. package/dist/defence/index.js +18 -0
  188. package/dist/defence/index.js.map +1 -0
  189. package/dist/defence/pipeline.d.ts +9 -0
  190. package/dist/defence/pipeline.d.ts.map +1 -0
  191. package/dist/defence/pipeline.js +115 -0
  192. package/dist/defence/pipeline.js.map +1 -0
  193. package/dist/defence/scanner/index.d.ts +5 -0
  194. package/dist/defence/scanner/index.d.ts.map +1 -0
  195. package/dist/defence/scanner/index.js +5 -0
  196. package/dist/defence/scanner/index.js.map +1 -0
  197. package/dist/defence/scanner/scan-existing.d.ts +34 -0
  198. package/dist/defence/scanner/scan-existing.d.ts.map +1 -0
  199. package/dist/defence/scanner/scan-existing.js +136 -0
  200. package/dist/defence/scanner/scan-existing.js.map +1 -0
  201. package/dist/defence/sensitivity/classifier.d.ts +6 -0
  202. package/dist/defence/sensitivity/classifier.d.ts.map +1 -0
  203. package/dist/defence/sensitivity/classifier.js +50 -0
  204. package/dist/defence/sensitivity/classifier.js.map +1 -0
  205. package/dist/defence/sensitivity/index.d.ts +11 -0
  206. package/dist/defence/sensitivity/index.d.ts.map +1 -0
  207. package/dist/defence/sensitivity/index.js +13 -0
  208. package/dist/defence/sensitivity/index.js.map +1 -0
  209. package/dist/defence/sensitivity/patterns.d.ts +14 -0
  210. package/dist/defence/sensitivity/patterns.d.ts.map +1 -0
  211. package/dist/defence/sensitivity/patterns.js +67 -0
  212. package/dist/defence/sensitivity/patterns.js.map +1 -0
  213. package/dist/defence/sensitivity/redaction.d.ts +17 -0
  214. package/dist/defence/sensitivity/redaction.d.ts.map +1 -0
  215. package/dist/defence/sensitivity/redaction.js +47 -0
  216. package/dist/defence/sensitivity/redaction.js.map +1 -0
  217. package/dist/defence/trust/index.d.ts +3 -0
  218. package/dist/defence/trust/index.d.ts.map +1 -0
  219. package/dist/defence/trust/index.js +3 -0
  220. package/dist/defence/trust/index.js.map +1 -0
  221. package/dist/defence/trust/recall-filter.d.ts +10 -0
  222. package/dist/defence/trust/recall-filter.d.ts.map +1 -0
  223. package/dist/defence/trust/recall-filter.js +38 -0
  224. package/dist/defence/trust/recall-filter.js.map +1 -0
  225. package/dist/defence/trust/source-scorer.d.ts +6 -0
  226. package/dist/defence/trust/source-scorer.d.ts.map +1 -0
  227. package/dist/defence/trust/source-scorer.js +34 -0
  228. package/dist/defence/trust/source-scorer.js.map +1 -0
  229. package/dist/defence/types.d.ts +88 -0
  230. package/dist/defence/types.d.ts.map +1 -0
  231. package/dist/defence/types.js +15 -0
  232. package/dist/defence/types.js.map +1 -0
  233. package/dist/embeddings/generator.d.ts +20 -0
  234. package/dist/embeddings/generator.d.ts.map +1 -0
  235. package/dist/embeddings/generator.js +83 -0
  236. package/dist/embeddings/generator.js.map +1 -0
  237. package/dist/embeddings/index.d.ts +2 -0
  238. package/dist/embeddings/index.d.ts.map +1 -0
  239. package/dist/embeddings/index.js +2 -0
  240. package/dist/embeddings/index.js.map +1 -0
  241. package/dist/errors.d.ts +74 -0
  242. package/dist/errors.d.ts.map +1 -0
  243. package/dist/errors.js +131 -0
  244. package/dist/errors.js.map +1 -0
  245. package/dist/graph/backfill.d.ts +6 -0
  246. package/dist/graph/backfill.d.ts.map +1 -0
  247. package/dist/graph/backfill.js +33 -0
  248. package/dist/graph/backfill.js.map +1 -0
  249. package/dist/graph/extract.d.ts +21 -0
  250. package/dist/graph/extract.d.ts.map +1 -0
  251. package/dist/graph/extract.js +231 -0
  252. package/dist/graph/extract.js.map +1 -0
  253. package/dist/graph/resolve.d.ts +6 -0
  254. package/dist/graph/resolve.d.ts.map +1 -0
  255. package/dist/graph/resolve.js +126 -0
  256. package/dist/graph/resolve.js.map +1 -0
  257. package/dist/index.d.ts +31 -0
  258. package/dist/index.d.ts.map +1 -0
  259. package/dist/index.js +248 -0
  260. package/dist/index.js.map +1 -0
  261. package/dist/memory/activation.d.ts +69 -0
  262. package/dist/memory/activation.d.ts.map +1 -0
  263. package/dist/memory/activation.js +168 -0
  264. package/dist/memory/activation.js.map +1 -0
  265. package/dist/memory/consolidate.d.ts +98 -0
  266. package/dist/memory/consolidate.d.ts.map +1 -0
  267. package/dist/memory/consolidate.js +511 -0
  268. package/dist/memory/consolidate.js.map +1 -0
  269. package/dist/memory/contradiction.d.ts +69 -0
  270. package/dist/memory/contradiction.d.ts.map +1 -0
  271. package/dist/memory/contradiction.js +286 -0
  272. package/dist/memory/contradiction.js.map +1 -0
  273. package/dist/memory/decay.d.ts +62 -0
  274. package/dist/memory/decay.d.ts.map +1 -0
  275. package/dist/memory/decay.js +184 -0
  276. package/dist/memory/decay.js.map +1 -0
  277. package/dist/memory/salience.d.ts +36 -0
  278. package/dist/memory/salience.d.ts.map +1 -0
  279. package/dist/memory/salience.js +216 -0
  280. package/dist/memory/salience.js.map +1 -0
  281. package/dist/memory/similarity.d.ts +57 -0
  282. package/dist/memory/similarity.d.ts.map +1 -0
  283. package/dist/memory/similarity.js +114 -0
  284. package/dist/memory/similarity.js.map +1 -0
  285. package/dist/memory/store.d.ts +179 -0
  286. package/dist/memory/store.d.ts.map +1 -0
  287. package/dist/memory/store.js +1184 -0
  288. package/dist/memory/store.js.map +1 -0
  289. package/dist/memory/types.d.ts +97 -0
  290. package/dist/memory/types.d.ts.map +1 -0
  291. package/dist/memory/types.js +30 -0
  292. package/dist/memory/types.js.map +1 -0
  293. package/dist/server.d.ts +12 -0
  294. package/dist/server.d.ts.map +1 -0
  295. package/dist/server.js +568 -0
  296. package/dist/server.js.map +1 -0
  297. package/dist/service/install.d.ts +15 -0
  298. package/dist/service/install.d.ts.map +1 -0
  299. package/dist/service/install.js +178 -0
  300. package/dist/service/install.js.map +1 -0
  301. package/dist/service/templates.d.ts +13 -0
  302. package/dist/service/templates.d.ts.map +1 -0
  303. package/dist/service/templates.js +58 -0
  304. package/dist/service/templates.js.map +1 -0
  305. package/dist/setup/claude-md.d.ts +12 -0
  306. package/dist/setup/claude-md.d.ts.map +1 -0
  307. package/dist/setup/claude-md.js +68 -0
  308. package/dist/setup/claude-md.js.map +1 -0
  309. package/dist/setup/clawdbot.d.ts +15 -0
  310. package/dist/setup/clawdbot.d.ts.map +1 -0
  311. package/dist/setup/clawdbot.js +118 -0
  312. package/dist/setup/clawdbot.js.map +1 -0
  313. package/dist/setup/doctor.d.ts +5 -0
  314. package/dist/setup/doctor.d.ts.map +1 -0
  315. package/dist/setup/doctor.js +141 -0
  316. package/dist/setup/doctor.js.map +1 -0
  317. package/dist/setup/hooks.d.ts +6 -0
  318. package/dist/setup/hooks.d.ts.map +1 -0
  319. package/dist/setup/hooks.js +36 -0
  320. package/dist/setup/hooks.js.map +1 -0
  321. package/dist/setup/migrate.d.ts +16 -0
  322. package/dist/setup/migrate.d.ts.map +1 -0
  323. package/dist/setup/migrate.js +164 -0
  324. package/dist/setup/migrate.js.map +1 -0
  325. package/dist/setup/settings-hooks.d.ts +7 -0
  326. package/dist/setup/settings-hooks.d.ts.map +1 -0
  327. package/dist/setup/settings-hooks.js +83 -0
  328. package/dist/setup/settings-hooks.js.map +1 -0
  329. package/dist/setup/uninstall.d.ts +12 -0
  330. package/dist/setup/uninstall.d.ts.map +1 -0
  331. package/dist/setup/uninstall.js +125 -0
  332. package/dist/setup/uninstall.js.map +1 -0
  333. package/dist/tools/context.d.ts +135 -0
  334. package/dist/tools/context.d.ts.map +1 -0
  335. package/dist/tools/context.js +273 -0
  336. package/dist/tools/context.js.map +1 -0
  337. package/dist/tools/forget.d.ts +53 -0
  338. package/dist/tools/forget.d.ts.map +1 -0
  339. package/dist/tools/forget.js +179 -0
  340. package/dist/tools/forget.js.map +1 -0
  341. package/dist/tools/graph.d.ts +46 -0
  342. package/dist/tools/graph.d.ts.map +1 -0
  343. package/dist/tools/graph.js +206 -0
  344. package/dist/tools/graph.js.map +1 -0
  345. package/dist/tools/recall.d.ts +79 -0
  346. package/dist/tools/recall.d.ts.map +1 -0
  347. package/dist/tools/recall.js +156 -0
  348. package/dist/tools/recall.js.map +1 -0
  349. package/dist/tools/remember.d.ts +83 -0
  350. package/dist/tools/remember.d.ts.map +1 -0
  351. package/dist/tools/remember.js +151 -0
  352. package/dist/tools/remember.js.map +1 -0
  353. package/dist/worker/brain-worker.d.ts +100 -0
  354. package/dist/worker/brain-worker.d.ts.map +1 -0
  355. package/dist/worker/brain-worker.js +283 -0
  356. package/dist/worker/brain-worker.js.map +1 -0
  357. package/dist/worker/link-discovery.d.ts +47 -0
  358. package/dist/worker/link-discovery.d.ts.map +1 -0
  359. package/dist/worker/link-discovery.js +103 -0
  360. package/dist/worker/link-discovery.js.map +1 -0
  361. package/dist/worker/predictive-consolidation.d.ts +46 -0
  362. package/dist/worker/predictive-consolidation.d.ts.map +1 -0
  363. package/dist/worker/predictive-consolidation.js +110 -0
  364. package/dist/worker/predictive-consolidation.js.map +1 -0
  365. package/dist/worker/types.d.ts +91 -0
  366. package/dist/worker/types.d.ts.map +1 -0
  367. package/dist/worker/types.js +22 -0
  368. package/dist/worker/types.js.map +1 -0
  369. package/hooks/clawdbot/cortex-memory/HOOK.md +71 -0
  370. package/hooks/clawdbot/cortex-memory/handler.js +279 -0
  371. package/package.json +73 -0
  372. package/scripts/pre-compact-hook.mjs +716 -0
  373. package/scripts/session-end-hook.mjs +548 -0
  374. package/scripts/session-start-hook.mjs +221 -0
  375. package/scripts/start-dashboard.sh +41 -0
  376. package/scripts/stop-dashboard.sh +21 -0
  377. package/scripts/stop-hook.mjs +163 -0
@@ -0,0 +1,567 @@
1
+ /**
2
+ * Database initialization and connection management
3
+ */
4
+ import Database from 'better-sqlite3';
5
+ import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync, unlinkSync } from 'fs';
6
+ import { dirname, join } from 'path';
7
+ import { homedir } from 'os';
8
+ import { fileURLToPath } from 'url';
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = dirname(__filename);
11
+ let db = null;
12
+ let currentDbPath = null;
13
+ let lockFilePath = null;
14
+ // Anti-bloat: Database size limits
15
+ const MAX_DB_SIZE = 100 * 1024 * 1024; // 100MB hard limit
16
+ const WARN_DB_SIZE = 50 * 1024 * 1024; // 50MB warning threshold
17
+ /**
18
+ * Expand ~ to home directory
19
+ */
20
+ function expandPath(path) {
21
+ if (path.startsWith('~')) {
22
+ return join(homedir(), path.slice(1));
23
+ }
24
+ return path;
25
+ }
26
+ /**
27
+ * Get the database path with legacy fallback
28
+ * - New installs use ~/.shieldcortex/
29
+ * - Existing users with ~/.claude-memory/ continue to work
30
+ */
31
+ function getDefaultDbPath() {
32
+ const newPath = join(homedir(), '.shieldcortex', 'memories.db');
33
+ const legacyPath = join(homedir(), '.claude-memory', 'memories.db');
34
+ // Prefer new path if it exists, or if neither exists (new install)
35
+ if (existsSync(newPath) || !existsSync(legacyPath)) {
36
+ return newPath;
37
+ }
38
+ // Fall back to legacy path for existing users
39
+ return legacyPath;
40
+ }
41
+ /**
42
+ * Initialize the database connection
43
+ */
44
+ export function initDatabase(dbPath) {
45
+ // Use auto-detected path if not specified
46
+ const resolvedPath = dbPath || getDefaultDbPath();
47
+ if (db) {
48
+ return db;
49
+ }
50
+ const expandedPath = expandPath(resolvedPath);
51
+ const dir = dirname(expandedPath);
52
+ // Create directory if it doesn't exist
53
+ if (!existsSync(dir)) {
54
+ mkdirSync(dir, { recursive: true });
55
+ }
56
+ // Store path for size monitoring
57
+ currentDbPath = expandedPath;
58
+ // Create database connection
59
+ db = new Database(expandedPath);
60
+ // Enable WAL mode for better concurrency
61
+ db.pragma('journal_mode = WAL');
62
+ db.pragma('synchronous = NORMAL');
63
+ db.pragma('foreign_keys = ON');
64
+ // Race condition mitigation: wait up to 10 seconds for locks
65
+ db.pragma('busy_timeout = 10000');
66
+ // Auto-checkpoint every 100 pages (~400KB) to prevent WAL bloat
67
+ db.pragma('wal_autocheckpoint = 100');
68
+ // Create lock file to help detect concurrent instances
69
+ lockFilePath = expandedPath + '.lock';
70
+ const pid = process.pid;
71
+ try {
72
+ writeFileSync(lockFilePath, `${pid}\n${new Date().toISOString()}`);
73
+ }
74
+ catch {
75
+ // Non-fatal - lock file is advisory
76
+ }
77
+ // Register cleanup handlers for graceful shutdown
78
+ registerShutdownHandlers();
79
+ // Run migrations FIRST for existing databases
80
+ // This ensures columns exist before schema tries to create indexes on them
81
+ runMigrations(db);
82
+ // Run schema (uses IF NOT EXISTS, safe for existing tables and indexes)
83
+ const schemaPath = join(__dirname, 'schema.sql');
84
+ if (existsSync(schemaPath)) {
85
+ const schema = readFileSync(schemaPath, 'utf-8');
86
+ db.exec(schema);
87
+ }
88
+ else {
89
+ // Inline schema if file not found (for bundled deployment)
90
+ db.exec(getInlineSchema());
91
+ }
92
+ return db;
93
+ }
94
+ /**
95
+ * Run database migrations for existing databases
96
+ */
97
+ function runMigrations(database) {
98
+ // Check if memories table exists (skip migrations on fresh database)
99
+ const tableExists = database.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='memories'").get();
100
+ if (!tableExists) {
101
+ // Fresh database - schema will create everything
102
+ return;
103
+ }
104
+ // Check existing columns
105
+ const tableInfo = database.prepare("PRAGMA table_info(memories)").all();
106
+ const columnNames = new Set(tableInfo.map(col => col.name));
107
+ // Migration: decayed_score column
108
+ if (!columnNames.has('decayed_score')) {
109
+ database.exec('ALTER TABLE memories ADD COLUMN decayed_score REAL');
110
+ database.exec('CREATE INDEX IF NOT EXISTS idx_memories_decayed_score ON memories(decayed_score DESC)');
111
+ }
112
+ // Migration: embedding column for semantic search
113
+ if (!columnNames.has('embedding')) {
114
+ database.exec('ALTER TABLE memories ADD COLUMN embedding BLOB');
115
+ }
116
+ // Migration: scope column for cross-project knowledge
117
+ if (!columnNames.has('scope')) {
118
+ database.exec("ALTER TABLE memories ADD COLUMN scope TEXT DEFAULT 'project'");
119
+ }
120
+ // Migration: transferable column for cross-project sharing
121
+ if (!columnNames.has('transferable')) {
122
+ database.exec('ALTER TABLE memories ADD COLUMN transferable INTEGER DEFAULT 0');
123
+ }
124
+ // Migration: Defence columns on memories table
125
+ if (!columnNames.has('trust_score')) {
126
+ database.exec("ALTER TABLE memories ADD COLUMN trust_score REAL DEFAULT 1.0");
127
+ }
128
+ if (!columnNames.has('sensitivity_level')) {
129
+ database.exec("ALTER TABLE memories ADD COLUMN sensitivity_level TEXT DEFAULT 'INTERNAL'");
130
+ }
131
+ if (!columnNames.has('source')) {
132
+ database.exec("ALTER TABLE memories ADD COLUMN source TEXT DEFAULT 'user:direct'");
133
+ }
134
+ // Migration: Defence tables (defence_audit, quarantine, fragmentation_entities)
135
+ try {
136
+ database.exec(`
137
+ CREATE TABLE IF NOT EXISTS defence_audit (
138
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
139
+ memory_id INTEGER,
140
+ timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
141
+ source_type TEXT NOT NULL,
142
+ source_identifier TEXT NOT NULL,
143
+ trust_score REAL NOT NULL,
144
+ sensitivity_level TEXT NOT NULL DEFAULT 'INTERNAL',
145
+ firewall_result TEXT NOT NULL CHECK(firewall_result IN ('ALLOW', 'BLOCK', 'QUARANTINE')),
146
+ anomaly_score REAL DEFAULT 0.0,
147
+ threat_indicators TEXT DEFAULT '[]',
148
+ blocked_patterns TEXT DEFAULT '[]',
149
+ reason TEXT,
150
+ fragmentation_score REAL,
151
+ pipeline_duration_ms INTEGER,
152
+ FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE SET NULL
153
+ );
154
+ CREATE INDEX IF NOT EXISTS idx_audit_memory ON defence_audit(memory_id);
155
+ CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON defence_audit(timestamp DESC);
156
+ CREATE INDEX IF NOT EXISTS idx_audit_result ON defence_audit(firewall_result);
157
+ CREATE INDEX IF NOT EXISTS idx_audit_source ON defence_audit(source_type);
158
+
159
+ CREATE TABLE IF NOT EXISTS quarantine (
160
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
161
+ original_content TEXT NOT NULL,
162
+ original_title TEXT,
163
+ source_type TEXT NOT NULL,
164
+ source_identifier TEXT NOT NULL,
165
+ reason TEXT NOT NULL,
166
+ threat_indicators TEXT DEFAULT '[]',
167
+ anomaly_score REAL DEFAULT 0.0,
168
+ firewall_result TEXT NOT NULL CHECK(firewall_result IN ('BLOCK', 'QUARANTINE')),
169
+ status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'approved', 'rejected', 'expired')),
170
+ reviewed_at TIMESTAMP,
171
+ reviewed_by TEXT,
172
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
173
+ expires_at TIMESTAMP,
174
+ audit_id INTEGER,
175
+ FOREIGN KEY (audit_id) REFERENCES defence_audit(id) ON DELETE SET NULL
176
+ );
177
+ CREATE INDEX IF NOT EXISTS idx_quarantine_status ON quarantine(status);
178
+ CREATE INDEX IF NOT EXISTS idx_quarantine_created ON quarantine(created_at DESC);
179
+
180
+ CREATE TABLE IF NOT EXISTS fragmentation_entities (
181
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
182
+ memory_id INTEGER NOT NULL,
183
+ entity_value TEXT NOT NULL,
184
+ entity_type TEXT NOT NULL,
185
+ context_snippet TEXT,
186
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
187
+ FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
188
+ );
189
+ CREATE INDEX IF NOT EXISTS idx_frag_entities_memory ON fragmentation_entities(memory_id);
190
+ CREATE INDEX IF NOT EXISTS idx_frag_entities_text ON fragmentation_entities(entity_value);
191
+ CREATE INDEX IF NOT EXISTS idx_frag_entities_type ON fragmentation_entities(entity_type);
192
+ `);
193
+ }
194
+ catch {
195
+ // Tables may already exist - safe to ignore
196
+ }
197
+ // Migration: Ontology tables (entities, triples, memory_entities)
198
+ try {
199
+ database.exec(`
200
+ CREATE TABLE IF NOT EXISTS entities (
201
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
202
+ name TEXT NOT NULL,
203
+ type TEXT NOT NULL,
204
+ aliases TEXT DEFAULT '[]',
205
+ first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
206
+ memory_count INTEGER DEFAULT 0,
207
+ UNIQUE(name, type)
208
+ );
209
+ CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);
210
+ CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(type);
211
+
212
+ CREATE TABLE IF NOT EXISTS triples (
213
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
214
+ subject_id INTEGER NOT NULL,
215
+ predicate TEXT NOT NULL,
216
+ object_id INTEGER NOT NULL,
217
+ source_memory_id INTEGER,
218
+ confidence REAL DEFAULT 0.8,
219
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
220
+ FOREIGN KEY (subject_id) REFERENCES entities(id) ON DELETE CASCADE,
221
+ FOREIGN KEY (object_id) REFERENCES entities(id) ON DELETE CASCADE,
222
+ FOREIGN KEY (source_memory_id) REFERENCES memories(id) ON DELETE SET NULL,
223
+ UNIQUE(subject_id, predicate, object_id)
224
+ );
225
+ CREATE INDEX IF NOT EXISTS idx_triples_subject ON triples(subject_id);
226
+ CREATE INDEX IF NOT EXISTS idx_triples_object ON triples(object_id);
227
+ CREATE INDEX IF NOT EXISTS idx_triples_predicate ON triples(predicate);
228
+
229
+ CREATE TABLE IF NOT EXISTS memory_entities (
230
+ memory_id INTEGER NOT NULL,
231
+ entity_id INTEGER NOT NULL,
232
+ role TEXT DEFAULT 'mention',
233
+ FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE,
234
+ FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE,
235
+ PRIMARY KEY (memory_id, entity_id)
236
+ );
237
+ `);
238
+ }
239
+ catch {
240
+ // Tables may already exist - safe to ignore
241
+ }
242
+ }
243
+ /**
244
+ * Get the current database instance
245
+ */
246
+ export function getDatabase() {
247
+ if (!db) {
248
+ throw new Error('Database not initialized. Call initDatabase() first.');
249
+ }
250
+ return db;
251
+ }
252
+ /**
253
+ * Close the database connection with proper cleanup
254
+ */
255
+ export function closeDatabase() {
256
+ if (db) {
257
+ try {
258
+ // Checkpoint WAL before closing to flush all changes
259
+ db.pragma('wal_checkpoint(TRUNCATE)');
260
+ }
261
+ catch {
262
+ // Ignore checkpoint errors on close
263
+ }
264
+ db.close();
265
+ db = null;
266
+ currentDbPath = null;
267
+ // Remove lock file
268
+ if (lockFilePath && existsSync(lockFilePath)) {
269
+ try {
270
+ unlinkSync(lockFilePath);
271
+ }
272
+ catch {
273
+ // Non-fatal
274
+ }
275
+ lockFilePath = null;
276
+ }
277
+ }
278
+ }
279
+ /**
280
+ * Register handlers for graceful shutdown
281
+ */
282
+ let shutdownRegistered = false;
283
+ function registerShutdownHandlers() {
284
+ if (shutdownRegistered)
285
+ return;
286
+ shutdownRegistered = true;
287
+ const cleanup = () => {
288
+ closeDatabase();
289
+ };
290
+ // Handle various termination signals
291
+ process.on('exit', cleanup);
292
+ process.on('SIGINT', () => { cleanup(); process.exit(0); });
293
+ process.on('SIGTERM', () => { cleanup(); process.exit(0); });
294
+ process.on('uncaughtException', (err) => {
295
+ console.error('Uncaught exception:', err);
296
+ cleanup();
297
+ process.exit(1);
298
+ });
299
+ }
300
+ /**
301
+ * Manually checkpoint the WAL file (call periodically for long-running processes)
302
+ */
303
+ export function checkpointWal() {
304
+ const database = getDatabase();
305
+ const result = database.pragma('wal_checkpoint(PASSIVE)');
306
+ return {
307
+ walPages: result[0]?.log || 0,
308
+ checkpointed: result[0]?.checkpointed || 0,
309
+ };
310
+ }
311
+ export function checkDatabaseSize() {
312
+ if (!currentDbPath || !existsSync(currentDbPath)) {
313
+ return {
314
+ size: 0,
315
+ sizeFormatted: '0 KB',
316
+ warning: false,
317
+ blocked: false,
318
+ message: 'Database not initialized',
319
+ };
320
+ }
321
+ const stats = statSync(currentDbPath);
322
+ const size = stats.size;
323
+ const sizeKB = size / 1024;
324
+ const sizeMB = sizeKB / 1024;
325
+ let sizeFormatted;
326
+ if (sizeMB >= 1) {
327
+ sizeFormatted = `${sizeMB.toFixed(2)} MB`;
328
+ }
329
+ else {
330
+ sizeFormatted = `${sizeKB.toFixed(2)} KB`;
331
+ }
332
+ const warning = size > WARN_DB_SIZE;
333
+ const blocked = size > MAX_DB_SIZE;
334
+ let message = `Database size: ${sizeFormatted}`;
335
+ if (blocked) {
336
+ message = `DATABASE BLOCKED: ${sizeFormatted} exceeds 100MB limit. Run consolidation and vacuum.`;
337
+ }
338
+ else if (warning) {
339
+ message = `WARNING: ${sizeFormatted} approaching 100MB limit. Consider running consolidation.`;
340
+ }
341
+ return { size, sizeFormatted, warning, blocked, message };
342
+ }
343
+ /**
344
+ * Check if database operations should be blocked due to size
345
+ */
346
+ export function isDatabaseBlocked() {
347
+ return checkDatabaseSize().blocked;
348
+ }
349
+ /**
350
+ * Inline schema for bundled deployment
351
+ */
352
+ function getInlineSchema() {
353
+ return `
354
+ CREATE TABLE IF NOT EXISTS memories (
355
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
356
+ type TEXT NOT NULL CHECK(type IN ('short_term', 'long_term', 'episodic')),
357
+ category TEXT NOT NULL DEFAULT 'note',
358
+ title TEXT NOT NULL,
359
+ content TEXT NOT NULL,
360
+ project TEXT,
361
+ tags TEXT DEFAULT '[]',
362
+ salience REAL DEFAULT 0.5 CHECK(salience >= 0 AND salience <= 1),
363
+ decayed_score REAL,
364
+ access_count INTEGER DEFAULT 0,
365
+ last_accessed TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
366
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
367
+ metadata TEXT DEFAULT '{}',
368
+ embedding BLOB,
369
+ scope TEXT DEFAULT 'project',
370
+ transferable INTEGER DEFAULT 0,
371
+ trust_score REAL DEFAULT 1.0,
372
+ sensitivity_level TEXT DEFAULT 'INTERNAL',
373
+ source TEXT DEFAULT 'user:direct'
374
+ );
375
+
376
+ CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
377
+ title,
378
+ content,
379
+ tags,
380
+ content='memories',
381
+ content_rowid='id',
382
+ tokenize='porter unicode61'
383
+ );
384
+
385
+ CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
386
+ INSERT INTO memories_fts(rowid, title, content, tags)
387
+ VALUES (new.id, new.title, new.content, new.tags);
388
+ END;
389
+
390
+ CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
391
+ INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)
392
+ VALUES('delete', old.id, old.title, old.content, old.tags);
393
+ END;
394
+
395
+ CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
396
+ INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)
397
+ VALUES('delete', old.id, old.title, old.content, old.tags);
398
+ INSERT INTO memories_fts(rowid, title, content, tags)
399
+ VALUES (new.id, new.title, new.content, new.tags);
400
+ END;
401
+
402
+ CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);
403
+ CREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project);
404
+ CREATE INDEX IF NOT EXISTS idx_memories_category ON memories(category);
405
+ CREATE INDEX IF NOT EXISTS idx_memories_salience ON memories(salience DESC);
406
+ CREATE INDEX IF NOT EXISTS idx_memories_decayed_score ON memories(decayed_score DESC);
407
+ CREATE INDEX IF NOT EXISTS idx_memories_last_accessed ON memories(last_accessed DESC);
408
+
409
+ CREATE TABLE IF NOT EXISTS sessions (
410
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
411
+ project TEXT,
412
+ started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
413
+ ended_at TIMESTAMP,
414
+ summary TEXT,
415
+ memories_created INTEGER DEFAULT 0,
416
+ memories_accessed INTEGER DEFAULT 0
417
+ );
418
+
419
+ CREATE TABLE IF NOT EXISTS memory_links (
420
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
421
+ source_id INTEGER NOT NULL,
422
+ target_id INTEGER NOT NULL,
423
+ relationship TEXT NOT NULL,
424
+ strength REAL DEFAULT 0.5,
425
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
426
+ FOREIGN KEY (source_id) REFERENCES memories(id) ON DELETE CASCADE,
427
+ FOREIGN KEY (target_id) REFERENCES memories(id) ON DELETE CASCADE,
428
+ UNIQUE(source_id, target_id)
429
+ );
430
+
431
+ -- Events table for cross-process IPC (MCP → Dashboard)
432
+ CREATE TABLE IF NOT EXISTS events (
433
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
434
+ type TEXT NOT NULL,
435
+ data TEXT,
436
+ timestamp TEXT NOT NULL,
437
+ processed INTEGER DEFAULT 0
438
+ );
439
+
440
+ CREATE INDEX IF NOT EXISTS idx_events_processed ON events(processed, id);
441
+
442
+ CREATE TABLE IF NOT EXISTS entities (
443
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
444
+ name TEXT NOT NULL,
445
+ type TEXT NOT NULL,
446
+ aliases TEXT DEFAULT '[]',
447
+ first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
448
+ memory_count INTEGER DEFAULT 0,
449
+ UNIQUE(name, type)
450
+ );
451
+
452
+ CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);
453
+ CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(type);
454
+
455
+ CREATE TABLE IF NOT EXISTS triples (
456
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
457
+ subject_id INTEGER NOT NULL,
458
+ predicate TEXT NOT NULL,
459
+ object_id INTEGER NOT NULL,
460
+ source_memory_id INTEGER,
461
+ confidence REAL DEFAULT 0.8,
462
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
463
+ FOREIGN KEY (subject_id) REFERENCES entities(id) ON DELETE CASCADE,
464
+ FOREIGN KEY (object_id) REFERENCES entities(id) ON DELETE CASCADE,
465
+ FOREIGN KEY (source_memory_id) REFERENCES memories(id) ON DELETE SET NULL,
466
+ UNIQUE(subject_id, predicate, object_id)
467
+ );
468
+
469
+ CREATE INDEX IF NOT EXISTS idx_triples_subject ON triples(subject_id);
470
+ CREATE INDEX IF NOT EXISTS idx_triples_object ON triples(object_id);
471
+ CREATE INDEX IF NOT EXISTS idx_triples_predicate ON triples(predicate);
472
+
473
+ CREATE TABLE IF NOT EXISTS memory_entities (
474
+ memory_id INTEGER NOT NULL,
475
+ entity_id INTEGER NOT NULL,
476
+ role TEXT DEFAULT 'mention',
477
+ FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE,
478
+ FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE,
479
+ PRIMARY KEY (memory_id, entity_id)
480
+ );
481
+
482
+ CREATE TABLE IF NOT EXISTS defence_audit (
483
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
484
+ memory_id INTEGER,
485
+ timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
486
+ source_type TEXT NOT NULL,
487
+ source_identifier TEXT NOT NULL,
488
+ trust_score REAL NOT NULL,
489
+ sensitivity_level TEXT NOT NULL DEFAULT 'INTERNAL',
490
+ firewall_result TEXT NOT NULL CHECK(firewall_result IN ('ALLOW', 'BLOCK', 'QUARANTINE')),
491
+ anomaly_score REAL DEFAULT 0.0,
492
+ threat_indicators TEXT DEFAULT '[]',
493
+ blocked_patterns TEXT DEFAULT '[]',
494
+ reason TEXT,
495
+ fragmentation_score REAL,
496
+ pipeline_duration_ms INTEGER,
497
+ FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE SET NULL
498
+ );
499
+
500
+ CREATE INDEX IF NOT EXISTS idx_audit_memory ON defence_audit(memory_id);
501
+ CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON defence_audit(timestamp DESC);
502
+ CREATE INDEX IF NOT EXISTS idx_audit_result ON defence_audit(firewall_result);
503
+ CREATE INDEX IF NOT EXISTS idx_audit_source ON defence_audit(source_type);
504
+
505
+ CREATE TABLE IF NOT EXISTS quarantine (
506
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
507
+ original_content TEXT NOT NULL,
508
+ original_title TEXT,
509
+ source_type TEXT NOT NULL,
510
+ source_identifier TEXT NOT NULL,
511
+ reason TEXT NOT NULL,
512
+ threat_indicators TEXT DEFAULT '[]',
513
+ anomaly_score REAL DEFAULT 0.0,
514
+ firewall_result TEXT NOT NULL CHECK(firewall_result IN ('BLOCK', 'QUARANTINE')),
515
+ status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'approved', 'rejected', 'expired')),
516
+ reviewed_at TIMESTAMP,
517
+ reviewed_by TEXT,
518
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
519
+ expires_at TIMESTAMP,
520
+ audit_id INTEGER,
521
+ FOREIGN KEY (audit_id) REFERENCES defence_audit(id) ON DELETE SET NULL
522
+ );
523
+
524
+ CREATE INDEX IF NOT EXISTS idx_quarantine_status ON quarantine(status);
525
+ CREATE INDEX IF NOT EXISTS idx_quarantine_created ON quarantine(created_at DESC);
526
+
527
+ CREATE TABLE IF NOT EXISTS fragmentation_entities (
528
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
529
+ memory_id INTEGER NOT NULL,
530
+ entity_value TEXT NOT NULL,
531
+ entity_type TEXT NOT NULL,
532
+ context_snippet TEXT,
533
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
534
+ FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
535
+ );
536
+
537
+ CREATE INDEX IF NOT EXISTS idx_frag_entities_memory ON fragmentation_entities(memory_id);
538
+ CREATE INDEX IF NOT EXISTS idx_frag_entities_text ON fragmentation_entities(entity_value);
539
+ CREATE INDEX IF NOT EXISTS idx_frag_entities_type ON fragmentation_entities(entity_type);
540
+ `;
541
+ }
542
+ /**
543
+ * Execute a function within a transaction (auto-commits on success, rollback on error)
544
+ * Use this for batch operations that need atomicity
545
+ */
546
+ export function withTransaction(fn) {
547
+ const database = getDatabase();
548
+ return database.transaction(fn)();
549
+ }
550
+ /**
551
+ * Execute a function within an IMMEDIATE transaction (acquires write lock immediately)
552
+ * Use this for critical operations that must not conflict with concurrent writes
553
+ */
554
+ export function withImmediateTransaction(fn) {
555
+ const database = getDatabase();
556
+ database.exec('BEGIN IMMEDIATE');
557
+ try {
558
+ const result = fn();
559
+ database.exec('COMMIT');
560
+ return result;
561
+ }
562
+ catch (e) {
563
+ database.exec('ROLLBACK');
564
+ throw e;
565
+ }
566
+ }
567
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/database/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,IAAI,EAAE,GAA6B,IAAI,CAAC;AACxC,IAAI,aAAa,GAAkB,IAAI,CAAC;AACxC,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,mCAAmC;AACnC,MAAM,WAAW,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,mBAAmB;AAC1D,MAAM,YAAY,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,yBAAyB;AAEhE;;GAEG;AACH,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB;IACvB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;IAEpE,mEAAmE;IACnE,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACnD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,8CAA8C;IAC9C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAe;IAC1C,0CAA0C;IAC1C,MAAM,YAAY,GAAG,MAAM,IAAI,gBAAgB,EAAE,CAAC;IAClD,IAAI,EAAE,EAAE,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAElC,uCAAuC;IACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,iCAAiC;IACjC,aAAa,GAAG,YAAY,CAAC;IAE7B,6BAA6B;IAC7B,EAAE,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEhC,yCAAyC;IACzC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAClC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,6DAA6D;IAC7D,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAClC,gEAAgE;IAChE,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;IAEtC,uDAAuD;IACvD,YAAY,GAAG,YAAY,GAAG,OAAO,CAAC;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,IAAI,CAAC;QACH,aAAa,CAAC,YAAY,EAAE,GAAG,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;IAED,kDAAkD;IAClD,wBAAwB,EAAE,CAAC;IAE3B,8CAA8C;IAC9C,2EAA2E;IAC3E,aAAa,CAAC,EAAE,CAAC,CAAC;IAElB,wEAAwE;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,2DAA2D;QAC3D,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,QAA2B;IAChD,qEAAqE;IACrE,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAClC,uEAAuE,CACxE,CAAC,GAAG,EAAE,CAAC;IAER,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,iDAAiD;QACjD,OAAO;IACT,CAAC;IAED,yBAAyB;IACzB,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAAwB,CAAC;IAC9F,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5D,kCAAkC;IAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QACpE,QAAQ,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;IACzG,CAAC;IAED,kDAAkD;IAClD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAClE,CAAC;IAED,sDAAsD;IACtD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAChF,CAAC;IAED,2DAA2D;IAC3D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,QAAQ,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAClF,CAAC;IAED,+CAA+C;IAC/C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IACrF,CAAC;IAED,gFAAgF;IAChF,IAAI,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAwDb,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;IAED,kEAAkE;IAClE,IAAI,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsCb,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,EAAE,EAAE,CAAC;QACP,IAAI,CAAC;YACH,qDAAqD;YACrD,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;QACD,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,GAAG,IAAI,CAAC;QACV,aAAa,GAAG,IAAI,CAAC;QAErB,mBAAmB;QACnB,IAAI,YAAY,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,UAAU,CAAC,YAAY,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;YACD,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAC/B,SAAS,wBAAwB;IAC/B,IAAI,kBAAkB;QAAE,OAAO;IAC/B,kBAAkB,GAAG,IAAI,CAAC;IAE1B,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,aAAa,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,qCAAqC;IACrC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;QACtC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAC1C,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,yBAAyB,CAA0D,CAAC;IACnH,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,IAAI,CAAC;KAC3C,CAAC;AACJ,CAAC;AAaD,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjD,OAAO;YACL,IAAI,EAAE,CAAC;YACP,aAAa,EAAE,MAAM;YACrB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,0BAA0B;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAE7B,IAAI,aAAqB,CAAC;IAC1B,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,aAAa,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,YAAY,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,GAAG,WAAW,CAAC;IAEnC,IAAI,OAAO,GAAG,kBAAkB,aAAa,EAAE,CAAC;IAChD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,GAAG,qBAAqB,aAAa,qDAAqD,CAAC;IACpG,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACnB,OAAO,GAAG,YAAY,aAAa,2DAA2D,CAAC;IACjG,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,iBAAiB,EAAE,CAAC,OAAO,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,SAAS,eAAe;IACtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2LN,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAI,EAAW;IAC5C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,OAAO,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAI,EAAW;IACrD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1B,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Memory Firewall Tests
3
+ *
4
+ * Tests for instruction detection, privilege escalation, encoding obfuscation,
5
+ * and anomaly scoring.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=firewall.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firewall.test.d.ts","sourceRoot":"","sources":["../../../src/defence/__tests__/firewall.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}