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,221 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Session Start Hook for ShieldCortex - Auto-Recall Context
4
+ *
5
+ * This script runs when Claude Code starts a new session and:
6
+ * 1. Detects the current project from the working directory
7
+ * 2. Retrieves relevant context from memory
8
+ * 3. Outputs it so Claude has immediate access to project knowledge
9
+ *
10
+ * The goal: Claude always starts with relevant project context.
11
+ */
12
+
13
+ import Database from 'better-sqlite3';
14
+ import { existsSync } from 'fs';
15
+ import { join } from 'path';
16
+ import { homedir } from 'os';
17
+
18
+ // Database paths (with legacy fallback)
19
+ const NEW_DB_DIR = join(homedir(), '.shieldcortex');
20
+ const LEGACY_DB_DIR = join(homedir(), '.claude-cortex');
21
+
22
+ // Auto-detect: use new path if it exists, or if legacy doesn't exist (new install)
23
+ function getDbPath() {
24
+ const newPath = join(NEW_DB_DIR, 'memories.db');
25
+ const legacyPath = join(LEGACY_DB_DIR, 'memories.db');
26
+ if (existsSync(newPath) || !existsSync(legacyPath)) {
27
+ return { dir: NEW_DB_DIR, path: newPath };
28
+ }
29
+ return { dir: LEGACY_DB_DIR, path: legacyPath };
30
+ }
31
+
32
+ const { dir: DB_DIR, path: DB_PATH } = getDbPath();
33
+
34
+ // Configuration
35
+ const MAX_CONTEXT_MEMORIES = 15;
36
+ const MIN_SALIENCE_THRESHOLD = 0.3;
37
+
38
+ // ==================== PROJECT DETECTION (Mirrors src/context/project-context.ts) ====================
39
+
40
+ const SKIP_DIRECTORIES = [
41
+ 'src', 'lib', 'dist', 'build', 'out',
42
+ 'node_modules', '.git', '.next', '.cache',
43
+ 'test', 'tests', '__tests__', 'spec',
44
+ 'bin', 'scripts', 'config', 'public', 'static',
45
+ ];
46
+
47
+ function extractProjectFromPath(path) {
48
+ if (!path) return null;
49
+
50
+ const segments = path.split(/[/\\]/).filter(Boolean);
51
+ if (segments.length === 0) return null;
52
+
53
+ for (let i = segments.length - 1; i >= 0; i--) {
54
+ const segment = segments[i];
55
+ if (!SKIP_DIRECTORIES.includes(segment.toLowerCase())) {
56
+ if (segment.startsWith('.')) continue;
57
+ return segment;
58
+ }
59
+ }
60
+
61
+ return null;
62
+ }
63
+
64
+ // ==================== CONTEXT RETRIEVAL ====================
65
+
66
+ function getProjectContext(db, project) {
67
+ const memories = [];
68
+
69
+ // Get high-priority memories for this project
70
+ const highPriority = db.prepare(`
71
+ SELECT id, title, content, category, type, salience, tags, created_at
72
+ FROM memories
73
+ WHERE (project = ? OR project IS NULL)
74
+ AND salience >= ?
75
+ AND type IN ('long_term', 'episodic')
76
+ ORDER BY salience DESC, last_accessed DESC
77
+ LIMIT ?
78
+ `).all(project, MIN_SALIENCE_THRESHOLD, MAX_CONTEXT_MEMORIES);
79
+
80
+ memories.push(...highPriority);
81
+
82
+ // If we don't have enough, get recent memories too
83
+ if (memories.length < 5) {
84
+ const excludeIds = memories.map(m => m.id);
85
+ const placeholders = excludeIds.length > 0 ? excludeIds.map(() => '?').join(',') : '0';
86
+ const recent = db.prepare(`
87
+ SELECT id, title, content, category, type, salience, tags, created_at
88
+ FROM memories
89
+ WHERE (project = ? OR project IS NULL)
90
+ AND id NOT IN (${placeholders})
91
+ ORDER BY created_at DESC
92
+ LIMIT ?
93
+ `).all(project, ...excludeIds, 5 - memories.length);
94
+
95
+ memories.push(...recent);
96
+ }
97
+
98
+ return memories;
99
+ }
100
+
101
+ function formatContext(memories, project) {
102
+ if (memories.length === 0) {
103
+ return null;
104
+ }
105
+
106
+ const lines = [
107
+ `# Project Context: ${project}`,
108
+ '',
109
+ ];
110
+
111
+ // Group by category
112
+ const byCategory = {};
113
+ for (const mem of memories) {
114
+ const cat = mem.category || 'note';
115
+ if (!byCategory[cat]) byCategory[cat] = [];
116
+ byCategory[cat].push(mem);
117
+ }
118
+
119
+ // Priority order for categories
120
+ const categoryOrder = ['architecture', 'pattern', 'preference', 'error', 'context', 'learning', 'note', 'todo'];
121
+
122
+ for (const cat of categoryOrder) {
123
+ if (!byCategory[cat] || byCategory[cat].length === 0) continue;
124
+
125
+ const categoryTitle = cat.charAt(0).toUpperCase() + cat.slice(1);
126
+ lines.push(`## ${categoryTitle}`);
127
+
128
+ for (const mem of byCategory[cat]) {
129
+ const salience = Math.round(mem.salience * 100);
130
+ lines.push(`- **${mem.title}** (${salience}% salience)`);
131
+ // Truncate long content
132
+ const content = mem.content.length > 200
133
+ ? mem.content.slice(0, 200) + '...'
134
+ : mem.content;
135
+ lines.push(` ${content}`);
136
+ }
137
+ lines.push('');
138
+ }
139
+
140
+ return lines.join('\n');
141
+ }
142
+
143
+ // ==================== MAIN HOOK LOGIC ====================
144
+
145
+ let input = '';
146
+ process.stdin.setEncoding('utf8');
147
+
148
+ process.stdin.on('readable', () => {
149
+ let chunk;
150
+ while ((chunk = process.stdin.read()) !== null) {
151
+ input += chunk;
152
+ }
153
+ });
154
+
155
+ process.stdin.on('end', () => {
156
+ try {
157
+ const hookData = JSON.parse(input || '{}');
158
+ const project = extractProjectFromPath(hookData.cwd || process.cwd());
159
+
160
+ if (!project) {
161
+ // No project detected, skip context retrieval
162
+ process.exit(0);
163
+ }
164
+
165
+ // Check if database exists
166
+ if (!existsSync(DB_PATH)) {
167
+ console.error('[session-start] Memory database not found, skipping context retrieval');
168
+ process.exit(0);
169
+ }
170
+
171
+ // Connect to database (read-only to avoid contention)
172
+ // timeout: 5000ms to handle busy database during concurrent access
173
+ const db = new Database(DB_PATH, { readonly: true, timeout: 5000 });
174
+
175
+ // Get project context
176
+ const memories = getProjectContext(db, project);
177
+ const context = formatContext(memories, project);
178
+
179
+ db.close();
180
+
181
+ // Proactive memory instructions
182
+ const proactiveInstructions = `
183
+ ## IMPORTANT: Proactive Memory Use
184
+
185
+ You have access to a persistent memory system. Use it proactively:
186
+
187
+ **ALWAYS use \`remember\` immediately when:**
188
+ - Making architecture/design decisions
189
+ - Fixing bugs (capture the root cause and solution)
190
+ - Learning something new about the codebase
191
+ - User states a preference
192
+ - Completing significant features
193
+
194
+ **Don't wait** - call \`remember\` right after the event, not at the end of the session.
195
+ `;
196
+
197
+ if (context) {
198
+ // Output context to stdout - this will be shown to Claude
199
+ console.log(`
200
+ 🧠 SHIELDCORTEX - Project "${project}"
201
+
202
+ ${context}
203
+ ${proactiveInstructions}
204
+ `);
205
+ console.error(`[shieldcortex] Session start: loaded ${memories.length} memories for "${project}"`);
206
+ } else {
207
+ console.log(`
208
+ 🧠 SHIELDCORTEX - New project "${project}"
209
+
210
+ No stored memories yet for this project.
211
+ ${proactiveInstructions}
212
+ `);
213
+ console.error(`[shieldcortex] Session start: no memories found for "${project}"`);
214
+ }
215
+
216
+ process.exit(0);
217
+ } catch (error) {
218
+ console.error(`[session-start] Error: ${error.message}`);
219
+ process.exit(0); // Don't block session start on errors
220
+ }
221
+ });
@@ -0,0 +1,41 @@
1
+ #!/bin/bash
2
+ # ShieldCortex Dashboard Startup Script
3
+ # Starts both the API server and Next.js dashboard
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
7
+ LOG_DIR="$HOME/.shieldcortex/logs"
8
+
9
+ # Create log directory
10
+ mkdir -p "$LOG_DIR"
11
+
12
+ # Kill any existing instances
13
+ pkill -f "node.*visualization-server" 2>/dev/null
14
+ pkill -f "next-server.*3030" 2>/dev/null
15
+
16
+ # Wait for processes to stop
17
+ sleep 1
18
+
19
+ # Start API server (port 3001)
20
+ cd "$PROJECT_DIR"
21
+ nohup npm run dev:api > "$LOG_DIR/api-server.log" 2>&1 &
22
+ API_PID=$!
23
+ echo "API server started (PID: $API_PID)"
24
+
25
+ # Wait for API to be ready
26
+ sleep 2
27
+
28
+ # Start Next.js dashboard (port 3030)
29
+ cd "$PROJECT_DIR/dashboard"
30
+ nohup npm run dev > "$LOG_DIR/dashboard.log" 2>&1 &
31
+ DASHBOARD_PID=$!
32
+ echo "Dashboard started (PID: $DASHBOARD_PID)"
33
+
34
+ # Save PIDs for later shutdown
35
+ echo "$API_PID" > "$LOG_DIR/api-server.pid"
36
+ echo "$DASHBOARD_PID" > "$LOG_DIR/dashboard.pid"
37
+
38
+ echo "ShieldCortex Dashboard running:"
39
+ echo " - API: http://localhost:3001"
40
+ echo " - Dashboard: http://localhost:3030"
41
+ echo " - Logs: $LOG_DIR"
@@ -0,0 +1,21 @@
1
+ #!/bin/bash
2
+ # Stop ShieldCortex Dashboard
3
+
4
+ LOG_DIR="$HOME/.shieldcortex/logs"
5
+
6
+ # Kill by PID files if they exist
7
+ if [ -f "$LOG_DIR/api-server.pid" ]; then
8
+ kill $(cat "$LOG_DIR/api-server.pid") 2>/dev/null
9
+ rm "$LOG_DIR/api-server.pid"
10
+ fi
11
+
12
+ if [ -f "$LOG_DIR/dashboard.pid" ]; then
13
+ kill $(cat "$LOG_DIR/dashboard.pid") 2>/dev/null
14
+ rm "$LOG_DIR/dashboard.pid"
15
+ fi
16
+
17
+ # Also kill by process name as fallback
18
+ pkill -f "node.*visualization-server" 2>/dev/null
19
+ pkill -f "next-server.*3030" 2>/dev/null
20
+
21
+ echo "ShieldCortex Dashboard stopped"
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * ShieldCortex — Stop Hook
5
+ *
6
+ * Fires after each Claude response. Checks the last assistant message for
7
+ * high-salience content (decisions, fixes, learnings) that should be saved
8
+ * to memory via the `remember` tool.
9
+ *
10
+ * Loop prevention: If stop_hook_active is true, exits 0 immediately
11
+ * (programmatic check, not LLM-dependent).
12
+ *
13
+ * Exit codes:
14
+ * 0 = allow Claude to stop
15
+ * 2 = block stop (stderr tells Claude to use `remember`)
16
+ */
17
+
18
+ import { readFileSync, existsSync } from 'fs';
19
+ import { homedir } from 'os';
20
+
21
+ // ==================== SALIENCE DETECTION ====================
22
+
23
+ const DECISION_KEYWORDS = [
24
+ 'decided', 'decision', 'chose', 'chosen', 'selected', 'going with',
25
+ 'will use', 'opted for', 'settled on', 'agreed'
26
+ ];
27
+
28
+ const ERROR_KEYWORDS = [
29
+ 'fixed by', 'the fix was', 'root cause', 'the bug was', 'the solution was',
30
+ 'resolved by', 'the issue was', 'workaround'
31
+ ];
32
+
33
+ const LEARNING_KEYWORDS = [
34
+ 'learned that', 'discovered that', 'realized that', 'found out',
35
+ 'turns out', 'TIL', 'figured out'
36
+ ];
37
+
38
+ const ARCHITECTURE_KEYWORDS = [
39
+ 'architecture uses', 'design decision', 'implemented', 'refactored to',
40
+ 'migrated from', 'created a new', 'built a'
41
+ ];
42
+
43
+ const PREFERENCE_KEYWORDS = [
44
+ 'always use', 'never use', 'prefer to', 'convention is',
45
+ 'standard is', 'rule is'
46
+ ];
47
+
48
+ const IMPORTANT_MARKERS = [
49
+ 'important:', 'remember:', 'key point', 'crucial:', 'note:'
50
+ ];
51
+
52
+ function detectKeywords(text, keywords) {
53
+ const lower = text.toLowerCase();
54
+ return keywords.some(kw => lower.includes(kw.toLowerCase()));
55
+ }
56
+
57
+ /**
58
+ * Check if text contains high-salience content worth remembering.
59
+ * Returns a description string if yes, null if no.
60
+ */
61
+ function detectNotableContent(text) {
62
+ const lower = text.toLowerCase();
63
+
64
+ if (detectKeywords(lower, DECISION_KEYWORDS)) {
65
+ return 'A decision was made in the last response';
66
+ }
67
+ if (detectKeywords(lower, ERROR_KEYWORDS)) {
68
+ return 'A bug fix or error resolution was described';
69
+ }
70
+ if (detectKeywords(lower, LEARNING_KEYWORDS)) {
71
+ return 'Something new was learned or discovered';
72
+ }
73
+ if (detectKeywords(lower, ARCHITECTURE_KEYWORDS)) {
74
+ return 'An architecture or design change was made';
75
+ }
76
+ if (detectKeywords(lower, PREFERENCE_KEYWORDS)) {
77
+ return 'A preference or convention was stated';
78
+ }
79
+ if (detectKeywords(lower, IMPORTANT_MARKERS)) {
80
+ return 'Something was marked as important';
81
+ }
82
+
83
+ return null;
84
+ }
85
+
86
+ /**
87
+ * Read the last assistant message from the transcript JSONL.
88
+ */
89
+ function getLastAssistantMessage(transcriptPath) {
90
+ if (!transcriptPath) return '';
91
+
92
+ const resolved = transcriptPath.replace(/^~/, homedir());
93
+ if (!existsSync(resolved)) return '';
94
+
95
+ try {
96
+ const content = readFileSync(resolved, 'utf-8');
97
+ const lines = content.trim().split('\n');
98
+
99
+ // Read from the end to find the last assistant message
100
+ for (let i = lines.length - 1; i >= Math.max(0, lines.length - 20); i--) {
101
+ try {
102
+ const entry = JSON.parse(lines[i]);
103
+ const role = entry.type || entry.message?.role;
104
+ if (role === 'assistant' && entry.message?.content) {
105
+ const msgContent = entry.message.content;
106
+ return Array.isArray(msgContent)
107
+ ? msgContent.filter(c => c.type === 'text').map(c => c.text).join('\n')
108
+ : msgContent;
109
+ }
110
+ } catch {
111
+ // Skip invalid lines
112
+ }
113
+ }
114
+ return '';
115
+ } catch {
116
+ return '';
117
+ }
118
+ }
119
+
120
+ // ==================== MAIN ====================
121
+
122
+ async function main() {
123
+ let hookData;
124
+ try {
125
+ const stdin = readFileSync(0, 'utf-8');
126
+ hookData = JSON.parse(stdin);
127
+ } catch {
128
+ // No stdin or invalid JSON — allow stop
129
+ process.exit(0);
130
+ }
131
+
132
+ // PROGRAMMATIC LOOP PREVENTION
133
+ // If Claude is already continuing from a stop hook, always allow stop.
134
+ if (hookData.stop_hook_active === true) {
135
+ process.exit(0);
136
+ }
137
+
138
+ // Read the last assistant message
139
+ const lastMessage = getLastAssistantMessage(hookData.transcript_path);
140
+ if (!lastMessage || lastMessage.length < 50) {
141
+ // Too short to contain anything notable
142
+ process.exit(0);
143
+ }
144
+
145
+ // Check for notable content
146
+ const description = detectNotableContent(lastMessage);
147
+ if (description) {
148
+ // Block stop — tell Claude to use remember
149
+ process.stderr.write(
150
+ `Use the remember tool to save what just happened: ${description}. ` +
151
+ `Then continue with your response.`
152
+ );
153
+ process.exit(2);
154
+ }
155
+
156
+ // Nothing notable — allow stop
157
+ process.exit(0);
158
+ }
159
+
160
+ main().catch(() => {
161
+ // Never crash Claude Code
162
+ process.exit(0);
163
+ });