shieldcortex 4.12.10 → 4.12.12
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/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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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_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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_full.segment.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_full.segment.rsc +6 -6
- 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.meta +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.rsc +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture/__PAGE__.segment.rsc +2 -2
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_full.segment.rsc +7 -7
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_full.segment.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_full.segment.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_full.segment.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_full.segment.rsc +6 -6
- 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 +7 -7
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_full.segment.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_full.segment.rsc +7 -7
- 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_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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_full.segment.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_full.segment.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_full.segment.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_full.segment.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_full.segment.rsc +6 -6
- 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 +7 -7
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_full.segment.rsc +7 -7
- 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 +7 -7
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_full.segment.rsc +7 -7
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_full.segment.rsc +6 -6
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_full.segment.rsc +6 -6
- 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 +7 -7
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_full.segment.rsc +7 -7
- 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/[root-of-the-server]__c2b92077._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_01f6ceb0._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_11878109._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_1bfd1423._.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_35a9932a._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_35c9f22e._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_37f17371._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_836b4a04._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_9770c429._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_9dd626ed._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_c219bf07._.js +8 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_e94d2da2._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/{dashboard_d5fc66fc._.js → dashboard_fefd3b85._.js} +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_protection_ProtectionOverview_tsx_54554a97._.js +3 -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/079a5be036130e37.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/1770a8ce7abb2437.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/1a074f8ddc7cd385.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/24da99d1341bd573.css +3 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/2aa8afb655c1c2e5.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/385ec610bad1acc5.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/3d53807a9a943ce7.js +15 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/4f57582c2d186438.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/7fca141efba9d353.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/8593e1796c9d043d.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/c288964c4c00982a.js +3 -0
- package/dist/api/routes/admin.js +295 -8
- package/dist/api/visualization-server.js +5 -0
- package/dist/audit/index.d.ts +2 -1
- package/dist/audit/index.js +1 -1
- package/dist/audit/memory-scanner.d.ts +66 -1
- package/dist/audit/memory-scanner.js +441 -28
- package/dist/cli/review-copilot.d.ts +1 -0
- package/dist/cli/review-copilot.js +197 -0
- package/dist/cloud/cli.js +3 -1
- package/dist/cloud/config.d.ts +17 -0
- package/dist/cloud/config.js +110 -25
- package/dist/database/init.js +37 -0
- package/dist/database/schema.sql +20 -0
- package/dist/defence/explainer/index.d.ts +5 -0
- package/dist/defence/explainer/index.js +28 -0
- package/dist/defence/explainer/prompt.d.ts +2 -0
- package/dist/defence/explainer/prompt.js +49 -0
- package/dist/defence/explainer/schema.d.ts +3 -0
- package/dist/defence/explainer/schema.js +204 -0
- package/dist/defence/explainer/types.d.ts +26 -0
- package/dist/defence/explainer/types.js +1 -0
- package/dist/defence/judge/annotate.d.ts +8 -0
- package/dist/defence/judge/annotate.js +107 -0
- package/dist/defence/judge/annotations-store.d.ts +4 -0
- package/dist/defence/judge/annotations-store.js +67 -0
- package/dist/defence/judge/decision.d.ts +10 -0
- package/dist/defence/judge/decision.js +165 -0
- package/dist/defence/judge/fallback.d.ts +4 -0
- package/dist/defence/judge/fallback.js +19 -0
- package/dist/defence/judge/grouping.d.ts +4 -0
- package/dist/defence/judge/grouping.js +52 -0
- package/dist/defence/judge/index.d.ts +9 -0
- package/dist/defence/judge/index.js +34 -0
- package/dist/defence/judge/prompt.d.ts +3 -0
- package/dist/defence/judge/prompt.js +49 -0
- package/dist/defence/judge/runner.d.ts +3 -0
- package/dist/defence/judge/runner.js +160 -0
- package/dist/defence/judge/schema.d.ts +15 -0
- package/dist/defence/judge/schema.js +118 -0
- package/dist/defence/judge/telemetry.d.ts +28 -0
- package/dist/defence/judge/telemetry.js +43 -0
- package/dist/defence/judge/types.d.ts +67 -0
- package/dist/defence/judge/types.js +1 -0
- package/dist/defence/judge/worker.d.ts +1 -0
- package/dist/defence/judge/worker.js +106 -0
- package/dist/defence/quarantine/review.js +16 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.js +10 -1
- package/dist/lib.d.ts +9 -1
- package/dist/lib.js +7 -1
- package/dist/license/gate.d.ts +1 -1
- package/dist/license/gate.js +6 -0
- package/dist/setup/openclaw.d.ts +16 -0
- package/dist/setup/openclaw.js +85 -22
- package/dist/setup/uninstall.d.ts +14 -0
- package/dist/setup/uninstall.js +76 -1
- package/package.json +4 -1
- package/plugins/openclaw/dist/openclaw.plugin.json +1 -1
- package/scripts/ensure-bin-executable.mjs +17 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__4a575c8d._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_0734b815._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_21edaee1._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_354daf70._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_8481163e._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_a3053031._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_a38f5767._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_f6813b70._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/1482af194911d5e7.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/2c2a280eeaed7ed2.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/2f92786ac35bbdb9.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/90f35860c69b2f0b.js +0 -9
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/915d5a8cf2d0807e.css +0 -3
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/927fe0465516b94a.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/99a618b860658c5c.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/b31e08a78b0cb6fb.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/c2ccb1c0ed7b2af2.js +0 -1
- /package/dashboard/.next/standalone/dashboard/.next/static/{nVGRPkyPiH6cvGL1arxPi → 5HSptYF0HaABlloA3Hir3}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{nVGRPkyPiH6cvGL1arxPi → 5HSptYF0HaABlloA3Hir3}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{nVGRPkyPiH6cvGL1arxPi → 5HSptYF0HaABlloA3Hir3}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { parentPort } from 'worker_threads';
|
|
2
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
3
|
+
let generator = null;
|
|
4
|
+
let activeModelId = null;
|
|
5
|
+
let loadError = null;
|
|
6
|
+
async function initTransformers(cacheDir, allowRemoteModels) {
|
|
7
|
+
try {
|
|
8
|
+
const mod = await import('@huggingface/transformers');
|
|
9
|
+
mod.env.allowRemoteModels = allowRemoteModels;
|
|
10
|
+
mod.env.allowLocalModels = true;
|
|
11
|
+
mod.env.cacheDir = cacheDir;
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
loadError = error instanceof Error ? error.message : String(error);
|
|
15
|
+
throw new Error(`transformers_load_failed:${loadError}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async function loadModel(modelId, cacheDir, allowRemoteModels) {
|
|
19
|
+
if (generator && activeModelId === modelId)
|
|
20
|
+
return;
|
|
21
|
+
if (loadError)
|
|
22
|
+
throw new Error(loadError);
|
|
23
|
+
await initTransformers(cacheDir, allowRemoteModels);
|
|
24
|
+
const mod = await import('@huggingface/transformers');
|
|
25
|
+
generator = await mod.pipeline('text-generation', modelId, {
|
|
26
|
+
dtype: 'q4',
|
|
27
|
+
});
|
|
28
|
+
activeModelId = modelId;
|
|
29
|
+
}
|
|
30
|
+
async function withTimeout(promise, timeoutMs) {
|
|
31
|
+
let timeout = null;
|
|
32
|
+
try {
|
|
33
|
+
return await Promise.race([
|
|
34
|
+
promise,
|
|
35
|
+
new Promise((_, reject) => {
|
|
36
|
+
timeout = setTimeout(() => reject(new Error(`timeout:${timeoutMs}`)), timeoutMs);
|
|
37
|
+
}),
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
if (timeout)
|
|
42
|
+
clearTimeout(timeout);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function generate(prompt, timeoutMs) {
|
|
46
|
+
const messages = [
|
|
47
|
+
{
|
|
48
|
+
role: 'system',
|
|
49
|
+
content: 'You are ShieldCortex Review Copilot. Return exactly one valid JSON object and no other text.',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
role: 'user',
|
|
53
|
+
content: prompt,
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
const output = await withTimeout(generator(messages, {
|
|
57
|
+
max_new_tokens: 768,
|
|
58
|
+
do_sample: false,
|
|
59
|
+
temperature: 0,
|
|
60
|
+
return_full_text: false,
|
|
61
|
+
}), timeoutMs);
|
|
62
|
+
if (Array.isArray(output) && output[0]?.generated_text) {
|
|
63
|
+
const generated = output[0].generated_text;
|
|
64
|
+
if (Array.isArray(generated)) {
|
|
65
|
+
const last = generated[generated.length - 1];
|
|
66
|
+
return String(last?.content ?? '');
|
|
67
|
+
}
|
|
68
|
+
return String(generated);
|
|
69
|
+
}
|
|
70
|
+
if (typeof output === 'object' && output && 'generated_text' in output) {
|
|
71
|
+
const generated = output.generated_text;
|
|
72
|
+
if (Array.isArray(generated)) {
|
|
73
|
+
const last = generated[generated.length - 1];
|
|
74
|
+
return String(last?.content ?? '');
|
|
75
|
+
}
|
|
76
|
+
return String(generated);
|
|
77
|
+
}
|
|
78
|
+
return String(output ?? '');
|
|
79
|
+
}
|
|
80
|
+
parentPort?.postMessage({ type: 'ready' });
|
|
81
|
+
setInterval(() => {
|
|
82
|
+
parentPort?.postMessage({ type: 'heartbeat' });
|
|
83
|
+
}, 5000).unref();
|
|
84
|
+
parentPort?.on('message', async (msg) => {
|
|
85
|
+
try {
|
|
86
|
+
if (msg.type === 'ping') {
|
|
87
|
+
parentPort?.postMessage({ id: msg.id, ok: true, rawText: 'pong' });
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
await loadModel(msg.modelId, msg.cacheDir, msg.allowRemoteModels);
|
|
91
|
+
if (msg.type === 'load') {
|
|
92
|
+
parentPort?.postMessage({ id: msg.id, ok: true, rawText: 'loaded' });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (!msg.prompt) {
|
|
96
|
+
parentPort?.postMessage({ id: msg.id, ok: false, reason: 'missing_prompt' });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const rawText = await generate(msg.prompt, msg.timeoutMs);
|
|
100
|
+
parentPort?.postMessage({ id: msg.id, ok: true, rawText });
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
104
|
+
parentPort?.postMessage({ id: msg.id, ok: false, reason });
|
|
105
|
+
}
|
|
106
|
+
});
|
|
@@ -42,14 +42,24 @@ function promoteApprovedQuarantineRow(row, reviewedBy) {
|
|
|
42
42
|
: 'quarantine:review',
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
|
-
function
|
|
45
|
+
function markPendingRowReviewed(id, status, reviewedBy) {
|
|
46
46
|
const db = getDatabase();
|
|
47
|
-
const memory = promoteApprovedQuarantineRow(row, reviewedBy);
|
|
48
47
|
const reviewedAt = new Date().toISOString();
|
|
49
|
-
const result = db.prepare('UPDATE quarantine SET status = ?, reviewed_at = ?, reviewed_by = ? WHERE id = ? AND status = ?').run(
|
|
48
|
+
const result = db.prepare('UPDATE quarantine SET status = ?, reviewed_at = ?, reviewed_by = ? WHERE id = ? AND status = ?').run(status, reviewedAt, reviewedBy, id, 'pending');
|
|
50
49
|
if (result.changes === 0) {
|
|
51
50
|
throw new Error('Quarantine entry not found or already reviewed');
|
|
52
51
|
}
|
|
52
|
+
}
|
|
53
|
+
function approveExistingPendingRow(row, reviewedBy) {
|
|
54
|
+
if (row.source_type === 'memory_file') {
|
|
55
|
+
markPendingRowReviewed(row.id, 'approved', reviewedBy);
|
|
56
|
+
return {
|
|
57
|
+
id: row.id,
|
|
58
|
+
status: 'approved',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const memory = promoteApprovedQuarantineRow(row, reviewedBy);
|
|
62
|
+
markPendingRowReviewed(row.id, 'approved', reviewedBy);
|
|
53
63
|
return {
|
|
54
64
|
id: row.id,
|
|
55
65
|
status: 'approved',
|
|
@@ -57,12 +67,11 @@ function approveExistingPendingRow(row, reviewedBy) {
|
|
|
57
67
|
};
|
|
58
68
|
}
|
|
59
69
|
function rejectPendingQuarantineRow(id, reviewedBy) {
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
const result = db.prepare('UPDATE quarantine SET status = ?, reviewed_at = ?, reviewed_by = ? WHERE id = ? AND status = ?').run('rejected', reviewedAt, reviewedBy, id, 'pending');
|
|
63
|
-
if (result.changes === 0) {
|
|
70
|
+
const row = getPendingQuarantineRow(id);
|
|
71
|
+
if (!row) {
|
|
64
72
|
return null;
|
|
65
73
|
}
|
|
74
|
+
markPendingRowReviewed(row.id, 'rejected', reviewedBy);
|
|
66
75
|
return { id, status: 'rejected' };
|
|
67
76
|
}
|
|
68
77
|
export function approveQuarantineItem(id, reviewedBy = 'dashboard') {
|
package/dist/index.d.ts
CHANGED
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
* shieldcortex config --openclaw-auto-memory true # Enable OpenClaw auto-memory extraction
|
|
38
38
|
* shieldcortex config --openclaw-auto-memory false # Disable OpenClaw auto-memory extraction
|
|
39
39
|
* shieldcortex cloud sync --full # Backfill local memories + graph to ShieldCortex Cloud
|
|
40
|
+
* shieldcortex review-copilot status # Local AI Explainer status (Pro)
|
|
40
41
|
* shieldcortex copilot install # Configure MCP server for VS Code + Cursor
|
|
41
42
|
* shieldcortex copilot uninstall # Remove MCP server configuration
|
|
42
43
|
* shieldcortex copilot status # Check MCP server configuration
|
package/dist/index.js
CHANGED
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
* shieldcortex config --openclaw-auto-memory true # Enable OpenClaw auto-memory extraction
|
|
38
38
|
* shieldcortex config --openclaw-auto-memory false # Disable OpenClaw auto-memory extraction
|
|
39
39
|
* shieldcortex cloud sync --full # Backfill local memories + graph to ShieldCortex Cloud
|
|
40
|
+
* shieldcortex review-copilot status # Local AI Explainer status (Pro)
|
|
40
41
|
* shieldcortex copilot install # Configure MCP server for VS Code + Cursor
|
|
41
42
|
* shieldcortex copilot uninstall # Remove MCP server configuration
|
|
42
43
|
* shieldcortex copilot status # Check MCP server configuration
|
|
@@ -453,6 +454,7 @@ ${bold}COMMANDS${reset}
|
|
|
453
454
|
${cyan}quickstart${reset} [target] Detect integrations and guide/install setup
|
|
454
455
|
${cyan}config${reset} [options] Configure cloud sync and settings
|
|
455
456
|
${cyan}cloud${reset} sync --full Backfill local memories + graph to ShieldCortex Cloud
|
|
457
|
+
${cyan}review-copilot${reset} <action> Local AI Explainer for quarantine review (Pro)
|
|
456
458
|
${cyan}cortex${reset} <command> Mistake learning & pre-flight checks (Pro)
|
|
457
459
|
${cyan}license${reset} <action> Manage licence key (activate, status, deactivate)
|
|
458
460
|
${cyan}iron-dome${reset} <action> Manage behaviour protection layer
|
|
@@ -480,6 +482,7 @@ ${bold}EXAMPLES${reset}
|
|
|
480
482
|
shieldcortex license activate sc_pro_...
|
|
481
483
|
shieldcortex config --cloud-enable --cloud-api-key <key>
|
|
482
484
|
shieldcortex cloud sync --full
|
|
485
|
+
shieldcortex review-copilot status
|
|
483
486
|
|
|
484
487
|
${bold}DOCS${reset}
|
|
485
488
|
https://shieldcortex.ai/docs
|
|
@@ -575,6 +578,12 @@ ${bold}DOCS${reset}
|
|
|
575
578
|
await handleCloudCommand(process.argv.slice(3));
|
|
576
579
|
return;
|
|
577
580
|
}
|
|
581
|
+
// Handle "review-copilot" subcommand (backwards-compatible Local AI Explainer command)
|
|
582
|
+
if (process.argv[2] === 'review-copilot') {
|
|
583
|
+
const { handleReviewCopilotCommand } = await import('./cli/review-copilot.js');
|
|
584
|
+
await handleReviewCopilotCommand(process.argv.slice(3), parsedArgs.dbPath);
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
578
587
|
// Handle "status" subcommand
|
|
579
588
|
if (process.argv[2] === 'status') {
|
|
580
589
|
const { handleStatusCommand } = await import('./setup/status.js');
|
|
@@ -954,7 +963,7 @@ ${bold}DOCS${reset}
|
|
|
954
963
|
const knownCommands = new Set([
|
|
955
964
|
'doctor', 'quickstart', 'setup', 'install', 'migrate', 'uninstall', 'hook', 'update',
|
|
956
965
|
'openclaw', 'clawdbot', 'copilot', 'codex', 'service', 'config', 'status',
|
|
957
|
-
'graph', 'license', 'licence', 'audit', 'iron-dome', 'scan', 'cloud',
|
|
966
|
+
'graph', 'license', 'licence', 'audit', 'iron-dome', 'scan', 'cloud', 'review-copilot',
|
|
958
967
|
'scan-skill', 'scan-skills', 'dashboard', 'api', 'worker', 'stats', 'cortex', 'consolidate', 'xray', 'xray-preinstall',
|
|
959
968
|
]);
|
|
960
969
|
const arg = process.argv[2];
|
package/dist/lib.d.ts
CHANGED
|
@@ -11,6 +11,13 @@
|
|
|
11
11
|
export { runDefencePipeline, runDefencePipelineWithVerify, DEFAULT_DEFENCE_CONFIG, scoreSource, filterByTrust, analyzeFirewall, classifySensitivity, redactContent, redactForDisplay, analyzeFragmentation, storeFragmentationData, scanForCredentials, redactCredentials, DEFAULT_CREDENTIAL_CONFIG, logAudit, queryAuditLogs, getAuditStats, getDefenceMode, setDefenceMode, isConfigTampered, getCloudConfig, setCloudConfig, clearCloudConfigCache, getOpenClawAutoMemory, setOpenClawAutoMemory, getOpenClawMemoryConfig, setOpenClawMemoryConfig, getVerifyConfig, setVerifyConfig, syncToCloud, syncQuarantineToCloud, submitVerification, pollVerification, getDeviceId, getDeviceName, } from './defence/index.js';
|
|
12
12
|
export type { DefenceConfig, DefencePipelineResultWithVerify, DefenceSource, SensitivityLevel, FirewallResult, VerifyResult, VerifyThreat, } from './defence/types.js';
|
|
13
13
|
export type { VerifyConfig } from './cloud/config.js';
|
|
14
|
+
export { getReviewCopilotConfig, setReviewCopilotConfig } from './cloud/config.js';
|
|
15
|
+
export { reviewQuarantineItem, groupReviewAnnotations, groupSimilarItems, parseReviewAnnotation, validateReviewAnnotation, fallbackAnnotation, } from './defence/judge/index.js';
|
|
16
|
+
export { annotateQuarantineItem, annotatePendingQuarantineItems, getAnnotationForItem, } from './defence/judge/annotate.js';
|
|
17
|
+
export type { ReviewCopilotConfig } from './cloud/config.js';
|
|
18
|
+
export type { ReviewAnnotation, ReviewBatch, ReviewCopilotCategory, ReviewCopilotSuggestion, ReviewQuarantineItem, AnnotationRunResult, } from './defence/judge/index.js';
|
|
19
|
+
export { explainLocalAiSubject, buildLocalAiExplainPrompt, parseLocalAiExplanation, fallbackLocalAiExplanation, } from './defence/explainer/index.js';
|
|
20
|
+
export type { LocalAiEvidence, LocalAiExplanation, LocalAiExplainSubject, LocalAiExplainSubjectKind, } from './defence/explainer/index.js';
|
|
14
21
|
export { scanToolResponse, shouldScanToolResponse } from './defence/tool-response-scanner.js';
|
|
15
22
|
export type { ToolResponseScanResult } from './defence/types.js';
|
|
16
23
|
export { activateIronDome, deactivateIronDome, getIronDomeStatus, isChannelTrusted, isActionAllowed, scanForInjection, checkPII, handleKillPhrase, IRON_DOME_PROFILES, DEFAULT_IRON_DOME_CONFIG, } from './defence/iron-dome/index.js';
|
|
@@ -32,8 +39,9 @@ export { extractFromMemory } from './graph/extract.js';
|
|
|
32
39
|
export { processExtractionResult, mergeEntities } from './graph/resolve.js';
|
|
33
40
|
export { backfillGraph } from './graph/backfill.js';
|
|
34
41
|
export { initDatabase } from './database/init.js';
|
|
35
|
-
export { scanMemories, scanMcpConfigs, scanEnvFiles, scanRulesFiles } from './audit/index.js';
|
|
42
|
+
export { discoverMemoryFiles, isShieldCortexOwnMemoryPath, scanMemories, scanMemoryFilesDetailed, scanMcpConfigs, scanEnvFiles, scanRulesFiles, } from './audit/index.js';
|
|
36
43
|
export { formatTerminalReport, formatMarkdownReport, formatJsonReport } from './audit/index.js';
|
|
44
|
+
export type { DetailedMemoryFileScanResult, DiscoveredMemoryFile, MemoryFileDiscoveryOptions, MemoryFileEvidence, MemoryFileRisk, MemoryFileScanRecord, MemoryFileScanSummary, } from './audit/index.js';
|
|
37
45
|
export type { AuditFinding, AuditSeverity } from './audit/types.js';
|
|
38
46
|
export { getLicense, getLicenseTier, isFeatureEnabled, requireFeature, listFeatures, FeatureGatedError, verifyLicenseKey, TIER_RANK, } from './license/index.js';
|
|
39
47
|
export type { LicenseTier, LicenseInfo, GatedFeature, } from './license/index.js';
|
package/dist/lib.js
CHANGED
|
@@ -10,6 +10,12 @@
|
|
|
10
10
|
*/
|
|
11
11
|
// ── Defence ────────────────────────────────────────────────
|
|
12
12
|
export { runDefencePipeline, runDefencePipelineWithVerify, DEFAULT_DEFENCE_CONFIG, scoreSource, filterByTrust, analyzeFirewall, classifySensitivity, redactContent, redactForDisplay, analyzeFragmentation, storeFragmentationData, scanForCredentials, redactCredentials, DEFAULT_CREDENTIAL_CONFIG, logAudit, queryAuditLogs, getAuditStats, getDefenceMode, setDefenceMode, isConfigTampered, getCloudConfig, setCloudConfig, clearCloudConfigCache, getOpenClawAutoMemory, setOpenClawAutoMemory, getOpenClawMemoryConfig, setOpenClawMemoryConfig, getVerifyConfig, setVerifyConfig, syncToCloud, syncQuarantineToCloud, submitVerification, pollVerification, getDeviceId, getDeviceName, } from './defence/index.js';
|
|
13
|
+
// ── Review Copilot ───────────────────────────────────────
|
|
14
|
+
export { getReviewCopilotConfig, setReviewCopilotConfig } from './cloud/config.js';
|
|
15
|
+
export { reviewQuarantineItem, groupReviewAnnotations, groupSimilarItems, parseReviewAnnotation, validateReviewAnnotation, fallbackAnnotation, } from './defence/judge/index.js';
|
|
16
|
+
export { annotateQuarantineItem, annotatePendingQuarantineItems, getAnnotationForItem, } from './defence/judge/annotate.js';
|
|
17
|
+
// ── Local AI Explainer ────────────────────────────────────
|
|
18
|
+
export { explainLocalAiSubject, buildLocalAiExplainPrompt, parseLocalAiExplanation, fallbackLocalAiExplanation, } from './defence/explainer/index.js';
|
|
13
19
|
// ── Tool Response Scanner ─────────────────────────────────
|
|
14
20
|
export { scanToolResponse, shouldScanToolResponse } from './defence/tool-response-scanner.js';
|
|
15
21
|
// ── Iron Dome ─────────────────────────────────────────────
|
|
@@ -36,7 +42,7 @@ export { backfillGraph } from './graph/backfill.js';
|
|
|
36
42
|
// ── Database ───────────────────────────────────────────────
|
|
37
43
|
export { initDatabase } from './database/init.js';
|
|
38
44
|
// ── Audit ──────────────────────────────────────────────────
|
|
39
|
-
export { scanMemories, scanMcpConfigs, scanEnvFiles, scanRulesFiles } from './audit/index.js';
|
|
45
|
+
export { discoverMemoryFiles, isShieldCortexOwnMemoryPath, scanMemories, scanMemoryFilesDetailed, scanMcpConfigs, scanEnvFiles, scanRulesFiles, } from './audit/index.js';
|
|
40
46
|
export { formatTerminalReport, formatMarkdownReport, formatJsonReport } from './audit/index.js';
|
|
41
47
|
// ── License ────────────────────────────────────────────────
|
|
42
48
|
export { getLicense, getLicenseTier, isFeatureEnabled, requireFeature, listFeatures, FeatureGatedError, verifyLicenseKey, TIER_RANK, } from './license/index.js';
|
package/dist/license/gate.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* isFeatureEnabled('cloud_sync'); // returns boolean (soft check)
|
|
7
7
|
*/
|
|
8
8
|
import { type LicenseTier } from './keys.js';
|
|
9
|
-
export type GatedFeature = 'custom_injection_patterns' | 'custom_iron_dome_policies' | 'custom_firewall_rules' | 'audit_export' | 'skill_scanner_deep' | 'cloud_sync' | 'team_management' | 'shared_patterns' | 'cortex_learning' | 'deps_quarantine' | 'deps_clean' | 'deps_auto_protect' | 'deps_global_scan' | 'memory_types' | 'memory_scopes' | 'dream_mode' | 'llm_reranking' | 'positive_feedback' | 'xray_deep';
|
|
9
|
+
export type GatedFeature = 'custom_injection_patterns' | 'custom_iron_dome_policies' | 'custom_firewall_rules' | 'audit_export' | 'skill_scanner_deep' | 'cloud_sync' | 'team_management' | 'shared_patterns' | 'cortex_learning' | 'deps_quarantine' | 'deps_clean' | 'deps_auto_protect' | 'deps_global_scan' | 'memory_types' | 'memory_scopes' | 'dream_mode' | 'llm_reranking' | 'positive_feedback' | 'local_ai_explainer' | 'memory_file_scan' | 'review_copilot' | 'xray_deep';
|
|
10
10
|
export declare class FeatureGatedError extends Error {
|
|
11
11
|
feature: GatedFeature;
|
|
12
12
|
requiredTier: LicenseTier;
|
package/dist/license/gate.js
CHANGED
|
@@ -26,6 +26,9 @@ const FEATURE_TIERS = {
|
|
|
26
26
|
dream_mode: 'pro',
|
|
27
27
|
llm_reranking: 'pro',
|
|
28
28
|
positive_feedback: 'pro',
|
|
29
|
+
local_ai_explainer: 'pro',
|
|
30
|
+
memory_file_scan: 'pro',
|
|
31
|
+
review_copilot: 'pro',
|
|
29
32
|
xray_deep: 'pro',
|
|
30
33
|
};
|
|
31
34
|
const FEATURE_DESCRIPTIONS = {
|
|
@@ -47,6 +50,9 @@ const FEATURE_DESCRIPTIONS = {
|
|
|
47
50
|
dream_mode: 'Background memory consolidation — merge duplicates, archive stale, detect contradictions.',
|
|
48
51
|
llm_reranking: 'LLM-powered memory reranking for precision recall.',
|
|
49
52
|
positive_feedback: 'Capture what worked, not just what failed — learn from success.',
|
|
53
|
+
local_ai_explainer: 'Local AI explanations for memories, X-Ray findings, and quarantine review without sending content to the cloud.',
|
|
54
|
+
memory_file_scan: 'Scan persistent agent memory files for poisoned instructions and credential leaks.',
|
|
55
|
+
review_copilot: 'Local AI quarantine review annotations, grouping, and batch triage.',
|
|
50
56
|
xray_deep: 'Deep X-Ray scanning: npm registry analysis, binary file inspection, dependency graph risk, and AI-directive detection in metadata and filenames.',
|
|
51
57
|
};
|
|
52
58
|
// ── Error class ──────────────────────────────────────────
|
package/dist/setup/openclaw.d.ts
CHANGED
|
@@ -20,6 +20,22 @@ export declare function isDockerEnvironment(): boolean;
|
|
|
20
20
|
* Creates the hooks/ subdirectory if the parent config dir exists.
|
|
21
21
|
*/
|
|
22
22
|
export declare function findAllHooksDirs(): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Pure idempotency check for the openclaw.json plugin registration.
|
|
25
|
+
*
|
|
26
|
+
* Returns true if the config needs to be rewritten — i.e. ANY of the
|
|
27
|
+
* load-bearing fields differ from the desired state. Returns false when
|
|
28
|
+
* the config already matches and a re-install would otherwise produce a
|
|
29
|
+
* no-op write (which churned the gateway's config-watcher every
|
|
30
|
+
* `shieldcortex openclaw install` pre-v4.12.11).
|
|
31
|
+
*
|
|
32
|
+
* Intentionally treats `installedAt` as transient — only differing on
|
|
33
|
+
* that field does NOT force a write, otherwise this function would
|
|
34
|
+
* always trip on its own previous timestamp.
|
|
35
|
+
*
|
|
36
|
+
* Exported for direct unit testing without booting the full installer.
|
|
37
|
+
*/
|
|
38
|
+
export declare function pluginInstallNeedsWrite(config: unknown, pluginId: string, installDir: string, version: string): boolean;
|
|
23
39
|
/**
|
|
24
40
|
* Install options for `shieldcortex openclaw install`.
|
|
25
41
|
*/
|
package/dist/setup/openclaw.js
CHANGED
|
@@ -255,9 +255,19 @@ function detectLegacyHookVariants(hooksDir) {
|
|
|
255
255
|
}
|
|
256
256
|
// ==================== Cleanup Legacy Plugin ====================
|
|
257
257
|
/**
|
|
258
|
-
* Remove
|
|
259
|
-
*
|
|
260
|
-
* that caused OpenClaw config validation
|
|
258
|
+
* Remove genuinely-legacy plugin registration shapes from openclaw.json.
|
|
259
|
+
*
|
|
260
|
+
* The only known legacy shape that caused OpenClaw config validation
|
|
261
|
+
* errors was `plugins.allow` entries containing full file paths to the
|
|
262
|
+
* plugin (pre-v2026.3 format) rather than the bare plugin id. This
|
|
263
|
+
* function strips those.
|
|
264
|
+
*
|
|
265
|
+
* v4.12.11 — used to also unconditionally delete
|
|
266
|
+
* `plugins.entries['shieldcortex-realtime']` here. That key holds the
|
|
267
|
+
* CURRENT-format registration (`{ enabled: true }`) that `trustLocalPlugin`
|
|
268
|
+
* writes; deleting it on every install meant `trustLocalPlugin`'s
|
|
269
|
+
* idempotency check always saw a missing entry and re-wrote the file —
|
|
270
|
+
* defeating the v4.12.11 idempotency fix entirely. Removed.
|
|
261
271
|
*/
|
|
262
272
|
function cleanupLegacyPlugin() {
|
|
263
273
|
const home = resolveUserHome();
|
|
@@ -268,13 +278,6 @@ function cleanupLegacyPlugin() {
|
|
|
268
278
|
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
269
279
|
const config = JSON.parse(raw);
|
|
270
280
|
let changed = false;
|
|
271
|
-
// Remove legacy entries (old format before native installs)
|
|
272
|
-
if (config.plugins?.entries?.['shieldcortex-realtime']) {
|
|
273
|
-
delete config.plugins.entries['shieldcortex-realtime'];
|
|
274
|
-
if (Object.keys(config.plugins.entries).length === 0)
|
|
275
|
-
delete config.plugins.entries;
|
|
276
|
-
changed = true;
|
|
277
|
-
}
|
|
278
281
|
// Remove stale full-path entries from plugins.allow
|
|
279
282
|
// (pre-v2026.3 format used raw file paths instead of plugin IDs)
|
|
280
283
|
if (Array.isArray(config.plugins?.allow)) {
|
|
@@ -297,6 +300,45 @@ function cleanupLegacyPlugin() {
|
|
|
297
300
|
function openClawConfigPath() {
|
|
298
301
|
return path.join(resolveUserHome(), '.openclaw', 'openclaw.json');
|
|
299
302
|
}
|
|
303
|
+
/**
|
|
304
|
+
* Pure idempotency check for the openclaw.json plugin registration.
|
|
305
|
+
*
|
|
306
|
+
* Returns true if the config needs to be rewritten — i.e. ANY of the
|
|
307
|
+
* load-bearing fields differ from the desired state. Returns false when
|
|
308
|
+
* the config already matches and a re-install would otherwise produce a
|
|
309
|
+
* no-op write (which churned the gateway's config-watcher every
|
|
310
|
+
* `shieldcortex openclaw install` pre-v4.12.11).
|
|
311
|
+
*
|
|
312
|
+
* Intentionally treats `installedAt` as transient — only differing on
|
|
313
|
+
* that field does NOT force a write, otherwise this function would
|
|
314
|
+
* always trip on its own previous timestamp.
|
|
315
|
+
*
|
|
316
|
+
* Exported for direct unit testing without booting the full installer.
|
|
317
|
+
*/
|
|
318
|
+
export function pluginInstallNeedsWrite(config, pluginId, installDir, version) {
|
|
319
|
+
if (!config || typeof config !== 'object')
|
|
320
|
+
return true;
|
|
321
|
+
const c = config;
|
|
322
|
+
if (!c.plugins || typeof c.plugins !== 'object')
|
|
323
|
+
return true;
|
|
324
|
+
const plugins = c.plugins;
|
|
325
|
+
const install = plugins.installs?.[pluginId];
|
|
326
|
+
if (!install || typeof install !== 'object')
|
|
327
|
+
return true;
|
|
328
|
+
const i = install;
|
|
329
|
+
if (i.source !== 'path' || i.installPath !== installDir || i.version !== version)
|
|
330
|
+
return true;
|
|
331
|
+
const allow = Array.isArray(plugins.allow) ? plugins.allow : [];
|
|
332
|
+
if (!allow.includes(pluginId))
|
|
333
|
+
return true;
|
|
334
|
+
const hasStale = allow.some((e) => typeof e === 'string' && e !== pluginId && e.includes(pluginId));
|
|
335
|
+
if (hasStale)
|
|
336
|
+
return true;
|
|
337
|
+
const entries = plugins.entries ?? {};
|
|
338
|
+
if (!entries[pluginId])
|
|
339
|
+
return true;
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
300
342
|
function trustLocalPlugin(installDir, version) {
|
|
301
343
|
const configPath = openClawConfigPath();
|
|
302
344
|
const configDir = path.dirname(configPath);
|
|
@@ -307,6 +349,13 @@ function trustLocalPlugin(installDir, version) {
|
|
|
307
349
|
}
|
|
308
350
|
const raw = fs.existsSync(configPath) ? fs.readFileSync(configPath, 'utf-8') : '{}';
|
|
309
351
|
const config = JSON.parse(raw);
|
|
352
|
+
// Idempotency: skip the write if everything is already correct.
|
|
353
|
+
// This stops `shieldcortex openclaw install` (and postinstall.mjs's
|
|
354
|
+
// auto-refresh) from bumping a fresh installedAt timestamp on every
|
|
355
|
+
// invocation when nothing has actually changed.
|
|
356
|
+
if (!pluginInstallNeedsWrite(config, pluginId, installDir, version)) {
|
|
357
|
+
return true;
|
|
358
|
+
}
|
|
310
359
|
const plugins = typeof config.plugins === 'object' && config.plugins !== null ? config.plugins : {};
|
|
311
360
|
const allow = Array.isArray(plugins.allow)
|
|
312
361
|
? (plugins.allow ?? [])
|
|
@@ -316,15 +365,18 @@ function trustLocalPlugin(installDir, version) {
|
|
|
316
365
|
if (!cleaned.includes(pluginId)) {
|
|
317
366
|
cleaned.push(pluginId);
|
|
318
367
|
}
|
|
319
|
-
//
|
|
368
|
+
// Preserve the existing installedAt if present — we only land here
|
|
369
|
+
// when something genuine changed, but if the existing entry's path
|
|
370
|
+
// was wrong (say) we don't need to invent a new install timestamp.
|
|
320
371
|
const installs = typeof plugins.installs === 'object' && plugins.installs !== null
|
|
321
372
|
? plugins.installs
|
|
322
373
|
: {};
|
|
374
|
+
const existingInstall = installs[pluginId];
|
|
323
375
|
installs[pluginId] = {
|
|
324
376
|
source: 'path',
|
|
325
377
|
installPath: installDir,
|
|
326
378
|
version,
|
|
327
|
-
installedAt: new Date().toISOString(),
|
|
379
|
+
installedAt: existingInstall?.installedAt ?? new Date().toISOString(),
|
|
328
380
|
};
|
|
329
381
|
// Add entries to enable the plugin
|
|
330
382
|
const entries = typeof plugins.entries === 'object' && plugins.entries !== null
|
|
@@ -598,17 +650,28 @@ function uninstallPlugin() {
|
|
|
598
650
|
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
599
651
|
const config = JSON.parse(raw);
|
|
600
652
|
const pluginId = PLUGIN_DIR_NAME;
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
653
|
+
// Idempotency: only write the config if there's actually something
|
|
654
|
+
// to remove. Pre-v4.12.11 this rewrote openclaw.json every time
|
|
655
|
+
// even when no SC entries existed (e.g. a re-run of `uninstall
|
|
656
|
+
// --deep` after a previous successful uninstall).
|
|
657
|
+
const allowHasIt = Array.isArray(config.plugins?.allow)
|
|
658
|
+
&& config.plugins.allow.some((e) => typeof e === 'string' && e.includes(pluginId));
|
|
659
|
+
const installsHasIt = !!config.plugins?.installs?.[pluginId];
|
|
660
|
+
const entriesHasIt = !!config.plugins?.entries?.[pluginId];
|
|
661
|
+
const needsWrite = allowHasIt || installsHasIt || entriesHasIt;
|
|
662
|
+
if (needsWrite) {
|
|
663
|
+
if (Array.isArray(config.plugins?.allow)) {
|
|
664
|
+
// Remove both old file-path entries and new short-name entries
|
|
665
|
+
config.plugins.allow = config.plugins.allow.filter((entry) => !entry.includes(pluginId));
|
|
666
|
+
}
|
|
667
|
+
if (config.plugins?.installs?.[pluginId]) {
|
|
668
|
+
delete config.plugins.installs[pluginId];
|
|
669
|
+
}
|
|
670
|
+
if (config.plugins?.entries?.[pluginId]) {
|
|
671
|
+
delete config.plugins.entries[pluginId];
|
|
672
|
+
}
|
|
673
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
610
674
|
}
|
|
611
|
-
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
612
675
|
}
|
|
613
676
|
fs.rmSync(destDir, { recursive: true });
|
|
614
677
|
console.log(`Removed real-time plugin from ${destDir}`);
|
|
@@ -13,6 +13,20 @@
|
|
|
13
13
|
export declare function requireConfirmation(action: string): Promise<boolean>;
|
|
14
14
|
export declare function removeHooks(): void;
|
|
15
15
|
export declare function removeClaudeMdBlock(): void;
|
|
16
|
+
/**
|
|
17
|
+
* Remove the ShieldCortex MCP server entry from ~/.claude.json.
|
|
18
|
+
*
|
|
19
|
+
* Pre-v4.12.11 uninstall left this entry in place. Every Claude Code
|
|
20
|
+
* session then tried to spawn the now-missing shieldcortex binary, and
|
|
21
|
+
* the failure cascaded into fleet-wide context loss — confirmed by a
|
|
22
|
+
* peer agent (Edith) who saw an affected host stabilise within minutes
|
|
23
|
+
* after manually removing the entry.
|
|
24
|
+
*
|
|
25
|
+
* Safe: only deletes entries that look ShieldCortex-owned. No-op if the
|
|
26
|
+
* file is missing, JSON is malformed, the entry is absent, or the entry
|
|
27
|
+
* belongs to another MCP server.
|
|
28
|
+
*/
|
|
29
|
+
export declare function removeMcpEntry(): void;
|
|
16
30
|
export declare function uninstallSetup(): Promise<void>;
|
|
17
31
|
export declare function uninstallAll(options?: {
|
|
18
32
|
keepLogs?: boolean;
|
package/dist/setup/uninstall.js
CHANGED
|
@@ -128,6 +128,65 @@ export function removeClaudeMdBlock() {
|
|
|
128
128
|
fs.writeFileSync(CLAUDE_MD_PATH, newContent, 'utf-8');
|
|
129
129
|
console.log('CLAUDE.md: removed ShieldCortex memory instructions block.');
|
|
130
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Ownership check: an mcpServers entry "looks like ShieldCortex" if its
|
|
133
|
+
* command path or args contain a shieldcortex / shield-cortex token.
|
|
134
|
+
* `mcpServers.memory` is a generic key — the official upstream
|
|
135
|
+
* `@modelcontextprotocol/server-memory` registers under the same name —
|
|
136
|
+
* so we MUST verify ownership before deletion or risk clobbering an
|
|
137
|
+
* unrelated MCP server the user installed.
|
|
138
|
+
*/
|
|
139
|
+
function looksLikeShieldcortex(entry) {
|
|
140
|
+
if (!entry || typeof entry !== 'object')
|
|
141
|
+
return false;
|
|
142
|
+
const e = entry;
|
|
143
|
+
const tokens = [];
|
|
144
|
+
if (typeof e.command === 'string')
|
|
145
|
+
tokens.push(e.command);
|
|
146
|
+
if (Array.isArray(e.args))
|
|
147
|
+
for (const a of e.args)
|
|
148
|
+
if (typeof a === 'string')
|
|
149
|
+
tokens.push(a);
|
|
150
|
+
return tokens.some((t) => /shield[-]?cortex/i.test(t));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Remove the ShieldCortex MCP server entry from ~/.claude.json.
|
|
154
|
+
*
|
|
155
|
+
* Pre-v4.12.11 uninstall left this entry in place. Every Claude Code
|
|
156
|
+
* session then tried to spawn the now-missing shieldcortex binary, and
|
|
157
|
+
* the failure cascaded into fleet-wide context loss — confirmed by a
|
|
158
|
+
* peer agent (Edith) who saw an affected host stabilise within minutes
|
|
159
|
+
* after manually removing the entry.
|
|
160
|
+
*
|
|
161
|
+
* Safe: only deletes entries that look ShieldCortex-owned. No-op if the
|
|
162
|
+
* file is missing, JSON is malformed, the entry is absent, or the entry
|
|
163
|
+
* belongs to another MCP server.
|
|
164
|
+
*/
|
|
165
|
+
export function removeMcpEntry() {
|
|
166
|
+
const mcpPath = path.join(os.homedir(), '.claude.json');
|
|
167
|
+
if (!fs.existsSync(mcpPath))
|
|
168
|
+
return;
|
|
169
|
+
let config;
|
|
170
|
+
try {
|
|
171
|
+
config = JSON.parse(fs.readFileSync(mcpPath, 'utf-8'));
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
console.warn(`MCP: could not parse ~/.claude.json — leaving it untouched: ${err.message}`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const entry = config?.mcpServers?.memory;
|
|
178
|
+
if (!entry) {
|
|
179
|
+
console.log('MCP: no shieldcortex entry found in ~/.claude.json.');
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (!looksLikeShieldcortex(entry)) {
|
|
183
|
+
console.warn('MCP: ~/.claude.json mcpServers.memory does not look ShieldCortex-owned — leaving it alone.');
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
delete config.mcpServers.memory;
|
|
187
|
+
fs.writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
188
|
+
console.log('MCP: removed shieldcortex entry from ~/.claude.json.');
|
|
189
|
+
}
|
|
131
190
|
export async function uninstallSetup() {
|
|
132
191
|
if (blockAgentUninstall())
|
|
133
192
|
return;
|
|
@@ -149,6 +208,12 @@ export async function uninstallSetup() {
|
|
|
149
208
|
catch (err) {
|
|
150
209
|
console.error(`Failed to remove CLAUDE.md block: ${err.message}`);
|
|
151
210
|
}
|
|
211
|
+
try {
|
|
212
|
+
removeMcpEntry();
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
console.error(`Failed to remove MCP entry: ${err.message}`);
|
|
216
|
+
}
|
|
152
217
|
console.log('\nSetup removal complete.');
|
|
153
218
|
}
|
|
154
219
|
export async function uninstallAll(options) {
|
|
@@ -191,7 +256,17 @@ export async function uninstallAll(options) {
|
|
|
191
256
|
catch (err) {
|
|
192
257
|
console.error(`Failed to remove CLAUDE.md block: ${err.message}`);
|
|
193
258
|
}
|
|
194
|
-
// 5.
|
|
259
|
+
// 5. Remove the MCP entry from ~/.claude.json. This is THE
|
|
260
|
+
// pre-v4.12.11 context-killer — every Claude Code session loaded
|
|
261
|
+
// the orphaned entry, tried to spawn the missing binary, and the
|
|
262
|
+
// failure cascaded into context loss across the fleet.
|
|
263
|
+
try {
|
|
264
|
+
removeMcpEntry();
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
console.error(`Failed to remove MCP entry: ${err.message}`);
|
|
268
|
+
}
|
|
269
|
+
// 6. Deep clean: purge all known OpenClaw residue locations that the
|
|
195
270
|
// version-specific uninstall paths miss, then (best-effort) restart
|
|
196
271
|
// the gateway so the purged config takes effect immediately.
|
|
197
272
|
if (options?.deep) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shieldcortex",
|
|
3
|
-
"version": "4.12.
|
|
3
|
+
"version": "4.12.12",
|
|
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",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"scripts": {
|
|
44
44
|
"postinstall": "node scripts/postinstall.mjs",
|
|
45
45
|
"build:ts": "node -e \"fs.rmSync('dist', { recursive: true, force: true }); fs.rmSync('plugins/openclaw/dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json && tsc -p tsconfig.openclaw-plugin.json && cp plugins/openclaw/openclaw.plugin.json plugins/openclaw/dist/ && cp src/database/schema.sql dist/database/",
|
|
46
|
+
"postbuild:ts": "node scripts/ensure-bin-executable.mjs",
|
|
46
47
|
"bootstrap:dashboard": "node -e \"if (!require('fs').existsSync('dashboard/node_modules')) { process.exit(1); }\" || (cd dashboard && npm ci --no-audit --no-fund)",
|
|
47
48
|
"build:dashboard": "npm run bootstrap:dashboard && cd dashboard && npm run build && (cp -r .next/static .next/standalone/dashboard/.next/ 2>/dev/null || true) && (cp -r public .next/standalone/dashboard/ 2>/dev/null || true) && cd .. && node scripts/prune-dashboard-standalone.mjs",
|
|
48
49
|
"build": "npm run build:ts && npm run build:dashboard",
|
|
@@ -57,6 +58,7 @@
|
|
|
57
58
|
"test:watch": "node scripts/run-jest.mjs --watch",
|
|
58
59
|
"test:coverage": "node scripts/run-jest.mjs --coverage",
|
|
59
60
|
"audit:security": "npm audit --audit-level=moderate",
|
|
61
|
+
"prepack": "node scripts/ensure-bin-executable.mjs",
|
|
60
62
|
"prepublishOnly": "npm run build"
|
|
61
63
|
},
|
|
62
64
|
"keywords": [
|
|
@@ -139,6 +141,7 @@
|
|
|
139
141
|
"hooks/openclaw",
|
|
140
142
|
"plugins/openclaw/dist",
|
|
141
143
|
"scripts/postinstall.mjs",
|
|
144
|
+
"scripts/ensure-bin-executable.mjs",
|
|
142
145
|
"scripts/pre-compact-hook.mjs",
|
|
143
146
|
"scripts/run-jest.mjs",
|
|
144
147
|
"scripts/session-end-hook.mjs",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "shieldcortex-realtime",
|
|
3
|
-
"version": "4.12.
|
|
3
|
+
"version": "4.12.12",
|
|
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,
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { chmodSync, existsSync, statSync } from 'fs';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
|
|
6
|
+
const entrypoint = join(process.cwd(), 'dist', 'index.js');
|
|
7
|
+
|
|
8
|
+
if (!existsSync(entrypoint)) {
|
|
9
|
+
console.error('[ensure-bin-executable] Missing dist/index.js. Run npm run build:ts first.');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const currentMode = statSync(entrypoint).mode;
|
|
14
|
+
const executableMode = currentMode | 0o755;
|
|
15
|
+
|
|
16
|
+
chmodSync(entrypoint, executableMode);
|
|
17
|
+
|