shieldcortex 4.11.1 → 4.12.1

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 (224) hide show
  1. package/README.md +3 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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/doctor.js +37 -0
  214. package/dist/index.js +5 -1
  215. package/dist/setup/deep-clean.d.ts +126 -0
  216. package/dist/setup/deep-clean.js +396 -0
  217. package/dist/setup/uninstall.d.ts +2 -0
  218. package/dist/setup/uninstall.js +42 -1
  219. package/hooks/openclaw/cortex-memory/HOOK.md +3 -3
  220. package/package.json +1 -1
  221. package/plugins/openclaw/dist/openclaw.plugin.json +5 -1
  222. /package/dashboard/.next/standalone/dashboard/.next/static/{Z4iHJ2EI_hUaAO4mHtKgU → HNwybFN0dVEYkNsYrSnQA}/_buildManifest.js +0 -0
  223. /package/dashboard/.next/standalone/dashboard/.next/static/{Z4iHJ2EI_hUaAO4mHtKgU → HNwybFN0dVEYkNsYrSnQA}/_clientMiddlewareManifest.json +0 -0
  224. /package/dashboard/.next/standalone/dashboard/.next/static/{Z4iHJ2EI_hUaAO4mHtKgU → HNwybFN0dVEYkNsYrSnQA}/_ssgManifest.js +0 -0
@@ -0,0 +1,396 @@
1
+ /**
2
+ * Deep-clean / residue detection for ShieldCortex ↔ OpenClaw integration.
3
+ *
4
+ * The standard `uninstall` and `uninstallPlugin` code paths only fire when
5
+ * the on-disk artefacts they expected are still present. Partial uninstalls,
6
+ * manual cleanups, and version-to-version shape changes left orphaned config
7
+ * entries in `~/.openclaw/openclaw.json` and `~/.openclaw/workspace/.clawhub/lock.json`
8
+ * that kept producing "plugin references without files" and "missing skill file"
9
+ * warnings until purged by hand (see incident notes 2026-04-23/24).
10
+ *
11
+ * This module scans every known residue location once, independently of disk
12
+ * state, and offers a single surgical clean-up pass.
13
+ *
14
+ * Scope: read/write of JSON config files + directory removal under the user's
15
+ * home directory. No network, no sudo, no shell invocation.
16
+ */
17
+ import fs from 'fs';
18
+ import path from 'path';
19
+ import os from 'os';
20
+ import { execSync } from 'child_process';
21
+ const PLUGIN_ID = 'shieldcortex-realtime';
22
+ const HOOK_NAME = 'cortex-memory';
23
+ /**
24
+ * Resolve the real user's home directory (mirrors openclaw.ts behaviour so the
25
+ * two modules agree on which home to touch under sudo).
26
+ */
27
+ function resolveHome() {
28
+ const sudoUser = process.env.SUDO_USER;
29
+ if (sudoUser) {
30
+ try {
31
+ const entry = execSync(`getent passwd ${sudoUser}`, {
32
+ encoding: 'utf-8',
33
+ timeout: 5000,
34
+ }).trim();
35
+ const homeDir = entry.split(':')[5];
36
+ if (homeDir && fs.existsSync(homeDir))
37
+ return homeDir;
38
+ }
39
+ catch {
40
+ // getent not available (macOS)
41
+ }
42
+ }
43
+ return os.homedir();
44
+ }
45
+ function readJsonOrNull(file) {
46
+ if (!fs.existsSync(file))
47
+ return null;
48
+ try {
49
+ const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
50
+ return typeof parsed === 'object' && parsed !== null
51
+ ? parsed
52
+ : null;
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ function writeJson(file, data) {
59
+ fs.mkdirSync(path.dirname(file), { recursive: true });
60
+ fs.writeFileSync(file, JSON.stringify(data, null, 2) + '\n', 'utf-8');
61
+ }
62
+ function getPath(root, keyPath) {
63
+ let node = root;
64
+ for (const key of keyPath) {
65
+ if (typeof node !== 'object' || node === null)
66
+ return undefined;
67
+ node = node[key];
68
+ }
69
+ return node;
70
+ }
71
+ function deletePath(root, keyPath) {
72
+ if (keyPath.length === 0)
73
+ return false;
74
+ let node = root;
75
+ for (let i = 0; i < keyPath.length - 1; i++) {
76
+ const next = node[keyPath[i]];
77
+ if (typeof next !== 'object' || next === null)
78
+ return false;
79
+ node = next;
80
+ }
81
+ const leaf = keyPath[keyPath.length - 1];
82
+ if (leaf in node) {
83
+ delete node[leaf];
84
+ return true;
85
+ }
86
+ return false;
87
+ }
88
+ function filterArrayAtPath(root, keyPath, contains) {
89
+ const target = getPath(root, keyPath);
90
+ if (!Array.isArray(target))
91
+ return false;
92
+ const before = target.length;
93
+ const filtered = target.filter((entry) => !(typeof entry === 'string' && entry.includes(contains)));
94
+ if (filtered.length === before)
95
+ return false;
96
+ // Re-walk and assign back so we don't rely on aliasing
97
+ let node = root;
98
+ for (let i = 0; i < keyPath.length - 1; i++) {
99
+ node = node[keyPath[i]];
100
+ }
101
+ node[keyPath[keyPath.length - 1]] = filtered;
102
+ return true;
103
+ }
104
+ /**
105
+ * Build the full list of known residue locations and whether each one is
106
+ * currently populated. Pure read — no mutation.
107
+ */
108
+ export function scanForResidue() {
109
+ const home = resolveHome();
110
+ const openclawJson = path.join(home, '.openclaw', 'openclaw.json');
111
+ const clawhubLock = path.join(home, '.openclaw', 'workspace', '.clawhub', 'lock.json');
112
+ const cfg = readJsonOrNull(openclawJson) ?? {};
113
+ const lock = readJsonOrNull(clawhubLock) ?? {};
114
+ const paths = [];
115
+ // ── openclaw.json: plugins ─────────────────────────────
116
+ paths.push({
117
+ description: `openclaw.json: .plugins.installs["${PLUGIN_ID}"]`,
118
+ removal: { kind: 'delete-config-key', file: openclawJson, keyPath: ['plugins', 'installs', PLUGIN_ID] },
119
+ present: !!getPath(cfg, ['plugins', 'installs', PLUGIN_ID]),
120
+ category: 'plugin-config',
121
+ });
122
+ paths.push({
123
+ description: `openclaw.json: .plugins.entries["${PLUGIN_ID}"]`,
124
+ removal: { kind: 'delete-config-key', file: openclawJson, keyPath: ['plugins', 'entries', PLUGIN_ID] },
125
+ present: !!getPath(cfg, ['plugins', 'entries', PLUGIN_ID]),
126
+ category: 'plugin-config',
127
+ });
128
+ paths.push({
129
+ description: `openclaw.json: .plugins.allow[] contains "${PLUGIN_ID}"`,
130
+ removal: { kind: 'filter-config-array', file: openclawJson, keyPath: ['plugins', 'allow'], contains: PLUGIN_ID },
131
+ present: (() => {
132
+ const arr = getPath(cfg, ['plugins', 'allow']);
133
+ return Array.isArray(arr) && arr.some((e) => typeof e === 'string' && e.includes(PLUGIN_ID));
134
+ })(),
135
+ category: 'plugin-config',
136
+ });
137
+ paths.push({
138
+ description: `openclaw.json: .plugins.load.paths[] contains "${PLUGIN_ID}"`,
139
+ removal: { kind: 'filter-config-array', file: openclawJson, keyPath: ['plugins', 'load', 'paths'], contains: PLUGIN_ID },
140
+ present: (() => {
141
+ const arr = getPath(cfg, ['plugins', 'load', 'paths']);
142
+ return Array.isArray(arr) && arr.some((e) => typeof e === 'string' && e.includes(PLUGIN_ID));
143
+ })(),
144
+ category: 'plugin-config',
145
+ });
146
+ // ── openclaw.json: hooks (both modern and legacy shapes) ─
147
+ paths.push({
148
+ description: 'openclaw.json: .hooks.shieldcortex',
149
+ removal: { kind: 'delete-config-key', file: openclawJson, keyPath: ['hooks', 'shieldcortex'] },
150
+ present: !!getPath(cfg, ['hooks', 'shieldcortex']),
151
+ category: 'hook-config',
152
+ });
153
+ paths.push({
154
+ description: 'openclaw.json: .hooks.internal.installs.shieldcortex',
155
+ removal: { kind: 'delete-config-key', file: openclawJson, keyPath: ['hooks', 'internal', 'installs', 'shieldcortex'] },
156
+ present: !!getPath(cfg, ['hooks', 'internal', 'installs', 'shieldcortex']),
157
+ category: 'hook-config',
158
+ });
159
+ paths.push({
160
+ description: 'openclaw.json: .hooks.internal.entries.shieldcortex',
161
+ removal: { kind: 'delete-config-key', file: openclawJson, keyPath: ['hooks', 'internal', 'entries', 'shieldcortex'] },
162
+ present: !!getPath(cfg, ['hooks', 'internal', 'entries', 'shieldcortex']),
163
+ category: 'hook-config',
164
+ });
165
+ paths.push({
166
+ description: 'openclaw.json: .hooks.internal.allow[] contains "shieldcortex"',
167
+ removal: { kind: 'filter-config-array', file: openclawJson, keyPath: ['hooks', 'internal', 'allow'], contains: 'shieldcortex' },
168
+ present: (() => {
169
+ const arr = getPath(cfg, ['hooks', 'internal', 'allow']);
170
+ return Array.isArray(arr) && arr.some((e) => typeof e === 'string' && e.includes('shieldcortex'));
171
+ })(),
172
+ category: 'hook-config',
173
+ });
174
+ // ── clawhub lock ────────────────────────────────────────
175
+ paths.push({
176
+ description: 'clawhub/lock.json: .skills.shieldcortex',
177
+ removal: { kind: 'delete-config-key', file: clawhubLock, keyPath: ['skills', 'shieldcortex'] },
178
+ present: !!getPath(lock, ['skills', 'shieldcortex']),
179
+ category: 'clawhub-skill-lock',
180
+ });
181
+ // ── filesystem ──────────────────────────────────────────
182
+ const dirEntries = [
183
+ // Current canonical paths (these ARE the install when present)
184
+ { dir: path.join(home, '.openclaw', 'hooks', HOOK_NAME), category: 'hook-dir' },
185
+ { dir: path.join(home, '.claude', 'hooks', HOOK_NAME), category: 'hook-dir' },
186
+ { dir: path.join(home, '.openclaw', 'extensions', PLUGIN_ID), category: 'plugin-dir' },
187
+ // Legacy paths — always orphaned when present (migrations should remove them)
188
+ { dir: path.join(home, '.openclaw', 'hooks', 'internal', HOOK_NAME), category: 'legacy-hook-dir' },
189
+ { dir: path.join(home, '.openclaw', 'hooks', 'shieldcortex'), category: 'legacy-hook-dir' },
190
+ { dir: path.join(home, '.claude', 'hooks', 'internal', HOOK_NAME), category: 'legacy-hook-dir' },
191
+ ];
192
+ for (const { dir, category } of dirEntries) {
193
+ paths.push({
194
+ description: dir,
195
+ removal: { kind: 'delete-directory', path: dir },
196
+ present: fs.existsSync(dir),
197
+ category,
198
+ });
199
+ }
200
+ const dirtyCount = paths.filter((p) => p.present).length;
201
+ const cleanCount = paths.length - dirtyCount;
202
+ return { paths, dirtyCount, cleanCount };
203
+ }
204
+ /**
205
+ * Detect whether the SC plugin / hook are currently installed on disk.
206
+ * Used by `scanForOrphans()` to tell legitimate install state from true orphans.
207
+ */
208
+ function detectInstallState() {
209
+ const home = resolveHome();
210
+ const pluginManifest = path.join(home, '.openclaw', 'extensions', PLUGIN_ID, 'openclaw.plugin.json');
211
+ const pluginInstalled = fs.existsSync(pluginManifest);
212
+ const hookCandidates = [
213
+ path.join(home, '.openclaw', 'hooks', HOOK_NAME),
214
+ path.join(home, '.claude', 'hooks', HOOK_NAME),
215
+ ];
216
+ const hookInstalled = hookCandidates.some((d) => fs.existsSync(d));
217
+ return { pluginInstalled, hookInstalled };
218
+ }
219
+ /**
220
+ * Return only residue entries that are TRUE ORPHANS — meaning the config /
221
+ * lock-file entry references a ShieldCortex artefact that is NOT currently
222
+ * installed on disk, OR it's a legacy path that shouldn't exist anymore.
223
+ *
224
+ * This is what `shieldcortex doctor` wants: it should flag partial-uninstall
225
+ * wreckage without flagging every legitimate install as "residue" (which was
226
+ * the v4.12.0 bug — the doctor couldn't tell a healthy install from a leftover).
227
+ *
228
+ * The `--deep` purge path continues to use `scanForResidue()` because its job
229
+ * is to remove ALL traces unconditionally, not just orphans.
230
+ */
231
+ export function scanForOrphans() {
232
+ const installState = detectInstallState();
233
+ const report = scanForResidue();
234
+ const orphans = report.paths.filter((p) => {
235
+ if (!p.present)
236
+ return false;
237
+ switch (p.category) {
238
+ case 'plugin-config':
239
+ // Config entry is legitimate iff the plugin dir is installed.
240
+ return !installState.pluginInstalled;
241
+ case 'hook-config':
242
+ // Config entry is legitimate iff any current hook dir is installed.
243
+ return !installState.hookInstalled;
244
+ case 'plugin-dir':
245
+ case 'hook-dir':
246
+ // These ARE the install when present — never orphaned.
247
+ return false;
248
+ case 'legacy-hook-dir':
249
+ // Legacy paths should have been migrated off; always flag.
250
+ return true;
251
+ case 'clawhub-skill-lock':
252
+ // SC's openclaw install wrapper doesn't manage the skill. If the entry
253
+ // is present it was written by `openclaw skills install shieldcortex`
254
+ // and is either a matching live skill or an orphan. We can't confirm
255
+ // which without knowing where OpenClaw keeps skill artefacts, so we
256
+ // conservatively flag it so the operator can decide (purge or reinstall).
257
+ return true;
258
+ }
259
+ });
260
+ return {
261
+ paths: orphans,
262
+ orphanCount: orphans.length,
263
+ installState,
264
+ };
265
+ }
266
+ /**
267
+ * Apply all pending removals from a residue report. Config mutations for the
268
+ * same file are batched so we write each JSON file at most once.
269
+ */
270
+ export function cleanResidue(report, options = {}) {
271
+ const result = { removed: [], errors: [] };
272
+ // Load each referenced config file once
273
+ const configCache = new Map();
274
+ const loadConfig = (file) => {
275
+ if (!configCache.has(file)) {
276
+ configCache.set(file, readJsonOrNull(file) ?? {});
277
+ }
278
+ return configCache.get(file);
279
+ };
280
+ const dirtyConfigFiles = new Set();
281
+ for (const entry of report.paths) {
282
+ if (!entry.present)
283
+ continue;
284
+ try {
285
+ const r = entry.removal;
286
+ if (r.kind === 'delete-directory') {
287
+ if (!options.dryRun) {
288
+ fs.rmSync(r.path, { recursive: true, force: true });
289
+ }
290
+ result.removed.push(entry.description);
291
+ }
292
+ else if (r.kind === 'delete-config-key') {
293
+ const cfg = loadConfig(r.file);
294
+ if (deletePath(cfg, r.keyPath)) {
295
+ dirtyConfigFiles.add(r.file);
296
+ result.removed.push(entry.description);
297
+ }
298
+ }
299
+ else if (r.kind === 'filter-config-array') {
300
+ const cfg = loadConfig(r.file);
301
+ if (filterArrayAtPath(cfg, r.keyPath, r.contains)) {
302
+ dirtyConfigFiles.add(r.file);
303
+ result.removed.push(entry.description);
304
+ }
305
+ }
306
+ }
307
+ catch (err) {
308
+ result.errors.push({ description: entry.description, error: err.message });
309
+ }
310
+ }
311
+ if (!options.dryRun) {
312
+ for (const file of dirtyConfigFiles) {
313
+ try {
314
+ writeJson(file, configCache.get(file));
315
+ }
316
+ catch (err) {
317
+ result.errors.push({ description: file, error: err.message });
318
+ }
319
+ }
320
+ }
321
+ return result;
322
+ }
323
+ /**
324
+ * Best-effort restart of the OpenClaw gateway so the purged config takes
325
+ * effect. Returns a structured report; never throws.
326
+ *
327
+ * Order of attempts:
328
+ * - Linux: `systemctl --user restart openclaw-gateway`
329
+ * - macOS: `launchctl kickstart -k gui/<uid>/ai.openclaw.gateway`
330
+ * - Fallback: skip with info message.
331
+ */
332
+ export async function restartOpenClawGateway() {
333
+ const platform = process.platform;
334
+ if (platform === 'linux') {
335
+ try {
336
+ execSync('systemctl --user restart openclaw-gateway', {
337
+ encoding: 'utf-8',
338
+ timeout: 10000,
339
+ stdio: ['ignore', 'pipe', 'pipe'],
340
+ });
341
+ return { attempted: true, restarted: true, method: 'systemctl --user' };
342
+ }
343
+ catch (err) {
344
+ return {
345
+ attempted: true,
346
+ restarted: false,
347
+ method: 'systemctl --user',
348
+ detail: err.message,
349
+ };
350
+ }
351
+ }
352
+ if (platform === 'darwin') {
353
+ try {
354
+ const uid = process.getuid ? process.getuid() : 0;
355
+ execSync(`launchctl kickstart -k gui/${uid}/ai.openclaw.gateway`, {
356
+ encoding: 'utf-8',
357
+ timeout: 10000,
358
+ stdio: ['ignore', 'pipe', 'pipe'],
359
+ });
360
+ return { attempted: true, restarted: true, method: 'launchctl kickstart' };
361
+ }
362
+ catch (err) {
363
+ return {
364
+ attempted: true,
365
+ restarted: false,
366
+ method: 'launchctl kickstart',
367
+ detail: err.message,
368
+ };
369
+ }
370
+ }
371
+ return {
372
+ attempted: false,
373
+ restarted: false,
374
+ method: 'unsupported-platform',
375
+ detail: `Restart not implemented for platform: ${platform}`,
376
+ };
377
+ }
378
+ /**
379
+ * High-level entry point used by `shieldcortex uninstall --deep`.
380
+ * Scans → cleans → (optionally) restarts gateway.
381
+ */
382
+ export async function runDeepClean(options = {}) {
383
+ const report = scanForResidue();
384
+ const result = cleanResidue(report, { dryRun: options.dryRun });
385
+ let gateway;
386
+ if (options.restartGateway && !options.dryRun && result.removed.length > 0) {
387
+ gateway = await restartOpenClawGateway();
388
+ }
389
+ return { report, result, gateway };
390
+ }
391
+ // Exported for tests
392
+ export const _internals = {
393
+ PLUGIN_ID,
394
+ HOOK_NAME,
395
+ resolveHome,
396
+ };
@@ -16,4 +16,6 @@ export declare function removeClaudeMdBlock(): void;
16
16
  export declare function uninstallSetup(): Promise<void>;
17
17
  export declare function uninstallAll(options?: {
18
18
  keepLogs?: boolean;
19
+ deep?: boolean;
20
+ restartGateway?: boolean;
19
21
  }): Promise<void>;
@@ -154,7 +154,10 @@ export async function uninstallSetup() {
154
154
  export async function uninstallAll(options) {
155
155
  if (blockAgentUninstall())
156
156
  return;
157
- const confirmed = await requireConfirmation('fully uninstall ShieldCortex');
157
+ const action = options?.deep
158
+ ? 'fully uninstall ShieldCortex and purge OpenClaw residue'
159
+ : 'fully uninstall ShieldCortex';
160
+ const confirmed = await requireConfirmation(action);
158
161
  if (!confirmed) {
159
162
  console.log('Uninstall cancelled.');
160
163
  return;
@@ -188,6 +191,44 @@ export async function uninstallAll(options) {
188
191
  catch (err) {
189
192
  console.error(`Failed to remove CLAUDE.md block: ${err.message}`);
190
193
  }
194
+ // 5. Deep clean: purge all known OpenClaw residue locations that the
195
+ // version-specific uninstall paths miss, then (best-effort) restart
196
+ // the gateway so the purged config takes effect immediately.
197
+ if (options?.deep) {
198
+ try {
199
+ const { runDeepClean } = await import('./deep-clean.js');
200
+ const { report, result, gateway } = await runDeepClean({
201
+ restartGateway: options?.restartGateway !== false,
202
+ });
203
+ if (result.removed.length > 0) {
204
+ console.log(`\nDeep clean: removed ${result.removed.length} residue reference(s):`);
205
+ for (const r of result.removed) {
206
+ console.log(` - ${r}`);
207
+ }
208
+ }
209
+ else if (report.dirtyCount === 0) {
210
+ console.log('\nDeep clean: no OpenClaw residue detected.');
211
+ }
212
+ if (result.errors.length > 0) {
213
+ console.warn(`\nDeep clean: ${result.errors.length} error(s):`);
214
+ for (const e of result.errors) {
215
+ console.warn(` - ${e.description}: ${e.error}`);
216
+ }
217
+ }
218
+ if (gateway) {
219
+ if (gateway.restarted) {
220
+ console.log(`\nOpenClaw gateway restarted via ${gateway.method}.`);
221
+ }
222
+ else if (gateway.attempted) {
223
+ console.warn(`\nOpenClaw gateway restart via ${gateway.method} failed: ${gateway.detail ?? 'unknown'}`);
224
+ console.warn('Restart it manually for the cleanup to take effect.');
225
+ }
226
+ }
227
+ }
228
+ catch (err) {
229
+ console.error(`Deep clean failed: ${err.message}`);
230
+ }
231
+ }
191
232
  console.log('\nDatabase preserved at ~/.shieldcortex/memories.db — delete manually if desired.');
192
233
  console.log('Uninstall complete.\n');
193
234
  console.log('To also remove the npm package:');
@@ -28,9 +28,9 @@ When `openclawAutoMemory` is enabled:
28
28
  5. Skips exact and near-duplicate memories using novelty filtering
29
29
 
30
30
  ### On Session Start (Agent Bootstrap)
31
- 1. Calls Cortex `get_context` to retrieve relevant memories
32
- 2. Injects them into the agent's bootstrap context
33
- 3. Agent starts with knowledge of past sessions
31
+ Bootstrap context injection was **disabled in v2026.2.26**. OpenClaw's native Memory Search now handles context recall at session start, so the hook no longer pushes memories into the system prompt (which was producing ~40× duplication of CORTEX_MEMORY.md and eating most of the context window).
32
+
33
+ The hook still fires on `agent:bootstrap` for lifecycle wiring (warning-bootstrap-file handoff, etc.) but contributes nothing to the system prompt. This keeps `extraSystemPromptHash` stable across turns and prevents the session-binding reset loop documented in `src/setup/claude-md.ts`.
34
34
 
35
35
  ### Keyword Triggers
36
36
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shieldcortex",
3
- "version": "4.11.1",
3
+ "version": "4.12.1",
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",
@@ -1,9 +1,13 @@
1
1
  {
2
2
  "id": "shieldcortex-realtime",
3
- "version": "4.11.1",
3
+ "version": "4.12.1",
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,
7
+ "engines": {
8
+ "openclaw": ">=2026.3.22",
9
+ "recommended": ">=2026.4.23"
10
+ },
7
11
  "enabledByDefault": false,
8
12
  "activation": {
9
13
  "hooks": ["llm_input", "llm_output", "before_tool_call", "session_end"],