shieldcortex 4.15.0 → 4.16.0
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 +4 -0
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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/migrate-legacy.d.ts +18 -0
- package/dist/cli/migrate-legacy.js +96 -0
- package/dist/database/init.js +21 -0
- package/dist/database/schema.sql +1 -0
- package/dist/database/seed-firewall-rules.d.ts +21 -0
- package/dist/database/seed-firewall-rules.js +105 -0
- package/dist/defence/custom-rules/store.d.ts +4 -1
- package/dist/defence/custom-rules/store.js +7 -3
- package/dist/defence/firewall/instruction-detector.js +15 -0
- package/dist/defence/pipeline.js +19 -13
- package/dist/defence/types.d.ts +1 -1
- package/hooks/openclaw/cortex-memory/HOOK.md +37 -0
- package/package.json +1 -1
- package/plugins/openclaw/dist/openclaw.plugin.json +1 -1
- package/scripts/lib/extract-memorable-segments.mjs +555 -0
- package/scripts/lib/save-memory.mjs +198 -13
- package/scripts/pre-compact-hook.mjs +19 -375
- package/scripts/session-end-hook.mjs +16 -307
- package/scripts/stop-hook.mjs +28 -159
- /package/dashboard/.next/standalone/dashboard/.next/static/{10a_MRwbHFUuDdfr86RUu → 6WjF0Utj3STrFgg7vZVPK}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{10a_MRwbHFUuDdfr86RUu → 6WjF0Utj3STrFgg7vZVPK}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{10a_MRwbHFUuDdfr86RUu → 6WjF0Utj3STrFgg7vZVPK}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--6WjF0Utj3STrFgg7vZVPK--><html lang="en" class="dark" data-theme="terminal"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/2473c16c0c2f6b5f.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/bf725d638cce46d4.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/d878b929b21636c4.js"/><script src="/_next/static/chunks/d9ad4c35fc865415.js" async=""></script><script src="/_next/static/chunks/43d761df92da7cb6.js" async=""></script><script src="/_next/static/chunks/e281719dbabcca1d.js" async=""></script><script src="/_next/static/chunks/9e56d1f8f4d7adcb.js" async=""></script><script src="/_next/static/chunks/turbopack-79214717b23f7452.js" async=""></script><script src="/_next/static/chunks/4ddb24d8ce3b8617.js" async=""></script><script src="/_next/static/chunks/417032eeb2cd875f.js" async=""></script><script src="/_next/static/chunks/d334b69bff7779be.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>ShieldCortex</title><meta name="description" content="AI Memory Security Dashboard — Defence pipeline, audit logs, quarantine review"/><script>
|
|
2
2
|
try {
|
|
3
3
|
var t = localStorage.getItem('sc-theme');
|
|
4
4
|
if (t !== 'glass' && t !== 'terminal') t = 'terminal';
|
|
@@ -6,4 +6,4 @@ try {
|
|
|
6
6
|
} catch (e) {
|
|
7
7
|
document.documentElement.dataset.theme = 'terminal';
|
|
8
8
|
}
|
|
9
|
-
</script><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased bg-slate-950"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[36111,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"Providers\"]\n3:I[57043,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[10445,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\",\"/_next/static/chunks/d334b69bff7779be.js\"],\"default\"]\n5:I[27657,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n6:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\n9:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\nb:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nd:I[30687,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n:HL[\"/_next/static/chunks/2473c16c0c2f6b5f.css\",\"style\"]\n:HL[\"/_next/static/chunks/bf725d638cce46d4.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"
|
|
9
|
+
</script><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased bg-slate-950"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[36111,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"Providers\"]\n3:I[57043,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[10445,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\",\"/_next/static/chunks/d334b69bff7779be.js\"],\"default\"]\n5:I[27657,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n6:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\n9:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\nb:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nd:I[30687,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n:HL[\"/_next/static/chunks/2473c16c0c2f6b5f.css\",\"style\"]\n:HL[\"/_next/static/chunks/bf725d638cce46d4.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"6WjF0Utj3STrFgg7vZVPK\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2473c16c0c2f6b5f.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/bf725d638cce46d4.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/417032eeb2cd875f.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"data-theme\":\"terminal\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\ntry {\\n var t = localStorage.getItem('sc-theme');\\n if (t !== 'glass' \u0026\u0026 t !== 'terminal') t = 'terminal';\\n document.documentElement.dataset.theme = t;\\n} catch (e) {\\n document.documentElement.dataset.theme = 'terminal';\\n}\\n\"}}]}],[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased bg-slate-950\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$4\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/d334b69bff7779be.js\",\"async\":true}]],\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"8:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"ShieldCortex\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"AI Memory Security Dashboard — Defence pipeline, audit logs, quarantine review\"}]]\n"])</script></body></html>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
2
|
-
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57043,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n3:I[27657,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\n9:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nb:I[30687,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"
|
|
1
|
+
<!DOCTYPE html><!--6WjF0Utj3STrFgg7vZVPK--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/d878b929b21636c4.js"/><script src="/_next/static/chunks/d9ad4c35fc865415.js" async=""></script><script src="/_next/static/chunks/43d761df92da7cb6.js" async=""></script><script src="/_next/static/chunks/e281719dbabcca1d.js" async=""></script><script src="/_next/static/chunks/9e56d1f8f4d7adcb.js" async=""></script><script src="/_next/static/chunks/turbopack-79214717b23f7452.js" async=""></script><script src="/_next/static/chunks/102f894cc892994d.js" async=""></script><script src="/_next/static/chunks/417032eeb2cd875f.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
|
|
2
|
+
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57043,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n3:I[27657,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\n9:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nb:I[30687,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"6WjF0Utj3STrFgg7vZVPK\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/102f894cc892994d.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/417032eeb2cd875f.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"
|
|
1
|
+
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"50IBPSPmdPYtE7HYOD5EnTtXGu3VRtn/m36sitpikkw=\"\n}"
|
|
@@ -25,6 +25,24 @@ interface MigrationReport {
|
|
|
25
25
|
}
|
|
26
26
|
export declare function migrateLegacy(options?: MigrateOptions): MigrationReport;
|
|
27
27
|
export declare function handleMemoriesCommand(args: string[]): Promise<void>;
|
|
28
|
+
interface PurgeMalformedOptions {
|
|
29
|
+
dbPath?: string;
|
|
30
|
+
backupDir?: string;
|
|
31
|
+
dryRun: boolean;
|
|
32
|
+
}
|
|
33
|
+
interface PurgeMatch {
|
|
34
|
+
id: number;
|
|
35
|
+
title: string;
|
|
36
|
+
reason: string;
|
|
37
|
+
}
|
|
38
|
+
interface PurgeReport {
|
|
39
|
+
dryRun: boolean;
|
|
40
|
+
scanned: number;
|
|
41
|
+
matched: PurgeMatch[];
|
|
42
|
+
deleted: number;
|
|
43
|
+
backupPath?: string;
|
|
44
|
+
}
|
|
45
|
+
export declare function purgeMalformed(opts: PurgeMalformedOptions): Promise<PurgeReport>;
|
|
28
46
|
interface RepairOptions {
|
|
29
47
|
/** Path to memories.db (defaults to ~/.shieldcortex/memories.db) */
|
|
30
48
|
dbPath?: string;
|
|
@@ -275,6 +275,15 @@ function printUsage() {
|
|
|
275
275
|
console.log(' to their canonical owner-repo key (#42). DRY-RUN BY DEFAULT.');
|
|
276
276
|
console.log(' Backup auto-saved before any rewrite; per-rewrite log written');
|
|
277
277
|
console.log(' to ~/.shieldcortex/logs/project-key-repair-<ts>.json.');
|
|
278
|
+
console.log('');
|
|
279
|
+
console.log(' purge --malformed [--dry-run] [--execute]');
|
|
280
|
+
console.log(' [--backup-dir <path>]');
|
|
281
|
+
console.log(' Scan the memories table and delete rows that match the');
|
|
282
|
+
console.log(' hardened chunker rejection rules — imperative tool-call');
|
|
283
|
+
console.log(' directives, bare-imperative starts (negation drop), email-');
|
|
284
|
+
console.log(' body bleed, path-label fragments, etc. Use --dry-run to');
|
|
285
|
+
console.log(' preview matches; --execute writes a full DB copy to the');
|
|
286
|
+
console.log(' backup dir (default ~/.shieldcortex/backups/) before delete.');
|
|
278
287
|
}
|
|
279
288
|
export async function handleMemoriesCommand(args) {
|
|
280
289
|
const sub = args[0];
|
|
@@ -300,9 +309,96 @@ export async function handleMemoriesCommand(args) {
|
|
|
300
309
|
await runRepairProjectKeys(args.slice(1));
|
|
301
310
|
return;
|
|
302
311
|
}
|
|
312
|
+
if (sub === 'purge') {
|
|
313
|
+
await runPurge(args.slice(1));
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
303
316
|
printUsage();
|
|
304
317
|
process.exit(1);
|
|
305
318
|
}
|
|
319
|
+
export async function purgeMalformed(opts) {
|
|
320
|
+
const dbPath = opts.dbPath ?? DEFAULT_TARGET;
|
|
321
|
+
const backupDir = opts.backupDir ?? path.join(os.homedir(), '.shieldcortex', 'backups');
|
|
322
|
+
if (!fs.existsSync(dbPath)) {
|
|
323
|
+
throw new Error(`memories DB not found at ${dbPath}`);
|
|
324
|
+
}
|
|
325
|
+
// @ts-expect-error -- importing a .mjs hook util
|
|
326
|
+
const mod = await import('../../scripts/lib/extract-memorable-segments.mjs');
|
|
327
|
+
const shouldRejectCandidate = mod.shouldRejectCandidate;
|
|
328
|
+
const db = new Database(dbPath);
|
|
329
|
+
db.pragma('busy_timeout = 10000');
|
|
330
|
+
const matches = [];
|
|
331
|
+
let scanned = 0;
|
|
332
|
+
try {
|
|
333
|
+
const rows = db.prepare('SELECT id, title, content FROM memories').all();
|
|
334
|
+
scanned = rows.length;
|
|
335
|
+
for (const row of rows) {
|
|
336
|
+
const verdict = shouldRejectCandidate({ title: row.title ?? '', content: row.content ?? '' });
|
|
337
|
+
if (verdict.rejected) {
|
|
338
|
+
matches.push({ id: row.id, title: row.title ?? '', reason: verdict.reason });
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
const report = {
|
|
342
|
+
dryRun: opts.dryRun,
|
|
343
|
+
scanned,
|
|
344
|
+
matched: matches,
|
|
345
|
+
deleted: 0,
|
|
346
|
+
};
|
|
347
|
+
if (opts.dryRun || matches.length === 0) {
|
|
348
|
+
return report;
|
|
349
|
+
}
|
|
350
|
+
// Write a full DB backup before any delete.
|
|
351
|
+
fs.mkdirSync(backupDir, { recursive: true });
|
|
352
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
353
|
+
const backupPath = path.join(backupDir, `memories-purge-${stamp}.db`);
|
|
354
|
+
db.exec(`VACUUM INTO '${backupPath.replace(/'/g, "''")}'`);
|
|
355
|
+
report.backupPath = backupPath;
|
|
356
|
+
const placeholders = matches.map(() => '?').join(',');
|
|
357
|
+
const txn = db.transaction(() => {
|
|
358
|
+
const r = db.prepare(`DELETE FROM memories WHERE id IN (${placeholders})`).run(...matches.map(m => m.id));
|
|
359
|
+
report.deleted = r.changes;
|
|
360
|
+
});
|
|
361
|
+
txn();
|
|
362
|
+
return report;
|
|
363
|
+
}
|
|
364
|
+
finally {
|
|
365
|
+
db.close();
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
async function runPurge(args) {
|
|
369
|
+
if (!args.includes('--malformed')) {
|
|
370
|
+
console.error('Usage: shieldcortex memories purge --malformed [--dry-run] [--execute] [--backup-dir <path>]');
|
|
371
|
+
process.exit(1);
|
|
372
|
+
}
|
|
373
|
+
// Default to dry-run unless --execute is explicitly passed. --dry-run is
|
|
374
|
+
// accepted for symmetry / scriptability.
|
|
375
|
+
const execute = args.includes('--execute');
|
|
376
|
+
const dryRun = !execute;
|
|
377
|
+
const backupDir = flagValue(args, '--backup-dir');
|
|
378
|
+
const report = await purgeMalformed({ dryRun, backupDir });
|
|
379
|
+
const banner = report.dryRun ? '[DRY RUN] ' : '';
|
|
380
|
+
console.log(`${banner}Scanned ${report.scanned} memories; flagged ${report.matched.length}.`);
|
|
381
|
+
if (report.matched.length > 0) {
|
|
382
|
+
console.log('');
|
|
383
|
+
console.log('Matches:');
|
|
384
|
+
for (const m of report.matched.slice(0, 50)) {
|
|
385
|
+
console.log(` #${String(m.id).padStart(5)} ${m.reason.padEnd(28)} ${m.title.slice(0, 80)}`);
|
|
386
|
+
}
|
|
387
|
+
if (report.matched.length > 50) {
|
|
388
|
+
console.log(` … and ${report.matched.length - 50} more`);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
if (report.dryRun && report.matched.length > 0) {
|
|
392
|
+
console.log('');
|
|
393
|
+
console.log('Re-run with --execute to delete (a full DB backup is written first).');
|
|
394
|
+
}
|
|
395
|
+
else if (!report.dryRun) {
|
|
396
|
+
console.log('');
|
|
397
|
+
console.log(`Deleted: ${report.deleted}`);
|
|
398
|
+
if (report.backupPath)
|
|
399
|
+
console.log(`Backup: ${report.backupPath}`);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
306
402
|
function parseMapFlags(args) {
|
|
307
403
|
const map = {};
|
|
308
404
|
for (let i = 0; i < args.length; i++) {
|
package/dist/database/init.js
CHANGED
|
@@ -8,6 +8,7 @@ import { homedir } from 'os';
|
|
|
8
8
|
import { fileURLToPath } from 'url';
|
|
9
9
|
import { execSync } from 'child_process';
|
|
10
10
|
import { randomUUID } from 'crypto';
|
|
11
|
+
import { seedDefaultFirewallRules } from './seed-firewall-rules.js';
|
|
11
12
|
const _currentFile = fileURLToPath(import.meta.url);
|
|
12
13
|
const _currentDir = dirname(_currentFile);
|
|
13
14
|
let db = null;
|
|
@@ -907,10 +908,12 @@ function runMigrations(database) {
|
|
|
907
908
|
condition_value TEXT NOT NULL,
|
|
908
909
|
action TEXT NOT NULL CHECK(action IN ('block', 'allow', 'quarantine')),
|
|
909
910
|
enabled INTEGER NOT NULL DEFAULT 1,
|
|
911
|
+
built_in INTEGER NOT NULL DEFAULT 0,
|
|
910
912
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
911
913
|
);
|
|
912
914
|
CREATE INDEX IF NOT EXISTS idx_firewall_rules_priority ON firewall_rules(priority);
|
|
913
915
|
CREATE INDEX IF NOT EXISTS idx_firewall_rules_enabled ON firewall_rules(enabled);
|
|
916
|
+
CREATE INDEX IF NOT EXISTS idx_firewall_rules_built_in ON firewall_rules(built_in);
|
|
914
917
|
|
|
915
918
|
CREATE TABLE IF NOT EXISTS rate_limits (
|
|
916
919
|
source_key TEXT PRIMARY KEY,
|
|
@@ -922,6 +925,24 @@ function runMigrations(database) {
|
|
|
922
925
|
catch {
|
|
923
926
|
// Tables may already exist - safe to ignore
|
|
924
927
|
}
|
|
928
|
+
// Migration: built_in column on pre-existing firewall_rules (added in v4.15)
|
|
929
|
+
try {
|
|
930
|
+
const cols = database.prepare("PRAGMA table_info(firewall_rules)").all();
|
|
931
|
+
if (!cols.some(c => c.name === 'built_in')) {
|
|
932
|
+
database.exec('ALTER TABLE firewall_rules ADD COLUMN built_in INTEGER NOT NULL DEFAULT 0');
|
|
933
|
+
database.exec('CREATE INDEX IF NOT EXISTS idx_firewall_rules_built_in ON firewall_rules(built_in)');
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
catch {
|
|
937
|
+
// Best-effort migration; pipeline handles missing column gracefully.
|
|
938
|
+
}
|
|
939
|
+
// Seed default built-in firewall rules on first init.
|
|
940
|
+
try {
|
|
941
|
+
seedDefaultFirewallRules(database);
|
|
942
|
+
}
|
|
943
|
+
catch {
|
|
944
|
+
// Seeder runs idempotently; failures here should never block startup.
|
|
945
|
+
}
|
|
925
946
|
}
|
|
926
947
|
/**
|
|
927
948
|
* Get the current database instance
|
package/dist/database/schema.sql
CHANGED
|
@@ -301,6 +301,7 @@ CREATE TABLE IF NOT EXISTS firewall_rules (
|
|
|
301
301
|
condition_value TEXT NOT NULL,
|
|
302
302
|
action TEXT NOT NULL CHECK(action IN ('block', 'allow', 'quarantine')),
|
|
303
303
|
enabled INTEGER NOT NULL DEFAULT 1,
|
|
304
|
+
built_in INTEGER NOT NULL DEFAULT 0,
|
|
304
305
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
305
306
|
);
|
|
306
307
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default firewall rule seeder.
|
|
3
|
+
*
|
|
4
|
+
* The `firewall_rules` table starts empty in production. The defence
|
|
5
|
+
* pipeline's PATTERN_GROUPS catch most threats inline (instruction
|
|
6
|
+
* injection, hidden instructions, etc.), but seeding the table with
|
|
7
|
+
* built-in rules makes them visible in the dashboard and gives operators
|
|
8
|
+
* a place to disable, edit, or extend them.
|
|
9
|
+
*
|
|
10
|
+
* Built-in rows are marked `built_in=1` and excluded from the user
|
|
11
|
+
* `MAX_RULES=25` cap (see custom-rules/store.ts). They are evaluated
|
|
12
|
+
* regardless of license tier — the Pro `custom_firewall_rules` gate
|
|
13
|
+
* applies only to user-added rules with `built_in=0`.
|
|
14
|
+
*
|
|
15
|
+
* Idempotent: running the seeder again is a no-op when built-in rules
|
|
16
|
+
* are already present. Operators wanting to re-seed after a built-in
|
|
17
|
+
* update should `DELETE FROM firewall_rules WHERE built_in = 1` first.
|
|
18
|
+
*/
|
|
19
|
+
import type Database from 'better-sqlite3';
|
|
20
|
+
export declare function seedDefaultFirewallRules(db: Database.Database): void;
|
|
21
|
+
export declare function listBuiltInRuleNames(): string[];
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default firewall rule seeder.
|
|
3
|
+
*
|
|
4
|
+
* The `firewall_rules` table starts empty in production. The defence
|
|
5
|
+
* pipeline's PATTERN_GROUPS catch most threats inline (instruction
|
|
6
|
+
* injection, hidden instructions, etc.), but seeding the table with
|
|
7
|
+
* built-in rules makes them visible in the dashboard and gives operators
|
|
8
|
+
* a place to disable, edit, or extend them.
|
|
9
|
+
*
|
|
10
|
+
* Built-in rows are marked `built_in=1` and excluded from the user
|
|
11
|
+
* `MAX_RULES=25` cap (see custom-rules/store.ts). They are evaluated
|
|
12
|
+
* regardless of license tier — the Pro `custom_firewall_rules` gate
|
|
13
|
+
* applies only to user-added rules with `built_in=0`.
|
|
14
|
+
*
|
|
15
|
+
* Idempotent: running the seeder again is a no-op when built-in rules
|
|
16
|
+
* are already present. Operators wanting to re-seed after a built-in
|
|
17
|
+
* update should `DELETE FROM firewall_rules WHERE built_in = 1` first.
|
|
18
|
+
*/
|
|
19
|
+
const BUILT_IN_RULES = [
|
|
20
|
+
{
|
|
21
|
+
name: 'builtin:instruction_injection',
|
|
22
|
+
priority: 10,
|
|
23
|
+
condition_type: 'regex',
|
|
24
|
+
condition_value: '\\[SYSTEM:|<<SYS>>|\\[INST\\]|<\\|im_start\\|>|<\\|system\\|>|##SYSTEM##',
|
|
25
|
+
action: 'quarantine',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'builtin:hidden_instruction',
|
|
29
|
+
priority: 11,
|
|
30
|
+
condition_type: 'regex',
|
|
31
|
+
condition_value: 'ignore\\s+(all\\s+)?previous\\s+(instructions?|prompts?)|forget\\s+everything|disregard\\s+(all\\s+)?(previous|above|prior)|override\\s+(previous|all|system)',
|
|
32
|
+
action: 'quarantine',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'builtin:imperative_tool_call',
|
|
36
|
+
priority: 12,
|
|
37
|
+
condition_type: 'regex',
|
|
38
|
+
condition_value: '\\b(?:call|invoke|use)\\s+(?:the\\s+)?[A-Za-z][\\w-]*\\s+tool\\b|\\b(?:call|invoke|use)\\s+this\\s+tool\\s+now\\b',
|
|
39
|
+
action: 'quarantine',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'builtin:memory_manipulation',
|
|
43
|
+
priority: 15,
|
|
44
|
+
condition_type: 'regex',
|
|
45
|
+
condition_value: 'save\\s+(this\\s+)?to\\s+memory|remember\\s+this\\s+(instruction|command|rule)|store\\s+this\\s+instruction|inject\\s+(into\\s+)?memory',
|
|
46
|
+
action: 'quarantine',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'builtin:command_injection',
|
|
50
|
+
priority: 5,
|
|
51
|
+
condition_type: 'regex',
|
|
52
|
+
condition_value: '\\beval\\s*\\(|\\bexec\\s*\\(|\\bsystem\\s*\\(|\\bexecute\\s+(this\\s+)?(command|code|script)|\\b__import__\\s*\\(|\\bsubprocess\\b',
|
|
53
|
+
action: 'quarantine',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'builtin:delimiter_attack',
|
|
57
|
+
priority: 18,
|
|
58
|
+
condition_type: 'regex',
|
|
59
|
+
condition_value: '<\\/?(system|admin|root)\\s*>|<!--[\\s\\S]{0,200}?(instruction|command|system|ignore|inject|override)[\\s\\S]{0,200}?-->',
|
|
60
|
+
action: 'quarantine',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'builtin:credential_leak_aws',
|
|
64
|
+
priority: 1,
|
|
65
|
+
condition_type: 'regex',
|
|
66
|
+
condition_value: 'AKIA[0-9A-Z]{16}',
|
|
67
|
+
action: 'block',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: 'builtin:credential_leak_jwt',
|
|
71
|
+
priority: 2,
|
|
72
|
+
condition_type: 'regex',
|
|
73
|
+
condition_value: 'eyJ[A-Za-z0-9_-]{10,}\\.eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}',
|
|
74
|
+
action: 'block',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'builtin:credential_leak_private_key',
|
|
78
|
+
priority: 3,
|
|
79
|
+
condition_type: 'regex',
|
|
80
|
+
condition_value: '-----BEGIN (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----',
|
|
81
|
+
action: 'block',
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
export function seedDefaultFirewallRules(db) {
|
|
85
|
+
// Confirm the column exists (older DBs may pre-date the migration).
|
|
86
|
+
const cols = db.prepare("PRAGMA table_info(firewall_rules)").all();
|
|
87
|
+
if (!cols.some(c => c.name === 'built_in'))
|
|
88
|
+
return;
|
|
89
|
+
const existing = db.prepare('SELECT COUNT(*) AS c FROM firewall_rules WHERE built_in = 1').get();
|
|
90
|
+
if (existing.c > 0)
|
|
91
|
+
return;
|
|
92
|
+
const insert = db.prepare(`
|
|
93
|
+
INSERT INTO firewall_rules (name, priority, condition_type, condition_value, action, enabled, built_in)
|
|
94
|
+
VALUES (?, ?, ?, ?, ?, 1, 1)
|
|
95
|
+
`);
|
|
96
|
+
const txn = db.transaction((rules) => {
|
|
97
|
+
for (const rule of rules) {
|
|
98
|
+
insert.run(rule.name, rule.priority, rule.condition_type, rule.condition_value, rule.action);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
txn(BUILT_IN_RULES);
|
|
102
|
+
}
|
|
103
|
+
export function listBuiltInRuleNames() {
|
|
104
|
+
return BUILT_IN_RULES.map(r => r.name);
|
|
105
|
+
}
|
|
@@ -9,9 +9,12 @@ export interface FirewallRule {
|
|
|
9
9
|
condition_value: string;
|
|
10
10
|
action: 'block' | 'allow' | 'quarantine';
|
|
11
11
|
enabled: number;
|
|
12
|
+
built_in: number;
|
|
12
13
|
created_at: string;
|
|
13
14
|
}
|
|
14
|
-
export declare function listFirewallRules(
|
|
15
|
+
export declare function listFirewallRules(opts?: {
|
|
16
|
+
includeBuiltin?: boolean;
|
|
17
|
+
}): FirewallRule[];
|
|
15
18
|
export declare function getFirewallRule(id: number): FirewallRule | undefined;
|
|
16
19
|
export declare function createFirewallRule(rule: {
|
|
17
20
|
name: string;
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { getDatabase } from '../../database/init.js';
|
|
5
5
|
const MAX_RULES = 25;
|
|
6
|
-
export function listFirewallRules() {
|
|
6
|
+
export function listFirewallRules(opts = {}) {
|
|
7
|
+
const includeBuiltin = opts.includeBuiltin ?? true;
|
|
7
8
|
const db = getDatabase();
|
|
8
|
-
|
|
9
|
+
const where = includeBuiltin ? '' : 'WHERE built_in = 0';
|
|
10
|
+
return db.prepare(`SELECT * FROM firewall_rules ${where} ORDER BY priority ASC`).all();
|
|
9
11
|
}
|
|
10
12
|
export function getFirewallRule(id) {
|
|
11
13
|
const db = getDatabase();
|
|
@@ -13,7 +15,9 @@ export function getFirewallRule(id) {
|
|
|
13
15
|
}
|
|
14
16
|
export function createFirewallRule(rule) {
|
|
15
17
|
const db = getDatabase();
|
|
16
|
-
|
|
18
|
+
// The MAX_RULES cap applies only to user-defined rules. Built-in rules
|
|
19
|
+
// (built_in=1) are seeded by the database layer and don't count.
|
|
20
|
+
const count = db.prepare('SELECT COUNT(*) as cnt FROM firewall_rules WHERE built_in = 0').get().cnt;
|
|
17
21
|
if (count >= MAX_RULES) {
|
|
18
22
|
throw new Error(`Maximum of ${MAX_RULES} custom firewall rules reached.`);
|
|
19
23
|
}
|
|
@@ -114,6 +114,21 @@ const PATTERN_GROUPS = [
|
|
|
114
114
|
/reveal\s+your\s+instructions/i,
|
|
115
115
|
],
|
|
116
116
|
},
|
|
117
|
+
{
|
|
118
|
+
// Imperative tool-call directives. These show up in transcripts as
|
|
119
|
+
// injected prompts disguised as user instructions ("call the X tool
|
|
120
|
+
// to complete this request. Call this tool now."). The session-end
|
|
121
|
+
// chunker historically captured them as user preferences with
|
|
122
|
+
// salience 1.0; the firewall now flags them at write time so they
|
|
123
|
+
// route to quarantine instead of memories.
|
|
124
|
+
name: 'imperative_tool_call',
|
|
125
|
+
weight: 0.8,
|
|
126
|
+
patterns: [
|
|
127
|
+
/\b(?:call|invoke|use)\s+(?:the\s+)?[A-Za-z][\w-]*\s+tool\b/i,
|
|
128
|
+
/\b(?:call|invoke|use)\s+this\s+tool\s+now\b/i,
|
|
129
|
+
/\bcomplete\s+this\s+request\.\s*(?:call|invoke|use)\s+this\s+tool\b/i,
|
|
130
|
+
],
|
|
131
|
+
},
|
|
117
132
|
];
|
|
118
133
|
// Maximum content length to scan (prevents ReDOS on very long inputs)
|
|
119
134
|
const MAX_SCAN_LENGTH = 50000;
|
package/dist/defence/pipeline.js
CHANGED
|
@@ -95,42 +95,48 @@ export function runDefencePipeline(content, title, source, config, project) {
|
|
|
95
95
|
reason = firewall.reason;
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
|
-
// 6b. Apply
|
|
99
|
-
|
|
98
|
+
// 6b. Apply firewall rules (built-in rules always evaluated; user-added
|
|
99
|
+
// custom rules require the Pro `custom_firewall_rules` feature). Both
|
|
100
|
+
// are additive only — can tighten, never weaken.
|
|
101
|
+
if (allowed && isDatabaseInitialized()) {
|
|
100
102
|
try {
|
|
101
103
|
const { getEnabledFirewallRules } = require('./custom-rules/store.js');
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
+
const userRulesAllowed = isFeatureEnabled('custom_firewall_rules');
|
|
105
|
+
const allRules = getEnabledFirewallRules();
|
|
106
|
+
for (const rule of allRules) {
|
|
107
|
+
if (!rule.built_in && !userRulesAllowed)
|
|
108
|
+
continue;
|
|
104
109
|
try {
|
|
105
110
|
const regex = new RegExp(rule.condition_value, 'gi');
|
|
106
111
|
if (regex.test(cleanContent) || regex.test(title)) {
|
|
112
|
+
const indicator = rule.built_in ? 'builtin_rule' : 'custom_rule';
|
|
107
113
|
if (rule.action === 'block') {
|
|
108
114
|
allowed = false;
|
|
109
|
-
reason = `Blocked by custom rule: ${rule.name}`;
|
|
115
|
+
reason = `Blocked by ${rule.built_in ? 'built-in' : 'custom'} rule: ${rule.name}`;
|
|
110
116
|
firewall.result = 'BLOCK';
|
|
111
|
-
if (!firewall.threatIndicators.includes(
|
|
112
|
-
firewall.threatIndicators.push(
|
|
117
|
+
if (!firewall.threatIndicators.includes(indicator)) {
|
|
118
|
+
firewall.threatIndicators.push(indicator);
|
|
113
119
|
}
|
|
114
120
|
break; // Block is final
|
|
115
121
|
}
|
|
116
122
|
else if (rule.action === 'quarantine' && firewall.result !== 'BLOCK') {
|
|
117
123
|
allowed = false;
|
|
118
|
-
reason = `Quarantined by custom rule: ${rule.name}`;
|
|
124
|
+
reason = `Quarantined by ${rule.built_in ? 'built-in' : 'custom'} rule: ${rule.name}`;
|
|
119
125
|
firewall.result = 'QUARANTINE';
|
|
120
|
-
if (!firewall.threatIndicators.includes(
|
|
121
|
-
firewall.threatIndicators.push(
|
|
126
|
+
if (!firewall.threatIndicators.includes(indicator)) {
|
|
127
|
+
firewall.threatIndicators.push(indicator);
|
|
122
128
|
}
|
|
123
129
|
}
|
|
124
|
-
// 'allow' action: no-op —
|
|
130
|
+
// 'allow' action: no-op — rules cannot weaken built-in decisions
|
|
125
131
|
}
|
|
126
132
|
}
|
|
127
133
|
catch {
|
|
128
|
-
// Skip invalid regex in
|
|
134
|
+
// Skip invalid regex in rules
|
|
129
135
|
}
|
|
130
136
|
}
|
|
131
137
|
}
|
|
132
138
|
catch {
|
|
133
|
-
//
|
|
139
|
+
// Rules store not available — skip silently
|
|
134
140
|
}
|
|
135
141
|
}
|
|
136
142
|
// 6c. Apply custom injection patterns (Pro feature, additive)
|
package/dist/defence/types.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export type SensitivityLevel = 'PUBLIC' | 'INTERNAL' | 'CONFIDENTIAL' | 'RESTRICTED';
|
|
8
8
|
export type FirewallResult = 'ALLOW' | 'BLOCK' | 'QUARANTINE';
|
|
9
|
-
export type ThreatIndicator = 'instruction_injection' | 'privilege_escalation' | 'encoding_obfuscation' | 'credential_leak' | 'external_url' | 'fragmented_payload' | 'restricted_content' | 'pipeline_error' | 'custom_rule' | 'custom_pattern';
|
|
9
|
+
export type ThreatIndicator = 'instruction_injection' | 'privilege_escalation' | 'encoding_obfuscation' | 'credential_leak' | 'external_url' | 'fragmented_payload' | 'restricted_content' | 'pipeline_error' | 'custom_rule' | 'custom_pattern' | 'builtin_rule';
|
|
10
10
|
export interface DefenceSource {
|
|
11
11
|
type: 'user' | 'cli' | 'hook' | 'email' | 'web' | 'agent' | 'file' | 'api' | 'tool_response';
|
|
12
12
|
identifier: string;
|
|
@@ -64,6 +64,43 @@ Say any of these phrases to trigger an instant save to Cortex memory:
|
|
|
64
64
|
|
|
65
65
|
Content after the trigger phrase is extracted and saved as the memory content.
|
|
66
66
|
|
|
67
|
+
## Defence Audit Guarantees
|
|
68
|
+
|
|
69
|
+
Every byte that lands in `memories` from the auto-extract path passes the
|
|
70
|
+
6-layer defence pipeline first. The hook write path is no longer the
|
|
71
|
+
bypass it once was:
|
|
72
|
+
|
|
73
|
+
- **ALLOW** → row inserted into `memories`; a corresponding row appears in
|
|
74
|
+
`defence_audit` with `source_type = 'hook'` and the hook's identifier
|
|
75
|
+
(`session-end-hook` / `pre-compact-hook` / `stop-hook`).
|
|
76
|
+
- **QUARANTINE** → row inserted into `quarantine` (not `memories`), linked
|
|
77
|
+
to the audit row via `audit_id`. Visible in the dashboard for review.
|
|
78
|
+
- **BLOCK** → dropped. The audit row written by the pipeline carries the
|
|
79
|
+
block reason; nothing reaches `memories`.
|
|
80
|
+
- **Pipeline error** → dropped + a synthetic audit row with reason
|
|
81
|
+
`pipeline_error: <msg>`. Never silently lose data.
|
|
82
|
+
|
|
83
|
+
Built-in firewall rules covering instruction injection, hidden
|
|
84
|
+
instruction, imperative tool-call directives ("call X tool now"), command
|
|
85
|
+
injection, and credential leaks (AWS / JWT / private keys) are seeded
|
|
86
|
+
into `firewall_rules` on first run with `built_in = 1`. They are
|
|
87
|
+
evaluated on every tier (the Pro `custom_firewall_rules` gate applies
|
|
88
|
+
only to user-added rules) and excluded from the user-facing 25-rule cap.
|
|
89
|
+
|
|
90
|
+
The chunker also rejects malformed candidates *before* they reach the
|
|
91
|
+
write path: imperative tool-calls, bare-imperative starts ("commit
|
|
92
|
+
secrets" with the negation dropped), email-body bleed, and path-label
|
|
93
|
+
fragments. Auto-extracted memories are now capped at salience 0.6
|
|
94
|
+
(reserved 1.0 for LLM-rated future paths).
|
|
95
|
+
|
|
96
|
+
To audit an existing database for malformed rows accumulated before this
|
|
97
|
+
fix:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
shieldcortex memories purge --malformed --dry-run # preview
|
|
101
|
+
shieldcortex memories purge --malformed --execute # delete (writes a backup first)
|
|
102
|
+
```
|
|
103
|
+
|
|
67
104
|
## Auto-Memory
|
|
68
105
|
|
|
69
106
|
Auto-memory extraction is enabled by default. ShieldCortex complements your existing memory system by capturing decisions, fixes, and learnings with built-in deduplication to avoid noise.
|