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