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,250 @@
1
+ 'use client';
2
+
3
+ /**
4
+ * Activity Log Component
5
+ *
6
+ * Real-time event stream showing memory operations.
7
+ * Uses WebSocket for live updates.
8
+ */
9
+
10
+ import { useState, useEffect, useRef } from 'react';
11
+ import { useMemoryWebSocket, MemoryEventType } from '@/lib/websocket';
12
+
13
+ interface LogEntry {
14
+ id: number;
15
+ timestamp: Date;
16
+ type: MemoryEventType;
17
+ message: string;
18
+ details?: Record<string, unknown>;
19
+ }
20
+
21
+ const EVENT_COLORS: Record<MemoryEventType, string> = {
22
+ memory_created: 'text-green-400',
23
+ memory_accessed: 'text-blue-400',
24
+ memory_updated: 'text-yellow-400',
25
+ memory_deleted: 'text-red-400',
26
+ consolidation_complete: 'text-purple-400',
27
+ decay_tick: 'text-slate-500',
28
+ initial_state: 'text-slate-400',
29
+ worker_light_tick: 'text-slate-500',
30
+ worker_medium_tick: 'text-slate-500',
31
+ link_discovered: 'text-cyan-400',
32
+ predictive_consolidation: 'text-purple-400',
33
+ update_started: 'text-blue-400',
34
+ update_complete: 'text-green-400',
35
+ update_failed: 'text-red-400',
36
+ server_restarting: 'text-orange-400',
37
+ };
38
+
39
+ const EVENT_ICONS: Record<MemoryEventType, string> = {
40
+ memory_created: '+',
41
+ memory_accessed: '👁',
42
+ memory_updated: '✏',
43
+ memory_deleted: '✕',
44
+ consolidation_complete: '🔄',
45
+ decay_tick: '⏱',
46
+ initial_state: '📋',
47
+ worker_light_tick: '⚡',
48
+ worker_medium_tick: '🔋',
49
+ link_discovered: '🔗',
50
+ predictive_consolidation: '🔮',
51
+ update_started: '⬆',
52
+ update_complete: '✓',
53
+ update_failed: '✗',
54
+ server_restarting: '🔄',
55
+ };
56
+
57
+ export function ActivityLog() {
58
+ const [logs, setLogs] = useState<LogEntry[]>([]);
59
+ const [autoScroll, setAutoScroll] = useState(true);
60
+ const [filters, setFilters] = useState<Record<MemoryEventType, boolean>>({
61
+ memory_created: true,
62
+ memory_accessed: true,
63
+ memory_updated: true,
64
+ memory_deleted: true,
65
+ consolidation_complete: true,
66
+ decay_tick: false, // Off by default (noisy)
67
+ initial_state: false,
68
+ worker_light_tick: false,
69
+ worker_medium_tick: false,
70
+ link_discovered: true,
71
+ predictive_consolidation: true,
72
+ update_started: true,
73
+ update_complete: true,
74
+ update_failed: true,
75
+ server_restarting: true,
76
+ });
77
+
78
+ const logContainerRef = useRef<HTMLDivElement>(null);
79
+ const nextIdRef = useRef(1);
80
+
81
+ // Connect to WebSocket
82
+ const { lastEvent, isConnected } = useMemoryWebSocket();
83
+
84
+ // Process incoming events
85
+ useEffect(() => {
86
+ if (!lastEvent) return;
87
+
88
+ const entry: LogEntry = {
89
+ id: nextIdRef.current++,
90
+ timestamp: new Date(lastEvent.timestamp),
91
+ type: lastEvent.type,
92
+ message: formatEventMessage(lastEvent),
93
+ details: lastEvent.data as Record<string, unknown>,
94
+ };
95
+
96
+ setLogs((prev) => {
97
+ const updated = [...prev, entry];
98
+ // Keep only last 500 entries
99
+ return updated.slice(-500);
100
+ });
101
+ }, [lastEvent]);
102
+
103
+ // Auto-scroll to bottom
104
+ useEffect(() => {
105
+ if (autoScroll && logContainerRef.current) {
106
+ logContainerRef.current.scrollTop = logContainerRef.current.scrollHeight;
107
+ }
108
+ }, [logs, autoScroll]);
109
+
110
+ const filteredLogs = logs.filter((log) => filters[log.type]);
111
+
112
+ const toggleFilter = (type: MemoryEventType) => {
113
+ setFilters((prev) => ({ ...prev, [type]: !prev[type] }));
114
+ };
115
+
116
+ const clearLogs = () => {
117
+ setLogs([]);
118
+ };
119
+
120
+ const exportLogs = () => {
121
+ const json = JSON.stringify(filteredLogs, null, 2);
122
+ const blob = new Blob([json], { type: 'application/json' });
123
+ const url = URL.createObjectURL(blob);
124
+ const a = document.createElement('a');
125
+ a.href = url;
126
+ a.download = `cortex-activity-${new Date().toISOString().split('T')[0]}.json`;
127
+ a.click();
128
+ URL.revokeObjectURL(url);
129
+ };
130
+
131
+ return (
132
+ <div className="h-full flex flex-col">
133
+ {/* Controls */}
134
+ <div className="p-3 border-b border-slate-700 flex items-center gap-3 flex-wrap">
135
+ {/* Connection Status */}
136
+ <div className="flex items-center gap-2 text-xs">
137
+ <span
138
+ className={`w-2 h-2 rounded-full ${isConnected ? 'bg-green-500' : 'bg-red-500'}`}
139
+ />
140
+ <span className="text-slate-400">
141
+ {isConnected ? 'Connected' : 'Disconnected'}
142
+ </span>
143
+ </div>
144
+
145
+ <div className="w-px h-4 bg-slate-700" />
146
+
147
+ {/* Filters */}
148
+ <div className="flex items-center gap-1 flex-wrap">
149
+ {(Object.keys(filters) as MemoryEventType[]).map((type) => (
150
+ <button
151
+ key={type}
152
+ onClick={() => toggleFilter(type)}
153
+ className={`px-2 py-0.5 text-xs rounded transition-colors ${
154
+ filters[type]
155
+ ? `${EVENT_COLORS[type]} bg-slate-700`
156
+ : 'text-slate-600 bg-slate-800'
157
+ }`}
158
+ >
159
+ {type.replace(/_/g, ' ').replace('memory ', '')}
160
+ </button>
161
+ ))}
162
+ </div>
163
+
164
+ <div className="flex-1" />
165
+
166
+ {/* Actions */}
167
+ <label className="flex items-center gap-1 text-xs text-slate-400 cursor-pointer">
168
+ <input
169
+ type="checkbox"
170
+ checked={autoScroll}
171
+ onChange={(e) => setAutoScroll(e.target.checked)}
172
+ className="rounded border-slate-600 bg-slate-800"
173
+ />
174
+ Auto-scroll
175
+ </label>
176
+
177
+ <button
178
+ onClick={exportLogs}
179
+ className="text-xs text-slate-400 hover:text-white"
180
+ >
181
+ Export
182
+ </button>
183
+
184
+ <button
185
+ onClick={clearLogs}
186
+ className="text-xs text-red-400 hover:text-red-300"
187
+ >
188
+ Clear
189
+ </button>
190
+ </div>
191
+
192
+ {/* Log Entries */}
193
+ <div
194
+ ref={logContainerRef}
195
+ className="flex-1 overflow-auto p-3 font-mono text-xs"
196
+ >
197
+ {filteredLogs.length === 0 ? (
198
+ <div className="text-slate-500 text-center py-8">
199
+ {isConnected ? 'Waiting for events...' : 'Not connected to server'}
200
+ </div>
201
+ ) : (
202
+ <div className="space-y-1">
203
+ {filteredLogs.map((log) => (
204
+ <div key={log.id} className="flex gap-2 hover:bg-slate-800/50 px-1 rounded">
205
+ <span className="text-slate-500 shrink-0">
206
+ {log.timestamp.toLocaleTimeString()}
207
+ </span>
208
+ <span className={`shrink-0 w-4 ${EVENT_COLORS[log.type]}`}>
209
+ {EVENT_ICONS[log.type]}
210
+ </span>
211
+ <span className={EVENT_COLORS[log.type]}>{log.message}</span>
212
+ </div>
213
+ ))}
214
+ </div>
215
+ )}
216
+ </div>
217
+ </div>
218
+ );
219
+ }
220
+
221
+ function formatEventMessage(event: { type: MemoryEventType; data?: unknown }): string {
222
+ const data = event.data as Record<string, unknown> | undefined;
223
+
224
+ switch (event.type) {
225
+ case 'memory_created':
226
+ return `Created: "${data?.title || 'Unknown'}" (${data?.type || 'unknown'})`;
227
+ case 'memory_accessed':
228
+ return `Accessed: "${data?.title || 'Unknown'}" → salience ${((data?.newSalience as number) * 100).toFixed(0)}%`;
229
+ case 'memory_updated':
230
+ return `Updated: "${data?.title || 'Unknown'}"`;
231
+ case 'memory_deleted':
232
+ return `Deleted: "${data?.title || 'Unknown'}" (ID: ${data?.memoryId})`;
233
+ case 'consolidation_complete':
234
+ return `Consolidation: ${data?.consolidated || 0} promoted, ${data?.decayed || 0} decayed, ${data?.deleted || 0} deleted`;
235
+ case 'decay_tick':
236
+ return `Decay tick: ${(data?.updates as unknown[])?.length || 0} memories updated`;
237
+ case 'initial_state':
238
+ return 'Connected - received initial state';
239
+ case 'worker_light_tick':
240
+ return 'Worker light tick completed';
241
+ case 'worker_medium_tick':
242
+ return 'Worker medium tick completed';
243
+ case 'link_discovered':
244
+ return `Link discovered: ${data?.sourceTitle || '?'} → ${data?.targetTitle || '?'}`;
245
+ case 'predictive_consolidation':
246
+ return `Predictive consolidation: ${data?.promoted || 0} promoted`;
247
+ default:
248
+ return `Event: ${event.type}`;
249
+ }
250
+ }
@@ -0,0 +1,101 @@
1
+ 'use client';
2
+
3
+ /**
4
+ * Debug Panel Component
5
+ *
6
+ * Collapsible bottom panel with tabbed interface for debug tools:
7
+ * - Memory Detail (enhanced)
8
+ * - Query Tester
9
+ * - Activity Log
10
+ * - Relationship Graph
11
+ * - SQL Console
12
+ */
13
+
14
+ import { useState } from 'react';
15
+ import { QueryTester } from './QueryTester';
16
+ import { ActivityLog } from './ActivityLog';
17
+ import { RelationshipGraph } from './RelationshipGraph';
18
+ import { SqlConsole } from './SqlConsole';
19
+
20
+ type TabId = 'detail' | 'query' | 'activity' | 'graph' | 'sql';
21
+
22
+ interface Tab {
23
+ id: TabId;
24
+ label: string;
25
+ icon: string;
26
+ }
27
+
28
+ const TABS: Tab[] = [
29
+ { id: 'query', label: 'Query', icon: '🔍' },
30
+ { id: 'activity', label: 'Activity', icon: '📋' },
31
+ { id: 'graph', label: 'Graph', icon: '🕸' },
32
+ { id: 'sql', label: 'SQL', icon: '💾' },
33
+ ];
34
+
35
+ interface DebugPanelProps {
36
+ onCollapse?: () => void;
37
+ }
38
+
39
+ export function DebugPanel({ onCollapse }: DebugPanelProps) {
40
+ const [activeTab, setActiveTab] = useState<TabId>('query');
41
+ const [isCollapsed, setIsCollapsed] = useState(false);
42
+
43
+ const handleCollapse = () => {
44
+ setIsCollapsed(!isCollapsed);
45
+ onCollapse?.();
46
+ };
47
+
48
+ if (isCollapsed) {
49
+ return (
50
+ <div className="h-10 border-t border-slate-700 bg-slate-900/80 flex items-center px-4">
51
+ <button
52
+ onClick={handleCollapse}
53
+ className="flex items-center gap-2 text-sm text-slate-400 hover:text-white"
54
+ >
55
+ <span>▲</span>
56
+ <span>Debug Panel</span>
57
+ </button>
58
+ </div>
59
+ );
60
+ }
61
+
62
+ return (
63
+ <div className="h-96 border-t border-slate-700 bg-slate-900/80 flex flex-col">
64
+ {/* Tab Bar */}
65
+ <div className="flex items-center border-b border-slate-700 px-2">
66
+ {TABS.map((tab) => (
67
+ <button
68
+ key={tab.id}
69
+ onClick={() => setActiveTab(tab.id)}
70
+ className={`px-4 py-2 text-sm flex items-center gap-1.5 border-b-2 transition-colors ${
71
+ activeTab === tab.id
72
+ ? 'text-white border-blue-500'
73
+ : 'text-slate-400 border-transparent hover:text-white hover:border-slate-600'
74
+ }`}
75
+ >
76
+ <span>{tab.icon}</span>
77
+ <span>{tab.label}</span>
78
+ </button>
79
+ ))}
80
+
81
+ <div className="flex-1" />
82
+
83
+ <button
84
+ onClick={handleCollapse}
85
+ className="p-2 text-slate-400 hover:text-white"
86
+ title="Collapse panel"
87
+ >
88
+
89
+ </button>
90
+ </div>
91
+
92
+ {/* Tab Content */}
93
+ <div className="flex-1 overflow-hidden min-h-0">
94
+ {activeTab === 'query' && <QueryTester />}
95
+ {activeTab === 'activity' && <ActivityLog />}
96
+ {activeTab === 'graph' && <RelationshipGraph />}
97
+ {activeTab === 'sql' && <SqlConsole />}
98
+ </div>
99
+ </div>
100
+ );
101
+ }
@@ -0,0 +1,192 @@
1
+ 'use client';
2
+
3
+ /**
4
+ * Query Tester Component
5
+ *
6
+ * Allows testing search queries against the memory system
7
+ * with detailed score breakdowns and explanations.
8
+ */
9
+
10
+ import { useState } from 'react';
11
+ import { Button } from '@/components/ui/button';
12
+ import { Input } from '@/components/ui/input';
13
+ import { Memory } from '@/types/memory';
14
+
15
+ const API_BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001';
16
+
17
+ interface SearchResult {
18
+ memory: Memory & { decayedScore: number };
19
+ relevanceScore: number;
20
+ }
21
+
22
+ type SearchMode = 'hybrid' | 'fts' | 'vector';
23
+
24
+ export function QueryTester() {
25
+ const [query, setQuery] = useState('');
26
+ const [mode, setMode] = useState<SearchMode>('hybrid');
27
+ const [results, setResults] = useState<SearchResult[]>([]);
28
+ const [isSearching, setIsSearching] = useState(false);
29
+ const [error, setError] = useState<string | null>(null);
30
+
31
+ const handleSearch = async () => {
32
+ if (!query.trim()) return;
33
+
34
+ setIsSearching(true);
35
+ setError(null);
36
+
37
+ try {
38
+ const params = new URLSearchParams({
39
+ query: query.trim(),
40
+ mode: 'search',
41
+ limit: '20',
42
+ });
43
+
44
+ const response = await fetch(`${API_BASE}/api/memories?${params}`);
45
+ if (!response.ok) {
46
+ throw new Error(`Search failed: ${response.statusText}`);
47
+ }
48
+
49
+ const data = await response.json();
50
+ // Transform API response to include relevance score
51
+ const resultsWithScore: SearchResult[] = data.memories.map((m: Memory & { decayedScore: number }) => ({
52
+ memory: m,
53
+ relevanceScore: m.decayedScore, // Using decayedScore as proxy for relevance
54
+ }));
55
+
56
+ setResults(resultsWithScore);
57
+ } catch (err) {
58
+ setError((err as Error).message);
59
+ setResults([]);
60
+ } finally {
61
+ setIsSearching(false);
62
+ }
63
+ };
64
+
65
+ const handleKeyDown = (e: React.KeyboardEvent) => {
66
+ if (e.key === 'Enter') {
67
+ handleSearch();
68
+ }
69
+ };
70
+
71
+ return (
72
+ <div className="h-full flex flex-col">
73
+ {/* Search Controls */}
74
+ <div className="p-3 border-b border-slate-700 flex gap-2 items-center">
75
+ <Input
76
+ type="text"
77
+ placeholder="Enter search query..."
78
+ value={query}
79
+ onChange={(e) => setQuery(e.target.value)}
80
+ onKeyDown={handleKeyDown}
81
+ className="flex-1 bg-slate-800 border-slate-600 text-white"
82
+ />
83
+
84
+ {/* Mode Toggle */}
85
+ <div className="flex gap-1 bg-slate-800 rounded-lg p-1">
86
+ {(['hybrid', 'fts', 'vector'] as SearchMode[]).map((m) => (
87
+ <button
88
+ key={m}
89
+ onClick={() => setMode(m)}
90
+ className={`px-2 py-1 text-xs rounded transition-colors ${
91
+ mode === m
92
+ ? 'bg-blue-600 text-white'
93
+ : 'text-slate-400 hover:text-white'
94
+ }`}
95
+ >
96
+ {m.toUpperCase()}
97
+ </button>
98
+ ))}
99
+ </div>
100
+
101
+ <Button
102
+ onClick={handleSearch}
103
+ disabled={isSearching || !query.trim()}
104
+ size="sm"
105
+ className="bg-blue-600 hover:bg-blue-700"
106
+ >
107
+ {isSearching ? 'Searching...' : 'Search'}
108
+ </Button>
109
+ </div>
110
+
111
+ {/* Results */}
112
+ <div className="flex-1 overflow-auto p-3">
113
+ {error && (
114
+ <div className="p-3 rounded-lg bg-red-500/20 border border-red-500/50 text-red-300 text-sm mb-3">
115
+ {error}
116
+ </div>
117
+ )}
118
+
119
+ {results.length === 0 && !error && (
120
+ <div className="text-slate-500 text-sm text-center py-8">
121
+ {query ? 'No results found' : 'Enter a query to search memories'}
122
+ </div>
123
+ )}
124
+
125
+ {results.length > 0 && (
126
+ <div className="space-y-2">
127
+ <div className="text-xs text-slate-400 mb-2">
128
+ Found {results.length} results
129
+ </div>
130
+
131
+ <table className="w-full text-sm">
132
+ <thead>
133
+ <tr className="text-left text-slate-400 border-b border-slate-700">
134
+ <th className="pb-2 pr-4">Title</th>
135
+ <th className="pb-2 pr-4 w-20">Score</th>
136
+ <th className="pb-2 pr-4 w-24">Type</th>
137
+ <th className="pb-2 w-24">Category</th>
138
+ </tr>
139
+ </thead>
140
+ <tbody>
141
+ {results.map((result, index) => (
142
+ <tr
143
+ key={result.memory.id}
144
+ className="border-b border-slate-800 hover:bg-slate-800/50"
145
+ >
146
+ <td className="py-2 pr-4">
147
+ <div className="flex items-center gap-2">
148
+ <span className="text-slate-500 text-xs w-5">
149
+ {index + 1}.
150
+ </span>
151
+ <span className="text-white truncate max-w-[300px]">
152
+ {result.memory.title}
153
+ </span>
154
+ </div>
155
+ </td>
156
+ <td className="py-2 pr-4">
157
+ <div className="flex items-center gap-1">
158
+ <div
159
+ className="h-1.5 rounded-full bg-gradient-to-r from-blue-600 to-purple-600"
160
+ style={{ width: `${result.relevanceScore * 100}%`, maxWidth: '60px' }}
161
+ />
162
+ <span className="text-xs text-slate-400">
163
+ {(result.relevanceScore * 100).toFixed(0)}%
164
+ </span>
165
+ </div>
166
+ </td>
167
+ <td className="py-2 pr-4">
168
+ <span className={`text-xs px-1.5 py-0.5 rounded ${
169
+ result.memory.type === 'long_term'
170
+ ? 'bg-purple-600/30 text-purple-300'
171
+ : result.memory.type === 'short_term'
172
+ ? 'bg-blue-600/30 text-blue-300'
173
+ : 'bg-green-600/30 text-green-300'
174
+ }`}>
175
+ {result.memory.type.replace('_', '-')}
176
+ </span>
177
+ </td>
178
+ <td className="py-2">
179
+ <span className="text-xs text-slate-400">
180
+ {result.memory.category}
181
+ </span>
182
+ </td>
183
+ </tr>
184
+ ))}
185
+ </tbody>
186
+ </table>
187
+ </div>
188
+ )}
189
+ </div>
190
+ </div>
191
+ );
192
+ }