shieldcortex 4.31.2 → 4.32.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 +78 -2
- 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/replay.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory/replay/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory/replay.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.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/api/control.d.ts +2 -0
- package/dist/api/control.js +119 -2
- package/dist/api/routes/memories.js +19 -14
- package/dist/api/routes/system.js +2 -3
- package/dist/api/visualization-server.d.ts +13 -1
- package/dist/api/visualization-server.js +57 -1
- package/dist/audit/env-scanner.js +5 -2
- package/dist/audit/index.d.ts +4 -1
- package/dist/audit/index.js +2 -1
- package/dist/audit/mcp-config-scanner.d.ts +23 -0
- package/dist/audit/mcp-config-scanner.js +110 -0
- package/dist/audit/mcp-tools-scanner.d.ts +112 -0
- package/dist/audit/mcp-tools-scanner.js +299 -0
- package/dist/cli/audit.d.ts +1 -0
- package/dist/cli/audit.js +12 -1
- package/dist/cli/mcp.d.ts +13 -0
- package/dist/cli/mcp.js +0 -0
- package/dist/cli/remember.d.ts +75 -0
- package/dist/cli/remember.js +195 -0
- package/dist/cloud/config.d.ts +23 -1
- package/dist/cloud/config.js +453 -193
- package/dist/cloud/quarantine-sync.d.ts +12 -2
- package/dist/cloud/quarantine-sync.js +28 -6
- package/dist/cloud/sync-queue.d.ts +21 -2
- package/dist/cloud/sync-queue.js +124 -29
- package/dist/database/better-sqlite3-guard.d.ts +21 -2
- package/dist/database/better-sqlite3-guard.js +29 -5
- package/dist/database/init.js +68 -16
- package/dist/database/inline-schema.js +35 -1
- package/dist/database/migrations.js +104 -8
- package/dist/database/schema.sql +39 -1
- package/dist/defence/audit/queries.d.ts +10 -2
- package/dist/defence/audit/queries.js +30 -4
- package/dist/defence/audit/retention.d.ts +50 -0
- package/dist/defence/audit/retention.js +161 -0
- package/dist/defence/credential-leak/entropy.d.ts +11 -0
- package/dist/defence/credential-leak/entropy.js +27 -0
- package/dist/defence/credential-leak/index.js +27 -1
- package/dist/defence/credential-leak/patterns.d.ts +9 -0
- package/dist/defence/credential-leak/patterns.js +21 -0
- package/dist/defence/custom-patterns/store.js +8 -1
- package/dist/defence/custom-rules/store.d.ts +18 -0
- package/dist/defence/custom-rules/store.js +63 -0
- package/dist/defence/firewall/confusables.d.ts +30 -0
- package/dist/defence/firewall/confusables.js +87 -0
- package/dist/defence/firewall/encoding-detector.js +23 -9
- package/dist/defence/firewall/index.d.ts +11 -1
- package/dist/defence/firewall/index.js +34 -1
- package/dist/defence/firewall/instruction-detector.js +18 -7
- package/dist/defence/firewall/markdown-image-detector.d.ts +34 -0
- package/dist/defence/firewall/markdown-image-detector.js +83 -0
- package/dist/defence/fragmentation/entity-extractor.js +17 -6
- package/dist/defence/index.d.ts +5 -0
- package/dist/defence/index.js +8 -0
- package/dist/defence/iron-dome/index.js +7 -1
- package/dist/defence/pipeline.js +62 -10
- package/dist/defence/scan-windows.d.ts +41 -0
- package/dist/defence/scan-windows.js +61 -0
- package/dist/defence/semantic/attack-corpus.d.ts +22 -0
- package/dist/defence/semantic/attack-corpus.js +75 -0
- package/dist/defence/semantic/index.d.ts +67 -0
- package/dist/defence/semantic/index.js +138 -0
- package/dist/defence/skill-scanner/deep-scan.js +35 -15
- package/dist/defence/skill-scanner/patterns.d.ts +1 -1
- package/dist/defence/skill-scanner/patterns.js +8 -7
- package/dist/defence/tool-response-scanner.d.ts +21 -5
- package/dist/defence/tool-response-scanner.js +111 -22
- package/dist/defence/types.d.ts +11 -1
- package/dist/index.d.ts +29 -0
- package/dist/index.js +104 -20
- package/dist/memory/consolidate.js +1 -1
- package/dist/memory/decay.js +3 -1
- package/dist/memory/embedding.d.ts +18 -2
- package/dist/memory/embedding.js +32 -11
- package/dist/memory/expiry.js +1 -1
- package/dist/memory/search-recall.js +107 -49
- package/dist/memory/search.d.ts +19 -3
- package/dist/memory/search.js +25 -10
- package/dist/memory/store.d.ts +13 -2
- package/dist/memory/store.js +115 -11
- package/dist/scan-only.d.ts +64 -0
- package/dist/scan-only.js +173 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.js +6 -4
- package/dist/setup/claude-md.js +39 -34
- package/dist/setup/codex.js +9 -2
- package/dist/setup/copilot.js +160 -47
- package/dist/setup/json-config.d.ts +99 -0
- package/dist/setup/json-config.js +167 -0
- package/dist/setup/migrate.js +1 -1
- package/dist/setup/settings-hooks.js +8 -13
- package/dist/setup/uninstall.js +1 -21
- package/dist/tools/context.d.ts +8 -8
- package/dist/tools/forget.d.ts +9 -8
- package/dist/tools/forget.js +17 -4
- package/dist/tools/recall.d.ts +13 -13
- package/dist/tools/remember.d.ts +16 -16
- package/dist/tools/remember.js +19 -8
- package/dist/worker/brain-worker.d.ts +1 -0
- package/dist/worker/brain-worker.js +79 -16
- package/dist/worker/types.d.ts +8 -0
- package/dist/worker/types.js +8 -0
- package/dist/xray/dir-scanner.d.ts +18 -0
- package/dist/xray/dir-scanner.js +23 -1
- package/dist/xray/file-scanner.js +16 -1
- package/dist/xray/findings-store.js +9 -1
- package/dist/xray/index.d.ts +2 -0
- package/dist/xray/index.js +10 -1
- package/dist/xray/npm-inspector.d.ts +31 -0
- package/dist/xray/npm-inspector.js +135 -29
- package/dist/xray/patterns.d.ts +1 -1
- package/dist/xray/patterns.js +20 -23
- package/dist/xray/sarif.d.ts +78 -0
- package/dist/xray/sarif.js +166 -0
- package/dist/xray/watch.d.ts +1 -0
- package/dist/xray/watch.js +10 -1
- package/hooks/openclaw/cortex-memory/handler.ts +122 -18
- package/hooks/openclaw/cortex-memory/runtime.mjs +10 -4
- package/package.json +10 -3
- package/dist/memory/embedding-cache.d.ts +0 -20
- package/dist/memory/embedding-cache.js +0 -91
- /package/dashboard/.next/standalone/dashboard/.next/static/{_j4TeMpss-w79QtNNWqZw → Ox9scglBehbbCk7DD8-Vn}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{_j4TeMpss-w79QtNNWqZw → Ox9scglBehbbCk7DD8-Vn}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{_j4TeMpss-w79QtNNWqZw → Ox9scglBehbbCk7DD8-Vn}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--Ox9scglBehbbCk7DD8_Vn--><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/34d933785a17edf3.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/aee9601911b790ca.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/d878b929b21636c4.js"/><script src="/_next/static/chunks/f70f563804550a9c.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-768a6a8b9db952e0.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/34d933785a17edf3.css\",\"style\"]\n:HL[\"/_next/static/chunks/aee9601911b790ca.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/34d933785a17edf3.css\",\"style\"]\n:HL[\"/_next/static/chunks/aee9601911b790ca.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"Ox9scglBehbbCk7DD8-Vn\",\"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/34d933785a17edf3.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/aee9601911b790ca.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><!--Ox9scglBehbbCk7DD8_Vn--><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/f70f563804550a9c.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-768a6a8b9db952e0.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\":\"Ox9scglBehbbCk7DD8-Vn\",\"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\": \"4TwtUg5STHx8AkrFlddY7d8bHHw6z7f5td6KyvioxzU=\"\n}"
|
package/dist/api/control.d.ts
CHANGED
package/dist/api/control.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* except forensic tools (audit, status, scan, resume).
|
|
9
9
|
*/
|
|
10
10
|
import { logIronDomeAudit } from '../defence/iron-dome/audit.js';
|
|
11
|
+
import { getDatabase, isDatabaseInitialized } from '../database/init.js';
|
|
11
12
|
export class KillSwitchError extends Error {
|
|
12
13
|
meta;
|
|
13
14
|
constructor(meta) {
|
|
@@ -28,30 +29,133 @@ const ALLOWED_DURING_LOCKDOWN = new Set([
|
|
|
28
29
|
const startTime = Date.now();
|
|
29
30
|
let mode = 'active';
|
|
30
31
|
let killSwitchMeta = null;
|
|
32
|
+
// ── Cross-process persistence (control_state table, single row id=1) ──
|
|
33
|
+
//
|
|
34
|
+
// In a normal install the MCP server and the dashboard API server are SEPARATE
|
|
35
|
+
// processes. Keeping kill-switch / pause state only in module memory meant a
|
|
36
|
+
// dashboard activation never reached the MCP process. The control_state row is
|
|
37
|
+
// the single source of truth: mutators WRITE it, gated reads REFRESH from it
|
|
38
|
+
// (through a short TTL cache so we don't hit SQLite on every gated op). The
|
|
39
|
+
// in-memory `mode` / `killSwitchMeta` stay as the cache. Every DB access here
|
|
40
|
+
// is best-effort: a missing / uninitialised DB or any error falls back to the
|
|
41
|
+
// current in-memory behaviour and NEVER throws into callers.
|
|
42
|
+
//
|
|
43
|
+
// Worst-case propagation delay of another process's change to this process is
|
|
44
|
+
// `cacheTtlMs` (~1s) — acceptable for memory-write gating, not for sub-second
|
|
45
|
+
// guarantees. Mutators force a fresh read first (refreshControlState(true)), so
|
|
46
|
+
// cross-process precedence checks never act on a stale cached mode.
|
|
47
|
+
let lastRead = 0;
|
|
48
|
+
const cacheTtlMs = 1000;
|
|
49
|
+
/**
|
|
50
|
+
* Persist the current in-memory control state to the single control_state row.
|
|
51
|
+
* Best-effort: silently no-ops if the DB is uninitialised and never throws.
|
|
52
|
+
*/
|
|
53
|
+
function persistControlState() {
|
|
54
|
+
if (!isDatabaseInitialized())
|
|
55
|
+
return;
|
|
56
|
+
try {
|
|
57
|
+
getDatabase()
|
|
58
|
+
.prepare(`INSERT INTO control_state (id, mode, meta_json, updated_at)
|
|
59
|
+
VALUES (1, ?, ?, ?)
|
|
60
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
61
|
+
mode = excluded.mode,
|
|
62
|
+
meta_json = excluded.meta_json,
|
|
63
|
+
updated_at = excluded.updated_at`)
|
|
64
|
+
.run(mode, killSwitchMeta ? JSON.stringify(killSwitchMeta) : null, new Date().toISOString());
|
|
65
|
+
// Our cache is now authoritative for this write — avoid an immediate
|
|
66
|
+
// redundant read clobbering it within the TTL window.
|
|
67
|
+
lastRead = Date.now();
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
// Never let persistence break a control operation — but a silent failure
|
|
71
|
+
// here means a dashboard "kill switch" never reaches the MCP process while
|
|
72
|
+
// the dashboard reports success. Surface it (still swallow, never throw).
|
|
73
|
+
console.error('[shieldcortex] failed to persist control state:', err);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const VALID_MODES = new Set(['active', 'paused', 'kill_switch']);
|
|
77
|
+
/**
|
|
78
|
+
* Refresh the in-memory control state from the control_state row, subject to a
|
|
79
|
+
* short TTL so gated ops do ≤1 SQLite read per second rather than one per call.
|
|
80
|
+
* If the DB is uninitialised, the row is absent, or any error occurs, the
|
|
81
|
+
* existing in-memory values are kept (we never clobber to a wrong state).
|
|
82
|
+
*/
|
|
83
|
+
function loadControlState() {
|
|
84
|
+
if (!isDatabaseInitialized())
|
|
85
|
+
return;
|
|
86
|
+
const now = Date.now();
|
|
87
|
+
if (now - lastRead <= cacheTtlMs)
|
|
88
|
+
return;
|
|
89
|
+
// Mark as read up front so a transient error doesn't hammer SQLite every call.
|
|
90
|
+
lastRead = now;
|
|
91
|
+
try {
|
|
92
|
+
const row = getDatabase()
|
|
93
|
+
.prepare('SELECT mode, meta_json FROM control_state WHERE id = 1')
|
|
94
|
+
.get();
|
|
95
|
+
if (!row)
|
|
96
|
+
return; // no row yet — keep in-memory state
|
|
97
|
+
// Fail-closed: a corrupted / unknown mode must NOT disable lockdown. Keep
|
|
98
|
+
// the prior in-memory state rather than assigning garbage (which would make
|
|
99
|
+
// assertOperationAllowed fail OPEN for any non-'kill_switch' value).
|
|
100
|
+
if (!VALID_MODES.has(row.mode)) {
|
|
101
|
+
console.error(`[shieldcortex] ignoring invalid control_state mode: ${JSON.stringify(row.mode)}`);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
mode = row.mode;
|
|
105
|
+
killSwitchMeta = row.meta_json ? JSON.parse(row.meta_json) : null;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Keep current in-memory values on any read/parse failure.
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Force-or-TTL refresh of the in-memory control state from the row.
|
|
113
|
+
*
|
|
114
|
+
* Mutators (pause/resume/activate/deactivate) call this with force=true BEFORE
|
|
115
|
+
* their precedence checks so they never act on a stale cached `mode`. Without
|
|
116
|
+
* it, process B calling resume() within the TTL after process A activated the
|
|
117
|
+
* kill switch would see its stale in-memory 'active', pass the guard, and write
|
|
118
|
+
* 'active' — silently clearing A's kill switch. Mutators are rare, so the
|
|
119
|
+
* forced DB read is fine. A forced reload with no DB still no-ops (loadControlState
|
|
120
|
+
* guards on isDatabaseInitialized), preserving the uninitialised-DB fallback.
|
|
121
|
+
*/
|
|
122
|
+
function refreshControlState(force = false) {
|
|
123
|
+
if (force)
|
|
124
|
+
lastRead = 0;
|
|
125
|
+
loadControlState();
|
|
126
|
+
}
|
|
31
127
|
// ── Pause (soft — memory writes only) ──
|
|
32
128
|
export function isPaused() {
|
|
129
|
+
loadControlState();
|
|
33
130
|
return mode === 'paused' || mode === 'kill_switch';
|
|
34
131
|
}
|
|
35
132
|
export function pause() {
|
|
133
|
+
refreshControlState(true); // see current row before the precedence check
|
|
36
134
|
if (mode === 'kill_switch')
|
|
37
135
|
return; // kill switch takes precedence
|
|
38
136
|
mode = 'paused';
|
|
39
137
|
console.log('[shieldcortex] Memory creation PAUSED');
|
|
138
|
+
persistControlState();
|
|
40
139
|
}
|
|
41
140
|
export function resume() {
|
|
141
|
+
refreshControlState(true); // see current row before the precedence check
|
|
42
142
|
if (mode === 'kill_switch')
|
|
43
143
|
return; // must use deactivateKillSwitch
|
|
44
144
|
mode = 'active';
|
|
45
145
|
console.log('[shieldcortex] Memory creation RESUMED');
|
|
146
|
+
persistControlState();
|
|
46
147
|
}
|
|
47
148
|
// ── Kill Switch (hard — blocks everything except forensics) ──
|
|
48
149
|
export function isKillSwitchActive() {
|
|
150
|
+
loadControlState();
|
|
49
151
|
return mode === 'kill_switch';
|
|
50
152
|
}
|
|
51
153
|
export function getKillSwitchMeta() {
|
|
154
|
+
loadControlState();
|
|
52
155
|
return killSwitchMeta;
|
|
53
156
|
}
|
|
54
157
|
export function activateKillSwitch(meta) {
|
|
158
|
+
refreshControlState(true); // see current row before the precedence check
|
|
55
159
|
if (mode === 'kill_switch')
|
|
56
160
|
return; // already active, idempotent
|
|
57
161
|
const fullMeta = {
|
|
@@ -60,6 +164,7 @@ export function activateKillSwitch(meta) {
|
|
|
60
164
|
};
|
|
61
165
|
mode = 'kill_switch';
|
|
62
166
|
killSwitchMeta = fullMeta;
|
|
167
|
+
persistControlState();
|
|
63
168
|
console.log(`[shieldcortex] KILL SWITCH ACTIVATED — source: ${meta.source}${meta.phrase ? `, phrase: "${meta.phrase}"` : ''}`);
|
|
64
169
|
// Audit log
|
|
65
170
|
try {
|
|
@@ -92,11 +197,13 @@ export function activateKillSwitch(meta) {
|
|
|
92
197
|
}
|
|
93
198
|
}
|
|
94
199
|
export function deactivateKillSwitch(reason) {
|
|
200
|
+
refreshControlState(true); // see current row before the precedence check
|
|
95
201
|
if (mode !== 'kill_switch')
|
|
96
202
|
return;
|
|
97
203
|
const previousMeta = killSwitchMeta;
|
|
98
204
|
mode = 'active';
|
|
99
205
|
killSwitchMeta = null;
|
|
206
|
+
persistControlState();
|
|
100
207
|
console.log(`[shieldcortex] Kill switch deactivated — reason: ${reason}`);
|
|
101
208
|
try {
|
|
102
209
|
logIronDomeAudit({
|
|
@@ -123,6 +230,7 @@ export function deactivateKillSwitch(reason) {
|
|
|
123
230
|
* Throws KillSwitchError if the operation is blocked.
|
|
124
231
|
*/
|
|
125
232
|
export function assertOperationAllowed(kind) {
|
|
233
|
+
loadControlState();
|
|
126
234
|
if (mode !== 'kill_switch')
|
|
127
235
|
return;
|
|
128
236
|
if (ALLOWED_DURING_LOCKDOWN.has(kind))
|
|
@@ -131,6 +239,7 @@ export function assertOperationAllowed(kind) {
|
|
|
131
239
|
}
|
|
132
240
|
// ── Status ──
|
|
133
241
|
export function getControlStatus() {
|
|
242
|
+
loadControlState();
|
|
134
243
|
const uptime = Date.now() - startTime;
|
|
135
244
|
const seconds = Math.floor(uptime / 1000);
|
|
136
245
|
const minutes = Math.floor(seconds / 60);
|
|
@@ -151,10 +260,18 @@ export function getControlStatus() {
|
|
|
151
260
|
}
|
|
152
261
|
return {
|
|
153
262
|
mode,
|
|
154
|
-
paused:
|
|
155
|
-
killSwitchActive:
|
|
263
|
+
paused: mode === 'paused' || mode === 'kill_switch',
|
|
264
|
+
killSwitchActive: mode === 'kill_switch',
|
|
156
265
|
killSwitchMeta,
|
|
157
266
|
uptime,
|
|
158
267
|
uptimeFormatted,
|
|
159
268
|
};
|
|
160
269
|
}
|
|
270
|
+
// ── Test-only hooks ──
|
|
271
|
+
//
|
|
272
|
+
// These exist solely so cross-process behaviour can be exercised without a real
|
|
273
|
+
// >1s sleep. They are not part of the public API.
|
|
274
|
+
/** Force the next gated read to re-query the control_state row (bypass TTL). */
|
|
275
|
+
export function __refreshControlStateForTest() {
|
|
276
|
+
refreshControlState(true);
|
|
277
|
+
}
|
|
@@ -2,7 +2,7 @@ import { homedir } from 'os';
|
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { existsSync, readdirSync, readFileSync } from 'fs';
|
|
4
4
|
import { getDatabase } from '../../database/init.js';
|
|
5
|
-
import { searchMemories, getRecentMemories, getHighPriorityMemories, getMemoryStats, getMemoryById, addMemory, deleteMemory, accessMemory, updateMemory, mergeMemories, promoteMemory, createMemoryLink, rowToMemory, enrichMemory, } from '../../memory/store.js';
|
|
5
|
+
import { searchMemories, getRecentMemories, getHighPriorityMemories, countMemories, countHighPriorityMemories, getMemoryStats, getMemoryById, addMemory, deleteMemory, accessMemory, updateMemory, mergeMemories, promoteMemory, createMemoryLink, rowToMemory, enrichMemory, } from '../../memory/store.js';
|
|
6
6
|
import { calculateDecayedScore } from '../../memory/decay.js';
|
|
7
7
|
import { consolidate, findDuplicateMemoryPairs, formatContextSummary, generateContextSummary, } from '../../memory/consolidate.js';
|
|
8
8
|
import { getActivationStats, getActiveMemories } from '../../memory/activation.js';
|
|
@@ -220,32 +220,37 @@ export function registerMemoryRoutes(app, deps) {
|
|
|
220
220
|
const query = typeof req.query.query === 'string' ? req.query.query : undefined;
|
|
221
221
|
const limit = Math.min(parseInt(limitStr, 10) || 50, 1000);
|
|
222
222
|
const offset = parseInt(offsetStr, 10) || 0;
|
|
223
|
+
// Push the type/category filters into the query so the page rows AND the
|
|
224
|
+
// `total` count share one predicate — otherwise `total`/`hasMore` reflect
|
|
225
|
+
// the unfiltered grand count (Phase 17 A3).
|
|
226
|
+
const filters = { type, category };
|
|
223
227
|
let memories;
|
|
228
|
+
let total;
|
|
224
229
|
if (mode === 'search' && query) {
|
|
230
|
+
// searchMemories already applies type/category filters internally, so
|
|
231
|
+
// the filtered total is the size of the full result set. Fetch a
|
|
232
|
+
// generous window (capped) and count what comes back.
|
|
233
|
+
const SEARCH_TOTAL_CAP = 1000;
|
|
225
234
|
const results = await searchMemories({
|
|
226
235
|
query,
|
|
227
236
|
project,
|
|
228
237
|
type: type,
|
|
229
238
|
category: category,
|
|
230
|
-
limit:
|
|
239
|
+
limit: SEARCH_TOTAL_CAP,
|
|
231
240
|
});
|
|
232
|
-
|
|
241
|
+
const allMatches = results.map((result) => result.memory);
|
|
242
|
+
total = allMatches.length;
|
|
243
|
+
memories = allMatches;
|
|
233
244
|
}
|
|
234
245
|
else if (mode === 'important') {
|
|
235
|
-
memories = getHighPriorityMemories(limit + offset + 1, project);
|
|
246
|
+
memories = getHighPriorityMemories(limit + offset + 1, project, undefined, filters);
|
|
247
|
+
total = countHighPriorityMemories(project, filters);
|
|
236
248
|
}
|
|
237
249
|
else {
|
|
238
|
-
memories = getRecentMemories(limit + offset + 1, project);
|
|
250
|
+
memories = getRecentMemories(limit + offset + 1, project, undefined, filters);
|
|
251
|
+
total = countMemories(project, filters);
|
|
239
252
|
}
|
|
240
|
-
|
|
241
|
-
memories = memories.filter((memory) => memory.type === type);
|
|
242
|
-
}
|
|
243
|
-
if (category) {
|
|
244
|
-
memories = memories.filter((memory) => memory.category === category);
|
|
245
|
-
}
|
|
246
|
-
const stats = getMemoryStats(project);
|
|
247
|
-
const total = stats.total;
|
|
248
|
-
const hasMore = memories.length > offset + limit;
|
|
253
|
+
const hasMore = offset + limit < total;
|
|
249
254
|
const paginatedMemories = memories.slice(offset, offset + limit);
|
|
250
255
|
// Batch-load entity_ids per memory so the constellation graph client
|
|
251
256
|
// can map list rows to graph nodes without an N+1 fetch.
|
|
@@ -2,7 +2,7 @@ import { WebSocket } from 'ws';
|
|
|
2
2
|
import { getLifetimeStats } from '../../defence/audit/queries.js';
|
|
3
3
|
import { getAuditStats } from '../../defence/audit/queries.js';
|
|
4
4
|
import { isDatabaseInitialized } from '../../database/init.js';
|
|
5
|
-
import { getCloudConfig, getCloudSyncControls, getDeviceId, getDeviceName, getDefenceMode, getOpenClawMemoryConfig, isConfigTampered, isProactiveRecallEnabled,
|
|
5
|
+
import { getCloudConfig, getCloudSyncControls, getDeviceId, getDeviceName, getDefenceMode, getLastSyncAt, getOpenClawMemoryConfig, isConfigTampered, isProactiveRecallEnabled, setCloudConfig, setCloudSyncControls, setDefenceMode, setOpenClawMemoryConfig, setProactiveRecall, } from '../../cloud/config.js';
|
|
6
6
|
import { getQueueStats, reconcileSyncQueue } from '../../cloud/sync-queue.js';
|
|
7
7
|
import { getDatabase } from '../../database/init.js';
|
|
8
8
|
import { getRequiredTier, isFeatureEnabled } from '../../license/gate.js';
|
|
@@ -259,7 +259,6 @@ export function registerSystemRoutes(app, deps) {
|
|
|
259
259
|
app.get('/api/cloud/sync-status', (_req, res) => {
|
|
260
260
|
try {
|
|
261
261
|
const config = getCloudConfig();
|
|
262
|
-
const raw = readRawConfig();
|
|
263
262
|
const queue = getQueueStats();
|
|
264
263
|
res.json({
|
|
265
264
|
enabled: config.cloudEnabled,
|
|
@@ -268,7 +267,7 @@ export function registerSystemRoutes(app, deps) {
|
|
|
268
267
|
featureEnabled: isFeatureEnabled('cloud_sync'),
|
|
269
268
|
requiredTier: getRequiredTier('cloud_sync'),
|
|
270
269
|
controls: getCloudSyncControls(),
|
|
271
|
-
lastSyncAt: (
|
|
270
|
+
lastSyncAt: getLastSyncAt(),
|
|
272
271
|
device: {
|
|
273
272
|
id: getDeviceId(),
|
|
274
273
|
name: getDeviceName(),
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Runs alongside or instead of the MCP server.
|
|
6
6
|
*/
|
|
7
7
|
import { Request, Response } from 'express';
|
|
8
|
+
import { WebSocketServer } from 'ws';
|
|
8
9
|
import type { DefenceSource } from '../defence/types.js';
|
|
9
10
|
/**
|
|
10
11
|
* Normalise an incoming `source` object from a REST request body into a
|
|
@@ -19,9 +20,20 @@ import type { DefenceSource } from '../defence/types.js';
|
|
|
19
20
|
*/
|
|
20
21
|
export declare function normaliseDefenceSource(raw: unknown): DefenceSource;
|
|
21
22
|
export declare const __test__: {
|
|
22
|
-
ALLOWED_DEFENCE_SOURCE_TYPES: readonly ("user" | "cli" | "hook" | "
|
|
23
|
+
ALLOWED_DEFENCE_SOURCE_TYPES: readonly ("user" | "cli" | "hook" | "email" | "web" | "agent" | "file" | "api" | "tool_response")[];
|
|
23
24
|
MAX_SOURCE_IDENTIFIER_LENGTH: number;
|
|
24
25
|
};
|
|
26
|
+
export declare const WS_MAX_PAYLOAD: number;
|
|
27
|
+
export declare const WS_MAX_CONNECTIONS = 50;
|
|
28
|
+
export declare const WS_HEARTBEAT_MS = 30000;
|
|
29
|
+
/**
|
|
30
|
+
* Standard `ws` ping/pong heartbeat. Marks every socket alive on `pong`, and on
|
|
31
|
+
* each tick terminates any socket that didn't answer the previous ping. The
|
|
32
|
+
* returned interval is `unref()`'d so it never keeps the process alive on its
|
|
33
|
+
* own, and is cleared automatically when the server closes. Exported for unit
|
|
34
|
+
* testing (booting the full HTTP server in jest is impractical).
|
|
35
|
+
*/
|
|
36
|
+
export declare function setupWebSocketHeartbeat(wss: Pick<WebSocketServer, 'clients' | 'on'>, intervalMs?: number): NodeJS.Timeout;
|
|
25
37
|
/**
|
|
26
38
|
* Handler for `POST /api/v1/scan`.
|
|
27
39
|
*
|
|
@@ -112,6 +112,49 @@ function requireProFeature(feature) {
|
|
|
112
112
|
}
|
|
113
113
|
// Track connected WebSocket clients
|
|
114
114
|
const clients = new Set();
|
|
115
|
+
// ── WebSocket hardening (Phase 17 B3) ───────────────────────────────────────
|
|
116
|
+
// This is a localhost dashboard socket, so the limits are deliberately tight.
|
|
117
|
+
// - WS_MAX_PAYLOAD caps a single inbound frame (the client only sends a
|
|
118
|
+
// tiny token in the query string; it never POSTs bulk
|
|
119
|
+
// data over the socket, so 1 MiB is generous).
|
|
120
|
+
// - WS_MAX_CONNECTIONS rejects new sockets past a sane ceiling — one or two
|
|
121
|
+
// browser tabs is the norm; 50 absorbs reconnect churn.
|
|
122
|
+
// - WS_HEARTBEAT_MS ping/pong interval. A client that misses a round-trip
|
|
123
|
+
// is terminated so dead sockets don't leak.
|
|
124
|
+
export const WS_MAX_PAYLOAD = 1024 * 1024; // 1 MiB
|
|
125
|
+
export const WS_MAX_CONNECTIONS = 50;
|
|
126
|
+
export const WS_HEARTBEAT_MS = 30000;
|
|
127
|
+
/**
|
|
128
|
+
* Standard `ws` ping/pong heartbeat. Marks every socket alive on `pong`, and on
|
|
129
|
+
* each tick terminates any socket that didn't answer the previous ping. The
|
|
130
|
+
* returned interval is `unref()`'d so it never keeps the process alive on its
|
|
131
|
+
* own, and is cleared automatically when the server closes. Exported for unit
|
|
132
|
+
* testing (booting the full HTTP server in jest is impractical).
|
|
133
|
+
*/
|
|
134
|
+
export function setupWebSocketHeartbeat(wss, intervalMs = WS_HEARTBEAT_MS) {
|
|
135
|
+
const interval = setInterval(() => {
|
|
136
|
+
for (const client of wss.clients) {
|
|
137
|
+
if (client.isAlive === false) {
|
|
138
|
+
client.terminate();
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
client.isAlive = false;
|
|
142
|
+
try {
|
|
143
|
+
client.ping();
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Socket already gone — terminate defensively.
|
|
147
|
+
try {
|
|
148
|
+
client.terminate();
|
|
149
|
+
}
|
|
150
|
+
catch { /* already closed */ }
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}, intervalMs);
|
|
154
|
+
interval.unref?.();
|
|
155
|
+
wss.on('close', () => clearInterval(interval));
|
|
156
|
+
return interval;
|
|
157
|
+
}
|
|
115
158
|
/**
|
|
116
159
|
* Handler for `POST /api/v1/scan`.
|
|
117
160
|
*
|
|
@@ -711,7 +754,9 @@ export function startVisualizationServer(dbPath) {
|
|
|
711
754
|
// ============================================
|
|
712
755
|
// WEBSOCKET SERVER
|
|
713
756
|
// ============================================
|
|
714
|
-
const wss = new WebSocketServer({ server, path: '/ws/events' });
|
|
757
|
+
const wss = new WebSocketServer({ server, path: '/ws/events', maxPayload: WS_MAX_PAYLOAD });
|
|
758
|
+
// Ping/pong heartbeat — terminates dead sockets. Cleared on wss close.
|
|
759
|
+
const wsHeartbeatInterval = setupWebSocketHeartbeat(wss);
|
|
715
760
|
wss.on('connection', (ws, req) => {
|
|
716
761
|
// Validate auth token from query string: ws://localhost:3001/ws/events?token=<token>
|
|
717
762
|
const url = new URL(req.url ?? '', `http://${req.headers.host}`);
|
|
@@ -720,6 +765,16 @@ export function startVisualizationServer(dbPath) {
|
|
|
720
765
|
ws.close(4401, 'Unauthorized');
|
|
721
766
|
return;
|
|
722
767
|
}
|
|
768
|
+
// Connection cap — this is a localhost dashboard, so a tight ceiling is
|
|
769
|
+
// fine. Reject (rather than queue) once we're at capacity.
|
|
770
|
+
if (clients.size >= WS_MAX_CONNECTIONS) {
|
|
771
|
+
console.warn(`[WS] Connection cap (${WS_MAX_CONNECTIONS}) reached — rejecting new client.`);
|
|
772
|
+
ws.close(4429, 'Too many connections');
|
|
773
|
+
return;
|
|
774
|
+
}
|
|
775
|
+
// Mark alive for the heartbeat and refresh on every pong.
|
|
776
|
+
ws.isAlive = true;
|
|
777
|
+
ws.on('pong', () => { ws.isAlive = true; });
|
|
723
778
|
clients.add(ws);
|
|
724
779
|
console.log(`[WS] Client connected. Total: ${clients.size}`);
|
|
725
780
|
// Send initial state
|
|
@@ -879,6 +934,7 @@ export function startVisualizationServer(dbPath) {
|
|
|
879
934
|
clearInterval(eventPollInterval);
|
|
880
935
|
clearInterval(cleanupInterval);
|
|
881
936
|
clearInterval(xrayDetectionInterval);
|
|
937
|
+
clearInterval(wsHeartbeatInterval);
|
|
882
938
|
// Close WebSocket connections
|
|
883
939
|
for (const client of clients) {
|
|
884
940
|
client.close();
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
|
|
11
11
|
import { join, basename } from 'path';
|
|
12
12
|
import { homedir } from 'os';
|
|
13
|
+
import { execFileSync } from 'node:child_process';
|
|
13
14
|
import { scanForCredentials } from '../defence/credential-leak/index.js';
|
|
14
15
|
const LEARN_MORE = 'https://shieldcortex.ai/docs/threats/secret-exposure';
|
|
15
16
|
/** .env file patterns */
|
|
@@ -82,8 +83,10 @@ function discoverEnvFiles() {
|
|
|
82
83
|
*/
|
|
83
84
|
function isGitIgnored(filePath) {
|
|
84
85
|
try {
|
|
85
|
-
|
|
86
|
-
|
|
86
|
+
// execFileSync (no shell) — filePath is passed as an argv element, so shell
|
|
87
|
+
// metacharacters in a path can never be interpreted. stderr is piped (not
|
|
88
|
+
// inherited), so a non-repo dir stays quiet without a `2>/dev/null` redirect.
|
|
89
|
+
execFileSync('git', ['check-ignore', '-q', filePath], {
|
|
87
90
|
cwd: process.cwd(),
|
|
88
91
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
89
92
|
});
|
package/dist/audit/index.d.ts
CHANGED
|
@@ -6,7 +6,10 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { discoverMemoryFiles, isShieldCortexOwnMemoryPath, queueMemoryFileScanFindings, scanMemories, scanMemoryFilesDetailed, } from './memory-scanner.js';
|
|
8
8
|
export type { DetailedMemoryFileScanResult, DiscoveredMemoryFile, MemoryFileDiscoveryOptions, MemoryFileEvidence, MemoryFileQuarantineQueueItem, MemoryFileQuarantineQueueResult, MemoryFileRisk, MemoryFileScanRecord, MemoryFileScanSummary, } from './memory-scanner.js';
|
|
9
|
-
export { scanMcpConfigs } from './mcp-config-scanner.js';
|
|
9
|
+
export { scanMcpConfigs, discoverMcpServers } from './mcp-config-scanner.js';
|
|
10
|
+
export type { DiscoveredMcpServer } from './mcp-config-scanner.js';
|
|
11
|
+
export { scanMcpTools, scanToolList, scanToolFields, computeDrift, hashTool, serialiseTool, fetchServerTools, formatToolsReport, } from './mcp-tools-scanner.js';
|
|
12
|
+
export type { McpToolDescriptor, McpToolsScanReport, ToolDrift, ToolHashStore, DriftStatus, } from './mcp-tools-scanner.js';
|
|
10
13
|
export { scanEnvFiles } from './env-scanner.js';
|
|
11
14
|
export { scanRulesFiles } from './rules-file-scanner.js';
|
|
12
15
|
export { scanDependencies, resolveNodeModulesPath, quarantinePackage, cleanPackage } from './dependency-scanner.js';
|
package/dist/audit/index.js
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* AI agent environments.
|
|
6
6
|
*/
|
|
7
7
|
export { discoverMemoryFiles, isShieldCortexOwnMemoryPath, queueMemoryFileScanFindings, scanMemories, scanMemoryFilesDetailed, } from './memory-scanner.js';
|
|
8
|
-
export { scanMcpConfigs } from './mcp-config-scanner.js';
|
|
8
|
+
export { scanMcpConfigs, discoverMcpServers } from './mcp-config-scanner.js';
|
|
9
|
+
export { scanMcpTools, scanToolList, scanToolFields, computeDrift, hashTool, serialiseTool, fetchServerTools, formatToolsReport, } from './mcp-tools-scanner.js';
|
|
9
10
|
export { scanEnvFiles } from './env-scanner.js';
|
|
10
11
|
export { scanRulesFiles } from './rules-file-scanner.js';
|
|
11
12
|
export { scanDependencies, resolveNodeModulesPath, quarantinePackage, cleanPackage } from './dependency-scanner.js';
|
|
@@ -7,6 +7,29 @@
|
|
|
7
7
|
* - Servers with overly permissive permissions
|
|
8
8
|
*/
|
|
9
9
|
import type { ScannerResult } from './types.js';
|
|
10
|
+
export interface DiscoveredMcpServer {
|
|
11
|
+
/** Server key from the config (e.g. "memory", "github") */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Config file this server was discovered in */
|
|
14
|
+
source: string;
|
|
15
|
+
/** Config file path */
|
|
16
|
+
sourcePath: string;
|
|
17
|
+
/** Executable to spawn */
|
|
18
|
+
command: string;
|
|
19
|
+
/** Arguments passed to the command */
|
|
20
|
+
args: string[];
|
|
21
|
+
/** Extra environment variables for the child */
|
|
22
|
+
env: Record<string, string>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Discover all configured, locally-spawnable (stdio) MCP servers across every
|
|
26
|
+
* known config location. Reuses `getConfigLocations()` + `extractServers()` so
|
|
27
|
+
* path logic lives in exactly one place.
|
|
28
|
+
*
|
|
29
|
+
* Servers are de-duplicated by name (first config wins) so the same logical
|
|
30
|
+
* server defined in both a global and project config isn't scanned twice.
|
|
31
|
+
*/
|
|
32
|
+
export declare function discoverMcpServers(): DiscoveredMcpServer[];
|
|
10
33
|
/**
|
|
11
34
|
* Run the MCP config scanner.
|
|
12
35
|
*/
|