shieldcortex 4.18.5 → 4.19.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 (262) 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/(dashboard)/admin/page_client-reference-manifest.js +1 -1
  4. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/cloud/page_client-reference-manifest.js +1 -1
  5. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/capture/page_client-reference-manifest.js +1 -1
  6. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/graph/page_client-reference-manifest.js +1 -1
  7. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page/react-loadable-manifest.json +1 -1
  8. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page_client-reference-manifest.js +1 -1
  9. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/recall/page_client-reference-manifest.js +1 -1
  10. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/replay/page_client-reference-manifest.js +1 -1
  11. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page_client-reference-manifest.js +1 -1
  12. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/timeline/page_client-reference-manifest.js +1 -1
  13. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/overview/page_client-reference-manifest.js +1 -1
  14. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/audit/page_client-reference-manifest.js +1 -1
  15. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/intercepts/page_client-reference-manifest.js +1 -1
  16. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/iron-dome/page_client-reference-manifest.js +1 -1
  17. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/page_client-reference-manifest.js +1 -1
  18. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/policies/page_client-reference-manifest.js +1 -1
  19. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/quarantine/page_client-reference-manifest.js +1 -1
  20. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  21. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/page_client-reference-manifest.js +1 -1
  22. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/xray/page_client-reference-manifest.js +1 -1
  23. package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/xray/page_client-reference-manifest.js +1 -1
  24. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.html +2 -2
  25. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.rsc +1 -1
  26. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  27. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  28. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  29. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  30. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  31. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  32. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.html +2 -2
  33. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.rsc +2 -2
  34. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  35. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  36. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  37. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  38. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  39. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  40. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.html +1 -1
  41. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.rsc +2 -2
  42. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin/__PAGE__.segment.rsc +1 -1
  43. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin.segment.rsc +1 -1
  44. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  45. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  46. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  47. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  48. package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  49. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.html +1 -1
  50. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.rsc +2 -2
  51. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud/__PAGE__.segment.rsc +1 -1
  52. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud.segment.rsc +1 -1
  53. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  54. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_full.segment.rsc +2 -2
  55. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_head.segment.rsc +1 -1
  56. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_index.segment.rsc +2 -2
  57. package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_tree.segment.rsc +2 -2
  58. package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
  59. package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +2 -2
  60. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  61. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_full.segment.rsc +2 -2
  62. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
  63. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_index.segment.rsc +2 -2
  64. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  65. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.html +1 -1
  66. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.rsc +2 -2
  67. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture/__PAGE__.segment.rsc +1 -1
  68. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture.segment.rsc +1 -1
  69. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  70. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  71. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_full.segment.rsc +2 -2
  72. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_head.segment.rsc +1 -1
  73. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_index.segment.rsc +2 -2
  74. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_tree.segment.rsc +2 -2
  75. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.html +1 -1
  76. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.rsc +2 -2
  77. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph/__PAGE__.segment.rsc +1 -1
  78. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph.segment.rsc +1 -1
  79. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  80. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  81. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_full.segment.rsc +2 -2
  82. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_head.segment.rsc +1 -1
  83. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_index.segment.rsc +2 -2
  84. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_tree.segment.rsc +2 -2
  85. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.html +1 -1
  86. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.rsc +2 -2
  87. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall/__PAGE__.segment.rsc +1 -1
  88. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall.segment.rsc +1 -1
  89. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  90. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  91. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_full.segment.rsc +2 -2
  92. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_head.segment.rsc +1 -1
  93. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_index.segment.rsc +2 -2
  94. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_tree.segment.rsc +2 -2
  95. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.html +2 -2
  96. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.rsc +2 -2
  97. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory/replay/__PAGE__.segment.rsc +1 -1
  98. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory/replay.segment.rsc +1 -1
  99. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  100. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  101. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_full.segment.rsc +2 -2
  102. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_head.segment.rsc +1 -1
  103. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_index.segment.rsc +2 -2
  104. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_tree.segment.rsc +2 -2
  105. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.html +1 -1
  106. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.rsc +2 -2
  107. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review/__PAGE__.segment.rsc +1 -1
  108. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review.segment.rsc +1 -1
  109. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  110. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  111. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_full.segment.rsc +2 -2
  112. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_head.segment.rsc +1 -1
  113. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_index.segment.rsc +2 -2
  114. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_tree.segment.rsc +2 -2
  115. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.html +1 -1
  116. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.rsc +2 -2
  117. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline/__PAGE__.segment.rsc +1 -1
  118. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline.segment.rsc +1 -1
  119. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  120. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  121. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_full.segment.rsc +2 -2
  122. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_head.segment.rsc +1 -1
  123. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_index.segment.rsc +2 -2
  124. package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_tree.segment.rsc +2 -2
  125. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.html +2 -2
  126. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.rsc +4 -4
  127. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory/__PAGE__.segment.rsc +2 -2
  128. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
  129. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  130. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_full.segment.rsc +4 -4
  131. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_head.segment.rsc +1 -1
  132. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_index.segment.rsc +2 -2
  133. package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_tree.segment.rsc +2 -2
  134. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.html +2 -2
  135. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.rsc +2 -2
  136. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview/__PAGE__.segment.rsc +1 -1
  137. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview.segment.rsc +1 -1
  138. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  139. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_full.segment.rsc +2 -2
  140. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_head.segment.rsc +1 -1
  141. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_index.segment.rsc +2 -2
  142. package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_tree.segment.rsc +2 -2
  143. package/dashboard/.next/standalone/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
  144. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.html +1 -1
  145. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.rsc +2 -2
  146. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit/__PAGE__.segment.rsc +1 -1
  147. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit.segment.rsc +1 -1
  148. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  149. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  150. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_full.segment.rsc +2 -2
  151. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_head.segment.rsc +1 -1
  152. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_index.segment.rsc +2 -2
  153. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_tree.segment.rsc +2 -2
  154. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.html +1 -1
  155. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.rsc +2 -2
  156. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts/__PAGE__.segment.rsc +1 -1
  157. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts.segment.rsc +1 -1
  158. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  159. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  160. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_full.segment.rsc +2 -2
  161. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_head.segment.rsc +1 -1
  162. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_index.segment.rsc +2 -2
  163. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_tree.segment.rsc +2 -2
  164. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.html +1 -1
  165. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.rsc +2 -2
  166. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome/__PAGE__.segment.rsc +1 -1
  167. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome.segment.rsc +1 -1
  168. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  169. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  170. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_full.segment.rsc +2 -2
  171. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_head.segment.rsc +1 -1
  172. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_index.segment.rsc +2 -2
  173. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_tree.segment.rsc +2 -2
  174. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.html +1 -1
  175. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.rsc +2 -2
  176. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies/__PAGE__.segment.rsc +1 -1
  177. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies.segment.rsc +1 -1
  178. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  179. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  180. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_full.segment.rsc +2 -2
  181. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_head.segment.rsc +1 -1
  182. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_index.segment.rsc +2 -2
  183. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_tree.segment.rsc +2 -2
  184. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.html +1 -1
  185. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.rsc +2 -2
  186. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine/__PAGE__.segment.rsc +1 -1
  187. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine.segment.rsc +1 -1
  188. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  189. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  190. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_full.segment.rsc +2 -2
  191. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_head.segment.rsc +1 -1
  192. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_index.segment.rsc +2 -2
  193. package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_tree.segment.rsc +2 -2
  194. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.html +2 -2
  195. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.rsc +2 -2
  196. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection/__PAGE__.segment.rsc +1 -1
  197. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
  198. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  199. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_full.segment.rsc +2 -2
  200. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_head.segment.rsc +1 -1
  201. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_index.segment.rsc +2 -2
  202. package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_tree.segment.rsc +2 -2
  203. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.html +2 -2
  204. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.rsc +5 -5
  205. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +2 -2
  206. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  207. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  208. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_full.segment.rsc +5 -5
  209. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  210. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  211. package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  212. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.html +1 -1
  213. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.rsc +2 -2
  214. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray/__PAGE__.segment.rsc +1 -1
  215. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray.segment.rsc +1 -1
  216. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
  217. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  218. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_full.segment.rsc +2 -2
  219. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_head.segment.rsc +1 -1
  220. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_index.segment.rsc +2 -2
  221. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_tree.segment.rsc +2 -2
  222. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.html +1 -1
  223. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.rsc +2 -2
  224. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain/__PAGE__.segment.rsc +1 -1
  225. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
  226. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  227. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_full.segment.rsc +2 -2
  228. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_head.segment.rsc +1 -1
  229. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_index.segment.rsc +2 -2
  230. package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_tree.segment.rsc +2 -2
  231. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.html +2 -2
  232. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.rsc +2 -2
  233. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray/__PAGE__.segment.rsc +1 -1
  234. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray.segment.rsc +1 -1
  235. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  236. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_full.segment.rsc +2 -2
  237. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_head.segment.rsc +1 -1
  238. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_index.segment.rsc +2 -2
  239. package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_tree.segment.rsc +2 -2
  240. package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_settings_SettingsView_tsx_16dc83a7._.js +1 -1
  241. package/dashboard/.next/standalone/dashboard/.next/server/pages/404.html +2 -2
  242. package/dashboard/.next/standalone/dashboard/.next/server/pages/500.html +2 -2
  243. package/dashboard/.next/standalone/dashboard/.next/static/chunks/{b2a6e883eaa58507.js → 1aba5ddfecdd0947.js} +1 -1
  244. package/dashboard/.next/standalone/dashboard/.next/static/chunks/{3505433bf7977a34.js → 3b671e7effc074d1.js} +1 -1
  245. package/dashboard/.next/standalone/dashboard/.next/static/chunks/3e48f207fc7388ce.css +1 -0
  246. package/dashboard/.next/standalone/dashboard/.next/static/chunks/{f645461768b1089e.js → 40c1a2122c341c45.js} +1 -1
  247. package/dashboard/.next/standalone/dashboard/.next/static/chunks/c55c1a1a956d2aff.js +1 -0
  248. package/dist/api/events.d.ts +15 -2
  249. package/dist/api/events.js +4 -3
  250. package/dist/api/routes/memories.js +17 -0
  251. package/dist/cli/doctor.js +41 -2
  252. package/dist/memory/lifecycle.js +12 -2
  253. package/dist/memory/store.js +24 -15
  254. package/openclaw.plugin.json +1 -1
  255. package/package.json +1 -1
  256. package/plugins/openclaw/dist/openclaw.plugin.json +1 -1
  257. package/plugins/openclaw/openclaw.plugin.json +1 -1
  258. package/dashboard/.next/standalone/dashboard/.next/static/chunks/5274a6127d41c42c.js +0 -1
  259. package/dashboard/.next/standalone/dashboard/.next/static/chunks/d52895fa7c120f49.css +0 -1
  260. /package/dashboard/.next/standalone/dashboard/.next/static/{HFEEde1UaS_gHzGU_hwZD → _LSTiJwW66UqK0oxazE0y}/_buildManifest.js +0 -0
  261. /package/dashboard/.next/standalone/dashboard/.next/static/{HFEEde1UaS_gHzGU_hwZD → _LSTiJwW66UqK0oxazE0y}/_clientMiddlewareManifest.json +0 -0
  262. /package/dashboard/.next/standalone/dashboard/.next/static/{HFEEde1UaS_gHzGU_hwZD → _LSTiJwW66UqK0oxazE0y}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,42424,e=>{"use strict";var t=e.i(27493),s=e.i(16871),r=e.i(4),a=e.i(53615),c=e.i(24929);let n=(0,c.default)("cloud",[["path",{d:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z",key:"p7xjir"}]]),i=(0,c.default)("credit-card",[["rect",{width:"20",height:"14",x:"2",y:"5",rx:"2",key:"ynyp8z"}],["line",{x1:"2",x2:"22",y1:"10",y2:"10",key:"1b3vmo"}]]),l=(0,c.default)("plug",[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z",key:"1xoxul"}],["path",{d:"M9 8V2",key:"14iosj"}]]);var d=e.i(54130),o=e.i(40950),x=e.i(16467),u=e.i(95659),m=e.i(81523),p=e.i(18509),v=e.i(15771),h=e.i(19331),y=e.i(7571),g=e.i(84012);let b=(0,c.default)("key-round",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]);var j=e.i(67307);let f=(0,c.default)("server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);var N=e.i(51069),w=e.i(45688),k=e.i(71921),C=e.i(1235),S=e.i(88969);let E=[],A="http://localhost:3001";function M(){return(0,w.useQuery)({queryKey:["cloud-config"],queryFn:async()=>{var e;let t,s,r=await (0,S.authFetch)(`${A}/api/cloud/config`);if(!r.ok)throw Error(await (0,S.readApiError)(r,"Failed to fetch cloud config"));return t=(e=await r.json()).syncControls&&"object"==typeof e.syncControls?e.syncControls:{},s=e.openclawMemory&&"object"==typeof e.openclawMemory?e.openclawMemory:{},{enabled:!!e.enabled,apiKeySet:!!e.apiKeySet,baseUrl:"string"==typeof e.baseUrl?e.baseUrl:"https://api.shieldcortex.ai",syncControls:{projectMode:"projectMode"in t&&("include"===t.projectMode||"exclude"===t.projectMode)?t.projectMode:"all",projects:Array.isArray(t.projects)?t.projects.filter(e=>"string"==typeof e):E,contentMode:"contentMode"in t&&"metadata"===t.contentMode?"metadata":"full",excludeSensitive:"excludeSensitive"in t&&!!t.excludeSensitive},openclawMemory:{autoMemory:"autoMemory"in s&&!!s.autoMemory,dedupe:"dedupe"in s&&!!s.dedupe,noveltyThreshold:"noveltyThreshold"in s&&"number"==typeof s.noveltyThreshold?s.noveltyThreshold:.88,maxRecent:"maxRecent"in s&&"number"==typeof s.maxRecent?s.maxRecent:300}}},refetchInterval:3e4})}let q="http://localhost:3001",T=[];function $(){return(0,w.useQuery)({queryKey:["cloud-sync-status"],queryFn:async()=>{var e;let t,s,r,a,c=await (0,S.authFetch)(`${q}/api/cloud/sync-status`);if(!c.ok)throw Error(await (0,S.readApiError)(c,"Failed to fetch sync status"));return t=(e=await c.json()).controls&&"object"==typeof e.controls?e.controls:{},r="byKind"in(s=e.queue&&"object"==typeof e.queue?e.queue:{})&&s.byKind&&"object"==typeof s.byKind?s.byKind:{},a=e=>({pending:Number(r[e]?.pending??0),failed:Number(r[e]?.failed??0),synced:Number(r[e]?.synced??0)}),{enabled:!!e.enabled,apiKeySet:!!e.apiKeySet,baseUrl:"string"==typeof e.baseUrl?e.baseUrl:"https://api.shieldcortex.ai",featureEnabled:!!e.featureEnabled,requiredTier:"pro"===e.requiredTier||"team"===e.requiredTier||"enterprise"===e.requiredTier?e.requiredTier:"free",controls:{projectMode:"projectMode"in t&&("include"===t.projectMode||"exclude"===t.projectMode)?t.projectMode:"all",projects:Array.isArray(t.projects)?t.projects.filter(e=>"string"==typeof e):T,contentMode:"contentMode"in t&&"metadata"===t.contentMode?"metadata":"full",excludeSensitive:"excludeSensitive"in t&&!!t.excludeSensitive},lastSyncAt:"string"==typeof e.lastSyncAt||null===e.lastSyncAt?e.lastSyncAt??null:null,device:{id:e.device&&"object"==typeof e.device&&"id"in e.device&&"string"==typeof e.device.id?e.device.id:"unknown",name:e.device&&"object"==typeof e.device&&"name"in e.device&&"string"==typeof e.device.name?e.device.name:"Unknown device",platform:e.device&&"object"==typeof e.device&&"platform"in e.device&&"string"==typeof e.device.platform?e.device.platform:"unknown"},queue:{pending:Number(s.pending??0),failed:Number(s.failed??0),synced:Number(s.synced??0),byKind:{audit:a("audit"),quarantine:a("quarantine"),memory:a("memory"),graph:a("graph"),unknown:a("unknown")},oldestPendingAt:"string"==typeof s.oldestPendingAt||null===s.oldestPendingAt?s.oldestPendingAt??null:null,nextRetryAt:"string"==typeof s.nextRetryAt||null===s.nextRetryAt?s.nextRetryAt??null:null,lastError:"string"==typeof s.lastError||null===s.lastError?s.lastError??null:null,lastErrorKind:"audit"===s.lastErrorKind||"quarantine"===s.lastErrorKind||"memory"===s.lastErrorKind||"graph"===s.lastErrorKind||"unknown"===s.lastErrorKind?s.lastErrorKind:null,latestFailureAt:"string"==typeof s.latestFailureAt||null===s.latestFailureAt?s.latestFailureAt??null:null}}},refetchInterval:3e4,staleTime:15e3})}var P=e.i(63312),R=e.i(50279);function F(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));if(t<60)return`${t}s ago`;let s=Math.floor(t/60);if(s<60)return`${s}m ago`;let r=Math.floor(s/60);if(r<24)return`${r}h ago`;let a=Math.floor(r/24);return`${a}d ago`}function L(e){let t=Math.max(0,Math.floor((new Date(e).getTime()-Date.now())/1e3));if(t<60)return`in ${t}s`;let s=Math.floor(t/60);if(s<60)return`in ${s}m`;let r=Math.floor(s/60);if(r<24)return`in ${r}h`;let a=Math.floor(r/24);return`in ${a}d`}function K(){var e;let{data:s,isLoading:r}=$(),{data:a}=(0,P.useLicenseStatus)();if(r||!s)return null;let c="border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/70 text-[var(--sc-text-primary)]",i="Cloud sync disabled",l="Enable cloud sync and activate a Team licence to start replicating local data.",d=n;(e=s.lastSyncAt)&&(Date.now(),new Date(e).getTime());let o=s.queue.byKind.memory.pending+s.queue.byKind.graph.pending,x=s.queue.byKind.memory.failed+s.queue.byKind.graph.failed,u=s.queue.byKind.audit.failed+s.queue.byKind.quarantine.failed+s.queue.byKind.unknown.failed;return s.enabled&&s.apiKeySet&&!s.featureEnabled?(c="border-[var(--sc-amber)]/30 bg-[var(--sc-amber)]/10 text-[var(--sc-amber)]",i="Cloud configured but licence locked",l=`Cloud sync requires the ${R.TIER_LABELS[s.requiredTier]} tier. Current tier: ${R.TIER_LABELS[a?.tier??"free"]}.`,d=b):s.enabled&&s.apiKeySet&&o>0&&x>0?(c="border-[var(--sc-coral)]/30 bg-[var(--sc-coral)]/10 text-[var(--sc-coral)]",i="Cloud sync needs attention",l=s.queue.lastError??"One or more queued sync jobs are failing.",d=N.ShieldAlert):s.enabled&&s.apiKeySet&&x>0?(c="border-[var(--sc-amber)]/30 bg-[var(--sc-amber)]/10 text-[var(--sc-amber)]",i=`${x} failed sync job${1===x?"":"s"} need clearing`,l=s.queue.lastError?`${s.queue.lastError}${s.queue.latestFailureAt?` Last failure ${F(s.queue.latestFailureAt)}.`:""}`:"These items exhausted retries and won't sync automatically. Clear them or investigate the cause.",d=p.AlertTriangle):s.enabled&&s.apiKeySet&&o>0?(c="border-[var(--sc-amber)]/30 bg-[var(--sc-amber)]/10 text-[var(--sc-amber)]",i="Cloud sync is catching up",l=s.queue.nextRetryAt?`Next retry ${L(s.queue.nextRetryAt)}.`:"Queued jobs are waiting to flush.",d=j.RefreshCw):s.enabled&&s.apiKeySet&&(c="border-[var(--sc-cyan)]/30 bg-[var(--sc-cyan)]/10 text-[var(--sc-cyan)]",i="Cloud sync healthy",l=s.lastSyncAt?`Last successful sync ${F(s.lastSyncAt)}.`:"Connected and ready to sync.",u>0&&(l+=` Auxiliary audit/quarantine history: ${u} failed job${1===u?"":"s"}.`),d=v.CheckCircle2),(0,t.jsx)("div",{className:`rounded-2xl border p-4 ${c}`,children:(0,t.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,t.jsxs)("div",{className:"flex items-start gap-3",children:[(0,t.jsx)(d,{size:18,className:"mt-0.5 shrink-0"}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-sm font-semibold",children:i}),(0,t.jsx)("p",{className:"mt-1 text-sm opacity-90",children:l})]})]}),x>0&&0===o&&(0,t.jsx)(_,{})]})})}function I({label:e,value:s,detail:r,icon:a}){return(0,t.jsxs)("div",{className:"glass-card p-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:e}),(0,t.jsx)(a,{size:15,className:"text-[var(--sc-text-muted)]"})]}),(0,t.jsx)("div",{className:"mt-2 text-2xl font-semibold text-[var(--sc-text-primary)]",children:s}),(0,t.jsx)("div",{className:"mt-1 text-xs text-[var(--sc-text-secondary)]",children:r})]})}function z({label:e,pending:s,failed:r,synced:a}){return(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-3",children:[(0,t.jsx)("div",{className:"text-sm font-medium text-[var(--sc-text-primary)]",children:e}),(0,t.jsxs)("div",{className:"mt-3 grid grid-cols-3 gap-2 text-xs",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[var(--sc-text-muted)]",children:"Pending"}),(0,t.jsx)("div",{className:"mt-1 font-semibold text-[var(--sc-amber)]",children:s})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[var(--sc-text-muted)]",children:"Failed"}),(0,t.jsx)("div",{className:"mt-1 font-semibold text-[var(--sc-coral)]",children:r})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[var(--sc-text-muted)]",children:"Synced"}),(0,t.jsx)("div",{className:"mt-1 font-semibold text-[var(--sc-cyan)]",children:a})]})]})]})}function O(){let e,{data:s}=M(),{data:a}=(0,w.useQuery)({queryKey:["cloud-projects"],queryFn:async()=>{let e=await (0,S.authFetch)(`${A}/api/cloud/projects`);if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to fetch cloud projects"));return e.json()},staleTime:3e4}),c=(e=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async e=>{let t=await (0,S.authFetch)(`${A}/api/cloud/config`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok)throw Error(await (0,S.readApiError)(t,"Failed to update cloud config"));return t.json()},onSuccess:()=>{e.invalidateQueries({queryKey:["cloud-config"]}),e.invalidateQueries({queryKey:["cloud-sync-status"]})}})),[n,i]=(0,r.useState)(null),l=a?.projects??[],d=n??s?.syncControls??{projectMode:"all",projects:[],contentMode:"full",excludeSensitive:!1},o="all"!==d.projectMode,[x,u]=(0,r.useState)("idle");async function m(){try{await c.mutateAsync({cloudSyncProjectMode:d.projectMode,cloudSyncProjects:d.projects,cloudSyncContentMode:d.contentMode,cloudSyncExcludeSensitive:d.excludeSensitive}),i(null),u("saved"),setTimeout(()=>u("idle"),2e3)}catch{u("error"),setTimeout(()=>u("idle"),3e3)}}return(0,t.jsxs)("div",{className:"glass-card-strong p-5",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Sync Controls"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-[var(--sc-text-secondary)]",children:"Decide what leaves this device before it hits the cloud replica."})]}),(0,t.jsx)("button",{type:"button",onClick:()=>void m(),disabled:c.isPending,className:`rounded-lg border px-3 py-2 text-sm font-medium transition disabled:cursor-not-allowed disabled:opacity-50 ${"saved"===x?"border-[var(--sc-cyan)]/50 bg-[var(--sc-cyan)]/20 text-[var(--sc-cyan)]":"error"===x?"border-[var(--sc-coral)]/50 bg-[var(--sc-coral)]/20 text-[var(--sc-coral)]":"border-[var(--sc-cyan)]/30 bg-[var(--sc-cyan)]/10 text-[var(--sc-cyan)] hover:bg-[var(--sc-cyan)]/20"}`,children:c.isPending?"Saving...":"saved"===x?"✓ Saved":"error"===x?"Failed to save":"Save controls"})]}),(0,t.jsxs)("div",{className:"mt-5 grid gap-4",children:[(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:[(0,t.jsx)("div",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:"Content mode"}),(0,t.jsxs)("div",{className:"mt-2 flex flex-wrap gap-2 text-[11px] text-[var(--sc-text-secondary)]",children:[(0,t.jsx)("span",{className:"rounded-full border border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/60 px-2.5 py-1",children:"metadata"===d.contentMode?"Metadata only":"Full content"}),(0,t.jsxs)("span",{className:"rounded-full border border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/60 px-2.5 py-1",children:["Sensitive filter ",d.excludeSensitive?"on":"off"]})]}),(0,t.jsxs)("div",{className:"mt-3 grid gap-2 md:grid-cols-2",children:[(0,t.jsxs)("label",{className:`rounded-lg border p-3 text-sm ${"full"===d.contentMode?"border-[var(--sc-cyan)]/40 bg-[var(--sc-cyan)]/10 text-[var(--sc-cyan)]":"border-[var(--sc-border)] text-[var(--sc-text-primary)]"}`,children:[(0,t.jsx)("input",{type:"radio",className:"mr-2",checked:"full"===d.contentMode,onChange:()=>i(e=>({...e??d,contentMode:"full"}))}),"Full content",(0,t.jsx)("div",{className:"mt-1 text-xs text-[var(--sc-text-secondary)]",children:"Titles and memory bodies replicate to cloud."})]}),(0,t.jsxs)("label",{className:`rounded-lg border p-3 text-sm ${"metadata"===d.contentMode?"border-[var(--sc-cyan)]/40 bg-[var(--sc-cyan)]/10 text-[var(--sc-cyan)]":"border-[var(--sc-border)] text-[var(--sc-text-primary)]"}`,children:[(0,t.jsx)("input",{type:"radio",className:"mr-2",checked:"metadata"===d.contentMode,onChange:()=>i(e=>({...e??d,contentMode:"metadata"}))}),"Metadata only",(0,t.jsx)("div",{className:"mt-1 text-xs text-[var(--sc-text-secondary)]",children:"Projects, tags, salience, and graph remain; body content is redacted."})]})]})]}),(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:[(0,t.jsx)("div",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:"Project scope"}),(0,t.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:["all","include","exclude"].map(e=>(0,t.jsx)("button",{type:"button",onClick:()=>i(t=>({...t??d,projectMode:e})),className:`rounded-full border px-3 py-1.5 text-xs font-medium uppercase tracking-wide ${d.projectMode===e?"border-[var(--sc-cyan)]/40 bg-[var(--sc-cyan)]/10 text-[var(--sc-cyan)]":"border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/60 text-[var(--sc-text-primary)]"}`,children:e},e))}),(0,t.jsx)("p",{className:"mt-3 text-xs text-[var(--sc-text-secondary)]",children:"all"===d.projectMode?"All local projects are eligible for sync.":"include"===d.projectMode?"Only the selected projects will sync.":"Selected projects stay local-only."}),o&&(0,t.jsxs)("details",{className:"mt-3 rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/40 p-3",children:[(0,t.jsxs)("summary",{className:"cursor-pointer list-none text-sm font-medium text-[var(--sc-text-primary)]",children:["Choose projects ",d.projects.length>0?`(${d.projects.length} selected)`:""]}),(0,t.jsx)("div",{className:"mt-3 max-h-48 overflow-y-auto",children:0===l.length?(0,t.jsx)("div",{className:"text-xs text-[var(--sc-text-muted)]",children:"No named projects found in local memory yet."}):(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:l.map(e=>{let s=d.projects.includes(e.project);return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;return t=e.project,void i(e=>{let s=e??d,r=s.projects.includes(t)?s.projects.filter(e=>e!==t):[...s.projects,t].sort((e,t)=>e.localeCompare(t));return{...s,projects:r}})},className:`rounded-full border px-3 py-1.5 text-xs ${s?"border-[var(--sc-cyan)]/40 bg-[var(--sc-cyan)]/10 text-[var(--sc-cyan)]":"border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 text-[var(--sc-text-primary)]"}`,children:[e.project," ",(0,t.jsxs)("span",{className:"text-[var(--sc-text-muted)]",children:["(",e.count,")"]})]},e.project)})})})]})]}),(0,t.jsxs)("label",{className:"flex items-start gap-3 rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4 text-sm text-[var(--sc-text-primary)]",children:[(0,t.jsx)("input",{type:"checkbox",className:"mt-0.5",checked:d.excludeSensitive,onChange:e=>i(t=>({...t??d,excludeSensitive:e.target.checked}))}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"font-medium text-[var(--sc-text-primary)]",children:"Exclude sensitive memories"}),(0,t.jsx)("div",{className:"mt-1 text-xs text-[var(--sc-text-secondary)]",children:"Skip memories whose sensitivity level is higher than INTERNAL when syncing to cloud."})]})]}),c.isError&&(0,t.jsx)("div",{className:"rounded-xl border border-[var(--sc-coral)]/30 bg-[var(--sc-coral)]/10 p-3 text-sm text-[var(--sc-coral)]",children:c.error.message})]})]})}function B({sync:e,cloudConfig:s}){return(0,t.jsxs)("div",{className:"glass-card-strong p-5",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Current policy"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-[var(--sc-text-secondary)]",children:"The snapshot below is the current cloud posture. Edit it in Sync Controls when you need to change what leaves this device."}),(0,t.jsxs)("div",{className:"mt-4 grid gap-3 md:grid-cols-2",children:[(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:[(0,t.jsx)("div",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:"Sync scope"}),(0,t.jsx)("div",{className:"mt-2 text-sm font-medium text-[var(--sc-text-primary)]",children:e.controls.projectMode}),(0,t.jsxs)("div",{className:"mt-1 text-xs text-[var(--sc-text-secondary)]",children:[e.controls.projects.length," selected project",1===e.controls.projects.length?"":"s"]})]}),(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:[(0,t.jsx)("div",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:"Content mode"}),(0,t.jsx)("div",{className:"mt-2 text-sm font-medium text-[var(--sc-text-primary)]",children:"metadata"===e.controls.contentMode?"Metadata only":"Full content"}),(0,t.jsxs)("div",{className:"mt-1 text-xs text-[var(--sc-text-secondary)]",children:["Sensitive filter ",e.controls.excludeSensitive?"enabled":"off"]})]}),(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:[(0,t.jsx)("div",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:"Cloud endpoint"}),(0,t.jsx)("div",{className:"mt-2 text-sm font-medium text-[var(--sc-text-primary)]",children:e.baseUrl})]}),(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:[(0,t.jsx)("div",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:"OpenClaw complement"}),(0,t.jsxs)("div",{className:"mt-2 grid grid-cols-2 gap-2 text-xs text-[var(--sc-text-primary)]",children:[(0,t.jsxs)("span",{children:["Auto-memory: ",s.openclawMemory.autoMemory?"On":"Off"]}),(0,t.jsxs)("span",{children:["Dedupe: ",s.openclawMemory.dedupe?"On":"Off"]}),(0,t.jsxs)("span",{children:["Novelty: ",s.openclawMemory.noveltyThreshold]}),(0,t.jsxs)("span",{children:["Recent window: ",s.openclawMemory.maxRecent]})]})]})]})]})}function _(){let e,s=(e=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async()=>{let e=await (0,S.authFetch)(`${q}/api/cloud/sync-queue/clear-failed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to clear failed items"));return e.json()},onSuccess:()=>{e.invalidateQueries({queryKey:["cloud-sync-status"]})}}));return(0,t.jsx)("button",{type:"button",onClick:()=>s.mutate(),disabled:s.isPending,className:"shrink-0 rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-elevated)]/50 px-3 py-1.5 text-xs text-[var(--sc-text-secondary)] transition hover:border-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)] disabled:opacity-50",children:s.isPending?"Clearing...":s.isSuccess?`Cleared ${s.data?.cleared??0}`:"Clear failed"})}function U(){let{data:e,isLoading:s,refetch:r,isFetching:a}=$(),{data:c,isLoading:i}=M(),{data:l,isLoading:d}=(0,P.useLicenseStatus)();if(s||i||d||!e||!c||!l)return(0,t.jsx)("div",{className:"space-y-6",children:(0,t.jsx)("div",{className:"glass-card p-6 text-sm text-[var(--sc-text-secondary)]",children:"Loading cloud diagnostics..."})});let o=l.tier,x=e.queue.byKind.memory,u=e.queue.byKind.graph,m=x.failed+u.failed,b=e.queue.byKind.audit.failed+e.queue.byKind.quarantine.failed+e.queue.byKind.unknown.failed,N=e.lastSyncAt?F(e.lastSyncAt):"Never",w=m>0?"Needs review":x.pending+u.pending>0?"Catching up":"Healthy";return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[(0,t.jsx)("span",{className:`rounded-full px-2.5 py-1 font-medium ${R.TIER_BG[o]} ${R.TIER_COLOURS[o]}`,children:R.TIER_LABELS[o]}),(0,t.jsxs)("span",{className:"rounded-full border border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/70 px-2.5 py-1 text-[var(--sc-text-primary)]",children:["Last sync: ",N]}),(0,t.jsx)("button",{type:"button",onClick:()=>void r(),disabled:a,className:"rounded-full border border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/70 px-2.5 py-1 text-[var(--sc-text-muted)] transition hover:text-[var(--sc-text-primary)] disabled:opacity-50",title:"Refresh sync status",children:(0,t.jsx)(j.RefreshCw,{size:12,className:a?"animate-spin":""})})]}),(0,t.jsx)(K,{}),(0,t.jsxs)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-5",children:[(0,t.jsx)(I,{label:"Replication",value:w,detail:`${m} failed \xb7 ${x.pending+u.pending} pending`,icon:j.RefreshCw}),(0,t.jsx)(I,{label:"Device",value:e.device.name,detail:`${e.device.platform} \xb7 ${e.device.id.slice(0,12)}`,icon:f}),(0,t.jsx)(I,{label:"Cloud Target",value:new URL(e.baseUrl).host,detail:e.enabled?"Configured target":"Disabled in config",icon:n}),(0,t.jsx)(I,{label:"Memory Queue",value:x.pending,detail:`${x.failed} failed \xb7 ${x.synced} synced`,icon:y.Database}),(0,t.jsx)(I,{label:"Graph Queue",value:u.pending,detail:`${u.failed} failed \xb7 ${u.synced} synced`,icon:g.GitBranch})]}),(0,t.jsxs)("div",{className:"grid grid-cols-1 gap-6 xl:grid-cols-[1.35fr_0.95fr]",children:[(0,t.jsxs)("div",{className:"glass-card p-5",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Replication"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-[var(--sc-text-secondary)]",children:"Memory and graph sync queues. Items are synced to your cloud replica automatically."})]}),m>0&&(0,t.jsx)(_,{})]}),(0,t.jsxs)("div",{className:"mt-5 grid grid-cols-1 gap-3 md:grid-cols-2",children:[(0,t.jsx)(z,{label:"Memory",...x}),(0,t.jsx)(z,{label:"Graph",...u})]}),(0,t.jsxs)("details",{className:"mt-5 rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/30 p-4",children:[(0,t.jsx)("summary",{className:"cursor-pointer list-none text-sm font-medium text-[var(--sc-text-primary)]",children:"Advanced transport signals"}),(0,t.jsxs)("div",{className:"mt-4 grid grid-cols-1 gap-3 md:grid-cols-2",children:[(0,t.jsx)(z,{label:"Audit",...e.queue.byKind.audit}),(0,t.jsx)(z,{label:"Quarantine",...e.queue.byKind.quarantine})]}),(0,t.jsx)("div",{className:"mt-4 overflow-hidden rounded-xl border border-[var(--sc-border)]",children:(0,t.jsxs)("table",{className:"min-w-full divide-y divide-[var(--sc-border)] text-sm",children:[(0,t.jsx)("thead",{className:"bg-[var(--sc-bg-deep)]/70 text-[var(--sc-text-secondary)]",children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{className:"px-4 py-3 text-left font-medium",children:"Signal"}),(0,t.jsx)("th",{className:"px-4 py-3 text-left font-medium",children:"Current value"}),(0,t.jsx)("th",{className:"px-4 py-3 text-left font-medium",children:"Why it matters"})]})}),(0,t.jsxs)("tbody",{className:"divide-y divide-[var(--sc-border)] bg-[var(--sc-bg-surface)]/40 text-[var(--sc-text-primary)]",children:[(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{className:"px-4 py-3",children:"Oldest queued job"}),(0,t.jsx)("td",{className:"px-4 py-3",children:e.queue.oldestPendingAt?F(e.queue.oldestPendingAt):"None queued"}),(0,t.jsx)("td",{className:"px-4 py-3 text-[var(--sc-text-secondary)]",children:"If this stays old while pending grows, the local worker is falling behind."})]}),(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{className:"px-4 py-3",children:"Next retry"}),(0,t.jsx)("td",{className:"px-4 py-3",children:e.queue.nextRetryAt?L(e.queue.nextRetryAt):"Idle"}),(0,t.jsx)("td",{className:"px-4 py-3 text-[var(--sc-text-secondary)]",children:"Confirms whether failures are retrying normally or the queue is stuck."})]}),(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{className:"px-4 py-3",children:"Failed jobs in history"}),(0,t.jsx)("td",{className:"px-4 py-3",children:m}),(0,t.jsx)("td",{className:"px-4 py-3 text-[var(--sc-text-secondary)]",children:"These are retained replication dead-letter records for memory and graph sync."})]}),(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{className:"px-4 py-3",children:"Auxiliary failed history"}),(0,t.jsx)("td",{className:"px-4 py-3",children:b}),(0,t.jsx)("td",{className:"px-4 py-3 text-[var(--sc-text-secondary)]",children:"Audit and quarantine retry history is shown here for debugging, but it does not mean memory replication is currently blocked."})]}),(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{className:"px-4 py-3",children:"Latest memory sync"}),(0,t.jsx)("td",{className:"px-4 py-3",children:e.lastSyncAt?F(e.lastSyncAt):"Not recorded"}),(0,t.jsx)("td",{className:"px-4 py-3 text-[var(--sc-text-secondary)]",children:"This is the best quick indicator for whether cloud replication is actually current."})]})]})]})})]})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,t.jsx)(O,{}),(0,t.jsx)(B,{sync:e,cloudConfig:c}),(0,t.jsxs)("div",{className:"glass-card-strong p-5",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Last actionable error"}),(0,t.jsx)("div",{className:"mt-4 rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:e.queue.lastError?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:`flex items-center gap-2 text-sm font-medium ${e.queue.pending>0?"text-[var(--sc-coral)]":"text-[var(--sc-amber)]"}`,children:[(0,t.jsx)(p.AlertTriangle,{size:16}),e.queue.lastErrorKind?`${e.queue.lastErrorKind} queue`:"Unknown queue"]}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--sc-text-primary)]",children:e.queue.lastError}),e.queue.latestFailureAt&&(0,t.jsxs)("div",{className:"mt-2 text-xs text-[var(--sc-text-muted)]",children:["Recorded ",F(e.queue.latestFailureAt)]}),e.queue.nextRetryAt&&(0,t.jsxs)("div",{className:"mt-3 inline-flex items-center gap-1 rounded-full bg-[var(--sc-bg-surface)] px-2 py-1 text-xs text-[var(--sc-text-secondary)]",children:[(0,t.jsx)(h.Clock3,{size:12}),"Retry ",L(e.queue.nextRetryAt)]})]}):(0,t.jsxs)("div",{className:"flex items-center gap-2 text-sm text-[var(--sc-cyan)]",children:[(0,t.jsx)(v.CheckCircle2,{size:16}),"No recent sync errors recorded."]})})]})]})]})]})}var Q=e.i(48615),D=e.i(84982),G=e.i(76490);function H({label:e,description:s,checked:r,pending:a=!1,disabled:c=!1,docsUrl:n,onChange:i}){let l=!c&&!a;return(0,t.jsxs)("label",{className:(0,G.cn)("flex items-start gap-4 border border-[var(--term-border)] bg-[var(--term-surface)] p-4 rounded-md transition-colors",l&&"cursor-pointer hover:border-[var(--term-electric)]",!l&&"opacity-70 cursor-not-allowed"),children:[(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsxs)("div",{className:"text-sm text-[var(--term-text)]",children:[(0,t.jsx)("span",{className:"text-[var(--term-text-muted)]","aria-hidden":!0,children:"›"})," ",e]}),(0,t.jsxs)("div",{className:"mt-1 text-xs leading-5 text-[var(--term-text-muted)]",children:[s,n&&(0,t.jsxs)(t.Fragment,{children:[" ",(0,t.jsx)("a",{href:n,target:"_blank",rel:"noopener noreferrer",className:"text-[var(--term-electric-fg)] hover:underline",onClick:e=>e.stopPropagation(),children:"docs →"})]})]})]}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2 self-start pt-0.5 theme-glass:hidden",children:[a&&(0,t.jsx)(D.Loader2,{size:12,className:"animate-spin text-[var(--term-text-muted)]","aria-hidden":!0}),(0,t.jsx)("span",{className:(0,G.cn)("font-mono text-xs uppercase tracking-wider",r?"text-[var(--term-neon-fg)]":"text-[var(--term-text-muted)]"),children:r?"[on]":"[off]"})]}),(0,t.jsxs)("div",{className:"relative hidden h-6 w-11 shrink-0 items-center theme-glass:flex","aria-hidden":"true",children:[a&&(0,t.jsx)(D.Loader2,{size:12,className:"absolute -left-5 top-1.5 animate-spin text-[var(--sc-text-muted)]"}),(0,t.jsx)("span",{className:(0,G.cn)("absolute inset-0 rounded-full transition-colors",r?"bg-[var(--sc-cyan)]":"bg-[var(--sc-bg-elevated)] border border-[var(--sc-border)]")}),(0,t.jsx)("span",{className:(0,G.cn)("absolute top-0.5 h-5 w-5 rounded-full bg-white shadow transition-transform",r?"translate-x-5":"translate-x-0.5")})]}),(0,t.jsx)("input",{type:"checkbox",checked:r,disabled:!l,onChange:e=>i(e.target.checked),className:"sr-only"})]})}var J=e.i(22534);let V=J.default.env.NEXT_PUBLIC_API_URL||"http://localhost:3001";function X(){let e,{data:s,isLoading:r,error:c}=(0,w.useQuery)({queryKey:["integrations-config"],queryFn:async()=>{let e=await (0,S.gatedFetch)(`${V}/api/cloud/config`);if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to load integration toggles"));let t=await e.json();return{openclawAutoMemory:!!t.openclawMemory?.autoMemory,proactiveRecall:!!t.proactiveRecall}},refetchOnWindowFocus:!0}),n=(e=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async e=>{let t=await (0,S.gatedFetch)(`${V}/api/cloud/config`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok)throw Error(await (0,S.readApiError)(t,"Failed to update integration toggle"));return t.json()},onSuccess:()=>{e.invalidateQueries({queryKey:["integrations-config"]}),e.invalidateQueries({queryKey:["cloud-config"]})}})),i=(e,t)=>{n.mutate(e,{onSuccess:()=>Q.toast.success(t),onError:e=>Q.toast.error(e instanceof Error?e.message:"Failed to update toggle")})};if(r)return(0,t.jsxs)(x.GlassCard,{className:"p-6 space-y-4",children:[(0,t.jsx)(a.Skeleton,{className:"h-16 w-full"}),(0,t.jsx)(a.Skeleton,{className:"h-16 w-full"})]});if(c||!s)return(0,t.jsx)(x.GlassCard,{className:"p-6",children:(0,t.jsxs)("p",{className:"text-sm text-[var(--sc-coral)]",children:["Failed to load integration toggles: ",c instanceof Error?c.message:"Unknown error"]})});let l=n.isPending,d=l?Object.keys(n.variables??{})[0]:void 0;return(0,t.jsx)("div",{className:"space-y-4",children:(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Integrations"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-[var(--sc-text-secondary)]",children:"Both toggles are off by default. They were turned off in v4.11.0 after fleet evidence showed they hurt fast agent loops; turn them on if you run interactive sessions or want richer memory capture."}),(0,t.jsxs)("div",{className:"mt-5 space-y-3",children:[(0,t.jsx)(H,{label:"OpenClaw Auto-Memory",description:"Extract memories from OpenClaw LLM output (decisions, fixes, learnings, preferences). Off by default — turn on for interactive sessions, leave off for fast agent loops.",checked:s.openclawAutoMemory,pending:"openclawAutoMemory"===d,disabled:l&&"openclawAutoMemory"!==d,docsUrl:"https://shieldcortex.ai/docs/integrations#openclaw-auto-memory",onChange:e=>i({openclawAutoMemory:e},e?"OpenClaw auto-memory enabled":"OpenClaw auto-memory disabled")}),(0,t.jsx)(H,{label:"Proactive Recall",description:"Inject relevant SC memory into every prompt. Adds 200–500ms latency and 100–400 tokens per turn. Net-negative for fast agent loops; useful for deep interactive sessions.",checked:s.proactiveRecall,pending:"proactiveRecall"===d,disabled:l&&"proactiveRecall"!==d,docsUrl:"https://shieldcortex.ai/docs/integrations#proactive-recall",onChange:e=>i({proactiveRecall:e},e?"Proactive recall enabled":"Proactive recall disabled")})]}),(0,t.jsxs)("p",{className:"mt-5 text-[11px] text-[var(--sc-text-muted)]",children:["You can also toggle these via the CLI: ",(0,t.jsx)("code",{className:"font-mono",children:"shieldcortex config --openclaw-auto-memory true|false"})," ·"," ",(0,t.jsx)("code",{className:"font-mono",children:"shieldcortex config --proactive-recall true|false"})]})]})})}var Y=e.i(45434),W=e.i(61737),Z=e.i(13808);let ee=J.default.env.NEXT_PUBLIC_API_URL||"http://localhost:3001";function et(e){if(!e)return"never";let t=Date.now()-new Date(e).getTime();if(t<0)return"just now";let s=Math.floor(t/1e3);if(s<60)return`${s}s ago`;let r=Math.floor(s/60);if(r<60)return`${r}m ago`;let a=Math.floor(r/60);if(a<24)return`${a}h ago`;let c=Math.floor(a/24);return`${c}d ago`}function es(){let e,s,r,{data:a,isLoading:c}=(0,w.useQuery)({queryKey:["worker-status"],queryFn:async()=>{let e=await (0,S.gatedFetch)(`${ee}/api/worker/status`);if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to load worker status"));return e.json()},refetchInterval:1e4}),{data:n}=(0,w.useQuery)({queryKey:["memory-stats"],queryFn:async()=>{let e=await (0,S.gatedFetch)(`${ee}/api/stats`);if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to load memory stats"));return e.json()},refetchInterval:3e4}),i=(e=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async()=>{let e=await (0,S.gatedFetch)(`${ee}/api/worker/trigger-light`,{method:"POST"});if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to run light tick"));return e.json()},onSuccess:()=>{e.invalidateQueries({queryKey:["worker-status"]}),e.invalidateQueries({queryKey:["memory-stats"]})}})),l=(s=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async()=>{let e=await (0,S.gatedFetch)(`${ee}/api/worker/trigger-medium`,{method:"POST"});if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to run medium tick"));return e.json()},onSuccess:()=>{s.invalidateQueries({queryKey:["worker-status"]}),s.invalidateQueries({queryKey:["memory-stats"]})}})),d=(r=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async()=>{let e=await (0,S.gatedFetch)(`${ee}/api/consolidate`,{method:"POST"});if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to run consolidation"));return e.json()},onSuccess:()=>{r.invalidateQueries({queryKey:["worker-status"]}),r.invalidateQueries({queryKey:["memory-stats"]})}})),o=i.isPending||l.isPending||d.isPending;return(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(W.Brain,{size:16,className:"text-[var(--sc-cyan)]"}),(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Memory Maintenance"}),a?.isRunning?(0,t.jsx)(u.Badge,{variant:"cyan",dot:!0,children:"Running"}):c?(0,t.jsx)(u.Badge,{variant:"muted",children:"Loading"}):(0,t.jsx)(u.Badge,{variant:"amber",children:"Stopped"})]}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--sc-text-secondary)]",children:"Background brain worker prunes activation cache, consolidates short-term to long-term, removes low-salience duplicates, and prunes orphan graph entities. Runs automatically on intervals; you can trigger a tick manually below."}),n&&(0,t.jsxs)("div",{className:"mt-4 grid grid-cols-3 gap-3 text-sm",children:[(0,t.jsxs)("div",{className:"rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/50 p-3",children:[(0,t.jsx)("div",{className:"text-[10px] uppercase tracking-[0.14em] text-[var(--sc-text-muted)]",children:"Healthy"}),(0,t.jsx)("div",{className:"mt-1 text-xl font-semibold text-[var(--sc-cyan)]",children:n.decayDistribution.healthy})]}),(0,t.jsxs)("div",{className:"rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/50 p-3",children:[(0,t.jsx)("div",{className:"text-[10px] uppercase tracking-[0.14em] text-[var(--sc-text-muted)]",children:"Fading"}),(0,t.jsx)("div",{className:"mt-1 text-xl font-semibold text-[var(--sc-amber)]",children:n.decayDistribution.fading})]}),(0,t.jsxs)("div",{className:"rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/50 p-3",children:[(0,t.jsx)("div",{className:"text-[10px] uppercase tracking-[0.14em] text-[var(--sc-text-muted)]",children:"Critical"}),(0,t.jsx)("div",{className:"mt-1 text-xl font-semibold text-[var(--sc-coral)]",children:n.decayDistribution.critical})]})]}),(0,t.jsxs)("div",{className:"mt-4 space-y-2 rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/50 p-3 text-xs",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Light tick (every ~5 min)"}),(0,t.jsxs)("span",{className:"text-[var(--sc-text-primary)]",children:[et(a?.lastLightTick??null)," · ",a?.stats.lightTicks??0," runs"]})]}),(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Heavy tick (every ~1 hr)"}),(0,t.jsxs)("span",{className:"text-[var(--sc-text-primary)]",children:[et(a?.lastMediumTick??null)," · ",a?.stats.mediumTicks??0," runs"]})]}),(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Last consolidation"}),(0,t.jsxs)("span",{className:"text-[var(--sc-text-primary)]",children:[et(a?.lastConsolidation??null)," · ",a?.stats.consolidations??0," runs"]})]})]}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap gap-2",children:[(0,t.jsxs)(m.Button,{variant:"outline",size:"sm",onClick:()=>{i.mutate(void 0,{onSuccess:()=>Q.toast.success("Light cleanup triggered"),onError:e=>Q.toast.error(e instanceof Error?e.message:"Failed to trigger light cleanup")})},disabled:o,pulse:i.isPending,children:[(0,t.jsx)(Y.Activity,{size:13}),i.isPending?"Running":"Run light cleanup"]}),(0,t.jsxs)(m.Button,{variant:"outline",size:"sm",onClick:()=>{l.mutate(void 0,{onSuccess:()=>Q.toast.success("Heavy cleanup triggered"),onError:e=>Q.toast.error(e instanceof Error?e.message:"Failed to trigger heavy cleanup")})},disabled:o,pulse:l.isPending,children:[(0,t.jsx)(j.RefreshCw,{size:13}),l.isPending?"Running":"Run heavy cleanup"]}),(0,t.jsxs)(m.Button,{variant:"cyan",size:"sm",onClick:()=>{d.mutate(void 0,{onSuccess:()=>Q.toast.success("Consolidation triggered"),onError:e=>Q.toast.error(e instanceof Error?e.message:"Failed to trigger consolidation")})},disabled:o,pulse:d.isPending,children:[(0,t.jsx)(Z.Sparkles,{size:13}),d.isPending?"Running":"Consolidate now"]})]}),(0,t.jsxs)("p",{className:"mt-3 text-[11px] text-[var(--sc-text-muted)]",children:["CLI equivalent: ",(0,t.jsx)("code",{className:"font-mono",children:"shieldcortex consolidate"}),". Auto-cleanup runs continuously while the dashboard service is up; check"," ",(0,t.jsx)("code",{className:"font-mono",children:"shieldcortex service status"})," if ticks haven't advanced."]})]})}var er=e.i(71259),ea=e.i(77744),ec=e.i(42098);let en=[.1,.2,.3,.4,.5],ei=[7,30,90,180,365];function el(){let e,{projectFilter:s}=(0,ec.useDashboardStore)(),[a,c]=(0,r.useState)(.2),[n,i]=(0,r.useState)(30),[l,d]=(0,r.useState)(!0),[o,u]=(0,r.useState)(s?"current":"all"),[p,v]=(0,r.useState)(null),h=(e=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async e=>{let t=await (0,S.gatedFetch)(`${ee}/api/memories/prune`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok)throw Error(await (0,S.readApiError)(t,"Failed to prune"));return t.json()},onSuccess:t=>{"number"==typeof t.deleted&&(e.invalidateQueries({queryKey:["memory-stats"]}),e.invalidateQueries({queryKey:["integrations-config"]}))}})),y="current"===o&&s?s:void 0;return(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(ea.Trash2,{size:16,className:"text-[var(--sc-coral)]"}),(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Threshold Prune"})]}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--sc-text-secondary)]",children:"Permanently delete memories below a salience threshold older than N days. Always preview first; backup is automatic before any delete."}),(0,t.jsxs)("div",{className:"mt-4 grid gap-4 md:grid-cols-2",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between text-xs",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Salience ≤"}),(0,t.jsx)("span",{className:"font-mono text-[var(--sc-text-primary)]",children:a.toFixed(2)})]}),(0,t.jsx)("input",{type:"range",min:0,max:.5,step:.05,value:a,onChange:e=>c(parseFloat(e.target.value)),className:"mt-1 w-full accent-[var(--sc-coral)]","aria-label":"Salience threshold"}),(0,t.jsx)("div",{className:"mt-1 flex gap-1",children:en.map(e=>(0,t.jsx)("button",{type:"button",onClick:()=>c(e),className:`rounded border px-1.5 py-0.5 text-[10px] transition ${a===e?"border-[var(--sc-coral)] text-[var(--sc-coral)]":"border-[var(--sc-border)] text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)]"}`,children:e},e))})]}),(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between text-xs",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Older than (days)"}),(0,t.jsx)("span",{className:"font-mono text-[var(--sc-text-primary)]",children:n})]}),(0,t.jsx)("input",{type:"range",min:1,max:365,step:1,value:n,onChange:e=>i(parseInt(e.target.value,10)),className:"mt-1 w-full accent-[var(--sc-coral)]","aria-label":"Age threshold"}),(0,t.jsx)("div",{className:"mt-1 flex gap-1",children:ei.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>i(e),className:`rounded border px-1.5 py-0.5 text-[10px] transition ${n===e?"border-[var(--sc-coral)] text-[var(--sc-coral)]":"border-[var(--sc-border)] text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)]"}`,children:[e,"d"]},e))})]})]}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-3 text-xs",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Scope:"}),(0,t.jsx)("button",{type:"button",onClick:()=>u("all"),className:`rounded-md border px-2 py-1 ${"all"===o?"border-[var(--sc-cyan)] text-[var(--sc-cyan)]":"border-[var(--sc-border)] text-[var(--sc-text-muted)]"}`,children:"All projects"}),(0,t.jsxs)("button",{type:"button",disabled:!s,onClick:()=>u("current"),className:`rounded-md border px-2 py-1 disabled:opacity-40 ${"current"===o?"border-[var(--sc-cyan)] text-[var(--sc-cyan)]":"border-[var(--sc-border)] text-[var(--sc-text-muted)]"}`,children:["Current (",s??"none selected",")"]}),(0,t.jsxs)("label",{className:"ml-auto inline-flex items-center gap-2 text-[var(--sc-text-secondary)]",children:[(0,t.jsx)("input",{type:"checkbox",checked:l,onChange:e=>d(e.target.checked),className:"accent-[var(--sc-cyan)]"}),"Exclude pinned"]})]}),p&&(0,t.jsxs)("div",{className:"mt-4 rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/50 p-3",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("span",{className:"text-sm font-semibold text-[var(--sc-text-primary)]",children:[p.matched," memories match"]}),(0,t.jsxs)("span",{className:"text-[10px] text-[var(--sc-text-muted)]",children:["showing first ",p.sample.length]})]}),0===p.sample.length?(0,t.jsx)("div",{className:"mt-2 text-xs text-[var(--sc-text-muted)]",children:"Nothing to prune at these thresholds."}):(0,t.jsx)("ul",{className:"mt-2 max-h-48 space-y-1 overflow-y-auto text-xs",children:p.sample.map(e=>(0,t.jsxs)("li",{className:"flex items-baseline gap-2 text-[var(--sc-text-secondary)]",children:[(0,t.jsxs)("span",{className:"font-mono text-[10px] text-[var(--sc-text-muted)]",children:["#",e.id]}),(0,t.jsx)("span",{className:"truncate flex-1 text-[var(--sc-text-primary)]",children:e.title}),(0,t.jsxs)("span",{className:"text-[10px] text-[var(--sc-text-muted)]",children:[e.project??"(no project)"," · sal ",e.salience.toFixed(2)," · ",e.ageDays,"d"]})]},e.id))})]}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap gap-2",children:[(0,t.jsxs)(m.Button,{variant:"outline",size:"sm",onClick:()=>{v(null),h.mutate({salienceLte:a,ageDaysGte:n,excludePinned:l,project:y,dryRun:!0},{onSuccess:e=>{v(e),Q.toast.success(`${e.matched} memories match — review before delete`)},onError:e=>Q.toast.error(e.message)})},disabled:h.isPending,pulse:h.isPending&&h.variables?.dryRun,children:[(0,t.jsx)(er.Eye,{size:13}),h.isPending&&h.variables?.dryRun?"Previewing":"Preview"]}),(0,t.jsxs)(m.Button,{variant:"coral",size:"sm",onClick:()=>{!p||0===p.matched||window.confirm(`Permanently delete ${p.matched} memories? A backup is auto-saved first.`)&&h.mutate({salienceLte:a,ageDaysGte:n,excludePinned:l,project:y,dryRun:!1},{onSuccess:e=>{v(null),Q.toast.success(`Deleted ${e.deleted??0}. Backup: ${e.backupPath??"see ~/.shieldcortex/backups/"}`,{duration:8e3})},onError:e=>Q.toast.error(e.message)})},disabled:!p||0===p.matched||h.isPending,pulse:h.isPending&&h.variables?.dryRun===!1,children:[(0,t.jsx)(ea.Trash2,{size:13}),h.isPending&&h.variables?.dryRun===!1?"Deleting":p?`Delete ${p.matched}`:"Delete"]})]})]})}let ed=(0,c.default)("git-merge",[["circle",{cx:"18",cy:"18",r:"3",key:"1xkwt0"}],["circle",{cx:"6",cy:"6",r:"3",key:"1lh9wr"}],["path",{d:"M6 21V9a9 9 0 0 0 9 9",key:"7kw0sc"}]]);var eo=e.i(6847);function ex(){let e,{projectFilter:s}=(0,ec.useDashboardStore)(),[a,c]=(0,r.useState)(s?"current":"all"),[n,i]=(0,r.useState)(null),l=(e=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async e=>{let t=await (0,S.gatedFetch)(`${ee}/api/memories/dedupe`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok)throw Error(await (0,S.readApiError)(t,"Failed to dedupe"));return t.json()},onSuccess:t=>{"number"==typeof t.merged&&e.invalidateQueries({queryKey:["memory-stats"]})}})),d="current"===a&&s?s:void 0,o=n?.groups.reduce((e,t)=>e+t.removeIds.length,0)??0;return(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(ed,{size:16,className:"text-[var(--sc-cyan)]"}),(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Project Dedupe"})]}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--sc-text-secondary)]",children:"Find clusters of near-duplicate long-term memories (text similarity: title overlap + content Jaccard). Merging keeps the highest-salience representative and deletes the rest. Backup auto-saved before any merge."}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-3 text-xs",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Scope:"}),(0,t.jsx)("button",{type:"button",onClick:()=>c("all"),className:`rounded-md border px-2 py-1 ${"all"===a?"border-[var(--sc-cyan)] text-[var(--sc-cyan)]":"border-[var(--sc-border)] text-[var(--sc-text-muted)]"}`,children:"All projects"}),(0,t.jsxs)("button",{type:"button",disabled:!s,onClick:()=>c("current"),className:`rounded-md border px-2 py-1 disabled:opacity-40 ${"current"===a?"border-[var(--sc-cyan)] text-[var(--sc-cyan)]":"border-[var(--sc-border)] text-[var(--sc-text-muted)]"}`,children:["Current (",s??"none selected",")"]})]}),n&&(0,t.jsxs)("div",{className:"mt-4 rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/50 p-3",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("span",{className:"text-sm font-semibold text-[var(--sc-text-primary)]",children:[n.groups.length," cluster(s) · ",o," removable"]}),(0,t.jsxs)("span",{className:"text-[10px] text-[var(--sc-text-muted)]",children:[n.pairsFound," pairs scanned"]})]}),0===n.groups.length?(0,t.jsx)("div",{className:"mt-2 text-xs text-[var(--sc-text-muted)]",children:"No duplicates at the current heuristic threshold."}):(0,t.jsx)("ul",{className:"mt-2 max-h-64 space-y-2 overflow-y-auto text-xs",children:n.groups.map(e=>(0,t.jsxs)("li",{className:"rounded border border-[var(--sc-border)] bg-[var(--sc-bg-surface)] p-2",children:[(0,t.jsxs)("div",{className:"text-[10px] uppercase tracking-[0.14em] text-[var(--sc-text-muted)]",children:["Keep #",e.keepId," · remove ",e.removeIds.length," · ",e.similarity]}),(0,t.jsx)("div",{className:"mt-1 font-semibold text-[var(--sc-text-primary)] truncate",children:e.keepTitle}),(0,t.jsxs)("div",{className:"mt-0.5 text-[var(--sc-text-secondary)]",children:["Will delete: ",e.removeIds.map(e=>`#${e}`).join(", ")]})]},e.keepId))})]}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap gap-2",children:[(0,t.jsxs)(m.Button,{variant:"outline",size:"sm",onClick:()=>{i(null),l.mutate({project:d,dryRun:!0},{onSuccess:e=>{i(e),Q.toast.success(0===e.groups.length?"No duplicate clusters found":`Found ${e.groups.length} cluster(s), ${e.groups.reduce((e,t)=>e+t.removeIds.length,0)} removable`)},onError:e=>Q.toast.error(e.message)})},disabled:l.isPending,pulse:l.isPending&&l.variables?.dryRun,children:[(0,t.jsx)(eo.Search,{size:13}),l.isPending&&l.variables?.dryRun?"Scanning":"Find duplicates"]}),(0,t.jsxs)(m.Button,{variant:"cyan",size:"sm",onClick:()=>{!n||0===o||window.confirm(`Merge ${n.groups.length} cluster(s) and delete ${o} duplicate(s)? Backup auto-saved first.`)&&l.mutate({project:d,dryRun:!1},{onSuccess:e=>{i(null),Q.toast.success(`Merged ${e.merged??0}. Backup: ${e.backupPath??"see ~/.shieldcortex/backups/"}`,{duration:8e3})},onError:e=>Q.toast.error(e.message)})},disabled:!n||0===o||l.isPending,pulse:l.isPending&&l.variables?.dryRun===!1,children:[(0,t.jsx)(ed,{size:13}),l.isPending&&l.variables?.dryRun===!1?"Merging":n&&o>0?`Merge all (${o})`:"Merge"]})]})]})}var eu=e.i(27528);let em=(0,c.default)("key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);var ep=e.i(77715),ev=e.i(66949);let eh=(0,c.default)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]),ey=(0,c.default)("chevron-up",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]),eg="https://api.shieldcortex.ai",eb=J.default.env.NEXT_PUBLIC_API_URL||"http://localhost:3001",ej=["Custom injection patterns","Custom Iron Dome policies","Custom firewall rules","Audit export (JSON/CSV)","Skill scanner deep mode"];function ef(){let{data:e,isLoading:s}=(0,P.useLicenseStatus)(),a=(0,P.useActivateLicense)(),c=(0,P.useDeactivateLicense)(),n=function(){let e=(0,C.useQueryClient)(),[t,s]=(0,r.useState)("idle"),[a,c]=(0,r.useState)(null),[n,i]=(0,r.useState)(null),l=(0,r.useCallback)(async(e,t)=>{s("submitting"),c(null);try{let r=await fetch(`${eg}/v1/billing/quick-checkout`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,plan:t})}),a=await r.json();if(!r.ok||!a.checkout_url||!a.setup_id)throw Error(a.error||"Failed to create checkout session");i(a.setup_id),window.open(a.checkout_url,"_blank"),s("polling")}catch(e){c(e instanceof Error?e.message:"Checkout failed"),s("error")}},[]);return(0,r.useEffect)(()=>{if("polling"!==t||!n)return;let r=setInterval(async()=>{try{let t=await fetch(`${eg}/v1/billing/setup-status/${n}`),a=await t.json();if("complete"===a.status&&a.license_key){clearInterval(r),s("activating");try{if(!(await (0,S.authFetch)(`${eb}/api/license/activate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:a.license_key})})).ok)throw Error("Local activation failed");e.invalidateQueries({queryKey:["license-status"]}),s("complete")}catch{c('Payment succeeded but local activation failed. Use "I Have a Key" to activate manually.'),s("error")}}else"expired"===a.status?(clearInterval(r),c("Setup expired. Please try again."),s("error")):"complete"!==a.status||a.license_key||(clearInterval(r),c("Licence key was already retrieved. Check your dashboard or try again."),s("error"))}catch{}},3e3),a=setTimeout(()=>{clearInterval(r),c('Checkout timed out. If you completed payment, use "I Have a Key" or contact support.'),s("error")},9e5);return()=>{clearInterval(r),clearTimeout(a)}},[t,n,e]),{state:t,error:a,startCheckout:l,reset:(0,r.useCallback)(()=>{s("idle"),c(null),i(null)},[])}}(),[i,l]=(0,r.useState)(""),[d,o]=(0,r.useState)("default"),[x,u]=(0,r.useState)(""),[m,p]=(0,r.useState)("pro"),[h,y]=(0,r.useState)(!1);if(s||!e)return(0,t.jsx)("div",{className:"bg-[var(--sc-bg-surface)] border border-[var(--sc-border)] rounded-xl p-4 mb-4",children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(eu.Shield,{size:16,className:"text-[var(--sc-text-muted)]"}),(0,t.jsx)("span",{className:"text-xs text-[var(--sc-text-muted)] animate-pulse",children:"Loading licence..."})]})});let g=e.tier;if("free"===g)return(0,t.jsxs)("div",{className:"relative overflow-hidden rounded-xl mb-4 bg-gradient-to-br from-slate-900 via-[var(--sc-bg-surface)] to-cyan-950/30 border border-[var(--sc-cyan)]/30",children:[(0,t.jsx)("div",{className:"absolute top-0 right-0 w-32 h-32 bg-[var(--sc-cyan)]/5 rounded-full blur-2xl -translate-y-1/2 translate-x-1/2"}),(0,t.jsxs)("div",{className:"relative p-5",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,t.jsx)("div",{className:"flex items-center justify-center w-8 h-8 rounded-lg bg-[var(--sc-cyan)]/10 border border-[var(--sc-cyan)]/20",children:(0,t.jsx)(Z.Sparkles,{size:16,className:"text-[var(--sc-cyan)]"})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-semibold text-[var(--sc-text-primary)]",children:"Unlock Pro Features"}),(0,t.jsx)("p",{className:"text-[11px] text-[var(--sc-text-secondary)] mt-0.5",children:"Your defence pipeline is fully active. Upgrade for advanced controls."})]})]}),(0,t.jsx)("span",{className:"text-[10px] font-medium px-2 py-0.5 rounded-full bg-[var(--sc-bg-elevated)] text-[var(--sc-text-secondary)] border border-[var(--sc-border)]",children:"Free"})]}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-x-4 gap-y-1.5 mb-4",children:ej.map(e=>(0,t.jsxs)("div",{className:"flex items-center gap-1.5 text-xs",children:[(0,t.jsx)(ev.Lock,{size:10,className:"text-[var(--sc-cyan)]/60 shrink-0"}),(0,t.jsx)("span",{className:"text-[var(--sc-text-secondary)]",children:e})]},e))}),"complete"===n.state?(0,t.jsxs)("div",{className:"flex items-center gap-2 p-3 bg-[var(--sc-cyan)]/10 border border-[var(--sc-cyan)]/20 rounded-lg",children:[(0,t.jsx)(v.CheckCircle2,{size:16,className:"text-[var(--sc-cyan)] shrink-0"}),(0,t.jsx)("span",{className:"text-xs text-[var(--sc-cyan)]",children:"Pro activated! Your dashboard is refreshing..."})]}):"polling"===n.state||"activating"===n.state?(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 p-3 bg-[var(--sc-cyan)]/10 border border-[var(--sc-cyan)]/20 rounded-lg",children:[(0,t.jsx)(D.Loader2,{size:14,className:"text-[var(--sc-cyan)] animate-spin shrink-0"}),(0,t.jsx)("span",{className:"text-xs text-[var(--sc-cyan)]",children:"activating"===n.state?"Activating licence...":"Complete payment in the Stripe tab..."})]}),(0,t.jsx)("button",{onClick:()=>{n.reset(),o("default")},className:"text-[10px] text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)] transition-colors",children:"Cancel"})]}):"checkout"===d?(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"text-[10px] text-[var(--sc-text-muted)] mb-1 block",children:"Email"}),(0,t.jsx)("input",{type:"email",placeholder:"you@company.com",value:x,onChange:e=>u(e.target.value),className:"w-full bg-[var(--sc-bg-elevated)] border border-[var(--sc-border)] rounded-lg px-3 py-2 text-xs text-[var(--sc-text-primary)] placeholder:text-[var(--sc-text-muted)] focus:outline-none focus:ring-1 focus:ring-[var(--sc-cyan)]",autoFocus:!0})]}),(0,t.jsx)("div",{className:"flex gap-2",children:["pro","team"].map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>p(e),className:`flex-1 px-3 py-2 text-xs font-medium rounded-lg border transition-colors ${m===e?"bg-[var(--sc-cyan)]/20 border-[var(--sc-cyan)]/50 text-[var(--sc-cyan)]":"bg-[var(--sc-bg-elevated)] border-[var(--sc-border)] text-[var(--sc-text-secondary)] hover:border-[var(--sc-border)]"}`,children:[R.PLAN_PRICING[e].label," — ",R.PLAN_PRICING[e].price]},e))}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("button",{onClick:()=>n.startCheckout(x,m),disabled:"submitting"===n.state||!x.trim(),className:"flex-1 inline-flex items-center justify-center gap-1.5 px-4 py-2 text-xs font-medium bg-[var(--sc-cyan)] hover:bg-[var(--sc-cyan-mid)] disabled:opacity-50 text-[var(--sc-text-primary)] rounded-lg transition-colors",children:"submitting"===n.state?(0,t.jsx)(D.Loader2,{size:12,className:"animate-spin"}):"Continue to Checkout"}),(0,t.jsx)("button",{onClick:()=>{o("default"),n.reset()},className:"px-3 py-2 text-xs text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)] transition-colors",children:"Back"})]}),n.error&&(0,t.jsx)("p",{className:"text-xs text-[var(--sc-coral)]",children:n.error})]}):"activate"===d?(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("form",{onSubmit:e=>{e.preventDefault(),i.trim()&&a.mutate(i.trim(),{onSuccess:()=>{l(""),o("default")}})},className:"flex gap-2",children:[(0,t.jsx)("input",{type:"text",placeholder:"sc_pro_...",value:i,onChange:e=>l(e.target.value),className:"flex-1 bg-[var(--sc-bg-elevated)] border border-[var(--sc-border)] rounded-lg px-3 py-2 text-xs text-[var(--sc-text-primary)] placeholder:text-[var(--sc-text-muted)] focus:outline-none focus:ring-1 focus:ring-[var(--sc-cyan)]",autoFocus:!0}),(0,t.jsx)("button",{type:"submit",disabled:a.isPending||!i.trim(),className:"px-4 py-2 text-xs font-medium bg-[var(--sc-cyan)] hover:bg-[var(--sc-cyan-mid)] disabled:opacity-50 text-[var(--sc-text-primary)] rounded-lg transition-colors",children:a.isPending?(0,t.jsx)(D.Loader2,{size:12,className:"animate-spin"}):"Activate"}),(0,t.jsx)("button",{type:"button",onClick:()=>{o("default"),l(""),a.reset()},className:"px-3 py-2 text-xs text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)] transition-colors",children:"Back"})]}),a.isError&&(0,t.jsx)("p",{className:"text-xs text-[var(--sc-coral)]",children:a.error instanceof Error?a.error.message:"Activation failed"})]}):(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("button",{onClick:()=>o("checkout"),className:"inline-flex items-center gap-1.5 px-4 py-2 text-xs font-medium bg-[var(--sc-cyan)] hover:bg-[var(--sc-cyan-mid)] text-[var(--sc-text-primary)] rounded-lg transition-colors",children:"Upgrade to Pro"}),(0,t.jsxs)("button",{onClick:()=>o("activate"),className:"inline-flex items-center gap-1.5 px-4 py-2 text-xs font-medium bg-[var(--sc-bg-elevated)] hover:bg-[var(--sc-bg-elevated)] text-[var(--sc-text-primary)] rounded-lg transition-colors border border-[var(--sc-border)]",children:[(0,t.jsx)(em,{size:12}),"I Have a Key"]})]}),n.error&&(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("p",{className:"text-xs text-[var(--sc-coral)]",children:n.error}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("button",{onClick:()=>{n.reset(),o("checkout")},className:"text-[10px] text-[var(--sc-cyan)] hover:text-[var(--sc-cyan)] transition-colors",children:"Try Again"}),(0,t.jsx)("span",{className:"text-[10px] text-[var(--sc-text-muted)]",children:"·"}),(0,t.jsx)("button",{onClick:()=>{n.reset(),o("activate")},className:"text-[10px] text-[var(--sc-text-secondary)] hover:text-[var(--sc-text-primary)] transition-colors",children:"I Have a Key"})]})]})]})]})]});let b=e.features.filter(e=>e.enabled).length,j=e.features.length;return(0,t.jsxs)("div",{className:"bg-[var(--sc-bg-surface)] border border-[var(--sc-cyan)]/40 rounded-xl p-4 mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(eu.Shield,{size:16,className:R.TIER_COLOURS[g]}),(0,t.jsx)("h3",{className:"text-sm font-medium text-[var(--sc-text-primary)]",children:"Licence"}),(0,t.jsx)("span",{className:`text-[10px] font-semibold px-1.5 py-0.5 rounded ${R.TIER_COLOURS[g]} ${R.TIER_BG[g]}`,children:R.TIER_LABELS[g]})]}),(0,t.jsxs)("span",{className:"text-[10px] text-[var(--sc-text-muted)]",children:[b,"/",j," features"]})]}),(0,t.jsxs)("div",{className:"space-y-2 mb-3",children:[e.email&&(0,t.jsxs)("div",{className:"flex items-center justify-between text-xs",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Email"}),(0,t.jsx)("span",{className:"text-[var(--sc-text-primary)]",children:e.email})]}),null!==e.daysUntilExpiry&&(0,t.jsxs)("div",{className:"flex items-center justify-between text-xs",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Expires"}),(0,t.jsx)("span",{className:e.daysUntilExpiry<=7?"text-[var(--sc-amber)]":"text-[var(--sc-text-primary)]",children:e.daysUntilExpiry<=0?"Expired (grace period)":`${e.daysUntilExpiry} days`})]})]}),(0,t.jsxs)("button",{onClick:()=>y(!h),className:"flex items-center gap-1 text-[10px] text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)] transition-colors mb-2",children:[h?(0,t.jsx)(ey,{size:12}):(0,t.jsx)(eh,{size:12}),h?"Hide features":"Show features"]}),h&&(0,t.jsx)("div",{className:"space-y-1.5 mb-3",children:e.features.map(e=>(0,t.jsxs)("div",{className:"flex items-center gap-2 text-xs",children:[e.enabled?(0,t.jsx)(v.CheckCircle2,{size:12,className:"text-[var(--sc-cyan)] shrink-0"}):(0,t.jsx)(ep.XCircle,{size:12,className:"text-[var(--sc-text-muted)] shrink-0"}),(0,t.jsx)("span",{className:e.enabled?"text-[var(--sc-text-primary)]":"text-[var(--sc-text-muted)]",children:e.description.split(".")[0]}),!e.enabled&&(0,t.jsx)("span",{className:`text-[9px] px-1 py-0.5 rounded ${R.TIER_COLOURS[e.requiredTier]} ${R.TIER_BG[e.requiredTier]}`,children:R.TIER_LABELS[e.requiredTier]})]},e.feature))}),(0,t.jsx)("button",{onClick:()=>{confirm(`Remove your ${R.TIER_LABELS[g]} licence key? You will lose access to paid features.`)&&c.mutate()},disabled:c.isPending,className:"text-[10px] text-[var(--sc-text-muted)] hover:text-[var(--sc-coral)] transition-colors",children:"Deactivate"})]})}function eN(){let e=(0,s.useSearchParams)().get("tab"),a=e&&["cloud","integrations","licence","admin"].includes(e)?e:null,[c,p]=(0,r.useState)("cloud"),v=a??c,{data:h}=(0,P.useLicenseStatus)(),y=[{id:"cloud",label:"Cloud Sync",icon:(0,t.jsx)(n,{size:14})},{id:"integrations",label:"Integrations",icon:(0,t.jsx)(l,{size:14})},{id:"licence",label:"Licence",icon:(0,t.jsx)(i,{size:14})},{id:"admin",label:"Admin",icon:(0,t.jsx)(d.Settings,{size:14})}];return(0,t.jsx)("div",{className:"h-full overflow-y-auto",children:(0,t.jsxs)("div",{className:"mx-auto max-w-7xl space-y-6 p-6",children:[(0,t.jsx)(o.PageHeader,{eyebrow:"Configuration",title:"Settings",subtitle:"Cloud sync, licence management, and system configuration.",tabs:y,activeTab:v,onTabChange:e=>p(e),actions:(0,t.jsx)(u.Badge,{variant:h?.tier==="pro"?"cyan":h?.tier==="team"?"coral":"muted",children:R.TIER_LABELS[h?.tier??"free"]})}),(0,t.jsxs)("div",{children:["cloud"===v&&(0,t.jsx)(U,{}),"integrations"===v&&(0,t.jsx)(X,{}),"licence"===v&&(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsx)(ef,{}),(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Upgrade"}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--sc-text-secondary)]",children:"Pro unlocks deep X-Ray scanning, custom firewall rules, custom Iron Dome policies, audit exports, and more. Team adds cloud sync and team management."}),(0,t.jsx)("div",{className:"mt-4 flex gap-3",children:(0,t.jsx)("a",{href:"https://shieldcortex.ai/pricing",target:"_blank",rel:"noopener noreferrer",children:(0,t.jsx)(m.Button,{variant:"coral",glow:!0,children:"View pricing"})})})]})]}),"admin"===v&&(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsx)(es,{}),(0,t.jsx)(el,{}),(0,t.jsx)(ex,{}),(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"System Information"}),(0,t.jsxs)("div",{className:"mt-4 space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-[var(--sc-bg-elevated)] px-4 py-3",children:[(0,t.jsx)("span",{className:"text-sm text-[var(--sc-text-secondary)]",children:"Dashboard"}),(0,t.jsx)("span",{className:"font-mono text-sm text-[var(--sc-text-primary)]",children:"localhost:3030"})]}),(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-[var(--sc-bg-elevated)] px-4 py-3",children:[(0,t.jsx)("span",{className:"text-sm text-[var(--sc-text-secondary)]",children:"API Server"}),(0,t.jsx)("span",{className:"font-mono text-sm text-[var(--sc-text-primary)]",children:"localhost:3001"})]}),(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-[var(--sc-bg-elevated)] px-4 py-3",children:[(0,t.jsx)("span",{className:"text-sm text-[var(--sc-text-secondary)]",children:"Database"}),(0,t.jsx)("span",{className:"font-mono text-sm text-[var(--sc-text-primary)]",children:"~/.shieldcortex/memories.db"})]}),(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-[var(--sc-bg-elevated)] px-4 py-3",children:[(0,t.jsx)("span",{className:"text-sm text-[var(--sc-text-secondary)]",children:"Licence Tier"}),(0,t.jsx)(u.Badge,{variant:h?.tier==="pro"?"cyan":h?.tier==="team"?"coral":"muted",children:R.TIER_LABELS[h?.tier??"free"]})]})]})]})]})]})]})})}function ew(){return(0,t.jsx)(r.Suspense,{fallback:(0,t.jsx)(a.PageSkeleton,{}),children:(0,t.jsx)(eN,{})})}e.s(["SettingsView",()=>ew],42424)}]);
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,42424,e=>{"use strict";var t=e.i(27493),s=e.i(16871),r=e.i(4),a=e.i(53615),c=e.i(24929);let n=(0,c.default)("cloud",[["path",{d:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z",key:"p7xjir"}]]),i=(0,c.default)("credit-card",[["rect",{width:"20",height:"14",x:"2",y:"5",rx:"2",key:"ynyp8z"}],["line",{x1:"2",x2:"22",y1:"10",y2:"10",key:"1b3vmo"}]]),l=(0,c.default)("plug",[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z",key:"1xoxul"}],["path",{d:"M9 8V2",key:"14iosj"}]]);var d=e.i(54130),o=e.i(40950),x=e.i(16467),u=e.i(95659),m=e.i(81523),p=e.i(18509),v=e.i(15771),h=e.i(19331),y=e.i(7571),g=e.i(84012);let b=(0,c.default)("key-round",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]);var j=e.i(67307);let f=(0,c.default)("server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);var N=e.i(51069),w=e.i(45688),k=e.i(71921),C=e.i(1235),S=e.i(88969);let E=[],A="http://localhost:3001";function M(){return(0,w.useQuery)({queryKey:["cloud-config"],queryFn:async()=>{var e;let t,s,r=await (0,S.authFetch)(`${A}/api/cloud/config`);if(!r.ok)throw Error(await (0,S.readApiError)(r,"Failed to fetch cloud config"));return t=(e=await r.json()).syncControls&&"object"==typeof e.syncControls?e.syncControls:{},s=e.openclawMemory&&"object"==typeof e.openclawMemory?e.openclawMemory:{},{enabled:!!e.enabled,apiKeySet:!!e.apiKeySet,baseUrl:"string"==typeof e.baseUrl?e.baseUrl:"https://api.shieldcortex.ai",syncControls:{projectMode:"projectMode"in t&&("include"===t.projectMode||"exclude"===t.projectMode)?t.projectMode:"all",projects:Array.isArray(t.projects)?t.projects.filter(e=>"string"==typeof e):E,contentMode:"contentMode"in t&&"metadata"===t.contentMode?"metadata":"full",excludeSensitive:"excludeSensitive"in t&&!!t.excludeSensitive},openclawMemory:{autoMemory:"autoMemory"in s&&!!s.autoMemory,dedupe:"dedupe"in s&&!!s.dedupe,noveltyThreshold:"noveltyThreshold"in s&&"number"==typeof s.noveltyThreshold?s.noveltyThreshold:.88,maxRecent:"maxRecent"in s&&"number"==typeof s.maxRecent?s.maxRecent:300}}},refetchInterval:3e4})}let q="http://localhost:3001",$=[];function T(){return(0,w.useQuery)({queryKey:["cloud-sync-status"],queryFn:async()=>{var e;let t,s,r,a,c=await (0,S.authFetch)(`${q}/api/cloud/sync-status`);if(!c.ok)throw Error(await (0,S.readApiError)(c,"Failed to fetch sync status"));return t=(e=await c.json()).controls&&"object"==typeof e.controls?e.controls:{},r="byKind"in(s=e.queue&&"object"==typeof e.queue?e.queue:{})&&s.byKind&&"object"==typeof s.byKind?s.byKind:{},a=e=>({pending:Number(r[e]?.pending??0),failed:Number(r[e]?.failed??0),synced:Number(r[e]?.synced??0)}),{enabled:!!e.enabled,apiKeySet:!!e.apiKeySet,baseUrl:"string"==typeof e.baseUrl?e.baseUrl:"https://api.shieldcortex.ai",featureEnabled:!!e.featureEnabled,requiredTier:"pro"===e.requiredTier||"team"===e.requiredTier||"enterprise"===e.requiredTier?e.requiredTier:"free",controls:{projectMode:"projectMode"in t&&("include"===t.projectMode||"exclude"===t.projectMode)?t.projectMode:"all",projects:Array.isArray(t.projects)?t.projects.filter(e=>"string"==typeof e):$,contentMode:"contentMode"in t&&"metadata"===t.contentMode?"metadata":"full",excludeSensitive:"excludeSensitive"in t&&!!t.excludeSensitive},lastSyncAt:"string"==typeof e.lastSyncAt||null===e.lastSyncAt?e.lastSyncAt??null:null,device:{id:e.device&&"object"==typeof e.device&&"id"in e.device&&"string"==typeof e.device.id?e.device.id:"unknown",name:e.device&&"object"==typeof e.device&&"name"in e.device&&"string"==typeof e.device.name?e.device.name:"Unknown device",platform:e.device&&"object"==typeof e.device&&"platform"in e.device&&"string"==typeof e.device.platform?e.device.platform:"unknown"},queue:{pending:Number(s.pending??0),failed:Number(s.failed??0),synced:Number(s.synced??0),byKind:{audit:a("audit"),quarantine:a("quarantine"),memory:a("memory"),graph:a("graph"),unknown:a("unknown")},oldestPendingAt:"string"==typeof s.oldestPendingAt||null===s.oldestPendingAt?s.oldestPendingAt??null:null,nextRetryAt:"string"==typeof s.nextRetryAt||null===s.nextRetryAt?s.nextRetryAt??null:null,lastError:"string"==typeof s.lastError||null===s.lastError?s.lastError??null:null,lastErrorKind:"audit"===s.lastErrorKind||"quarantine"===s.lastErrorKind||"memory"===s.lastErrorKind||"graph"===s.lastErrorKind||"unknown"===s.lastErrorKind?s.lastErrorKind:null,latestFailureAt:"string"==typeof s.latestFailureAt||null===s.latestFailureAt?s.latestFailureAt??null:null}}},refetchInterval:3e4,staleTime:15e3})}var P=e.i(63312),R=e.i(50279);function F(e){let t=Math.max(0,Math.floor((Date.now()-new Date(e).getTime())/1e3));if(t<60)return`${t}s ago`;let s=Math.floor(t/60);if(s<60)return`${s}m ago`;let r=Math.floor(s/60);if(r<24)return`${r}h ago`;let a=Math.floor(r/24);return`${a}d ago`}function L(e){let t=Math.max(0,Math.floor((new Date(e).getTime()-Date.now())/1e3));if(t<60)return`in ${t}s`;let s=Math.floor(t/60);if(s<60)return`in ${s}m`;let r=Math.floor(s/60);if(r<24)return`in ${r}h`;let a=Math.floor(r/24);return`in ${a}d`}function K(){var e;let{data:s,isLoading:r}=T(),{data:a}=(0,P.useLicenseStatus)();if(r||!s)return null;let c="border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/70 text-[var(--sc-text-primary)]",i="Cloud sync disabled",l="Enable cloud sync and activate a Team licence to start replicating local data.",d=n;(e=s.lastSyncAt)&&(Date.now(),new Date(e).getTime());let o=s.queue.byKind.memory.pending+s.queue.byKind.graph.pending,x=s.queue.byKind.memory.failed+s.queue.byKind.graph.failed,u=s.queue.byKind.audit.failed+s.queue.byKind.quarantine.failed+s.queue.byKind.unknown.failed;return s.enabled&&s.apiKeySet&&!s.featureEnabled?(c="border-[var(--sc-amber)]/30 bg-[var(--sc-amber)]/10 text-[var(--sc-amber)]",i="Cloud configured but licence locked",l=`Cloud sync requires the ${R.TIER_LABELS[s.requiredTier]} tier. Current tier: ${R.TIER_LABELS[a?.tier??"free"]}.`,d=b):s.enabled&&s.apiKeySet&&o>0&&x>0?(c="border-[var(--sc-coral)]/30 bg-[var(--sc-coral)]/10 text-[var(--sc-coral)]",i="Cloud sync needs attention",l=s.queue.lastError??"One or more queued sync jobs are failing.",d=N.ShieldAlert):s.enabled&&s.apiKeySet&&x>0?(c="border-[var(--sc-amber)]/30 bg-[var(--sc-amber)]/10 text-[var(--sc-amber)]",i=`${x} failed sync job${1===x?"":"s"} need clearing`,l=s.queue.lastError?`${s.queue.lastError}${s.queue.latestFailureAt?` Last failure ${F(s.queue.latestFailureAt)}.`:""}`:"These items exhausted retries and won't sync automatically. Clear them or investigate the cause.",d=p.AlertTriangle):s.enabled&&s.apiKeySet&&o>0?(c="border-[var(--sc-amber)]/30 bg-[var(--sc-amber)]/10 text-[var(--sc-amber)]",i="Cloud sync is catching up",l=s.queue.nextRetryAt?`Next retry ${L(s.queue.nextRetryAt)}.`:"Queued jobs are waiting to flush.",d=j.RefreshCw):s.enabled&&s.apiKeySet&&(c="border-[var(--sc-cyan)]/30 bg-[var(--sc-cyan)]/10 text-[var(--sc-cyan)]",i="Cloud sync healthy",l=s.lastSyncAt?`Last successful sync ${F(s.lastSyncAt)}.`:"Connected and ready to sync.",u>0&&(l+=` Auxiliary audit/quarantine history: ${u} failed job${1===u?"":"s"}.`),d=v.CheckCircle2),(0,t.jsx)("div",{className:`rounded-2xl border p-4 ${c}`,children:(0,t.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,t.jsxs)("div",{className:"flex items-start gap-3",children:[(0,t.jsx)(d,{size:18,className:"mt-0.5 shrink-0"}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-sm font-semibold",children:i}),(0,t.jsx)("p",{className:"mt-1 text-sm opacity-90",children:l})]})]}),x>0&&0===o&&(0,t.jsx)(_,{})]})})}function I({label:e,value:s,detail:r,icon:a}){return(0,t.jsxs)("div",{className:"glass-card p-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:e}),(0,t.jsx)(a,{size:15,className:"text-[var(--sc-text-muted)]"})]}),(0,t.jsx)("div",{className:"mt-2 text-2xl font-semibold text-[var(--sc-text-primary)]",children:s}),(0,t.jsx)("div",{className:"mt-1 text-xs text-[var(--sc-text-secondary)]",children:r})]})}function z({label:e,pending:s,failed:r,synced:a}){return(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-3",children:[(0,t.jsx)("div",{className:"text-sm font-medium text-[var(--sc-text-primary)]",children:e}),(0,t.jsxs)("div",{className:"mt-3 grid grid-cols-3 gap-2 text-xs",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[var(--sc-text-muted)]",children:"Pending"}),(0,t.jsx)("div",{className:"mt-1 font-semibold text-[var(--sc-amber)]",children:s})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[var(--sc-text-muted)]",children:"Failed"}),(0,t.jsx)("div",{className:"mt-1 font-semibold text-[var(--sc-coral)]",children:r})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-[var(--sc-text-muted)]",children:"Synced"}),(0,t.jsx)("div",{className:"mt-1 font-semibold text-[var(--sc-cyan)]",children:a})]})]})]})}function O(){let e,{data:s}=M(),{data:a}=(0,w.useQuery)({queryKey:["cloud-projects"],queryFn:async()=>{let e=await (0,S.authFetch)(`${A}/api/cloud/projects`);if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to fetch cloud projects"));return e.json()},staleTime:3e4}),c=(e=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async e=>{let t=await (0,S.authFetch)(`${A}/api/cloud/config`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok)throw Error(await (0,S.readApiError)(t,"Failed to update cloud config"));return t.json()},onSuccess:()=>{e.invalidateQueries({queryKey:["cloud-config"]}),e.invalidateQueries({queryKey:["cloud-sync-status"]})}})),[n,i]=(0,r.useState)(null),l=a?.projects??[],d=n??s?.syncControls??{projectMode:"all",projects:[],contentMode:"full",excludeSensitive:!1},o="all"!==d.projectMode,[x,u]=(0,r.useState)("idle");async function m(){try{await c.mutateAsync({cloudSyncProjectMode:d.projectMode,cloudSyncProjects:d.projects,cloudSyncContentMode:d.contentMode,cloudSyncExcludeSensitive:d.excludeSensitive}),i(null),u("saved"),setTimeout(()=>u("idle"),2e3)}catch{u("error"),setTimeout(()=>u("idle"),3e3)}}return(0,t.jsxs)("div",{className:"glass-card-strong p-5",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Sync Controls"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-[var(--sc-text-secondary)]",children:"Decide what leaves this device before it hits the cloud replica."})]}),(0,t.jsx)("button",{type:"button",onClick:()=>void m(),disabled:c.isPending,className:`rounded-lg border px-3 py-2 text-sm font-medium transition disabled:cursor-not-allowed disabled:opacity-50 ${"saved"===x?"border-[var(--sc-cyan)]/50 bg-[var(--sc-cyan)]/20 text-[var(--sc-cyan)]":"error"===x?"border-[var(--sc-coral)]/50 bg-[var(--sc-coral)]/20 text-[var(--sc-coral)]":"border-[var(--sc-cyan)]/30 bg-[var(--sc-cyan)]/10 text-[var(--sc-cyan)] hover:bg-[var(--sc-cyan)]/20"}`,children:c.isPending?"Saving...":"saved"===x?"✓ Saved":"error"===x?"Failed to save":"Save controls"})]}),(0,t.jsxs)("div",{className:"mt-5 grid gap-4",children:[(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:[(0,t.jsx)("div",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:"Content mode"}),(0,t.jsxs)("div",{className:"mt-2 flex flex-wrap gap-2 text-[11px] text-[var(--sc-text-secondary)]",children:[(0,t.jsx)("span",{className:"rounded-full border border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/60 px-2.5 py-1",children:"metadata"===d.contentMode?"Metadata only":"Full content"}),(0,t.jsxs)("span",{className:"rounded-full border border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/60 px-2.5 py-1",children:["Sensitive filter ",d.excludeSensitive?"on":"off"]})]}),(0,t.jsxs)("div",{className:"mt-3 grid gap-2 md:grid-cols-2",children:[(0,t.jsxs)("label",{className:`rounded-lg border p-3 text-sm ${"full"===d.contentMode?"border-[var(--sc-cyan)]/40 bg-[var(--sc-cyan)]/10 text-[var(--sc-cyan)]":"border-[var(--sc-border)] text-[var(--sc-text-primary)]"}`,children:[(0,t.jsx)("input",{type:"radio",className:"mr-2",checked:"full"===d.contentMode,onChange:()=>i(e=>({...e??d,contentMode:"full"}))}),"Full content",(0,t.jsx)("div",{className:"mt-1 text-xs text-[var(--sc-text-secondary)]",children:"Titles and memory bodies replicate to cloud."})]}),(0,t.jsxs)("label",{className:`rounded-lg border p-3 text-sm ${"metadata"===d.contentMode?"border-[var(--sc-cyan)]/40 bg-[var(--sc-cyan)]/10 text-[var(--sc-cyan)]":"border-[var(--sc-border)] text-[var(--sc-text-primary)]"}`,children:[(0,t.jsx)("input",{type:"radio",className:"mr-2",checked:"metadata"===d.contentMode,onChange:()=>i(e=>({...e??d,contentMode:"metadata"}))}),"Metadata only",(0,t.jsx)("div",{className:"mt-1 text-xs text-[var(--sc-text-secondary)]",children:"Projects, tags, salience, and graph remain; body content is redacted."})]})]})]}),(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:[(0,t.jsx)("div",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:"Project scope"}),(0,t.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:["all","include","exclude"].map(e=>(0,t.jsx)("button",{type:"button",onClick:()=>i(t=>({...t??d,projectMode:e})),className:`rounded-full border px-3 py-1.5 text-xs font-medium uppercase tracking-wide ${d.projectMode===e?"border-[var(--sc-cyan)]/40 bg-[var(--sc-cyan)]/10 text-[var(--sc-cyan)]":"border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/60 text-[var(--sc-text-primary)]"}`,children:e},e))}),(0,t.jsx)("p",{className:"mt-3 text-xs text-[var(--sc-text-secondary)]",children:"all"===d.projectMode?"All local projects are eligible for sync.":"include"===d.projectMode?"Only the selected projects will sync.":"Selected projects stay local-only."}),o&&(0,t.jsxs)("details",{className:"mt-3 rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/40 p-3",children:[(0,t.jsxs)("summary",{className:"cursor-pointer list-none text-sm font-medium text-[var(--sc-text-primary)]",children:["Choose projects ",d.projects.length>0?`(${d.projects.length} selected)`:""]}),(0,t.jsx)("div",{className:"mt-3 max-h-48 overflow-y-auto",children:0===l.length?(0,t.jsx)("div",{className:"text-xs text-[var(--sc-text-muted)]",children:"No named projects found in local memory yet."}):(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:l.map(e=>{let s=d.projects.includes(e.project);return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;return t=e.project,void i(e=>{let s=e??d,r=s.projects.includes(t)?s.projects.filter(e=>e!==t):[...s.projects,t].sort((e,t)=>e.localeCompare(t));return{...s,projects:r}})},className:`rounded-full border px-3 py-1.5 text-xs ${s?"border-[var(--sc-cyan)]/40 bg-[var(--sc-cyan)]/10 text-[var(--sc-cyan)]":"border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 text-[var(--sc-text-primary)]"}`,children:[e.project," ",(0,t.jsxs)("span",{className:"text-[var(--sc-text-muted)]",children:["(",e.count,")"]})]},e.project)})})})]})]}),(0,t.jsxs)("label",{className:"flex items-start gap-3 rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4 text-sm text-[var(--sc-text-primary)]",children:[(0,t.jsx)("input",{type:"checkbox",className:"mt-0.5",checked:d.excludeSensitive,onChange:e=>i(t=>({...t??d,excludeSensitive:e.target.checked}))}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"font-medium text-[var(--sc-text-primary)]",children:"Exclude sensitive memories"}),(0,t.jsx)("div",{className:"mt-1 text-xs text-[var(--sc-text-secondary)]",children:"Skip memories whose sensitivity level is higher than INTERNAL when syncing to cloud."})]})]}),c.isError&&(0,t.jsx)("div",{className:"rounded-xl border border-[var(--sc-coral)]/30 bg-[var(--sc-coral)]/10 p-3 text-sm text-[var(--sc-coral)]",children:c.error.message})]})]})}function B({sync:e,cloudConfig:s}){return(0,t.jsxs)("div",{className:"glass-card-strong p-5",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Current policy"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-[var(--sc-text-secondary)]",children:"The snapshot below is the current cloud posture. Edit it in Sync Controls when you need to change what leaves this device."}),(0,t.jsxs)("div",{className:"mt-4 grid gap-3 md:grid-cols-2",children:[(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:[(0,t.jsx)("div",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:"Sync scope"}),(0,t.jsx)("div",{className:"mt-2 text-sm font-medium text-[var(--sc-text-primary)]",children:e.controls.projectMode}),(0,t.jsxs)("div",{className:"mt-1 text-xs text-[var(--sc-text-secondary)]",children:[e.controls.projects.length," selected project",1===e.controls.projects.length?"":"s"]})]}),(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:[(0,t.jsx)("div",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:"Content mode"}),(0,t.jsx)("div",{className:"mt-2 text-sm font-medium text-[var(--sc-text-primary)]",children:"metadata"===e.controls.contentMode?"Metadata only":"Full content"}),(0,t.jsxs)("div",{className:"mt-1 text-xs text-[var(--sc-text-secondary)]",children:["Sensitive filter ",e.controls.excludeSensitive?"enabled":"off"]})]}),(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:[(0,t.jsx)("div",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:"Cloud endpoint"}),(0,t.jsx)("div",{className:"mt-2 text-sm font-medium text-[var(--sc-text-primary)]",children:e.baseUrl})]}),(0,t.jsxs)("div",{className:"rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:[(0,t.jsx)("div",{className:"text-xs uppercase tracking-[0.2em] text-[var(--sc-text-muted)]",children:"OpenClaw complement"}),(0,t.jsxs)("div",{className:"mt-2 grid grid-cols-2 gap-2 text-xs text-[var(--sc-text-primary)]",children:[(0,t.jsxs)("span",{children:["Auto-memory: ",s.openclawMemory.autoMemory?"On":"Off"]}),(0,t.jsxs)("span",{children:["Dedupe: ",s.openclawMemory.dedupe?"On":"Off"]}),(0,t.jsxs)("span",{children:["Novelty: ",s.openclawMemory.noveltyThreshold]}),(0,t.jsxs)("span",{children:["Recent window: ",s.openclawMemory.maxRecent]})]})]})]})]})}function _(){let e,s=(e=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async()=>{let e=await (0,S.authFetch)(`${q}/api/cloud/sync-queue/clear-failed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to clear failed items"));return e.json()},onSuccess:()=>{e.invalidateQueries({queryKey:["cloud-sync-status"]})}}));return(0,t.jsx)("button",{type:"button",onClick:()=>s.mutate(),disabled:s.isPending,className:"shrink-0 rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-elevated)]/50 px-3 py-1.5 text-xs text-[var(--sc-text-secondary)] transition hover:border-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)] disabled:opacity-50",children:s.isPending?"Clearing...":s.isSuccess?`Cleared ${s.data?.cleared??0}`:"Clear failed"})}function U(){let{data:e,isLoading:s,refetch:r,isFetching:a}=T(),{data:c,isLoading:i}=M(),{data:l,isLoading:d}=(0,P.useLicenseStatus)();if(s||i||d||!e||!c||!l)return(0,t.jsx)("div",{className:"space-y-6",children:(0,t.jsx)("div",{className:"glass-card p-6 text-sm text-[var(--sc-text-secondary)]",children:"Loading cloud diagnostics..."})});let o=l.tier,x=e.queue.byKind.memory,u=e.queue.byKind.graph,m=x.failed+u.failed,b=e.queue.byKind.audit.failed+e.queue.byKind.quarantine.failed+e.queue.byKind.unknown.failed,N=e.lastSyncAt?F(e.lastSyncAt):"Never",w=m>0?"Needs review":x.pending+u.pending>0?"Catching up":"Healthy";return(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[(0,t.jsx)("span",{className:`rounded-full px-2.5 py-1 font-medium ${R.TIER_BG[o]} ${R.TIER_COLOURS[o]}`,children:R.TIER_LABELS[o]}),(0,t.jsxs)("span",{className:"rounded-full border border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/70 px-2.5 py-1 text-[var(--sc-text-primary)]",children:["Last sync: ",N]}),(0,t.jsx)("button",{type:"button",onClick:()=>void r(),disabled:a,className:"rounded-full border border-[var(--sc-border)] bg-[var(--sc-bg-surface)]/70 px-2.5 py-1 text-[var(--sc-text-muted)] transition hover:text-[var(--sc-text-primary)] disabled:opacity-50",title:"Refresh sync status",children:(0,t.jsx)(j.RefreshCw,{size:12,className:a?"animate-spin":""})})]}),(0,t.jsx)(K,{}),(0,t.jsxs)("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-5",children:[(0,t.jsx)(I,{label:"Replication",value:w,detail:`${m} failed \xb7 ${x.pending+u.pending} pending`,icon:j.RefreshCw}),(0,t.jsx)(I,{label:"Device",value:e.device.name,detail:`${e.device.platform} \xb7 ${e.device.id.slice(0,12)}`,icon:f}),(0,t.jsx)(I,{label:"Cloud Target",value:new URL(e.baseUrl).host,detail:e.enabled?"Configured target":"Disabled in config",icon:n}),(0,t.jsx)(I,{label:"Memory Queue",value:x.pending,detail:`${x.failed} failed \xb7 ${x.synced} synced`,icon:y.Database}),(0,t.jsx)(I,{label:"Graph Queue",value:u.pending,detail:`${u.failed} failed \xb7 ${u.synced} synced`,icon:g.GitBranch})]}),(0,t.jsxs)("div",{className:"grid grid-cols-1 gap-6 xl:grid-cols-[1.35fr_0.95fr]",children:[(0,t.jsxs)("div",{className:"glass-card p-5",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Replication"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-[var(--sc-text-secondary)]",children:"Memory and graph sync queues. Items are synced to your cloud replica automatically."})]}),m>0&&(0,t.jsx)(_,{})]}),(0,t.jsxs)("div",{className:"mt-5 grid grid-cols-1 gap-3 md:grid-cols-2",children:[(0,t.jsx)(z,{label:"Memory",...x}),(0,t.jsx)(z,{label:"Graph",...u})]}),(0,t.jsxs)("details",{className:"mt-5 rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/30 p-4",children:[(0,t.jsx)("summary",{className:"cursor-pointer list-none text-sm font-medium text-[var(--sc-text-primary)]",children:"Advanced transport signals"}),(0,t.jsxs)("div",{className:"mt-4 grid grid-cols-1 gap-3 md:grid-cols-2",children:[(0,t.jsx)(z,{label:"Audit",...e.queue.byKind.audit}),(0,t.jsx)(z,{label:"Quarantine",...e.queue.byKind.quarantine})]}),(0,t.jsx)("div",{className:"mt-4 overflow-hidden rounded-xl border border-[var(--sc-border)]",children:(0,t.jsxs)("table",{className:"min-w-full divide-y divide-[var(--sc-border)] text-sm",children:[(0,t.jsx)("thead",{className:"bg-[var(--sc-bg-deep)]/70 text-[var(--sc-text-secondary)]",children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{className:"px-4 py-3 text-left font-medium",children:"Signal"}),(0,t.jsx)("th",{className:"px-4 py-3 text-left font-medium",children:"Current value"}),(0,t.jsx)("th",{className:"px-4 py-3 text-left font-medium",children:"Why it matters"})]})}),(0,t.jsxs)("tbody",{className:"divide-y divide-[var(--sc-border)] bg-[var(--sc-bg-surface)]/40 text-[var(--sc-text-primary)]",children:[(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{className:"px-4 py-3",children:"Oldest queued job"}),(0,t.jsx)("td",{className:"px-4 py-3",children:e.queue.oldestPendingAt?F(e.queue.oldestPendingAt):"None queued"}),(0,t.jsx)("td",{className:"px-4 py-3 text-[var(--sc-text-secondary)]",children:"If this stays old while pending grows, the local worker is falling behind."})]}),(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{className:"px-4 py-3",children:"Next retry"}),(0,t.jsx)("td",{className:"px-4 py-3",children:e.queue.nextRetryAt?L(e.queue.nextRetryAt):"Idle"}),(0,t.jsx)("td",{className:"px-4 py-3 text-[var(--sc-text-secondary)]",children:"Confirms whether failures are retrying normally or the queue is stuck."})]}),(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{className:"px-4 py-3",children:"Failed jobs in history"}),(0,t.jsx)("td",{className:"px-4 py-3",children:m}),(0,t.jsx)("td",{className:"px-4 py-3 text-[var(--sc-text-secondary)]",children:"These are retained replication dead-letter records for memory and graph sync."})]}),(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{className:"px-4 py-3",children:"Auxiliary failed history"}),(0,t.jsx)("td",{className:"px-4 py-3",children:b}),(0,t.jsx)("td",{className:"px-4 py-3 text-[var(--sc-text-secondary)]",children:"Audit and quarantine retry history is shown here for debugging, but it does not mean memory replication is currently blocked."})]}),(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{className:"px-4 py-3",children:"Latest memory sync"}),(0,t.jsx)("td",{className:"px-4 py-3",children:e.lastSyncAt?F(e.lastSyncAt):"Not recorded"}),(0,t.jsx)("td",{className:"px-4 py-3 text-[var(--sc-text-secondary)]",children:"This is the best quick indicator for whether cloud replication is actually current."})]})]})]})})]})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,t.jsx)(O,{}),(0,t.jsx)(B,{sync:e,cloudConfig:c}),(0,t.jsxs)("div",{className:"glass-card-strong p-5",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Last actionable error"}),(0,t.jsx)("div",{className:"mt-4 rounded-xl border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/60 p-4",children:e.queue.lastError?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:`flex items-center gap-2 text-sm font-medium ${e.queue.pending>0?"text-[var(--sc-coral)]":"text-[var(--sc-amber)]"}`,children:[(0,t.jsx)(p.AlertTriangle,{size:16}),e.queue.lastErrorKind?`${e.queue.lastErrorKind} queue`:"Unknown queue"]}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--sc-text-primary)]",children:e.queue.lastError}),e.queue.latestFailureAt&&(0,t.jsxs)("div",{className:"mt-2 text-xs text-[var(--sc-text-muted)]",children:["Recorded ",F(e.queue.latestFailureAt)]}),e.queue.nextRetryAt&&(0,t.jsxs)("div",{className:"mt-3 inline-flex items-center gap-1 rounded-full bg-[var(--sc-bg-surface)] px-2 py-1 text-xs text-[var(--sc-text-secondary)]",children:[(0,t.jsx)(h.Clock3,{size:12}),"Retry ",L(e.queue.nextRetryAt)]})]}):(0,t.jsxs)("div",{className:"flex items-center gap-2 text-sm text-[var(--sc-cyan)]",children:[(0,t.jsx)(v.CheckCircle2,{size:16}),"No recent sync errors recorded."]})})]})]})]})]})}var Q=e.i(48615),D=e.i(84982),G=e.i(76490);function H({label:e,description:s,checked:r,pending:a=!1,disabled:c=!1,docsUrl:n,onChange:i}){let l=!c&&!a;return(0,t.jsxs)("label",{className:(0,G.cn)("flex items-start gap-4 border border-[var(--term-border)] bg-[var(--term-surface)] p-4 rounded-md transition-colors",l&&"cursor-pointer hover:border-[var(--term-electric)]",!l&&"opacity-70 cursor-not-allowed"),children:[(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsxs)("div",{className:"text-sm text-[var(--term-text)]",children:[(0,t.jsx)("span",{className:"text-[var(--term-text-muted)]","aria-hidden":!0,children:"›"})," ",e]}),(0,t.jsxs)("div",{className:"mt-1 text-xs leading-5 text-[var(--term-text-muted)]",children:[s,n&&(0,t.jsxs)(t.Fragment,{children:[" ",(0,t.jsx)("a",{href:n,target:"_blank",rel:"noopener noreferrer",className:"text-[var(--term-electric-fg)] hover:underline",onClick:e=>e.stopPropagation(),children:"docs →"})]})]})]}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2 self-start pt-0.5 theme-glass:hidden",children:[a&&(0,t.jsx)(D.Loader2,{size:12,className:"animate-spin text-[var(--term-text-muted)]","aria-hidden":!0}),(0,t.jsx)("span",{className:(0,G.cn)("font-mono text-xs uppercase tracking-wider",r?"text-[var(--term-neon-fg)]":"text-[var(--term-text-muted)]"),children:r?"[on]":"[off]"})]}),(0,t.jsxs)("div",{className:"relative hidden h-6 w-11 shrink-0 items-center theme-glass:flex","aria-hidden":"true",children:[a&&(0,t.jsx)(D.Loader2,{size:12,className:"absolute -left-5 top-1.5 animate-spin text-[var(--sc-text-muted)]"}),(0,t.jsx)("span",{className:(0,G.cn)("absolute inset-0 rounded-full transition-colors",r?"bg-[var(--sc-cyan)]":"bg-[var(--sc-bg-elevated)] border border-[var(--sc-border)]")}),(0,t.jsx)("span",{className:(0,G.cn)("absolute top-0.5 h-5 w-5 rounded-full bg-white shadow transition-transform",r?"translate-x-5":"translate-x-0.5")})]}),(0,t.jsx)("input",{type:"checkbox",checked:r,disabled:!l,onChange:e=>i(e.target.checked),className:"sr-only"})]})}var J=e.i(22534);let V=J.default.env.NEXT_PUBLIC_API_URL||"http://localhost:3001";function X(){let e,{data:s,isLoading:r,error:c}=(0,w.useQuery)({queryKey:["integrations-config"],queryFn:async()=>{let e=await (0,S.gatedFetch)(`${V}/api/cloud/config`);if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to load integration toggles"));let t=await e.json();return{openclawAutoMemory:!!t.openclawMemory?.autoMemory,proactiveRecall:!!t.proactiveRecall}},refetchOnWindowFocus:!0}),n=(e=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async e=>{let t=await (0,S.gatedFetch)(`${V}/api/cloud/config`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok)throw Error(await (0,S.readApiError)(t,"Failed to update integration toggle"));return t.json()},onSuccess:()=>{e.invalidateQueries({queryKey:["integrations-config"]}),e.invalidateQueries({queryKey:["cloud-config"]})}})),i=(e,t)=>{n.mutate(e,{onSuccess:()=>Q.toast.success(t),onError:e=>Q.toast.error(e instanceof Error?e.message:"Failed to update toggle")})};if(r)return(0,t.jsxs)(x.GlassCard,{className:"p-6 space-y-4",children:[(0,t.jsx)(a.Skeleton,{className:"h-16 w-full"}),(0,t.jsx)(a.Skeleton,{className:"h-16 w-full"})]});if(c||!s)return(0,t.jsx)(x.GlassCard,{className:"p-6",children:(0,t.jsxs)("p",{className:"text-sm text-[var(--sc-coral)]",children:["Failed to load integration toggles: ",c instanceof Error?c.message:"Unknown error"]})});let l=n.isPending,d=l?Object.keys(n.variables??{})[0]:void 0;return(0,t.jsx)("div",{className:"space-y-4",children:(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Integrations"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-[var(--sc-text-secondary)]",children:"Both toggles are off by default. They were turned off in v4.11.0 after fleet evidence showed they hurt fast agent loops; turn them on if you run interactive sessions or want richer memory capture."}),(0,t.jsxs)("div",{className:"mt-5 space-y-3",children:[(0,t.jsx)(H,{label:"OpenClaw Auto-Memory",description:"Extract memories from OpenClaw LLM output (decisions, fixes, learnings, preferences). Off by default — turn on for interactive sessions, leave off for fast agent loops.",checked:s.openclawAutoMemory,pending:"openclawAutoMemory"===d,disabled:l&&"openclawAutoMemory"!==d,docsUrl:"https://shieldcortex.ai/docs/integrations#openclaw-auto-memory",onChange:e=>i({openclawAutoMemory:e},e?"OpenClaw auto-memory enabled":"OpenClaw auto-memory disabled")}),(0,t.jsx)(H,{label:"Proactive Recall",description:"Inject relevant SC memory into every prompt. Adds 200–500ms latency and 100–400 tokens per turn. Net-negative for fast agent loops; useful for deep interactive sessions.",checked:s.proactiveRecall,pending:"proactiveRecall"===d,disabled:l&&"proactiveRecall"!==d,docsUrl:"https://shieldcortex.ai/docs/integrations#proactive-recall",onChange:e=>i({proactiveRecall:e},e?"Proactive recall enabled":"Proactive recall disabled")})]}),(0,t.jsxs)("p",{className:"mt-5 text-[11px] text-[var(--sc-text-muted)]",children:["You can also toggle these via the CLI: ",(0,t.jsx)("code",{className:"font-mono",children:"shieldcortex config --openclaw-auto-memory true|false"})," ·"," ",(0,t.jsx)("code",{className:"font-mono",children:"shieldcortex config --proactive-recall true|false"})]})]})})}var Y=e.i(45434),W=e.i(61737),Z=e.i(13808);let ee=J.default.env.NEXT_PUBLIC_API_URL||"http://localhost:3001";function et(e){if(!e)return"never";let t=Date.now()-new Date(e).getTime();if(t<0)return"just now";let s=Math.floor(t/1e3);if(s<60)return`${s}s ago`;let r=Math.floor(s/60);if(r<60)return`${r}m ago`;let a=Math.floor(r/60);if(a<24)return`${a}h ago`;let c=Math.floor(a/24);return`${c}d ago`}function es(){let e,s,r,{data:a,isLoading:c}=(0,w.useQuery)({queryKey:["worker-status"],queryFn:async()=>{let e=await (0,S.gatedFetch)(`${ee}/api/worker/status`);if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to load worker status"));return e.json()},refetchInterval:1e4}),{data:n}=(0,w.useQuery)({queryKey:["memory-stats"],queryFn:async()=>{let e=await (0,S.gatedFetch)(`${ee}/api/stats`);if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to load memory stats"));return e.json()},refetchInterval:3e4}),i=(e=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async()=>{let e=await (0,S.gatedFetch)(`${ee}/api/worker/trigger-light`,{method:"POST"});if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to run light tick"));return e.json()},onSuccess:()=>{e.invalidateQueries({queryKey:["worker-status"]}),e.invalidateQueries({queryKey:["memory-stats"]})}})),l=(s=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async()=>{let e=await (0,S.gatedFetch)(`${ee}/api/worker/trigger-medium`,{method:"POST"});if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to run medium tick"));return e.json()},onSuccess:()=>{s.invalidateQueries({queryKey:["worker-status"]}),s.invalidateQueries({queryKey:["memory-stats"]})}})),d=(r=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async()=>{let e=await (0,S.gatedFetch)(`${ee}/api/consolidate`,{method:"POST"});if(!e.ok)throw Error(await (0,S.readApiError)(e,"Failed to run consolidation"));return e.json()},onSuccess:()=>{r.invalidateQueries({queryKey:["worker-status"]}),r.invalidateQueries({queryKey:["memory-stats"]})}})),o=i.isPending||l.isPending||d.isPending;return(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(W.Brain,{size:16,className:"text-[var(--sc-cyan)]"}),(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Memory Maintenance"}),a?.isRunning?(0,t.jsx)(u.Badge,{variant:"cyan",dot:!0,children:"Running"}):c?(0,t.jsx)(u.Badge,{variant:"muted",children:"Loading"}):(0,t.jsx)(u.Badge,{variant:"amber",children:"Stopped"})]}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--sc-text-secondary)]",children:"Background brain worker prunes activation cache, consolidates short-term to long-term, removes low-salience duplicates, and prunes orphan graph entities. Runs automatically on intervals; you can trigger a tick manually below."}),n&&(0,t.jsxs)("div",{className:"mt-4 grid grid-cols-3 gap-3 text-sm",children:[(0,t.jsxs)("div",{className:"rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/50 p-3",children:[(0,t.jsx)("div",{className:"text-[10px] uppercase tracking-[0.14em] text-[var(--sc-text-muted)]",children:"Healthy"}),(0,t.jsx)("div",{className:"mt-1 text-xl font-semibold text-[var(--sc-cyan)]",children:n.decayDistribution.healthy})]}),(0,t.jsxs)("div",{className:"rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/50 p-3",children:[(0,t.jsx)("div",{className:"text-[10px] uppercase tracking-[0.14em] text-[var(--sc-text-muted)]",children:"Fading"}),(0,t.jsx)("div",{className:"mt-1 text-xl font-semibold text-[var(--sc-amber)]",children:n.decayDistribution.fading})]}),(0,t.jsxs)("div",{className:"rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/50 p-3",children:[(0,t.jsx)("div",{className:"text-[10px] uppercase tracking-[0.14em] text-[var(--sc-text-muted)]",children:"Critical"}),(0,t.jsx)("div",{className:"mt-1 text-xl font-semibold text-[var(--sc-coral)]",children:n.decayDistribution.critical})]})]}),(0,t.jsxs)("div",{className:"mt-4 space-y-2 rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/50 p-3 text-xs",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Light tick (every ~5 min)"}),(0,t.jsxs)("span",{className:"text-[var(--sc-text-primary)]",children:[et(a?.lastLightTick??null)," · ",a?.stats.lightTicks??0," runs"]})]}),(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Heavy tick (every ~1 hr)"}),(0,t.jsxs)("span",{className:"text-[var(--sc-text-primary)]",children:[et(a?.lastMediumTick??null)," · ",a?.stats.mediumTicks??0," runs"]})]}),(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Last consolidation"}),(0,t.jsxs)("span",{className:"text-[var(--sc-text-primary)]",children:[et(a?.lastConsolidation??null)," · ",a?.stats.consolidations??0," runs"]})]})]}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap gap-2",children:[(0,t.jsxs)(m.Button,{variant:"outline",size:"sm",onClick:()=>{i.mutate(void 0,{onSuccess:()=>Q.toast.success("Light cleanup triggered"),onError:e=>Q.toast.error(e instanceof Error?e.message:"Failed to trigger light cleanup")})},disabled:o,pulse:i.isPending,children:[(0,t.jsx)(Y.Activity,{size:13}),i.isPending?"Running":"Run light cleanup"]}),(0,t.jsxs)(m.Button,{variant:"outline",size:"sm",onClick:()=>{l.mutate(void 0,{onSuccess:()=>Q.toast.success("Heavy cleanup triggered"),onError:e=>Q.toast.error(e instanceof Error?e.message:"Failed to trigger heavy cleanup")})},disabled:o,pulse:l.isPending,children:[(0,t.jsx)(j.RefreshCw,{size:13}),l.isPending?"Running":"Run heavy cleanup"]}),(0,t.jsxs)(m.Button,{variant:"cyan",size:"sm",onClick:()=>{d.mutate(void 0,{onSuccess:()=>Q.toast.success("Consolidation triggered"),onError:e=>Q.toast.error(e instanceof Error?e.message:"Failed to trigger consolidation")})},disabled:o,pulse:d.isPending,children:[(0,t.jsx)(Z.Sparkles,{size:13}),d.isPending?"Running":"Consolidate now"]})]}),(0,t.jsxs)("p",{className:"mt-3 text-[11px] text-[var(--sc-text-muted)]",children:["CLI equivalent: ",(0,t.jsx)("code",{className:"font-mono",children:"shieldcortex consolidate"}),". Auto-cleanup runs continuously while the dashboard service is up; check"," ",(0,t.jsx)("code",{className:"font-mono",children:"shieldcortex service status"})," if ticks haven't advanced."]})]})}var er=e.i(71259),ea=e.i(77744),ec=e.i(42098);let en=[.1,.2,.3,.4,.5],ei=[7,30,90,180,365];function el(){let e,{projectFilter:s}=(0,ec.useDashboardStore)(),[a,c]=(0,r.useState)(.2),[n,i]=(0,r.useState)(30),[l,d]=(0,r.useState)(!0),[o,u]=(0,r.useState)(s?"current":"all"),[p,v]=(0,r.useState)(null),h=(e=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async e=>{let t=await (0,S.gatedFetch)(`${ee}/api/memories/prune`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok)throw Error(await (0,S.readApiError)(t,"Failed to prune"));return t.json()},onSuccess:t=>{"number"==typeof t.deleted&&(e.invalidateQueries({queryKey:["memory-stats"]}),e.invalidateQueries({queryKey:["integrations-config"]}))}})),y="current"===o&&s?s:void 0;return(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(ea.Trash2,{size:16,className:"text-[var(--sc-coral)]"}),(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Threshold Prune"})]}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--sc-text-secondary)]",children:"Permanently delete memories below a salience threshold older than N days. Always preview first; backup is automatic before any delete."}),(0,t.jsxs)("div",{className:"mt-4 grid gap-4 md:grid-cols-2",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between text-xs",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Salience ≤"}),(0,t.jsx)("span",{className:"font-mono text-[var(--sc-text-primary)]",children:a.toFixed(2)})]}),(0,t.jsx)("input",{type:"range",min:0,max:.5,step:.05,value:a,onChange:e=>c(parseFloat(e.target.value)),className:"mt-1 w-full accent-[var(--sc-coral)]","aria-label":"Salience threshold"}),(0,t.jsx)("div",{className:"mt-1 flex gap-1",children:en.map(e=>(0,t.jsx)("button",{type:"button",onClick:()=>c(e),className:`rounded border px-1.5 py-0.5 text-[10px] transition ${a===e?"border-[var(--sc-coral)] text-[var(--sc-coral)]":"border-[var(--sc-border)] text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)]"}`,children:e},e))})]}),(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between text-xs",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Older than (days)"}),(0,t.jsx)("span",{className:"font-mono text-[var(--sc-text-primary)]",children:n})]}),(0,t.jsx)("input",{type:"range",min:1,max:365,step:1,value:n,onChange:e=>i(parseInt(e.target.value,10)),className:"mt-1 w-full accent-[var(--sc-coral)]","aria-label":"Age threshold"}),(0,t.jsx)("div",{className:"mt-1 flex gap-1",children:ei.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>i(e),className:`rounded border px-1.5 py-0.5 text-[10px] transition ${n===e?"border-[var(--sc-coral)] text-[var(--sc-coral)]":"border-[var(--sc-border)] text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)]"}`,children:[e,"d"]},e))})]})]}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-3 text-xs",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Scope:"}),(0,t.jsx)("button",{type:"button",onClick:()=>u("all"),className:`rounded-md border px-2 py-1 ${"all"===o?"border-[var(--sc-cyan)] text-[var(--sc-cyan)]":"border-[var(--sc-border)] text-[var(--sc-text-muted)]"}`,children:"All projects"}),(0,t.jsxs)("button",{type:"button",disabled:!s,onClick:()=>u("current"),className:`rounded-md border px-2 py-1 disabled:opacity-40 ${"current"===o?"border-[var(--sc-cyan)] text-[var(--sc-cyan)]":"border-[var(--sc-border)] text-[var(--sc-text-muted)]"}`,children:["Current (",s??"none selected",")"]}),(0,t.jsxs)("label",{className:"ml-auto inline-flex items-center gap-2 text-[var(--sc-text-secondary)]",children:[(0,t.jsx)("input",{type:"checkbox",checked:l,onChange:e=>d(e.target.checked),className:"accent-[var(--sc-cyan)]"}),"Exclude pinned"]})]}),p&&(0,t.jsxs)("div",{className:"mt-4 rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/50 p-3",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("span",{className:"text-sm font-semibold text-[var(--sc-text-primary)]",children:[p.matched," memories match"]}),(0,t.jsxs)("span",{className:"text-[10px] text-[var(--sc-text-muted)]",children:["showing first ",p.sample.length]})]}),0===p.sample.length?(0,t.jsx)("div",{className:"mt-2 text-xs text-[var(--sc-text-muted)]",children:"Nothing to prune at these thresholds."}):(0,t.jsx)("ul",{className:"mt-2 max-h-48 space-y-1 overflow-y-auto text-xs",children:p.sample.map(e=>(0,t.jsxs)("li",{className:"flex items-baseline gap-2 text-[var(--sc-text-secondary)]",children:[(0,t.jsxs)("span",{className:"font-mono text-[10px] text-[var(--sc-text-muted)]",children:["#",e.id]}),(0,t.jsx)("span",{className:"truncate flex-1 text-[var(--sc-text-primary)]",children:e.title}),(0,t.jsxs)("span",{className:"text-[10px] text-[var(--sc-text-muted)]",children:[e.project??"(no project)"," · sal ",e.salience.toFixed(2)," · ",e.ageDays,"d"]})]},e.id))})]}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap gap-2",children:[(0,t.jsxs)(m.Button,{variant:"outline",size:"sm",onClick:()=>{v(null),h.mutate({salienceLte:a,ageDaysGte:n,excludePinned:l,project:y,dryRun:!0},{onSuccess:e=>{v(e),Q.toast.success(`${e.matched} memories match — review before delete`)},onError:e=>Q.toast.error(e.message)})},disabled:h.isPending,pulse:h.isPending&&h.variables?.dryRun,children:[(0,t.jsx)(er.Eye,{size:13}),h.isPending&&h.variables?.dryRun?"Previewing":"Preview"]}),(0,t.jsxs)(m.Button,{variant:"coral",size:"sm",onClick:()=>{!p||0===p.matched||window.confirm(`Permanently delete ${p.matched} memories? A backup is auto-saved first.`)&&h.mutate({salienceLte:a,ageDaysGte:n,excludePinned:l,project:y,dryRun:!1},{onSuccess:e=>{v(null),Q.toast.success(`Deleted ${e.deleted??0}. Backup: ${e.backupPath??"see ~/.shieldcortex/backups/"}`,{duration:8e3})},onError:e=>Q.toast.error(e.message)})},disabled:!p||0===p.matched||h.isPending,pulse:h.isPending&&h.variables?.dryRun===!1,children:[(0,t.jsx)(ea.Trash2,{size:13}),h.isPending&&h.variables?.dryRun===!1?"Deleting":p?`Delete ${p.matched}`:"Delete"]})]})]})}let ed=(0,c.default)("git-merge",[["circle",{cx:"18",cy:"18",r:"3",key:"1xkwt0"}],["circle",{cx:"6",cy:"6",r:"3",key:"1lh9wr"}],["path",{d:"M6 21V9a9 9 0 0 0 9 9",key:"7kw0sc"}]]);var eo=e.i(6847);function ex(){let e,{projectFilter:s}=(0,ec.useDashboardStore)(),[a,c]=(0,r.useState)(s?"current":"all"),[n,i]=(0,r.useState)(null),l=(e=(0,C.useQueryClient)(),(0,k.useMutation)({mutationFn:async e=>{let t=await (0,S.gatedFetch)(`${ee}/api/memories/dedupe`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok)throw Error(await (0,S.readApiError)(t,"Failed to dedupe"));return t.json()},onSuccess:t=>{"number"==typeof t.merged&&e.invalidateQueries({queryKey:["memory-stats"]})}})),d="current"===a&&s?s:void 0,o=n?.groups.reduce((e,t)=>e+t.removeIds.length,0)??0;return(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(ed,{size:16,className:"text-[var(--sc-cyan)]"}),(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Project Dedupe"})]}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--sc-text-secondary)]",children:"Find clusters of near-duplicate long-term memories (text similarity: title overlap + content Jaccard). Merging keeps the highest-salience representative and deletes the rest. Backup auto-saved before any merge."}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-3 text-xs",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Scope:"}),(0,t.jsx)("button",{type:"button",onClick:()=>c("all"),className:`rounded-md border px-2 py-1 ${"all"===a?"border-[var(--sc-cyan)] text-[var(--sc-cyan)]":"border-[var(--sc-border)] text-[var(--sc-text-muted)]"}`,children:"All projects"}),(0,t.jsxs)("button",{type:"button",disabled:!s,onClick:()=>c("current"),className:`rounded-md border px-2 py-1 disabled:opacity-40 ${"current"===a?"border-[var(--sc-cyan)] text-[var(--sc-cyan)]":"border-[var(--sc-border)] text-[var(--sc-text-muted)]"}`,children:["Current (",s??"none selected",")"]})]}),n&&(0,t.jsxs)("div",{className:"mt-4 rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/50 p-3",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("span",{className:"text-sm font-semibold text-[var(--sc-text-primary)]",children:[n.groups.length," cluster(s) · ",o," removable"]}),(0,t.jsxs)("span",{className:"text-[10px] text-[var(--sc-text-muted)]",children:[n.pairsFound," pairs scanned"]})]}),0===n.groups.length?(0,t.jsx)("div",{className:"mt-2 text-xs text-[var(--sc-text-muted)]",children:"No duplicates at the current heuristic threshold."}):(0,t.jsx)("ul",{className:"mt-2 max-h-64 space-y-2 overflow-y-auto text-xs",children:n.groups.map(e=>(0,t.jsxs)("li",{className:"rounded border border-[var(--sc-border)] bg-[var(--sc-bg-surface)] p-2",children:[(0,t.jsxs)("div",{className:"text-[10px] uppercase tracking-[0.14em] text-[var(--sc-text-muted)]",children:["Keep #",e.keepId," · remove ",e.removeIds.length," · ",e.similarity]}),(0,t.jsx)("div",{className:"mt-1 font-semibold text-[var(--sc-text-primary)] truncate",children:e.keepTitle}),(0,t.jsxs)("div",{className:"mt-0.5 text-[var(--sc-text-secondary)]",children:["Will delete: ",e.removeIds.map(e=>`#${e}`).join(", ")]})]},e.keepId))})]}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap gap-2",children:[(0,t.jsxs)(m.Button,{variant:"outline",size:"sm",onClick:()=>{i(null),l.mutate({project:d,dryRun:!0},{onSuccess:e=>{i(e),Q.toast.success(0===e.groups.length?"No duplicate clusters found":`Found ${e.groups.length} cluster(s), ${e.groups.reduce((e,t)=>e+t.removeIds.length,0)} removable`)},onError:e=>Q.toast.error(e.message)})},disabled:l.isPending,pulse:l.isPending&&l.variables?.dryRun,children:[(0,t.jsx)(eo.Search,{size:13}),l.isPending&&l.variables?.dryRun?"Scanning":"Find duplicates"]}),(0,t.jsxs)(m.Button,{variant:"cyan",size:"sm",onClick:()=>{!n||0===o||window.confirm(`Merge ${n.groups.length} cluster(s) and delete ${o} duplicate(s)? Backup auto-saved first.`)&&l.mutate({project:d,dryRun:!1},{onSuccess:e=>{i(null),Q.toast.success(`Merged ${e.merged??0}. Backup: ${e.backupPath??"see ~/.shieldcortex/backups/"}`,{duration:8e3})},onError:e=>Q.toast.error(e.message)})},disabled:!n||0===o||l.isPending,pulse:l.isPending&&l.variables?.dryRun===!1,children:[(0,t.jsx)(ed,{size:13}),l.isPending&&l.variables?.dryRun===!1?"Merging":n&&o>0?`Merge all (${o})`:"Merge"]})]})]})}var eu=e.i(27528);let em=(0,c.default)("key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);var ep=e.i(77715),ev=e.i(66949);let eh=(0,c.default)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]),ey=(0,c.default)("chevron-up",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]),eg="https://api.shieldcortex.ai",eb=J.default.env.NEXT_PUBLIC_API_URL||"http://localhost:3001",ej=["Custom injection patterns","Custom Iron Dome policies","Custom firewall rules","Audit export (JSON/CSV)","Skill scanner deep mode"];function ef(){let{data:e,isLoading:s}=(0,P.useLicenseStatus)(),a=(0,P.useActivateLicense)(),c=(0,P.useDeactivateLicense)(),n=function(){let e=(0,C.useQueryClient)(),[t,s]=(0,r.useState)("idle"),[a,c]=(0,r.useState)(null),[n,i]=(0,r.useState)(null),l=(0,r.useCallback)(async(e,t)=>{s("submitting"),c(null);try{let r=await fetch(`${eg}/v1/billing/quick-checkout`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e,plan:t})}),a=await r.json();if(!r.ok||!a.checkout_url||!a.setup_id)throw Error(a.error||"Failed to create checkout session");i(a.setup_id),window.open(a.checkout_url,"_blank"),s("polling")}catch(e){c(e instanceof Error?e.message:"Checkout failed"),s("error")}},[]);return(0,r.useEffect)(()=>{if("polling"!==t||!n)return;let r=setInterval(async()=>{try{let t=await fetch(`${eg}/v1/billing/setup-status/${n}`),a=await t.json();if("complete"===a.status&&a.license_key){clearInterval(r),s("activating");try{if(!(await (0,S.authFetch)(`${eb}/api/license/activate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:a.license_key})})).ok)throw Error("Local activation failed");e.invalidateQueries({queryKey:["license-status"]}),s("complete")}catch{c('Payment succeeded but local activation failed. Use "I Have a Key" to activate manually.'),s("error")}}else"expired"===a.status?(clearInterval(r),c("Setup expired. Please try again."),s("error")):"complete"!==a.status||a.license_key||(clearInterval(r),c("Licence key was already retrieved. Check your dashboard or try again."),s("error"))}catch{}},3e3),a=setTimeout(()=>{clearInterval(r),c('Checkout timed out. If you completed payment, use "I Have a Key" or contact support.'),s("error")},9e5);return()=>{clearInterval(r),clearTimeout(a)}},[t,n,e]),{state:t,error:a,startCheckout:l,reset:(0,r.useCallback)(()=>{s("idle"),c(null),i(null)},[])}}(),[i,l]=(0,r.useState)(""),[d,o]=(0,r.useState)("default"),[x,u]=(0,r.useState)(""),[m,p]=(0,r.useState)("pro"),[h,y]=(0,r.useState)(!1);if(s||!e)return(0,t.jsx)("div",{className:"bg-[var(--sc-bg-surface)] border border-[var(--sc-border)] rounded-xl p-4 mb-4",children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(eu.Shield,{size:16,className:"text-[var(--sc-text-muted)]"}),(0,t.jsx)("span",{className:"text-xs text-[var(--sc-text-muted)] animate-pulse",children:"Loading licence..."})]})});let g=e.tier;if("free"===g)return(0,t.jsxs)("div",{className:"relative overflow-hidden rounded-xl mb-4 bg-gradient-to-br from-slate-900 via-[var(--sc-bg-surface)] to-cyan-950/30 border border-[var(--sc-cyan)]/30",children:[(0,t.jsx)("div",{className:"absolute top-0 right-0 w-32 h-32 bg-[var(--sc-cyan)]/5 rounded-full blur-2xl -translate-y-1/2 translate-x-1/2"}),(0,t.jsxs)("div",{className:"relative p-5",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,t.jsx)("div",{className:"flex items-center justify-center w-8 h-8 rounded-lg bg-[var(--sc-cyan)]/10 border border-[var(--sc-cyan)]/20",children:(0,t.jsx)(Z.Sparkles,{size:16,className:"text-[var(--sc-cyan)]"})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-semibold text-[var(--sc-text-primary)]",children:"Unlock Pro Features"}),(0,t.jsx)("p",{className:"text-[11px] text-[var(--sc-text-secondary)] mt-0.5",children:"Your defence pipeline is fully active. Upgrade for advanced controls."})]})]}),(0,t.jsx)("span",{className:"text-[10px] font-medium px-2 py-0.5 rounded-full bg-[var(--sc-bg-elevated)] text-[var(--sc-text-secondary)] border border-[var(--sc-border)]",children:"Free"})]}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-x-4 gap-y-1.5 mb-4",children:ej.map(e=>(0,t.jsxs)("div",{className:"flex items-center gap-1.5 text-xs",children:[(0,t.jsx)(ev.Lock,{size:10,className:"text-[var(--sc-cyan)]/60 shrink-0"}),(0,t.jsx)("span",{className:"text-[var(--sc-text-secondary)]",children:e})]},e))}),"complete"===n.state?(0,t.jsxs)("div",{className:"flex items-center gap-2 p-3 bg-[var(--sc-cyan)]/10 border border-[var(--sc-cyan)]/20 rounded-lg",children:[(0,t.jsx)(v.CheckCircle2,{size:16,className:"text-[var(--sc-cyan)] shrink-0"}),(0,t.jsx)("span",{className:"text-xs text-[var(--sc-cyan)]",children:"Pro activated! Your dashboard is refreshing..."})]}):"polling"===n.state||"activating"===n.state?(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 p-3 bg-[var(--sc-cyan)]/10 border border-[var(--sc-cyan)]/20 rounded-lg",children:[(0,t.jsx)(D.Loader2,{size:14,className:"text-[var(--sc-cyan)] animate-spin shrink-0"}),(0,t.jsx)("span",{className:"text-xs text-[var(--sc-cyan)]",children:"activating"===n.state?"Activating licence...":"Complete payment in the Stripe tab..."})]}),(0,t.jsx)("button",{onClick:()=>{n.reset(),o("default")},className:"text-[10px] text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)] transition-colors",children:"Cancel"})]}):"checkout"===d?(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"text-[10px] text-[var(--sc-text-muted)] mb-1 block",children:"Email"}),(0,t.jsx)("input",{type:"email",placeholder:"you@company.com",value:x,onChange:e=>u(e.target.value),className:"w-full bg-[var(--sc-bg-elevated)] border border-[var(--sc-border)] rounded-lg px-3 py-2 text-xs text-[var(--sc-text-primary)] placeholder:text-[var(--sc-text-muted)] focus:outline-none focus:ring-1 focus:ring-[var(--sc-cyan)]",autoFocus:!0})]}),(0,t.jsx)("div",{className:"flex gap-2",children:["pro","team"].map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>p(e),className:`flex-1 px-3 py-2 text-xs font-medium rounded-lg border transition-colors ${m===e?"bg-[var(--sc-cyan)]/20 border-[var(--sc-cyan)]/50 text-[var(--sc-cyan)]":"bg-[var(--sc-bg-elevated)] border-[var(--sc-border)] text-[var(--sc-text-secondary)] hover:border-[var(--sc-border)]"}`,children:[R.PLAN_PRICING[e].label," — ",R.PLAN_PRICING[e].price]},e))}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("button",{onClick:()=>n.startCheckout(x,m),disabled:"submitting"===n.state||!x.trim(),className:"flex-1 inline-flex items-center justify-center gap-1.5 px-4 py-2 text-xs font-medium bg-[var(--sc-cyan)] hover:bg-[var(--sc-cyan-mid)] disabled:opacity-50 text-[var(--sc-text-primary)] rounded-lg transition-colors",children:"submitting"===n.state?(0,t.jsx)(D.Loader2,{size:12,className:"animate-spin"}):"Continue to Checkout"}),(0,t.jsx)("button",{onClick:()=>{o("default"),n.reset()},className:"px-3 py-2 text-xs text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)] transition-colors",children:"Back"})]}),n.error&&(0,t.jsx)("p",{className:"text-xs text-[var(--sc-coral)]",children:n.error})]}):"activate"===d?(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)("form",{onSubmit:e=>{e.preventDefault(),i.trim()&&a.mutate(i.trim(),{onSuccess:()=>{l(""),o("default")}})},className:"flex gap-2",children:[(0,t.jsx)("input",{type:"text",placeholder:"sc_pro_...",value:i,onChange:e=>l(e.target.value),className:"flex-1 bg-[var(--sc-bg-elevated)] border border-[var(--sc-border)] rounded-lg px-3 py-2 text-xs text-[var(--sc-text-primary)] placeholder:text-[var(--sc-text-muted)] focus:outline-none focus:ring-1 focus:ring-[var(--sc-cyan)]",autoFocus:!0}),(0,t.jsx)("button",{type:"submit",disabled:a.isPending||!i.trim(),className:"px-4 py-2 text-xs font-medium bg-[var(--sc-cyan)] hover:bg-[var(--sc-cyan-mid)] disabled:opacity-50 text-[var(--sc-text-primary)] rounded-lg transition-colors",children:a.isPending?(0,t.jsx)(D.Loader2,{size:12,className:"animate-spin"}):"Activate"}),(0,t.jsx)("button",{type:"button",onClick:()=>{o("default"),l(""),a.reset()},className:"px-3 py-2 text-xs text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)] transition-colors",children:"Back"})]}),a.isError&&(0,t.jsx)("p",{className:"text-xs text-[var(--sc-coral)]",children:a.error instanceof Error?a.error.message:"Activation failed"})]}):(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("button",{onClick:()=>o("checkout"),className:"inline-flex items-center gap-1.5 px-4 py-2 text-xs font-medium bg-[var(--sc-cyan)] hover:bg-[var(--sc-cyan-mid)] text-[var(--sc-text-primary)] rounded-lg transition-colors",children:"Upgrade to Pro"}),(0,t.jsxs)("button",{onClick:()=>o("activate"),className:"inline-flex items-center gap-1.5 px-4 py-2 text-xs font-medium bg-[var(--sc-bg-elevated)] hover:bg-[var(--sc-bg-elevated)] text-[var(--sc-text-primary)] rounded-lg transition-colors border border-[var(--sc-border)]",children:[(0,t.jsx)(em,{size:12}),"I Have a Key"]})]}),n.error&&(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("p",{className:"text-xs text-[var(--sc-coral)]",children:n.error}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("button",{onClick:()=>{n.reset(),o("checkout")},className:"text-[10px] text-[var(--sc-cyan)] hover:text-[var(--sc-cyan)] transition-colors",children:"Try Again"}),(0,t.jsx)("span",{className:"text-[10px] text-[var(--sc-text-muted)]",children:"·"}),(0,t.jsx)("button",{onClick:()=>{n.reset(),o("activate")},className:"text-[10px] text-[var(--sc-text-secondary)] hover:text-[var(--sc-text-primary)] transition-colors",children:"I Have a Key"})]})]})]})]})]});let b=e.features.filter(e=>e.enabled).length,j=e.features.length;return(0,t.jsxs)("div",{className:"bg-[var(--sc-bg-surface)] border border-[var(--sc-cyan)]/40 rounded-xl p-4 mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(eu.Shield,{size:16,className:R.TIER_COLOURS[g]}),(0,t.jsx)("h3",{className:"text-sm font-medium text-[var(--sc-text-primary)]",children:"Licence"}),(0,t.jsx)("span",{className:`text-[10px] font-semibold px-1.5 py-0.5 rounded ${R.TIER_COLOURS[g]} ${R.TIER_BG[g]}`,children:R.TIER_LABELS[g]})]}),(0,t.jsxs)("span",{className:"text-[10px] text-[var(--sc-text-muted)]",children:[b,"/",j," features"]})]}),(0,t.jsxs)("div",{className:"space-y-2 mb-3",children:[e.email&&(0,t.jsxs)("div",{className:"flex items-center justify-between text-xs",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Email"}),(0,t.jsx)("span",{className:"text-[var(--sc-text-primary)]",children:e.email})]}),null!==e.daysUntilExpiry&&(0,t.jsxs)("div",{className:"flex items-center justify-between text-xs",children:[(0,t.jsx)("span",{className:"text-[var(--sc-text-muted)]",children:"Expires"}),(0,t.jsx)("span",{className:e.daysUntilExpiry<=7?"text-[var(--sc-amber)]":"text-[var(--sc-text-primary)]",children:e.daysUntilExpiry<=0?"Expired (grace period)":`${e.daysUntilExpiry} days`})]})]}),(0,t.jsxs)("button",{onClick:()=>y(!h),className:"flex items-center gap-1 text-[10px] text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)] transition-colors mb-2",children:[h?(0,t.jsx)(ey,{size:12}):(0,t.jsx)(eh,{size:12}),h?"Hide features":"Show features"]}),h&&(0,t.jsx)("div",{className:"space-y-1.5 mb-3",children:e.features.map(e=>(0,t.jsxs)("div",{className:"flex items-center gap-2 text-xs",children:[e.enabled?(0,t.jsx)(v.CheckCircle2,{size:12,className:"text-[var(--sc-cyan)] shrink-0"}):(0,t.jsx)(ep.XCircle,{size:12,className:"text-[var(--sc-text-muted)] shrink-0"}),(0,t.jsx)("span",{className:e.enabled?"text-[var(--sc-text-primary)]":"text-[var(--sc-text-muted)]",children:e.description.split(".")[0]}),!e.enabled&&(0,t.jsx)("span",{className:`text-[9px] px-1 py-0.5 rounded ${R.TIER_COLOURS[e.requiredTier]} ${R.TIER_BG[e.requiredTier]}`,children:R.TIER_LABELS[e.requiredTier]})]},e.feature))}),(0,t.jsx)("button",{onClick:()=>{confirm(`Remove your ${R.TIER_LABELS[g]} licence key? You will lose access to paid features.`)&&c.mutate()},disabled:c.isPending,className:"text-[10px] text-[var(--sc-text-muted)] hover:text-[var(--sc-coral)] transition-colors",children:"Deactivate"})]})}var eN=e.i(87927);function ew(){let e=(0,s.useSearchParams)().get("tab"),a=e&&["cloud","integrations","licence","admin"].includes(e)?e:null,[c,p]=(0,r.useState)("cloud"),v=a??c,{data:h}=(0,P.useLicenseStatus)(),[y,g]=(0,r.useState)(()=>(0,eN.loadIntensity)()),b=[{id:"cloud",label:"Cloud Sync",icon:(0,t.jsx)(n,{size:14})},{id:"integrations",label:"Integrations",icon:(0,t.jsx)(l,{size:14})},{id:"licence",label:"Licence",icon:(0,t.jsx)(i,{size:14})},{id:"admin",label:"Admin",icon:(0,t.jsx)(d.Settings,{size:14})}];return(0,t.jsx)("div",{className:"h-full overflow-y-auto",children:(0,t.jsxs)("div",{className:"mx-auto max-w-7xl space-y-6 p-6",children:[(0,t.jsx)(o.PageHeader,{eyebrow:"Configuration",title:"Settings",subtitle:"Cloud sync, licence management, and system configuration.",tabs:b,activeTab:v,onTabChange:e=>p(e),actions:(0,t.jsx)(u.Badge,{variant:h?.tier==="pro"?"cyan":h?.tier==="team"?"coral":"muted",children:R.TIER_LABELS[h?.tier??"free"]})}),(0,t.jsxs)("div",{children:["cloud"===v&&(0,t.jsx)(U,{}),"integrations"===v&&(0,t.jsx)(X,{}),"licence"===v&&(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsx)(ef,{}),(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Upgrade"}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--sc-text-secondary)]",children:"Pro unlocks deep X-Ray scanning, custom firewall rules, custom Iron Dome policies, audit exports, and more. Team adds cloud sync and team management."}),(0,t.jsx)("div",{className:"mt-4 flex gap-3",children:(0,t.jsx)("a",{href:"https://shieldcortex.ai/pricing",target:"_blank",rel:"noopener noreferrer",children:(0,t.jsx)(m.Button,{variant:"coral",glow:!0,children:"View pricing"})})})]})]}),"admin"===v&&(0,t.jsxs)("div",{className:"space-y-6",children:[(0,t.jsx)(es,{}),(0,t.jsx)(el,{}),(0,t.jsx)(ex,{}),(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"Graph Motion"}),(0,t.jsx)("p",{className:"mt-2 text-sm text-[var(--sc-text-secondary)]",children:"How lively the knowledge graph feels. Per-browser."}),(0,t.jsx)("div",{role:"radiogroup","aria-label":"Graph motion intensity",className:"mt-4 flex gap-2",children:["subtle","moderate","strong"].map(e=>(0,t.jsxs)("label",{className:`flex flex-1 cursor-pointer items-center gap-2 rounded-lg border px-4 py-3 transition-colors ${y===e?"border-[var(--sc-accent-cyan)] bg-[var(--sc-bg-elevated)]":"border-transparent bg-[var(--sc-bg-elevated)] hover:border-[var(--sc-border-subtle)]"}`,children:[(0,t.jsx)("input",{type:"radio",name:"graph-intensity",value:e,checked:y===e,onChange:()=>{g(e),(0,eN.saveIntensity)(e)},className:"accent-[var(--sc-accent-cyan)]"}),(0,t.jsx)("span",{className:"text-sm text-[var(--sc-text-primary)]",children:e[0].toUpperCase()+e.slice(1)})]},e))})]}),(0,t.jsxs)(x.GlassCard,{className:"p-6",children:[(0,t.jsx)("h3",{className:"text-lg font-semibold text-[var(--sc-text-primary)]",children:"System Information"}),(0,t.jsxs)("div",{className:"mt-4 space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-[var(--sc-bg-elevated)] px-4 py-3",children:[(0,t.jsx)("span",{className:"text-sm text-[var(--sc-text-secondary)]",children:"Dashboard"}),(0,t.jsx)("span",{className:"font-mono text-sm text-[var(--sc-text-primary)]",children:"localhost:3030"})]}),(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-[var(--sc-bg-elevated)] px-4 py-3",children:[(0,t.jsx)("span",{className:"text-sm text-[var(--sc-text-secondary)]",children:"API Server"}),(0,t.jsx)("span",{className:"font-mono text-sm text-[var(--sc-text-primary)]",children:"localhost:3001"})]}),(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-[var(--sc-bg-elevated)] px-4 py-3",children:[(0,t.jsx)("span",{className:"text-sm text-[var(--sc-text-secondary)]",children:"Database"}),(0,t.jsx)("span",{className:"font-mono text-sm text-[var(--sc-text-primary)]",children:"~/.shieldcortex/memories.db"})]}),(0,t.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-[var(--sc-bg-elevated)] px-4 py-3",children:[(0,t.jsx)("span",{className:"text-sm text-[var(--sc-text-secondary)]",children:"Licence Tier"}),(0,t.jsx)(u.Badge,{variant:h?.tier==="pro"?"cyan":h?.tier==="team"?"coral":"muted",children:R.TIER_LABELS[h?.tier??"free"]})]})]})]})]})]})]})})}function ek(){return(0,t.jsx)(r.Suspense,{fallback:(0,t.jsx)(a.PageSkeleton,{}),children:(0,t.jsx)(ew,{})})}e.s(["SettingsView",()=>ek],42424)}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,87927,e=>{"use strict";let t="shieldcortex.graph.intensity",r=new Set(["subtle","moderate","strong"]);function a(e){let a=e??window.localStorage;if(!a)return"moderate";let l=a.getItem(t);return"string"==typeof l&&r.has(l)?l:"moderate"}function l(e,r){let a=r??window.localStorage;a&&(a.setItem(t,e),"u">typeof CustomEvent&&window.dispatchEvent(new CustomEvent("shieldcortex:intensity-changed",{detail:e})))}function n(){return!!window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches}e.s(["INTENSITY",0,{subtle:{breathPeriod:6e3,breathAmp:.03,particleCap:20,decayCreate:.98,decayRecall:.96},moderate:{breathPeriod:3e3,breathAmp:.08,particleCap:60,decayCreate:.96,decayRecall:.93},strong:{breathPeriod:1600,breathAmp:.14,particleCap:120,decayCreate:.94,decayRecall:.9}},"REDUCED_INTENSITY",0,{breathPeriod:1/0,breathAmp:0,particleCap:0,decayCreate:0,decayRecall:0},"isReducedMotion",()=>n,"loadIntensity",()=>a,"saveIntensity",()=>l])},68595,e=>{"use strict";var t=e.i(27493),r=e.i(4),a=e.i(6847),l=e.i(17278),n=e.i(16467),s=e.i(95659),i=e.i(74133);let o=(e,t,r)=>Math.min(r,Math.max(t,e)),c="#7dd3fc";function d(e){return"string"==typeof e?e:e.id}var u=e.i(87927);class h{level;settings;knownNodes=new Set;phase=new Map;spikeEnergy=new Map;recallEnergy=new Map;breathOffset=new Map;now;lastFrameAt=0;constructor(e){this.level=e.intensity,this.settings=u.INTENSITY[e.intensity],this.now=e.now??("u">typeof performance?()=>performance.now():Date.now)}setIntensity(e){this.level=e,this.settings=u.INTENSITY[e]}observeNodes(e){for(let t of e)this.knownNodes.has(t)||(this.knownNodes.add(t),this.phase.set(t,function(e){let t=0x811c9dc5;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=0x1000193*t>>>0;return t/0x100000000}(t)*Math.PI*2))}dispatch(e){this.knownNodes.has(e.entityId)&&("memory.created"===e.type&&this.spikeEnergy.set(e.entityId,1),"memory.accessed"===e.type&&this.recallEnergy.set(e.entityId,1))}onFrame(e){this.lastFrameAt=e;let{breathPeriod:t,breathAmp:r}=this.settings,a=2*Math.PI/t;for(let t of this.knownNodes){let l=this.phase.get(t)??0;this.breathOffset.set(t,Math.sin(a*e+l)*r)}let l=this.settings.decayCreate;for(let[e,t]of this.spikeEnergy){let r=t*l;r<.001?this.spikeEnergy.delete(e):this.spikeEnergy.set(e,r)}let n=this.settings.decayRecall;for(let[e,t]of this.recallEnergy){let r=t*n;r<.001?this.recallEnergy.delete(e):this.recallEnergy.set(e,r)}}getEnergy(e){return this.knownNodes.has(e)?(this.breathOffset.get(e)??0)+(this.spikeEnergy.get(e)??0):0}getRecallEnergy(e){return this.knownNodes.has(e)?this.recallEnergy.get(e)??0:0}pickParticleEdges(e,t,r){let a=r??this.settings.particleCap;if(a<=0||0===e.length)return[];let l=e=>"string"==typeof e?e:e.id,n=e.map(e=>{let r=l(e.source),a=l(e.target);return{link:e,score:Math.max(Math.max(this.getEnergy(r),this.getRecallEnergy(r)),Math.max(this.getEnergy(a),this.getRecallEnergy(a))),anchorAdjacent:+(null!==t&&(r===t||a===t))}});return n.sort((e,t)=>t.score!==e.score?t.score-e.score:t.anchorAdjacent-e.anchorAdjacent),n.slice(0,a).map(e=>e.link)}}function m({driver:e}){let[a,l]=(0,r.useState)("");return"1"===window.localStorage.getItem("SHIELDCORTEX_DEBUG_PULSE")&&e?(0,t.jsxs)("div",{style:{position:"absolute",bottom:8,right:8,padding:8,background:"#0a0d14cc",color:"#e2e8f0",fontSize:12,border:"1px solid #1e293b",zIndex:10},children:[(0,t.jsx)("div",{style:{marginBottom:4,opacity:.6},children:"pulse debug"}),(0,t.jsx)("input",{value:a,onChange:e=>l(e.target.value),placeholder:"entity id",style:{width:140,background:"#06070d",color:"#e2e8f0",border:"1px solid #1e293b",padding:"2px 4px"}}),(0,t.jsxs)("div",{style:{display:"flex",gap:4,marginTop:4},children:[(0,t.jsx)("button",{onClick:()=>e.dispatch({type:"memory.created",entityId:a}),children:"created"}),(0,t.jsx)("button",{onClick:()=>e.dispatch({type:"memory.accessed",entityId:a}),children:"accessed"})]})]}):null}var f=e.i(22534);let p=f.default.env.NEXT_PUBLIC_API_URL||"http://localhost:3001",y=(0,i.default)(()=>e.A(23531),{loadableGenerated:{modules:[23272]},ssr:!1}),g={tool:"#00e5cc",concept:"#ff4d4d",project:"#f59e0b",file:"#5a6480",service:"#a78bfa",person:"#34d399",language:"#a78bfa",pattern:"#fb923c"};function x({clusters:e,allTriples:a,totalEntities:l,totalConnections:n,width:s,height:i,onSelectEntity:f,selectedEntityId:x}){let b=(0,r.useRef)(void 0),v=(0,r.useRef)(null),C=(0,r.useRef)(1),[j,w]=(0,r.useState)(null),[k,S]=(0,r.useState)(null),[N,M]=(0,r.useState)(null),[E,I]=(0,r.useState)("moderate"),P=(0,r.useMemo)(()=>(0,u.isReducedMotion)(),[]),T=(0,r.useMemo)(()=>P?u.REDUCED_INTENSITY:u.INTENSITY[E],[P,E]),R=(0,r.useMemo)(()=>(function(e){let t=new Map;for(let r of e)for(let e of r.entities)t.set(e.id,r.type);return t})(e),[e]),A=(0,r.useMemo)(()=>{let t=function(e,t){let r=new Map;for(let a of e){let e=t.get(a.source),l=t.get(a.target);if(e&&l&&e!==l){let t=[e,l].sort().join("::");r.set(t,(r.get(t)||0)+1)}}return r}(a,R),r=e.map((t,r)=>{let a=r/e.length*Math.PI*2-Math.PI/2;return{id:`cluster::${t.type}`,name:t.type,type:t.type,memoryCount:t.entities.reduce((e,t)=>e+t.memoryCount,0),colour:t.colour,isCluster:!0,clusterType:t.type,entityCount:t.entities.length,x:150*Math.cos(a),y:150*Math.sin(a)}}),l=[];for(let[e,r]of t.entries()){let[t,a]=e.split("::");r>5&&l.push({source:`cluster::${t}`,target:`cluster::${a}`,weight:Math.min(r/100,1)})}return{nodes:r,links:l}},[e,a,R]),F=(0,r.useMemo)(()=>{if(!k)return null;let t=e.find(e=>e.type===k);if(!t)return null;let r=t.entities.slice(0,100),l=new Set(r.map(e=>e.id)),n=r.map(e=>({id:e.id,name:e.name,type:e.type,memoryCount:e.memoryCount,colour:t.colour})),s=new Map;for(let e of a){if(l.has(e.source)&&!l.has(e.target)){let t=R.get(e.target);t&&t!==k&&s.set(t,(s.get(t)||0)+1)}if(l.has(e.target)&&!l.has(e.source)){let t=R.get(e.source);t&&t!==k&&s.set(t,(s.get(t)||0)+1)}}for(let[e,t]of s.entries())t>2&&n.push({id:`ghost::${e}`,name:e,type:e,memoryCount:t,colour:g[e]||"#8892b0",isCluster:!0,clusterType:e,entityCount:t});let i=[],o=new Set;for(let e of a){let t=l.has(e.source),r=l.has(e.target);if(t&&r){let t=`${e.source}::${e.target}`;o.has(t)||(o.add(t),i.push({source:e.source,target:e.target,predicate:e.predicate}))}else if(t&&!r){let t=R.get(e.target);if(t&&t!==k&&s.has(t)){let r=`${e.source}::ghost::${t}`;o.has(r)||(o.add(r),i.push({source:e.source,target:`ghost::${t}`}))}}else if(r&&!t){let t=R.get(e.source);if(t&&t!==k&&s.has(t)){let r=`ghost::${t}::${e.target}`;o.has(r)||(o.add(r),i.push({source:`ghost::${t}`,target:e.target}))}}}return{nodes:n,links:i}},[k,e,a,R]),$=k&&F?F:A;(0,r.useEffect)(()=>{let e=(0,u.loadIntensity)();I(e);let t=new h({intensity:e});w(t);let r=e=>{let r=e.detail;("subtle"===r||"moderate"===r||"strong"===r)&&(I(r),t.setIntensity(r))};return window.addEventListener("shieldcortex:intensity-changed",r),()=>{window.removeEventListener("shieldcortex:intensity-changed",r)}},[]),(0,r.useEffect)(()=>{j?.observeNodes($.nodes.map(e=>e.id))},[j,$.nodes]),function(e,t=!0){let a=(0,r.useRef)(null);(0,r.useEffect)(()=>{if(!e||!t)return;let r=null,l=null,n=!1,s=()=>{l||(l=setInterval(()=>{if(n)return;let t=a.current;fetch(`${p}/api/memories?mode=recent&limit=50`,{credentials:"include"}).then(e=>e.ok?e.json():null).then(r=>{if(!r||n)return;let l=r.memories??[];for(let r of l)if(!t||!r.created_at||!(r.created_at<=t))for(let t of r.entity_ids??[])e.dispatch({type:"memory.created",entityId:String(t)});l[0]?.created_at&&(a.current=l[0].created_at)}).catch(()=>{})},1e4))};try{let t=p.replace(/^http/,"ws")+"/ws/events";(r=new WebSocket(t)).onmessage=t=>{try{(t=>{if(!e||!t?.type||!t.data)return;let r="memory_created"===t.type?"memory.created":"memory_accessed"===t.type?"memory.accessed":null;if(r)for(let a of t.data.entity_ids??[])e.dispatch({type:r,entityId:String(a)})})(JSON.parse(t.data))}catch{}},r.onerror=s,r.onclose=()=>{n||s()}}catch{s()}return()=>{n=!0,r?.close(),l&&clearInterval(l)}},[e,t])}(j,!0),(0,r.useEffect)(()=>{let e=function(e,t){if(0===e.length)return null;let r=new Set(e.map(e=>e.id)),a=new Map;for(let e of t){let t=d(e.source),l=d(e.target);r.has(t)&&a.set(t,(a.get(t)??0)+1),r.has(l)&&a.set(l,(a.get(l)??0)+1)}let l=null,n=0;for(let t of e){let e=t.memoryCount*(a.get(t.id)??0);0!==e&&(null===l||e>n||e===n&&0>t.name.localeCompare(l.name))&&(l=t,n=e)}if(l)return l.id;let s=0;for(let t of e)0!==t.memoryCount&&(null===l||t.memoryCount>s||t.memoryCount===s&&0>t.name.localeCompare(l.name))&&(l=t,s=t.memoryCount);return l?.id??null}($.nodes.map(e=>({id:e.id,name:e.name,memoryCount:e.memoryCount})),$.links);e!==N&&(!function(e,t,r){let a=e.find(e=>e.id===t);if(a){if(r&&r!==t){let t=e.find(e=>e.id===r);t&&(t.fx=null,t.fy=null)}a.fx=0,a.fy=0}}($.nodes,e??"",N),M(e))},[$.nodes,$.links,N]),(0,r.useEffect)(()=>{let e=b.current;e&&(k?(e.d3Force("charge")?.strength(-80),e.d3Force("link")?.distance(40),e.d3Force("center")?.strength(.05)):(e.d3Force("charge")?.strength(-2e3),e.d3Force("link")?.distance(180),e.d3Force("center")?.strength(.03)))},[k,$]);let _=(0,r.useRef)(!1);(0,r.useEffect)(()=>{if(_.current||!$.nodes.length)return;_.current=!0;let e=setTimeout(()=>b.current?.zoomToFit(400*!P,80),1500);return()=>clearTimeout(e)},[$.nodes.length,P]);let D=(0,r.useCallback)(({k:e})=>{C.current=e},[]),B=(0,r.useMemo)(()=>(function(e,t={}){let r=new Map;return{handleNodeDragEnd(e){void 0!==e.x&&void 0!==e.y&&(e.fx=e.x,e.fy=e.y)},handleNodeClick(a,l){if(l.shiftKey&&null!==a.fx&&void 0!==a.fx)return a.fx=null,a.fy=null,t.onUnpin?.(String(a.id)),r.delete(String(a.id)),"unpin";let n=String(a.id),s=performance.now(),i=r.get(n)??0;return(r.set(n,s),s-i<=300)?(void 0!==a.x&&void 0!==a.y&&(e.current?.centerAt(a.x,a.y,600),e.current?.zoom(2,600)),r.delete(n),"double-click"):"single-click"},handleBackgroundDoubleClick(t){t(),e.current?.zoomToFit(600,80)}}})(b),[]),O=(0,r.useCallback)((e,t)=>{"single-click"===B.handleNodeClick(e,t)&&(e.isCluster?(S((e.clusterType||e.type).replace("ghost::","")),f?.(null)):f?.({id:e.id,name:e.name,type:e.type,memoryCount:e.memoryCount}))},[B,f]),L=(0,r.useCallback)(()=>{k&&(S(null),f?.(null))},[k,f]),z=(0,r.useCallback)(()=>{B.handleBackgroundDoubleClick(()=>{S(null),f?.(null)})},[B,f]),G=(0,r.useCallback)(e=>{v.current=e?String(e.id):null},[]),U=(0,r.useCallback)((e,t,r)=>{if(void 0===e.x||void 0===e.y)return;let a=String(e.id),l=a===v.current,n=null!=x&&a===x,s=C.current;if(t.save(),n&&!e.isCluster){let r=.8+Math.min(.4*Math.log2((e.memoryCount||1)+1),2.5),a=t.createRadialGradient(e.x,e.y,r,e.x,e.y,8*r);a.addColorStop(0,"#ffffff18"),a.addColorStop(1,"#ffffff00"),t.beginPath(),t.arc(e.x,e.y,8*r,0,2*Math.PI),t.fillStyle=a,t.fill()}if(e.isCluster){!function(e,t,r,a){let l=t.entityCount||5,n=Math.min(15+3*Math.sqrt(l),60),s=3*n,i=e.createRadialGradient(t.x,t.y,.5*n,t.x,t.y,s);i.addColorStop(0,t.colour+"15"),i.addColorStop(.4,t.colour+"08"),i.addColorStop(1,t.colour+"00"),e.beginPath(),e.arc(t.x,t.y,s,0,2*Math.PI),e.fillStyle=i,e.fill();let o=e.createRadialGradient(t.x,t.y,0,t.x,t.y,.8*n);o.addColorStop(0,t.colour+"28"),o.addColorStop(.6,t.colour+"10"),o.addColorStop(1,t.colour+"02"),e.beginPath(),e.arc(t.x,t.y,.8*n,0,2*Math.PI),e.fillStyle=o,e.fill();let c=Math.min(l,40),d=t.id.charCodeAt(t.id.length-1);for(let r=0;r<c;r++){let a=(d+137.508*r)%360*(Math.PI/180),l=.1*n+.85*n*Math.pow((7*d+31*r)%100/100,.6),s=t.x+Math.cos(a)*l,i=t.y+Math.sin(a)*l,o=.5+(17*r+d)%4*.3;e.beginPath(),e.arc(s,i,o,0,2*Math.PI),e.fillStyle=t.colour+(r<5?"dd":r<15?"88":"44"),e.fill()}a&&(e.beginPath(),e.arc(t.x,t.y,n,0,2*Math.PI),e.strokeStyle=t.colour+"50",e.lineWidth=1.5,e.setLineDash([4,4]),e.stroke(),e.setLineDash([]));let u=Math.max(13/Math.max(r,.3),8);e.font=`600 ${u}px Inter, system-ui, sans-serif`,e.textAlign="center",e.textBaseline="top",e.fillStyle=t.colour+"bb",e.fillText(t.name,t.x,t.y+n+8);let h=Math.max(10/Math.max(r,.3),6);e.font=`400 ${h}px Inter, system-ui, sans-serif`,e.fillStyle="#ffffff30",e.fillText(`${l} entities`,t.x,t.y+n+8+u+3)}(t,e,s,l),t.restore();return}let i=j?.getEnergy(a)??0,o=j?.getRecallEnergy(a)??0,c=.8+Math.min(.4*Math.log2((e.memoryCount??0)+1),2.5);if(!function(e,t={}){var r;let a,{ctx:l,node:n,intensity:s,energy:i,recallEnergy:o,isAnchor:c,isSelected:d,baseRadius:u}=e;if(void 0===n.x||void 0===n.y)return;let h=(a=(r={baseRadius:u,energy:i,breathAmp:s.breathAmp}).baseRadius*(1+r.energy*r.breathAmp),Math.max(.2*r.baseRadius,a));t._paintHook?.({nodeId:n.id,radius:h,energy:i,recallEnergy:o});let m=h*(c?5:3.5),f=l.createRadialGradient(n.x,n.y,.2*h,n.x,n.y,m);if(f.addColorStop(0,n.colour+(c?"40":d?"50":"20")),f.addColorStop(1,n.colour+"00"),l.beginPath(),l.arc(n.x,n.y,m,0,2*Math.PI),l.fillStyle=f,l.fill(),o>.05&&(l.beginPath(),l.arc(n.x,n.y,1.6*h,0,2*Math.PI),l.strokeStyle="#fb923c",l.globalAlpha=Math.min(.7,o),l.lineWidth=1.5,l.stroke(),l.globalAlpha=1),c){l.beginPath(),l.arc(n.x,n.y,h,0,2*Math.PI),l.fillStyle="#fde68a",l.fill(),l.lineWidth=1.5,l.strokeStyle="#fbbf24",l.stroke();return}l.beginPath(),l.arc(n.x,n.y,h,0,2*Math.PI),l.fillStyle=n.colour,l.fill(),d&&(l.lineWidth=1.5,l.strokeStyle="#ffffff",l.stroke())}({ctx:t,globalScale:r,node:e,intensity:T,energy:i,recallEnergy:o,isAnchor:a===N,isSelected:n,isHovered:l,baseRadius:c}),l&&!n&&a!==N){let r=c*(1+i*T.breathAmp);t.beginPath(),t.arc(e.x,e.y,r,0,2*Math.PI),t.strokeStyle=e.colour,t.lineWidth=.7,t.stroke()}let d=e.memoryCount||1;if(n||l||s>=3||s>=1.5&&d>30||s>=.8&&d>100){let r=c*(1+i*T.breathAmp),a=Math.max((n?11:l?10:8)/Math.max(s,.4),5);t.font=`${a}px Inter, system-ui, sans-serif`,t.textAlign="center",t.textBaseline="top",t.fillStyle=n?"#ffffff":l?"#f0f4ffcc":"#f0f4ff66",t.fillText(e.name,e.x,e.y+r+2)}t.restore()},[x,N,T,j]),q=(0,r.useCallback)((e,t)=>{let r=e.source,a=e.target;if("object"!=typeof r||"object"!=typeof a||void 0===r.x||void 0===r.y||void 0===a.x||void 0===a.y)return;let l=String(r.id),n=String(a.id),s=j?.getEnergy(l)??0,i=j?.getEnergy(n)??0;!function(e){let{ctx:t,link:r,srcEnergy:a,dstEnergy:l}=e,n=r.source,s=r.target;if(void 0===n.x||void 0===n.y||void 0===s.x||void 0===s.y)return;let i=t.globalCompositeOperation;t.globalCompositeOperation="lighter";let d=t.createLinearGradient(n.x,n.y,s.x,s.y);d.addColorStop(0,n.colour??c),d.addColorStop(1,s.colour??c),t.strokeStyle=d,t.globalAlpha=o(.35+.6*Math.max(a,l),0,1),t.lineWidth=o(1+.8*Math.max(a,l),.5,3),t.beginPath(),t.moveTo(n.x,n.y),t.lineTo(s.x,s.y),t.stroke(),t.globalAlpha=1,t.globalCompositeOperation=i}({ctx:t,link:{source:{x:r.x,y:r.y,colour:r.colour,id:l},target:{x:a.x,y:a.y,colour:a.colour,id:n}},srcEnergy:s,dstEnergy:i})},[j]),W=(0,r.useRef)(new Set),K=(0,r.useCallback)(()=>{if(!j)return;j.onFrame(performance.now());let e=j.pickParticleEdges($.links.map(e=>({source:String(e.source),target:String(e.target)})),N),t=new Set;for(let r of e)t.add(`${r.source}::${r.target}`);W.current=t},[j,$.links,N]);if(s<10||i<10)return null;let Y=k?e.find(e=>e.type===k):null;return(0,t.jsxs)("div",{className:"relative h-full w-full",children:[k&&(0,t.jsxs)("button",{type:"button",onClick:L,className:"absolute left-4 top-4 z-20 flex items-center gap-2 rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/90 px-3 py-1.5 text-xs text-[var(--sc-text-secondary)] backdrop-blur-sm transition-colors hover:border-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)]",children:[(0,t.jsx)("span",{children:"←"}),(0,t.jsx)("span",{children:"All clusters"})]}),Y&&(0,t.jsxs)("div",{className:"absolute right-4 top-4 z-20 flex items-center gap-2 rounded-lg border border-[var(--sc-border)] bg-[var(--sc-bg-deep)]/90 px-3 py-1.5 backdrop-blur-sm",children:[(0,t.jsx)("span",{className:"h-2.5 w-2.5 rounded-full",style:{backgroundColor:Y.colour}}),(0,t.jsx)("span",{className:"text-xs font-semibold text-[var(--sc-text-primary)]",children:Y.type}),(0,t.jsxs)("span",{className:"text-xs text-[var(--sc-text-muted)]",children:[Y.entities.length," entities"]})]}),(0,t.jsxs)("div",{onDoubleClick:z,style:{position:"relative"},children:[(0,t.jsx)(y,{ref:b,graphData:$,width:s,height:i,backgroundColor:"rgba(0,0,0,0)",nodeCanvasObjectMode:()=>"replace",nodeCanvasObject:U,nodePointerAreaPaint:(e,t,r)=>{let a;void 0!==e.x&&void 0!==e.y&&(a=e.isCluster?Math.min(15+3*Math.sqrt(e.entityCount||5),60):4+Math.min(.5*Math.log2((e.memoryCount||1)+1),3),r.beginPath(),r.arc(e.x,e.y,a,0,2*Math.PI),r.fillStyle=t,r.fill())},linkCanvasObjectMode:()=>"replace",linkCanvasObject:q,linkDirectionalParticles:e=>{let t="object"==typeof e.source?e.source.id:String(e.source),r="object"==typeof e.target?e.target.id:String(e.target);return 2*!!W.current.has(`${t}::${r}`)},linkDirectionalParticleWidth:1.2,linkDirectionalParticleSpeed:.005,onNodeClick:O,onNodeDragEnd:e=>B.handleNodeDragEnd(e),onNodeHover:G,onBackgroundClick:L,onZoom:D,onRenderFramePre:K,d3AlphaDecay:.02,d3VelocityDecay:.3,cooldownTicks:300,warmupTicks:80,nodeRelSize:1,enableNodeDrag:!0,enableZoomInteraction:!0,onEngineStop:()=>{!_.current&&$.nodes.length&&(_.current=!0,b.current?.zoomToFit(400*!P,80))}}),(0,t.jsx)(m,{driver:j})]}),(0,t.jsxs)("div",{className:"absolute bottom-3 left-0 right-0 z-10 flex items-center justify-center gap-4 text-[11px] text-[var(--sc-text-muted)]",children:[(0,t.jsxs)("span",{children:[l.toLocaleString()," entities"]}),(0,t.jsx)("span",{className:"text-[var(--sc-border)]",children:"·"}),(0,t.jsxs)("span",{children:[n.toLocaleString()," connections"]}),(0,t.jsx)("span",{className:"text-[var(--sc-border)]",children:"·"}),(0,t.jsxs)("span",{children:[e.length," clusters"]}),Y&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:"text-[var(--sc-border)]",children:"·"}),(0,t.jsxs)("span",{style:{color:Y.colour},children:[Y.entities.length," ",k," entities"]})]})]})]})}let b={tool:"cyan",concept:"coral",project:"amber",service:"cyan",person:"cyan"},v={architecture:"cyan",error:"coral",decision:"amber",learning:"cyan",preference:"muted"};function C({entity:e,relatedEntities:r,recentMemories:a,onNavigate:l}){return(0,t.jsxs)("div",{className:"flex flex-col gap-4 overflow-y-auto",children:[(0,t.jsx)(n.GlassCard,{className:"p-4",children:(0,t.jsxs)("div",{className:"flex items-start gap-3",children:[(0,t.jsx)("span",{className:"mt-1 h-3 w-3 shrink-0 rounded-full",style:{backgroundColor:"coral"===b[e.type]?"#ff4d4d":"amber"===b[e.type]?"#f59e0b":"#00e5cc"}}),(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("h2",{className:"truncate text-lg font-semibold text-[var(--sc-text-primary)]",children:e.label}),(0,t.jsxs)("div",{className:"mt-1 flex items-center gap-2",children:[(0,t.jsx)(s.Badge,{variant:b[e.type]||"muted",children:e.type}),(0,t.jsxs)("span",{className:"text-xs text-[var(--sc-text-muted)]",children:[e.memoryCount," ",1===e.memoryCount?"memory":"memories"]})]})]})]})}),r.length>0&&(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 text-[11px] font-semibold uppercase tracking-wider text-[var(--sc-text-muted)]",children:"Related Entities"}),(0,t.jsx)(n.GlassCard,{className:"divide-y divide-[var(--sc-border)] p-0",children:r.map(e=>(0,t.jsxs)("button",{onClick:()=>l(e.id),className:"flex w-full items-center justify-between px-4 py-2.5 text-left transition-colors hover:bg-[var(--sc-surface-interactive)]",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,t.jsx)("span",{className:"h-2 w-2 shrink-0 rounded-full",style:{backgroundColor:"coral"===b[e.type]?"#ff4d4d":"amber"===b[e.type]?"#f59e0b":"#00e5cc"}}),(0,t.jsx)("span",{className:"truncate text-sm text-[var(--sc-text-primary)]",children:e.label})]}),(0,t.jsx)("span",{className:"shrink-0 text-xs tabular-nums text-[var(--sc-text-muted)]",children:e.memoryCount})]},e.id))})]}),a.length>0&&(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mb-2 text-[11px] font-semibold uppercase tracking-wider text-[var(--sc-text-muted)]",children:"Recent Memories"}),(0,t.jsx)("div",{className:"flex flex-col gap-2",children:a.slice(0,8).map(e=>(0,t.jsxs)(n.GlassCard,{className:"p-3",children:[(0,t.jsx)("p",{className:"truncate text-sm text-[var(--sc-text-primary)]",children:e.title}),(0,t.jsxs)("div",{className:"mt-1.5 flex items-center gap-2",children:[(0,t.jsx)(s.Badge,{variant:v[e.category]||"muted",className:"text-[10px]",children:e.category}),(0,t.jsx)("span",{className:"text-[10px] text-[var(--sc-text-muted)]",children:new Date(e.created_at).toLocaleDateString("en-GB",{day:"2-digit",month:"2-digit",year:"numeric"})})]})]},e.id))})]})]})}var j=e.i(45688),w=e.i(88969);let k=f.default.env.NEXT_PUBLIC_API_URL||"http://localhost:3001",S={tool:"#00e5cc",concept:"#ff4d4d",project:"#f59e0b",file:"#5a6480",service:"#a78bfa",person:"#34d399",language:"#a78bfa",pattern:"#fb923c"};function N(){var e,i;let[o,c]=(0,r.useState)(null),[d,u]=(0,r.useState)(""),[h,m]=(0,r.useState)(!1),f=function(e,t=300){let[a,l]=(0,r.useState)(e);return(0,r.useEffect)(()=>{let r=setTimeout(()=>{l(e)},t);return()=>{clearTimeout(r)}},[e,t]),a}(d,250),p=(0,r.useRef)(null),[y,g]=(0,r.useState)({width:600,height:500});(0,r.useEffect)(()=>{let e=p.current;if(!e)return;let t=new ResizeObserver(e=>{for(let t of e){let{width:e,height:r}=t.contentRect;g({width:Math.floor(e),height:Math.max(Math.floor(r),500)})}});return t.observe(e),()=>t.disconnect()},[]);let{data:b,isLoading:v}=(0,j.useQuery)({queryKey:["graph","full"],queryFn:async()=>{let[e,t]=await Promise.all([(0,w.authFetch)(`${k}/api/graph/entities?limit=2000`),(0,w.authFetch)(`${k}/api/graph/triples?limit=10000`)]);if(!e.ok||!t.ok)throw Error("Failed to fetch graph data");let[r,a]=await Promise.all([e.json(),t.json()]),l=(r.entities||[]).map(e=>({id:String(e.id),name:e.name,type:e.type,memoryCount:e.memoryCount??e.memory_count??0})),n=(a.triples||[]).map(e=>({source:String(e.subject_id),target:String(e.object_id),predicate:e.predicate})),s=new Map;for(let e of l){let t=s.get(e.type)||[];t.push(e),s.set(e.type,t)}return{entities:l,triples:n,clusters:Array.from(s.entries()).map(([e,t])=>({type:e,entities:t.sort((e,t)=>t.memoryCount-e.memoryCount),colour:S[e]||"#8892b0"})).sort((e,t)=>t.entities.length-e.entities.length),totalConnections:n.length}},staleTime:6e4}),{data:N}=(e=o?.id??null,(0,j.useQuery)({queryKey:["graph","neighbourhood",e],queryFn:async()=>{if(!e)return null;let t=await (0,w.authFetch)(`${k}/api/graph/entities/${e}/neighbourhood`);if(!t.ok)throw Error("Failed to fetch neighbourhood");let r=await t.json(),a={id:String(r.focal.id),name:r.focal.name,type:r.focal.type,memoryCount:r.focal.memoryCount,isFocal:!0},l=new Map;for(let e of(l.set(a.id,a),r.neighbours))l.set(String(e.id),{id:String(e.id),name:e.name,type:e.type,memoryCount:e.memoryCount});let n=r.triples.map(e=>({source:String(e.subject_id),target:String(e.object_id),predicate:e.predicate}));return{nodes:Array.from(l.values()),links:n,focal:a,totalConnections:r.totalConnections}},enabled:null!==e,staleTime:15e3})),{data:M}=(i=o?.id??null,(0,j.useQuery)({queryKey:["graph","memories",i],queryFn:async()=>{if(!i)return[];let e=await (0,w.authFetch)(`${k}/api/graph/entities/${i}/memories`);if(!e.ok)throw Error("Failed to fetch memories");return(await e.json()).memories||[]},enabled:null!==i,staleTime:15e3})),{data:E}=(0,j.useQuery)({queryKey:["graph","search",f],queryFn:async()=>{let e=await (0,w.authFetch)(`${k}/api/graph/search?q=${encodeURIComponent(f)}&limit=8`);if(!e.ok)throw Error("Search failed");return((await e.json()).entities||[]).map(e=>({id:String(e.id),name:e.name,type:e.type,memoryCount:e.memoryCount}))},enabled:f.trim().length>0,staleTime:1e4}),I=(0,r.useCallback)(e=>{c(e)},[]),P=(0,r.useCallback)(e=>{let t=b?.entities.find(t=>t.id===e);t&&c(t)},[b]),T=(0,r.useCallback)(e=>{let t=b?.entities.find(t=>t.id===e);t&&c(t),u(""),m(!1)},[b]),R=(0,r.useMemo)(()=>N?N.nodes.filter(e=>!e.isFocal).sort((e,t)=>t.memoryCount-e.memoryCount).slice(0,15).map(e=>({id:e.id,label:e.name,type:e.type,memoryCount:e.memoryCount})):[],[N]),A=o?{id:o.id,label:o.name,type:o.type,memoryCount:o.memoryCount}:null,F=null!==o;return(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)("div",{className:"flex items-center gap-3",children:(0,t.jsxs)("div",{className:"relative flex-1",children:[(0,t.jsx)(a.Search,{className:"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-[var(--sc-text-muted)]"}),(0,t.jsx)("input",{type:"text",value:d,onChange:e=>{u(e.target.value),m(!0)},onFocus:()=>d.trim()&&m(!0),placeholder:"Search entities...",className:"glass-card w-full py-2.5 pl-10 pr-10 text-sm text-[var(--sc-text-primary)] placeholder:text-[var(--sc-text-muted)] focus:outline-none focus:ring-1 focus:ring-[var(--sc-cyan)]/40"}),d&&(0,t.jsx)("button",{type:"button",onClick:()=>{u(""),m(!1)},className:"absolute right-3 top-1/2 -translate-y-1/2 text-[var(--sc-text-muted)] hover:text-[var(--sc-text-primary)]",children:(0,t.jsx)(l.X,{className:"h-4 w-4"})}),h&&E&&E.length>0&&(0,t.jsx)("div",{className:"absolute left-0 right-0 top-full z-50 mt-1 glass-card-strong overflow-hidden py-1",children:E.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>T(e.id),className:"flex w-full items-center justify-between px-4 py-2 text-left transition-colors hover:bg-[var(--sc-surface-interactive)]",children:[(0,t.jsx)("span",{className:"truncate text-sm text-[var(--sc-text-primary)]",children:e.name}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(s.Badge,{variant:"muted",className:"text-[10px]",children:e.type}),(0,t.jsx)("span",{className:"text-xs tabular-nums text-[var(--sc-text-muted)]",children:e.memoryCount})]})]},e.id))})]})}),(0,t.jsxs)("div",{className:`grid gap-4 ${F?"grid-cols-1 md:grid-cols-[1fr_340px]":"grid-cols-1"}`,children:[(0,t.jsxs)(n.GlassCard,{className:"relative min-h-[500px] overflow-hidden border-0 p-0",children:[v&&(0,t.jsx)("div",{className:"absolute inset-0 z-10 flex items-center justify-center bg-[var(--sc-bg-deep)]/60",children:(0,t.jsx)("div",{className:"h-6 w-6 animate-spin rounded-full border-2 border-[var(--sc-cyan)] border-t-transparent"})}),(0,t.jsx)("div",{ref:p,className:"h-full w-full",style:{minHeight:500},children:b&&(0,t.jsx)(x,{clusters:b.clusters,allTriples:b.triples,totalEntities:b.entities.length,totalConnections:b.totalConnections,width:y.width,height:y.height,onSelectEntity:I,selectedEntityId:o?.id})})]}),F&&A&&(0,t.jsx)("div",{className:"min-h-[500px]",children:(0,t.jsx)(C,{entity:A,relatedEntities:R,recentMemories:M??[],onNavigate:P})})]})]})}e.s(["default",()=>N],68595)},13213,e=>{e.n(e.i(68595))},23531,e=>{e.v(t=>Promise.all(["static/chunks/364656baa57adaa7.js"].map(t=>e.l(t))).then(()=>t(23272)))}]);
@@ -16,6 +16,13 @@ export interface MemoryCreatedEvent extends MemoryEvent {
16
16
  type: 'memory_created';
17
17
  data: {
18
18
  memory: Memory;
19
+ /**
20
+ * IDs of ontology entities linked to this memory at creation time.
21
+ * Required for the pulse layer (Living Constellation Graph) to map
22
+ * a creation event to its graph nodes. Always emitted — may be empty
23
+ * if no entities were extracted.
24
+ */
25
+ entity_ids: number[];
19
26
  };
20
27
  }
21
28
  export interface MemoryAccessedEvent extends MemoryEvent {
@@ -24,6 +31,12 @@ export interface MemoryAccessedEvent extends MemoryEvent {
24
31
  memoryId: number;
25
32
  memory: Memory;
26
33
  newSalience: number;
34
+ /**
35
+ * IDs of ontology entities linked to this memory at access time.
36
+ * Required for the pulse layer to highlight related graph nodes
37
+ * when a memory is touched. Always emitted — may be empty.
38
+ */
39
+ entity_ids: number[];
27
40
  };
28
41
  }
29
42
  export interface MemoryUpdatedEvent extends MemoryEvent {
@@ -97,8 +110,8 @@ declare class MemoryEventEmitter extends EventEmitter {
97
110
  offMemoryEvent(callback: (event: MemoryEvent) => void): void;
98
111
  }
99
112
  export declare const memoryEvents: MemoryEventEmitter;
100
- export declare function emitMemoryCreated(memory: Memory): void;
101
- export declare function emitMemoryAccessed(memory: Memory, newSalience: number): void;
113
+ export declare function emitMemoryCreated(memory: Memory, entityIds?: number[]): void;
114
+ export declare function emitMemoryAccessed(memory: Memory, newSalience: number, entityIds?: number[]): void;
102
115
  export declare function emitMemoryUpdated(memory: Memory): void;
103
116
  export declare function emitMemoryDeleted(memoryId: number, title: string): void;
104
117
  export declare function emitConsolidation(result: ConsolidationResult, promotedMemories?: number[], deletedMemories?: number[]): void;
@@ -26,14 +26,15 @@ class MemoryEventEmitter extends EventEmitter {
26
26
  // Singleton instance
27
27
  export const memoryEvents = new MemoryEventEmitter();
28
28
  // Helper functions to emit events
29
- export function emitMemoryCreated(memory) {
30
- memoryEvents.emit('memory_created', { memory });
29
+ export function emitMemoryCreated(memory, entityIds = []) {
30
+ memoryEvents.emit('memory_created', { memory, entity_ids: entityIds });
31
31
  }
32
- export function emitMemoryAccessed(memory, newSalience) {
32
+ export function emitMemoryAccessed(memory, newSalience, entityIds = []) {
33
33
  memoryEvents.emit('memory_accessed', {
34
34
  memoryId: memory.id,
35
35
  memory,
36
36
  newSalience,
37
+ entity_ids: entityIds,
37
38
  });
38
39
  }
39
40
  export function emitMemoryUpdated(memory) {
@@ -247,9 +247,26 @@ export function registerMemoryRoutes(app, deps) {
247
247
  const total = stats.total;
248
248
  const hasMore = memories.length > offset + limit;
249
249
  const paginatedMemories = memories.slice(offset, offset + limit);
250
+ // Batch-load entity_ids per memory so the constellation graph client
251
+ // can map list rows to graph nodes without an N+1 fetch.
252
+ const ids = paginatedMemories.map((m) => m.id);
253
+ const linkRows = ids.length === 0
254
+ ? []
255
+ : getDatabase()
256
+ .prepare(`SELECT memory_id, entity_id FROM memory_entities WHERE memory_id IN (${ids
257
+ .map(() => '?')
258
+ .join(',')})`)
259
+ .all(...ids);
260
+ const byMemoryId = new Map();
261
+ for (const row of linkRows) {
262
+ const arr = byMemoryId.get(row.memory_id) ?? [];
263
+ arr.push(row.entity_id);
264
+ byMemoryId.set(row.memory_id, arr);
265
+ }
250
266
  const memoriesWithDecay = paginatedMemories.map((memory) => ({
251
267
  ...memory,
252
268
  decayedScore: calculateDecayedScore(memory),
269
+ entity_ids: byMemoryId.get(memory.id) ?? [],
253
270
  }));
254
271
  res.json({
255
272
  memories: memoriesWithDecay,
@@ -771,15 +771,54 @@ export async function checkOpenClawPluginPackage(npmModulesDir = path.join(os.ho
771
771
  };
772
772
  }
773
773
  }
774
+ // Expected peer-dep state (since v4.18.3): OpenClaw resolves the realtime
775
+ // plugin's `peerDependencies.shieldcortex` by installing the main package
776
+ // alongside in its npm tree. The 4.18.3 root-manifest fix made this safe
777
+ // (OpenClaw's discovery validates the entry → finds the root manifest →
778
+ // dedupes by pluginId with the dedicated realtime plugin). Recognising this
779
+ // state and reporting INFO instead of WARN removes the noise from healthy
780
+ // fleet boxes. WARN/FAIL still fire for the actual surprises below.
781
+ const bareVersion = readPkgVersion(barePkgJson);
782
+ const realtimeVersion = readPkgVersion(path.join(npmModulesDir, '@drakon-systems', 'shieldcortex-realtime', 'package.json'));
783
+ const rootManifestPresent = fs.existsSync(path.join(barePkgDir, 'openclaw.plugin.json'));
784
+ if (bareVersion !== null &&
785
+ realtimeVersion !== null &&
786
+ bareVersion === realtimeVersion &&
787
+ rootManifestPresent) {
788
+ return {
789
+ label,
790
+ status: 'info',
791
+ message: `bare \`shieldcortex@${bareVersion}\` is the expected peer-dep of ` +
792
+ `@drakon-systems/shieldcortex-realtime@${realtimeVersion}; root manifest present ` +
793
+ `(post-4.18.3 architecture — OpenClaw dedupes by pluginId)`,
794
+ };
795
+ }
796
+ const mismatched = bareVersion !== null &&
797
+ realtimeVersion !== null &&
798
+ bareVersion !== realtimeVersion;
774
799
  return {
775
800
  label,
776
801
  status: 'warn',
777
- message: 'bare `shieldcortex` present in OpenClaw plugin dir — this is not the supported plugin ' +
778
- 'and OpenClaw will auto-discover it; the supported package is @drakon-systems/shieldcortex-realtime',
802
+ message: mismatched
803
+ ? `bare \`shieldcortex@${bareVersion}\` in OpenClaw plugin dir does not match ` +
804
+ `@drakon-systems/shieldcortex-realtime@${realtimeVersion} — version mismatch on the ` +
805
+ `realtime plugin's peer dep`
806
+ : 'bare `shieldcortex` present in OpenClaw plugin dir — this is not the supported plugin ' +
807
+ 'and OpenClaw will auto-discover it; the supported package is @drakon-systems/shieldcortex-realtime',
779
808
  fix: `Remove ${barePkgDir.replace(os.homedir(), '~')} (the dedicated realtime plugin handles ` +
780
809
  `OpenClaw integration; the bare main package should not live here)`,
781
810
  };
782
811
  }
812
+ /** Read a package's `version` field; returns null on any failure. */
813
+ function readPkgVersion(pkgJson) {
814
+ try {
815
+ const v = JSON.parse(fs.readFileSync(pkgJson, 'utf-8')).version;
816
+ return typeof v === 'string' ? v : null;
817
+ }
818
+ catch {
819
+ return null;
820
+ }
821
+ }
783
822
  // ── Check 9: Auto-memory sampling rate (#44) ──────────────
784
823
  /**
785
824
  * Reports the resolved `autoMemory.stopHookSamplingTurns` and salience-bypass