shieldcortex 4.27.3 → 4.28.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/routes/memories.js +1 -1
- package/dist/api/visualization-server.d.ts +39 -0
- package/dist/api/visualization-server.js +127 -72
- package/dist/database/inline-schema.js +3 -0
- package/dist/database/migrations.js +25 -0
- package/dist/database/schema.sql +5 -0
- package/dist/license/store.js +42 -2
- package/dist/memory/consolidate.js +13 -0
- package/dist/memory/store.d.ts +1 -1
- package/dist/memory/store.js +13 -1
- package/package.json +1 -1
- package/scripts/lib/capture-prompt.mjs +160 -0
- package/scripts/lib/session-capture.mjs +8 -2
- package/scripts/prompt-recall-hook.mjs +11 -2
- /package/dashboard/.next/standalone/dashboard/.next/static/{ObhI00_RVqLccblwYt339 → N9XiRuuRX4eTtiJFa43tY}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{ObhI00_RVqLccblwYt339 → N9XiRuuRX4eTtiJFa43tY}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{ObhI00_RVqLccblwYt339 → N9XiRuuRX4eTtiJFa43tY}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--N9XiRuuRX4eTtiJFa43tY--><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\":\"N9XiRuuRX4eTtiJFa43tY\",\"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><!--N9XiRuuRX4eTtiJFa43tY--><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\":\"N9XiRuuRX4eTtiJFa43tY\",\"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>
|
|
@@ -501,7 +501,7 @@ export function registerMemoryRoutes(app, deps) {
|
|
|
501
501
|
if (keptId === removedId) {
|
|
502
502
|
return res.status(400).json({ error: 'keptId and removedId must be different' });
|
|
503
503
|
}
|
|
504
|
-
const merged = mergeMemories(keptId, removedId, { reviewedBy });
|
|
504
|
+
const merged = mergeMemories(keptId, removedId, { reviewedBy }, { type: 'api', identifier: 'dashboard:memory-merge' });
|
|
505
505
|
if (!merged) {
|
|
506
506
|
return res.status(404).json({ error: 'Unable to merge memories' });
|
|
507
507
|
}
|
|
@@ -4,6 +4,45 @@
|
|
|
4
4
|
* Provides REST endpoints and WebSocket for the Brain Dashboard.
|
|
5
5
|
* Runs alongside or instead of the MCP server.
|
|
6
6
|
*/
|
|
7
|
+
import { Request, Response } from 'express';
|
|
8
|
+
import type { DefenceSource } from '../defence/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Normalise an incoming `source` object from a REST request body into a
|
|
11
|
+
* trusted `DefenceSource`.
|
|
12
|
+
*
|
|
13
|
+
* - Unknown `type` values fall back to `'api'` (no rejection — defence in depth)
|
|
14
|
+
* - `identifier` longer than {@link MAX_SOURCE_IDENTIFIER_LENGTH} is truncated
|
|
15
|
+
* with an ellipsis ("…") so the truncation is visible in audit logs
|
|
16
|
+
* - Non-string identifiers fall back to `'rest-api'`
|
|
17
|
+
*
|
|
18
|
+
* Exported for unit tests.
|
|
19
|
+
*/
|
|
20
|
+
export declare function normaliseDefenceSource(raw: unknown): DefenceSource;
|
|
21
|
+
export declare const __test__: {
|
|
22
|
+
ALLOWED_DEFENCE_SOURCE_TYPES: readonly ("user" | "cli" | "hook" | "agent" | "api" | "email" | "web" | "file" | "tool_response")[];
|
|
23
|
+
MAX_SOURCE_IDENTIFIER_LENGTH: number;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Handler for `POST /api/v1/scan`.
|
|
27
|
+
*
|
|
28
|
+
* Scans content through the defence pipeline. The `config` field on the
|
|
29
|
+
* request body is intentionally ignored — runtime always uses the persisted
|
|
30
|
+
* defence mode. Any attempt to override config is logged as a BLOCK with
|
|
31
|
+
* RESTRICTED sensitivity so incident-triage queries surface it (Fix #13).
|
|
32
|
+
*
|
|
33
|
+
* Exported for unit tests.
|
|
34
|
+
*/
|
|
35
|
+
export declare function handleV1Scan(req: Request, res: Response): void;
|
|
36
|
+
/**
|
|
37
|
+
* Handler for `POST /api/v1/scan/batch`.
|
|
38
|
+
*
|
|
39
|
+
* Scans up to 100 items in one request. Like {@link handleV1Scan}, the
|
|
40
|
+
* `config` field is intentionally ignored; source is normalised through
|
|
41
|
+
* {@link normaliseDefenceSource} (Fix #13).
|
|
42
|
+
*
|
|
43
|
+
* Exported for unit tests.
|
|
44
|
+
*/
|
|
45
|
+
export declare function handleV1ScanBatch(req: Request, res: Response): void;
|
|
7
46
|
/**
|
|
8
47
|
* Start the visualization API server
|
|
9
48
|
*/
|
|
@@ -42,6 +42,42 @@ import { createIronDomeRouteGuard } from './iron-dome-route-guard.js';
|
|
|
42
42
|
import { readAndClearDetectionEvents } from '../xray/activity.js';
|
|
43
43
|
import { classifySqlQuery } from './sql-classifier.js';
|
|
44
44
|
const PORT = process.env.PORT || 3001;
|
|
45
|
+
// ── Defence source whitelist (Fix #13) ──────────────────────────────────────
|
|
46
|
+
// The DefenceSource.type field is part of the threat-model surface — caller-
|
|
47
|
+
// controlled `source.type` values pollute Iron Dome dashboards and audit
|
|
48
|
+
// queries. Normalise unknown values to 'api' silently (defence in depth) and
|
|
49
|
+
// cap identifier length to avoid log-explosion attacks.
|
|
50
|
+
const ALLOWED_DEFENCE_SOURCE_TYPES = [
|
|
51
|
+
'user', 'cli', 'hook', 'email', 'web', 'agent', 'file', 'api', 'tool_response',
|
|
52
|
+
];
|
|
53
|
+
const MAX_SOURCE_IDENTIFIER_LENGTH = 200;
|
|
54
|
+
/**
|
|
55
|
+
* Normalise an incoming `source` object from a REST request body into a
|
|
56
|
+
* trusted `DefenceSource`.
|
|
57
|
+
*
|
|
58
|
+
* - Unknown `type` values fall back to `'api'` (no rejection — defence in depth)
|
|
59
|
+
* - `identifier` longer than {@link MAX_SOURCE_IDENTIFIER_LENGTH} is truncated
|
|
60
|
+
* with an ellipsis ("…") so the truncation is visible in audit logs
|
|
61
|
+
* - Non-string identifiers fall back to `'rest-api'`
|
|
62
|
+
*
|
|
63
|
+
* Exported for unit tests.
|
|
64
|
+
*/
|
|
65
|
+
export function normaliseDefenceSource(raw) {
|
|
66
|
+
const candidate = (raw ?? {});
|
|
67
|
+
const rawType = typeof candidate.type === 'string' ? candidate.type : undefined;
|
|
68
|
+
const type = rawType && ALLOWED_DEFENCE_SOURCE_TYPES.includes(rawType)
|
|
69
|
+
? rawType
|
|
70
|
+
: 'api';
|
|
71
|
+
const rawIdentifier = typeof candidate.identifier === 'string' ? candidate.identifier : 'rest-api';
|
|
72
|
+
const identifier = rawIdentifier.length > MAX_SOURCE_IDENTIFIER_LENGTH
|
|
73
|
+
? rawIdentifier.slice(0, MAX_SOURCE_IDENTIFIER_LENGTH - 1) + '…'
|
|
74
|
+
: rawIdentifier;
|
|
75
|
+
return { type, identifier };
|
|
76
|
+
}
|
|
77
|
+
export const __test__ = {
|
|
78
|
+
ALLOWED_DEFENCE_SOURCE_TYPES,
|
|
79
|
+
MAX_SOURCE_IDENTIFIER_LENGTH,
|
|
80
|
+
};
|
|
45
81
|
/**
|
|
46
82
|
* In-memory counters for FEATURE_GATED (403) responses per feature.
|
|
47
83
|
* Lightweight telemetry to detect noisy free-tier clients hammering gated endpoints.
|
|
@@ -76,6 +112,95 @@ function requireProFeature(feature) {
|
|
|
76
112
|
}
|
|
77
113
|
// Track connected WebSocket clients
|
|
78
114
|
const clients = new Set();
|
|
115
|
+
/**
|
|
116
|
+
* Handler for `POST /api/v1/scan`.
|
|
117
|
+
*
|
|
118
|
+
* Scans content through the defence pipeline. The `config` field on the
|
|
119
|
+
* request body is intentionally ignored — runtime always uses the persisted
|
|
120
|
+
* defence mode. Any attempt to override config is logged as a BLOCK with
|
|
121
|
+
* RESTRICTED sensitivity so incident-triage queries surface it (Fix #13).
|
|
122
|
+
*
|
|
123
|
+
* Exported for unit tests.
|
|
124
|
+
*/
|
|
125
|
+
export function handleV1Scan(req, res) {
|
|
126
|
+
try {
|
|
127
|
+
const { content, title, source } = req.body;
|
|
128
|
+
if (!content || typeof content !== 'string') {
|
|
129
|
+
res.status(400).json({ error: 'content (string) is required' });
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Log if caller tried to override config (potential tampering).
|
|
133
|
+
// Fix #13: record as BLOCK / RESTRICTED so incident-triage queries
|
|
134
|
+
// filtering on firewall_result IN ('BLOCK','QUARANTINE') surface
|
|
135
|
+
// config-tampering attempts.
|
|
136
|
+
if (req.body.config) {
|
|
137
|
+
try {
|
|
138
|
+
logAudit({
|
|
139
|
+
memory_id: null,
|
|
140
|
+
project: null,
|
|
141
|
+
timestamp: new Date().toISOString(),
|
|
142
|
+
source_type: 'api',
|
|
143
|
+
source_identifier: 'rest-api',
|
|
144
|
+
trust_score: 0,
|
|
145
|
+
sensitivity_level: 'RESTRICTED',
|
|
146
|
+
firewall_result: 'BLOCK',
|
|
147
|
+
anomaly_score: 0.5,
|
|
148
|
+
threat_indicators: '["config_tampering"]',
|
|
149
|
+
blocked_patterns: '[]',
|
|
150
|
+
reason: 'config_override_attempt: scan endpoint config parameter ignored',
|
|
151
|
+
fragmentation_score: null,
|
|
152
|
+
pipeline_duration_ms: 0,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
catch { /* audit is best-effort */ }
|
|
156
|
+
}
|
|
157
|
+
// Fix #13: whitelist source.type and cap identifier length
|
|
158
|
+
const defenceSource = normaliseDefenceSource(source);
|
|
159
|
+
// Always use persisted config — no per-request overrides via HTTP
|
|
160
|
+
const defenceConfig = { ...DEFAULT_DEFENCE_CONFIG, mode: getDefenceMode() };
|
|
161
|
+
const result = runDefencePipeline(content, title ?? 'Untitled', defenceSource, defenceConfig);
|
|
162
|
+
res.json(result);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
res.status(500).json({ error: error.message });
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Handler for `POST /api/v1/scan/batch`.
|
|
170
|
+
*
|
|
171
|
+
* Scans up to 100 items in one request. Like {@link handleV1Scan}, the
|
|
172
|
+
* `config` field is intentionally ignored; source is normalised through
|
|
173
|
+
* {@link normaliseDefenceSource} (Fix #13).
|
|
174
|
+
*
|
|
175
|
+
* Exported for unit tests.
|
|
176
|
+
*/
|
|
177
|
+
export function handleV1ScanBatch(req, res) {
|
|
178
|
+
try {
|
|
179
|
+
const { items, source } = req.body;
|
|
180
|
+
if (!Array.isArray(items) || items.length === 0) {
|
|
181
|
+
res.status(400).json({ error: 'items (array) is required' });
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (items.length > 100) {
|
|
185
|
+
res.status(400).json({ error: 'Maximum 100 items per batch' });
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
// Fix #13: whitelist source.type and cap identifier length
|
|
189
|
+
const defenceSource = normaliseDefenceSource(source);
|
|
190
|
+
// Always use persisted config — no per-request overrides via HTTP
|
|
191
|
+
const defenceConfig = { ...DEFAULT_DEFENCE_CONFIG, mode: getDefenceMode() };
|
|
192
|
+
const results = items.map((item) => {
|
|
193
|
+
if (!item.content || typeof item.content !== 'string') {
|
|
194
|
+
return { error: 'content (string) is required', allowed: false };
|
|
195
|
+
}
|
|
196
|
+
return runDefencePipeline(item.content, item.title ?? 'Untitled', defenceSource, defenceConfig);
|
|
197
|
+
});
|
|
198
|
+
res.json({ results, total: results.length });
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
res.status(500).json({ error: error.message });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
79
204
|
/**
|
|
80
205
|
* Start the visualization API server
|
|
81
206
|
*/
|
|
@@ -569,78 +694,8 @@ export function startVisualizationServer(dbPath) {
|
|
|
569
694
|
// BRAIN WORKER (Phase 4)
|
|
570
695
|
// ============================================
|
|
571
696
|
// ── Defence API v1 ──────────────────────────────────────────
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
app.post('/api/v1/scan', (req, res) => {
|
|
575
|
-
try {
|
|
576
|
-
const { content, title, source } = req.body;
|
|
577
|
-
if (!content || typeof content !== 'string') {
|
|
578
|
-
return res.status(400).json({ error: 'content (string) is required' });
|
|
579
|
-
}
|
|
580
|
-
// Log if caller tried to override config (potential tampering)
|
|
581
|
-
if (req.body.config) {
|
|
582
|
-
try {
|
|
583
|
-
logAudit({
|
|
584
|
-
memory_id: null,
|
|
585
|
-
project: null,
|
|
586
|
-
timestamp: new Date().toISOString(),
|
|
587
|
-
source_type: 'api',
|
|
588
|
-
source_identifier: 'rest-api',
|
|
589
|
-
trust_score: 0,
|
|
590
|
-
sensitivity_level: 'INTERNAL',
|
|
591
|
-
firewall_result: 'ALLOW',
|
|
592
|
-
anomaly_score: 0.5,
|
|
593
|
-
threat_indicators: '["config_tampering"]',
|
|
594
|
-
blocked_patterns: '[]',
|
|
595
|
-
reason: 'config_override_attempt: scan endpoint config parameter ignored',
|
|
596
|
-
fragmentation_score: null,
|
|
597
|
-
pipeline_duration_ms: 0,
|
|
598
|
-
});
|
|
599
|
-
}
|
|
600
|
-
catch { /* audit is best-effort */ }
|
|
601
|
-
}
|
|
602
|
-
const defenceSource = {
|
|
603
|
-
type: source?.type ?? 'api',
|
|
604
|
-
identifier: source?.identifier ?? 'rest-api',
|
|
605
|
-
};
|
|
606
|
-
// Always use persisted config — no per-request overrides via HTTP
|
|
607
|
-
const defenceConfig = { ...DEFAULT_DEFENCE_CONFIG, mode: getDefenceMode() };
|
|
608
|
-
const result = runDefencePipeline(content, title ?? 'Untitled', defenceSource, defenceConfig);
|
|
609
|
-
res.json(result);
|
|
610
|
-
}
|
|
611
|
-
catch (error) {
|
|
612
|
-
res.status(500).json({ error: error.message });
|
|
613
|
-
}
|
|
614
|
-
});
|
|
615
|
-
// Batch scan multiple items
|
|
616
|
-
// NOTE: config parameter is intentionally ignored — always uses persisted mode (security hardening)
|
|
617
|
-
app.post('/api/v1/scan/batch', (req, res) => {
|
|
618
|
-
try {
|
|
619
|
-
const { items, source } = req.body;
|
|
620
|
-
if (!Array.isArray(items) || items.length === 0) {
|
|
621
|
-
return res.status(400).json({ error: 'items (array) is required' });
|
|
622
|
-
}
|
|
623
|
-
if (items.length > 100) {
|
|
624
|
-
return res.status(400).json({ error: 'Maximum 100 items per batch' });
|
|
625
|
-
}
|
|
626
|
-
const defenceSource = {
|
|
627
|
-
type: source?.type ?? 'api',
|
|
628
|
-
identifier: source?.identifier ?? 'rest-api',
|
|
629
|
-
};
|
|
630
|
-
// Always use persisted config — no per-request overrides via HTTP
|
|
631
|
-
const defenceConfig = { ...DEFAULT_DEFENCE_CONFIG, mode: getDefenceMode() };
|
|
632
|
-
const results = items.map((item) => {
|
|
633
|
-
if (!item.content || typeof item.content !== 'string') {
|
|
634
|
-
return { error: 'content (string) is required', allowed: false };
|
|
635
|
-
}
|
|
636
|
-
return runDefencePipeline(item.content, item.title ?? 'Untitled', defenceSource, defenceConfig);
|
|
637
|
-
});
|
|
638
|
-
res.json({ results, total: results.length });
|
|
639
|
-
}
|
|
640
|
-
catch (error) {
|
|
641
|
-
res.status(500).json({ error: error.message });
|
|
642
|
-
}
|
|
643
|
-
});
|
|
697
|
+
app.post('/api/v1/scan', handleV1Scan);
|
|
698
|
+
app.post('/api/v1/scan/batch', handleV1ScanBatch);
|
|
644
699
|
const brainWorker = new BrainWorker();
|
|
645
700
|
registerIncidentRoutes(app);
|
|
646
701
|
registerAdminRoutes(app, {
|
|
@@ -295,6 +295,7 @@ export function getInlineSchema() {
|
|
|
295
295
|
);
|
|
296
296
|
|
|
297
297
|
-- v4.17 Session capture (mirrors schema.sql; bundled fallback only).
|
|
298
|
+
-- v4.28 (Fix #10): + sensitivity_level for prompt-redaction tagging.
|
|
298
299
|
CREATE TABLE IF NOT EXISTS session_events (
|
|
299
300
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
300
301
|
session_id TEXT NOT NULL,
|
|
@@ -308,11 +309,13 @@ export function getInlineSchema() {
|
|
|
308
309
|
duration_ms INTEGER,
|
|
309
310
|
audit_id INTEGER,
|
|
310
311
|
content_hash TEXT,
|
|
312
|
+
sensitivity_level TEXT DEFAULT 'INTERNAL',
|
|
311
313
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
312
314
|
FOREIGN KEY (audit_id) REFERENCES defence_audit(id) ON DELETE SET NULL
|
|
313
315
|
);
|
|
314
316
|
CREATE INDEX IF NOT EXISTS idx_session_events_session ON session_events(session_id, ts);
|
|
315
317
|
CREATE INDEX IF NOT EXISTS idx_session_events_project ON session_events(project, ts DESC);
|
|
318
|
+
CREATE INDEX IF NOT EXISTS idx_session_events_sensitivity ON session_events(sensitivity_level);
|
|
316
319
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_session_events_dedupe
|
|
317
320
|
ON session_events(session_id, ts, kind, content_hash);
|
|
318
321
|
`;
|
|
@@ -503,4 +503,29 @@ export function runMigrations(database) {
|
|
|
503
503
|
logIfUnexpectedDdlError(err, 'session_events.content_hash column + dedupe index');
|
|
504
504
|
// (importer-side INSERT OR IGNORE handles missing index gracefully)
|
|
505
505
|
}
|
|
506
|
+
// Migration: session_events.sensitivity_level (v4.28 — Fix #10).
|
|
507
|
+
//
|
|
508
|
+
// Without this, the UserPromptSubmit hook captured the raw prompt verbatim
|
|
509
|
+
// (no pipeline, no credential scan, no sensitivity tag). The column lets
|
|
510
|
+
// the hook record the defence classifier's verdict alongside the redacted
|
|
511
|
+
// text so the dashboard's replay UI can mask/strip RESTRICTED rows.
|
|
512
|
+
// Defaults to 'INTERNAL' for backfilled rows + future callers that omit it.
|
|
513
|
+
try {
|
|
514
|
+
const sessionEventsTable = database
|
|
515
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='session_events'")
|
|
516
|
+
.get();
|
|
517
|
+
if (sessionEventsTable) {
|
|
518
|
+
const sessionCols = database
|
|
519
|
+
.prepare("PRAGMA table_info(session_events)")
|
|
520
|
+
.all();
|
|
521
|
+
const sessionColNames = new Set(sessionCols.map((c) => c.name));
|
|
522
|
+
if (!sessionColNames.has('sensitivity_level')) {
|
|
523
|
+
database.exec("ALTER TABLE session_events ADD COLUMN sensitivity_level TEXT DEFAULT 'INTERNAL'");
|
|
524
|
+
}
|
|
525
|
+
database.exec('CREATE INDEX IF NOT EXISTS idx_session_events_sensitivity ON session_events(sensitivity_level)');
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
catch (err) {
|
|
529
|
+
logIfUnexpectedDdlError(err, 'session_events.sensitivity_level column + index');
|
|
530
|
+
}
|
|
506
531
|
}
|
package/dist/database/schema.sql
CHANGED
|
@@ -120,11 +120,16 @@ CREATE TABLE IF NOT EXISTS session_events (
|
|
|
120
120
|
duration_ms INTEGER,
|
|
121
121
|
audit_id INTEGER,
|
|
122
122
|
content_hash TEXT,
|
|
123
|
+
-- v4.28 (Fix #10): defence classifier verdict for this event.
|
|
124
|
+
-- PUBLIC | INTERNAL | CONFIDENTIAL | RESTRICTED. Lets the dashboard
|
|
125
|
+
-- replay UI mask or strip sensitive prompts/responses.
|
|
126
|
+
sensitivity_level TEXT DEFAULT 'INTERNAL',
|
|
123
127
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
124
128
|
FOREIGN KEY (audit_id) REFERENCES defence_audit(id) ON DELETE SET NULL
|
|
125
129
|
);
|
|
126
130
|
CREATE INDEX IF NOT EXISTS idx_session_events_session ON session_events(session_id, ts);
|
|
127
131
|
CREATE INDEX IF NOT EXISTS idx_session_events_project ON session_events(project, ts DESC);
|
|
132
|
+
CREATE INDEX IF NOT EXISTS idx_session_events_sensitivity ON session_events(sensitivity_level);
|
|
128
133
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_session_events_dedupe
|
|
129
134
|
ON session_events(session_id, ts, kind, content_hash);
|
|
130
135
|
|
package/dist/license/store.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* License is cached in memory after first read.
|
|
11
11
|
*/
|
|
12
|
-
import { readFileSync, writeFileSync, existsSync, unlinkSync, mkdirSync } from 'fs';
|
|
12
|
+
import { readFileSync, writeFileSync, existsSync, unlinkSync, mkdirSync, statSync } from 'fs';
|
|
13
13
|
import { join } from 'path';
|
|
14
14
|
import { homedir } from 'os';
|
|
15
15
|
import { verifyLicenseKey } from './verify.js';
|
|
@@ -22,10 +22,32 @@ function getLicenseFilePath() {
|
|
|
22
22
|
return join(getConfigDir(), 'license.json');
|
|
23
23
|
}
|
|
24
24
|
// ── Cache ────────────────────────────────────────────────
|
|
25
|
+
//
|
|
26
|
+
// In-memory cache of the parsed/verified licence. Refreshed automatically
|
|
27
|
+
// when the on-disk file mtime changes (v4.27.2). This lets long-running
|
|
28
|
+
// workers pick up `shieldcortex license activate <key>` without a process
|
|
29
|
+
// restart — previously the worker held the old tier cached for its
|
|
30
|
+
// lifetime and any cloud_sync / heartbeat feature gate stayed stuck on
|
|
31
|
+
// the value at startup. The mtime check is a single stat() per call
|
|
32
|
+
// (microseconds); cheap enough to run on every gate hit.
|
|
25
33
|
let cachedLicense = null;
|
|
34
|
+
let cachedLicenseFileMtimeMs = null;
|
|
35
|
+
/**
|
|
36
|
+
* Read the licence file's current mtime (ms). Returns null if the file
|
|
37
|
+
* doesn't exist — that's a valid cached state too (= FREE).
|
|
38
|
+
*/
|
|
39
|
+
function readLicenseFileMtimeMs() {
|
|
40
|
+
try {
|
|
41
|
+
return statSync(getLicenseFilePath()).mtimeMs;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
26
47
|
/** Clear the in-memory cache (useful for testing or after activation). */
|
|
27
48
|
export function clearLicenseCache() {
|
|
28
49
|
cachedLicense = null;
|
|
50
|
+
cachedLicenseFileMtimeMs = null;
|
|
29
51
|
clearTrialCache();
|
|
30
52
|
}
|
|
31
53
|
// ── Read ─────────────────────────────────────────────────
|
|
@@ -34,6 +56,15 @@ export function clearLicenseCache() {
|
|
|
34
56
|
* Returns a LicenseInfo with tier='free' if no license exists or verification fails.
|
|
35
57
|
*/
|
|
36
58
|
export function getLicense() {
|
|
59
|
+
// Hot-reload: if the licence file's mtime has changed since the value
|
|
60
|
+
// was cached (or the file appeared/disappeared), drop the cache so the
|
|
61
|
+
// new tier takes effect immediately. This is what makes long-running
|
|
62
|
+
// workers see `shieldcortex license activate <key>` without a restart.
|
|
63
|
+
const currentMtimeMs = readLicenseFileMtimeMs();
|
|
64
|
+
if (cachedLicense !== null && cachedLicenseFileMtimeMs !== currentMtimeMs) {
|
|
65
|
+
cachedLicense = null;
|
|
66
|
+
clearTrialCache();
|
|
67
|
+
}
|
|
37
68
|
if (cachedLicense)
|
|
38
69
|
return cachedLicense;
|
|
39
70
|
const FREE = {
|
|
@@ -49,11 +80,13 @@ export function getLicense() {
|
|
|
49
80
|
const licenseFile = getLicenseFilePath();
|
|
50
81
|
if (!existsSync(licenseFile)) {
|
|
51
82
|
cachedLicense = FREE;
|
|
83
|
+
cachedLicenseFileMtimeMs = null;
|
|
52
84
|
return FREE;
|
|
53
85
|
}
|
|
54
86
|
const raw = JSON.parse(readFileSync(licenseFile, 'utf-8'));
|
|
55
87
|
if (!raw.key) {
|
|
56
88
|
cachedLicense = FREE;
|
|
89
|
+
cachedLicenseFileMtimeMs = currentMtimeMs;
|
|
57
90
|
return FREE;
|
|
58
91
|
}
|
|
59
92
|
// Check if previously marked as revoked or expired by online validation.
|
|
@@ -62,15 +95,18 @@ export function getLicense() {
|
|
|
62
95
|
// so we only hard-block on revoked here.
|
|
63
96
|
if (raw.validationStatus === 'revoked') {
|
|
64
97
|
cachedLicense = FREE;
|
|
98
|
+
cachedLicenseFileMtimeMs = currentMtimeMs;
|
|
65
99
|
return FREE;
|
|
66
100
|
}
|
|
67
101
|
// Verify the key cryptographically (checks exp + grace period)
|
|
68
102
|
const info = verifyLicenseKey(raw.key);
|
|
69
103
|
cachedLicense = info;
|
|
104
|
+
cachedLicenseFileMtimeMs = currentMtimeMs;
|
|
70
105
|
return info;
|
|
71
106
|
}
|
|
72
107
|
catch {
|
|
73
108
|
cachedLicense = FREE;
|
|
109
|
+
cachedLicenseFileMtimeMs = currentMtimeMs;
|
|
74
110
|
return FREE;
|
|
75
111
|
}
|
|
76
112
|
}
|
|
@@ -126,8 +162,10 @@ export function activateLicense(key) {
|
|
|
126
162
|
const licenseFile = getLicenseFilePath();
|
|
127
163
|
mkdirSync(configDir, { recursive: true });
|
|
128
164
|
writeFileSync(licenseFile, JSON.stringify(file, null, 2) + '\n', { mode: 0o600 });
|
|
129
|
-
//
|
|
165
|
+
// Refresh cache + mtime so the next getLicense() call in this process
|
|
166
|
+
// doesn't trigger a re-read for no reason.
|
|
130
167
|
cachedLicense = info;
|
|
168
|
+
cachedLicenseFileMtimeMs = readLicenseFileMtimeMs();
|
|
131
169
|
return info;
|
|
132
170
|
}
|
|
133
171
|
/**
|
|
@@ -144,6 +182,7 @@ export function deactivateLicense() {
|
|
|
144
182
|
// Best effort
|
|
145
183
|
}
|
|
146
184
|
cachedLicense = null;
|
|
185
|
+
cachedLicenseFileMtimeMs = null;
|
|
147
186
|
clearTrialCache();
|
|
148
187
|
}
|
|
149
188
|
/**
|
|
@@ -162,6 +201,7 @@ export function updateValidationStatus(status) {
|
|
|
162
201
|
// If revoked or expired, invalidate cache so next getLicense() re-verifies
|
|
163
202
|
if (status === 'revoked' || status === 'expired') {
|
|
164
203
|
cachedLicense = null;
|
|
204
|
+
cachedLicenseFileMtimeMs = null;
|
|
165
205
|
}
|
|
166
206
|
}
|
|
167
207
|
catch {
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import { getDatabase, withTransaction } from '../database/init.js';
|
|
11
11
|
import { DEFAULT_CONFIG, } from './types.js';
|
|
12
12
|
import { getMemoriesByType, getRecentMemories, promoteMemory, deleteMemory, searchMemories, getMemoryStats, updateDecayScores, addMemory, rowToMemory, } from './store.js';
|
|
13
|
+
import { runDefencePipeline } from '../defence/index.js';
|
|
13
14
|
import { processDecay, } from './decay.js';
|
|
14
15
|
import { detectContradictions, linkContradictions, } from './contradiction.js';
|
|
15
16
|
import { jaccardSimilarity } from './similarity.js';
|
|
@@ -276,6 +277,18 @@ export function deduplicateMemories(options) {
|
|
|
276
277
|
.filter(s => s.length > 0 && !keptSentences.has(s.toLowerCase()));
|
|
277
278
|
if (uniqueSentences.length > 0) {
|
|
278
279
|
const mergedContent = kept.content + '\n\nMerged from duplicate:\n' + uniqueSentences.join('. ') + '.';
|
|
280
|
+
// DEFENCE PIPELINE: re-scan the merged content. Two individually-clean
|
|
281
|
+
// memories can produce content that straddles a credential pattern
|
|
282
|
+
// across the join. Without this re-scan the "every byte in `memories`
|
|
283
|
+
// has been scanned" invariant is broken. If the merge is blocked, skip
|
|
284
|
+
// both the content update AND the delete so the source rows survive.
|
|
285
|
+
const dedupSource = { type: 'hook', identifier: 'hook:consolidation' };
|
|
286
|
+
const defenceResult = runDefencePipeline(mergedContent, kept.title, dedupSource, undefined, kept.project ?? discarded.project ?? undefined);
|
|
287
|
+
if (defenceResult.firewall.result !== 'ALLOW') {
|
|
288
|
+
// Surface in audit (already written by the pipeline) and skip this pair.
|
|
289
|
+
console.warn(`[shieldcortex] Dedup merge blocked for memory ${kept.id} + ${removedId}: ${defenceResult.firewall.reason}`);
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
279
292
|
db.prepare('UPDATE memories SET content = ? WHERE id = ?').run(mergedContent, kept.id);
|
|
280
293
|
}
|
|
281
294
|
deleteMemory(removedId);
|
package/dist/memory/store.d.ts
CHANGED
|
@@ -46,7 +46,7 @@ export declare function getMemoryById(id: number, source?: DefenceSource): Memor
|
|
|
46
46
|
export declare function updateMemory(id: number, updates: Partial<MemoryInput>): Memory | null;
|
|
47
47
|
export declare function mergeMemories(keptId: number, removedId: number, options?: {
|
|
48
48
|
reviewedBy?: string | null;
|
|
49
|
-
}): Memory | null;
|
|
49
|
+
}, source?: DefenceSource): Memory | null;
|
|
50
50
|
/**
|
|
51
51
|
* Delete a memory
|
|
52
52
|
*/
|