shieldcortex 4.25.0 → 4.25.2

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 (234) 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 +2 -2
  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 +2 -2
  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 +2 -2
  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 +2 -2
  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 +2 -2
  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 +2 -2
  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 +2 -2
  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 +2 -2
  218. package/dashboard/.next/standalone/dashboard/.next/server/pages/500.html +2 -2
  219. package/dist/cli/doctor.d.ts +27 -0
  220. package/dist/cli/doctor.js +97 -0
  221. package/dist/cli/inspect.js +86 -0
  222. package/dist/setup/claude-md.d.ts +1 -0
  223. package/dist/setup/claude-md.js +1 -1
  224. package/package.json +1 -2
  225. package/scripts/lib/recall-log.mjs +163 -0
  226. package/scripts/prompt-recall-hook.mjs +118 -4
  227. package/plugins/openclaw/dist/cloud-sync.js +0 -19
  228. package/plugins/openclaw/dist/index.js +0 -703
  229. package/plugins/openclaw/dist/intercept-ingest.js +0 -18
  230. package/plugins/openclaw/dist/interceptor.js +0 -346
  231. package/plugins/openclaw/dist/openclaw.plugin.json +0 -205
  232. /package/dashboard/.next/standalone/dashboard/.next/static/{7iaOcy1kc6vGZ8eXyOttR → Cl3bBJxPrtXsvyaKu3Y4x}/_buildManifest.js +0 -0
  233. /package/dashboard/.next/standalone/dashboard/.next/static/{7iaOcy1kc6vGZ8eXyOttR → Cl3bBJxPrtXsvyaKu3Y4x}/_clientMiddlewareManifest.json +0 -0
  234. /package/dashboard/.next/standalone/dashboard/.next/static/{7iaOcy1kc6vGZ8eXyOttR → Cl3bBJxPrtXsvyaKu3Y4x}/_ssgManifest.js +0 -0
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html><!--7iaOcy1kc6vGZ8eXyOttR--><html lang="en" class="dark" data-theme="terminal"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/a7d5d0791c8c6223.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/aee9601911b790ca.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/d878b929b21636c4.js"/><script src="/_next/static/chunks/f70f563804550a9c.js" async=""></script><script src="/_next/static/chunks/43d761df92da7cb6.js" async=""></script><script src="/_next/static/chunks/e281719dbabcca1d.js" async=""></script><script src="/_next/static/chunks/9e56d1f8f4d7adcb.js" async=""></script><script src="/_next/static/chunks/turbopack-768a6a8b9db952e0.js" async=""></script><script src="/_next/static/chunks/4ddb24d8ce3b8617.js" async=""></script><script src="/_next/static/chunks/417032eeb2cd875f.js" async=""></script><script src="/_next/static/chunks/d334b69bff7779be.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>ShieldCortex</title><meta name="description" content="AI Memory Security Dashboard — Defence pipeline, audit logs, quarantine review"/><script>
1
+ <!DOCTYPE html><!--Cl3bBJxPrtXsvyaKu3Y4x--><html lang="en" class="dark" data-theme="terminal"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/a7d5d0791c8c6223.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/aee9601911b790ca.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/d878b929b21636c4.js"/><script src="/_next/static/chunks/f70f563804550a9c.js" async=""></script><script src="/_next/static/chunks/43d761df92da7cb6.js" async=""></script><script src="/_next/static/chunks/e281719dbabcca1d.js" async=""></script><script src="/_next/static/chunks/9e56d1f8f4d7adcb.js" async=""></script><script src="/_next/static/chunks/turbopack-768a6a8b9db952e0.js" async=""></script><script src="/_next/static/chunks/4ddb24d8ce3b8617.js" async=""></script><script src="/_next/static/chunks/417032eeb2cd875f.js" async=""></script><script src="/_next/static/chunks/d334b69bff7779be.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>ShieldCortex</title><meta name="description" content="AI Memory Security Dashboard — Defence pipeline, audit logs, quarantine review"/><script>
2
2
  try {
3
3
  var t = localStorage.getItem('sc-theme');
4
4
  if (t !== 'glass' && t !== 'terminal') t = 'terminal';
@@ -6,4 +6,4 @@ try {
6
6
  } catch (e) {
7
7
  document.documentElement.dataset.theme = 'terminal';
8
8
  }
9
- </script><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased bg-slate-950"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[36111,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"Providers\"]\n3:I[57043,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[10445,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\",\"/_next/static/chunks/d334b69bff7779be.js\"],\"default\"]\n5:I[27657,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n6:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\n9:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\nb:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nd:I[30687,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n:HL[\"/_next/static/chunks/a7d5d0791c8c6223.css\",\"style\"]\n:HL[\"/_next/static/chunks/aee9601911b790ca.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"7iaOcy1kc6vGZ8eXyOttR\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/a7d5d0791c8c6223.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/aee9601911b790ca.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/417032eeb2cd875f.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"data-theme\":\"terminal\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\ntry {\\n var t = localStorage.getItem('sc-theme');\\n if (t !== 'glass' \u0026\u0026 t !== 'terminal') t = 'terminal';\\n document.documentElement.dataset.theme = t;\\n} catch (e) {\\n document.documentElement.dataset.theme = 'terminal';\\n}\\n\"}}]}],[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased bg-slate-950\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$4\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/d334b69bff7779be.js\",\"async\":true}]],\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"8:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"ShieldCortex\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"AI Memory Security Dashboard — Defence pipeline, audit logs, quarantine review\"}]]\n"])</script></body></html>
9
+ </script><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased bg-slate-950"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[36111,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"Providers\"]\n3:I[57043,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[10445,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\",\"/_next/static/chunks/d334b69bff7779be.js\"],\"default\"]\n5:I[27657,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n6:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\n9:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\nb:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nd:I[30687,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n:HL[\"/_next/static/chunks/a7d5d0791c8c6223.css\",\"style\"]\n:HL[\"/_next/static/chunks/aee9601911b790ca.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"Cl3bBJxPrtXsvyaKu3Y4x\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/a7d5d0791c8c6223.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/aee9601911b790ca.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/417032eeb2cd875f.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"data-theme\":\"terminal\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\ntry {\\n var t = localStorage.getItem('sc-theme');\\n if (t !== 'glass' \u0026\u0026 t !== 'terminal') t = 'terminal';\\n document.documentElement.dataset.theme = t;\\n} catch (e) {\\n document.documentElement.dataset.theme = 'terminal';\\n}\\n\"}}]}],[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased bg-slate-950\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$4\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/d334b69bff7779be.js\",\"async\":true}]],\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"8:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"ShieldCortex\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"AI Memory Security Dashboard — Defence pipeline, audit logs, quarantine review\"}]]\n"])</script></body></html>
@@ -1,2 +1,2 @@
1
- <!DOCTYPE html><!--7iaOcy1kc6vGZ8eXyOttR--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/d878b929b21636c4.js"/><script src="/_next/static/chunks/f70f563804550a9c.js" async=""></script><script src="/_next/static/chunks/43d761df92da7cb6.js" async=""></script><script src="/_next/static/chunks/e281719dbabcca1d.js" async=""></script><script src="/_next/static/chunks/9e56d1f8f4d7adcb.js" async=""></script><script src="/_next/static/chunks/turbopack-768a6a8b9db952e0.js" async=""></script><script src="/_next/static/chunks/102f894cc892994d.js" async=""></script><script src="/_next/static/chunks/417032eeb2cd875f.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
- @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57043,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n3:I[27657,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\n9:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nb:I[30687,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"7iaOcy1kc6vGZ8eXyOttR\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/102f894cc892994d.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/417032eeb2cd875f.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--Cl3bBJxPrtXsvyaKu3Y4x--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/d878b929b21636c4.js"/><script src="/_next/static/chunks/f70f563804550a9c.js" async=""></script><script src="/_next/static/chunks/43d761df92da7cb6.js" async=""></script><script src="/_next/static/chunks/e281719dbabcca1d.js" async=""></script><script src="/_next/static/chunks/9e56d1f8f4d7adcb.js" async=""></script><script src="/_next/static/chunks/turbopack-768a6a8b9db952e0.js" async=""></script><script src="/_next/static/chunks/102f894cc892994d.js" async=""></script><script src="/_next/static/chunks/417032eeb2cd875f.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
+ @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57043,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n3:I[27657,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\n9:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nb:I[30687,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"Cl3bBJxPrtXsvyaKu3Y4x\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/102f894cc892994d.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/417032eeb2cd875f.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
@@ -83,6 +83,33 @@ export declare function checkLockFile(scDir?: string): Promise<CheckResult>;
83
83
  * `~/.openclaw/npm/node_modules`.
84
84
  */
85
85
  export declare function checkOpenClawPluginPackage(npmModulesDir?: string): Promise<CheckResult>;
86
+ /**
87
+ * Detects duplicate `shieldcortex-realtime` plugin installs under
88
+ * `~/.openclaw/extensions/` and `~/.openclaw/hooks/`. OpenClaw's plugin
89
+ * scanner walks both directories and registers every `openclaw.plugin.json`
90
+ * it finds, regardless of `.trash-*` or `*.disabled-*` naming conventions
91
+ * that suggest the directory has been retired. When the canonical npm
92
+ * install at `~/.openclaw/npm/node_modules/@drakon-systems/shieldcortex-realtime/`
93
+ * coexists with any of these legacy locations, OpenClaw emits
94
+ * `duplicate plugin id detected; global plugin will be overridden by global
95
+ * plugin` on every session.
96
+ *
97
+ * Field background (2026-05-27, all fleet boxes after v4.25.1 upgrade):
98
+ * - edith had `.trash-shieldcortex-realtime.20260527-093144/` in both
99
+ * extensions/ and hooks/, plus an older `shieldcortex-realtime.disabled-*`
100
+ * left from a tars-era cleanup. None of them excluded by OpenClaw scan.
101
+ * - jarvis + case had a live legacy install at
102
+ * `~/.openclaw/extensions/shieldcortex-realtime/` alongside the newer
103
+ * npm install — OpenClaw resolved to the npm one but kept warning
104
+ * about the legacy directory as a duplicate.
105
+ *
106
+ * These weren't created by ShieldCortex's installer (no `.trash-` pattern
107
+ * appears in the codebase) — they appear to come from OpenClaw's own
108
+ * plugin upgrade flow soft-trashing the old install before replacing it.
109
+ * This check surfaces them so operators can clean up; the actual fix is
110
+ * `rm -rf` on each path the check reports.
111
+ */
112
+ export declare function checkOpenClawDuplicateInstalls(openclawDir?: string): Promise<CheckResult>;
86
113
  /**
87
114
  * Defence canary — synthetic probe that proves the firewall layer is alive
88
115
  * and catching known-malicious markers. Without this check, the layer runs
@@ -860,6 +860,102 @@ export async function checkOpenClawPluginPackage(npmModulesDir = path.join(os.ho
860
860
  `OpenClaw integration; the bare main package should not live here)`,
861
861
  };
862
862
  }
863
+ /**
864
+ * Detects duplicate `shieldcortex-realtime` plugin installs under
865
+ * `~/.openclaw/extensions/` and `~/.openclaw/hooks/`. OpenClaw's plugin
866
+ * scanner walks both directories and registers every `openclaw.plugin.json`
867
+ * it finds, regardless of `.trash-*` or `*.disabled-*` naming conventions
868
+ * that suggest the directory has been retired. When the canonical npm
869
+ * install at `~/.openclaw/npm/node_modules/@drakon-systems/shieldcortex-realtime/`
870
+ * coexists with any of these legacy locations, OpenClaw emits
871
+ * `duplicate plugin id detected; global plugin will be overridden by global
872
+ * plugin` on every session.
873
+ *
874
+ * Field background (2026-05-27, all fleet boxes after v4.25.1 upgrade):
875
+ * - edith had `.trash-shieldcortex-realtime.20260527-093144/` in both
876
+ * extensions/ and hooks/, plus an older `shieldcortex-realtime.disabled-*`
877
+ * left from a tars-era cleanup. None of them excluded by OpenClaw scan.
878
+ * - jarvis + case had a live legacy install at
879
+ * `~/.openclaw/extensions/shieldcortex-realtime/` alongside the newer
880
+ * npm install — OpenClaw resolved to the npm one but kept warning
881
+ * about the legacy directory as a duplicate.
882
+ *
883
+ * These weren't created by ShieldCortex's installer (no `.trash-` pattern
884
+ * appears in the codebase) — they appear to come from OpenClaw's own
885
+ * plugin upgrade flow soft-trashing the old install before replacing it.
886
+ * This check surfaces them so operators can clean up; the actual fix is
887
+ * `rm -rf` on each path the check reports.
888
+ */
889
+ export async function checkOpenClawDuplicateInstalls(openclawDir = path.join(os.homedir(), '.openclaw')) {
890
+ const label = 'OpenClaw dup installs';
891
+ if (!fs.existsSync(openclawDir)) {
892
+ return { label, status: 'info', message: 'skipped (OpenClaw not detected)' };
893
+ }
894
+ // The canonical install path post-v4.21.1 is the npm-managed location.
895
+ const canonicalPath = path.join(openclawDir, 'npm', 'node_modules', '@drakon-systems', 'shieldcortex-realtime');
896
+ const canonicalPresent = fs.existsSync(canonicalPath);
897
+ // Scan extensions/ and hooks/ for ANY directory whose name contains the
898
+ // plugin id — catches `shieldcortex-realtime/` (live legacy),
899
+ // `.trash-shieldcortex-realtime.<ts>/` (OpenClaw upgrade leftover), and
900
+ // `shieldcortex-realtime.disabled-<host>-<ts>/` (manual disable).
901
+ const dupCandidates = [];
902
+ for (const subdir of ['extensions', 'hooks']) {
903
+ const dir = path.join(openclawDir, subdir);
904
+ if (!fs.existsSync(dir))
905
+ continue;
906
+ let entries;
907
+ try {
908
+ entries = fs.readdirSync(dir, { withFileTypes: true });
909
+ }
910
+ catch {
911
+ continue;
912
+ }
913
+ for (const entry of entries) {
914
+ if (!entry.isDirectory())
915
+ continue;
916
+ if (!entry.name.includes('shieldcortex-realtime'))
917
+ continue;
918
+ // The manifest must exist for OpenClaw to treat it as a discoverable
919
+ // plugin. If it doesn't, the dir is harmless (no scan hit).
920
+ const manifest = path.join(dir, entry.name, 'openclaw.plugin.json');
921
+ if (fs.existsSync(manifest)) {
922
+ dupCandidates.push(path.join(dir, entry.name));
923
+ }
924
+ }
925
+ }
926
+ if (dupCandidates.length === 0) {
927
+ return {
928
+ label,
929
+ status: 'pass',
930
+ message: 'clean (no duplicate shieldcortex-realtime installs in extensions/ or hooks/)',
931
+ };
932
+ }
933
+ // Format paths for display + fix instructions.
934
+ const home = os.homedir();
935
+ const displayPaths = dupCandidates.map((p) => p.replace(home, '~'));
936
+ const rmCmd = dupCandidates.map((p) => `rm -rf ${p.replace(home, '~')}`).join(' && ');
937
+ if (!canonicalPresent) {
938
+ // Legacy install exists but no canonical npm install. Less urgent —
939
+ // the plugin loads from the legacy path. Recommend bringing it in line
940
+ // with the post-v4.21.1 install convention.
941
+ return {
942
+ label,
943
+ status: 'warn',
944
+ message: `${dupCandidates.length} legacy install location(s) under ~/.openclaw/, no canonical ` +
945
+ `~/.openclaw/npm/.../@drakon-systems/shieldcortex-realtime/: ${displayPaths.join(', ')}`,
946
+ fix: `Reinstall via the canonical path: \`openclaw plugins install ` +
947
+ `@drakon-systems/shieldcortex-realtime\`, then \`${rmCmd}\` and restart OpenClaw`,
948
+ };
949
+ }
950
+ return {
951
+ label,
952
+ status: 'warn',
953
+ message: `${dupCandidates.length} duplicate shieldcortex-realtime install(s) alongside the canonical ` +
954
+ `npm install — OpenClaw emits \`duplicate plugin id detected\` every session: ` +
955
+ displayPaths.join(', '),
956
+ fix: `${rmCmd} && restart OpenClaw (the canonical npm install at ~/.openclaw/npm/ is the supported location)`,
957
+ };
958
+ }
863
959
  // ── Check: Defence canary (#48) ──────────────────────
864
960
  /**
865
961
  * Defence canary — synthetic probe that proves the firewall layer is alive
@@ -1241,6 +1337,7 @@ export async function runDoctor() {
1241
1337
  checkLockFile,
1242
1338
  checkOpenClawResidue,
1243
1339
  checkOpenClawPluginPackage,
1340
+ checkOpenClawDuplicateInstalls,
1244
1341
  checkDefenceCanary,
1245
1342
  checkModelCache,
1246
1343
  ];
@@ -107,6 +107,83 @@ async function cmdLastPrecompact(args) {
107
107
  printEntry(historyIndex, entry);
108
108
  return 0;
109
109
  }
110
+ function fmtRank(rank) {
111
+ if (typeof rank !== 'number' || !Number.isFinite(rank))
112
+ return ' ----';
113
+ return rank.toFixed(2).padStart(7);
114
+ }
115
+ function fmtEff(eff) {
116
+ if (typeof eff !== 'number' || !Number.isFinite(eff))
117
+ return '----';
118
+ return eff.toFixed(2);
119
+ }
120
+ function printRecallEntry(index, entry) {
121
+ const candidates = entry.candidates ?? [];
122
+ const injected = candidates.filter((c) => c.injected);
123
+ const dropped = candidates.filter((c) => !c.injected);
124
+ console.log(`${bold}Slot ${index}: ${entry.ranAt ?? '(unknown time)'} ${dim}${relativeTime(entry.ranAt)}${reset}`);
125
+ const promptDisplay = entry.prompt ? `"${entry.prompt}"` : '(no prompt)';
126
+ console.log(` Prompt: ${cyan}${promptDisplay}${reset}`);
127
+ const meta = [
128
+ entry.project ? `project=${entry.project}` : null,
129
+ entry.sessionId ? `session=${entry.sessionId.slice(0, 8)}` : null,
130
+ entry.minSalience != null ? `min_sal=${entry.minSalience.toFixed(2)}` : null,
131
+ ].filter(Boolean).join(', ');
132
+ if (meta)
133
+ console.log(` ${dim}${meta}${reset}`);
134
+ console.log(` Candidates: ${candidates.length} considered, ${green}${injected.length} injected${reset}, ${dim}${dropped.length} dropped${reset}`);
135
+ if (injected.length > 0) {
136
+ console.log(`\n ${green}INJECTED${reset}`);
137
+ for (const c of injected) {
138
+ const src = (c.source ?? '?').padEnd(15);
139
+ console.log(` [#${String(c.id ?? '?').padEnd(5)}] ${cyan}${src}${reset} rank=${fmtRank(c.ftsRank)} eff=${fmtEff(c.effectiveSalience)} ${(c.title ?? '').slice(0, 70)}`);
140
+ }
141
+ }
142
+ if (dropped.length > 0) {
143
+ console.log(`\n ${red}DROPPED${reset}`);
144
+ for (const c of dropped) {
145
+ const src = (c.source ?? '?').padEnd(15);
146
+ const reason = c.dropReason ? ` ${yellow}(${c.dropReason})${reset}` : '';
147
+ console.log(` ${dim}[#${String(c.id ?? '?').padEnd(5)}]${reset} ${dim}${src}${reset} rank=${fmtRank(c.ftsRank)} eff=${fmtEff(c.effectiveSalience)} ${dim}${(c.title ?? '').slice(0, 70)}${reset}${reason}`);
148
+ }
149
+ }
150
+ console.log('');
151
+ }
152
+ async function cmdLastRecall(args) {
153
+ const all = args.includes('--all');
154
+ const historyArg = parseFlag(args, '--history');
155
+ const historyIndex = historyArg !== undefined ? parseInt(historyArg, 10) : 0;
156
+ const { readRecallLog, listRecallLogs, RECALL_RING_SIZE } =
157
+ // @ts-expect-error — importing a .mjs hook util that has no .d.ts
158
+ await import('../../scripts/lib/recall-log.mjs');
159
+ if (all) {
160
+ const entries = listRecallLogs();
161
+ if (entries.length === 0) {
162
+ console.log(`${dim}No recall runs logged yet. The recall ring buffer fills as the UserPromptSubmit hook fires with proactiveRecall=true.${reset}`);
163
+ return 0;
164
+ }
165
+ console.log(`${bold}${entries.length} recall run(s) in ring buffer${reset}\n`);
166
+ for (const { index, entry } of entries)
167
+ printRecallEntry(index, entry);
168
+ return 0;
169
+ }
170
+ if (!Number.isFinite(historyIndex) || historyIndex < 0 || historyIndex >= RECALL_RING_SIZE) {
171
+ console.error(`--history must be 0..${RECALL_RING_SIZE - 1}. Got: ${historyArg ?? '<missing>'}`);
172
+ return 2;
173
+ }
174
+ const entry = readRecallLog(historyIndex);
175
+ if (!entry) {
176
+ if (historyIndex === 0) {
177
+ console.log(`${dim}No recall runs logged yet. The recall ring buffer fills as the UserPromptSubmit hook fires with proactiveRecall=true.${reset}`);
178
+ }
179
+ else {
180
+ console.log(`${dim}No recall run at history slot ${historyIndex}.${reset}`);
181
+ }
182
+ return 0;
183
+ }
184
+ printRecallEntry(historyIndex, entry);
185
+ return 0;
186
+ }
110
187
  function printHelp() {
111
188
  console.log('Usage: shieldcortex inspect <subcommand>');
112
189
  console.log('');
@@ -114,6 +191,12 @@ function printHelp() {
114
191
  console.log(' last-precompact [--history N | --all] Show extractor candidates from the last precompact run');
115
192
  console.log(' --history N (0=newest, up to 9) — show slot N');
116
193
  console.log(' --all — show every entry in the ring buffer (newest first)');
194
+ console.log('');
195
+ console.log(' last-recall [--history N | --all] Show recall candidates from the last prompt-recall run');
196
+ console.log(' (requires proactiveRecall=true; logs prompt + per-candidate');
197
+ console.log(' FTS rank + effective salience + drop reason).');
198
+ console.log(' Note: prompts are stored locally at ~/.shieldcortex/recall-log/');
199
+ console.log(' — same trust boundary as memories.db.');
117
200
  }
118
201
  export async function handleInspectCommand(args) {
119
202
  const sub = args[0];
@@ -122,6 +205,9 @@ export async function handleInspectCommand(args) {
122
205
  case 'last-precompact':
123
206
  code = await cmdLastPrecompact(args.slice(1));
124
207
  break;
208
+ case 'last-recall':
209
+ code = await cmdLastRecall(args.slice(1));
210
+ break;
125
211
  case undefined:
126
212
  case '--help':
127
213
  case '-h':
@@ -8,6 +8,7 @@
8
8
  *
9
9
  * Both steps are idempotent.
10
10
  */
11
+ export declare function setupGlobalMcp(): void;
11
12
  export declare function setupClaudeMd(options?: {
12
13
  stopHook?: boolean;
13
14
  sessionEnd?: boolean;
@@ -122,7 +122,7 @@ function isIdealMcpEntry(entry, ideal) {
122
122
  return false;
123
123
  return e.args.every((v, i) => v === ideal.args[i]);
124
124
  }
125
- function setupGlobalMcp() {
125
+ export function setupGlobalMcp() {
126
126
  // Claude Code reads user-scope MCP servers from ~/.claude.json
127
127
  const mcpPath = path.join(os.homedir(), '.claude.json');
128
128
  const ideal = resolveMcpCommand();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shieldcortex",
3
- "version": "4.25.0",
3
+ "version": "4.25.2",
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",
@@ -140,7 +140,6 @@
140
140
  "files": [
141
141
  "dist",
142
142
  "hooks/openclaw",
143
- "plugins/openclaw/dist",
144
143
  "scripts/postinstall.mjs",
145
144
  "scripts/ensure-bin-executable.mjs",
146
145
  "scripts/pre-compact-hook.mjs",
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Recall ring buffer (v4.25.1).
3
+ *
4
+ * Each prompt-recall hook run logs "what prompt fired, what candidates did
5
+ * we consider, which were injected, which were dropped, and why?" Operators
6
+ * read it via `shieldcortex inspect last-recall` when diagnosing why a
7
+ * particular memory surfaced (or didn't) for a particular prompt.
8
+ *
9
+ * Designed to gather the data needed to scope v4.26.x recall-quality fixes
10
+ * from real fleet usage instead of one-anecdote guesses. See the v4.25.1
11
+ * plan for the diagnostic context (Jarvis's "Google Slides memory for a
12
+ * ShieldCortex-versions prompt" report, 2026-05-27).
13
+ *
14
+ * Ring buffer at `~/.shieldcortex/recall-log/{0..9}.json` — index 0 is the
15
+ * most recent. On every write we rotate (delete 9, rename 8→9, …, 0→1) and
16
+ * atomically write the new run to index 0 via a temp-file + rename so a
17
+ * crash mid-rotation never leaves a torn JSON file.
18
+ *
19
+ * Size cap: 10 files × ~15KB each (~150KB max). Each entry is slightly
20
+ * larger than precompact because it carries the prompt + per-candidate
21
+ * FTS rank / effective salience metadata.
22
+ *
23
+ * Best-effort — never throws into the caller. The hook must not block recall
24
+ * on a missing ~/.shieldcortex directory or a transient EBUSY.
25
+ *
26
+ * Trust boundary: identical to ~/.shieldcortex/memories.db (already stores
27
+ * raw memory content). Prompts are capped at 200 chars and the upstream
28
+ * sanitiser (scripts/lib/prompt-sanitiser.mjs) has already stripped
29
+ * framework metadata + fenced JSON before we see the prompt.
30
+ */
31
+
32
+ import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'fs';
33
+ import { homedir } from 'os';
34
+ import { join } from 'path';
35
+
36
+ const RING_SIZE = 10;
37
+
38
+ // Resolved per-call so tests can swap HOME between cases. Read
39
+ // `process.env.HOME` directly rather than going through `os.homedir()`
40
+ // because jest's ESM VM loader doesn't reliably reflect HOME mutations
41
+ // through homedir() (same gotcha as precompact-log.mjs).
42
+ function logDir() {
43
+ return join(process.env.HOME || homedir(), '.shieldcortex', 'recall-log');
44
+ }
45
+
46
+ function logPath(index) {
47
+ return join(logDir(), `${index}.json`);
48
+ }
49
+
50
+ function ensureDir() {
51
+ const dir = logDir();
52
+ if (!existsSync(dir)) {
53
+ mkdirSync(dir, { recursive: true });
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Rotate the ring buffer one slot. Oldest entry (index 9) is unlinked,
59
+ * remaining entries shift up by one. Safe to call when slots are missing.
60
+ */
61
+ function rotate() {
62
+ try {
63
+ unlinkSync(logPath(RING_SIZE - 1));
64
+ } catch {
65
+ // No file at the oldest slot — fine.
66
+ }
67
+ for (let i = RING_SIZE - 2; i >= 0; i--) {
68
+ const from = logPath(i);
69
+ const to = logPath(i + 1);
70
+ if (existsSync(from)) {
71
+ try {
72
+ renameSync(from, to);
73
+ } catch {
74
+ // Best-effort — skip if EBUSY/EACCES.
75
+ }
76
+ }
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Atomically write a recall run entry to slot 0 (the newest slot).
82
+ * Rotates the ring beforehand.
83
+ *
84
+ * @param {{
85
+ * ranAt?: string,
86
+ * prompt?: string,
87
+ * promptHash?: string,
88
+ * sessionId?: string,
89
+ * project?: string,
90
+ * minSalience?: number,
91
+ * candidates: Array<{
92
+ * id?: number,
93
+ * title?: string,
94
+ * category?: string,
95
+ * memoryPurpose?: string,
96
+ * salience?: number,
97
+ * ftsRank?: number | null,
98
+ * source?: 'fts' | 'category-boost',
99
+ * effectiveSalience?: number,
100
+ * injected?: boolean,
101
+ * dropReason?: string | null,
102
+ * }>,
103
+ * injectedCount?: number,
104
+ * finalContextChars?: number,
105
+ * }} entry
106
+ */
107
+ export function writeRecallLog(entry) {
108
+ try {
109
+ ensureDir();
110
+ rotate();
111
+ const payload = {
112
+ ranAt: entry.ranAt ?? new Date().toISOString(),
113
+ prompt: entry.prompt ?? null,
114
+ promptHash: entry.promptHash ?? null,
115
+ sessionId: entry.sessionId ?? null,
116
+ project: entry.project ?? null,
117
+ minSalience: entry.minSalience ?? null,
118
+ candidates: Array.isArray(entry.candidates) ? entry.candidates : [],
119
+ injectedCount: entry.injectedCount ?? null,
120
+ finalContextChars: entry.finalContextChars ?? null,
121
+ };
122
+ const target = logPath(0);
123
+ const tmp = `${target}.tmp`;
124
+ writeFileSync(tmp, JSON.stringify(payload, null, 2), 'utf8');
125
+ renameSync(tmp, target);
126
+ } catch {
127
+ // Best-effort. The hook continues without a log entry rather than
128
+ // blocking recall on a disk error.
129
+ }
130
+ }
131
+
132
+ /**
133
+ * Read a recall log entry by ring index.
134
+ *
135
+ * @param {number} index — 0 = newest, RING_SIZE-1 = oldest
136
+ * @returns {object | null} parsed entry, or null if missing/corrupt
137
+ */
138
+ export function readRecallLog(index = 0) {
139
+ try {
140
+ const raw = readFileSync(logPath(index), 'utf8');
141
+ return JSON.parse(raw);
142
+ } catch {
143
+ return null;
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Read all present recall log entries, newest first. Missing slots are
149
+ * skipped (no nulls in the returned array).
150
+ *
151
+ * @returns {Array<{ index: number, entry: object }>}
152
+ */
153
+ export function listRecallLogs() {
154
+ const out = [];
155
+ for (let i = 0; i < RING_SIZE; i++) {
156
+ const entry = readRecallLog(i);
157
+ if (entry) out.push({ index: i, entry });
158
+ }
159
+ return out;
160
+ }
161
+
162
+ export const RECALL_RING_SIZE = RING_SIZE;
163
+ export { logDir as getRecallLogDir };