shieldcortex 4.35.0 → 4.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/pages/500.html +2 -2
- package/dist/api/routes/memories.js +14 -1
- package/dist/defence/quarantine/review.js +29 -7
- package/dist/defence/trust/recall-filter.js +6 -2
- package/dist/defence/trust/source-scorer.js +5 -0
- package/dist/memory/consolidate.js +50 -18
- package/dist/memory/lifecycle.js +13 -0
- package/dist/memory/store.d.ts +1 -0
- package/dist/memory/store.js +73 -54
- package/package.json +1 -1
- package/scripts/lib/recall-defence.mjs +254 -0
- package/scripts/lib/save-memory.mjs +12 -3
- package/scripts/prompt-recall-hook.mjs +33 -0
- package/scripts/session-start-hook.mjs +36 -4
- /package/dashboard/.next/standalone/dashboard/.next/static/{h2qG7AvaXDfMKQrI-bK4V → _JsmCyMaqewdhBNXZu1me}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{h2qG7AvaXDfMKQrI-bK4V → _JsmCyMaqewdhBNXZu1me}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{h2qG7AvaXDfMKQrI-bK4V → _JsmCyMaqewdhBNXZu1me}/_ssgManifest.js +0 -0
|
@@ -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><!--_JsmCyMaqewdhBNXZu1me--><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\":\"_JsmCyMaqewdhBNXZu1me\",\"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>
|
|
@@ -553,7 +553,11 @@ export function registerMemoryRoutes(app, deps) {
|
|
|
553
553
|
salience,
|
|
554
554
|
memoryPurpose: memoryPurpose || undefined,
|
|
555
555
|
memoryScope: memoryScope || undefined,
|
|
556
|
-
}
|
|
556
|
+
}, undefined,
|
|
557
|
+
// Operator-attributable dashboard write → api:dashboard (trust 0.7):
|
|
558
|
+
// scanned like every write, but stays broadly recallable (above the
|
|
559
|
+
// sub-agent band) rather than the generic unattributed 0.3.
|
|
560
|
+
{ type: 'api', identifier: 'dashboard' });
|
|
557
561
|
res.status(201).json(memory);
|
|
558
562
|
}
|
|
559
563
|
catch (error) {
|
|
@@ -564,6 +568,15 @@ export function registerMemoryRoutes(app, deps) {
|
|
|
564
568
|
message: 'Use the dashboard control panel to resume memory creation.',
|
|
565
569
|
});
|
|
566
570
|
}
|
|
571
|
+
// The dashboard write is now scanned — surface a defence block as a 422,
|
|
572
|
+
// not a generic 500.
|
|
573
|
+
if (error.name === 'MemoryBlockedError') {
|
|
574
|
+
return res.status(422).json({
|
|
575
|
+
error: 'Blocked by the defence pipeline',
|
|
576
|
+
blocked: true,
|
|
577
|
+
message: error.message,
|
|
578
|
+
});
|
|
579
|
+
}
|
|
567
580
|
res.status(500).json({ error: error.message });
|
|
568
581
|
}
|
|
569
582
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getDatabase, withTransaction } from '../../database/init.js';
|
|
2
|
-
import { addMemory } from '../../memory/store.js';
|
|
2
|
+
import { addMemory, MemoryBlockedError } from '../../memory/store.js';
|
|
3
3
|
function getPendingQuarantineRow(id) {
|
|
4
4
|
const db = getDatabase();
|
|
5
|
-
const row = db.prepare(`SELECT id, original_title, original_content, project, source_type, source_identifier, reason
|
|
5
|
+
const row = db.prepare(`SELECT id, original_title, original_content, project, source_type, source_identifier, reason, firewall_result
|
|
6
6
|
FROM quarantine
|
|
7
7
|
WHERE id = ? AND status = 'pending'`).get(id);
|
|
8
8
|
return row ?? null;
|
|
@@ -31,16 +31,20 @@ function promoteApprovedQuarantineRow(row, reviewedBy) {
|
|
|
31
31
|
approvedFromQuarantine: true,
|
|
32
32
|
quarantineId: row.id,
|
|
33
33
|
quarantineReason: row.reason ?? null,
|
|
34
|
+
// Original provenance is preserved here (the trust now reflects the
|
|
35
|
+
// human approval, not the original source).
|
|
34
36
|
originalSourceType: row.source_type ?? null,
|
|
35
37
|
originalSourceIdentifier: row.source_identifier ?? null,
|
|
36
38
|
},
|
|
37
39
|
captureMethod: 'review',
|
|
38
40
|
reviewedBy,
|
|
39
41
|
sourceKind: normalizeSourceKind(row.source_type),
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
}, undefined,
|
|
43
|
+
// A human approving the item IS the parent-approval the quarantine was
|
|
44
|
+
// waiting for, so admit at user:approved (0.9 — out of the 0.5–0.7 auto-
|
|
45
|
+
// quarantine band, so it isn't re-quarantined in a loop). The pipeline still
|
|
46
|
+
// RE-SCANS, so genuinely-malicious content fails closed (caller catches it).
|
|
47
|
+
{ type: 'user', identifier: 'approved' });
|
|
44
48
|
}
|
|
45
49
|
function markPendingRowReviewed(id, status, reviewedBy) {
|
|
46
50
|
const db = getDatabase();
|
|
@@ -58,7 +62,25 @@ function approveExistingPendingRow(row, reviewedBy) {
|
|
|
58
62
|
status: 'approved',
|
|
59
63
|
};
|
|
60
64
|
}
|
|
61
|
-
|
|
65
|
+
// Never re-admit content the pipeline HARD-BLOCKED. Approving a BLOCK item
|
|
66
|
+
// rejects it instead of laundering hard-rejected poison back into memory.
|
|
67
|
+
if (row.firewall_result === 'BLOCK') {
|
|
68
|
+
markPendingRowReviewed(row.id, 'rejected', reviewedBy);
|
|
69
|
+
return { id: row.id, status: 'rejected' };
|
|
70
|
+
}
|
|
71
|
+
// QUARANTINE (soft hold): re-admit through the pipeline at operator-approved
|
|
72
|
+
// trust. If the content now hard-blocks, fail closed — reject, don't admit.
|
|
73
|
+
let memory;
|
|
74
|
+
try {
|
|
75
|
+
memory = promoteApprovedQuarantineRow(row, reviewedBy);
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
if (e instanceof MemoryBlockedError) {
|
|
79
|
+
markPendingRowReviewed(row.id, 'rejected', reviewedBy);
|
|
80
|
+
return { id: row.id, status: 'rejected' };
|
|
81
|
+
}
|
|
82
|
+
throw e;
|
|
83
|
+
}
|
|
62
84
|
markPendingRowReviewed(row.id, 'approved', reviewedBy);
|
|
63
85
|
return {
|
|
64
86
|
id: row.id,
|
|
@@ -11,9 +11,13 @@ export function filterByTrust(results, minTrust, context) {
|
|
|
11
11
|
// Filter below minimum trust
|
|
12
12
|
if (score < minTrust)
|
|
13
13
|
return false;
|
|
14
|
-
// CONFIDENTIAL: only
|
|
14
|
+
// CONFIDENTIAL: context-scope only when the row actually DECLARES a
|
|
15
|
+
// context. metadata.context is not written on store today, so requiring
|
|
16
|
+
// equality dropped every CONFIDENTIAL (any email/phone-bearing) row from
|
|
17
|
+
// recall — silent amnesia. Drop only a declared-but-mismatched context.
|
|
15
18
|
if (item.sensitivity_level === 'CONFIDENTIAL') {
|
|
16
|
-
|
|
19
|
+
const rowContext = item.metadata?.context;
|
|
20
|
+
if (rowContext != null && context != null && rowContext !== context)
|
|
17
21
|
return false;
|
|
18
22
|
}
|
|
19
23
|
return true;
|
|
@@ -5,6 +5,11 @@ import { scoreAgent, buildAgentHierarchy } from './agent-scorer.js';
|
|
|
5
5
|
const BASE_SCORES = {
|
|
6
6
|
'user:direct': 1.0,
|
|
7
7
|
'user:approved': 0.9,
|
|
8
|
+
// Bulk import (restore from a backup/JSON). The generic `file` type is 0.6,
|
|
9
|
+
// which sits inside the 0.5–0.7 auto-quarantine band and would quarantine
|
|
10
|
+
// every imported row. Pin below the band so a benign restore succeeds while
|
|
11
|
+
// imported file data stays scanned + low-trust until reviewed.
|
|
12
|
+
'file:import': 0.4,
|
|
8
13
|
};
|
|
9
14
|
const TYPE_SCORES = {
|
|
10
15
|
user: 1.0,
|
|
@@ -408,16 +408,26 @@ export function clusterAndSummarise(options) {
|
|
|
408
408
|
bestCount = count;
|
|
409
409
|
}
|
|
410
410
|
}
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
411
|
+
try {
|
|
412
|
+
addMemory({
|
|
413
|
+
type: 'long_term',
|
|
414
|
+
category: category,
|
|
415
|
+
title: summaryTitle,
|
|
416
|
+
content: summaryContent,
|
|
417
|
+
project: bestProject || undefined,
|
|
418
|
+
tags: ['auto-summary'],
|
|
419
|
+
salience: 0.6,
|
|
420
|
+
}, undefined,
|
|
421
|
+
// System-generated consolidation summary — honest cli provenance
|
|
422
|
+
// (trust 0.9, above the auto-quarantine band so it isn't held).
|
|
423
|
+
{ type: 'cli', identifier: 'consolidate:summary' });
|
|
424
|
+
summariesCreated++;
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
// A summary whose content trips the (now-unconditional) defence scan
|
|
428
|
+
// must NOT abort the whole consolidation transaction — skip it, like the
|
|
429
|
+
// per-row guard in importMemories.
|
|
430
|
+
}
|
|
421
431
|
}
|
|
422
432
|
return { clusters, summariesCreated };
|
|
423
433
|
});
|
|
@@ -800,22 +810,44 @@ export function exportMemories(project) {
|
|
|
800
810
|
* Import memories from JSON
|
|
801
811
|
*/
|
|
802
812
|
export function importMemories(json) {
|
|
803
|
-
// Wrap in transaction for atomic import
|
|
813
|
+
// Wrap in transaction for atomic import. addMemory opens its own nested
|
|
814
|
+
// transaction (better-sqlite3 SAVEPOINT), so a per-row block rolls back only
|
|
815
|
+
// that row and the clean rows still commit.
|
|
804
816
|
return withTransaction(() => {
|
|
805
|
-
const db = getDatabase();
|
|
806
817
|
const memories = JSON.parse(json);
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
818
|
+
// SELECT * exports store tags/metadata as JSON TEXT — parse back to the
|
|
819
|
+
// array/object shapes addMemory expects.
|
|
820
|
+
const parseJsonField = (value, fallback) => {
|
|
821
|
+
if (typeof value !== 'string')
|
|
822
|
+
return value ?? fallback;
|
|
823
|
+
try {
|
|
824
|
+
return JSON.parse(value);
|
|
825
|
+
}
|
|
826
|
+
catch {
|
|
827
|
+
return fallback;
|
|
828
|
+
}
|
|
829
|
+
};
|
|
811
830
|
let imported = 0;
|
|
812
831
|
for (const memory of memories) {
|
|
813
832
|
try {
|
|
814
|
-
|
|
833
|
+
// Route every imported row through the defence pipeline + attribute it
|
|
834
|
+
// to file:import (trust 0.4 — below the auto-quarantine band). Closes
|
|
835
|
+
// the raw-INSERT bypass that admitted unscanned rows at trust 1.0 /
|
|
836
|
+
// 'user:direct'. The pipeline BLOCKs poisoned rows (caught below).
|
|
837
|
+
addMemory({
|
|
838
|
+
type: memory.type,
|
|
839
|
+
category: memory.category,
|
|
840
|
+
title: String(memory.title ?? ''),
|
|
841
|
+
content: String(memory.content ?? ''),
|
|
842
|
+
project: typeof memory.project === 'string' ? memory.project : undefined,
|
|
843
|
+
tags: parseJsonField(memory.tags, []),
|
|
844
|
+
salience: typeof memory.salience === 'number' ? memory.salience : 0.5,
|
|
845
|
+
metadata: parseJsonField(memory.metadata, {}),
|
|
846
|
+
}, DEFAULT_CONFIG, { type: 'file', identifier: 'import' });
|
|
815
847
|
imported++;
|
|
816
848
|
}
|
|
817
849
|
catch {
|
|
818
|
-
// Skip
|
|
850
|
+
// Skip rows the defence pipeline blocks (poisoned), or invalid entries.
|
|
819
851
|
}
|
|
820
852
|
}
|
|
821
853
|
return imported;
|
package/dist/memory/lifecycle.js
CHANGED
|
@@ -26,6 +26,11 @@ import { activateMemory as spreadActivation } from './activation.js';
|
|
|
26
26
|
import { jaccardSimilarity } from './similarity.js';
|
|
27
27
|
import { emitMemoryAccessed, emitMemoryUpdated, persistEvent, } from '../api/events.js';
|
|
28
28
|
import { createMemoryLink } from './links.js';
|
|
29
|
+
import { runDefencePipeline } from '../defence/index.js';
|
|
30
|
+
// Enrichment text is recall-query / caller-derived (attacker-influenced); scan
|
|
31
|
+
// it before persisting. Trust doesn't matter here (the row keeps its own) — we
|
|
32
|
+
// only act on the firewall verdict, so a low-trust web source is fine.
|
|
33
|
+
const ENRICH_SOURCE = { type: 'web', identifier: 'enrichment' };
|
|
29
34
|
// Cyclic import — see header. getMemoryById/rowToMemory/getMemoriesByType
|
|
30
35
|
// live in store.ts; MAX_CONTENT_SIZE is the per-memory content budget
|
|
31
36
|
// that both truncateContent (store.ts) and enrichMemory (here) honour.
|
|
@@ -194,6 +199,14 @@ export function enrichMemory(memoryId, newContext, contextType = 'access') {
|
|
|
194
199
|
if (newContent.length > MAX_CONTENT_SIZE - 500) {
|
|
195
200
|
return { enriched: false, reason: 'Content size limit reached' };
|
|
196
201
|
}
|
|
202
|
+
// DEFENCE: re-scan the merged content before persisting — the read-path
|
|
203
|
+
// analogue of mergeMemories. The appended text comes from a recall query /
|
|
204
|
+
// caller and could straddle an injection or credential into a clean stored
|
|
205
|
+
// row. Skip (don't poison) on a non-ALLOW verdict.
|
|
206
|
+
const defenceResult = runDefencePipeline(newContent, memory.title, ENRICH_SOURCE, undefined, memory.project ?? undefined);
|
|
207
|
+
if (defenceResult.firewall.result !== 'ALLOW') {
|
|
208
|
+
return { enriched: false, reason: `Enrichment blocked by defence: ${defenceResult.firewall.reason}` };
|
|
209
|
+
}
|
|
197
210
|
// Update memory
|
|
198
211
|
db.prepare(`
|
|
199
212
|
UPDATE memories
|
package/dist/memory/store.d.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { Memory, MemoryInput, MemoryType, MemoryConfig } from './types.js';
|
|
8
8
|
import type { DefenceSource } from '../defence/types.js';
|
|
9
9
|
export declare const MAX_CONTENT_SIZE: number;
|
|
10
|
+
export declare const UNATTRIBUTED_SOURCE: DefenceSource;
|
|
10
11
|
/**
|
|
11
12
|
* Get truncation info from the last addMemory call
|
|
12
13
|
*/
|
package/dist/memory/store.js
CHANGED
|
@@ -32,6 +32,13 @@ import { createMemoryLink, detectRelationships } from './links.js';
|
|
|
32
32
|
// Anti-bloat: Maximum content size per memory (10KB).
|
|
33
33
|
// Exported because lifecycle.ts also enforces this budget inside enrichMemory.
|
|
34
34
|
export const MAX_CONTENT_SIZE = 10 * 1024;
|
|
35
|
+
// Synthetic source for writes that arrive without an attributed DefenceSource
|
|
36
|
+
// (dashboard REST POST, bulk paths, etc). It MUST score strictly below the
|
|
37
|
+
// 0.5–0.7 auto-quarantine band (web = 0.3) so unattributed writes are SCANNED
|
|
38
|
+
// + stamped low-trust rather than admitted unscanned at trust 1.0 — but are not
|
|
39
|
+
// force-quarantined (which would make every source-less write throw). Closing
|
|
40
|
+
// the old `if (source)` defence-pipeline bypass.
|
|
41
|
+
export const UNATTRIBUTED_SOURCE = { type: 'web', identifier: 'unattributed' };
|
|
35
42
|
// Track truncation info globally for the last addMemory call
|
|
36
43
|
let lastTruncationInfo = null;
|
|
37
44
|
/**
|
|
@@ -326,43 +333,46 @@ export function addMemory(input, config = DEFAULT_CONFIG, source) {
|
|
|
326
333
|
});
|
|
327
334
|
throw new MemoryBlockedError(`Rate limited: exceeded ${RATE_LIMIT_MAX} writes per minute`);
|
|
328
335
|
}
|
|
329
|
-
// DEFENCE PIPELINE: Scan
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
336
|
+
// DEFENCE PIPELINE: Scan EVERY write before storage. Source-less writes get a
|
|
337
|
+
// conservative low-trust synthetic source (UNATTRIBUTED_SOURCE = web:0.3) so
|
|
338
|
+
// they are still scanned + stamped low-trust instead of admitted unscanned at
|
|
339
|
+
// trust 1.0 — closing the old `if (source)` bypass. Rate-limiting stays gated
|
|
340
|
+
// on an explicit source (above) so bulk source-less/import writes aren't
|
|
341
|
+
// throttled by the shared synthetic key.
|
|
342
|
+
const effectiveSource = source ?? UNATTRIBUTED_SOURCE;
|
|
343
|
+
const defenceResult = runDefencePipeline(input.content, input.title, effectiveSource, undefined, input.project);
|
|
344
|
+
// Auto-quarantine sub-agent writes (trust 0.5–0.7)
|
|
345
|
+
const trust = defenceResult.trust.score;
|
|
346
|
+
if (defenceResult.allowed && trust >= 0.5 && trust < 0.7) {
|
|
347
|
+
defenceResult.allowed = false;
|
|
348
|
+
defenceResult.firewall.result = 'QUARANTINE';
|
|
349
|
+
defenceResult.firewall.reason = `Sub-agent write (trust=${trust.toFixed(3)}) requires parent approval`;
|
|
350
|
+
// Pipeline returned ALLOW so pipeline.ts didn't sync quarantine content.
|
|
351
|
+
// Sync it now since we've overridden to QUARANTINE post-pipeline.
|
|
352
|
+
if (isFeatureEnabled('cloud_sync'))
|
|
353
|
+
try {
|
|
354
|
+
const indicators = defenceResult.firewall.threatIndicators.map(t => typeof t === 'string' ? t : t.pattern ?? String(t));
|
|
355
|
+
syncQuarantineToCloud({
|
|
356
|
+
original_content: input.content,
|
|
357
|
+
original_title: input.title,
|
|
358
|
+
source_type: effectiveSource.type,
|
|
359
|
+
source_identifier: effectiveSource.identifier,
|
|
360
|
+
reason: defenceResult.firewall.reason,
|
|
361
|
+
threat_indicators: indicators,
|
|
362
|
+
anomaly_score: defenceResult.firewall.anomalyScore,
|
|
363
|
+
firewall_result: defenceResult.firewall.result,
|
|
364
|
+
project: input.project ?? null,
|
|
365
|
+
sensitivity_level: defenceResult.sensitivity.level,
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
// Cloud sync must never affect local quarantine flow
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (!defenceResult.allowed) {
|
|
373
|
+
// Store in quarantine instead of memory
|
|
374
|
+
quarantineMemory(input, effectiveSource, defenceResult);
|
|
375
|
+
throw new MemoryBlockedError(defenceResult.firewall.reason);
|
|
366
376
|
}
|
|
367
377
|
const db = getDatabase();
|
|
368
378
|
// Calculate salience if not provided
|
|
@@ -377,7 +387,7 @@ export function addMemory(input, config = DEFAULT_CONFIG, source) {
|
|
|
377
387
|
const scope = input.scope ??
|
|
378
388
|
(detectGlobalPattern(input.content, category, tags) ? 'global' : 'project');
|
|
379
389
|
const transferable = input.transferable ?? (scope === 'global' ? 1 : 0);
|
|
380
|
-
const sourceDetails = inferSourceDetails({ ...input, tags },
|
|
390
|
+
const sourceDetails = inferSourceDetails({ ...input, tags }, effectiveSource);
|
|
381
391
|
const status = input.status ?? 'active';
|
|
382
392
|
const pinned = input.pinned ? 1 : 0;
|
|
383
393
|
const cloudExcluded = input.cloudExcluded ? 1 : 0;
|
|
@@ -400,14 +410,11 @@ export function addMemory(input, config = DEFAULT_CONFIG, source) {
|
|
|
400
410
|
const insertedId = db.transaction(() => {
|
|
401
411
|
const memoryUuid = randomUUID();
|
|
402
412
|
const result = stmt.run(memoryUuid, type, category, input.title, truncationResult.content, input.project || null, JSON.stringify(tags), salience, JSON.stringify(input.metadata || {}), scope, transferable, status, pinned, input.reviewedBy ? new Date().toISOString() : null, input.reviewedBy ?? null, sourceDetails.sourceKind, sourceDetails.captureMethod, cloudExcluded, input.memoryPurpose || 'project', input.memoryScope || 'private');
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
db.prepare(`UPDATE memories SET source = ?, trust_score = COALESCE(trust_score, ?), sensitivity_level = COALESCE(sensitivity_level, ?) WHERE id = ?`)
|
|
409
|
-
.run(sourceDetails.sourceValue, input.trustScore ?? 1.0, input.sensitivityLevel ?? 'INTERNAL', result.lastInsertRowid);
|
|
410
|
-
}
|
|
413
|
+
// defenceResult is always set now (every write is scanned), so always stamp
|
|
414
|
+
// the pipeline's real trust + sensitivity alongside the resolved source —
|
|
415
|
+
// no source-less branch can default to trust 1.0 / unscanned INTERNAL.
|
|
416
|
+
db.prepare(`UPDATE memories SET trust_score = ?, sensitivity_level = ?, source = ? WHERE id = ?`)
|
|
417
|
+
.run(defenceResult.trust.score, defenceResult.sensitivity.level, sourceDetails.sourceValue, result.lastInsertRowid);
|
|
411
418
|
return result.lastInsertRowid;
|
|
412
419
|
})();
|
|
413
420
|
const memory = getMemoryById(insertedId);
|
|
@@ -454,14 +461,14 @@ export function addMemory(input, config = DEFAULT_CONFIG, source) {
|
|
|
454
461
|
// Don't fail memory creation if linking fails
|
|
455
462
|
console.error('[shieldcortex] Auto-link failed:', e);
|
|
456
463
|
}
|
|
457
|
-
// DEFENCE: Store fragmentation data for cross-memory payload detection
|
|
458
|
-
if (source)
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
464
|
+
// DEFENCE: Store fragmentation data for cross-memory payload detection.
|
|
465
|
+
// Un-gated from `if (source)` so source-less writes also feed the temporal
|
|
466
|
+
// assembly corpus (a blind spot the write-bypass left).
|
|
467
|
+
try {
|
|
468
|
+
storeFragmentationData(memory.id, truncationResult.content);
|
|
469
|
+
}
|
|
470
|
+
catch (e) {
|
|
471
|
+
console.warn('[shieldcortex] Fragmentation data storage failed:', e instanceof Error ? e.message : e);
|
|
465
472
|
}
|
|
466
473
|
// SEMANTIC SEARCH: Generate embedding asynchronously (don't block INSERT)
|
|
467
474
|
const memoryId = memory.id;
|
|
@@ -582,6 +589,18 @@ export function updateMemory(id, updates) {
|
|
|
582
589
|
const existing = getMemoryById(id);
|
|
583
590
|
if (!existing)
|
|
584
591
|
return null;
|
|
592
|
+
// DEFENCE: re-scan when content/title changes — the UPDATE path is otherwise
|
|
593
|
+
// an unscanned write (reachable via remember-dedup + the dashboard PATCH).
|
|
594
|
+
// Mirror mergeMemories: fail closed on a non-ALLOW verdict so a poison content
|
|
595
|
+
// replace can't overwrite a clean row unchecked.
|
|
596
|
+
if (updates.content !== undefined || updates.title !== undefined) {
|
|
597
|
+
const scanContent = updates.content !== undefined ? updates.content : existing.content;
|
|
598
|
+
const scanTitle = updates.title !== undefined ? updates.title : existing.title;
|
|
599
|
+
const defenceResult = runDefencePipeline(scanContent, scanTitle, UNATTRIBUTED_SOURCE, undefined, existing.project ?? undefined);
|
|
600
|
+
if (defenceResult.firewall.result !== 'ALLOW') {
|
|
601
|
+
throw new MemoryBlockedError(defenceResult.firewall.reason);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
585
604
|
const fields = [];
|
|
586
605
|
const values = [];
|
|
587
606
|
if (updates.title !== undefined) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shieldcortex",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.36.0",
|
|
4
4
|
"description": "Trustworthy memory and security for AI agents. Recall debugging, review queue, OpenClaw session capture, and memory poisoning defence for Claude Code, Codex, OpenClaw, LangChain, and MCP agents.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|