shieldcortex 4.14.11 → 4.16.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 (246) hide show
  1. package/README.md +4 -0
  2. package/dashboard/.next/standalone/dashboard/.next/BUILD_ID +1 -1
  3. package/dashboard/.next/standalone/dashboard/.next/build-manifest.json +2 -2
  4. package/dashboard/.next/standalone/dashboard/.next/prerender-manifest.json +3 -3
  5. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.html +2 -2
  6. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.rsc +1 -1
  7. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.html +2 -2
  13. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.rsc +1 -1
  14. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  15. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  17. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  20. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.html +1 -1
  21. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.rsc +1 -1
  22. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin/__PAGE__.segment.rsc +1 -1
  23. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin.segment.rsc +1 -1
  24. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  25. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  26. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  27. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  28. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  29. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.html +1 -1
  30. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.rsc +1 -1
  31. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud/__PAGE__.segment.rsc +1 -1
  32. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud.segment.rsc +1 -1
  33. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  34. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_full.segment.rsc +1 -1
  35. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_head.segment.rsc +1 -1
  36. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_index.segment.rsc +1 -1
  37. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_tree.segment.rsc +1 -1
  38. package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
  39. package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +1 -1
  40. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  41. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_full.segment.rsc +1 -1
  42. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
  43. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_index.segment.rsc +1 -1
  44. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  45. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.html +1 -1
  46. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.rsc +1 -1
  47. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture/__PAGE__.segment.rsc +1 -1
  48. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture.segment.rsc +1 -1
  49. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  50. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  51. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_full.segment.rsc +1 -1
  52. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_head.segment.rsc +1 -1
  53. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_index.segment.rsc +1 -1
  54. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_tree.segment.rsc +1 -1
  55. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.html +1 -1
  56. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.rsc +1 -1
  57. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph/__PAGE__.segment.rsc +1 -1
  58. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph.segment.rsc +1 -1
  59. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  60. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  61. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_full.segment.rsc +1 -1
  62. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_head.segment.rsc +1 -1
  63. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_index.segment.rsc +1 -1
  64. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_tree.segment.rsc +1 -1
  65. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.html +1 -1
  66. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.rsc +1 -1
  67. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall/__PAGE__.segment.rsc +1 -1
  68. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall.segment.rsc +1 -1
  69. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  70. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  71. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_full.segment.rsc +1 -1
  72. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_head.segment.rsc +1 -1
  73. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_index.segment.rsc +1 -1
  74. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_tree.segment.rsc +1 -1
  75. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.html +1 -1
  76. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.rsc +1 -1
  77. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review/__PAGE__.segment.rsc +1 -1
  78. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review.segment.rsc +1 -1
  79. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  80. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  81. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_full.segment.rsc +1 -1
  82. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_head.segment.rsc +1 -1
  83. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_index.segment.rsc +1 -1
  84. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_tree.segment.rsc +1 -1
  85. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.html +1 -1
  86. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.rsc +1 -1
  87. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline/__PAGE__.segment.rsc +1 -1
  88. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline.segment.rsc +1 -1
  89. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  90. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  91. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_full.segment.rsc +1 -1
  92. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_head.segment.rsc +1 -1
  93. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_index.segment.rsc +1 -1
  94. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_tree.segment.rsc +1 -1
  95. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.html +2 -2
  96. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.rsc +1 -1
  97. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory/__PAGE__.segment.rsc +1 -1
  98. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  99. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  100. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_full.segment.rsc +1 -1
  101. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_head.segment.rsc +1 -1
  102. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_index.segment.rsc +1 -1
  103. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_tree.segment.rsc +1 -1
  104. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.html +2 -2
  105. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.rsc +1 -1
  106. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview/__PAGE__.segment.rsc +1 -1
  107. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview.segment.rsc +1 -1
  108. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  109. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_full.segment.rsc +1 -1
  110. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_head.segment.rsc +1 -1
  111. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_index.segment.rsc +1 -1
  112. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_tree.segment.rsc +1 -1
  113. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.html +1 -1
  114. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.rsc +1 -1
  115. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit/__PAGE__.segment.rsc +1 -1
  116. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit.segment.rsc +1 -1
  117. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  118. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  119. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_full.segment.rsc +1 -1
  120. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_head.segment.rsc +1 -1
  121. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_index.segment.rsc +1 -1
  122. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_tree.segment.rsc +1 -1
  123. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.html +1 -1
  124. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.rsc +1 -1
  125. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts/__PAGE__.segment.rsc +1 -1
  126. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts.segment.rsc +1 -1
  127. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  128. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  129. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_full.segment.rsc +1 -1
  130. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_head.segment.rsc +1 -1
  131. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_index.segment.rsc +1 -1
  132. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_tree.segment.rsc +1 -1
  133. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.html +1 -1
  134. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.rsc +1 -1
  135. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome/__PAGE__.segment.rsc +1 -1
  136. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome.segment.rsc +1 -1
  137. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  138. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  139. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_full.segment.rsc +1 -1
  140. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_head.segment.rsc +1 -1
  141. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_index.segment.rsc +1 -1
  142. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_tree.segment.rsc +1 -1
  143. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.html +1 -1
  144. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.rsc +1 -1
  145. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies/__PAGE__.segment.rsc +1 -1
  146. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies.segment.rsc +1 -1
  147. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  148. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  149. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_full.segment.rsc +1 -1
  150. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_head.segment.rsc +1 -1
  151. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_index.segment.rsc +1 -1
  152. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_tree.segment.rsc +1 -1
  153. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.html +1 -1
  154. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.rsc +1 -1
  155. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine/__PAGE__.segment.rsc +1 -1
  156. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine.segment.rsc +1 -1
  157. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  158. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  159. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_full.segment.rsc +1 -1
  160. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_head.segment.rsc +1 -1
  161. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_index.segment.rsc +1 -1
  162. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_tree.segment.rsc +1 -1
  163. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.html +2 -2
  164. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.rsc +1 -1
  165. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection/__PAGE__.segment.rsc +1 -1
  166. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  167. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  168. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_full.segment.rsc +1 -1
  169. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_head.segment.rsc +1 -1
  170. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_index.segment.rsc +1 -1
  171. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_tree.segment.rsc +1 -1
  172. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.html +2 -2
  173. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.rsc +1 -1
  174. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +1 -1
  175. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  176. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  177. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  178. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  179. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  180. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  181. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.html +1 -1
  182. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.rsc +1 -1
  183. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray/__PAGE__.segment.rsc +1 -1
  184. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray.segment.rsc +1 -1
  185. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
  186. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  187. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_full.segment.rsc +1 -1
  188. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_head.segment.rsc +1 -1
  189. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_index.segment.rsc +1 -1
  190. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_tree.segment.rsc +1 -1
  191. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.html +1 -1
  192. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.rsc +1 -1
  193. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain/__PAGE__.segment.rsc +1 -1
  194. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
  195. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  196. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_full.segment.rsc +1 -1
  197. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_head.segment.rsc +1 -1
  198. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_index.segment.rsc +1 -1
  199. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_tree.segment.rsc +1 -1
  200. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.html +2 -2
  201. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.rsc +1 -1
  202. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray/__PAGE__.segment.rsc +1 -1
  203. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray.segment.rsc +1 -1
  204. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  205. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_full.segment.rsc +1 -1
  206. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_head.segment.rsc +1 -1
  207. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_index.segment.rsc +1 -1
  208. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_tree.segment.rsc +1 -1
  209. package/dashboard/.next/standalone/dashboard/.next/server/pages/404.html +2 -2
  210. package/dashboard/.next/standalone/dashboard/.next/server/pages/500.html +2 -2
  211. package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.js +1 -1
  212. package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.json +1 -1
  213. package/dist/cli/migrate-legacy.d.ts +18 -0
  214. package/dist/cli/migrate-legacy.js +96 -0
  215. package/dist/cloud/cli.js +25 -1
  216. package/dist/cloud/config.d.ts +19 -0
  217. package/dist/cloud/config.js +72 -0
  218. package/dist/database/init.js +21 -0
  219. package/dist/database/schema.sql +1 -0
  220. package/dist/database/seed-firewall-rules.d.ts +21 -0
  221. package/dist/database/seed-firewall-rules.js +105 -0
  222. package/dist/defence/custom-rules/store.d.ts +4 -1
  223. package/dist/defence/custom-rules/store.js +7 -3
  224. package/dist/defence/firewall/instruction-detector.js +15 -0
  225. package/dist/defence/pipeline.js +19 -13
  226. package/dist/defence/types.d.ts +1 -1
  227. package/dist/memory/ranker/graph-rank.d.ts +39 -0
  228. package/dist/memory/ranker/graph-rank.js +186 -0
  229. package/dist/memory/ranker/index.d.ts +74 -0
  230. package/dist/memory/ranker/index.js +170 -0
  231. package/dist/memory/ranker/rrf.d.ts +41 -0
  232. package/dist/memory/ranker/rrf.js +54 -0
  233. package/dist/memory/search-recall.js +196 -65
  234. package/dist/memory/types.d.ts +18 -0
  235. package/dist/memory/types.js +6 -0
  236. package/hooks/openclaw/cortex-memory/HOOK.md +37 -0
  237. package/package.json +3 -1
  238. package/plugins/openclaw/dist/openclaw.plugin.json +1 -1
  239. package/scripts/lib/extract-memorable-segments.mjs +555 -0
  240. package/scripts/lib/save-memory.mjs +198 -13
  241. package/scripts/pre-compact-hook.mjs +19 -375
  242. package/scripts/session-end-hook.mjs +16 -307
  243. package/scripts/stop-hook.mjs +28 -159
  244. /package/dashboard/.next/standalone/dashboard/.next/static/{InYbgmj1l661AgpmCj6zr → 6WjF0Utj3STrFgg7vZVPK}/_buildManifest.js +0 -0
  245. /package/dashboard/.next/standalone/dashboard/.next/static/{InYbgmj1l661AgpmCj6zr → 6WjF0Utj3STrFgg7vZVPK}/_clientMiddlewareManifest.json +0 -0
  246. /package/dashboard/.next/standalone/dashboard/.next/static/{InYbgmj1l661AgpmCj6zr → 6WjF0Utj3STrFgg7vZVPK}/_ssgManifest.js +0 -0
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Reciprocal Rank Fusion (RRF).
3
+ *
4
+ * Combines ordered rank lists from multiple retrievers (e.g. BM25, vector,
5
+ * graph) into a single fused ranking. Robust to heterogeneous score scales:
6
+ * the only thing that matters is each retriever's rank order.
7
+ *
8
+ * score(d) = Σ_i w_i / (k + rank_i(d))
9
+ *
10
+ * - rank_i(d) is the 1-indexed position of d in retriever i's list.
11
+ * - w_i is the optional weight for retriever i (default 1).
12
+ * - k is a smoothing constant. Cormack et al. (2009) recommend 60.
13
+ *
14
+ * The function returns the union of ids across all rank lists, sorted by
15
+ * fused score descending. Ties break by id ascending for stable output.
16
+ */
17
+ const DEFAULT_K = 60;
18
+ export function reciprocalRankFusion(rankLists, options = {}) {
19
+ const k = options.k ?? DEFAULT_K;
20
+ const accumulator = new Map();
21
+ for (const list of rankLists) {
22
+ if (list.ids.length === 0)
23
+ continue;
24
+ const weight = list.weight ?? 1;
25
+ const seen = new Set();
26
+ list.ids.forEach((id, idx) => {
27
+ if (seen.has(id))
28
+ return; // dedupe within a single rank list, keep first
29
+ seen.add(id);
30
+ const rank = idx + 1;
31
+ const weighted = weight / (k + rank);
32
+ const entry = accumulator.get(id);
33
+ const contribution = { name: list.name, rank, weighted };
34
+ if (entry) {
35
+ entry.score += weighted;
36
+ entry.contributions.push(contribution);
37
+ }
38
+ else {
39
+ accumulator.set(id, { score: weighted, contributions: [contribution] });
40
+ }
41
+ });
42
+ }
43
+ const results = Array.from(accumulator.entries()).map(([id, { score, contributions }]) => ({
44
+ id,
45
+ score,
46
+ contributions,
47
+ }));
48
+ results.sort((a, b) => {
49
+ if (b.score !== a.score)
50
+ return b.score - a.score;
51
+ return a.id - b.id; // stable tie-break by id ascending
52
+ });
53
+ return results;
54
+ }
@@ -34,6 +34,9 @@ import { reinforceFromSearch, enrichMemory } from './lifecycle.js';
34
34
  // Cyclic import — see header. rowToMemory and logAccessDenial live in store.ts;
35
35
  // both are only invoked inside function bodies below, never at module load.
36
36
  import { rowToMemory, logAccessDenial } from './store.js';
37
+ import { runHybridRanker } from './ranker/index.js';
38
+ import { graphRankFromQuery } from './ranker/graph-rank.js';
39
+ import { getRankerConfig } from '../cloud/config.js';
37
40
  let searchCount = 0;
38
41
  async function searchMemoriesInternal(options, config, source, execution) {
39
42
  if (++searchCount % 100 === 0) {
@@ -124,72 +127,45 @@ async function searchMemoriesInternal(options, config, source, execution) {
124
127
  vectorResults,
125
128
  query: options.query,
126
129
  };
127
- const results = rows.map((row) => {
128
- const memory = rowToMemory(row);
129
- const decayedScore = calculateDecayedScore(memory, config);
130
- memory.decayedScore = decayedScore;
130
+ // FTS-derived per-row scores (legacy: used directly; RRF: kept for explanations)
131
+ const ftsScores = new Map();
132
+ for (const row of rows) {
133
+ const id = row.id;
131
134
  const rawRank = row.rank;
132
- const ftsScore = rawRank ? 1 / (1 + Math.abs(rawRank)) : 0.3;
133
- const hoursSinceAccess = (Date.now() - new Date(memory.lastAccessed).getTime()) / (1000 * 60 * 60);
134
- const recencyBoost = hoursSinceAccess < 1 ? 0.1 : (hoursSinceAccess < 24 ? 0.05 : 0);
135
- const categoryBoost = detectedCategory && memory.category === detectedCategory ? 0.1 : 0;
136
- const linkBoost = calculateLinkBoost(memory.id, db);
137
- const tagBoost = calculateTagScore(queryTags, memory.tags);
138
- const activationBoost = getActivationBoost(memory.id);
139
- const vectorSimilarity = vectorResults.get(memory.id) || 0;
140
- const vectorBoost = vectorSimilarity * 0.3;
141
- const priorityBoost = calculatePriority(memory) * 0.05;
142
- const contradictionCount = db.prepare(`SELECT COUNT(*) as count FROM memory_links WHERE relationship = 'contradicts' AND (source_id = ? OR target_id = ?)`).get(memory.id, memory.id).count;
143
- const contradictionPenalty = Math.min(0.12, contradictionCount * 0.03);
144
- const eligibilityReasons = [];
145
- if (memory.status === 'archived')
146
- eligibilityReasons.push('Archived memories are excluded from normal recall');
147
- if (memory.status === 'suppressed')
148
- eligibilityReasons.push('Suppressed memories are excluded from normal recall');
149
- if (memory.cloudExcluded)
150
- eligibilityReasons.push('Excluded from cloud sync');
151
- if (memory.trustScore < 0.7)
152
- eligibilityReasons.push(`Low trust source (${memory.trustScore.toFixed(2)})`);
153
- if (contradictionCount > 0)
154
- eligibilityReasons.push(`${contradictionCount} contradiction link${contradictionCount === 1 ? '' : 's'} attached`);
155
- const relevanceScore = (ftsScore * 0.25 +
156
- vectorBoost +
157
- decayedScore * 0.2 +
158
- priorityBoost +
159
- recencyBoost + categoryBoost + linkBoost + tagBoost + activationBoost -
160
- contradictionPenalty);
161
- const result = {
162
- memory,
163
- relevanceScore,
164
- recallEligibility: {
165
- eligible: eligibilityReasons.length === 0,
166
- reasons: eligibilityReasons,
167
- },
168
- };
169
- if (execution.includeExplanation) {
170
- result.explanation = buildSearchExplanation(memory, scoringContext, {
171
- ftsScore,
172
- vectorSimilarity,
173
- vectorBoost,
174
- decayedScore,
175
- priorityBoost,
176
- recencyBoost,
177
- categoryBoost,
178
- linkBoost,
179
- tagBoost,
180
- activationBoost,
181
- contradictionPenalty,
182
- finalScore: relevanceScore,
183
- });
184
- if (result.explanation) {
185
- result.explanation.eligibility = result.recallEligibility;
186
- }
187
- }
188
- return result;
189
- });
190
- const sortedResults = results
191
- .filter((result) => options.includeDecayed || result.memory.decayedScore >= config.salienceThreshold)
192
- .sort((a, b) => b.relevanceScore - a.relevanceScore);
135
+ ftsScores.set(id, rawRank ? 1 / (1 + Math.abs(rawRank)) : 0.3);
136
+ }
137
+ // Resolve ranker engine. Honour caller-supplied config.ranker if present
138
+ // (tests and explicit callers can pin engine), otherwise fall back to the
139
+ // env/file resolver in cloud/config.
140
+ const rankerConfig = config.ranker ?? getRankerConfig();
141
+ let sortedResults;
142
+ if (rankerConfig.engine === 'rrf') {
143
+ sortedResults = scoreWithRrf({
144
+ rows,
145
+ ftsScores,
146
+ vectorResults,
147
+ query: options.query,
148
+ options,
149
+ db,
150
+ config,
151
+ rankerConfig,
152
+ limit,
153
+ includeExplanation: execution.includeExplanation,
154
+ });
155
+ }
156
+ else {
157
+ sortedResults = scoreLegacy({
158
+ rows,
159
+ vectorResults,
160
+ detectedCategory,
161
+ queryTags,
162
+ db,
163
+ config,
164
+ includeDecayed: options.includeDecayed ?? false,
165
+ includeExplanation: execution.includeExplanation,
166
+ scoringContext,
167
+ });
168
+ }
193
169
  if (execution.enableSideEffects) {
194
170
  const topResults = sortedResults.slice(0, 5);
195
171
  for (const result of topResults) {
@@ -266,6 +242,161 @@ async function searchMemoriesInternal(options, config, source, execution) {
266
242
  }
267
243
  return finalResults;
268
244
  }
245
+ function scoreLegacy(input) {
246
+ const { rows, vectorResults, detectedCategory, queryTags, db, config, includeDecayed, includeExplanation, scoringContext, } = input;
247
+ const results = rows.map((row) => {
248
+ const memory = rowToMemory(row);
249
+ const decayedScore = calculateDecayedScore(memory, config);
250
+ memory.decayedScore = decayedScore;
251
+ const rawRank = row.rank;
252
+ const ftsScore = rawRank ? 1 / (1 + Math.abs(rawRank)) : 0.3;
253
+ const hoursSinceAccess = (Date.now() - new Date(memory.lastAccessed).getTime()) / (1000 * 60 * 60);
254
+ const recencyBoost = hoursSinceAccess < 1 ? 0.1 : (hoursSinceAccess < 24 ? 0.05 : 0);
255
+ const categoryBoost = detectedCategory && memory.category === detectedCategory ? 0.1 : 0;
256
+ const linkBoost = calculateLinkBoost(memory.id, db);
257
+ const tagBoost = calculateTagScore(queryTags, memory.tags);
258
+ const activationBoost = getActivationBoost(memory.id);
259
+ const vectorSimilarity = vectorResults.get(memory.id) || 0;
260
+ const vectorBoost = vectorSimilarity * 0.3;
261
+ const priorityBoost = calculatePriority(memory) * 0.05;
262
+ const contradictionCount = db.prepare(`SELECT COUNT(*) as count FROM memory_links WHERE relationship = 'contradicts' AND (source_id = ? OR target_id = ?)`).get(memory.id, memory.id).count;
263
+ const contradictionPenalty = Math.min(0.12, contradictionCount * 0.03);
264
+ const eligibilityReasons = [];
265
+ if (memory.status === 'archived')
266
+ eligibilityReasons.push('Archived memories are excluded from normal recall');
267
+ if (memory.status === 'suppressed')
268
+ eligibilityReasons.push('Suppressed memories are excluded from normal recall');
269
+ if (memory.cloudExcluded)
270
+ eligibilityReasons.push('Excluded from cloud sync');
271
+ if (memory.trustScore < 0.7)
272
+ eligibilityReasons.push(`Low trust source (${memory.trustScore.toFixed(2)})`);
273
+ if (contradictionCount > 0)
274
+ eligibilityReasons.push(`${contradictionCount} contradiction link${contradictionCount === 1 ? '' : 's'} attached`);
275
+ const relevanceScore = (ftsScore * 0.25 +
276
+ vectorBoost +
277
+ decayedScore * 0.2 +
278
+ priorityBoost +
279
+ recencyBoost + categoryBoost + linkBoost + tagBoost + activationBoost -
280
+ contradictionPenalty);
281
+ const result = {
282
+ memory,
283
+ relevanceScore,
284
+ recallEligibility: {
285
+ eligible: eligibilityReasons.length === 0,
286
+ reasons: eligibilityReasons,
287
+ },
288
+ };
289
+ if (includeExplanation) {
290
+ result.explanation = buildSearchExplanation(memory, scoringContext, {
291
+ ftsScore,
292
+ vectorSimilarity,
293
+ vectorBoost,
294
+ decayedScore,
295
+ priorityBoost,
296
+ recencyBoost,
297
+ categoryBoost,
298
+ linkBoost,
299
+ tagBoost,
300
+ activationBoost,
301
+ contradictionPenalty,
302
+ finalScore: relevanceScore,
303
+ });
304
+ if (result.explanation) {
305
+ result.explanation.eligibility = result.recallEligibility;
306
+ }
307
+ }
308
+ return result;
309
+ });
310
+ return results
311
+ .filter((result) => includeDecayed || result.memory.decayedScore >= config.salienceThreshold)
312
+ .sort((a, b) => b.relevanceScore - a.relevanceScore);
313
+ }
314
+ /**
315
+ * RRF retrieval path: build per-retriever rank lists from the FTS rows
316
+ * already produced by the SQL prelude, the cosine-similarity vector hits,
317
+ * and a fresh `graphRankFromQuery` call. Hand them to `runHybridRanker`,
318
+ * which fuses with RRF and applies post-fusion multiplicative boosts.
319
+ *
320
+ * Vector and graph rank lists may surface ids the FTS WHERE clause would
321
+ * have filtered out (category/type/status/tags/minSalience). Those are
322
+ * dropped at memory-map build time so the same filters apply across all
323
+ * three retrievers, keeping search behaviour predictable.
324
+ */
325
+ function scoreWithRrf(input) {
326
+ const { rows, ftsScores, vectorResults, query, options, db, config, rankerConfig, limit, includeExplanation, } = input;
327
+ // Memory map starts with FTS rows (already passed all SQL filters).
328
+ const memoryMap = new Map();
329
+ const ftsIds = [];
330
+ for (const row of rows) {
331
+ const memory = rowToMemory(row);
332
+ memoryMap.set(memory.id, memory);
333
+ ftsIds.push(memory.id);
334
+ }
335
+ // Vector and graph rank lists may contain ids the FTS WHERE would have
336
+ // filtered out — fetch + filter to enforce the same constraints.
337
+ const considerCandidate = (id) => {
338
+ if (memoryMap.has(id))
339
+ return true;
340
+ const row = db.prepare('SELECT * FROM memories WHERE id = ?').get(id);
341
+ if (!row)
342
+ return false;
343
+ const memory = rowToMemory(row);
344
+ if (!candidatePassesFilters(memory, options))
345
+ return false;
346
+ memoryMap.set(memory.id, memory);
347
+ return true;
348
+ };
349
+ const vectorIds = Array.from(vectorResults.entries())
350
+ .sort((a, b) => b[1] - a[1])
351
+ .map(([id]) => id)
352
+ .filter(considerCandidate);
353
+ const graphLimit = Math.max(limit * 3, 50);
354
+ const graphResults = query && query.trim()
355
+ ? graphRankFromQuery(query, db, { project: options.project, limit: graphLimit })
356
+ : [];
357
+ const graphIds = graphResults.map((r) => r.memoryId).filter(considerCandidate);
358
+ return runHybridRanker({
359
+ rankLists: [
360
+ { name: 'fts', ids: ftsIds, weight: rankerConfig.weights.fts },
361
+ { name: 'vector', ids: vectorIds, weight: rankerConfig.weights.vector },
362
+ { name: 'graph', ids: graphIds, weight: rankerConfig.weights.graph },
363
+ ],
364
+ memories: memoryMap,
365
+ vectorSimilarities: vectorResults,
366
+ ftsScores,
367
+ query,
368
+ db,
369
+ config,
370
+ rrfK: rankerConfig.rrfK,
371
+ includeExplanation,
372
+ includeDecayed: options.includeDecayed ?? false,
373
+ limit,
374
+ });
375
+ }
376
+ /**
377
+ * Mirror the WHERE-clause filters from the FTS SQL so that vector/graph
378
+ * candidates not returned by FTS are held to the same standard. Project
379
+ * scoping is already handled at the source (`vectorSearch` and
380
+ * `graphRankFromQuery`) so it isn't duplicated here.
381
+ */
382
+ function candidatePassesFilters(memory, options) {
383
+ if (options.category && memory.category !== options.category)
384
+ return false;
385
+ if (options.type && memory.type !== options.type)
386
+ return false;
387
+ if (!options.includeArchived && memory.status === 'archived')
388
+ return false;
389
+ if (!options.includeSuppressed && memory.status === 'suppressed')
390
+ return false;
391
+ if (options.minSalience !== undefined && memory.salience < options.minSalience)
392
+ return false;
393
+ if (options.tags && options.tags.length > 0) {
394
+ const hasTag = options.tags.some((tag) => memory.tags.includes(tag));
395
+ if (!hasTag)
396
+ return false;
397
+ }
398
+ return true;
399
+ }
269
400
  /**
270
401
  * Search memories using full-text search, vector similarity, and filters
271
402
  * Now uses hybrid search combining FTS5 keywords with semantic vector matching
@@ -141,6 +141,22 @@ export interface SalienceFactors {
141
141
  hasCodeReference: boolean;
142
142
  emotionalMarkers: boolean;
143
143
  }
144
+ /**
145
+ * Hybrid retrieval engine selection. RRF is the v4.15 default; `legacy`
146
+ * keeps the pre-v4.15 weighted-sum scoring as a one-release safety belt.
147
+ */
148
+ export type RankerEngine = 'rrf' | 'legacy';
149
+ export interface RankerWeights {
150
+ fts: number;
151
+ vector: number;
152
+ graph: number;
153
+ }
154
+ export interface RankerConfig {
155
+ engine: RankerEngine;
156
+ /** RRF smoothing constant. Cormack et al. (2009) recommend 60. */
157
+ rrfK: number;
158
+ weights: RankerWeights;
159
+ }
144
160
  export interface MemoryConfig {
145
161
  dbPath: string;
146
162
  decayRate: number;
@@ -150,7 +166,9 @@ export interface MemoryConfig {
150
166
  maxShortTermMemories: number;
151
167
  maxLongTermMemories: number;
152
168
  autoConsolidateHours: number;
169
+ ranker: RankerConfig;
153
170
  }
171
+ export declare const DEFAULT_RANKER_CONFIG: RankerConfig;
154
172
  export declare const DEFAULT_CONFIG: MemoryConfig;
155
173
  /**
156
174
  * Category-specific deletion thresholds
@@ -1,6 +1,11 @@
1
1
  /**
2
2
  * Core type definitions for the ShieldCortex memory system
3
3
  */
4
+ export const DEFAULT_RANKER_CONFIG = {
5
+ engine: 'rrf',
6
+ rrfK: 60,
7
+ weights: { fts: 0.4, vector: 0.6, graph: 0.3 },
8
+ };
4
9
  export const DEFAULT_CONFIG = {
5
10
  dbPath: '~/.shieldcortex/memories.db', // Note: actual path auto-detected with legacy fallback
6
11
  decayRate: 0.995,
@@ -10,6 +15,7 @@ export const DEFAULT_CONFIG = {
10
15
  maxShortTermMemories: 100,
11
16
  maxLongTermMemories: 1000,
12
17
  autoConsolidateHours: 4,
18
+ ranker: DEFAULT_RANKER_CONFIG,
13
19
  };
14
20
  /**
15
21
  * Category-specific deletion thresholds
@@ -64,6 +64,43 @@ Say any of these phrases to trigger an instant save to Cortex memory:
64
64
 
65
65
  Content after the trigger phrase is extracted and saved as the memory content.
66
66
 
67
+ ## Defence Audit Guarantees
68
+
69
+ Every byte that lands in `memories` from the auto-extract path passes the
70
+ 6-layer defence pipeline first. The hook write path is no longer the
71
+ bypass it once was:
72
+
73
+ - **ALLOW** → row inserted into `memories`; a corresponding row appears in
74
+ `defence_audit` with `source_type = 'hook'` and the hook's identifier
75
+ (`session-end-hook` / `pre-compact-hook` / `stop-hook`).
76
+ - **QUARANTINE** → row inserted into `quarantine` (not `memories`), linked
77
+ to the audit row via `audit_id`. Visible in the dashboard for review.
78
+ - **BLOCK** → dropped. The audit row written by the pipeline carries the
79
+ block reason; nothing reaches `memories`.
80
+ - **Pipeline error** → dropped + a synthetic audit row with reason
81
+ `pipeline_error: <msg>`. Never silently lose data.
82
+
83
+ Built-in firewall rules covering instruction injection, hidden
84
+ instruction, imperative tool-call directives ("call X tool now"), command
85
+ injection, and credential leaks (AWS / JWT / private keys) are seeded
86
+ into `firewall_rules` on first run with `built_in = 1`. They are
87
+ evaluated on every tier (the Pro `custom_firewall_rules` gate applies
88
+ only to user-added rules) and excluded from the user-facing 25-rule cap.
89
+
90
+ The chunker also rejects malformed candidates *before* they reach the
91
+ write path: imperative tool-calls, bare-imperative starts ("commit
92
+ secrets" with the negation dropped), email-body bleed, and path-label
93
+ fragments. Auto-extracted memories are now capped at salience 0.6
94
+ (reserved 1.0 for LLM-rated future paths).
95
+
96
+ To audit an existing database for malformed rows accumulated before this
97
+ fix:
98
+
99
+ ```bash
100
+ shieldcortex memories purge --malformed --dry-run # preview
101
+ shieldcortex memories purge --malformed --execute # delete (writes a backup first)
102
+ ```
103
+
67
104
  ## Auto-Memory
68
105
 
69
106
  Auto-memory extraction is enabled by default. ShieldCortex complements your existing memory system by capturing decisions, fixes, and learnings with built-in deduplication to avoid noise.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shieldcortex",
3
- "version": "4.14.11",
3
+ "version": "4.16.0",
4
4
  "description": "Trustworthy memory and security for AI agents. Recall debugging, review queue, OpenClaw session capture, and memory poisoning defence for Claude Code, Codex, OpenClaw, LangChain, and MCP agents.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -57,6 +57,8 @@
57
57
  "test": "node scripts/run-jest.mjs",
58
58
  "test:watch": "node scripts/run-jest.mjs --watch",
59
59
  "test:coverage": "node scripts/run-jest.mjs --coverage",
60
+ "bench": "tsx benchmark/longmemeval/run.ts",
61
+ "bench:smoke": "SHIELDCORTEX_SKIP_EMBEDDINGS=1 tsx benchmark/longmemeval/run.ts --quiet",
60
62
  "audit:security": "npm audit --audit-level=moderate",
61
63
  "prepack": "node scripts/ensure-bin-executable.mjs",
62
64
  "prepublishOnly": "npm run build"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "shieldcortex-realtime",
3
- "version": "4.14.11",
3
+ "version": "4.16.0",
4
4
  "name": "ShieldCortex Real-time Scanner",
5
5
  "description": "Real-time defence scanning on LLM input, memory extraction on LLM output, and active tool call interception with approval gating.",
6
6
  "kind": null,