shieldcortex 4.12.14 → 4.13.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 (388) 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/prerender-manifest.json +3 -3
  4. package/dashboard/.next/standalone/dashboard/.next/required-server-files.json +4 -4
  5. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/admin/page.js +1 -1
  6. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/admin/page.js.nft.json +1 -1
  7. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/admin/page_client-reference-manifest.js +1 -1
  8. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/cloud/page.js +1 -1
  9. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/cloud/page.js.nft.json +1 -1
  10. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/cloud/page_client-reference-manifest.js +1 -1
  11. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/capture/page.js +1 -1
  12. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/capture/page.js.nft.json +1 -1
  13. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/capture/page_client-reference-manifest.js +1 -1
  14. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/graph/page.js +1 -1
  15. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/graph/page.js.nft.json +1 -1
  16. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/graph/page_client-reference-manifest.js +1 -1
  17. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page.js +1 -1
  18. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page.js.nft.json +1 -1
  19. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page_client-reference-manifest.js +1 -1
  20. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/recall/page.js +1 -1
  21. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/recall/page.js.nft.json +1 -1
  22. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/recall/page_client-reference-manifest.js +1 -1
  23. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page.js +1 -1
  24. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page.js.nft.json +1 -1
  25. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page_client-reference-manifest.js +1 -1
  26. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/timeline/page.js +1 -1
  27. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/timeline/page.js.nft.json +1 -1
  28. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/timeline/page_client-reference-manifest.js +1 -1
  29. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/overview/page.js +1 -1
  30. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/overview/page.js.nft.json +1 -1
  31. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/overview/page_client-reference-manifest.js +1 -1
  32. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/audit/page.js +1 -1
  33. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/audit/page.js.nft.json +1 -1
  34. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/audit/page_client-reference-manifest.js +1 -1
  35. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/intercepts/page.js +1 -1
  36. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/intercepts/page.js.nft.json +1 -1
  37. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/intercepts/page_client-reference-manifest.js +1 -1
  38. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/iron-dome/page.js +1 -1
  39. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/iron-dome/page.js.nft.json +1 -1
  40. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/iron-dome/page_client-reference-manifest.js +1 -1
  41. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/page.js +1 -1
  42. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/page.js.nft.json +1 -1
  43. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/page_client-reference-manifest.js +1 -1
  44. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/policies/page.js +1 -1
  45. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/policies/page.js.nft.json +1 -1
  46. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/policies/page_client-reference-manifest.js +1 -1
  47. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/quarantine/page.js +1 -1
  48. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/quarantine/page.js.nft.json +1 -1
  49. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/quarantine/page_client-reference-manifest.js +1 -1
  50. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/settings/page.js +1 -1
  51. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  52. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  53. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/page.js +1 -1
  54. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/page.js.nft.json +1 -1
  55. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/page_client-reference-manifest.js +1 -1
  56. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/xray/page.js +1 -1
  57. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/xray/page.js.nft.json +1 -1
  58. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/xray/page_client-reference-manifest.js +1 -1
  59. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/xray/page.js +1 -1
  60. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/xray/page.js.nft.json +1 -1
  61. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/xray/page_client-reference-manifest.js +1 -1
  62. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error/page.js.nft.json +1 -1
  63. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  64. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.html +2 -2
  65. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.rsc +1 -1
  66. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  67. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  68. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  69. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  70. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  71. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found/page.js.nft.json +1 -1
  72. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  73. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.html +1 -1
  74. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.rsc +2 -2
  75. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  76. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  77. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  78. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  79. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  80. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  81. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.html +1 -1
  82. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.rsc +17 -15
  83. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin/__PAGE__.segment.rsc +1 -1
  84. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin.segment.rsc +1 -1
  85. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  86. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_full.segment.rsc +17 -15
  87. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  88. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  89. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  90. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.html +1 -1
  91. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.rsc +17 -15
  92. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud/__PAGE__.segment.rsc +1 -1
  93. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud.segment.rsc +1 -1
  94. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  95. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_full.segment.rsc +17 -15
  96. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_head.segment.rsc +1 -1
  97. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_index.segment.rsc +2 -2
  98. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_tree.segment.rsc +2 -2
  99. package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
  100. package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +2 -2
  101. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  102. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_full.segment.rsc +2 -2
  103. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
  104. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_index.segment.rsc +2 -2
  105. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  106. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.html +1 -1
  107. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.rsc +17 -15
  108. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture/__PAGE__.segment.rsc +1 -1
  109. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture.segment.rsc +1 -1
  110. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  111. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  112. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_full.segment.rsc +17 -15
  113. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_head.segment.rsc +1 -1
  114. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_index.segment.rsc +2 -2
  115. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_tree.segment.rsc +2 -2
  116. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.html +1 -1
  117. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.rsc +17 -15
  118. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph/__PAGE__.segment.rsc +1 -1
  119. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph.segment.rsc +1 -1
  120. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  121. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  122. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_full.segment.rsc +17 -15
  123. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_head.segment.rsc +1 -1
  124. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_index.segment.rsc +2 -2
  125. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_tree.segment.rsc +2 -2
  126. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.html +1 -1
  127. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.rsc +17 -15
  128. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall/__PAGE__.segment.rsc +1 -1
  129. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall.segment.rsc +1 -1
  130. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  131. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  132. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_full.segment.rsc +17 -15
  133. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_head.segment.rsc +1 -1
  134. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_index.segment.rsc +2 -2
  135. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_tree.segment.rsc +2 -2
  136. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.html +1 -1
  137. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.rsc +17 -15
  138. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review/__PAGE__.segment.rsc +1 -1
  139. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review.segment.rsc +1 -1
  140. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  141. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  142. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_full.segment.rsc +17 -15
  143. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_head.segment.rsc +1 -1
  144. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_index.segment.rsc +2 -2
  145. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_tree.segment.rsc +2 -2
  146. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.html +1 -1
  147. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.rsc +17 -15
  148. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline/__PAGE__.segment.rsc +1 -1
  149. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline.segment.rsc +1 -1
  150. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  151. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  152. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_full.segment.rsc +17 -15
  153. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_head.segment.rsc +1 -1
  154. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_index.segment.rsc +2 -2
  155. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_tree.segment.rsc +2 -2
  156. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.html +1 -1
  157. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.rsc +21 -18
  158. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory/__PAGE__.segment.rsc +2 -2
  159. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  160. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  161. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_full.segment.rsc +21 -18
  162. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_head.segment.rsc +1 -1
  163. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_index.segment.rsc +2 -2
  164. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_tree.segment.rsc +2 -2
  165. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.html +1 -1
  166. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.rsc +20 -18
  167. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview/__PAGE__.segment.rsc +2 -2
  168. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview.segment.rsc +1 -1
  169. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  170. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_full.segment.rsc +20 -18
  171. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_head.segment.rsc +1 -1
  172. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_index.segment.rsc +2 -2
  173. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_tree.segment.rsc +2 -2
  174. package/dashboard/.next/standalone/dashboard/.next/server/app/page.js.nft.json +1 -1
  175. package/dashboard/.next/standalone/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
  176. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.html +1 -1
  177. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.rsc +17 -15
  178. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit/__PAGE__.segment.rsc +1 -1
  179. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit.segment.rsc +1 -1
  180. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  181. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  182. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_full.segment.rsc +17 -15
  183. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_head.segment.rsc +1 -1
  184. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_index.segment.rsc +2 -2
  185. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_tree.segment.rsc +2 -2
  186. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.html +1 -1
  187. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.rsc +17 -15
  188. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts/__PAGE__.segment.rsc +1 -1
  189. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts.segment.rsc +1 -1
  190. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  191. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  192. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_full.segment.rsc +17 -15
  193. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_head.segment.rsc +1 -1
  194. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_index.segment.rsc +2 -2
  195. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_tree.segment.rsc +2 -2
  196. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.html +1 -1
  197. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.rsc +17 -15
  198. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome/__PAGE__.segment.rsc +1 -1
  199. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome.segment.rsc +1 -1
  200. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  201. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  202. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_full.segment.rsc +17 -15
  203. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_head.segment.rsc +1 -1
  204. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_index.segment.rsc +2 -2
  205. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_tree.segment.rsc +2 -2
  206. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.html +1 -1
  207. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.rsc +17 -15
  208. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies/__PAGE__.segment.rsc +1 -1
  209. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies.segment.rsc +1 -1
  210. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  211. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  212. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_full.segment.rsc +17 -15
  213. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_head.segment.rsc +1 -1
  214. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_index.segment.rsc +2 -2
  215. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_tree.segment.rsc +2 -2
  216. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.html +1 -1
  217. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.rsc +17 -15
  218. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine/__PAGE__.segment.rsc +1 -1
  219. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine.segment.rsc +1 -1
  220. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  221. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  222. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_full.segment.rsc +17 -15
  223. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_head.segment.rsc +1 -1
  224. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_index.segment.rsc +2 -2
  225. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_tree.segment.rsc +2 -2
  226. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.html +1 -1
  227. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.rsc +17 -15
  228. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection/__PAGE__.segment.rsc +2 -2
  229. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  230. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  231. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_full.segment.rsc +17 -15
  232. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_head.segment.rsc +1 -1
  233. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_index.segment.rsc +2 -2
  234. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_tree.segment.rsc +2 -2
  235. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.html +1 -1
  236. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.rsc +17 -15
  237. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +2 -2
  238. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  239. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  240. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_full.segment.rsc +17 -15
  241. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  242. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  243. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  244. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.html +1 -1
  245. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.rsc +17 -15
  246. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray/__PAGE__.segment.rsc +1 -1
  247. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray.segment.rsc +1 -1
  248. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
  249. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  250. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_full.segment.rsc +17 -15
  251. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_head.segment.rsc +1 -1
  252. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_index.segment.rsc +2 -2
  253. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_tree.segment.rsc +2 -2
  254. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.html +1 -1
  255. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.rsc +17 -15
  256. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain/__PAGE__.segment.rsc +1 -1
  257. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
  258. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  259. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_full.segment.rsc +17 -15
  260. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_head.segment.rsc +1 -1
  261. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_index.segment.rsc +2 -2
  262. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_tree.segment.rsc +2 -2
  263. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.html +1 -1
  264. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.rsc +17 -15
  265. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray/__PAGE__.segment.rsc +2 -2
  266. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray.segment.rsc +1 -1
  267. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
  268. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_full.segment.rsc +17 -15
  269. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_head.segment.rsc +1 -1
  270. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_index.segment.rsc +2 -2
  271. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_tree.segment.rsc +2 -2
  272. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/9f1d4_@tanstack_68dcbde9._.js +3 -0
  273. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/{[root-of-the-server]__fb5796ae._.js → [root-of-the-server]__2de25d56._.js} +2 -2
  274. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__52bd7a9f._.js +3 -0
  275. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/{[root-of-the-server]__b789489c._.js → [root-of-the-server]__6f881a23._.js} +2 -2
  276. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_01f6ceb0._.js +1 -1
  277. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_20c6acea._.js +3 -0
  278. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/{9f1d4_next_c9fe89e1._.js → dashboard_25b568c3._.js} +2 -2
  279. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_2a8eef6b._.js +3 -0
  280. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_35a9932a._.js +1 -1
  281. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_37f17371._.js +1 -1
  282. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_77cb2b63._.js +3 -0
  283. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_91003e6d._.js +3 -0
  284. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_9b8695d8._.js +3 -0
  285. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_a16ef10a._.js +3 -0
  286. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_c219bf07._.js +4 -4
  287. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_f9cd1dc2._.js +3 -0
  288. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_fefd3b85._.js +1 -1
  289. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_44a9f72c._.js +3 -0
  290. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_de7ac4f9._.js +3 -0
  291. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_protection_ProtectionOverview_tsx_54554a97._.js +3 -3
  292. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_settings_SettingsView_tsx_16dc83a7._.js +1 -1
  293. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_xray_XRayOverview_tsx_ceba698e._.js +1 -1
  294. package/dashboard/.next/standalone/dashboard/.next/server/pages/404.html +1 -1
  295. package/dashboard/.next/standalone/dashboard/.next/server/pages/500.html +2 -2
  296. package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.js +1 -1
  297. package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.json +1 -1
  298. package/dashboard/.next/standalone/dashboard/.next/static/chunks/015dc64369f26b7d.css +3 -0
  299. package/dashboard/.next/standalone/dashboard/.next/static/chunks/2fe84829530e61a3.js +1 -0
  300. package/dashboard/.next/standalone/dashboard/.next/static/chunks/34d0309a4e34b084.js +1 -0
  301. package/dashboard/.next/standalone/dashboard/.next/static/chunks/3729c748a4361c1f.js +1 -0
  302. package/dashboard/.next/standalone/dashboard/.next/static/chunks/3b7fdf1ee828254c.js +1 -0
  303. package/dashboard/.next/standalone/dashboard/.next/static/chunks/{3d53807a9a943ce7.js → 4c90ebd2c08cd656.js} +4 -4
  304. package/dashboard/.next/standalone/dashboard/.next/static/chunks/4d4af0cecaef56f2.js +1 -0
  305. package/dashboard/.next/standalone/dashboard/.next/static/chunks/4eb86dc2f379d3ca.js +1 -0
  306. package/dashboard/.next/standalone/dashboard/.next/static/chunks/6aba18b7aac42ccd.js +1 -0
  307. package/dashboard/.next/standalone/dashboard/.next/static/chunks/{b4b3fb5729bead7e.js → 6ea97c8dc9e30ea5.js} +1 -1
  308. package/dashboard/.next/standalone/dashboard/.next/static/chunks/74ea1a87751e93a3.js +1 -0
  309. package/dashboard/.next/standalone/dashboard/.next/static/chunks/910628c23329a773.js +1 -0
  310. package/dashboard/.next/standalone/dashboard/.next/static/chunks/{c288964c4c00982a.js → b308a787e8cbc2a9.js} +3 -3
  311. package/dashboard/.next/standalone/dashboard/.next/static/chunks/bdb50889a1c1ab37.js +1 -0
  312. package/dashboard/.next/standalone/dashboard/.next/static/chunks/d0bf5ccba09917dd.js +1 -0
  313. package/dashboard/.next/standalone/dashboard/.next/static/chunks/e804a1fda2839550.js +1 -0
  314. package/dashboard/.next/standalone/dashboard/server.js +1 -1
  315. package/dist/api/routes/digest.d.ts +59 -0
  316. package/dist/api/routes/digest.js +305 -0
  317. package/dist/api/routes/memories.js +84 -15
  318. package/dist/api/routes/system.js +10 -2
  319. package/dist/api/visualization-server.js +2 -0
  320. package/dist/cli/doctor.d.ts +42 -0
  321. package/dist/cli/doctor.js +173 -0
  322. package/dist/cli/migrate-legacy.d.ts +28 -0
  323. package/dist/cli/migrate-legacy.js +291 -0
  324. package/dist/cloud/cli.js +2 -2
  325. package/dist/cloud/config.d.ts +22 -0
  326. package/dist/cloud/config.js +38 -0
  327. package/dist/database/init.js +26 -1
  328. package/dist/index.js +8 -1
  329. package/dist/memory/backup.d.ts +19 -0
  330. package/dist/memory/backup.js +47 -0
  331. package/dist/memory/dedupe-runner.d.ts +33 -0
  332. package/dist/memory/dedupe-runner.js +103 -0
  333. package/dist/memory/fts.d.ts +26 -0
  334. package/dist/memory/fts.js +59 -0
  335. package/dist/memory/lifecycle.d.ts +83 -0
  336. package/dist/memory/lifecycle.js +274 -0
  337. package/dist/memory/links.d.ts +63 -0
  338. package/dist/memory/links.js +232 -0
  339. package/dist/memory/prune.d.ts +34 -0
  340. package/dist/memory/prune.js +76 -0
  341. package/dist/memory/search-recall.d.ts +48 -0
  342. package/dist/memory/search-recall.js +367 -0
  343. package/dist/memory/store.d.ts +6 -121
  344. package/dist/memory/store.js +45 -854
  345. package/dist/setup/claude-md.d.ts +1 -0
  346. package/dist/setup/deep-clean.d.ts +33 -0
  347. package/dist/setup/deep-clean.js +26 -0
  348. package/dist/setup/doctor.js +7 -2
  349. package/dist/setup/settings-hooks.d.ts +1 -0
  350. package/dist/setup/settings-hooks.js +51 -5
  351. package/dist/setup/status.js +39 -0
  352. package/hooks/openclaw/cortex-memory/runtime.mjs +18 -4
  353. package/package.json +1 -1
  354. package/plugins/openclaw/dist/index.js +12 -6
  355. package/plugins/openclaw/dist/openclaw.plugin.json +1 -1
  356. package/scripts/lib/auto-memory-config.mjs +53 -0
  357. package/scripts/lib/telemetry.mjs +58 -0
  358. package/scripts/lib/transcript-reader.mjs +123 -0
  359. package/scripts/postinstall.mjs +47 -1
  360. package/scripts/pre-compact-hook.mjs +76 -124
  361. package/scripts/session-end-hook.mjs +102 -97
  362. package/scripts/stop-hook.mjs +385 -116
  363. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/9f1d4_@tanstack_785e068c._.js +0 -3
  364. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__c2b92077._.js +0 -3
  365. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_11878109._.js +0 -3
  366. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_35c9f22e._.js +0 -3
  367. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_836b4a04._.js +0 -3
  368. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_9770c429._.js +0 -3
  369. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_9dd626ed._.js +0 -3
  370. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_e94d2da2._.js +0 -3
  371. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_564ea5ae._.js +0 -3
  372. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_lib_3f1490a1._.js +0 -3
  373. package/dashboard/.next/standalone/dashboard/.next/static/chunks/079a5be036130e37.js +0 -1
  374. package/dashboard/.next/standalone/dashboard/.next/static/chunks/1770a8ce7abb2437.js +0 -1
  375. package/dashboard/.next/standalone/dashboard/.next/static/chunks/1a074f8ddc7cd385.js +0 -1
  376. package/dashboard/.next/standalone/dashboard/.next/static/chunks/24da99d1341bd573.css +0 -3
  377. package/dashboard/.next/standalone/dashboard/.next/static/chunks/2aa8afb655c1c2e5.js +0 -1
  378. package/dashboard/.next/standalone/dashboard/.next/static/chunks/302ad459a0e5c4ba.js +0 -1
  379. package/dashboard/.next/standalone/dashboard/.next/static/chunks/385ec610bad1acc5.js +0 -1
  380. package/dashboard/.next/standalone/dashboard/.next/static/chunks/4f57582c2d186438.js +0 -1
  381. package/dashboard/.next/standalone/dashboard/.next/static/chunks/52843253e4b833a5.js +0 -1
  382. package/dashboard/.next/standalone/dashboard/.next/static/chunks/7fca141efba9d353.js +0 -1
  383. package/dashboard/.next/standalone/dashboard/.next/static/chunks/8593e1796c9d043d.js +0 -1
  384. package/dashboard/.next/standalone/dashboard/.next/static/chunks/cbc2e6ffcad6e91c.js +0 -1
  385. package/dashboard/.next/standalone/dashboard/.next/static/chunks/fced7dd3c9874ed1.js +0 -1
  386. /package/dashboard/.next/standalone/dashboard/.next/static/{P2sW3M-qHaW9VS9YwCEg3 → 2JvJZkELhPQRzhTlgun1M}/_buildManifest.js +0 -0
  387. /package/dashboard/.next/standalone/dashboard/.next/static/{P2sW3M-qHaW9VS9YwCEg3 → 2JvJZkELhPQRzhTlgun1M}/_clientMiddlewareManifest.json +0 -0
  388. /package/dashboard/.next/standalone/dashboard/.next/static/{P2sW3M-qHaW9VS9YwCEg3 → 2JvJZkELhPQRzhTlgun1M}/_ssgManifest.js +0 -0
@@ -197,6 +197,93 @@ async function checkMemoryStats() {
197
197
  return { label: 'Memories', status: 'warn', message: `check failed — ${msg}` };
198
198
  }
199
199
  }
200
+ // ── Check 3b: Write-path smoke test ───────────────────────
201
+ /**
202
+ * The honest "is it working?" check.
203
+ *
204
+ * Doctor checks have historically gone green while writes were silently
205
+ * failing (v4.12.4 path-encoding bug, v4.12.5 NOT NULL UUID schema gap).
206
+ * The pattern: schema introspection passed (columns existed) but actual
207
+ * INSERTs threw constraint violations during real workloads.
208
+ *
209
+ * This check does a real round-trip — INSERT a tagged probe memory,
210
+ * SELECT it back, DELETE it. If any step fails, doctor reports the
211
+ * actual error string instead of "all green". The probe is tagged with
212
+ * a unique source identifier so it can never be confused with real data
213
+ * and gets deleted at the end of the check.
214
+ */
215
+ /**
216
+ * Pure helper for the write-path round-trip. Exported so tests can
217
+ * exercise it against any database path (in-memory or temp file)
218
+ * without going through doctor's homedir-derived getDbPath().
219
+ */
220
+ export function runWritePathProbe(dbPath) {
221
+ if (!fs.existsSync(dbPath)) {
222
+ return { label: 'Write path', status: 'warn', message: 'skipped (no database)' };
223
+ }
224
+ let db = null;
225
+ const probeUuid = `doctor-probe-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
226
+ const probeTitle = '__shieldcortex_doctor_probe__';
227
+ try {
228
+ const Database = require('better-sqlite3');
229
+ db = new Database(dbPath);
230
+ // INSERT — exercises NOT NULL columns + CHECK constraints. The schema
231
+ // adds these silently across versions; an INSERT against a stale schema
232
+ // is the exact failure mode v4.12.5 had.
233
+ db.prepare(`
234
+ INSERT INTO memories (uuid, type, category, title, content, salience, source, capture_method)
235
+ VALUES (?, 'short_term', 'note', ?, 'doctor probe — safe to delete', 0.01, 'cli:doctor', 'doctor-probe')
236
+ `).run(probeUuid, probeTitle);
237
+ // SELECT — exercises the FTS5 + index path
238
+ const row = db.prepare('SELECT id, title FROM memories WHERE uuid = ?').get(probeUuid);
239
+ if (!row || row.title !== probeTitle) {
240
+ return {
241
+ label: 'Write path',
242
+ status: 'fail',
243
+ message: 'wrote a probe row but could not read it back',
244
+ fix: 'Database may be corrupted. Run `shieldcortex consolidate` then re-run doctor.',
245
+ };
246
+ }
247
+ // DELETE — exercises the cascade triggers (FTS5 cleanup)
248
+ const deleteResult = db.prepare('DELETE FROM memories WHERE uuid = ?').run(probeUuid);
249
+ if (deleteResult.changes !== 1) {
250
+ return {
251
+ label: 'Write path',
252
+ status: 'warn',
253
+ message: `probe row written + read OK but delete affected ${deleteResult.changes} rows (expected 1)`,
254
+ fix: 'Manual cleanup may be needed. Check ~/.shieldcortex/memories.db for orphaned rows.',
255
+ };
256
+ }
257
+ return { label: 'Write path', status: 'pass', message: 'INSERT/SELECT/DELETE round-trip OK' };
258
+ }
259
+ catch (err) {
260
+ const msg = err instanceof Error ? err.message : String(err);
261
+ // Best-effort cleanup so we don't leave probe rows behind on a partial failure
262
+ if (db) {
263
+ try {
264
+ db.prepare('DELETE FROM memories WHERE uuid = ?').run(probeUuid);
265
+ }
266
+ catch { /* ignore */ }
267
+ }
268
+ return {
269
+ label: 'Write path',
270
+ status: 'fail',
271
+ message: `round-trip failed — ${msg}`,
272
+ fix: 'This is the smoking gun for a stale schema or migration drift. Try restarting the MCP server (auto-migrates), or re-install: shieldcortex install',
273
+ };
274
+ }
275
+ finally {
276
+ if (db) {
277
+ try {
278
+ db.close();
279
+ }
280
+ catch { /* ignore */ }
281
+ }
282
+ }
283
+ }
284
+ async function checkWritePath() {
285
+ return runWritePathProbe(getDbPath());
286
+ }
200
287
  // ── Check 4: Hook installation ────────────────────────────
201
288
  async function checkHooks() {
202
289
  const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
@@ -251,6 +338,90 @@ async function checkHooks() {
251
338
  return { label: 'Hooks', status: 'warn', message: `check failed — ${msg}` };
252
339
  }
253
340
  }
341
+ // ── Check 4b: Auto-memory hook gates ──────────────────────
342
+ /**
343
+ * Surfaces the resolved on/off state of the opt-in Stop and SessionEnd
344
+ * auto-memory hooks. Pre-v4.13.1 these were triple-gated (install flag,
345
+ * runtime config, sampling) with the runtime gate failing silently —
346
+ * users who wired the hook saw zero captures and zero feedback (#41).
347
+ *
348
+ * The check looks at both layers:
349
+ * - settings.json: is the hook wired so Claude Code will fire it?
350
+ * - autoMemory.enableStop / enableSessionEnd: will the hook actually run?
351
+ *
352
+ * Both layers must agree for the hook to do work. v4.13.1 onwards, the
353
+ * install flag flips both — if they disagree here, the user edited one
354
+ * side by hand and should re-run setup.
355
+ */
356
+ export async function checkAutoMemoryHooks() {
357
+ const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
358
+ let wiredStop = false;
359
+ let wiredSessionEnd = false;
360
+ try {
361
+ if (fs.existsSync(settingsPath)) {
362
+ const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
363
+ const hooks = settings?.hooks || {};
364
+ const isCortexWired = (entries) => Array.isArray(entries) && entries.some((entry) => Array.isArray(entry?.hooks) && entry.hooks.some((h) => typeof h?.command === 'string' && h.command.includes('shieldcortex')));
365
+ wiredStop = isCortexWired(hooks.Stop);
366
+ wiredSessionEnd = isCortexWired(hooks.SessionEnd);
367
+ }
368
+ }
369
+ catch { /* fall through — both stay false, user gets a clean info row */ }
370
+ // Lazy-import to avoid pulling cloud/config into doctor's static graph
371
+ // when the user hasn't configured anything yet.
372
+ let gateStop = false;
373
+ let gateSessionEnd = false;
374
+ let samplingTurns = 10;
375
+ try {
376
+ const cfg = await import('../cloud/config.js');
377
+ const enable = cfg.getAutoMemoryEnableConfig();
378
+ gateStop = enable.enableStop;
379
+ gateSessionEnd = enable.enableSessionEnd;
380
+ const raw = cfg.readRawConfig();
381
+ const am = raw.autoMemory && typeof raw.autoMemory === 'object'
382
+ ? raw.autoMemory
383
+ : {};
384
+ if (typeof am.stopHookSamplingTurns === 'number' && am.stopHookSamplingTurns > 0) {
385
+ samplingTurns = Math.floor(am.stopHookSamplingTurns);
386
+ }
387
+ }
388
+ catch { /* defaults already set */ }
389
+ const rowFor = (label, wired, gate, flag, extra) => {
390
+ if (!wired && !gate) {
391
+ return {
392
+ label,
393
+ status: 'info',
394
+ message: 'opt-in (not installed)',
395
+ };
396
+ }
397
+ if (wired && gate) {
398
+ return {
399
+ label,
400
+ status: 'pass',
401
+ message: extra ? `enabled (${extra})` : 'enabled',
402
+ };
403
+ }
404
+ if (wired && !gate) {
405
+ return {
406
+ label,
407
+ status: 'warn',
408
+ message: 'wired in settings.json but runtime gate is off — hook will exit silently every turn',
409
+ fix: `Run \`shieldcortex setup ${flag}\` to flip the gate, or set autoMemory.enableStop/enableSessionEnd=true in ~/.shieldcortex/config.json`,
410
+ };
411
+ }
412
+ // gate && !wired
413
+ return {
414
+ label,
415
+ status: 'warn',
416
+ message: 'runtime gate is on but hook is not wired in settings.json — hook will never fire',
417
+ fix: `Run \`shieldcortex setup ${flag}\` to wire the hook`,
418
+ };
419
+ };
420
+ return [
421
+ rowFor('Auto-memory: Stop hook', wiredStop, gateStop, '--with-stop-hook', `samples turn % ${samplingTurns} == 0`),
422
+ rowFor('Auto-memory: SessionEnd hook', wiredSessionEnd, gateSessionEnd, '--with-session-end'),
423
+ ];
424
+ }
254
425
  // ── Check 5: Process check ────────────────────────────────
255
426
  async function checkProcesses() {
256
427
  const results = [];
@@ -498,8 +669,10 @@ export async function runDoctor() {
498
669
  const checks = [
499
670
  checkDatabase,
500
671
  checkSchema,
672
+ checkWritePath, // Smoke test: real INSERT/SELECT/DELETE round-trip — catches silent schema drift
501
673
  checkMemoryStats,
502
674
  checkHooks,
675
+ checkAutoMemoryHooks,
503
676
  checkProcesses,
504
677
  checkDiskUsage,
505
678
  checkLockFile,
@@ -0,0 +1,28 @@
1
+ interface MigrateOptions {
2
+ /** Source legacy DB paths to import from. Defaults to both ~/.claude-memory/ and ~/.claude-cortex/ */
3
+ sources?: string[];
4
+ /** Target DB path. Default ~/.shieldcortex/memories.db */
5
+ target?: string;
6
+ /** If true, count + report only — no writes. */
7
+ dryRun?: boolean;
8
+ }
9
+ interface SourceReport {
10
+ path: string;
11
+ exists: boolean;
12
+ memoriesFound: number;
13
+ memoriesImported: number;
14
+ linksFound: number;
15
+ linksImported: number;
16
+ linksSkipped: number;
17
+ error?: string;
18
+ }
19
+ interface MigrationReport {
20
+ target: string;
21
+ dryRun: boolean;
22
+ sources: SourceReport[];
23
+ totalMemories: number;
24
+ totalLinks: number;
25
+ }
26
+ export declare function migrateLegacy(options?: MigrateOptions): MigrationReport;
27
+ export declare function handleMemoriesCommand(args: string[]): Promise<void>;
28
+ export {};
@@ -0,0 +1,291 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import { randomUUID } from 'crypto';
5
+ import Database from 'better-sqlite3';
6
+ const DEFAULT_LEGACY_SOURCES = [
7
+ path.join(os.homedir(), '.claude-cortex', 'memories.db'),
8
+ path.join(os.homedir(), '.claude-memory', 'memories.db'),
9
+ ];
10
+ const DEFAULT_TARGET = path.join(os.homedir(), '.shieldcortex', 'memories.db');
11
+ function migrateOne(sourcePath, target, dryRun) {
12
+ const report = {
13
+ path: sourcePath,
14
+ exists: false,
15
+ memoriesFound: 0,
16
+ memoriesImported: 0,
17
+ linksFound: 0,
18
+ linksImported: 0,
19
+ linksSkipped: 0,
20
+ };
21
+ if (!fs.existsSync(sourcePath))
22
+ return report;
23
+ report.exists = true;
24
+ let source;
25
+ try {
26
+ source = new Database(sourcePath, { readonly: true, fileMustExist: true });
27
+ const memories = source
28
+ .prepare(`
29
+ SELECT id, type, category, title, content, project, tags, salience,
30
+ decayed_score, access_count, last_accessed, created_at,
31
+ metadata, embedding, scope, transferable
32
+ FROM memories
33
+ `)
34
+ .all();
35
+ const links = source
36
+ .prepare(`
37
+ SELECT source_id, target_id, relationship, strength, created_at
38
+ FROM memory_links
39
+ `)
40
+ .all();
41
+ report.memoriesFound = memories.length;
42
+ report.linksFound = links.length;
43
+ if (dryRun)
44
+ return report;
45
+ const insertMemory = target.prepare(`
46
+ INSERT INTO memories (
47
+ uuid, type, category, title, content, project, tags, salience,
48
+ decayed_score, access_count, last_accessed, created_at, updated_at,
49
+ metadata, embedding, scope, transferable, source, source_kind, capture_method
50
+ ) VALUES (
51
+ @uuid, @type, @category, @title, @content, @project, @tags, @salience,
52
+ @decayed_score, @access_count, @last_accessed, @created_at, @updated_at,
53
+ @metadata, @embedding, @scope, @transferable, @source, @source_kind, @capture_method
54
+ )
55
+ `);
56
+ const insertLink = target.prepare(`
57
+ INSERT OR IGNORE INTO memory_links (source_id, target_id, relationship, strength, created_at)
58
+ VALUES (?, ?, ?, ?, ?)
59
+ `);
60
+ const sourceLabel = path.basename(path.dirname(sourcePath));
61
+ const idMap = new Map();
62
+ const txn = target.transaction(() => {
63
+ for (const row of memories) {
64
+ const result = insertMemory.run({
65
+ uuid: randomUUID(),
66
+ type: row.type,
67
+ category: row.category,
68
+ title: row.title,
69
+ content: row.content,
70
+ project: row.project,
71
+ tags: row.tags ?? '[]',
72
+ salience: row.salience ?? 0.5,
73
+ decayed_score: row.decayed_score,
74
+ access_count: row.access_count ?? 0,
75
+ last_accessed: row.last_accessed,
76
+ created_at: row.created_at,
77
+ updated_at: row.created_at,
78
+ metadata: row.metadata ?? '{}',
79
+ embedding: row.embedding,
80
+ scope: row.scope ?? 'project',
81
+ transferable: row.transferable ?? 0,
82
+ source: `legacy:${sourceLabel}`,
83
+ source_kind: 'legacy-import',
84
+ capture_method: 'legacy-migrate',
85
+ });
86
+ idMap.set(row.id, Number(result.lastInsertRowid));
87
+ report.memoriesImported++;
88
+ }
89
+ for (const link of links) {
90
+ const newSource = idMap.get(link.source_id);
91
+ const newTarget = idMap.get(link.target_id);
92
+ if (newSource === undefined || newTarget === undefined) {
93
+ report.linksSkipped++;
94
+ continue;
95
+ }
96
+ const linkResult = insertLink.run(newSource, newTarget, link.relationship, link.strength ?? 0.5, link.created_at);
97
+ if (linkResult.changes > 0)
98
+ report.linksImported++;
99
+ else
100
+ report.linksSkipped++;
101
+ }
102
+ });
103
+ txn();
104
+ }
105
+ catch (err) {
106
+ report.error = err instanceof Error ? err.message : String(err);
107
+ }
108
+ finally {
109
+ source?.close();
110
+ }
111
+ return report;
112
+ }
113
+ export function migrateLegacy(options = {}) {
114
+ const sources = options.sources ?? DEFAULT_LEGACY_SOURCES;
115
+ const targetPath = options.target ?? DEFAULT_TARGET;
116
+ const dryRun = options.dryRun === true;
117
+ if (!fs.existsSync(targetPath)) {
118
+ throw new Error(`target DB does not exist: ${targetPath} (run \`shieldcortex setup\` first)`);
119
+ }
120
+ const target = new Database(targetPath);
121
+ // Foreign keys on so legacy links to deleted memories fail loudly.
122
+ target.pragma('foreign_keys = ON');
123
+ // The dashboard API server holds an open connection in WAL mode; give the
124
+ // SQLite locking layer plenty of room to coordinate so the migration
125
+ // doesn't bail with SQLITE_BUSY mid-transaction.
126
+ target.pragma('busy_timeout = 10000');
127
+ const report = {
128
+ target: targetPath,
129
+ dryRun,
130
+ sources: [],
131
+ totalMemories: 0,
132
+ totalLinks: 0,
133
+ };
134
+ try {
135
+ for (const sourcePath of sources) {
136
+ const sourceReport = migrateOne(sourcePath, target, dryRun);
137
+ report.sources.push(sourceReport);
138
+ report.totalMemories += sourceReport.memoriesImported;
139
+ report.totalLinks += sourceReport.linksImported;
140
+ }
141
+ }
142
+ finally {
143
+ target.close();
144
+ }
145
+ return report;
146
+ }
147
+ function printReport(report) {
148
+ const banner = report.dryRun ? '[DRY RUN] ' : '';
149
+ console.log(`${banner}Legacy memory migration → ${report.target}`);
150
+ console.log('');
151
+ for (const src of report.sources) {
152
+ if (!src.exists) {
153
+ console.log(` ${src.path}: not found, skipped`);
154
+ continue;
155
+ }
156
+ if (src.error) {
157
+ console.log(` ${src.path}: ERROR — ${src.error}`);
158
+ continue;
159
+ }
160
+ const verb = report.dryRun ? 'would import' : 'imported';
161
+ console.log(` ${src.path}:`);
162
+ console.log(` memories: ${src.memoriesFound} found, ${verb} ${src.memoriesImported}`);
163
+ console.log(` links: ${src.linksFound} found, ${verb} ${src.linksImported}, skipped ${src.linksSkipped}`);
164
+ }
165
+ console.log('');
166
+ console.log(report.dryRun
167
+ ? `Total: would import ${report.totalMemories} memories + ${report.totalLinks} links.`
168
+ : `Total: imported ${report.totalMemories} memories + ${report.totalLinks} links.`);
169
+ if (!report.dryRun) {
170
+ console.log('');
171
+ console.log('Tip: back up of the target DB was your responsibility — restore from');
172
+ console.log(' ~/.shieldcortex/memories.db.bak.* if needed.');
173
+ }
174
+ }
175
+ function flagValue(args, name) {
176
+ const idx = args.indexOf(name);
177
+ if (idx === -1)
178
+ return undefined;
179
+ const v = args[idx + 1];
180
+ if (!v || v.startsWith('--'))
181
+ return undefined;
182
+ return v;
183
+ }
184
+ async function runPrune(args) {
185
+ const { initDatabase } = await import('../database/init.js');
186
+ const { pruneMemories } = await import('../memory/prune.js');
187
+ initDatabase();
188
+ const dryRun = !args.includes('--execute');
189
+ const salienceLte = Number(flagValue(args, '--salience-lte') ?? 0.2);
190
+ const ageDaysGte = Number(flagValue(args, '--older-than') ?? 30);
191
+ const project = flagValue(args, '--project');
192
+ const includePinned = args.includes('--include-pinned');
193
+ const result = await pruneMemories({
194
+ salienceLte,
195
+ ageDaysGte,
196
+ project,
197
+ excludePinned: !includePinned,
198
+ dryRun,
199
+ });
200
+ const banner = dryRun ? '[DRY RUN] ' : '';
201
+ console.log(`${banner}Prune memories where salience <= ${salienceLte} AND age >= ${ageDaysGte}d`);
202
+ console.log(` Project: ${project ?? '(all)'} · ExcludePinned: ${!includePinned}`);
203
+ console.log(` Matched: ${result.matched}`);
204
+ if (result.sample.length > 0) {
205
+ console.log(' Sample:');
206
+ for (const s of result.sample) {
207
+ console.log(` #${s.id} [${s.project ?? '-'}] sal ${s.salience.toFixed(2)} · ${s.ageDays}d · ${s.title.slice(0, 60)}`);
208
+ }
209
+ }
210
+ if (!dryRun) {
211
+ console.log(` Deleted: ${result.deleted ?? 0}`);
212
+ if (result.backupPath)
213
+ console.log(` Backup: ${result.backupPath}`);
214
+ }
215
+ else if (result.matched > 0) {
216
+ console.log(' Re-run with --execute to delete.');
217
+ }
218
+ }
219
+ async function runDedupe(args) {
220
+ const { initDatabase } = await import('../database/init.js');
221
+ const { dedupeMemories } = await import('../memory/dedupe-runner.js');
222
+ initDatabase();
223
+ const dryRun = !args.includes('--execute');
224
+ const project = flagValue(args, '--project');
225
+ const limit = Number(flagValue(args, '--limit') ?? 200);
226
+ const result = await dedupeMemories({ project, dryRun, limit });
227
+ const banner = dryRun ? '[DRY RUN] ' : '';
228
+ console.log(`${banner}Dedupe long-term memories${project ? ` in project ${project}` : ' (all projects)'}`);
229
+ console.log(` Pairs scanned: ${result.pairsFound}`);
230
+ console.log(` Clusters: ${result.groups.length}`);
231
+ const totalRemovable = result.groups.reduce((sum, g) => sum + g.removeIds.length, 0);
232
+ console.log(` Removable: ${totalRemovable}`);
233
+ if (result.groups.length > 0) {
234
+ console.log(' Groups:');
235
+ for (const g of result.groups.slice(0, 10)) {
236
+ console.log(` keep #${g.keepId} [${g.removeIds.length} dup] ${g.similarity} — "${g.keepTitle.slice(0, 50)}"`);
237
+ }
238
+ if (result.groups.length > 10)
239
+ console.log(` … and ${result.groups.length - 10} more`);
240
+ }
241
+ if (!dryRun) {
242
+ console.log(` Merged: ${result.merged ?? 0}`);
243
+ if (result.backupPath)
244
+ console.log(` Backup: ${result.backupPath}`);
245
+ }
246
+ else if (totalRemovable > 0) {
247
+ console.log(' Re-run with --execute to merge.');
248
+ }
249
+ }
250
+ function printUsage() {
251
+ console.log('Usage: shieldcortex memories <subcommand> [options]');
252
+ console.log('');
253
+ console.log('Subcommands:');
254
+ console.log(' migrate-legacy [--dry-run] [--source <path>]');
255
+ console.log(' Import memories from ~/.claude-memory/ and ~/.claude-cortex/');
256
+ console.log(' into the current ~/.shieldcortex/memories.db.');
257
+ console.log('');
258
+ console.log(' prune [--salience-lte 0.2] [--older-than 30] [--project X]');
259
+ console.log(' [--include-pinned] [--execute]');
260
+ console.log(' Delete memories below salience X older than N days.');
261
+ console.log(' DRY-RUN BY DEFAULT — pass --execute to actually delete.');
262
+ console.log(' Backup auto-saved before any delete.');
263
+ console.log('');
264
+ console.log(' dedupe [--project X] [--limit 200] [--execute]');
265
+ console.log(' Cluster near-duplicate long-term memories and keep the highest-');
266
+ console.log(' salience representative. DRY-RUN BY DEFAULT — pass --execute.');
267
+ console.log(' Backup auto-saved before any merge.');
268
+ }
269
+ export async function handleMemoriesCommand(args) {
270
+ const sub = args[0];
271
+ if (sub === 'migrate-legacy') {
272
+ const dryRun = args.includes('--dry-run');
273
+ const sourceIdx = args.indexOf('--source');
274
+ const sources = sourceIdx !== -1 && args[sourceIdx + 1]
275
+ ? [args[sourceIdx + 1]]
276
+ : undefined;
277
+ const report = migrateLegacy({ sources, dryRun });
278
+ printReport(report);
279
+ return;
280
+ }
281
+ if (sub === 'prune') {
282
+ await runPrune(args.slice(1));
283
+ return;
284
+ }
285
+ if (sub === 'dedupe') {
286
+ await runDedupe(args.slice(1));
287
+ return;
288
+ }
289
+ printUsage();
290
+ process.exit(1);
291
+ }
package/dist/cloud/cli.js CHANGED
@@ -157,8 +157,8 @@ export function handleCloudConfig(args) {
157
157
  console.log(' --cloud-enable Enable cloud sync');
158
158
  console.log(' --cloud-disable Disable cloud sync');
159
159
  console.log(' --cloud-status Show current configuration');
160
- console.log(' --openclaw-auto-memory <true|false> Enable or disable OpenClaw auto-memory extraction');
161
- console.log(' --proactive-recall <true|false> Enable or disable proactive memory recall on prompts');
160
+ console.log(' --openclaw-auto-memory <true|false> Extract memories from OpenClaw LLM output (default: off)');
161
+ console.log(' --proactive-recall <true|false> Inject SC memory into prompts (default: off — adds latency)');
162
162
  console.log(' --restore-4.10-defaults Restore pre-v4.11.0 defaults (recall on, strict interceptor, minimal preamble)');
163
163
  console.log('');
164
164
  console.log('LLM Verification:');
@@ -116,6 +116,28 @@ export declare function setProactiveRecall(enabled: boolean): void;
116
116
  * so the flip is a one-command undo.
117
117
  */
118
118
  export declare function restore410Defaults(): void;
119
+ export interface AutoMemoryEnableConfig {
120
+ enableStop: boolean;
121
+ enableSessionEnd: boolean;
122
+ }
123
+ /**
124
+ * Returns the resolved on/off state of the opt-in auto-memory hooks.
125
+ *
126
+ * Default is false for both — preserves the OpenClaw-safe default that
127
+ * shipped in v4.13.0. The install flags (`--with-stop-hook` /
128
+ * `--with-session-end`) flip these to true so that wiring the hook in
129
+ * settings.json and enabling the runtime gate are a single user action.
130
+ */
131
+ export declare function getAutoMemoryEnableConfig(): AutoMemoryEnableConfig;
132
+ /**
133
+ * Persists the on/off state of the opt-in auto-memory hooks.
134
+ *
135
+ * Lives in `autoMemory.enableStop` / `autoMemory.enableSessionEnd` under
136
+ * `~/.shieldcortex/config.json` — the same namespace `auto-memory-config.mjs`
137
+ * reads from at hook fire time. Single source of truth: install flag +
138
+ * runtime gate cannot disagree.
139
+ */
140
+ export declare function setAutoMemoryEnableConfig(updates: Partial<AutoMemoryEnableConfig>): void;
119
141
  export interface ToolResponseScanConfig {
120
142
  scanToolResponses: boolean;
121
143
  toolResponseMode: 'advisory' | 'enforce';
@@ -499,6 +499,44 @@ export function restore410Defaults() {
499
499
  };
500
500
  writeRawConfig(raw);
501
501
  }
502
+ /**
503
+ * Returns the resolved on/off state of the opt-in auto-memory hooks.
504
+ *
505
+ * Default is false for both — preserves the OpenClaw-safe default that
506
+ * shipped in v4.13.0. The install flags (`--with-stop-hook` /
507
+ * `--with-session-end`) flip these to true so that wiring the hook in
508
+ * settings.json and enabling the runtime gate are a single user action.
509
+ */
510
+ export function getAutoMemoryEnableConfig() {
511
+ const raw = readRawConfig();
512
+ const am = raw.autoMemory && typeof raw.autoMemory === 'object'
513
+ ? raw.autoMemory
514
+ : {};
515
+ return {
516
+ enableStop: am.enableStop === true,
517
+ enableSessionEnd: am.enableSessionEnd === true,
518
+ };
519
+ }
520
+ /**
521
+ * Persists the on/off state of the opt-in auto-memory hooks.
522
+ *
523
+ * Lives in `autoMemory.enableStop` / `autoMemory.enableSessionEnd` under
524
+ * `~/.shieldcortex/config.json` — the same namespace `auto-memory-config.mjs`
525
+ * reads from at hook fire time. Single source of truth: install flag +
526
+ * runtime gate cannot disagree.
527
+ */
528
+ export function setAutoMemoryEnableConfig(updates) {
529
+ const raw = readRawConfig();
530
+ const existing = raw.autoMemory && typeof raw.autoMemory === 'object'
531
+ ? raw.autoMemory
532
+ : {};
533
+ if (updates.enableStop !== undefined)
534
+ existing.enableStop = updates.enableStop;
535
+ if (updates.enableSessionEnd !== undefined)
536
+ existing.enableSessionEnd = updates.enableSessionEnd;
537
+ raw.autoMemory = existing;
538
+ writeRawConfig(raw);
539
+ }
502
540
  const DEFAULT_TOOL_RESPONSE_SCAN_CONFIG = {
503
541
  scanToolResponses: true,
504
542
  toolResponseMode: 'advisory',
@@ -31,7 +31,14 @@ function expandPath(path) {
31
31
  * Get the database path with legacy fallback
32
32
  * - New installs use ~/.shieldcortex/
33
33
  * - Existing users with ~/.claude-memory/ continue to work
34
+ *
35
+ * DEPRECATION: the .claude-memory fallback will be removed in v5.0.0 (target
36
+ * Q3 2026). Existing users on the legacy path get a one-time-per-process
37
+ * warning pointing them at `shieldcortex migrate-legacy` so they can move to
38
+ * ~/.shieldcortex/ before the cut. Same applies to .claude-cortex (separate
39
+ * legacy DB read by the CLI migrate command).
34
40
  */
41
+ let _legacyFallbackWarned = false;
35
42
  function getDefaultDbPath() {
36
43
  const newPath = join(homedir(), '.shieldcortex', 'memories.db');
37
44
  const legacyPath = join(homedir(), '.claude-memory', 'memories.db');
@@ -39,7 +46,13 @@ function getDefaultDbPath() {
39
46
  if (existsSync(newPath) || !existsSync(legacyPath)) {
40
47
  return newPath;
41
48
  }
42
- // Fall back to legacy path for existing users
49
+ // Fall back to legacy path for existing users — warn once.
50
+ if (!_legacyFallbackWarned) {
51
+ _legacyFallbackWarned = true;
52
+ console.warn('[shieldcortex] DEPRECATED: reading from ~/.claude-memory/memories.db.');
53
+ console.warn('[shieldcortex] This fallback will be removed in v5.0.0 (target Q3 2026).');
54
+ console.warn('[shieldcortex] To migrate now: shieldcortex migrate-legacy');
55
+ }
43
56
  return legacyPath;
44
57
  }
45
58
  function resolveRuntimeInfo() {
@@ -729,6 +742,18 @@ function runMigrations(database) {
729
742
  CREATE INDEX IF NOT EXISTS idx_frag_entities_memory ON fragmentation_entities(memory_id);
730
743
  CREATE INDEX IF NOT EXISTS idx_frag_entities_text ON fragmentation_entities(entity_value);
731
744
  CREATE INDEX IF NOT EXISTS idx_frag_entities_type ON fragmentation_entities(entity_type);
745
+
746
+ CREATE TABLE IF NOT EXISTS hook_invocations (
747
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
748
+ hook_name TEXT NOT NULL,
749
+ invoked_at TEXT NOT NULL DEFAULT (datetime('now')),
750
+ exit_code INTEGER,
751
+ duration_ms INTEGER,
752
+ memories_extracted INTEGER DEFAULT 0,
753
+ transcript_bytes INTEGER,
754
+ notes TEXT
755
+ );
756
+ CREATE INDEX IF NOT EXISTS idx_hook_invocations_name_time ON hook_invocations(hook_name, invoked_at DESC);
732
757
  `);
733
758
  }
734
759
  catch {
package/dist/index.js CHANGED
@@ -522,7 +522,8 @@ ${bold}DOCS${reset}
522
522
  return;
523
523
  }
524
524
  const stopHook = process.argv.includes('--with-stop-hook');
525
- await setupClaudeMd({ stopHook });
525
+ const sessionEnd = process.argv.includes('--with-session-end');
526
+ await setupClaudeMd({ stopHook, sessionEnd });
526
527
  return;
527
528
  }
528
529
  // Handle "migrate" subcommand
@@ -584,6 +585,12 @@ ${bold}DOCS${reset}
584
585
  await handleReviewCopilotCommand(process.argv.slice(3), parsedArgs.dbPath);
585
586
  return;
586
587
  }
588
+ // Handle "memories" subcommand (memory database operations: migrate-legacy, ...)
589
+ if (process.argv[2] === 'memories') {
590
+ const { handleMemoriesCommand } = await import('./cli/migrate-legacy.js');
591
+ await handleMemoriesCommand(process.argv.slice(3));
592
+ return;
593
+ }
587
594
  // Handle "status" subcommand
588
595
  if (process.argv[2] === 'status') {
589
596
  const { handleStatusCommand } = await import('./setup/status.js');