shieldcortex 4.12.14 → 4.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dashboard/.next/standalone/dashboard/.next/BUILD_ID +1 -1
- package/dashboard/.next/standalone/dashboard/.next/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/prerender-manifest.json +3 -3
- package/dashboard/.next/standalone/dashboard/.next/required-server-files.json +4 -4
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/admin/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/admin/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/admin/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/cloud/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/cloud/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/cloud/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/capture/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/capture/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/capture/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/graph/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/graph/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/graph/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/recall/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/recall/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/recall/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/timeline/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/timeline/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/timeline/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/overview/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/overview/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/overview/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/audit/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/audit/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/audit/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/intercepts/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/intercepts/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/intercepts/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/iron-dome/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/iron-dome/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/iron-dome/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/policies/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/policies/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/policies/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/quarantine/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/quarantine/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/quarantine/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/settings/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/xray/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/xray/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/xray/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/xray/page.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/xray/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/xray/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.rsc +21 -18
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_full.segment.rsc +21 -18
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.rsc +20 -18
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_full.segment.rsc +20 -18
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray/__PAGE__.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +9 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_full.segment.rsc +17 -15
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_index.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/9f1d4_@tanstack_68dcbde9._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/{[root-of-the-server]__fb5796ae._.js → [root-of-the-server]__2de25d56._.js} +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__52bd7a9f._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/{[root-of-the-server]__b789489c._.js → [root-of-the-server]__6f881a23._.js} +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_01f6ceb0._.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_20c6acea._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/{9f1d4_next_c9fe89e1._.js → dashboard_25b568c3._.js} +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_2a8eef6b._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_35a9932a._.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_37f17371._.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_77cb2b63._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_91003e6d._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_9b8695d8._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_a16ef10a._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_c219bf07._.js +4 -4
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_f9cd1dc2._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_fefd3b85._.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_44a9f72c._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_de7ac4f9._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_protection_ProtectionOverview_tsx_54554a97._.js +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_settings_SettingsView_tsx_16dc83a7._.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_xray_XRayOverview_tsx_ceba698e._.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/pages/404.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/pages/500.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/015dc64369f26b7d.css +3 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/2fe84829530e61a3.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/34d0309a4e34b084.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/3729c748a4361c1f.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/3b7fdf1ee828254c.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/{3d53807a9a943ce7.js → 4c90ebd2c08cd656.js} +4 -4
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/4d4af0cecaef56f2.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/4eb86dc2f379d3ca.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/6aba18b7aac42ccd.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/{b4b3fb5729bead7e.js → 6ea97c8dc9e30ea5.js} +1 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/74ea1a87751e93a3.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/910628c23329a773.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/{c288964c4c00982a.js → b308a787e8cbc2a9.js} +3 -3
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/bdb50889a1c1ab37.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/d0bf5ccba09917dd.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/e804a1fda2839550.js +1 -0
- package/dashboard/.next/standalone/dashboard/server.js +1 -1
- package/dist/api/routes/digest.d.ts +59 -0
- package/dist/api/routes/digest.js +305 -0
- package/dist/api/routes/memories.js +84 -15
- package/dist/api/routes/system.js +10 -2
- package/dist/api/visualization-server.js +2 -0
- package/dist/cli/doctor.d.ts +42 -0
- package/dist/cli/doctor.js +173 -0
- package/dist/cli/migrate-legacy.d.ts +28 -0
- package/dist/cli/migrate-legacy.js +291 -0
- package/dist/cloud/cli.js +2 -2
- package/dist/cloud/config.d.ts +22 -0
- package/dist/cloud/config.js +38 -0
- package/dist/database/init.js +26 -1
- package/dist/index.js +8 -1
- package/dist/memory/backup.d.ts +19 -0
- package/dist/memory/backup.js +47 -0
- package/dist/memory/dedupe-runner.d.ts +33 -0
- package/dist/memory/dedupe-runner.js +103 -0
- package/dist/memory/fts.d.ts +26 -0
- package/dist/memory/fts.js +59 -0
- package/dist/memory/lifecycle.d.ts +83 -0
- package/dist/memory/lifecycle.js +274 -0
- package/dist/memory/links.d.ts +63 -0
- package/dist/memory/links.js +232 -0
- package/dist/memory/prune.d.ts +34 -0
- package/dist/memory/prune.js +76 -0
- package/dist/memory/search-recall.d.ts +48 -0
- package/dist/memory/search-recall.js +367 -0
- package/dist/memory/store.d.ts +6 -121
- package/dist/memory/store.js +45 -854
- package/dist/setup/claude-md.d.ts +1 -0
- package/dist/setup/deep-clean.d.ts +33 -0
- package/dist/setup/deep-clean.js +26 -0
- package/dist/setup/doctor.js +7 -2
- package/dist/setup/settings-hooks.d.ts +1 -0
- package/dist/setup/settings-hooks.js +51 -5
- package/dist/setup/status.js +39 -0
- package/hooks/openclaw/cortex-memory/runtime.mjs +18 -4
- package/package.json +1 -1
- package/plugins/openclaw/dist/index.js +12 -6
- package/plugins/openclaw/dist/openclaw.plugin.json +1 -1
- package/scripts/lib/auto-memory-config.mjs +53 -0
- package/scripts/lib/telemetry.mjs +58 -0
- package/scripts/lib/transcript-reader.mjs +123 -0
- package/scripts/postinstall.mjs +47 -1
- package/scripts/pre-compact-hook.mjs +76 -124
- package/scripts/session-end-hook.mjs +102 -97
- package/scripts/stop-hook.mjs +385 -116
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/9f1d4_@tanstack_785e068c._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__c2b92077._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_11878109._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_35c9f22e._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_836b4a04._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_9770c429._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_9dd626ed._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_e94d2da2._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_564ea5ae._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_lib_3f1490a1._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/079a5be036130e37.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/1770a8ce7abb2437.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/1a074f8ddc7cd385.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/24da99d1341bd573.css +0 -3
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/2aa8afb655c1c2e5.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/302ad459a0e5c4ba.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/385ec610bad1acc5.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/4f57582c2d186438.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/52843253e4b833a5.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/7fca141efba9d353.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/8593e1796c9d043d.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/cbc2e6ffcad6e91c.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/fced7dd3c9874ed1.js +0 -1
- /package/dashboard/.next/standalone/dashboard/.next/static/{P2sW3M-qHaW9VS9YwCEg3 → 2JvJZkELhPQRzhTlgun1M}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{P2sW3M-qHaW9VS9YwCEg3 → 2JvJZkELhPQRzhTlgun1M}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{P2sW3M-qHaW9VS9YwCEg3 → 2JvJZkELhPQRzhTlgun1M}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { getDatabase, isDatabaseInitialized } from '../../database/init.js';
|
|
2
|
+
const WINDOW_HOURS = {
|
|
3
|
+
'24h': 24,
|
|
4
|
+
'7d': 168,
|
|
5
|
+
'30d': 720,
|
|
6
|
+
};
|
|
7
|
+
const HIGH_SALIENCE_THRESHOLD = 0.6;
|
|
8
|
+
function isoSinceHoursAgo(hours) {
|
|
9
|
+
return new Date(Date.now() - hours * 3600_000).toISOString();
|
|
10
|
+
}
|
|
11
|
+
function safeCount(rows, key) {
|
|
12
|
+
if (!rows.length)
|
|
13
|
+
return 0;
|
|
14
|
+
const v = rows[0][key];
|
|
15
|
+
return typeof v === 'number' ? v : Number(v ?? 0);
|
|
16
|
+
}
|
|
17
|
+
function getCountsBetween(sinceIso, untilIso, project) {
|
|
18
|
+
const db = getDatabase();
|
|
19
|
+
const projectAudit = project ? 'AND da.project = @project' : '';
|
|
20
|
+
const projectMem = project ? 'AND m.project = @project' : '';
|
|
21
|
+
const upperBound = untilIso ? 'AND da.timestamp < @until' : '';
|
|
22
|
+
const upperBoundMem = untilIso ? 'AND m.created_at < @until' : '';
|
|
23
|
+
const upperBoundRecall = untilIso ? 'AND m.last_accessed < @until' : '';
|
|
24
|
+
const params = { since: sinceIso };
|
|
25
|
+
if (project)
|
|
26
|
+
params.project = project;
|
|
27
|
+
if (untilIso)
|
|
28
|
+
params.until = untilIso;
|
|
29
|
+
// Defence audit counts (single grouped query)
|
|
30
|
+
const auditRows = db.prepare(`
|
|
31
|
+
SELECT da.firewall_result AS result, COUNT(*) AS cnt
|
|
32
|
+
FROM defence_audit da
|
|
33
|
+
WHERE da.timestamp >= @since ${upperBound} ${projectAudit}
|
|
34
|
+
GROUP BY da.firewall_result
|
|
35
|
+
`).all(params);
|
|
36
|
+
let allowed = 0, blocked = 0, quarantined = 0;
|
|
37
|
+
for (const row of auditRows) {
|
|
38
|
+
if (row.result === 'ALLOW')
|
|
39
|
+
allowed = row.cnt;
|
|
40
|
+
else if (row.result === 'BLOCK')
|
|
41
|
+
blocked = row.cnt;
|
|
42
|
+
else if (row.result === 'QUARANTINE')
|
|
43
|
+
quarantined = row.cnt;
|
|
44
|
+
}
|
|
45
|
+
const scanned = allowed + blocked + quarantined;
|
|
46
|
+
// Memories captured in window
|
|
47
|
+
const memCapturedRows = db.prepare(`
|
|
48
|
+
SELECT COUNT(*) AS cnt FROM memories m
|
|
49
|
+
WHERE m.created_at >= @since ${upperBoundMem} ${projectMem}
|
|
50
|
+
`).all(params);
|
|
51
|
+
const memoriesCaptured = safeCount(memCapturedRows, 'cnt');
|
|
52
|
+
// High-salience captures (salience >= threshold)
|
|
53
|
+
const highSalRows = db.prepare(`
|
|
54
|
+
SELECT COUNT(*) AS cnt FROM memories m
|
|
55
|
+
WHERE m.created_at >= @since ${upperBoundMem} AND m.salience >= ${HIGH_SALIENCE_THRESHOLD} ${projectMem}
|
|
56
|
+
`).all(params);
|
|
57
|
+
const highSalienceCaptures = safeCount(highSalRows, 'cnt');
|
|
58
|
+
// Memories recalled (last_accessed advanced past created_at within window)
|
|
59
|
+
const recalledRows = db.prepare(`
|
|
60
|
+
SELECT COUNT(*) AS cnt FROM memories m
|
|
61
|
+
WHERE m.last_accessed >= @since ${upperBoundRecall}
|
|
62
|
+
AND m.last_accessed > m.created_at
|
|
63
|
+
${projectMem}
|
|
64
|
+
`).all(params);
|
|
65
|
+
const memoriesRecalled = safeCount(recalledRows, 'cnt');
|
|
66
|
+
return {
|
|
67
|
+
scanned,
|
|
68
|
+
allowed,
|
|
69
|
+
blocked,
|
|
70
|
+
quarantined,
|
|
71
|
+
memoriesCaptured,
|
|
72
|
+
memoriesRecalled,
|
|
73
|
+
highSalienceCaptures,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function getTopMoments(sinceIso, project, limit = 5) {
|
|
77
|
+
const db = getDatabase();
|
|
78
|
+
const projectAudit = project ? 'AND da.project = ?' : '';
|
|
79
|
+
const projectMem = project ? 'AND m.project = ?' : '';
|
|
80
|
+
const moments = [];
|
|
81
|
+
// Top blocks/quarantines (most severe firewall actions)
|
|
82
|
+
const auditParams = project ? [sinceIso, project] : [sinceIso];
|
|
83
|
+
const blocks = db.prepare(`
|
|
84
|
+
SELECT da.id, da.timestamp, da.firewall_result, da.reason, da.source_type, da.source_identifier,
|
|
85
|
+
da.threat_indicators, da.anomaly_score
|
|
86
|
+
FROM defence_audit da
|
|
87
|
+
WHERE da.timestamp >= ? ${projectAudit}
|
|
88
|
+
AND da.firewall_result IN ('BLOCK', 'QUARANTINE')
|
|
89
|
+
ORDER BY da.anomaly_score DESC, da.timestamp DESC
|
|
90
|
+
LIMIT 3
|
|
91
|
+
`).all(...auditParams);
|
|
92
|
+
for (const b of blocks) {
|
|
93
|
+
let indicators = [];
|
|
94
|
+
try {
|
|
95
|
+
indicators = b.threat_indicators ? JSON.parse(b.threat_indicators) : [];
|
|
96
|
+
}
|
|
97
|
+
catch { /* ignore */ }
|
|
98
|
+
const top = indicators.slice(0, 2).join(', ');
|
|
99
|
+
moments.push({
|
|
100
|
+
kind: b.firewall_result === 'BLOCK' ? 'block' : 'quarantine',
|
|
101
|
+
title: b.firewall_result === 'BLOCK'
|
|
102
|
+
? `Blocked ${top || b.reason || 'a suspicious payload'}`
|
|
103
|
+
: `Quarantined ${top || b.reason || 'a suspicious memory'}`,
|
|
104
|
+
detail: `${b.source_type}: ${b.source_identifier}`,
|
|
105
|
+
timestamp: b.timestamp,
|
|
106
|
+
auditId: b.id,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Top high-salience captures
|
|
110
|
+
const memParams = project ? [sinceIso, project] : [sinceIso];
|
|
111
|
+
const captures = db.prepare(`
|
|
112
|
+
SELECT m.id, m.title, m.salience, m.category, m.created_at, m.project
|
|
113
|
+
FROM memories m
|
|
114
|
+
WHERE m.created_at >= ? ${projectMem}
|
|
115
|
+
AND m.salience >= ${HIGH_SALIENCE_THRESHOLD}
|
|
116
|
+
ORDER BY m.salience DESC, m.created_at DESC
|
|
117
|
+
LIMIT 3
|
|
118
|
+
`).all(...memParams);
|
|
119
|
+
for (const m of captures) {
|
|
120
|
+
moments.push({
|
|
121
|
+
kind: 'capture',
|
|
122
|
+
title: `Captured: ${m.title}`,
|
|
123
|
+
detail: `${m.category} · salience ${m.salience.toFixed(2)}${m.project ? ` · ${m.project}` : ''}`,
|
|
124
|
+
timestamp: m.created_at,
|
|
125
|
+
memoryId: m.id,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Top recalls in window (high access count + recently accessed)
|
|
129
|
+
const recalls = db.prepare(`
|
|
130
|
+
SELECT m.id, m.title, m.access_count, m.last_accessed, m.salience
|
|
131
|
+
FROM memories m
|
|
132
|
+
WHERE m.last_accessed >= ? ${projectMem}
|
|
133
|
+
AND m.last_accessed > m.created_at
|
|
134
|
+
ORDER BY m.access_count DESC, m.last_accessed DESC
|
|
135
|
+
LIMIT 2
|
|
136
|
+
`).all(...memParams);
|
|
137
|
+
for (const r of recalls) {
|
|
138
|
+
moments.push({
|
|
139
|
+
kind: 'recall',
|
|
140
|
+
title: `Recalled: ${r.title}`,
|
|
141
|
+
detail: `accessed ${r.access_count}× · salience ${r.salience.toFixed(2)}`,
|
|
142
|
+
timestamp: r.last_accessed,
|
|
143
|
+
memoryId: r.id,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return moments
|
|
147
|
+
.sort((a, b) => b.timestamp.localeCompare(a.timestamp))
|
|
148
|
+
.slice(0, limit);
|
|
149
|
+
}
|
|
150
|
+
function getTopThreatPatterns(sinceIso, project) {
|
|
151
|
+
const db = getDatabase();
|
|
152
|
+
const projectCond = project ? 'AND da.project = ?' : '';
|
|
153
|
+
const params = project ? [sinceIso, project] : [sinceIso];
|
|
154
|
+
const rows = db.prepare(`
|
|
155
|
+
SELECT da.threat_indicators
|
|
156
|
+
FROM defence_audit da
|
|
157
|
+
WHERE da.timestamp >= ? ${projectCond}
|
|
158
|
+
AND da.threat_indicators IS NOT NULL
|
|
159
|
+
AND da.threat_indicators != '[]'
|
|
160
|
+
LIMIT 500
|
|
161
|
+
`).all(...params);
|
|
162
|
+
const counts = {};
|
|
163
|
+
for (const r of rows) {
|
|
164
|
+
try {
|
|
165
|
+
const list = JSON.parse(r.threat_indicators);
|
|
166
|
+
for (const p of list)
|
|
167
|
+
counts[p] = (counts[p] ?? 0) + 1;
|
|
168
|
+
}
|
|
169
|
+
catch { /* ignore */ }
|
|
170
|
+
}
|
|
171
|
+
return Object.entries(counts)
|
|
172
|
+
.map(([pattern, count]) => ({ pattern, count }))
|
|
173
|
+
.sort((a, b) => b.count - a.count)
|
|
174
|
+
.slice(0, 5);
|
|
175
|
+
}
|
|
176
|
+
function buildDeltas(current, previous) {
|
|
177
|
+
const delta = {};
|
|
178
|
+
for (const key of Object.keys(current)) {
|
|
179
|
+
delta[key] = current[key] - previous[key];
|
|
180
|
+
}
|
|
181
|
+
return delta;
|
|
182
|
+
}
|
|
183
|
+
function windowLabelFor(window) {
|
|
184
|
+
switch (window) {
|
|
185
|
+
case '24h': return 'Last 24 hours';
|
|
186
|
+
case '7d': return 'Last 7 days';
|
|
187
|
+
case '30d': return 'Last 30 days';
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export function buildDigest(window, project) {
|
|
191
|
+
const hours = WINDOW_HOURS[window];
|
|
192
|
+
const since = isoSinceHoursAgo(hours);
|
|
193
|
+
const previousSince = isoSinceHoursAgo(hours * 2);
|
|
194
|
+
const current = getCountsBetween(since, null, project);
|
|
195
|
+
const previous = getCountsBetween(previousSince, since, project);
|
|
196
|
+
return {
|
|
197
|
+
window,
|
|
198
|
+
windowLabel: windowLabelFor(window),
|
|
199
|
+
since,
|
|
200
|
+
current,
|
|
201
|
+
previous,
|
|
202
|
+
delta: buildDeltas(current, previous),
|
|
203
|
+
topMoments: getTopMoments(since, project, 5),
|
|
204
|
+
topThreatPatterns: getTopThreatPatterns(since, project),
|
|
205
|
+
generatedAt: new Date().toISOString(),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Returns one row per day for the last `days` days, oldest first.
|
|
210
|
+
* Days with zero activity are still included (gives a clean sparkline shape).
|
|
211
|
+
*/
|
|
212
|
+
export function buildTimeline(days, project) {
|
|
213
|
+
const db = getDatabase();
|
|
214
|
+
const projectAudit = project ? 'AND da.project = @project' : '';
|
|
215
|
+
const projectMem = project ? 'AND m.project = @project' : '';
|
|
216
|
+
const since = isoSinceHoursAgo(days * 24);
|
|
217
|
+
const params = { since };
|
|
218
|
+
if (project)
|
|
219
|
+
params.project = project;
|
|
220
|
+
// Audit counts grouped by day (UTC)
|
|
221
|
+
const auditRows = db.prepare(`
|
|
222
|
+
SELECT substr(da.timestamp, 1, 10) AS day, da.firewall_result AS result, COUNT(*) AS cnt
|
|
223
|
+
FROM defence_audit da
|
|
224
|
+
WHERE da.timestamp >= @since ${projectAudit}
|
|
225
|
+
GROUP BY day, da.firewall_result
|
|
226
|
+
`).all(params);
|
|
227
|
+
const captureRows = db.prepare(`
|
|
228
|
+
SELECT substr(m.created_at, 1, 10) AS day, COUNT(*) AS cnt
|
|
229
|
+
FROM memories m
|
|
230
|
+
WHERE m.created_at >= @since ${projectMem}
|
|
231
|
+
GROUP BY day
|
|
232
|
+
`).all(params);
|
|
233
|
+
const recallRows = db.prepare(`
|
|
234
|
+
SELECT substr(m.last_accessed, 1, 10) AS day, COUNT(*) AS cnt
|
|
235
|
+
FROM memories m
|
|
236
|
+
WHERE m.last_accessed >= @since
|
|
237
|
+
AND m.last_accessed > m.created_at
|
|
238
|
+
${projectMem}
|
|
239
|
+
GROUP BY day
|
|
240
|
+
`).all(params);
|
|
241
|
+
// Build a complete day map with zero defaults
|
|
242
|
+
const byDay = {};
|
|
243
|
+
const today = new Date();
|
|
244
|
+
for (let i = days - 1; i >= 0; i--) {
|
|
245
|
+
const d = new Date(today);
|
|
246
|
+
d.setUTCDate(d.getUTCDate() - i);
|
|
247
|
+
const key = d.toISOString().slice(0, 10);
|
|
248
|
+
byDay[key] = { date: key, scanned: 0, blocked: 0, quarantined: 0, captured: 0, recalled: 0 };
|
|
249
|
+
}
|
|
250
|
+
for (const row of auditRows) {
|
|
251
|
+
const day = byDay[row.day];
|
|
252
|
+
if (!day)
|
|
253
|
+
continue;
|
|
254
|
+
if (row.result === 'BLOCK')
|
|
255
|
+
day.blocked = row.cnt;
|
|
256
|
+
else if (row.result === 'QUARANTINE')
|
|
257
|
+
day.quarantined = row.cnt;
|
|
258
|
+
day.scanned += row.cnt;
|
|
259
|
+
}
|
|
260
|
+
for (const row of captureRows) {
|
|
261
|
+
if (byDay[row.day])
|
|
262
|
+
byDay[row.day].captured = row.cnt;
|
|
263
|
+
}
|
|
264
|
+
for (const row of recallRows) {
|
|
265
|
+
if (byDay[row.day])
|
|
266
|
+
byDay[row.day].recalled = row.cnt;
|
|
267
|
+
}
|
|
268
|
+
return Object.values(byDay).sort((a, b) => a.date.localeCompare(b.date));
|
|
269
|
+
}
|
|
270
|
+
export function registerDigestRoutes(app) {
|
|
271
|
+
app.get('/api/digest', (req, res) => {
|
|
272
|
+
try {
|
|
273
|
+
if (!isDatabaseInitialized()) {
|
|
274
|
+
return res.status(503).json({ error: 'Database not initialised' });
|
|
275
|
+
}
|
|
276
|
+
const rawWindow = String(req.query.window ?? '24h');
|
|
277
|
+
const window = (rawWindow === '7d' || rawWindow === '30d') ? rawWindow : '24h';
|
|
278
|
+
const project = typeof req.query.project === 'string' && req.query.project.trim()
|
|
279
|
+
? req.query.project.trim()
|
|
280
|
+
: undefined;
|
|
281
|
+
const digest = buildDigest(window, project);
|
|
282
|
+
res.json(digest);
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
res.status(500).json({ error: err.message });
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
app.get('/api/digest/timeline', (req, res) => {
|
|
289
|
+
try {
|
|
290
|
+
if (!isDatabaseInitialized()) {
|
|
291
|
+
return res.status(503).json({ error: 'Database not initialised' });
|
|
292
|
+
}
|
|
293
|
+
const daysRaw = parseInt(String(req.query.days ?? '7'), 10);
|
|
294
|
+
const days = Number.isFinite(daysRaw) ? Math.max(1, Math.min(90, daysRaw)) : 7;
|
|
295
|
+
const project = typeof req.query.project === 'string' && req.query.project.trim()
|
|
296
|
+
? req.query.project.trim()
|
|
297
|
+
: undefined;
|
|
298
|
+
const timeline = buildTimeline(days, project);
|
|
299
|
+
res.json({ days, project: project ?? null, timeline });
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
res.status(500).json({ error: err.message });
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
@@ -4,7 +4,7 @@ import { existsSync, readdirSync, readFileSync } from 'fs';
|
|
|
4
4
|
import { getDatabase } from '../../database/init.js';
|
|
5
5
|
import { searchMemories, getRecentMemories, getHighPriorityMemories, getMemoryStats, getMemoryById, addMemory, deleteMemory, accessMemory, updateMemory, mergeMemories, promoteMemory, createMemoryLink, rowToMemory, enrichMemory, } from '../../memory/store.js';
|
|
6
6
|
import { calculateDecayedScore } from '../../memory/decay.js';
|
|
7
|
-
import { consolidate, findDuplicateMemoryPairs, formatContextSummary, generateContextSummary,
|
|
7
|
+
import { consolidate, findDuplicateMemoryPairs, formatContextSummary, generateContextSummary, } from '../../memory/consolidate.js';
|
|
8
8
|
import { getActivationStats, getActiveMemories } from '../../memory/activation.js';
|
|
9
9
|
import { detectContradictions, getContradictionsFor } from '../../memory/contradiction.js';
|
|
10
10
|
import { emitConsolidation } from '../events.js';
|
|
@@ -831,10 +831,15 @@ export function registerMemoryRoutes(app, deps) {
|
|
|
831
831
|
res.status(500).json({ error: error.message });
|
|
832
832
|
}
|
|
833
833
|
});
|
|
834
|
+
// Consolidation is a maintenance operation (STM→LTM promotion + low-salience
|
|
835
|
+
// dedupe), not arbitrary delete. Use 'modify_records' (AMBER) so the
|
|
836
|
+
// dashboard can trigger it without the RED 'delete' gate that always blocks.
|
|
837
|
+
// Mirrors the action used by /api/worker/trigger-{light,medium}.
|
|
834
838
|
app.post('/api/consolidate', requireNotLocked, requireIronDomeAction({
|
|
835
|
-
action: '
|
|
839
|
+
action: 'modify_records',
|
|
836
840
|
channel: 'dashboard',
|
|
837
841
|
sourceIdentifier: 'dashboard:consolidate',
|
|
842
|
+
enforceAmber: true,
|
|
838
843
|
}), (_req, res) => {
|
|
839
844
|
try {
|
|
840
845
|
const result = consolidate();
|
|
@@ -845,6 +850,78 @@ export function registerMemoryRoutes(app, deps) {
|
|
|
845
850
|
res.status(500).json({ error: error.message });
|
|
846
851
|
}
|
|
847
852
|
});
|
|
853
|
+
// Threshold-based prune: delete memories below salience X older than Y days.
|
|
854
|
+
// dryRun:true (default) returns counts + sample without touching the DB.
|
|
855
|
+
// Auto-backs-up the DB before any destructive write — backupPath returned.
|
|
856
|
+
app.post('/api/memories/prune', requireNotLocked, requireIronDomeAction({
|
|
857
|
+
action: 'modify_records',
|
|
858
|
+
channel: 'dashboard',
|
|
859
|
+
sourceIdentifier: 'dashboard:memories-prune',
|
|
860
|
+
enforceAmber: true,
|
|
861
|
+
}), async (req, res) => {
|
|
862
|
+
try {
|
|
863
|
+
const { salienceLte, ageDaysGte, project, excludePinned, dryRun } = req.body ?? {};
|
|
864
|
+
if (salienceLte !== undefined && (typeof salienceLte !== 'number' || salienceLte < 0 || salienceLte > 1)) {
|
|
865
|
+
return res.status(400).json({ error: 'salienceLte must be a number 0..1' });
|
|
866
|
+
}
|
|
867
|
+
if (ageDaysGte !== undefined && (typeof ageDaysGte !== 'number' || ageDaysGte < 0)) {
|
|
868
|
+
return res.status(400).json({ error: 'ageDaysGte must be a number >= 0' });
|
|
869
|
+
}
|
|
870
|
+
if (project !== undefined && project !== null && typeof project !== 'string') {
|
|
871
|
+
return res.status(400).json({ error: 'project must be a string when provided' });
|
|
872
|
+
}
|
|
873
|
+
if (excludePinned !== undefined && typeof excludePinned !== 'boolean') {
|
|
874
|
+
return res.status(400).json({ error: 'excludePinned must be a boolean' });
|
|
875
|
+
}
|
|
876
|
+
if (dryRun !== undefined && typeof dryRun !== 'boolean') {
|
|
877
|
+
return res.status(400).json({ error: 'dryRun must be a boolean' });
|
|
878
|
+
}
|
|
879
|
+
const { pruneMemories } = await import('../../memory/prune.js');
|
|
880
|
+
const result = await pruneMemories({
|
|
881
|
+
salienceLte,
|
|
882
|
+
ageDaysGte,
|
|
883
|
+
project: project ?? undefined,
|
|
884
|
+
excludePinned,
|
|
885
|
+
dryRun,
|
|
886
|
+
});
|
|
887
|
+
res.json({ success: true, ...result });
|
|
888
|
+
}
|
|
889
|
+
catch (error) {
|
|
890
|
+
res.status(500).json({ error: error.message });
|
|
891
|
+
}
|
|
892
|
+
});
|
|
893
|
+
// Project-scoped dedupe: cluster near-duplicate long-term memories and keep
|
|
894
|
+
// the highest-salience representative. dryRun:true (default) returns the
|
|
895
|
+
// groups without merging. Auto-backs-up the DB before any merge.
|
|
896
|
+
app.post('/api/memories/dedupe', requireNotLocked, requireIronDomeAction({
|
|
897
|
+
action: 'modify_records',
|
|
898
|
+
channel: 'dashboard',
|
|
899
|
+
sourceIdentifier: 'dashboard:memories-dedupe',
|
|
900
|
+
enforceAmber: true,
|
|
901
|
+
}), async (req, res) => {
|
|
902
|
+
try {
|
|
903
|
+
const { project, dryRun, limit } = req.body ?? {};
|
|
904
|
+
if (project !== undefined && project !== null && typeof project !== 'string') {
|
|
905
|
+
return res.status(400).json({ error: 'project must be a string when provided' });
|
|
906
|
+
}
|
|
907
|
+
if (dryRun !== undefined && typeof dryRun !== 'boolean') {
|
|
908
|
+
return res.status(400).json({ error: 'dryRun must be a boolean' });
|
|
909
|
+
}
|
|
910
|
+
if (limit !== undefined && (typeof limit !== 'number' || limit < 1 || limit > 1000)) {
|
|
911
|
+
return res.status(400).json({ error: 'limit must be a number 1..1000' });
|
|
912
|
+
}
|
|
913
|
+
const { dedupeMemories } = await import('../../memory/dedupe-runner.js');
|
|
914
|
+
const result = await dedupeMemories({
|
|
915
|
+
project: project ?? undefined,
|
|
916
|
+
dryRun,
|
|
917
|
+
limit,
|
|
918
|
+
});
|
|
919
|
+
res.json({ success: true, ...result });
|
|
920
|
+
}
|
|
921
|
+
catch (error) {
|
|
922
|
+
res.status(500).json({ error: error.message });
|
|
923
|
+
}
|
|
924
|
+
});
|
|
848
925
|
app.get('/api/context', requireNotLocked, async (req, res) => {
|
|
849
926
|
try {
|
|
850
927
|
const project = typeof req.query.project === 'string' ? req.query.project : undefined;
|
|
@@ -1151,17 +1228,9 @@ export function registerMemoryRoutes(app, deps) {
|
|
|
1151
1228
|
res.status(500).json({ error: error.message });
|
|
1152
1229
|
}
|
|
1153
1230
|
});
|
|
1154
|
-
//
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
success: true,
|
|
1160
|
-
...result,
|
|
1161
|
-
});
|
|
1162
|
-
}
|
|
1163
|
-
catch (error) {
|
|
1164
|
-
res.status(500).json({ error: error.message });
|
|
1165
|
-
}
|
|
1166
|
-
});
|
|
1231
|
+
// (Note: there used to be a second, ungated `app.post('/api/consolidate', ...)`
|
|
1232
|
+
// here calling `consolidateMemories()`. It was dead code — Express dispatches
|
|
1233
|
+
// to the first matching route and the gated one above won. Removed in
|
|
1234
|
+
// favour of the gated route to avoid future contributors thinking either
|
|
1235
|
+
// would actually run.)
|
|
1167
1236
|
}
|
|
@@ -2,7 +2,7 @@ import { WebSocket } from 'ws';
|
|
|
2
2
|
import { getLifetimeStats } from '../../defence/audit/queries.js';
|
|
3
3
|
import { getAuditStats } from '../../defence/audit/queries.js';
|
|
4
4
|
import { isDatabaseInitialized } from '../../database/init.js';
|
|
5
|
-
import { getCloudConfig, getCloudSyncControls, getDeviceId, getDeviceName, getDefenceMode, getOpenClawMemoryConfig, isConfigTampered, readRawConfig, setCloudConfig, setCloudSyncControls, setDefenceMode, setOpenClawMemoryConfig, } from '../../cloud/config.js';
|
|
5
|
+
import { getCloudConfig, getCloudSyncControls, getDeviceId, getDeviceName, getDefenceMode, getOpenClawMemoryConfig, isConfigTampered, isProactiveRecallEnabled, readRawConfig, setCloudConfig, setCloudSyncControls, setDefenceMode, setOpenClawMemoryConfig, setProactiveRecall, } from '../../cloud/config.js';
|
|
6
6
|
import { getQueueStats, reconcileSyncQueue } from '../../cloud/sync-queue.js';
|
|
7
7
|
import { getDatabase } from '../../database/init.js';
|
|
8
8
|
import { getRequiredTier, isFeatureEnabled } from '../../license/gate.js';
|
|
@@ -111,6 +111,7 @@ export function registerSystemRoutes(app, deps) {
|
|
|
111
111
|
baseUrl: config.cloudBaseUrl,
|
|
112
112
|
syncControls: getCloudSyncControls(),
|
|
113
113
|
openclawMemory: getOpenClawMemoryConfig(),
|
|
114
|
+
proactiveRecall: isProactiveRecallEnabled(),
|
|
114
115
|
});
|
|
115
116
|
}
|
|
116
117
|
catch (error) {
|
|
@@ -125,7 +126,7 @@ export function registerSystemRoutes(app, deps) {
|
|
|
125
126
|
}), (req, res) => {
|
|
126
127
|
try {
|
|
127
128
|
const existingConfig = getCloudConfig();
|
|
128
|
-
const { cloudApiKey, cloudEnabled, cloudBaseUrl, cloudSyncProjectMode, cloudSyncProjects, cloudSyncContentMode, cloudSyncExcludeSensitive, openclawAutoMemory, openclawAutoMemoryDedupe, openclawAutoMemoryNoveltyThreshold, openclawAutoMemoryMaxRecent, } = req.body;
|
|
129
|
+
const { cloudApiKey, cloudEnabled, cloudBaseUrl, cloudSyncProjectMode, cloudSyncProjects, cloudSyncContentMode, cloudSyncExcludeSensitive, openclawAutoMemory, openclawAutoMemoryDedupe, openclawAutoMemoryNoveltyThreshold, openclawAutoMemoryMaxRecent, proactiveRecall, } = req.body;
|
|
129
130
|
if (cloudApiKey !== undefined && typeof cloudApiKey !== 'string') {
|
|
130
131
|
return res.status(400).json({ error: 'cloudApiKey must be a string' });
|
|
131
132
|
}
|
|
@@ -168,6 +169,9 @@ export function registerSystemRoutes(app, deps) {
|
|
|
168
169
|
(!Array.isArray(cloudSyncProjects) || cloudSyncProjects.some((value) => typeof value !== 'string'))) {
|
|
169
170
|
return res.status(400).json({ error: 'cloudSyncProjects must be an array of strings' });
|
|
170
171
|
}
|
|
172
|
+
if (proactiveRecall !== undefined && typeof proactiveRecall !== 'boolean') {
|
|
173
|
+
return res.status(400).json({ error: 'proactiveRecall must be a boolean' });
|
|
174
|
+
}
|
|
171
175
|
const normalizedApiKey = cloudApiKey !== undefined
|
|
172
176
|
? cloudApiKey.trim()
|
|
173
177
|
: existingConfig.cloudApiKey;
|
|
@@ -207,6 +211,9 @@ export function registerSystemRoutes(app, deps) {
|
|
|
207
211
|
...(openclawAutoMemoryNoveltyThreshold !== undefined && { noveltyThreshold: openclawAutoMemoryNoveltyThreshold }),
|
|
208
212
|
...(openclawAutoMemoryMaxRecent !== undefined && { maxRecent: openclawAutoMemoryMaxRecent }),
|
|
209
213
|
});
|
|
214
|
+
if (proactiveRecall !== undefined) {
|
|
215
|
+
setProactiveRecall(proactiveRecall);
|
|
216
|
+
}
|
|
210
217
|
const updated = getCloudConfig();
|
|
211
218
|
res.json({
|
|
212
219
|
success: true,
|
|
@@ -215,6 +222,7 @@ export function registerSystemRoutes(app, deps) {
|
|
|
215
222
|
baseUrl: updated.cloudBaseUrl,
|
|
216
223
|
syncControls: getCloudSyncControls(),
|
|
217
224
|
openclawMemory: getOpenClawMemoryConfig(),
|
|
225
|
+
proactiveRecall: isProactiveRecallEnabled(),
|
|
218
226
|
});
|
|
219
227
|
}
|
|
220
228
|
catch (error) {
|
|
@@ -36,6 +36,7 @@ import { registerRecallRoutes } from './routes/recall.js';
|
|
|
36
36
|
import { registerSystemRoutes } from './routes/system.js';
|
|
37
37
|
import { registerXRayRoutes } from './routes/xray.js';
|
|
38
38
|
import { registerXRayFindingRoutes } from './routes/xray-findings.js';
|
|
39
|
+
import { registerDigestRoutes } from './routes/digest.js';
|
|
39
40
|
import { createIronDomeRouteGuard } from './iron-dome-route-guard.js';
|
|
40
41
|
import { readAndClearDetectionEvents } from '../xray/activity.js';
|
|
41
42
|
const PORT = process.env.PORT || 3001;
|
|
@@ -191,6 +192,7 @@ export function startVisualizationServer(dbPath) {
|
|
|
191
192
|
clients,
|
|
192
193
|
requireIronDomeAction: createIronDomeRouteGuard,
|
|
193
194
|
});
|
|
195
|
+
registerDigestRoutes(app);
|
|
194
196
|
// ============================================
|
|
195
197
|
// INSIGHTS ENDPOINTS
|
|
196
198
|
// ============================================
|
package/dist/cli/doctor.d.ts
CHANGED
|
@@ -2,4 +2,46 @@
|
|
|
2
2
|
* ShieldCortex Doctor — Installation health checker.
|
|
3
3
|
* Runs diagnostics and reports issues with actionable fixes.
|
|
4
4
|
*/
|
|
5
|
+
export type CheckStatus = 'pass' | 'warn' | 'fail' | 'info';
|
|
6
|
+
export interface CheckResult {
|
|
7
|
+
label: string;
|
|
8
|
+
status: CheckStatus;
|
|
9
|
+
message: string;
|
|
10
|
+
fix?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The honest "is it working?" check.
|
|
14
|
+
*
|
|
15
|
+
* Doctor checks have historically gone green while writes were silently
|
|
16
|
+
* failing (v4.12.4 path-encoding bug, v4.12.5 NOT NULL UUID schema gap).
|
|
17
|
+
* The pattern: schema introspection passed (columns existed) but actual
|
|
18
|
+
* INSERTs threw constraint violations during real workloads.
|
|
19
|
+
*
|
|
20
|
+
* This check does a real round-trip — INSERT a tagged probe memory,
|
|
21
|
+
* SELECT it back, DELETE it. If any step fails, doctor reports the
|
|
22
|
+
* actual error string instead of "all green". The probe is tagged with
|
|
23
|
+
* a unique source identifier so it can never be confused with real data
|
|
24
|
+
* and gets deleted at the end of the check.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Pure helper for the write-path round-trip. Exported so tests can
|
|
28
|
+
* exercise it against any database path (in-memory or temp file)
|
|
29
|
+
* without going through doctor's homedir-derived getDbPath().
|
|
30
|
+
*/
|
|
31
|
+
export declare function runWritePathProbe(dbPath: string): CheckResult;
|
|
32
|
+
/**
|
|
33
|
+
* Surfaces the resolved on/off state of the opt-in Stop and SessionEnd
|
|
34
|
+
* auto-memory hooks. Pre-v4.13.1 these were triple-gated (install flag,
|
|
35
|
+
* runtime config, sampling) with the runtime gate failing silently —
|
|
36
|
+
* users who wired the hook saw zero captures and zero feedback (#41).
|
|
37
|
+
*
|
|
38
|
+
* The check looks at both layers:
|
|
39
|
+
* - settings.json: is the hook wired so Claude Code will fire it?
|
|
40
|
+
* - autoMemory.enableStop / enableSessionEnd: will the hook actually run?
|
|
41
|
+
*
|
|
42
|
+
* Both layers must agree for the hook to do work. v4.13.1 onwards, the
|
|
43
|
+
* install flag flips both — if they disagree here, the user edited one
|
|
44
|
+
* side by hand and should re-run setup.
|
|
45
|
+
*/
|
|
46
|
+
export declare function checkAutoMemoryHooks(): Promise<CheckResult[]>;
|
|
5
47
|
export declare function runDoctor(): Promise<void>;
|