shieldcortex 4.27.2 → 4.27.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dashboard/.next/standalone/dashboard/.next/BUILD_ID +1 -1
- package/dashboard/.next/standalone/dashboard/.next/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/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/dist/api/sql-classifier.d.ts +32 -0
- package/dist/api/sql-classifier.js +277 -0
- package/dist/api/visualization-server.js +25 -19
- package/dist/cloud/cli.js +20 -1
- package/dist/cloud/config.js +21 -1
- package/dist/cloud/memory-sync.d.ts +5 -0
- package/dist/cloud/memory-sync.js +5 -1
- package/dist/cloud/verify.js +2 -1
- package/dist/defence/trust/env-detector.d.ts +31 -0
- package/dist/defence/trust/env-detector.js +50 -0
- package/dist/defence/trust/index.d.ts +4 -1
- package/dist/defence/trust/index.js +2 -1
- package/dist/defence/trust/resolve-tool-source.d.ts +27 -0
- package/dist/defence/trust/resolve-tool-source.js +80 -0
- package/dist/server.js +22 -32
- package/package.json +3 -2
- /package/dashboard/.next/standalone/dashboard/.next/static/{x2AmqK_Ci5s40_dIsKhc_ → ObhI00_RVqLccblwYt339}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{x2AmqK_Ci5s40_dIsKhc_ → ObhI00_RVqLccblwYt339}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{x2AmqK_Ci5s40_dIsKhc_ → ObhI00_RVqLccblwYt339}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--ObhI00_RVqLccblwYt339--><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/a7d5d0791c8c6223.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/a7d5d0791c8c6223.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/a7d5d0791c8c6223.css\",\"style\"]\n:HL[\"/_next/static/chunks/aee9601911b790ca.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"ObhI00_RVqLccblwYt339\",\"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/a7d5d0791c8c6223.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><!--ObhI00_RVqLccblwYt339--><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\":\"ObhI00_RVqLccblwYt339\",\"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>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL Console Query Classifier
|
|
3
|
+
*
|
|
4
|
+
* Categorises an SQL query as read / write / reject for the local dashboard
|
|
5
|
+
* SQL console. Used by visualization-server's `/api/sql` endpoint to enforce
|
|
6
|
+
* a defensive allow-list that the original `startsWith()` check could bypass
|
|
7
|
+
* via a CTE prefix (e.g. `WITH t AS (SELECT 1) INSERT INTO ...`).
|
|
8
|
+
*
|
|
9
|
+
* Design goals:
|
|
10
|
+
* - Fail closed: anything we cannot classify becomes `reject`.
|
|
11
|
+
* - No SQL grammar: just a defensive peek past leading comments and CTEs
|
|
12
|
+
* to find the FIRST real keyword.
|
|
13
|
+
* - Cheap and synchronous — runs in the request hot path.
|
|
14
|
+
*/
|
|
15
|
+
export type SqlClassification = {
|
|
16
|
+
kind: 'read';
|
|
17
|
+
} | {
|
|
18
|
+
kind: 'write';
|
|
19
|
+
operation: 'INSERT' | 'UPDATE' | 'DELETE' | 'REPLACE' | 'ALTER' | 'CREATE';
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'destroy';
|
|
22
|
+
operation: 'DROP' | 'TRUNCATE';
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'reject';
|
|
25
|
+
reason: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Classify a query as read / write / destroy / reject.
|
|
29
|
+
*
|
|
30
|
+
* Fail-closed: any structure we can't confidently classify becomes `reject`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function classifySqlQuery(rawQuery: string): SqlClassification;
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
const READ_KEYWORDS = new Set(['SELECT', 'PRAGMA', 'EXPLAIN', 'VALUES']);
|
|
2
|
+
const WRITE_KEYWORDS = new Set(['INSERT', 'UPDATE', 'DELETE', 'REPLACE', 'ALTER', 'CREATE']);
|
|
3
|
+
const DESTROY_KEYWORDS = new Set(['DROP', 'TRUNCATE']);
|
|
4
|
+
/**
|
|
5
|
+
* Strip SQL comments (line + block) and leading whitespace from the start of
|
|
6
|
+
* a query string. Returns the cleaned query with all leading noise removed.
|
|
7
|
+
*
|
|
8
|
+
* Note: this only strips LEADING comments/whitespace — we don't try to scrub
|
|
9
|
+
* comments inside string literals or anywhere else, because we only care
|
|
10
|
+
* about identifying the first real token.
|
|
11
|
+
*/
|
|
12
|
+
function stripLeadingNoise(query) {
|
|
13
|
+
let i = 0;
|
|
14
|
+
const n = query.length;
|
|
15
|
+
while (i < n) {
|
|
16
|
+
const ch = query[i];
|
|
17
|
+
// whitespace
|
|
18
|
+
if (ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r' || ch === '\f' || ch === '\v') {
|
|
19
|
+
i++;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
// line comment: -- ... \n
|
|
23
|
+
if (ch === '-' && query[i + 1] === '-') {
|
|
24
|
+
i += 2;
|
|
25
|
+
while (i < n && query[i] !== '\n')
|
|
26
|
+
i++;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
// block comment: /* ... */
|
|
30
|
+
if (ch === '/' && query[i + 1] === '*') {
|
|
31
|
+
i += 2;
|
|
32
|
+
while (i < n && !(query[i] === '*' && query[i + 1] === '/'))
|
|
33
|
+
i++;
|
|
34
|
+
if (i < n)
|
|
35
|
+
i += 2; // skip closing */
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
return query.slice(i);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Skip past a balanced-parenthesis block starting at `start` (which should
|
|
44
|
+
* point AT the opening '('). Returns the index just past the matching ')',
|
|
45
|
+
* or -1 if no matching paren is found.
|
|
46
|
+
*
|
|
47
|
+
* Aware of single-quoted string literals (SQL standard '' escape) and
|
|
48
|
+
* double-quoted identifiers (SQLite). Bracket [] and backtick `` quoting
|
|
49
|
+
* are also handled because SQLite accepts them.
|
|
50
|
+
*/
|
|
51
|
+
function skipParenBlock(query, start) {
|
|
52
|
+
if (query[start] !== '(')
|
|
53
|
+
return -1;
|
|
54
|
+
let depth = 0;
|
|
55
|
+
let i = start;
|
|
56
|
+
const n = query.length;
|
|
57
|
+
while (i < n) {
|
|
58
|
+
const ch = query[i];
|
|
59
|
+
if (ch === '(') {
|
|
60
|
+
depth++;
|
|
61
|
+
i++;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (ch === ')') {
|
|
65
|
+
depth--;
|
|
66
|
+
i++;
|
|
67
|
+
if (depth === 0)
|
|
68
|
+
return i;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (ch === "'") {
|
|
72
|
+
// skip single-quoted string with SQL '' escape
|
|
73
|
+
i++;
|
|
74
|
+
while (i < n) {
|
|
75
|
+
if (query[i] === "'") {
|
|
76
|
+
if (query[i + 1] === "'") {
|
|
77
|
+
i += 2;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
i++;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
i++;
|
|
84
|
+
}
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (ch === '"') {
|
|
88
|
+
i++;
|
|
89
|
+
while (i < n && query[i] !== '"')
|
|
90
|
+
i++;
|
|
91
|
+
if (i < n)
|
|
92
|
+
i++;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (ch === '`') {
|
|
96
|
+
i++;
|
|
97
|
+
while (i < n && query[i] !== '`')
|
|
98
|
+
i++;
|
|
99
|
+
if (i < n)
|
|
100
|
+
i++;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (ch === '[') {
|
|
104
|
+
i++;
|
|
105
|
+
while (i < n && query[i] !== ']')
|
|
106
|
+
i++;
|
|
107
|
+
if (i < n)
|
|
108
|
+
i++;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
// inline comments inside the CTE body
|
|
112
|
+
if (ch === '-' && query[i + 1] === '-') {
|
|
113
|
+
i += 2;
|
|
114
|
+
while (i < n && query[i] !== '\n')
|
|
115
|
+
i++;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (ch === '/' && query[i + 1] === '*') {
|
|
119
|
+
i += 2;
|
|
120
|
+
while (i < n && !(query[i] === '*' && query[i + 1] === '/'))
|
|
121
|
+
i++;
|
|
122
|
+
if (i < n)
|
|
123
|
+
i += 2;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
i++;
|
|
127
|
+
}
|
|
128
|
+
return -1;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Read the next uppercase keyword token at `i`, skipping leading
|
|
132
|
+
* whitespace/comments first. Returns the keyword and the index just past it,
|
|
133
|
+
* or null if no identifier token is present.
|
|
134
|
+
*/
|
|
135
|
+
function readNextKeyword(query, i) {
|
|
136
|
+
const trimmed = stripLeadingNoise(query.slice(i));
|
|
137
|
+
if (!trimmed)
|
|
138
|
+
return null;
|
|
139
|
+
const offset = query.length - trimmed.length;
|
|
140
|
+
const match = /^([A-Za-z_][A-Za-z0-9_]*)/.exec(trimmed);
|
|
141
|
+
if (!match)
|
|
142
|
+
return null;
|
|
143
|
+
return {
|
|
144
|
+
keyword: match[1].toUpperCase(),
|
|
145
|
+
nextIndex: offset + match[1].length,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Walk past a CTE list (`WITH [RECURSIVE] name [(...)] AS (...) [, ...]`)
|
|
150
|
+
* and return the index at the first real statement keyword.
|
|
151
|
+
* Returns -1 if the structure doesn't look like a valid CTE list.
|
|
152
|
+
*/
|
|
153
|
+
function skipCteList(query, afterWithIndex) {
|
|
154
|
+
let i = afterWithIndex;
|
|
155
|
+
const n = query.length;
|
|
156
|
+
// optional RECURSIVE
|
|
157
|
+
const first = readNextKeyword(query, i);
|
|
158
|
+
if (!first)
|
|
159
|
+
return -1;
|
|
160
|
+
if (first.keyword === 'RECURSIVE') {
|
|
161
|
+
i = first.nextIndex;
|
|
162
|
+
}
|
|
163
|
+
// parse one or more "<name> [(...)] AS (...)" groups, comma separated
|
|
164
|
+
while (i < n) {
|
|
165
|
+
// CTE name (identifier)
|
|
166
|
+
const nameStripped = stripLeadingNoise(query.slice(i));
|
|
167
|
+
if (!nameStripped)
|
|
168
|
+
return -1;
|
|
169
|
+
i = n - nameStripped.length;
|
|
170
|
+
// name can be bracketed/quoted; for our purposes we just need to consume it
|
|
171
|
+
const ch = query[i];
|
|
172
|
+
if (ch === '"' || ch === '`' || ch === '[') {
|
|
173
|
+
const close = ch === '[' ? ']' : ch;
|
|
174
|
+
i++;
|
|
175
|
+
while (i < n && query[i] !== close)
|
|
176
|
+
i++;
|
|
177
|
+
if (i < n)
|
|
178
|
+
i++;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const m = /^[A-Za-z_][A-Za-z0-9_]*/.exec(query.slice(i));
|
|
182
|
+
if (!m)
|
|
183
|
+
return -1;
|
|
184
|
+
i += m[0].length;
|
|
185
|
+
}
|
|
186
|
+
// optional column list (col1, col2, ...)
|
|
187
|
+
const afterName = stripLeadingNoise(query.slice(i));
|
|
188
|
+
i = n - afterName.length;
|
|
189
|
+
if (query[i] === '(') {
|
|
190
|
+
const end = skipParenBlock(query, i);
|
|
191
|
+
if (end < 0)
|
|
192
|
+
return -1;
|
|
193
|
+
i = end;
|
|
194
|
+
}
|
|
195
|
+
// mandatory AS
|
|
196
|
+
const asKeyword = readNextKeyword(query, i);
|
|
197
|
+
if (!asKeyword || asKeyword.keyword !== 'AS')
|
|
198
|
+
return -1;
|
|
199
|
+
i = asKeyword.nextIndex;
|
|
200
|
+
// optional MATERIALIZED / NOT MATERIALIZED
|
|
201
|
+
const maybeMat = readNextKeyword(query, i);
|
|
202
|
+
if (maybeMat && maybeMat.keyword === 'NOT') {
|
|
203
|
+
const next = readNextKeyword(query, maybeMat.nextIndex);
|
|
204
|
+
if (next && next.keyword === 'MATERIALIZED') {
|
|
205
|
+
i = next.nextIndex;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else if (maybeMat && maybeMat.keyword === 'MATERIALIZED') {
|
|
209
|
+
i = maybeMat.nextIndex;
|
|
210
|
+
}
|
|
211
|
+
// mandatory ( CTE body )
|
|
212
|
+
const stripped = stripLeadingNoise(query.slice(i));
|
|
213
|
+
i = n - stripped.length;
|
|
214
|
+
if (query[i] !== '(')
|
|
215
|
+
return -1;
|
|
216
|
+
const bodyEnd = skipParenBlock(query, i);
|
|
217
|
+
if (bodyEnd < 0)
|
|
218
|
+
return -1;
|
|
219
|
+
i = bodyEnd;
|
|
220
|
+
// comma → another CTE, else we're done
|
|
221
|
+
const after = stripLeadingNoise(query.slice(i));
|
|
222
|
+
i = n - after.length;
|
|
223
|
+
if (query[i] === ',') {
|
|
224
|
+
i++;
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
return i;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Classify a query as read / write / destroy / reject.
|
|
233
|
+
*
|
|
234
|
+
* Fail-closed: any structure we can't confidently classify becomes `reject`.
|
|
235
|
+
*/
|
|
236
|
+
export function classifySqlQuery(rawQuery) {
|
|
237
|
+
if (typeof rawQuery !== 'string' || rawQuery.trim().length === 0) {
|
|
238
|
+
return { kind: 'reject', reason: 'Empty query' };
|
|
239
|
+
}
|
|
240
|
+
const stripped = stripLeadingNoise(rawQuery);
|
|
241
|
+
if (!stripped) {
|
|
242
|
+
return { kind: 'reject', reason: 'Empty query after stripping comments' };
|
|
243
|
+
}
|
|
244
|
+
const first = readNextKeyword(rawQuery, rawQuery.length - stripped.length);
|
|
245
|
+
if (!first) {
|
|
246
|
+
return { kind: 'reject', reason: 'Could not identify leading keyword' };
|
|
247
|
+
}
|
|
248
|
+
let leadIndex = first.nextIndex;
|
|
249
|
+
let leadKeyword = first.keyword;
|
|
250
|
+
// Peek past CTE prefix (the security-critical bit)
|
|
251
|
+
if (leadKeyword === 'WITH') {
|
|
252
|
+
const afterCte = skipCteList(rawQuery, first.nextIndex);
|
|
253
|
+
if (afterCte < 0) {
|
|
254
|
+
return { kind: 'reject', reason: 'Malformed CTE prefix' };
|
|
255
|
+
}
|
|
256
|
+
const realFirst = readNextKeyword(rawQuery, afterCte);
|
|
257
|
+
if (!realFirst) {
|
|
258
|
+
return { kind: 'reject', reason: 'No statement after CTE prefix' };
|
|
259
|
+
}
|
|
260
|
+
leadKeyword = realFirst.keyword;
|
|
261
|
+
leadIndex = realFirst.nextIndex;
|
|
262
|
+
}
|
|
263
|
+
// Also reject any DROP/TRUNCATE anywhere in the query as defense-in-depth.
|
|
264
|
+
// (visualization-server's outer check already does this, but classify it
|
|
265
|
+
// here too so the function is correct on its own.)
|
|
266
|
+
if (DESTROY_KEYWORDS.has(leadKeyword)) {
|
|
267
|
+
return { kind: 'destroy', operation: leadKeyword };
|
|
268
|
+
}
|
|
269
|
+
if (WRITE_KEYWORDS.has(leadKeyword)) {
|
|
270
|
+
return { kind: 'write', operation: leadKeyword };
|
|
271
|
+
}
|
|
272
|
+
if (READ_KEYWORDS.has(leadKeyword)) {
|
|
273
|
+
return { kind: 'read' };
|
|
274
|
+
}
|
|
275
|
+
void leadIndex; // not needed by callers, but useful while debugging
|
|
276
|
+
return { kind: 'reject', reason: `Unrecognised leading keyword: ${leadKeyword}` };
|
|
277
|
+
}
|
|
@@ -40,6 +40,7 @@ import { registerDigestRoutes } from './routes/digest.js';
|
|
|
40
40
|
import { registerSessionRoutes } from './routes/sessions.js';
|
|
41
41
|
import { createIronDomeRouteGuard } from './iron-dome-route-guard.js';
|
|
42
42
|
import { readAndClearDetectionEvents } from '../xray/activity.js';
|
|
43
|
+
import { classifySqlQuery } from './sql-classifier.js';
|
|
43
44
|
const PORT = process.env.PORT || 3001;
|
|
44
45
|
/**
|
|
45
46
|
* In-memory counters for FEATURE_GATED (403) responses per feature.
|
|
@@ -157,15 +158,19 @@ export function startVisualizationServer(dbPath) {
|
|
|
157
158
|
});
|
|
158
159
|
}
|
|
159
160
|
function classifySqlAction(req) {
|
|
160
|
-
const query = typeof req.body?.query === 'string' ? req.body.query
|
|
161
|
-
if (!query)
|
|
161
|
+
const query = typeof req.body?.query === 'string' ? req.body.query : '';
|
|
162
|
+
if (!query.trim())
|
|
162
163
|
return 'database_migrate';
|
|
163
|
-
|
|
164
|
+
// PURGE is application-level (not a real SQL keyword) — keep the regex check.
|
|
165
|
+
if (/\bPURGE\b/i.test(query))
|
|
166
|
+
return 'destroy';
|
|
167
|
+
const classification = classifySqlQuery(query);
|
|
168
|
+
if (classification.kind === 'read')
|
|
164
169
|
return 'run_report';
|
|
165
|
-
if (
|
|
166
|
-
return 'delete';
|
|
167
|
-
if (/\bDROP\b|\bTRUNCATE\b|\bPURGE\b/.test(query))
|
|
170
|
+
if (classification.kind === 'destroy')
|
|
168
171
|
return 'destroy';
|
|
172
|
+
if (classification.kind === 'write' && classification.operation === 'DELETE')
|
|
173
|
+
return 'delete';
|
|
169
174
|
return 'database_migrate';
|
|
170
175
|
}
|
|
171
176
|
// ============================================
|
|
@@ -213,29 +218,30 @@ export function startVisualizationServer(dbPath) {
|
|
|
213
218
|
if (!query || typeof query !== 'string') {
|
|
214
219
|
return res.status(400).json({ error: 'Query string required' });
|
|
215
220
|
}
|
|
216
|
-
|
|
217
|
-
//
|
|
218
|
-
|
|
221
|
+
// Classify the query — robust against CTE prefixes that would bypass
|
|
222
|
+
// a naive `startsWith('INSERT'|'UPDATE'|...)` check, e.g.
|
|
223
|
+
// WITH t AS (SELECT 1) INSERT INTO memories VALUES (...)
|
|
224
|
+
const classification = classifySqlQuery(query);
|
|
225
|
+
// Always block DROP and TRUNCATE (and reject anything we can't classify)
|
|
226
|
+
if (classification.kind === 'destroy') {
|
|
219
227
|
return res.status(403).json({
|
|
220
228
|
error: 'DROP and TRUNCATE operations are blocked for safety',
|
|
221
229
|
});
|
|
222
230
|
}
|
|
231
|
+
if (classification.kind === 'reject') {
|
|
232
|
+
return res.status(400).json({
|
|
233
|
+
error: `Query rejected: ${classification.reason}`,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
223
236
|
// Block writes unless explicitly allowed
|
|
224
|
-
|
|
225
|
-
upperQuery.startsWith('UPDATE') ||
|
|
226
|
-
upperQuery.startsWith('DELETE') ||
|
|
227
|
-
upperQuery.startsWith('ALTER') ||
|
|
228
|
-
upperQuery.startsWith('CREATE');
|
|
229
|
-
if (isWriteOperation && !allowWrite) {
|
|
237
|
+
if (classification.kind === 'write' && !allowWrite) {
|
|
230
238
|
return res.status(403).json({
|
|
231
239
|
error: 'Write operations are disabled. Enable allowWrite to execute.',
|
|
232
240
|
});
|
|
233
241
|
}
|
|
234
242
|
const db = getDatabase();
|
|
235
243
|
const startTime = Date.now();
|
|
236
|
-
|
|
237
|
-
const isSelect = upperQuery.startsWith('SELECT') || upperQuery.startsWith('PRAGMA');
|
|
238
|
-
if (isSelect) {
|
|
244
|
+
if (classification.kind === 'read') {
|
|
239
245
|
const rows = db.prepare(query).all();
|
|
240
246
|
const executionTime = Date.now() - startTime;
|
|
241
247
|
// Get column names from first row or empty
|
|
@@ -248,7 +254,7 @@ export function startVisualizationServer(dbPath) {
|
|
|
248
254
|
});
|
|
249
255
|
}
|
|
250
256
|
else {
|
|
251
|
-
// Write operation
|
|
257
|
+
// Write operation (allowWrite === true at this point)
|
|
252
258
|
const result = db.prepare(query).run();
|
|
253
259
|
const executionTime = Date.now() - startTime;
|
|
254
260
|
res.json({
|
package/dist/cloud/cli.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getCloudConfig, setCloudConfig, getDefenceMode, setDefenceMode, getVerifyConfig, setVerifyConfig, getReviewCopilotConfig, getOpenClawAutoMemory, setOpenClawAutoMemory, isProactiveRecallEnabled, setProactiveRecall, restore410Defaults, getRankerConfig, setRankerConfig, } from './config.js';
|
|
1
|
+
import { getCloudConfig, setCloudConfig, getCloudSyncControls, setCloudSyncControls, getDefenceMode, setDefenceMode, getVerifyConfig, setVerifyConfig, getReviewCopilotConfig, getOpenClawAutoMemory, setOpenClawAutoMemory, isProactiveRecallEnabled, setProactiveRecall, restore410Defaults, getRankerConfig, setRankerConfig, } from './config.js';
|
|
2
2
|
const VALID_RANKER_ENGINES = ['rrf', 'legacy'];
|
|
3
3
|
import { syncAllGraphToCloud } from './graph-sync.js';
|
|
4
4
|
import { syncAllMemoriesToCloud } from './memory-sync.js';
|
|
@@ -16,12 +16,14 @@ export function handleCloudConfig(args) {
|
|
|
16
16
|
const reviewCopilot = getReviewCopilotConfig();
|
|
17
17
|
const openclawAutoMemory = getOpenClawAutoMemory();
|
|
18
18
|
const ranker = getRankerConfig();
|
|
19
|
+
const syncControls = getCloudSyncControls();
|
|
19
20
|
const rankerOverridden = !!process.env.SHIELDCORTEX_RANKER;
|
|
20
21
|
console.log('\nShieldCortex Configuration:');
|
|
21
22
|
console.log(` Defence Mode: ${mode}`);
|
|
22
23
|
console.log(` Cloud Enabled: ${config.cloudEnabled ? 'Yes' : 'No'}`);
|
|
23
24
|
console.log(` API Key: ${config.cloudApiKey ? config.cloudApiKey.substring(0, 12) + '...' : 'Not set'}`);
|
|
24
25
|
console.log(` Base URL: ${config.cloudBaseUrl}`);
|
|
26
|
+
console.log(` Sensitive Memories: ${syncControls.excludeSensitive ? 'Excluded from sync (safe default)' : 'Included in sync'}`);
|
|
25
27
|
console.log(` LLM Verify: ${verify.verifyEnabled ? 'Enabled' : 'Disabled'} (${verify.verifyMode}, ${verify.verifyTimeoutMs}ms timeout)`);
|
|
26
28
|
console.log(` Verify Triggers: ${verify.verifyTriggers.join(', ')}`);
|
|
27
29
|
console.log(` Local AI Explainer: ${reviewCopilot.enabled ? 'Enabled' : 'Disabled'} (${reviewCopilot.modelId})`);
|
|
@@ -65,6 +67,21 @@ export function handleCloudConfig(args) {
|
|
|
65
67
|
console.log('Cloud sync disabled.');
|
|
66
68
|
changed = true;
|
|
67
69
|
}
|
|
70
|
+
// ── Sensitive-content opt-in/opt-out ──
|
|
71
|
+
// Default since v4.27: CONFIDENTIAL+ memories are NOT shipped to the cloud.
|
|
72
|
+
// Users who genuinely want to mirror sensitive content (e.g. self-hosted
|
|
73
|
+
// backend on their own network) can opt back in here.
|
|
74
|
+
if (args.includes('--cloud-include-sensitive')) {
|
|
75
|
+
setCloudSyncControls({ excludeSensitive: false });
|
|
76
|
+
console.log('Cloud sync will now include CONFIDENTIAL+ memories.');
|
|
77
|
+
console.log('Note: content is sent to your configured cloudBaseUrl in full.');
|
|
78
|
+
changed = true;
|
|
79
|
+
}
|
|
80
|
+
if (args.includes('--cloud-exclude-sensitive')) {
|
|
81
|
+
setCloudSyncControls({ excludeSensitive: true });
|
|
82
|
+
console.log('Cloud sync will skip CONFIDENTIAL+ memories (default).');
|
|
83
|
+
changed = true;
|
|
84
|
+
}
|
|
68
85
|
// ── Verify flags ──
|
|
69
86
|
if (args.includes('--verify-enable')) {
|
|
70
87
|
const config = getCloudConfig();
|
|
@@ -190,6 +207,8 @@ export function handleCloudConfig(args) {
|
|
|
190
207
|
console.log(' --cloud-url <url> Set cloud base URL');
|
|
191
208
|
console.log(' --cloud-enable Enable cloud sync');
|
|
192
209
|
console.log(' --cloud-disable Disable cloud sync');
|
|
210
|
+
console.log(' --cloud-include-sensitive Sync CONFIDENTIAL+ memories (off by default since v4.27)');
|
|
211
|
+
console.log(' --cloud-exclude-sensitive Stop syncing CONFIDENTIAL+ memories (default)');
|
|
193
212
|
console.log(' --cloud-status Show current configuration');
|
|
194
213
|
console.log(' --openclaw-auto-memory <true|false> Extract memories from OpenClaw LLM output (default: off)');
|
|
195
214
|
console.log(' --proactive-recall <true|false> Inject SC memory into prompts (default: off — adds latency)');
|
package/dist/cloud/config.js
CHANGED
|
@@ -18,11 +18,18 @@ function getIntegrityKeyFile() {
|
|
|
18
18
|
return join(getConfigDir(), '.integrity-key');
|
|
19
19
|
}
|
|
20
20
|
const DEFAULT_BASE_URL = 'https://api.shieldcortex.ai';
|
|
21
|
+
// Safety-first defaults: CONFIDENTIAL+ memories are NOT shipped to the cloud
|
|
22
|
+
// unless the user explicitly opts in via `--cloud-include-sensitive` or the
|
|
23
|
+
// dashboard. Prior to the v4.27 flip, `excludeSensitive` defaulted to false,
|
|
24
|
+
// which meant enabling cloud sync silently shipped credential-bearing /
|
|
25
|
+
// classified content without per-record consent. `contentMode` stays 'full'
|
|
26
|
+
// so the opt-in sync stream remains useful for PUBLIC/INTERNAL records that
|
|
27
|
+
// the user did consent to share.
|
|
21
28
|
const DEFAULT_SYNC_CONTROLS = {
|
|
22
29
|
projectMode: 'all',
|
|
23
30
|
projects: [],
|
|
24
31
|
contentMode: 'full',
|
|
25
|
-
excludeSensitive:
|
|
32
|
+
excludeSensitive: true,
|
|
26
33
|
};
|
|
27
34
|
const DEFAULT_REVIEW_COPILOT_CONFIG = {
|
|
28
35
|
enabled: false,
|
|
@@ -164,6 +171,19 @@ function normalizeProjectList(value) {
|
|
|
164
171
|
}
|
|
165
172
|
export function getCloudSyncControls() {
|
|
166
173
|
const raw = readRawConfig();
|
|
174
|
+
// One-shot v4.27 migration: pre-upgrade configs with cloud sync enabled
|
|
175
|
+
// were silently shipping CONFIDENTIAL+ content because `excludeSensitive`
|
|
176
|
+
// defaulted to false. Detect those configs (cloud on, no explicit setting,
|
|
177
|
+
// no prior migration stamp) and rewrite them to the new safe default. If
|
|
178
|
+
// the user later opts back in via `--cloud-include-sensitive`, that writes
|
|
179
|
+
// `cloudSyncExcludeSensitive: false` explicitly and this branch is skipped.
|
|
180
|
+
if (raw.cloudEnabled === true &&
|
|
181
|
+
typeof raw.cloudSyncExcludeSensitive !== 'boolean' &&
|
|
182
|
+
typeof raw.cloudSyncDefaultsMigratedAt !== 'string') {
|
|
183
|
+
raw.cloudSyncExcludeSensitive = true;
|
|
184
|
+
raw.cloudSyncDefaultsMigratedAt = new Date().toISOString();
|
|
185
|
+
writeRawConfig(raw);
|
|
186
|
+
}
|
|
167
187
|
const projectMode = raw.cloudSyncProjectMode;
|
|
168
188
|
const contentMode = raw.cloudSyncContentMode;
|
|
169
189
|
return {
|
|
@@ -28,6 +28,11 @@ export interface MemorySyncEnvelope {
|
|
|
28
28
|
platform: string;
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Per-record sync gate. Exported for unit testing the safety contract:
|
|
33
|
+
* a CONFIDENTIAL record on fresh-default controls MUST return false.
|
|
34
|
+
*/
|
|
35
|
+
export declare function shouldSyncRecord(record: Pick<SyncedMemoryRecord, 'project' | 'sensitivity_level' | 'cloud_excluded'>): boolean;
|
|
31
36
|
export declare function syncMemoryUpsertToCloud(memory: Memory): void;
|
|
32
37
|
export declare function syncMemoryDeleteToCloud(memory: Memory): void;
|
|
33
38
|
export declare function syncAllMemoriesToCloud(): Promise<{
|
|
@@ -44,7 +44,11 @@ function buildEnvelope(records) {
|
|
|
44
44
|
},
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Per-record sync gate. Exported for unit testing the safety contract:
|
|
49
|
+
* a CONFIDENTIAL record on fresh-default controls MUST return false.
|
|
50
|
+
*/
|
|
51
|
+
export function shouldSyncRecord(record) {
|
|
48
52
|
if (record.cloud_excluded)
|
|
49
53
|
return false;
|
|
50
54
|
const controls = getCloudSyncControls();
|
package/dist/cloud/verify.js
CHANGED
|
@@ -27,9 +27,10 @@ export async function submitVerification(content, title, pipelineResult, source)
|
|
|
27
27
|
}
|
|
28
28
|
// Redact credentials before sending to cloud
|
|
29
29
|
const cleanContent = redactCredentials(content);
|
|
30
|
+
const cleanTitle = redactCredentials(title);
|
|
30
31
|
const payload = {
|
|
31
32
|
content: cleanContent,
|
|
32
|
-
title,
|
|
33
|
+
title: cleanTitle,
|
|
33
34
|
source_type: source.type,
|
|
34
35
|
source_identifier: source.identifier,
|
|
35
36
|
anomaly_score: pipelineResult.firewall.anomalyScore,
|