shieldcortex 4.35.0 → 4.37.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/cloud/cli.js +26 -1
- package/dist/defence/firewall/markdown-image-detector.d.ts +15 -0
- package/dist/defence/firewall/markdown-image-detector.js +30 -0
- package/dist/defence/quarantine/review.js +29 -7
- package/dist/defence/tool-response-enforce.d.ts +57 -0
- package/dist/defence/tool-response-enforce.js +107 -0
- package/dist/defence/tool-response-scanner.d.ts +6 -3
- package/dist/defence/tool-response-scanner.js +56 -6
- package/dist/defence/trust/recall-filter.js +6 -2
- package/dist/defence/trust/source-scorer.js +5 -0
- package/dist/defence/types.d.ts +9 -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/dist/server.d.ts +6 -0
- package/dist/server.js +52 -2
- 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 → Xdk3QuQEKommHIbMSem56}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{h2qG7AvaXDfMKQrI-bK4V → Xdk3QuQEKommHIbMSem56}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{h2qG7AvaXDfMKQrI-bK4V → Xdk3QuQEKommHIbMSem56}/_ssgManifest.js +0 -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/dist/server.d.ts
CHANGED
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
* Solves context compaction and memory persistence issues.
|
|
6
6
|
*/
|
|
7
7
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
/**
|
|
9
|
+
* Wrap an MCP tool handler to scan its response for threats.
|
|
10
|
+
* Advisory mode: appends a warning but never blocks.
|
|
11
|
+
* Enforce mode: can redact credential leaks.
|
|
12
|
+
*/
|
|
13
|
+
export declare function withResponseScan(toolName: string, handler: (...args: any[]) => any): (...args: any[]) => any;
|
|
8
14
|
/**
|
|
9
15
|
* Check text for kill phrase and trigger kill switch if detected.
|
|
10
16
|
* Returns true if kill switch was activated.
|
package/dist/server.js
CHANGED
|
@@ -24,6 +24,7 @@ import { queryAuditLogs, getAuditStats, getLifetimeStats } from './defence/audit
|
|
|
24
24
|
import { scanExistingMemories } from './defence/scanner/index.js';
|
|
25
25
|
import { resolveToolSource as resolveToolSourceImpl } from './defence/trust/resolve-tool-source.js';
|
|
26
26
|
import { scanToolResponse, shouldScanToolResponse } from './defence/tool-response-scanner.js';
|
|
27
|
+
import { UNTRUSTED_TOOL_TAG } from './defence/tool-response-enforce.js';
|
|
27
28
|
import { getToolResponseScanConfig } from './cloud/config.js';
|
|
28
29
|
import { checkKillPhrase } from './defence/iron-dome/index.js';
|
|
29
30
|
import { isKillSwitchActive, getKillSwitchMeta, assertOperationAllowed, activateKillSwitch, deactivateKillSwitch, KillSwitchError, } from './api/control.js';
|
|
@@ -45,7 +46,7 @@ const sourceParam = z.object({
|
|
|
45
46
|
* Enforce mode: can redact credential leaks.
|
|
46
47
|
*/
|
|
47
48
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
48
|
-
function withResponseScan(toolName, handler) {
|
|
49
|
+
export function withResponseScan(toolName, handler) {
|
|
49
50
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
50
51
|
return async (...handlerArgs) => {
|
|
51
52
|
const result = await handler(...handlerArgs);
|
|
@@ -61,8 +62,35 @@ function withResponseScan(toolName, handler) {
|
|
|
61
62
|
const scan = scanToolResponse(toolName, textContent, config.toolResponseMode);
|
|
62
63
|
if (scan.clean)
|
|
63
64
|
return result;
|
|
64
|
-
//
|
|
65
|
+
// Enforce mode: swap the threatening text for the sanitised payload the
|
|
66
|
+
// scanner produced (injection withheld, secrets redacted, exfil stripped).
|
|
67
|
+
// Non-text blocks (e.g. images) are preserved. Advisory mode keeps the
|
|
68
|
+
// observe-only behaviour: leave the response intact, append a warning.
|
|
69
|
+
if (scan.mode === 'enforce' && scan.sanitisedContent !== null) {
|
|
70
|
+
const nonText = result.content.filter((c) => c.type !== 'text');
|
|
71
|
+
if (scan.blocked) {
|
|
72
|
+
// Whole payload withheld → surface as a tool error so the agent can tell
|
|
73
|
+
// "withheld by firewall" apart from "no results / empty".
|
|
74
|
+
return {
|
|
75
|
+
...result,
|
|
76
|
+
content: [...nonText, { type: 'text', text: scan.sanitisedContent }],
|
|
77
|
+
isError: true,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// Redacted-and-delivered → cleaned payload + the untrusted-origin tag in a
|
|
81
|
+
// SEPARATE block, so redacted structured output (JSON/CSV) stays parseable.
|
|
82
|
+
return {
|
|
83
|
+
...result,
|
|
84
|
+
content: [
|
|
85
|
+
...nonText,
|
|
86
|
+
{ type: 'text', text: scan.sanitisedContent },
|
|
87
|
+
{ type: 'text', text: UNTRUSTED_TOOL_TAG },
|
|
88
|
+
],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Advisory: append warning to the response.
|
|
65
92
|
return {
|
|
93
|
+
...result,
|
|
66
94
|
content: [
|
|
67
95
|
...result.content,
|
|
68
96
|
{
|
|
@@ -688,6 +716,28 @@ Runs injection detection (40+ patterns) and credential leak scanning (25+ provid
|
|
|
688
716
|
if (scan.auditId > 0) {
|
|
689
717
|
lines.push(`**Audit ID:** ${scan.auditId}`);
|
|
690
718
|
}
|
|
719
|
+
// Enforce mode produced an actioned payload — surface it so callers using
|
|
720
|
+
// this tool as a programmatic firewall receive the safe content, not just
|
|
721
|
+
// a verdict. Advisory scans leave sanitisedContent null (verdict only).
|
|
722
|
+
if (scan.sanitisedContent !== null) {
|
|
723
|
+
lines.push('');
|
|
724
|
+
lines.push(`### Enforcement (${scan.blocked ? 'BLOCKED' : 'REDACTED'})`);
|
|
725
|
+
for (const action of scan.enforceActions) {
|
|
726
|
+
lines.push(`- ${action}`);
|
|
727
|
+
}
|
|
728
|
+
if (!scan.blocked) {
|
|
729
|
+
lines.push(`- origin: ${UNTRUSTED_TOOL_TAG}`);
|
|
730
|
+
}
|
|
731
|
+
lines.push('');
|
|
732
|
+
lines.push('**Sanitised content (deliver this instead):**');
|
|
733
|
+
// Dynamic fence longer than any backtick run in the content, so content
|
|
734
|
+
// containing ``` cannot break out of the code block.
|
|
735
|
+
const longestRun = Math.max(0, ...(scan.sanitisedContent.match(/`+/g) || []).map((s) => s.length));
|
|
736
|
+
const fence = '`'.repeat(Math.max(3, longestRun + 1));
|
|
737
|
+
lines.push(fence);
|
|
738
|
+
lines.push(scan.sanitisedContent);
|
|
739
|
+
lines.push(fence);
|
|
740
|
+
}
|
|
691
741
|
lines.push('');
|
|
692
742
|
lines.push(scan.summary);
|
|
693
743
|
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shieldcortex",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.37.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",
|