shieldcortex 4.37.0 → 4.39.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/admin.js +2 -0
- package/dist/api/routes/memories.js +5 -2
- package/dist/api/visualization-server.js +1 -0
- package/dist/database/inline-schema.js +6 -0
- package/dist/database/migrations.js +34 -0
- package/dist/database/schema.sql +6 -0
- package/dist/defence/audit/logger.js +4 -2
- package/dist/defence/audit/queries.js +4 -0
- package/dist/defence/audit/retention.js +22 -12
- package/dist/defence/iron-dome/audit.js +1 -0
- package/dist/defence/pipeline.js +4 -1
- package/dist/defence/tool-response-scanner.js +1 -0
- package/dist/defence/trust/read-guard.d.ts +45 -0
- package/dist/defence/trust/read-guard.js +76 -0
- package/dist/defence/trust/resolve-tool-source.js +2 -0
- package/dist/defence/types.d.ts +10 -0
- package/dist/memory/consolidate.d.ts +2 -1
- package/dist/memory/consolidate.js +7 -2
- package/dist/memory/lifecycle.js +5 -2
- package/dist/memory/store.d.ts +16 -2
- package/dist/memory/store.js +100 -6
- package/dist/server.js +25 -9
- package/dist/tools/context.d.ts +2 -0
- package/dist/tools/context.js +30 -5
- package/dist/tools/recall.d.ts +15 -0
- package/dist/tools/recall.js +39 -3
- package/package.json +1 -1
- /package/dashboard/.next/standalone/dashboard/.next/static/{Xdk3QuQEKommHIbMSem56 → LfTY3B6uX3j7zNwqqgvPG}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{Xdk3QuQEKommHIbMSem56 → LfTY3B6uX3j7zNwqqgvPG}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{Xdk3QuQEKommHIbMSem56 → LfTY3B6uX3j7zNwqqgvPG}/_ssgManifest.js +0 -0
package/dist/memory/store.js
CHANGED
|
@@ -21,7 +21,7 @@ import { syncMemoryDeleteToCloud, syncMemoryUpsertToCloud } from '../cloud/memor
|
|
|
21
21
|
import { isFeatureEnabled } from '../license/gate.js';
|
|
22
22
|
import { checkAccess } from '../defence/trust/access-control.js';
|
|
23
23
|
import { scoreSource } from '../defence/trust/source-scorer.js';
|
|
24
|
-
import { logAudit } from '../defence/audit/logger.js';
|
|
24
|
+
import { logAudit, createContentHash } from '../defence/audit/logger.js';
|
|
25
25
|
import { dispatchWebhook } from '../events/webhooks.js';
|
|
26
26
|
import { safeJsonParse } from './fts.js';
|
|
27
27
|
// Internal use of the link API. links.ts also imports from store.ts (getMemoryById,
|
|
@@ -230,7 +230,7 @@ function checkRateLimit(source) {
|
|
|
230
230
|
// ── Read-Time Access Control ──
|
|
231
231
|
// Exported because search-recall.ts also calls logAccessDenial inside its
|
|
232
232
|
// post-search ACL filter (cycle artifact, not intended public API).
|
|
233
|
-
export function logAccessDenial(memoryId, source, reason) {
|
|
233
|
+
export function logAccessDenial(memoryId, source, reason, operation = 'read') {
|
|
234
234
|
const trust = scoreSource(source).score;
|
|
235
235
|
logAudit({
|
|
236
236
|
memory_id: memoryId,
|
|
@@ -241,6 +241,7 @@ export function logAccessDenial(memoryId, source, reason) {
|
|
|
241
241
|
trust_score: trust,
|
|
242
242
|
sensitivity_level: 'INTERNAL',
|
|
243
243
|
firewall_result: 'BLOCK',
|
|
244
|
+
operation,
|
|
244
245
|
anomaly_score: 0,
|
|
245
246
|
threat_indicators: '[]',
|
|
246
247
|
blocked_patterns: '[]',
|
|
@@ -249,6 +250,58 @@ export function logAccessDenial(memoryId, source, reason) {
|
|
|
249
250
|
pipeline_duration_ms: 0,
|
|
250
251
|
});
|
|
251
252
|
}
|
|
253
|
+
/**
|
|
254
|
+
* Provenance ledger: record an ALLOWED read. Emitted ONCE per tool call (not per
|
|
255
|
+
* row) to keep the audit table bounded — recall returns up to 50 rows, so a
|
|
256
|
+
* per-row emit would flood it. memory_id carries the single id for single-target
|
|
257
|
+
* reads; the full id list (capped) goes in blocked_patterns for forensics.
|
|
258
|
+
*/
|
|
259
|
+
export function logAllowedRead(source, tool, memoryIds, project) {
|
|
260
|
+
if (memoryIds.length === 0)
|
|
261
|
+
return;
|
|
262
|
+
logAudit({
|
|
263
|
+
memory_id: memoryIds.length === 1 ? memoryIds[0] : null,
|
|
264
|
+
project: project ?? null,
|
|
265
|
+
timestamp: new Date().toISOString(),
|
|
266
|
+
source_type: source.type,
|
|
267
|
+
source_identifier: source.identifier,
|
|
268
|
+
trust_score: scoreSource(source).score,
|
|
269
|
+
sensitivity_level: 'INTERNAL',
|
|
270
|
+
firewall_result: 'ALLOW',
|
|
271
|
+
operation: 'read',
|
|
272
|
+
anomaly_score: 0,
|
|
273
|
+
threat_indicators: '[]',
|
|
274
|
+
blocked_patterns: JSON.stringify(memoryIds.slice(0, 50)),
|
|
275
|
+
reason: `read ${memoryIds.length} memor${memoryIds.length === 1 ? 'y' : 'ies'} via ${tool}`,
|
|
276
|
+
fragmentation_score: null,
|
|
277
|
+
pipeline_duration_ms: null,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Provenance ledger: record an ALLOWED delete (one row per deleted memory).
|
|
282
|
+
* memory_id is NULL by design — the row is emitted after the DELETE, and the
|
|
283
|
+
* audit.memory_id FK is ON DELETE SET NULL, so a live reference can't survive.
|
|
284
|
+
* The deleted id is preserved in `reason` + `blocked_patterns` for forensics.
|
|
285
|
+
*/
|
|
286
|
+
export function logAllowedDelete(memoryId, source, project) {
|
|
287
|
+
logAudit({
|
|
288
|
+
memory_id: null,
|
|
289
|
+
project: project ?? null,
|
|
290
|
+
timestamp: new Date().toISOString(),
|
|
291
|
+
source_type: source.type,
|
|
292
|
+
source_identifier: source.identifier,
|
|
293
|
+
trust_score: scoreSource(source).score,
|
|
294
|
+
sensitivity_level: 'INTERNAL',
|
|
295
|
+
firewall_result: 'ALLOW',
|
|
296
|
+
operation: 'delete',
|
|
297
|
+
anomaly_score: 0,
|
|
298
|
+
threat_indicators: '[]',
|
|
299
|
+
blocked_patterns: JSON.stringify([memoryId]),
|
|
300
|
+
reason: `deleted memory #${memoryId}`,
|
|
301
|
+
fragmentation_score: null,
|
|
302
|
+
pipeline_duration_ms: null,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
252
305
|
/**
|
|
253
306
|
* Filter raw DB rows by access control before converting to Memory objects.
|
|
254
307
|
* Returns only rows the source is allowed to read.
|
|
@@ -324,6 +377,7 @@ export function addMemory(input, config = DEFAULT_CONFIG, source) {
|
|
|
324
377
|
trust_score: scoreSource(source).score,
|
|
325
378
|
sensitivity_level: 'INTERNAL',
|
|
326
379
|
firewall_result: 'BLOCK',
|
|
380
|
+
operation: 'write',
|
|
327
381
|
anomaly_score: 1.0,
|
|
328
382
|
threat_indicators: JSON.stringify(['rate_limit_exceeded']),
|
|
329
383
|
blocked_patterns: '[]',
|
|
@@ -413,8 +467,11 @@ export function addMemory(input, config = DEFAULT_CONFIG, source) {
|
|
|
413
467
|
// defenceResult is always set now (every write is scanned), so always stamp
|
|
414
468
|
// the pipeline's real trust + sensitivity alongside the resolved source —
|
|
415
469
|
// 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
|
-
|
|
470
|
+
db.prepare(`UPDATE memories SET trust_score = ?, sensitivity_level = ?, source = ?, content_hash = ? WHERE id = ?`)
|
|
471
|
+
// content_hash = SHA-256 of the SUBMITTED content (a write-time provenance
|
|
472
|
+
// snapshot), matching the write-audit row in pipeline.ts. Consistent for
|
|
473
|
+
// >10KB memories too (where the STORED content is truncated).
|
|
474
|
+
.run(defenceResult.trust.score, defenceResult.sensitivity.level, sourceDetails.sourceValue, createContentHash(input.content), result.lastInsertRowid);
|
|
418
475
|
return result.lastInsertRowid;
|
|
419
476
|
})();
|
|
420
477
|
const memory = getMemoryById(insertedId);
|
|
@@ -701,6 +758,14 @@ export function updateMemory(id, updates) {
|
|
|
701
758
|
if (embeddedTextChanged) {
|
|
702
759
|
fields.push('embedding = NULL');
|
|
703
760
|
}
|
|
761
|
+
// STALENESS: content_hash is a write-time integrity snapshot. When content
|
|
762
|
+
// changes it must be recomputed in the SAME UPDATE — otherwise the stored hash
|
|
763
|
+
// refers to the old content and any tamper check false-positives on a
|
|
764
|
+
// legitimately-edited memory.
|
|
765
|
+
if (updates.content !== undefined) {
|
|
766
|
+
fields.push('content_hash = ?');
|
|
767
|
+
values.push(createContentHash(updates.content));
|
|
768
|
+
}
|
|
704
769
|
if (fields.length === 0)
|
|
705
770
|
return existing;
|
|
706
771
|
values.push(id);
|
|
@@ -721,6 +786,28 @@ export function updateMemory(id, updates) {
|
|
|
721
786
|
console.error('[shieldcortex] Entity extraction refresh failed:', e);
|
|
722
787
|
}
|
|
723
788
|
}
|
|
789
|
+
// Provenance ledger: a content/title change is an update-class mutation.
|
|
790
|
+
if (updates.content !== undefined || updates.title !== undefined) {
|
|
791
|
+
const changed = [updates.title !== undefined ? 'title' : null, updates.content !== undefined ? 'content' : null].filter(Boolean).join('+');
|
|
792
|
+
logAudit({
|
|
793
|
+
memory_id: id,
|
|
794
|
+
project: updatedMemory.project ?? null,
|
|
795
|
+
timestamp: new Date().toISOString(),
|
|
796
|
+
source_type: 'cli',
|
|
797
|
+
source_identifier: 'memory-update',
|
|
798
|
+
trust_score: updatedMemory.trustScore ?? 1,
|
|
799
|
+
sensitivity_level: updatedMemory.sensitivityLevel ?? 'INTERNAL',
|
|
800
|
+
firewall_result: 'ALLOW',
|
|
801
|
+
operation: 'update',
|
|
802
|
+
content_hash: updates.content !== undefined ? createContentHash(updates.content) : null,
|
|
803
|
+
anomaly_score: 0,
|
|
804
|
+
threat_indicators: '[]',
|
|
805
|
+
blocked_patterns: '[]',
|
|
806
|
+
reason: `updated memory #${id} (${changed})`,
|
|
807
|
+
fragmentation_score: null,
|
|
808
|
+
pipeline_duration_ms: null,
|
|
809
|
+
});
|
|
810
|
+
}
|
|
724
811
|
// Emit event for real-time dashboard (in-process)
|
|
725
812
|
emitMemoryUpdated(updatedMemory);
|
|
726
813
|
// Persist event for cross-process IPC (MCP → Dashboard)
|
|
@@ -804,6 +891,7 @@ export function mergeMemories(keptId, removedId, options, source = { type: 'cli'
|
|
|
804
891
|
db.prepare(`
|
|
805
892
|
UPDATE memories
|
|
806
893
|
SET content = ?,
|
|
894
|
+
content_hash = ?,
|
|
807
895
|
tags = ?,
|
|
808
896
|
salience = ?,
|
|
809
897
|
project = ?,
|
|
@@ -822,7 +910,7 @@ export function mergeMemories(keptId, removedId, options, source = { type: 'cli'
|
|
|
822
910
|
embedding = NULL,
|
|
823
911
|
updated_at = CURRENT_TIMESTAMP
|
|
824
912
|
WHERE id = ?
|
|
825
|
-
`).run(mergedContent, JSON.stringify(mergedTags), mergedSalience, mergedProject, JSON.stringify(mergedMetadata), mergedScope, mergedTransferable ? 1 : 0, mergedStatus, mergedPinned ? 1 : 0, mergedReviewedBy, new Date().toISOString(), mergedTrustScore, mergedSensitivity, mergedCloudExcluded ? 1 : 0, mergedAccessCount, mergedLastAccessed, kept.id);
|
|
913
|
+
`).run(mergedContent, createContentHash(mergedContent), JSON.stringify(mergedTags), mergedSalience, mergedProject, JSON.stringify(mergedMetadata), mergedScope, mergedTransferable ? 1 : 0, mergedStatus, mergedPinned ? 1 : 0, mergedReviewedBy, new Date().toISOString(), mergedTrustScore, mergedSensitivity, mergedCloudExcluded ? 1 : 0, mergedAccessCount, mergedLastAccessed, kept.id);
|
|
826
914
|
const updatedMemory = getMemoryById(kept.id);
|
|
827
915
|
try {
|
|
828
916
|
const extraction = extractFromMemory(updatedMemory.title, updatedMemory.content, updatedMemory.category);
|
|
@@ -856,7 +944,7 @@ export function deleteMemory(id, source) {
|
|
|
856
944
|
if (row) {
|
|
857
945
|
const policy = checkAccess({ id: row.id, source: row.source, sensitivity_level: row.sensitivity_level }, source, 'delete');
|
|
858
946
|
if (!policy.canDelete) {
|
|
859
|
-
logAccessDenial(id, source, policy.reason);
|
|
947
|
+
logAccessDenial(id, source, policy.reason, 'delete');
|
|
860
948
|
return false;
|
|
861
949
|
}
|
|
862
950
|
}
|
|
@@ -874,6 +962,12 @@ export function deleteMemory(id, source) {
|
|
|
874
962
|
const result = db.prepare('DELETE FROM memories WHERE id = ?').run(id);
|
|
875
963
|
// Emit event for real-time dashboard (in-process)
|
|
876
964
|
if (result.changes > 0 && memory) {
|
|
965
|
+
// Provenance ledger: record the allowed delete (one row per memory) when the
|
|
966
|
+
// caller is attributed. Internal source-less deletes (merge/consolidation)
|
|
967
|
+
// are machinery, not user actions, so they're not audited here.
|
|
968
|
+
if (source) {
|
|
969
|
+
logAllowedDelete(id, source, memory.project ?? null);
|
|
970
|
+
}
|
|
877
971
|
if (isFeatureEnabled('cloud_sync')) {
|
|
878
972
|
syncMemoryDeleteToCloud(memory);
|
|
879
973
|
syncGraphDeleteForMemoryToCloud(memory);
|
package/dist/server.js
CHANGED
|
@@ -12,11 +12,11 @@ import { getCurrentVersion } from './api/version.js';
|
|
|
12
12
|
import { initProjectContext, getActiveProject, setActiveProject, getProjectContextInfo, GLOBAL_PROJECT_SENTINEL, } from './context/project-context.js';
|
|
13
13
|
// Import tools
|
|
14
14
|
import { executeRemember, formatRememberResult } from './tools/remember.js';
|
|
15
|
-
import { executeRecall, formatRecallResult, executeGetMemory, formatMemory } from './tools/recall.js';
|
|
15
|
+
import { executeRecall, formatRecallResult, executeGetMemory, executeGetRelated, formatMemory } from './tools/recall.js';
|
|
16
16
|
import { executeForget, formatForgetResult } from './tools/forget.js';
|
|
17
17
|
import { executeGetContext, executeStartSession, executeEndSession, executeConsolidate, executeStats, formatStats, executeExport, executeImport, } from './tools/context.js';
|
|
18
18
|
import { generateContextSummary, formatContextSummary, fullCleanup } from './memory/consolidate.js';
|
|
19
|
-
import { getHighPriorityMemories, getRecentMemories,
|
|
19
|
+
import { getHighPriorityMemories, getRecentMemories, createMemoryLink } from './memory/store.js';
|
|
20
20
|
import { detectContradictions } from './memory/contradiction.js';
|
|
21
21
|
import { handleGraphQuery, handleGraphEntities, handleGraphExplain } from './tools/graph.js';
|
|
22
22
|
import { checkDatabaseSize } from './database/init.js';
|
|
@@ -25,6 +25,7 @@ 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
27
|
import { UNTRUSTED_TOOL_TAG } from './defence/tool-response-enforce.js';
|
|
28
|
+
import { guardReadBySensitivity, guardContextSummary } from './defence/trust/read-guard.js';
|
|
28
29
|
import { getToolResponseScanConfig } from './cloud/config.js';
|
|
29
30
|
import { checkKillPhrase } from './defence/iron-dome/index.js';
|
|
30
31
|
import { isKillSwitchActive, getKillSwitchMeta, assertOperationAllowed, activateKillSwitch, deactivateKillSwitch, KillSwitchError, } from './api/control.js';
|
|
@@ -410,8 +411,10 @@ Returns: architecture decisions, patterns, pending items, recent activity.`, {
|
|
|
410
411
|
// Export memories
|
|
411
412
|
server.tool('export_memories', 'Export memories as JSON for backup.', {
|
|
412
413
|
project: z.string().optional().describe('Project scope. Auto-detected if not provided. Use "*" for all projects.'),
|
|
414
|
+
source: sourceParam,
|
|
413
415
|
}, { title: 'Export Memories', readOnlyHint: true, destructiveHint: false, idempotentHint: true }, withKillSwitchGuard('memory_read', withResponseScan('export_memories', async (args) => {
|
|
414
|
-
const
|
|
416
|
+
const source = resolveToolSource(args.source, 'export_memories');
|
|
417
|
+
const result = executeExport({ ...args, source });
|
|
415
418
|
return {
|
|
416
419
|
content: [{
|
|
417
420
|
type: 'text',
|
|
@@ -456,8 +459,14 @@ Returns: architecture decisions, patterns, pending items, recent activity.`, {
|
|
|
456
459
|
// Get Related Memories
|
|
457
460
|
server.tool('get_related', 'Get memories related to a specific memory. Shows connections and relationships.', {
|
|
458
461
|
id: z.number().describe('Memory ID to find relationships for'),
|
|
462
|
+
source: sourceParam,
|
|
459
463
|
}, { title: 'Get Related Memories', readOnlyHint: true, destructiveHint: false, idempotentHint: true }, withKillSwitchGuard('memory_read', withResponseScan('get_related', async (args) => {
|
|
460
|
-
const
|
|
464
|
+
const source = resolveToolSource(args.source, 'get_related');
|
|
465
|
+
const result = executeGetRelated({ id: args.id, source });
|
|
466
|
+
if (!result.success) {
|
|
467
|
+
return { content: [{ type: 'text', text: `Error: ${result.error}` }], isError: true };
|
|
468
|
+
}
|
|
469
|
+
const related = result.related;
|
|
461
470
|
if (related.length === 0) {
|
|
462
471
|
return { content: [{ type: 'text', text: 'No related memories found.' }] };
|
|
463
472
|
}
|
|
@@ -536,7 +545,10 @@ but you can use this tool to check for new contradictions at any time.`, {
|
|
|
536
545
|
category: args.category,
|
|
537
546
|
minScore: args.minScore,
|
|
538
547
|
limit: args.limit,
|
|
539
|
-
})
|
|
548
|
+
}).filter(
|
|
549
|
+
// Drop a pair if either side is RESTRICTED/quarantined (don't leak a
|
|
550
|
+
// credential-class memory's title via a contradiction listing).
|
|
551
|
+
(c) => guardReadBySensitivity([c.memoryA, c.memoryB]).length === 2);
|
|
540
552
|
if (contradictions.length === 0) {
|
|
541
553
|
return { content: [{ type: 'text', text: 'No contradictions detected.' }] };
|
|
542
554
|
}
|
|
@@ -942,7 +954,8 @@ Runs injection detection (40+ patterns) and credential leak scanning (25+ provid
|
|
|
942
954
|
if (isKillSwitchActive()) {
|
|
943
955
|
return { contents: [{ uri: 'memory://context', mimeType: 'text/plain', text: '[KILL SWITCH ACTIVE] Memory access blocked.' }] };
|
|
944
956
|
}
|
|
945
|
-
|
|
957
|
+
// Shared-context resource: strip RESTRICTED + quarantined (sensitivity guard).
|
|
958
|
+
const summary = guardContextSummary(await generateContextSummary());
|
|
946
959
|
return {
|
|
947
960
|
contents: [{
|
|
948
961
|
uri: 'memory://context',
|
|
@@ -956,7 +969,8 @@ Runs injection detection (40+ patterns) and credential leak scanning (25+ provid
|
|
|
956
969
|
if (isKillSwitchActive()) {
|
|
957
970
|
return { contents: [{ uri: 'memory://important', mimeType: 'text/plain', text: '[KILL SWITCH ACTIVE] Memory access blocked.' }] };
|
|
958
971
|
}
|
|
959
|
-
|
|
972
|
+
// Shared-context resource: strip RESTRICTED + quarantined before exposing content.
|
|
973
|
+
const memories = guardReadBySensitivity(getHighPriorityMemories(20));
|
|
960
974
|
const text = memories.map(m => `## ${m.title}\n${m.content}\n*${m.category} | ${(m.salience * 100).toFixed(0)}% salience*\n`).join('\n');
|
|
961
975
|
return {
|
|
962
976
|
contents: [{
|
|
@@ -971,7 +985,8 @@ Runs injection detection (40+ patterns) and credential leak scanning (25+ provid
|
|
|
971
985
|
if (isKillSwitchActive()) {
|
|
972
986
|
return { contents: [{ uri: 'memory://recent', mimeType: 'text/plain', text: '[KILL SWITCH ACTIVE] Memory access blocked.' }] };
|
|
973
987
|
}
|
|
974
|
-
|
|
988
|
+
// Shared-context resource: strip RESTRICTED + quarantined before exposing content.
|
|
989
|
+
const memories = guardReadBySensitivity(getRecentMemories(15));
|
|
975
990
|
const text = memories.map(m => `- **${m.title}** (${m.category}): ${m.content.slice(0, 100)}...`).join('\n');
|
|
976
991
|
return {
|
|
977
992
|
contents: [{
|
|
@@ -991,7 +1006,8 @@ Runs injection detection (40+ patterns) and credential leak scanning (25+ provid
|
|
|
991
1006
|
messages: [{ role: 'user', content: { type: 'text', text: '[KILL SWITCH ACTIVE] Context restoration blocked. Use iron_dome_resume to resume.' } }],
|
|
992
1007
|
};
|
|
993
1008
|
}
|
|
994
|
-
|
|
1009
|
+
// Shared-context prompt: strip RESTRICTED + quarantined (sensitivity guard).
|
|
1010
|
+
const summary = guardContextSummary(await generateContextSummary());
|
|
995
1011
|
const context = formatContextSummary(summary);
|
|
996
1012
|
return {
|
|
997
1013
|
messages: [{
|
package/dist/tools/context.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { z } from 'zod';
|
|
|
8
8
|
import { getMemoryStats } from '../memory/store.js';
|
|
9
9
|
import { type SalienceDistribution } from '../memory/metrics.js';
|
|
10
10
|
import { Memory, ContextSummary, ConsolidationResult } from '../memory/types.js';
|
|
11
|
+
import type { DefenceSource } from '../defence/types.js';
|
|
11
12
|
export declare const getContextSchema: z.ZodObject<{
|
|
12
13
|
project: z.ZodOptional<z.ZodString>;
|
|
13
14
|
query: z.ZodOptional<z.ZodString>;
|
|
@@ -132,6 +133,7 @@ export declare const exportSchema: z.ZodObject<{
|
|
|
132
133
|
}>;
|
|
133
134
|
export declare function executeExport(input: {
|
|
134
135
|
project?: string;
|
|
136
|
+
source?: DefenceSource;
|
|
135
137
|
}): {
|
|
136
138
|
success: boolean;
|
|
137
139
|
data?: string;
|
package/dist/tools/context.js
CHANGED
|
@@ -6,10 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { generateContextSummary, formatContextSummary, startSession, endSession, getSuggestedContext, consolidate, previewConsolidation, exportMemories, importMemories, } from '../memory/consolidate.js';
|
|
9
|
-
import { getMemoryStats } from '../memory/store.js';
|
|
9
|
+
import { getMemoryStats, logAllowedRead } from '../memory/store.js';
|
|
10
10
|
import { getSalienceDistribution } from '../memory/metrics.js';
|
|
11
11
|
import { getDatabase } from '../database/init.js';
|
|
12
12
|
import { resolveProject } from '../context/project-context.js';
|
|
13
|
+
import { guardReadBySensitivity, guardContextSummary } from '../defence/trust/read-guard.js';
|
|
13
14
|
// Input schema for getting context
|
|
14
15
|
export const getContextSchema = z.object({
|
|
15
16
|
project: z.string().optional().describe('Project to get context for'),
|
|
@@ -29,12 +30,18 @@ export async function executeGetContext(input) {
|
|
|
29
30
|
// Resolve project (auto-detect if not provided)
|
|
30
31
|
const resolvedProject = resolveProject(input.project);
|
|
31
32
|
const projectFilter = resolvedProject ?? undefined;
|
|
33
|
+
// Read guard: get_context is a SHARED-CONTEXT bootstrap surface that feeds
|
|
34
|
+
// the prompt, so strip RESTRICTED + quarantined for everyone (matching the
|
|
35
|
+
// .mjs prompt hooks) but keep INTERNAL project context available — a
|
|
36
|
+
// sensitivity guard, not the per-caller own-only ACL, so a low-trust
|
|
37
|
+
// subagent isn't blacked out from the context it needs. Owner-specific
|
|
38
|
+
// RESTRICTED retrieval is the explicit get_memory tool's job.
|
|
32
39
|
// Generate context summary
|
|
33
|
-
const summary = await generateContextSummary(projectFilter);
|
|
40
|
+
const summary = guardContextSummary(await generateContextSummary(projectFilter));
|
|
34
41
|
// If there's a query, also get specifically relevant memories
|
|
35
42
|
let relevantMemories = [];
|
|
36
43
|
if (input.query) {
|
|
37
|
-
relevantMemories = await getSuggestedContext(input.query, projectFilter, 5);
|
|
44
|
+
relevantMemories = guardReadBySensitivity(await getSuggestedContext(input.query, projectFilter, 5));
|
|
38
45
|
}
|
|
39
46
|
// Format based on requested format
|
|
40
47
|
let context;
|
|
@@ -54,6 +61,16 @@ export async function executeGetContext(input) {
|
|
|
54
61
|
}
|
|
55
62
|
break;
|
|
56
63
|
}
|
|
64
|
+
// Provenance ledger: one allowed-read row per get_context call, covering
|
|
65
|
+
// every memory surfaced into the context.
|
|
66
|
+
const source = input.source;
|
|
67
|
+
if (source) {
|
|
68
|
+
const surfacedIds = [
|
|
69
|
+
...summary.recentMemories, ...summary.keyDecisions,
|
|
70
|
+
...summary.activePatterns, ...summary.pendingItems, ...relevantMemories,
|
|
71
|
+
].map(m => m.id);
|
|
72
|
+
logAllowedRead(source, 'get_context', [...new Set(surfacedIds)], projectFilter);
|
|
73
|
+
}
|
|
57
74
|
return {
|
|
58
75
|
success: true,
|
|
59
76
|
context,
|
|
@@ -133,7 +150,10 @@ export async function executeStartSession(input) {
|
|
|
133
150
|
const resolvedProject = resolveProject(input.project);
|
|
134
151
|
const projectFilter = resolvedProject ?? undefined;
|
|
135
152
|
const { sessionId, context } = await startSession(projectFilter);
|
|
136
|
-
|
|
153
|
+
// Read guard: start_session is a shared-context bootstrap surface (sibling of
|
|
154
|
+
// get_context) — strip RESTRICTED + quarantined before formatting so the
|
|
155
|
+
// session preamble never leaks credential-class memories.
|
|
156
|
+
const formattedContext = formatContextSummary(guardContextSummary(context));
|
|
137
157
|
return {
|
|
138
158
|
success: true,
|
|
139
159
|
sessionId,
|
|
@@ -257,8 +277,13 @@ export function executeExport(input) {
|
|
|
257
277
|
// Resolve project (auto-detect if not provided)
|
|
258
278
|
const resolvedProject = resolveProject(input.project);
|
|
259
279
|
const projectFilter = resolvedProject ?? undefined;
|
|
260
|
-
|
|
280
|
+
// Read ACL: filter the bulk dump to rows this caller may read.
|
|
281
|
+
const data = exportMemories(projectFilter, input.source);
|
|
261
282
|
const memories = JSON.parse(data);
|
|
283
|
+
// Provenance ledger: a bulk export is the highest-value read to audit.
|
|
284
|
+
if (input.source) {
|
|
285
|
+
logAllowedRead(input.source, 'export_memories', memories.map(m => m.id), projectFilter);
|
|
286
|
+
}
|
|
262
287
|
return {
|
|
263
288
|
success: true,
|
|
264
289
|
data,
|
package/dist/tools/recall.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Search and retrieve memories using semantic search and filters.
|
|
5
5
|
*/
|
|
6
6
|
import { z } from 'zod';
|
|
7
|
+
import { getRelatedMemories } from '../memory/store.js';
|
|
7
8
|
import { Memory } from '../memory/types.js';
|
|
8
9
|
import type { DefenceSource } from '../defence/types.js';
|
|
9
10
|
export declare const recallSchema: z.ZodObject<{
|
|
@@ -114,3 +115,17 @@ export declare function executeGetMemory(input: {
|
|
|
114
115
|
memory?: Memory;
|
|
115
116
|
error?: string;
|
|
116
117
|
};
|
|
118
|
+
/**
|
|
119
|
+
* Execute the get_related tool — related memories, ACL-filtered.
|
|
120
|
+
*
|
|
121
|
+
* Related links can cross trust/sensitivity boundaries, so the same read ACL
|
|
122
|
+
* applies: a caller only sees related memories it is permitted to read.
|
|
123
|
+
*/
|
|
124
|
+
export declare function executeGetRelated(input: {
|
|
125
|
+
id: number;
|
|
126
|
+
source?: DefenceSource;
|
|
127
|
+
}): {
|
|
128
|
+
success: boolean;
|
|
129
|
+
related?: ReturnType<typeof getRelatedMemories>;
|
|
130
|
+
error?: string;
|
|
131
|
+
};
|
package/dist/tools/recall.js
CHANGED
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
* Search and retrieve memories using semantic search and filters.
|
|
5
5
|
*/
|
|
6
6
|
import { z } from 'zod';
|
|
7
|
-
import { searchMemories, recallWithEmbeddings, accessMemory, getRecentMemories, getHighPriorityMemories } from '../memory/store.js';
|
|
7
|
+
import { searchMemories, recallWithEmbeddings, accessMemory, getRecentMemories, getHighPriorityMemories, getRelatedMemories, logAllowedRead } from '../memory/store.js';
|
|
8
8
|
import { formatTimeSinceAccess } from '../memory/decay.js';
|
|
9
9
|
import { MemoryNotFoundError, formatErrorForMcp } from '../errors.js';
|
|
10
10
|
import { resolveProject } from '../context/project-context.js';
|
|
11
11
|
import { memoryFreshnessWarning } from '../memory/staleness.js';
|
|
12
|
+
import { guardReadMemories, guardReadMemory } from '../defence/trust/read-guard.js';
|
|
12
13
|
const sourceSchema = z.object({
|
|
13
14
|
type: z.enum(['user', 'cli', 'hook', 'email', 'web', 'agent', 'file', 'api', 'tool_response']),
|
|
14
15
|
identifier: z.string(),
|
|
@@ -99,6 +100,11 @@ export async function executeRecall(input) {
|
|
|
99
100
|
}
|
|
100
101
|
break;
|
|
101
102
|
}
|
|
103
|
+
// Read ACL: drop quarantined + rows this caller may not read (RESTRICTED
|
|
104
|
+
// isolation / own-only for low trust). Belt-and-braces — the recent/important
|
|
105
|
+
// store helpers + search already apply access control, but this keeps every
|
|
106
|
+
// recall mode uniform and never reinforces a row the caller can't see.
|
|
107
|
+
memories = guardReadMemories(memories, source);
|
|
102
108
|
// Access each memory to reinforce it
|
|
103
109
|
memories = memories.map(m => accessMemory(m.id, undefined, source) || m);
|
|
104
110
|
// v4.0.0: Append staleness warnings to old memories
|
|
@@ -109,6 +115,9 @@ export async function executeRecall(input) {
|
|
|
109
115
|
}
|
|
110
116
|
return m;
|
|
111
117
|
});
|
|
118
|
+
// Provenance ledger: one allowed-read row per recall call (not per memory).
|
|
119
|
+
if (source)
|
|
120
|
+
logAllowedRead(source, `recall:${input.mode}`, memories.map(m => m.id), projectFilter);
|
|
112
121
|
return {
|
|
113
122
|
success: true,
|
|
114
123
|
memories,
|
|
@@ -180,14 +189,41 @@ export const getMemorySchema = z.object({
|
|
|
180
189
|
export function executeGetMemory(input) {
|
|
181
190
|
try {
|
|
182
191
|
const memory = accessMemory(input.id, undefined, input.source);
|
|
183
|
-
|
|
192
|
+
// Read ACL: a caller that may not read this memory gets a not-found, never
|
|
193
|
+
// the content (don't reveal existence of RESTRICTED / other-source rows).
|
|
194
|
+
const allowed = guardReadMemory(memory, input.source);
|
|
195
|
+
if (!allowed) {
|
|
184
196
|
const error = new MemoryNotFoundError(input.id);
|
|
185
197
|
return {
|
|
186
198
|
success: false,
|
|
187
199
|
error: error.toUserMessage(),
|
|
188
200
|
};
|
|
189
201
|
}
|
|
190
|
-
|
|
202
|
+
if (input.source)
|
|
203
|
+
logAllowedRead(input.source, 'get_memory', [allowed.id], allowed.project ?? null);
|
|
204
|
+
return { success: true, memory: allowed };
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
return {
|
|
208
|
+
success: false,
|
|
209
|
+
error: formatErrorForMcp(error),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Execute the get_related tool — related memories, ACL-filtered.
|
|
215
|
+
*
|
|
216
|
+
* Related links can cross trust/sensitivity boundaries, so the same read ACL
|
|
217
|
+
* applies: a caller only sees related memories it is permitted to read.
|
|
218
|
+
*/
|
|
219
|
+
export function executeGetRelated(input) {
|
|
220
|
+
try {
|
|
221
|
+
const related = getRelatedMemories(input.id);
|
|
222
|
+
const allowedIds = new Set(guardReadMemories(related.map((r) => r.memory), input.source).map((m) => m.id));
|
|
223
|
+
if (input.source && allowedIds.size > 0) {
|
|
224
|
+
logAllowedRead(input.source, 'get_related', [...allowedIds]);
|
|
225
|
+
}
|
|
226
|
+
return { success: true, related: related.filter((r) => allowedIds.has(r.memory.id)) };
|
|
191
227
|
}
|
|
192
228
|
catch (error) {
|
|
193
229
|
return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shieldcortex",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.39.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",
|
|
File without changes
|
|
File without changes
|