shieldcortex 4.11.1 → 4.12.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/README.md +3 -1
- 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/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.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +1 -1
- 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 +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory/__PAGE__.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview/__PAGE__.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_tree.segment.rsc +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 +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_tree.segment.rsc +1 -1
- 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 +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection/__PAGE__.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- 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 +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray/__PAGE__.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_tree.segment.rsc +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/dist/cli/doctor.js +37 -0
- package/dist/index.js +5 -1
- package/dist/setup/deep-clean.d.ts +126 -0
- package/dist/setup/deep-clean.js +396 -0
- package/dist/setup/uninstall.d.ts +2 -0
- package/dist/setup/uninstall.js +42 -1
- package/hooks/openclaw/cortex-memory/HOOK.md +3 -3
- package/package.json +1 -1
- package/plugins/openclaw/dist/openclaw.plugin.json +5 -1
- /package/dashboard/.next/standalone/dashboard/.next/static/{Z4iHJ2EI_hUaAO4mHtKgU → HNwybFN0dVEYkNsYrSnQA}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{Z4iHJ2EI_hUaAO4mHtKgU → HNwybFN0dVEYkNsYrSnQA}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{Z4iHJ2EI_hUaAO4mHtKgU → HNwybFN0dVEYkNsYrSnQA}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep-clean / residue detection for ShieldCortex ↔ OpenClaw integration.
|
|
3
|
+
*
|
|
4
|
+
* The standard `uninstall` and `uninstallPlugin` code paths only fire when
|
|
5
|
+
* the on-disk artefacts they expected are still present. Partial uninstalls,
|
|
6
|
+
* manual cleanups, and version-to-version shape changes left orphaned config
|
|
7
|
+
* entries in `~/.openclaw/openclaw.json` and `~/.openclaw/workspace/.clawhub/lock.json`
|
|
8
|
+
* that kept producing "plugin references without files" and "missing skill file"
|
|
9
|
+
* warnings until purged by hand (see incident notes 2026-04-23/24).
|
|
10
|
+
*
|
|
11
|
+
* This module scans every known residue location once, independently of disk
|
|
12
|
+
* state, and offers a single surgical clean-up pass.
|
|
13
|
+
*
|
|
14
|
+
* Scope: read/write of JSON config files + directory removal under the user's
|
|
15
|
+
* home directory. No network, no sudo, no shell invocation.
|
|
16
|
+
*/
|
|
17
|
+
import fs from 'fs';
|
|
18
|
+
import path from 'path';
|
|
19
|
+
import os from 'os';
|
|
20
|
+
import { execSync } from 'child_process';
|
|
21
|
+
const PLUGIN_ID = 'shieldcortex-realtime';
|
|
22
|
+
const HOOK_NAME = 'cortex-memory';
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the real user's home directory (mirrors openclaw.ts behaviour so the
|
|
25
|
+
* two modules agree on which home to touch under sudo).
|
|
26
|
+
*/
|
|
27
|
+
function resolveHome() {
|
|
28
|
+
const sudoUser = process.env.SUDO_USER;
|
|
29
|
+
if (sudoUser) {
|
|
30
|
+
try {
|
|
31
|
+
const entry = execSync(`getent passwd ${sudoUser}`, {
|
|
32
|
+
encoding: 'utf-8',
|
|
33
|
+
timeout: 5000,
|
|
34
|
+
}).trim();
|
|
35
|
+
const homeDir = entry.split(':')[5];
|
|
36
|
+
if (homeDir && fs.existsSync(homeDir))
|
|
37
|
+
return homeDir;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// getent not available (macOS)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return os.homedir();
|
|
44
|
+
}
|
|
45
|
+
function readJsonOrNull(file) {
|
|
46
|
+
if (!fs.existsSync(file))
|
|
47
|
+
return null;
|
|
48
|
+
try {
|
|
49
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
50
|
+
return typeof parsed === 'object' && parsed !== null
|
|
51
|
+
? parsed
|
|
52
|
+
: null;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function writeJson(file, data) {
|
|
59
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
60
|
+
fs.writeFileSync(file, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
61
|
+
}
|
|
62
|
+
function getPath(root, keyPath) {
|
|
63
|
+
let node = root;
|
|
64
|
+
for (const key of keyPath) {
|
|
65
|
+
if (typeof node !== 'object' || node === null)
|
|
66
|
+
return undefined;
|
|
67
|
+
node = node[key];
|
|
68
|
+
}
|
|
69
|
+
return node;
|
|
70
|
+
}
|
|
71
|
+
function deletePath(root, keyPath) {
|
|
72
|
+
if (keyPath.length === 0)
|
|
73
|
+
return false;
|
|
74
|
+
let node = root;
|
|
75
|
+
for (let i = 0; i < keyPath.length - 1; i++) {
|
|
76
|
+
const next = node[keyPath[i]];
|
|
77
|
+
if (typeof next !== 'object' || next === null)
|
|
78
|
+
return false;
|
|
79
|
+
node = next;
|
|
80
|
+
}
|
|
81
|
+
const leaf = keyPath[keyPath.length - 1];
|
|
82
|
+
if (leaf in node) {
|
|
83
|
+
delete node[leaf];
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
function filterArrayAtPath(root, keyPath, contains) {
|
|
89
|
+
const target = getPath(root, keyPath);
|
|
90
|
+
if (!Array.isArray(target))
|
|
91
|
+
return false;
|
|
92
|
+
const before = target.length;
|
|
93
|
+
const filtered = target.filter((entry) => !(typeof entry === 'string' && entry.includes(contains)));
|
|
94
|
+
if (filtered.length === before)
|
|
95
|
+
return false;
|
|
96
|
+
// Re-walk and assign back so we don't rely on aliasing
|
|
97
|
+
let node = root;
|
|
98
|
+
for (let i = 0; i < keyPath.length - 1; i++) {
|
|
99
|
+
node = node[keyPath[i]];
|
|
100
|
+
}
|
|
101
|
+
node[keyPath[keyPath.length - 1]] = filtered;
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Build the full list of known residue locations and whether each one is
|
|
106
|
+
* currently populated. Pure read — no mutation.
|
|
107
|
+
*/
|
|
108
|
+
export function scanForResidue() {
|
|
109
|
+
const home = resolveHome();
|
|
110
|
+
const openclawJson = path.join(home, '.openclaw', 'openclaw.json');
|
|
111
|
+
const clawhubLock = path.join(home, '.openclaw', 'workspace', '.clawhub', 'lock.json');
|
|
112
|
+
const cfg = readJsonOrNull(openclawJson) ?? {};
|
|
113
|
+
const lock = readJsonOrNull(clawhubLock) ?? {};
|
|
114
|
+
const paths = [];
|
|
115
|
+
// ── openclaw.json: plugins ─────────────────────────────
|
|
116
|
+
paths.push({
|
|
117
|
+
description: `openclaw.json: .plugins.installs["${PLUGIN_ID}"]`,
|
|
118
|
+
removal: { kind: 'delete-config-key', file: openclawJson, keyPath: ['plugins', 'installs', PLUGIN_ID] },
|
|
119
|
+
present: !!getPath(cfg, ['plugins', 'installs', PLUGIN_ID]),
|
|
120
|
+
category: 'plugin-config',
|
|
121
|
+
});
|
|
122
|
+
paths.push({
|
|
123
|
+
description: `openclaw.json: .plugins.entries["${PLUGIN_ID}"]`,
|
|
124
|
+
removal: { kind: 'delete-config-key', file: openclawJson, keyPath: ['plugins', 'entries', PLUGIN_ID] },
|
|
125
|
+
present: !!getPath(cfg, ['plugins', 'entries', PLUGIN_ID]),
|
|
126
|
+
category: 'plugin-config',
|
|
127
|
+
});
|
|
128
|
+
paths.push({
|
|
129
|
+
description: `openclaw.json: .plugins.allow[] contains "${PLUGIN_ID}"`,
|
|
130
|
+
removal: { kind: 'filter-config-array', file: openclawJson, keyPath: ['plugins', 'allow'], contains: PLUGIN_ID },
|
|
131
|
+
present: (() => {
|
|
132
|
+
const arr = getPath(cfg, ['plugins', 'allow']);
|
|
133
|
+
return Array.isArray(arr) && arr.some((e) => typeof e === 'string' && e.includes(PLUGIN_ID));
|
|
134
|
+
})(),
|
|
135
|
+
category: 'plugin-config',
|
|
136
|
+
});
|
|
137
|
+
paths.push({
|
|
138
|
+
description: `openclaw.json: .plugins.load.paths[] contains "${PLUGIN_ID}"`,
|
|
139
|
+
removal: { kind: 'filter-config-array', file: openclawJson, keyPath: ['plugins', 'load', 'paths'], contains: PLUGIN_ID },
|
|
140
|
+
present: (() => {
|
|
141
|
+
const arr = getPath(cfg, ['plugins', 'load', 'paths']);
|
|
142
|
+
return Array.isArray(arr) && arr.some((e) => typeof e === 'string' && e.includes(PLUGIN_ID));
|
|
143
|
+
})(),
|
|
144
|
+
category: 'plugin-config',
|
|
145
|
+
});
|
|
146
|
+
// ── openclaw.json: hooks (both modern and legacy shapes) ─
|
|
147
|
+
paths.push({
|
|
148
|
+
description: 'openclaw.json: .hooks.shieldcortex',
|
|
149
|
+
removal: { kind: 'delete-config-key', file: openclawJson, keyPath: ['hooks', 'shieldcortex'] },
|
|
150
|
+
present: !!getPath(cfg, ['hooks', 'shieldcortex']),
|
|
151
|
+
category: 'hook-config',
|
|
152
|
+
});
|
|
153
|
+
paths.push({
|
|
154
|
+
description: 'openclaw.json: .hooks.internal.installs.shieldcortex',
|
|
155
|
+
removal: { kind: 'delete-config-key', file: openclawJson, keyPath: ['hooks', 'internal', 'installs', 'shieldcortex'] },
|
|
156
|
+
present: !!getPath(cfg, ['hooks', 'internal', 'installs', 'shieldcortex']),
|
|
157
|
+
category: 'hook-config',
|
|
158
|
+
});
|
|
159
|
+
paths.push({
|
|
160
|
+
description: 'openclaw.json: .hooks.internal.entries.shieldcortex',
|
|
161
|
+
removal: { kind: 'delete-config-key', file: openclawJson, keyPath: ['hooks', 'internal', 'entries', 'shieldcortex'] },
|
|
162
|
+
present: !!getPath(cfg, ['hooks', 'internal', 'entries', 'shieldcortex']),
|
|
163
|
+
category: 'hook-config',
|
|
164
|
+
});
|
|
165
|
+
paths.push({
|
|
166
|
+
description: 'openclaw.json: .hooks.internal.allow[] contains "shieldcortex"',
|
|
167
|
+
removal: { kind: 'filter-config-array', file: openclawJson, keyPath: ['hooks', 'internal', 'allow'], contains: 'shieldcortex' },
|
|
168
|
+
present: (() => {
|
|
169
|
+
const arr = getPath(cfg, ['hooks', 'internal', 'allow']);
|
|
170
|
+
return Array.isArray(arr) && arr.some((e) => typeof e === 'string' && e.includes('shieldcortex'));
|
|
171
|
+
})(),
|
|
172
|
+
category: 'hook-config',
|
|
173
|
+
});
|
|
174
|
+
// ── clawhub lock ────────────────────────────────────────
|
|
175
|
+
paths.push({
|
|
176
|
+
description: 'clawhub/lock.json: .skills.shieldcortex',
|
|
177
|
+
removal: { kind: 'delete-config-key', file: clawhubLock, keyPath: ['skills', 'shieldcortex'] },
|
|
178
|
+
present: !!getPath(lock, ['skills', 'shieldcortex']),
|
|
179
|
+
category: 'clawhub-skill-lock',
|
|
180
|
+
});
|
|
181
|
+
// ── filesystem ──────────────────────────────────────────
|
|
182
|
+
const dirEntries = [
|
|
183
|
+
// Current canonical paths (these ARE the install when present)
|
|
184
|
+
{ dir: path.join(home, '.openclaw', 'hooks', HOOK_NAME), category: 'hook-dir' },
|
|
185
|
+
{ dir: path.join(home, '.claude', 'hooks', HOOK_NAME), category: 'hook-dir' },
|
|
186
|
+
{ dir: path.join(home, '.openclaw', 'extensions', PLUGIN_ID), category: 'plugin-dir' },
|
|
187
|
+
// Legacy paths — always orphaned when present (migrations should remove them)
|
|
188
|
+
{ dir: path.join(home, '.openclaw', 'hooks', 'internal', HOOK_NAME), category: 'legacy-hook-dir' },
|
|
189
|
+
{ dir: path.join(home, '.openclaw', 'hooks', 'shieldcortex'), category: 'legacy-hook-dir' },
|
|
190
|
+
{ dir: path.join(home, '.claude', 'hooks', 'internal', HOOK_NAME), category: 'legacy-hook-dir' },
|
|
191
|
+
];
|
|
192
|
+
for (const { dir, category } of dirEntries) {
|
|
193
|
+
paths.push({
|
|
194
|
+
description: dir,
|
|
195
|
+
removal: { kind: 'delete-directory', path: dir },
|
|
196
|
+
present: fs.existsSync(dir),
|
|
197
|
+
category,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
const dirtyCount = paths.filter((p) => p.present).length;
|
|
201
|
+
const cleanCount = paths.length - dirtyCount;
|
|
202
|
+
return { paths, dirtyCount, cleanCount };
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Detect whether the SC plugin / hook are currently installed on disk.
|
|
206
|
+
* Used by `scanForOrphans()` to tell legitimate install state from true orphans.
|
|
207
|
+
*/
|
|
208
|
+
function detectInstallState() {
|
|
209
|
+
const home = resolveHome();
|
|
210
|
+
const pluginManifest = path.join(home, '.openclaw', 'extensions', PLUGIN_ID, 'openclaw.plugin.json');
|
|
211
|
+
const pluginInstalled = fs.existsSync(pluginManifest);
|
|
212
|
+
const hookCandidates = [
|
|
213
|
+
path.join(home, '.openclaw', 'hooks', HOOK_NAME),
|
|
214
|
+
path.join(home, '.claude', 'hooks', HOOK_NAME),
|
|
215
|
+
];
|
|
216
|
+
const hookInstalled = hookCandidates.some((d) => fs.existsSync(d));
|
|
217
|
+
return { pluginInstalled, hookInstalled };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Return only residue entries that are TRUE ORPHANS — meaning the config /
|
|
221
|
+
* lock-file entry references a ShieldCortex artefact that is NOT currently
|
|
222
|
+
* installed on disk, OR it's a legacy path that shouldn't exist anymore.
|
|
223
|
+
*
|
|
224
|
+
* This is what `shieldcortex doctor` wants: it should flag partial-uninstall
|
|
225
|
+
* wreckage without flagging every legitimate install as "residue" (which was
|
|
226
|
+
* the v4.12.0 bug — the doctor couldn't tell a healthy install from a leftover).
|
|
227
|
+
*
|
|
228
|
+
* The `--deep` purge path continues to use `scanForResidue()` because its job
|
|
229
|
+
* is to remove ALL traces unconditionally, not just orphans.
|
|
230
|
+
*/
|
|
231
|
+
export function scanForOrphans() {
|
|
232
|
+
const installState = detectInstallState();
|
|
233
|
+
const report = scanForResidue();
|
|
234
|
+
const orphans = report.paths.filter((p) => {
|
|
235
|
+
if (!p.present)
|
|
236
|
+
return false;
|
|
237
|
+
switch (p.category) {
|
|
238
|
+
case 'plugin-config':
|
|
239
|
+
// Config entry is legitimate iff the plugin dir is installed.
|
|
240
|
+
return !installState.pluginInstalled;
|
|
241
|
+
case 'hook-config':
|
|
242
|
+
// Config entry is legitimate iff any current hook dir is installed.
|
|
243
|
+
return !installState.hookInstalled;
|
|
244
|
+
case 'plugin-dir':
|
|
245
|
+
case 'hook-dir':
|
|
246
|
+
// These ARE the install when present — never orphaned.
|
|
247
|
+
return false;
|
|
248
|
+
case 'legacy-hook-dir':
|
|
249
|
+
// Legacy paths should have been migrated off; always flag.
|
|
250
|
+
return true;
|
|
251
|
+
case 'clawhub-skill-lock':
|
|
252
|
+
// SC's openclaw install wrapper doesn't manage the skill. If the entry
|
|
253
|
+
// is present it was written by `openclaw skills install shieldcortex`
|
|
254
|
+
// and is either a matching live skill or an orphan. We can't confirm
|
|
255
|
+
// which without knowing where OpenClaw keeps skill artefacts, so we
|
|
256
|
+
// conservatively flag it so the operator can decide (purge or reinstall).
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
return {
|
|
261
|
+
paths: orphans,
|
|
262
|
+
orphanCount: orphans.length,
|
|
263
|
+
installState,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Apply all pending removals from a residue report. Config mutations for the
|
|
268
|
+
* same file are batched so we write each JSON file at most once.
|
|
269
|
+
*/
|
|
270
|
+
export function cleanResidue(report, options = {}) {
|
|
271
|
+
const result = { removed: [], errors: [] };
|
|
272
|
+
// Load each referenced config file once
|
|
273
|
+
const configCache = new Map();
|
|
274
|
+
const loadConfig = (file) => {
|
|
275
|
+
if (!configCache.has(file)) {
|
|
276
|
+
configCache.set(file, readJsonOrNull(file) ?? {});
|
|
277
|
+
}
|
|
278
|
+
return configCache.get(file);
|
|
279
|
+
};
|
|
280
|
+
const dirtyConfigFiles = new Set();
|
|
281
|
+
for (const entry of report.paths) {
|
|
282
|
+
if (!entry.present)
|
|
283
|
+
continue;
|
|
284
|
+
try {
|
|
285
|
+
const r = entry.removal;
|
|
286
|
+
if (r.kind === 'delete-directory') {
|
|
287
|
+
if (!options.dryRun) {
|
|
288
|
+
fs.rmSync(r.path, { recursive: true, force: true });
|
|
289
|
+
}
|
|
290
|
+
result.removed.push(entry.description);
|
|
291
|
+
}
|
|
292
|
+
else if (r.kind === 'delete-config-key') {
|
|
293
|
+
const cfg = loadConfig(r.file);
|
|
294
|
+
if (deletePath(cfg, r.keyPath)) {
|
|
295
|
+
dirtyConfigFiles.add(r.file);
|
|
296
|
+
result.removed.push(entry.description);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else if (r.kind === 'filter-config-array') {
|
|
300
|
+
const cfg = loadConfig(r.file);
|
|
301
|
+
if (filterArrayAtPath(cfg, r.keyPath, r.contains)) {
|
|
302
|
+
dirtyConfigFiles.add(r.file);
|
|
303
|
+
result.removed.push(entry.description);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
catch (err) {
|
|
308
|
+
result.errors.push({ description: entry.description, error: err.message });
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (!options.dryRun) {
|
|
312
|
+
for (const file of dirtyConfigFiles) {
|
|
313
|
+
try {
|
|
314
|
+
writeJson(file, configCache.get(file));
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
result.errors.push({ description: file, error: err.message });
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return result;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Best-effort restart of the OpenClaw gateway so the purged config takes
|
|
325
|
+
* effect. Returns a structured report; never throws.
|
|
326
|
+
*
|
|
327
|
+
* Order of attempts:
|
|
328
|
+
* - Linux: `systemctl --user restart openclaw-gateway`
|
|
329
|
+
* - macOS: `launchctl kickstart -k gui/<uid>/ai.openclaw.gateway`
|
|
330
|
+
* - Fallback: skip with info message.
|
|
331
|
+
*/
|
|
332
|
+
export async function restartOpenClawGateway() {
|
|
333
|
+
const platform = process.platform;
|
|
334
|
+
if (platform === 'linux') {
|
|
335
|
+
try {
|
|
336
|
+
execSync('systemctl --user restart openclaw-gateway', {
|
|
337
|
+
encoding: 'utf-8',
|
|
338
|
+
timeout: 10000,
|
|
339
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
340
|
+
});
|
|
341
|
+
return { attempted: true, restarted: true, method: 'systemctl --user' };
|
|
342
|
+
}
|
|
343
|
+
catch (err) {
|
|
344
|
+
return {
|
|
345
|
+
attempted: true,
|
|
346
|
+
restarted: false,
|
|
347
|
+
method: 'systemctl --user',
|
|
348
|
+
detail: err.message,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
if (platform === 'darwin') {
|
|
353
|
+
try {
|
|
354
|
+
const uid = process.getuid ? process.getuid() : 0;
|
|
355
|
+
execSync(`launchctl kickstart -k gui/${uid}/ai.openclaw.gateway`, {
|
|
356
|
+
encoding: 'utf-8',
|
|
357
|
+
timeout: 10000,
|
|
358
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
359
|
+
});
|
|
360
|
+
return { attempted: true, restarted: true, method: 'launchctl kickstart' };
|
|
361
|
+
}
|
|
362
|
+
catch (err) {
|
|
363
|
+
return {
|
|
364
|
+
attempted: true,
|
|
365
|
+
restarted: false,
|
|
366
|
+
method: 'launchctl kickstart',
|
|
367
|
+
detail: err.message,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return {
|
|
372
|
+
attempted: false,
|
|
373
|
+
restarted: false,
|
|
374
|
+
method: 'unsupported-platform',
|
|
375
|
+
detail: `Restart not implemented for platform: ${platform}`,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* High-level entry point used by `shieldcortex uninstall --deep`.
|
|
380
|
+
* Scans → cleans → (optionally) restarts gateway.
|
|
381
|
+
*/
|
|
382
|
+
export async function runDeepClean(options = {}) {
|
|
383
|
+
const report = scanForResidue();
|
|
384
|
+
const result = cleanResidue(report, { dryRun: options.dryRun });
|
|
385
|
+
let gateway;
|
|
386
|
+
if (options.restartGateway && !options.dryRun && result.removed.length > 0) {
|
|
387
|
+
gateway = await restartOpenClawGateway();
|
|
388
|
+
}
|
|
389
|
+
return { report, result, gateway };
|
|
390
|
+
}
|
|
391
|
+
// Exported for tests
|
|
392
|
+
export const _internals = {
|
|
393
|
+
PLUGIN_ID,
|
|
394
|
+
HOOK_NAME,
|
|
395
|
+
resolveHome,
|
|
396
|
+
};
|
package/dist/setup/uninstall.js
CHANGED
|
@@ -154,7 +154,10 @@ export async function uninstallSetup() {
|
|
|
154
154
|
export async function uninstallAll(options) {
|
|
155
155
|
if (blockAgentUninstall())
|
|
156
156
|
return;
|
|
157
|
-
const
|
|
157
|
+
const action = options?.deep
|
|
158
|
+
? 'fully uninstall ShieldCortex and purge OpenClaw residue'
|
|
159
|
+
: 'fully uninstall ShieldCortex';
|
|
160
|
+
const confirmed = await requireConfirmation(action);
|
|
158
161
|
if (!confirmed) {
|
|
159
162
|
console.log('Uninstall cancelled.');
|
|
160
163
|
return;
|
|
@@ -188,6 +191,44 @@ export async function uninstallAll(options) {
|
|
|
188
191
|
catch (err) {
|
|
189
192
|
console.error(`Failed to remove CLAUDE.md block: ${err.message}`);
|
|
190
193
|
}
|
|
194
|
+
// 5. Deep clean: purge all known OpenClaw residue locations that the
|
|
195
|
+
// version-specific uninstall paths miss, then (best-effort) restart
|
|
196
|
+
// the gateway so the purged config takes effect immediately.
|
|
197
|
+
if (options?.deep) {
|
|
198
|
+
try {
|
|
199
|
+
const { runDeepClean } = await import('./deep-clean.js');
|
|
200
|
+
const { report, result, gateway } = await runDeepClean({
|
|
201
|
+
restartGateway: options?.restartGateway !== false,
|
|
202
|
+
});
|
|
203
|
+
if (result.removed.length > 0) {
|
|
204
|
+
console.log(`\nDeep clean: removed ${result.removed.length} residue reference(s):`);
|
|
205
|
+
for (const r of result.removed) {
|
|
206
|
+
console.log(` - ${r}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else if (report.dirtyCount === 0) {
|
|
210
|
+
console.log('\nDeep clean: no OpenClaw residue detected.');
|
|
211
|
+
}
|
|
212
|
+
if (result.errors.length > 0) {
|
|
213
|
+
console.warn(`\nDeep clean: ${result.errors.length} error(s):`);
|
|
214
|
+
for (const e of result.errors) {
|
|
215
|
+
console.warn(` - ${e.description}: ${e.error}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (gateway) {
|
|
219
|
+
if (gateway.restarted) {
|
|
220
|
+
console.log(`\nOpenClaw gateway restarted via ${gateway.method}.`);
|
|
221
|
+
}
|
|
222
|
+
else if (gateway.attempted) {
|
|
223
|
+
console.warn(`\nOpenClaw gateway restart via ${gateway.method} failed: ${gateway.detail ?? 'unknown'}`);
|
|
224
|
+
console.warn('Restart it manually for the cleanup to take effect.');
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
console.error(`Deep clean failed: ${err.message}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
191
232
|
console.log('\nDatabase preserved at ~/.shieldcortex/memories.db — delete manually if desired.');
|
|
192
233
|
console.log('Uninstall complete.\n');
|
|
193
234
|
console.log('To also remove the npm package:');
|
|
@@ -28,9 +28,9 @@ When `openclawAutoMemory` is enabled:
|
|
|
28
28
|
5. Skips exact and near-duplicate memories using novelty filtering
|
|
29
29
|
|
|
30
30
|
### On Session Start (Agent Bootstrap)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
Bootstrap context injection was **disabled in v2026.2.26**. OpenClaw's native Memory Search now handles context recall at session start, so the hook no longer pushes memories into the system prompt (which was producing ~40× duplication of CORTEX_MEMORY.md and eating most of the context window).
|
|
32
|
+
|
|
33
|
+
The hook still fires on `agent:bootstrap` for lifecycle wiring (warning-bootstrap-file handoff, etc.) but contributes nothing to the system prompt. This keeps `extraSystemPromptHash` stable across turns and prevents the session-binding reset loop documented in `src/setup/claude-md.ts`.
|
|
34
34
|
|
|
35
35
|
### Keyword Triggers
|
|
36
36
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shieldcortex",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.12.1",
|
|
4
4
|
"description": "Trustworthy memory and security for AI agents. Recall debugging, review queue, OpenClaw session capture, and memory poisoning defence for Claude Code, Codex, OpenClaw, LangChain, and MCP agents.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "shieldcortex-realtime",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.12.1",
|
|
4
4
|
"name": "ShieldCortex Real-time Scanner",
|
|
5
5
|
"description": "Real-time defence scanning on LLM input, memory extraction on LLM output, and active tool call interception with approval gating.",
|
|
6
6
|
"kind": null,
|
|
7
|
+
"engines": {
|
|
8
|
+
"openclaw": ">=2026.3.22",
|
|
9
|
+
"recommended": ">=2026.4.23"
|
|
10
|
+
},
|
|
7
11
|
"enabledByDefault": false,
|
|
8
12
|
"activation": {
|
|
9
13
|
"hooks": ["llm_input", "llm_output", "before_tool_call", "session_end"],
|
|
File without changes
|
|
File without changes
|