shieldcortex 4.37.0 → 4.39.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 (248) hide show
  1. package/dashboard/.next/standalone/dashboard/.next/BUILD_ID +1 -1
  2. package/dashboard/.next/standalone/dashboard/.next/build-manifest.json +2 -2
  3. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.html +2 -2
  4. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.rsc +1 -1
  5. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  6. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  7. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  8. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  9. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  10. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.html +1 -1
  11. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.rsc +1 -1
  12. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  13. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  14. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  15. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  16. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  17. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  18. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.html +1 -1
  19. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.rsc +1 -1
  20. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin/__PAGE__.segment.rsc +1 -1
  21. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin.segment.rsc +1 -1
  22. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  23. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  24. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  25. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  26. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  27. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.html +1 -1
  28. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.rsc +1 -1
  29. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud/__PAGE__.segment.rsc +1 -1
  30. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud.segment.rsc +1 -1
  31. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  32. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_full.segment.rsc +1 -1
  33. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_head.segment.rsc +1 -1
  34. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_index.segment.rsc +1 -1
  35. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_tree.segment.rsc +1 -1
  36. package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
  37. package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +1 -1
  38. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  39. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_full.segment.rsc +1 -1
  40. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
  41. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_index.segment.rsc +1 -1
  42. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  43. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.html +1 -1
  44. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.rsc +1 -1
  45. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture/__PAGE__.segment.rsc +1 -1
  46. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture.segment.rsc +1 -1
  47. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  48. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  49. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_full.segment.rsc +1 -1
  50. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_head.segment.rsc +1 -1
  51. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_index.segment.rsc +1 -1
  52. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_tree.segment.rsc +1 -1
  53. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.html +1 -1
  54. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.rsc +1 -1
  55. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph/__PAGE__.segment.rsc +1 -1
  56. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph.segment.rsc +1 -1
  57. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  58. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  59. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_full.segment.rsc +1 -1
  60. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_head.segment.rsc +1 -1
  61. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_index.segment.rsc +1 -1
  62. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_tree.segment.rsc +1 -1
  63. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.html +1 -1
  64. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.rsc +1 -1
  65. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall/__PAGE__.segment.rsc +1 -1
  66. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall.segment.rsc +1 -1
  67. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  68. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  69. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_full.segment.rsc +1 -1
  70. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_head.segment.rsc +1 -1
  71. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_index.segment.rsc +1 -1
  72. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_tree.segment.rsc +1 -1
  73. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.html +1 -1
  74. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.rsc +1 -1
  75. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory/replay/__PAGE__.segment.rsc +1 -1
  76. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory/replay.segment.rsc +1 -1
  77. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  78. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  79. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_full.segment.rsc +1 -1
  80. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_head.segment.rsc +1 -1
  81. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_index.segment.rsc +1 -1
  82. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_tree.segment.rsc +1 -1
  83. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.html +1 -1
  84. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.rsc +1 -1
  85. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review/__PAGE__.segment.rsc +1 -1
  86. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review.segment.rsc +1 -1
  87. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  88. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  89. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_full.segment.rsc +1 -1
  90. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_head.segment.rsc +1 -1
  91. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_index.segment.rsc +1 -1
  92. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_tree.segment.rsc +1 -1
  93. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.html +1 -1
  94. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.rsc +1 -1
  95. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline/__PAGE__.segment.rsc +1 -1
  96. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline.segment.rsc +1 -1
  97. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  98. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  99. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_full.segment.rsc +1 -1
  100. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_head.segment.rsc +1 -1
  101. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_index.segment.rsc +1 -1
  102. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_tree.segment.rsc +1 -1
  103. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.html +1 -1
  104. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.rsc +1 -1
  105. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory/__PAGE__.segment.rsc +1 -1
  106. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  107. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  108. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_full.segment.rsc +1 -1
  109. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_head.segment.rsc +1 -1
  110. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_index.segment.rsc +1 -1
  111. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_tree.segment.rsc +1 -1
  112. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.html +1 -1
  113. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.rsc +1 -1
  114. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview/__PAGE__.segment.rsc +1 -1
  115. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview.segment.rsc +1 -1
  116. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  117. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_full.segment.rsc +1 -1
  118. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_head.segment.rsc +1 -1
  119. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_index.segment.rsc +1 -1
  120. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_tree.segment.rsc +1 -1
  121. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.html +1 -1
  122. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.rsc +1 -1
  123. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit/__PAGE__.segment.rsc +1 -1
  124. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit.segment.rsc +1 -1
  125. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  126. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  127. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_full.segment.rsc +1 -1
  128. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_head.segment.rsc +1 -1
  129. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_index.segment.rsc +1 -1
  130. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_tree.segment.rsc +1 -1
  131. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.html +1 -1
  132. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.rsc +1 -1
  133. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts/__PAGE__.segment.rsc +1 -1
  134. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts.segment.rsc +1 -1
  135. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  136. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  137. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_full.segment.rsc +1 -1
  138. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_head.segment.rsc +1 -1
  139. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_index.segment.rsc +1 -1
  140. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_tree.segment.rsc +1 -1
  141. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.html +1 -1
  142. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.rsc +1 -1
  143. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome/__PAGE__.segment.rsc +1 -1
  144. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome.segment.rsc +1 -1
  145. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  146. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  147. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_full.segment.rsc +1 -1
  148. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_head.segment.rsc +1 -1
  149. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_index.segment.rsc +1 -1
  150. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_tree.segment.rsc +1 -1
  151. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.html +1 -1
  152. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.rsc +1 -1
  153. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies/__PAGE__.segment.rsc +1 -1
  154. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies.segment.rsc +1 -1
  155. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  156. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  157. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_full.segment.rsc +1 -1
  158. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_head.segment.rsc +1 -1
  159. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_index.segment.rsc +1 -1
  160. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_tree.segment.rsc +1 -1
  161. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.html +1 -1
  162. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.rsc +1 -1
  163. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine/__PAGE__.segment.rsc +1 -1
  164. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine.segment.rsc +1 -1
  165. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  166. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  167. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_full.segment.rsc +1 -1
  168. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_head.segment.rsc +1 -1
  169. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_index.segment.rsc +1 -1
  170. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_tree.segment.rsc +1 -1
  171. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.html +1 -1
  172. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.rsc +1 -1
  173. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection/__PAGE__.segment.rsc +1 -1
  174. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  175. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  176. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_full.segment.rsc +1 -1
  177. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_head.segment.rsc +1 -1
  178. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_index.segment.rsc +1 -1
  179. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_tree.segment.rsc +1 -1
  180. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.html +1 -1
  181. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.rsc +1 -1
  182. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +1 -1
  183. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  184. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  185. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  186. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  187. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  188. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  189. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.html +1 -1
  190. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.rsc +1 -1
  191. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray/__PAGE__.segment.rsc +1 -1
  192. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray.segment.rsc +1 -1
  193. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
  194. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  195. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_full.segment.rsc +1 -1
  196. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_head.segment.rsc +1 -1
  197. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_index.segment.rsc +1 -1
  198. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_tree.segment.rsc +1 -1
  199. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.html +1 -1
  200. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.rsc +1 -1
  201. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain/__PAGE__.segment.rsc +1 -1
  202. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
  203. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  204. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_full.segment.rsc +1 -1
  205. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_head.segment.rsc +1 -1
  206. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_index.segment.rsc +1 -1
  207. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_tree.segment.rsc +1 -1
  208. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.html +1 -1
  209. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.rsc +1 -1
  210. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray/__PAGE__.segment.rsc +1 -1
  211. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray.segment.rsc +1 -1
  212. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  213. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_full.segment.rsc +1 -1
  214. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_head.segment.rsc +1 -1
  215. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_index.segment.rsc +1 -1
  216. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_tree.segment.rsc +1 -1
  217. package/dashboard/.next/standalone/dashboard/.next/server/pages/404.html +1 -1
  218. package/dashboard/.next/standalone/dashboard/.next/server/pages/500.html +2 -2
  219. package/dist/api/routes/admin.js +2 -0
  220. package/dist/api/routes/memories.js +5 -2
  221. package/dist/api/visualization-server.js +1 -0
  222. package/dist/database/inline-schema.js +6 -0
  223. package/dist/database/migrations.js +34 -0
  224. package/dist/database/schema.sql +6 -0
  225. package/dist/defence/audit/logger.js +4 -2
  226. package/dist/defence/audit/queries.js +4 -0
  227. package/dist/defence/audit/retention.js +22 -12
  228. package/dist/defence/iron-dome/audit.js +1 -0
  229. package/dist/defence/pipeline.js +4 -1
  230. package/dist/defence/tool-response-scanner.js +1 -0
  231. package/dist/defence/trust/read-guard.d.ts +45 -0
  232. package/dist/defence/trust/read-guard.js +76 -0
  233. package/dist/defence/trust/resolve-tool-source.js +2 -0
  234. package/dist/defence/types.d.ts +10 -0
  235. package/dist/memory/consolidate.d.ts +2 -1
  236. package/dist/memory/consolidate.js +7 -2
  237. package/dist/memory/lifecycle.js +5 -2
  238. package/dist/memory/store.d.ts +16 -2
  239. package/dist/memory/store.js +100 -6
  240. package/dist/server.js +25 -9
  241. package/dist/tools/context.d.ts +2 -0
  242. package/dist/tools/context.js +30 -5
  243. package/dist/tools/recall.d.ts +15 -0
  244. package/dist/tools/recall.js +39 -3
  245. package/package.json +1 -1
  246. /package/dashboard/.next/standalone/dashboard/.next/static/{Xdk3QuQEKommHIbMSem56 → LfTY3B6uX3j7zNwqqgvPG}/_buildManifest.js +0 -0
  247. /package/dashboard/.next/standalone/dashboard/.next/static/{Xdk3QuQEKommHIbMSem56 → LfTY3B6uX3j7zNwqqgvPG}/_clientMiddlewareManifest.json +0 -0
  248. /package/dashboard/.next/standalone/dashboard/.next/static/{Xdk3QuQEKommHIbMSem56 → LfTY3B6uX3j7zNwqqgvPG}/_ssgManifest.js +0 -0
@@ -21,7 +21,7 @@ import { syncMemoryDeleteToCloud, syncMemoryUpsertToCloud } from '../cloud/memor
21
21
  import { isFeatureEnabled } from '../license/gate.js';
22
22
  import { checkAccess } from '../defence/trust/access-control.js';
23
23
  import { scoreSource } from '../defence/trust/source-scorer.js';
24
- import { logAudit } from '../defence/audit/logger.js';
24
+ import { logAudit, createContentHash } from '../defence/audit/logger.js';
25
25
  import { dispatchWebhook } from '../events/webhooks.js';
26
26
  import { safeJsonParse } from './fts.js';
27
27
  // Internal use of the link API. links.ts also imports from store.ts (getMemoryById,
@@ -230,7 +230,7 @@ function checkRateLimit(source) {
230
230
  // ── Read-Time Access Control ──
231
231
  // Exported because search-recall.ts also calls logAccessDenial inside its
232
232
  // post-search ACL filter (cycle artifact, not intended public API).
233
- export function logAccessDenial(memoryId, source, reason) {
233
+ export function logAccessDenial(memoryId, source, reason, operation = 'read') {
234
234
  const trust = scoreSource(source).score;
235
235
  logAudit({
236
236
  memory_id: memoryId,
@@ -241,6 +241,7 @@ export function logAccessDenial(memoryId, source, reason) {
241
241
  trust_score: trust,
242
242
  sensitivity_level: 'INTERNAL',
243
243
  firewall_result: 'BLOCK',
244
+ operation,
244
245
  anomaly_score: 0,
245
246
  threat_indicators: '[]',
246
247
  blocked_patterns: '[]',
@@ -249,6 +250,58 @@ export function logAccessDenial(memoryId, source, reason) {
249
250
  pipeline_duration_ms: 0,
250
251
  });
251
252
  }
253
+ /**
254
+ * Provenance ledger: record an ALLOWED read. Emitted ONCE per tool call (not per
255
+ * row) to keep the audit table bounded — recall returns up to 50 rows, so a
256
+ * per-row emit would flood it. memory_id carries the single id for single-target
257
+ * reads; the full id list (capped) goes in blocked_patterns for forensics.
258
+ */
259
+ export function logAllowedRead(source, tool, memoryIds, project) {
260
+ if (memoryIds.length === 0)
261
+ return;
262
+ logAudit({
263
+ memory_id: memoryIds.length === 1 ? memoryIds[0] : null,
264
+ project: project ?? null,
265
+ timestamp: new Date().toISOString(),
266
+ source_type: source.type,
267
+ source_identifier: source.identifier,
268
+ trust_score: scoreSource(source).score,
269
+ sensitivity_level: 'INTERNAL',
270
+ firewall_result: 'ALLOW',
271
+ operation: 'read',
272
+ anomaly_score: 0,
273
+ threat_indicators: '[]',
274
+ blocked_patterns: JSON.stringify(memoryIds.slice(0, 50)),
275
+ reason: `read ${memoryIds.length} memor${memoryIds.length === 1 ? 'y' : 'ies'} via ${tool}`,
276
+ fragmentation_score: null,
277
+ pipeline_duration_ms: null,
278
+ });
279
+ }
280
+ /**
281
+ * Provenance ledger: record an ALLOWED delete (one row per deleted memory).
282
+ * memory_id is NULL by design — the row is emitted after the DELETE, and the
283
+ * audit.memory_id FK is ON DELETE SET NULL, so a live reference can't survive.
284
+ * The deleted id is preserved in `reason` + `blocked_patterns` for forensics.
285
+ */
286
+ export function logAllowedDelete(memoryId, source, project) {
287
+ logAudit({
288
+ memory_id: null,
289
+ project: project ?? null,
290
+ timestamp: new Date().toISOString(),
291
+ source_type: source.type,
292
+ source_identifier: source.identifier,
293
+ trust_score: scoreSource(source).score,
294
+ sensitivity_level: 'INTERNAL',
295
+ firewall_result: 'ALLOW',
296
+ operation: 'delete',
297
+ anomaly_score: 0,
298
+ threat_indicators: '[]',
299
+ blocked_patterns: JSON.stringify([memoryId]),
300
+ reason: `deleted memory #${memoryId}`,
301
+ fragmentation_score: null,
302
+ pipeline_duration_ms: null,
303
+ });
304
+ }
252
305
  /**
253
306
  * Filter raw DB rows by access control before converting to Memory objects.
254
307
  * Returns only rows the source is allowed to read.
@@ -324,6 +377,7 @@ export function addMemory(input, config = DEFAULT_CONFIG, source) {
324
377
  trust_score: scoreSource(source).score,
325
378
  sensitivity_level: 'INTERNAL',
326
379
  firewall_result: 'BLOCK',
380
+ operation: 'write',
327
381
  anomaly_score: 1.0,
328
382
  threat_indicators: JSON.stringify(['rate_limit_exceeded']),
329
383
  blocked_patterns: '[]',
@@ -413,8 +467,11 @@ export function addMemory(input, config = DEFAULT_CONFIG, source) {
413
467
  // defenceResult is always set now (every write is scanned), so always stamp
414
468
  // the pipeline's real trust + sensitivity alongside the resolved source —
415
469
  // no source-less branch can default to trust 1.0 / unscanned INTERNAL.
416
- db.prepare(`UPDATE memories SET trust_score = ?, sensitivity_level = ?, source = ? WHERE id = ?`)
417
- .run(defenceResult.trust.score, defenceResult.sensitivity.level, sourceDetails.sourceValue, result.lastInsertRowid);
470
+ db.prepare(`UPDATE memories SET trust_score = ?, sensitivity_level = ?, source = ?, content_hash = ? WHERE id = ?`)
471
+ // content_hash = SHA-256 of the SUBMITTED content (a write-time provenance
472
+ // snapshot), matching the write-audit row in pipeline.ts. Consistent for
473
+ // >10KB memories too (where the STORED content is truncated).
474
+ .run(defenceResult.trust.score, defenceResult.sensitivity.level, sourceDetails.sourceValue, createContentHash(input.content), result.lastInsertRowid);
418
475
  return result.lastInsertRowid;
419
476
  })();
420
477
  const memory = getMemoryById(insertedId);
@@ -701,6 +758,14 @@ export function updateMemory(id, updates) {
701
758
  if (embeddedTextChanged) {
702
759
  fields.push('embedding = NULL');
703
760
  }
761
+ // STALENESS: content_hash is a write-time integrity snapshot. When content
762
+ // changes it must be recomputed in the SAME UPDATE — otherwise the stored hash
763
+ // refers to the old content and any tamper check false-positives on a
764
+ // legitimately-edited memory.
765
+ if (updates.content !== undefined) {
766
+ fields.push('content_hash = ?');
767
+ values.push(createContentHash(updates.content));
768
+ }
704
769
  if (fields.length === 0)
705
770
  return existing;
706
771
  values.push(id);
@@ -721,6 +786,28 @@ export function updateMemory(id, updates) {
721
786
  console.error('[shieldcortex] Entity extraction refresh failed:', e);
722
787
  }
723
788
  }
789
+ // Provenance ledger: a content/title change is an update-class mutation.
790
+ if (updates.content !== undefined || updates.title !== undefined) {
791
+ const changed = [updates.title !== undefined ? 'title' : null, updates.content !== undefined ? 'content' : null].filter(Boolean).join('+');
792
+ logAudit({
793
+ memory_id: id,
794
+ project: updatedMemory.project ?? null,
795
+ timestamp: new Date().toISOString(),
796
+ source_type: 'cli',
797
+ source_identifier: 'memory-update',
798
+ trust_score: updatedMemory.trustScore ?? 1,
799
+ sensitivity_level: updatedMemory.sensitivityLevel ?? 'INTERNAL',
800
+ firewall_result: 'ALLOW',
801
+ operation: 'update',
802
+ content_hash: updates.content !== undefined ? createContentHash(updates.content) : null,
803
+ anomaly_score: 0,
804
+ threat_indicators: '[]',
805
+ blocked_patterns: '[]',
806
+ reason: `updated memory #${id} (${changed})`,
807
+ fragmentation_score: null,
808
+ pipeline_duration_ms: null,
809
+ });
810
+ }
724
811
  // Emit event for real-time dashboard (in-process)
725
812
  emitMemoryUpdated(updatedMemory);
726
813
  // Persist event for cross-process IPC (MCP → Dashboard)
@@ -804,6 +891,7 @@ export function mergeMemories(keptId, removedId, options, source = { type: 'cli'
804
891
  db.prepare(`
805
892
  UPDATE memories
806
893
  SET content = ?,
894
+ content_hash = ?,
807
895
  tags = ?,
808
896
  salience = ?,
809
897
  project = ?,
@@ -822,7 +910,7 @@ export function mergeMemories(keptId, removedId, options, source = { type: 'cli'
822
910
  embedding = NULL,
823
911
  updated_at = CURRENT_TIMESTAMP
824
912
  WHERE id = ?
825
- `).run(mergedContent, JSON.stringify(mergedTags), mergedSalience, mergedProject, JSON.stringify(mergedMetadata), mergedScope, mergedTransferable ? 1 : 0, mergedStatus, mergedPinned ? 1 : 0, mergedReviewedBy, new Date().toISOString(), mergedTrustScore, mergedSensitivity, mergedCloudExcluded ? 1 : 0, mergedAccessCount, mergedLastAccessed, kept.id);
913
+ `).run(mergedContent, createContentHash(mergedContent), JSON.stringify(mergedTags), mergedSalience, mergedProject, JSON.stringify(mergedMetadata), mergedScope, mergedTransferable ? 1 : 0, mergedStatus, mergedPinned ? 1 : 0, mergedReviewedBy, new Date().toISOString(), mergedTrustScore, mergedSensitivity, mergedCloudExcluded ? 1 : 0, mergedAccessCount, mergedLastAccessed, kept.id);
826
914
  const updatedMemory = getMemoryById(kept.id);
827
915
  try {
828
916
  const extraction = extractFromMemory(updatedMemory.title, updatedMemory.content, updatedMemory.category);
@@ -856,7 +944,7 @@ export function deleteMemory(id, source) {
856
944
  if (row) {
857
945
  const policy = checkAccess({ id: row.id, source: row.source, sensitivity_level: row.sensitivity_level }, source, 'delete');
858
946
  if (!policy.canDelete) {
859
- logAccessDenial(id, source, policy.reason);
947
+ logAccessDenial(id, source, policy.reason, 'delete');
860
948
  return false;
861
949
  }
862
950
  }
@@ -874,6 +962,12 @@ export function deleteMemory(id, source) {
874
962
  const result = db.prepare('DELETE FROM memories WHERE id = ?').run(id);
875
963
  // Emit event for real-time dashboard (in-process)
876
964
  if (result.changes > 0 && memory) {
965
+ // Provenance ledger: record the allowed delete (one row per memory) when the
966
+ // caller is attributed. Internal source-less deletes (merge/consolidation)
967
+ // are machinery, not user actions, so they're not audited here.
968
+ if (source) {
969
+ logAllowedDelete(id, source, memory.project ?? null);
970
+ }
877
971
  if (isFeatureEnabled('cloud_sync')) {
878
972
  syncMemoryDeleteToCloud(memory);
879
973
  syncGraphDeleteForMemoryToCloud(memory);
package/dist/server.js CHANGED
@@ -12,11 +12,11 @@ import { getCurrentVersion } from './api/version.js';
12
12
  import { initProjectContext, getActiveProject, setActiveProject, getProjectContextInfo, GLOBAL_PROJECT_SENTINEL, } from './context/project-context.js';
13
13
  // Import tools
14
14
  import { executeRemember, formatRememberResult } from './tools/remember.js';
15
- import { executeRecall, formatRecallResult, executeGetMemory, formatMemory } from './tools/recall.js';
15
+ import { executeRecall, formatRecallResult, executeGetMemory, executeGetRelated, formatMemory } from './tools/recall.js';
16
16
  import { executeForget, formatForgetResult } from './tools/forget.js';
17
17
  import { executeGetContext, executeStartSession, executeEndSession, executeConsolidate, executeStats, formatStats, executeExport, executeImport, } from './tools/context.js';
18
18
  import { generateContextSummary, formatContextSummary, fullCleanup } from './memory/consolidate.js';
19
- import { getHighPriorityMemories, getRecentMemories, getRelatedMemories, createMemoryLink } from './memory/store.js';
19
+ import { getHighPriorityMemories, getRecentMemories, createMemoryLink } from './memory/store.js';
20
20
  import { detectContradictions } from './memory/contradiction.js';
21
21
  import { handleGraphQuery, handleGraphEntities, handleGraphExplain } from './tools/graph.js';
22
22
  import { checkDatabaseSize } from './database/init.js';
@@ -25,6 +25,7 @@ import { scanExistingMemories } from './defence/scanner/index.js';
25
25
  import { resolveToolSource as resolveToolSourceImpl } from './defence/trust/resolve-tool-source.js';
26
26
  import { scanToolResponse, shouldScanToolResponse } from './defence/tool-response-scanner.js';
27
27
  import { UNTRUSTED_TOOL_TAG } from './defence/tool-response-enforce.js';
28
+ import { guardReadBySensitivity, guardContextSummary } from './defence/trust/read-guard.js';
28
29
  import { getToolResponseScanConfig } from './cloud/config.js';
29
30
  import { checkKillPhrase } from './defence/iron-dome/index.js';
30
31
  import { isKillSwitchActive, getKillSwitchMeta, assertOperationAllowed, activateKillSwitch, deactivateKillSwitch, KillSwitchError, } from './api/control.js';
@@ -410,8 +411,10 @@ Returns: architecture decisions, patterns, pending items, recent activity.`, {
410
411
  // Export memories
411
412
  server.tool('export_memories', 'Export memories as JSON for backup.', {
412
413
  project: z.string().optional().describe('Project scope. Auto-detected if not provided. Use "*" for all projects.'),
414
+ source: sourceParam,
413
415
  }, { title: 'Export Memories', readOnlyHint: true, destructiveHint: false, idempotentHint: true }, withKillSwitchGuard('memory_read', withResponseScan('export_memories', async (args) => {
414
- const result = executeExport(args);
416
+ const source = resolveToolSource(args.source, 'export_memories');
417
+ const result = executeExport({ ...args, source });
415
418
  return {
416
419
  content: [{
417
420
  type: 'text',
@@ -456,8 +459,14 @@ Returns: architecture decisions, patterns, pending items, recent activity.`, {
456
459
  // Get Related Memories
457
460
  server.tool('get_related', 'Get memories related to a specific memory. Shows connections and relationships.', {
458
461
  id: z.number().describe('Memory ID to find relationships for'),
462
+ source: sourceParam,
459
463
  }, { title: 'Get Related Memories', readOnlyHint: true, destructiveHint: false, idempotentHint: true }, withKillSwitchGuard('memory_read', withResponseScan('get_related', async (args) => {
460
- const related = getRelatedMemories(args.id);
464
+ const source = resolveToolSource(args.source, 'get_related');
465
+ const result = executeGetRelated({ id: args.id, source });
466
+ if (!result.success) {
467
+ return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true };
468
+ }
469
+ const related = result.related;
461
470
  if (related.length === 0) {
462
471
  return { content: [{ type: 'text', text: 'No related memories found.' }] };
463
472
  }
@@ -536,7 +545,10 @@ but you can use this tool to check for new contradictions at any time.`, {
536
545
  category: args.category,
537
546
  minScore: args.minScore,
538
547
  limit: args.limit,
539
- });
548
+ }).filter(
549
+ // Drop a pair if either side is RESTRICTED/quarantined (don't leak a
550
+ // credential-class memory's title via a contradiction listing).
551
+ (c) => guardReadBySensitivity([c.memoryA, c.memoryB]).length === 2);
540
552
  if (contradictions.length === 0) {
541
553
  return { content: [{ type: 'text', text: 'No contradictions detected.' }] };
542
554
  }
@@ -942,7 +954,8 @@ Runs injection detection (40+ patterns) and credential leak scanning (25+ provid
942
954
  if (isKillSwitchActive()) {
943
955
  return { contents: [{ uri: 'memory://context', mimeType: 'text/plain', text: '[KILL SWITCH ACTIVE] Memory access blocked.' }] };
944
956
  }
945
- const summary = await generateContextSummary();
957
+ // Shared-context resource: strip RESTRICTED + quarantined (sensitivity guard).
958
+ const summary = guardContextSummary(await generateContextSummary());
946
959
  return {
947
960
  contents: [{
948
961
  uri: 'memory://context',
@@ -956,7 +969,8 @@ Runs injection detection (40+ patterns) and credential leak scanning (25+ provid
956
969
  if (isKillSwitchActive()) {
957
970
  return { contents: [{ uri: 'memory://important', mimeType: 'text/plain', text: '[KILL SWITCH ACTIVE] Memory access blocked.' }] };
958
971
  }
959
- const memories = getHighPriorityMemories(20);
972
+ // Shared-context resource: strip RESTRICTED + quarantined before exposing content.
973
+ const memories = guardReadBySensitivity(getHighPriorityMemories(20));
960
974
  const text = memories.map(m => `## ${m.title}\n${m.content}\n*${m.category} | ${(m.salience * 100).toFixed(0)}% salience*\n`).join('\n');
961
975
  return {
962
976
  contents: [{
@@ -971,7 +985,8 @@ Runs injection detection (40+ patterns) and credential leak scanning (25+ provid
971
985
  if (isKillSwitchActive()) {
972
986
  return { contents: [{ uri: 'memory://recent', mimeType: 'text/plain', text: '[KILL SWITCH ACTIVE] Memory access blocked.' }] };
973
987
  }
974
- const memories = getRecentMemories(15);
988
+ // Shared-context resource: strip RESTRICTED + quarantined before exposing content.
989
+ const memories = guardReadBySensitivity(getRecentMemories(15));
975
990
  const text = memories.map(m => `- **${m.title}** (${m.category}): ${m.content.slice(0, 100)}...`).join('\n');
976
991
  return {
977
992
  contents: [{
@@ -991,7 +1006,8 @@ Runs injection detection (40+ patterns) and credential leak scanning (25+ provid
991
1006
  messages: [{ role: 'user', content: { type: 'text', text: '[KILL SWITCH ACTIVE] Context restoration blocked. Use iron_dome_resume to resume.' } }],
992
1007
  };
993
1008
  }
994
- const summary = await generateContextSummary();
1009
+ // Shared-context prompt: strip RESTRICTED + quarantined (sensitivity guard).
1010
+ const summary = guardContextSummary(await generateContextSummary());
995
1011
  const context = formatContextSummary(summary);
996
1012
  return {
997
1013
  messages: [{
@@ -8,6 +8,7 @@ import { z } from 'zod';
8
8
  import { getMemoryStats } from '../memory/store.js';
9
9
  import { type SalienceDistribution } from '../memory/metrics.js';
10
10
  import { Memory, ContextSummary, ConsolidationResult } from '../memory/types.js';
11
+ import type { DefenceSource } from '../defence/types.js';
11
12
  export declare const getContextSchema: z.ZodObject<{
12
13
  project: z.ZodOptional<z.ZodString>;
13
14
  query: z.ZodOptional<z.ZodString>;
@@ -132,6 +133,7 @@ export declare const exportSchema: z.ZodObject<{
132
133
  }>;
133
134
  export declare function executeExport(input: {
134
135
  project?: string;
136
+ source?: DefenceSource;
135
137
  }): {
136
138
  success: boolean;
137
139
  data?: string;
@@ -6,10 +6,11 @@
6
6
  */
7
7
  import { z } from 'zod';
8
8
  import { generateContextSummary, formatContextSummary, startSession, endSession, getSuggestedContext, consolidate, previewConsolidation, exportMemories, importMemories, } from '../memory/consolidate.js';
9
- import { getMemoryStats } from '../memory/store.js';
9
+ import { getMemoryStats, logAllowedRead } from '../memory/store.js';
10
10
  import { getSalienceDistribution } from '../memory/metrics.js';
11
11
  import { getDatabase } from '../database/init.js';
12
12
  import { resolveProject } from '../context/project-context.js';
13
+ import { guardReadBySensitivity, guardContextSummary } from '../defence/trust/read-guard.js';
13
14
  // Input schema for getting context
14
15
  export const getContextSchema = z.object({
15
16
  project: z.string().optional().describe('Project to get context for'),
@@ -29,12 +30,18 @@ export async function executeGetContext(input) {
29
30
  // Resolve project (auto-detect if not provided)
30
31
  const resolvedProject = resolveProject(input.project);
31
32
  const projectFilter = resolvedProject ?? undefined;
33
+ // Read guard: get_context is a SHARED-CONTEXT bootstrap surface that feeds
34
+ // the prompt, so strip RESTRICTED + quarantined for everyone (matching the
35
+ // .mjs prompt hooks) but keep INTERNAL project context available — a
36
+ // sensitivity guard, not the per-caller own-only ACL, so a low-trust
37
+ // subagent isn't blacked out from the context it needs. Owner-specific
38
+ // RESTRICTED retrieval is the explicit get_memory tool's job.
32
39
  // Generate context summary
33
- const summary = await generateContextSummary(projectFilter);
40
+ const summary = guardContextSummary(await generateContextSummary(projectFilter));
34
41
  // If there's a query, also get specifically relevant memories
35
42
  let relevantMemories = [];
36
43
  if (input.query) {
37
- relevantMemories = await getSuggestedContext(input.query, projectFilter, 5);
44
+ relevantMemories = guardReadBySensitivity(await getSuggestedContext(input.query, projectFilter, 5));
38
45
  }
39
46
  // Format based on requested format
40
47
  let context;
@@ -54,6 +61,16 @@ export async function executeGetContext(input) {
54
61
  }
55
62
  break;
56
63
  }
64
+ // Provenance ledger: one allowed-read row per get_context call, covering
65
+ // every memory surfaced into the context.
66
+ const source = input.source;
67
+ if (source) {
68
+ const surfacedIds = [
69
+ ...summary.recentMemories, ...summary.keyDecisions,
70
+ ...summary.activePatterns, ...summary.pendingItems, ...relevantMemories,
71
+ ].map(m => m.id);
72
+ logAllowedRead(source, 'get_context', [...new Set(surfacedIds)], projectFilter);
73
+ }
57
74
  return {
58
75
  success: true,
59
76
  context,
@@ -133,7 +150,10 @@ export async function executeStartSession(input) {
133
150
  const resolvedProject = resolveProject(input.project);
134
151
  const projectFilter = resolvedProject ?? undefined;
135
152
  const { sessionId, context } = await startSession(projectFilter);
136
- const formattedContext = formatContextSummary(context);
153
+ // Read guard: start_session is a shared-context bootstrap surface (sibling of
154
+ // get_context) — strip RESTRICTED + quarantined before formatting so the
155
+ // session preamble never leaks credential-class memories.
156
+ const formattedContext = formatContextSummary(guardContextSummary(context));
137
157
  return {
138
158
  success: true,
139
159
  sessionId,
@@ -257,8 +277,13 @@ export function executeExport(input) {
257
277
  // Resolve project (auto-detect if not provided)
258
278
  const resolvedProject = resolveProject(input.project);
259
279
  const projectFilter = resolvedProject ?? undefined;
260
- const data = exportMemories(projectFilter);
280
+ // Read ACL: filter the bulk dump to rows this caller may read.
281
+ const data = exportMemories(projectFilter, input.source);
261
282
  const memories = JSON.parse(data);
283
+ // Provenance ledger: a bulk export is the highest-value read to audit.
284
+ if (input.source) {
285
+ logAllowedRead(input.source, 'export_memories', memories.map(m => m.id), projectFilter);
286
+ }
262
287
  return {
263
288
  success: true,
264
289
  data,
@@ -4,6 +4,7 @@
4
4
  * Search and retrieve memories using semantic search and filters.
5
5
  */
6
6
  import { z } from 'zod';
7
+ import { getRelatedMemories } from '../memory/store.js';
7
8
  import { Memory } from '../memory/types.js';
8
9
  import type { DefenceSource } from '../defence/types.js';
9
10
  export declare const recallSchema: z.ZodObject<{
@@ -114,3 +115,17 @@ export declare function executeGetMemory(input: {
114
115
  memory?: Memory;
115
116
  error?: string;
116
117
  };
118
+ /**
119
+ * Execute the get_related tool — related memories, ACL-filtered.
120
+ *
121
+ * Related links can cross trust/sensitivity boundaries, so the same read ACL
122
+ * applies: a caller only sees related memories it is permitted to read.
123
+ */
124
+ export declare function executeGetRelated(input: {
125
+ id: number;
126
+ source?: DefenceSource;
127
+ }): {
128
+ success: boolean;
129
+ related?: ReturnType<typeof getRelatedMemories>;
130
+ error?: string;
131
+ };
@@ -4,11 +4,12 @@
4
4
  * Search and retrieve memories using semantic search and filters.
5
5
  */
6
6
  import { z } from 'zod';
7
- import { searchMemories, recallWithEmbeddings, accessMemory, getRecentMemories, getHighPriorityMemories } from '../memory/store.js';
7
+ import { searchMemories, recallWithEmbeddings, accessMemory, getRecentMemories, getHighPriorityMemories, getRelatedMemories, logAllowedRead } from '../memory/store.js';
8
8
  import { formatTimeSinceAccess } from '../memory/decay.js';
9
9
  import { MemoryNotFoundError, formatErrorForMcp } from '../errors.js';
10
10
  import { resolveProject } from '../context/project-context.js';
11
11
  import { memoryFreshnessWarning } from '../memory/staleness.js';
12
+ import { guardReadMemories, guardReadMemory } from '../defence/trust/read-guard.js';
12
13
  const sourceSchema = z.object({
13
14
  type: z.enum(['user', 'cli', 'hook', 'email', 'web', 'agent', 'file', 'api', 'tool_response']),
14
15
  identifier: z.string(),
@@ -99,6 +100,11 @@ export async function executeRecall(input) {
99
100
  }
100
101
  break;
101
102
  }
103
+ // Read ACL: drop quarantined + rows this caller may not read (RESTRICTED
104
+ // isolation / own-only for low trust). Belt-and-braces — the recent/important
105
+ // store helpers + search already apply access control, but this keeps every
106
+ // recall mode uniform and never reinforces a row the caller can't see.
107
+ memories = guardReadMemories(memories, source);
102
108
  // Access each memory to reinforce it
103
109
  memories = memories.map(m => accessMemory(m.id, undefined, source) || m);
104
110
  // v4.0.0: Append staleness warnings to old memories
@@ -109,6 +115,9 @@ export async function executeRecall(input) {
109
115
  }
110
116
  return m;
111
117
  });
118
+ // Provenance ledger: one allowed-read row per recall call (not per memory).
119
+ if (source)
120
+ logAllowedRead(source, `recall:${input.mode}`, memories.map(m => m.id), projectFilter);
112
121
  return {
113
122
  success: true,
114
123
  memories,
@@ -180,14 +189,41 @@ export const getMemorySchema = z.object({
180
189
  export function executeGetMemory(input) {
181
190
  try {
182
191
  const memory = accessMemory(input.id, undefined, input.source);
183
- if (!memory) {
192
+ // Read ACL: a caller that may not read this memory gets a not-found, never
193
+ // the content (don't reveal existence of RESTRICTED / other-source rows).
194
+ const allowed = guardReadMemory(memory, input.source);
195
+ if (!allowed) {
184
196
  const error = new MemoryNotFoundError(input.id);
185
197
  return {
186
198
  success: false,
187
199
  error: error.toUserMessage(),
188
200
  };
189
201
  }
190
- return { success: true, memory };
202
+ if (input.source)
203
+ logAllowedRead(input.source, 'get_memory', [allowed.id], allowed.project ?? null);
204
+ return { success: true, memory: allowed };
205
+ }
206
+ catch (error) {
207
+ return {
208
+ success: false,
209
+ error: formatErrorForMcp(error),
210
+ };
211
+ }
212
+ }
213
+ /**
214
+ * Execute the get_related tool — related memories, ACL-filtered.
215
+ *
216
+ * Related links can cross trust/sensitivity boundaries, so the same read ACL
217
+ * applies: a caller only sees related memories it is permitted to read.
218
+ */
219
+ export function executeGetRelated(input) {
220
+ try {
221
+ const related = getRelatedMemories(input.id);
222
+ const allowedIds = new Set(guardReadMemories(related.map((r) => r.memory), input.source).map((m) => m.id));
223
+ if (input.source && allowedIds.size > 0) {
224
+ logAllowedRead(input.source, 'get_related', [...allowedIds]);
225
+ }
226
+ return { success: true, related: related.filter((r) => allowedIds.has(r.memory.id)) };
191
227
  }
192
228
  catch (error) {
193
229
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shieldcortex",
3
- "version": "4.37.0",
3
+ "version": "4.39.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",