shieldcortex 4.39.0 → 4.40.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/cloud/cli.js +13 -1
- package/dist/cloud/config.d.ts +10 -0
- package/dist/cloud/config.js +15 -0
- package/dist/defence/audit/queries.d.ts +1 -1
- package/dist/defence/trust/access-control.d.ts +1 -4
- package/dist/defence/trust/access-control.js +32 -0
- package/dist/defence/types.d.ts +1 -1
- package/dist/memory/store.d.ts +4 -2
- package/dist/memory/store.js +9 -7
- package/dist/server.js +9 -1
- package/dist/tools/forget.d.ts +3 -0
- package/dist/tools/forget.js +53 -1
- package/package.json +1 -1
- /package/dashboard/.next/standalone/dashboard/.next/static/{LfTY3B6uX3j7zNwqqgvPG → UA_86bJ-tNIyDXr-i0gK6}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{LfTY3B6uX3j7zNwqqgvPG → UA_86bJ-tNIyDXr-i0gK6}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{LfTY3B6uX3j7zNwqqgvPG → UA_86bJ-tNIyDXr-i0gK6}/_ssgManifest.js +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
2
|
-
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57043,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n3:I[27657,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\n9:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nb:I[30687,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"
|
|
1
|
+
<!DOCTYPE html><!--UA_86bJ_tNIyDXr_i0gK6--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/d878b929b21636c4.js"/><script src="/_next/static/chunks/f70f563804550a9c.js" async=""></script><script src="/_next/static/chunks/43d761df92da7cb6.js" async=""></script><script src="/_next/static/chunks/e281719dbabcca1d.js" async=""></script><script src="/_next/static/chunks/9e56d1f8f4d7adcb.js" async=""></script><script src="/_next/static/chunks/turbopack-768a6a8b9db952e0.js" async=""></script><script src="/_next/static/chunks/102f894cc892994d.js" async=""></script><script src="/_next/static/chunks/417032eeb2cd875f.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
|
|
2
|
+
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57043,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n3:I[27657,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\n9:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nb:I[30687,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"UA_86bJ-tNIyDXr-i0gK6\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/102f894cc892994d.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/417032eeb2cd875f.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
|
package/dist/cloud/cli.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getCloudConfig, setCloudConfig, getCloudSyncControls, setCloudSyncControls, getDefenceMode, setDefenceMode, getVerifyConfig, setVerifyConfig, getReviewCopilotConfig, getOpenClawAutoMemory, setOpenClawAutoMemory, isProactiveRecallEnabled, setProactiveRecall, restore410Defaults, getRankerConfig, setRankerConfig, getToolResponseScanConfig, setToolResponseScanConfig, } from './config.js';
|
|
1
|
+
import { getCloudConfig, setCloudConfig, getCloudSyncControls, setCloudSyncControls, getDefenceMode, setDefenceMode, getVerifyConfig, setVerifyConfig, getReviewCopilotConfig, getOpenClawAutoMemory, setOpenClawAutoMemory, isProactiveRecallEnabled, setProactiveRecall, restore410Defaults, getRankerConfig, setRankerConfig, getToolResponseScanConfig, setToolResponseScanConfig, isRevokeBySourceEnabled, setRevokeBySourceEnabled, } from './config.js';
|
|
2
2
|
const VALID_RANKER_ENGINES = ['rrf', 'legacy'];
|
|
3
3
|
import { syncAllGraphToCloud } from './graph-sync.js';
|
|
4
4
|
import { syncAllMemoriesToCloud } from './memory-sync.js';
|
|
@@ -22,6 +22,7 @@ export function handleCloudConfig(args) {
|
|
|
22
22
|
console.log('\nShieldCortex Configuration:');
|
|
23
23
|
console.log(` Defence Mode: ${mode}`);
|
|
24
24
|
console.log(` Tool-Output Firewall: ${toolFirewall.scanToolResponses ? toolFirewall.toolResponseMode : 'Off'}`);
|
|
25
|
+
console.log(` Revoke-by-source: ${isRevokeBySourceEnabled() ? 'Enabled (destructive)' : 'Disabled (default)'}`);
|
|
25
26
|
console.log(` Cloud Enabled: ${config.cloudEnabled ? 'Yes' : 'No'}`);
|
|
26
27
|
console.log(` API Key: ${config.cloudApiKey ? config.cloudApiKey.substring(0, 12) + '...' : 'Not set'}`);
|
|
27
28
|
console.log(` Base URL: ${config.cloudBaseUrl}`);
|
|
@@ -210,6 +211,16 @@ export function handleCloudConfig(args) {
|
|
|
210
211
|
console.log('Tool-output firewall enabled (scanning on).');
|
|
211
212
|
changed = true;
|
|
212
213
|
}
|
|
214
|
+
if (args.includes('--allow-revoke-by-source')) {
|
|
215
|
+
setRevokeBySourceEnabled(true);
|
|
216
|
+
console.log('Revoke-by-source ENABLED. `forget --fromSource` can now bulk-delete a source\'s memories (trust-hierarchy ACL still applies). Disable again with --disallow-revoke-by-source when done.');
|
|
217
|
+
changed = true;
|
|
218
|
+
}
|
|
219
|
+
if (args.includes('--disallow-revoke-by-source')) {
|
|
220
|
+
setRevokeBySourceEnabled(false);
|
|
221
|
+
console.log('Revoke-by-source disabled (default).');
|
|
222
|
+
changed = true;
|
|
223
|
+
}
|
|
213
224
|
if (args.includes('--upsell-mute')) {
|
|
214
225
|
setUpsellState({ proMuted: true });
|
|
215
226
|
console.log('Pro upsell muted. Re-enable with --upsell-unmute.');
|
|
@@ -238,6 +249,7 @@ export function handleCloudConfig(args) {
|
|
|
238
249
|
console.log(' --tool-firewall-enforce Redact/withhold threatening tool output before the agent sees it');
|
|
239
250
|
console.log(' --tool-firewall-advisory Log tool-output threats but deliver intact (default)');
|
|
240
251
|
console.log(' --tool-firewall-off / --tool-firewall-on Disable / enable tool-output scanning');
|
|
252
|
+
console.log(' --allow-revoke-by-source / --disallow-revoke-by-source Enable/disable destructive forget --fromSource (default: disabled)');
|
|
241
253
|
console.log(' --restore-4.10-defaults Restore pre-v4.11.0 defaults (recall on, strict interceptor, minimal preamble)');
|
|
242
254
|
console.log(' --upsell-mute Suppress the Pro upsell footer in doctor');
|
|
243
255
|
console.log(' --upsell-unmute Allow the Pro upsell footer to surface again');
|
package/dist/cloud/config.d.ts
CHANGED
|
@@ -191,6 +191,16 @@ export declare function getToolResponseScanConfig(): ToolResponseScanConfig;
|
|
|
191
191
|
* Persists tool response scanning config.
|
|
192
192
|
*/
|
|
193
193
|
export declare function setToolResponseScanConfig(updates: Partial<ToolResponseScanConfig>): void;
|
|
194
|
+
/**
|
|
195
|
+
* revoke-by-source (bulk delete all memories from a source) is a destructive
|
|
196
|
+
* mass-delete primitive. Because a prompt-injection adversary runs AS the agent
|
|
197
|
+
* at the agent's own trust, no in-band (trust) check can distinguish "the human
|
|
198
|
+
* asked" from "an injection asked". So it is gated OFF by default and can only
|
|
199
|
+
* be enabled by an out-of-band human action (editing config / the CLI flag) that
|
|
200
|
+
* a hijacked agent cannot perform.
|
|
201
|
+
*/
|
|
202
|
+
export declare function isRevokeBySourceEnabled(): boolean;
|
|
203
|
+
export declare function setRevokeBySourceEnabled(enabled: boolean): void;
|
|
194
204
|
/**
|
|
195
205
|
* Returns a stable UUID for this machine.
|
|
196
206
|
* Generates and persists on first call; reads from config thereafter.
|
package/dist/cloud/config.js
CHANGED
|
@@ -938,6 +938,21 @@ export function setToolResponseScanConfig(updates) {
|
|
|
938
938
|
raw.toolResponseMode = updates.toolResponseMode;
|
|
939
939
|
});
|
|
940
940
|
}
|
|
941
|
+
// ── Revoke-by-source gate ─────────────────────────────
|
|
942
|
+
/**
|
|
943
|
+
* revoke-by-source (bulk delete all memories from a source) is a destructive
|
|
944
|
+
* mass-delete primitive. Because a prompt-injection adversary runs AS the agent
|
|
945
|
+
* at the agent's own trust, no in-band (trust) check can distinguish "the human
|
|
946
|
+
* asked" from "an injection asked". So it is gated OFF by default and can only
|
|
947
|
+
* be enabled by an out-of-band human action (editing config / the CLI flag) that
|
|
948
|
+
* a hijacked agent cannot perform.
|
|
949
|
+
*/
|
|
950
|
+
export function isRevokeBySourceEnabled() {
|
|
951
|
+
return readRawConfig().allowRevokeBySource === true;
|
|
952
|
+
}
|
|
953
|
+
export function setRevokeBySourceEnabled(enabled) {
|
|
954
|
+
mutateRawConfig((raw) => { raw.allowRevokeBySource = enabled; });
|
|
955
|
+
}
|
|
941
956
|
// ── Device Identity ────────────────────────────────────
|
|
942
957
|
/**
|
|
943
958
|
* Returns a stable UUID for this machine.
|
|
@@ -21,7 +21,7 @@ export interface AgentTimelinePoint {
|
|
|
21
21
|
export interface AuditQueryOptions {
|
|
22
22
|
startTime?: string;
|
|
23
23
|
endTime?: string;
|
|
24
|
-
operation?: 'write' | 'read' | 'delete' | 'update';
|
|
24
|
+
operation?: 'write' | 'read' | 'delete' | 'update' | 'revoke';
|
|
25
25
|
source?: string;
|
|
26
26
|
firewallResult?: FirewallResult;
|
|
27
27
|
memoryId?: number;
|
|
@@ -22,7 +22,4 @@ export interface AccessCheckMemory {
|
|
|
22
22
|
source?: string | null;
|
|
23
23
|
sensitivity_level?: string | null;
|
|
24
24
|
}
|
|
25
|
-
|
|
26
|
-
* Check whether a source has access to a memory for a given operation.
|
|
27
|
-
*/
|
|
28
|
-
export declare function checkAccess(memory: AccessCheckMemory, source: DefenceSource, operation: 'read' | 'write' | 'delete'): AccessPolicy;
|
|
25
|
+
export declare function checkAccess(memory: AccessCheckMemory, source: DefenceSource, operation: 'read' | 'write' | 'delete' | 'revoke'): AccessPolicy;
|
|
@@ -12,6 +12,13 @@ import { scoreSource } from './source-scorer.js';
|
|
|
12
12
|
/**
|
|
13
13
|
* Check whether a source has access to a memory for a given operation.
|
|
14
14
|
*/
|
|
15
|
+
/** Parse a stored "type:identifier" source string back into a DefenceSource. */
|
|
16
|
+
function parseStoredSource(stored) {
|
|
17
|
+
const i = stored.indexOf(':');
|
|
18
|
+
if (i === -1)
|
|
19
|
+
return { type: 'agent', identifier: stored }; // unknown shape → low-trust agent
|
|
20
|
+
return { type: stored.slice(0, i), identifier: stored.slice(i + 1) };
|
|
21
|
+
}
|
|
15
22
|
export function checkAccess(memory, source, operation) {
|
|
16
23
|
const trust = scoreSource(source).score;
|
|
17
24
|
const memorySource = memory.source || '__system:unattributed';
|
|
@@ -50,6 +57,31 @@ export function checkAccess(memory, source, operation) {
|
|
|
50
57
|
}
|
|
51
58
|
return deny('Can only delete own memories (trust ≥0.5)');
|
|
52
59
|
}
|
|
60
|
+
if (operation === 'revoke') {
|
|
61
|
+
// Trust-hierarchy revoke (revoke-by-source remediation): own cleanup, OR a
|
|
62
|
+
// high-trust caller may purge a STRICTLY lower-trust source's memories.
|
|
63
|
+
// Equal/higher-trust targets are protected, so a 0.9 agent can never revoke
|
|
64
|
+
// user:direct (1.0). Single-row 'delete' stays own-only — this override is
|
|
65
|
+
// reachable only through the explicit revoke path.
|
|
66
|
+
if (isOwner && trust >= 0.5) {
|
|
67
|
+
return { canRead: true, canWrite: false, canDelete: true, writeRequiresQuarantine: false, reason: 'Owner revoke' };
|
|
68
|
+
}
|
|
69
|
+
// Fail-safe: never mass-revoke unattributed / unclassifiable memories. They
|
|
70
|
+
// have no clear owner to outrank, and a 0-trust target would be outranked by
|
|
71
|
+
// any caller — so a high-trust caller must NOT be able to sweep null-source
|
|
72
|
+
// rows by source.
|
|
73
|
+
if (!memory.source || memorySource === '__system:unattributed') {
|
|
74
|
+
return deny('Revoke denied: unattributed memories cannot be revoked by source');
|
|
75
|
+
}
|
|
76
|
+
const targetTrust = scoreSource(parseStoredSource(memorySource)).score;
|
|
77
|
+
if (targetTrust > 0 && trust >= 0.7 && trust > targetTrust) {
|
|
78
|
+
return {
|
|
79
|
+
canRead: true, canWrite: false, canDelete: true, writeRequiresQuarantine: false,
|
|
80
|
+
reason: `Trust-hierarchy revoke (caller ${trust.toFixed(2)} > target ${targetTrust.toFixed(2)})`,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return deny('Revoke denied: must own the source or outrank it (trust ≥0.7 and strictly > a known target source trust)');
|
|
84
|
+
}
|
|
53
85
|
return deny('Unknown operation');
|
|
54
86
|
}
|
|
55
87
|
function allow(reason) {
|
package/dist/defence/types.d.ts
CHANGED
|
@@ -130,7 +130,7 @@ export interface QuarantineEntry {
|
|
|
130
130
|
audit_id: number | null;
|
|
131
131
|
}
|
|
132
132
|
/** Operation that produced an audit row (provenance ledger discriminator). */
|
|
133
|
-
export type AuditOperation = 'write' | 'read' | 'delete' | 'update';
|
|
133
|
+
export type AuditOperation = 'write' | 'read' | 'delete' | 'update' | 'revoke';
|
|
134
134
|
export interface AuditEntry {
|
|
135
135
|
id: number;
|
|
136
136
|
memory_id: number | null;
|
package/dist/memory/store.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ export declare function logAllowedRead(source: DefenceSource, tool: string, memo
|
|
|
34
34
|
* audit.memory_id FK is ON DELETE SET NULL, so a live reference can't survive.
|
|
35
35
|
* The deleted id is preserved in `reason` + `blocked_patterns` for forensics.
|
|
36
36
|
*/
|
|
37
|
-
export declare function logAllowedDelete(memoryId: number, source: DefenceSource, project?: string | null): void;
|
|
37
|
+
export declare function logAllowedDelete(memoryId: number, source: DefenceSource, project?: string | null, operation?: AuditOperation): void;
|
|
38
38
|
/**
|
|
39
39
|
* Error thrown when memory creation is paused
|
|
40
40
|
*/
|
|
@@ -65,7 +65,9 @@ export declare function mergeMemories(keptId: number, removedId: number, options
|
|
|
65
65
|
/**
|
|
66
66
|
* Delete a memory
|
|
67
67
|
*/
|
|
68
|
-
export declare function deleteMemory(id: number, source?: DefenceSource
|
|
68
|
+
export declare function deleteMemory(id: number, source?: DefenceSource, opts?: {
|
|
69
|
+
mode?: 'delete' | 'revoke';
|
|
70
|
+
}): boolean;
|
|
69
71
|
/**
|
|
70
72
|
* Get all memories for a project
|
|
71
73
|
*/
|
package/dist/memory/store.js
CHANGED
|
@@ -283,7 +283,7 @@ export function logAllowedRead(source, tool, memoryIds, project) {
|
|
|
283
283
|
* audit.memory_id FK is ON DELETE SET NULL, so a live reference can't survive.
|
|
284
284
|
* The deleted id is preserved in `reason` + `blocked_patterns` for forensics.
|
|
285
285
|
*/
|
|
286
|
-
export function logAllowedDelete(memoryId, source, project) {
|
|
286
|
+
export function logAllowedDelete(memoryId, source, project, operation = 'delete') {
|
|
287
287
|
logAudit({
|
|
288
288
|
memory_id: null,
|
|
289
289
|
project: project ?? null,
|
|
@@ -293,7 +293,7 @@ export function logAllowedDelete(memoryId, source, project) {
|
|
|
293
293
|
trust_score: scoreSource(source).score,
|
|
294
294
|
sensitivity_level: 'INTERNAL',
|
|
295
295
|
firewall_result: 'ALLOW',
|
|
296
|
-
operation
|
|
296
|
+
operation,
|
|
297
297
|
anomaly_score: 0,
|
|
298
298
|
threat_indicators: '[]',
|
|
299
299
|
blocked_patterns: JSON.stringify([memoryId]),
|
|
@@ -936,15 +936,17 @@ export function mergeMemories(keptId, removedId, options, source = { type: 'cli'
|
|
|
936
936
|
/**
|
|
937
937
|
* Delete a memory
|
|
938
938
|
*/
|
|
939
|
-
export function deleteMemory(id, source) {
|
|
939
|
+
export function deleteMemory(id, source, opts) {
|
|
940
940
|
const db = getDatabase();
|
|
941
|
-
|
|
941
|
+
const aclOp = opts?.mode ?? 'delete';
|
|
942
|
+
// ACCESS CONTROL: Check delete permission. mode 'revoke' uses the
|
|
943
|
+
// trust-hierarchy rule (own OR outrank); 'delete' (default) stays own-only.
|
|
942
944
|
if (source) {
|
|
943
945
|
const row = db.prepare('SELECT id, source, sensitivity_level FROM memories WHERE id = ?').get(id);
|
|
944
946
|
if (row) {
|
|
945
|
-
const policy = checkAccess({ id: row.id, source: row.source, sensitivity_level: row.sensitivity_level }, source,
|
|
947
|
+
const policy = checkAccess({ id: row.id, source: row.source, sensitivity_level: row.sensitivity_level }, source, aclOp);
|
|
946
948
|
if (!policy.canDelete) {
|
|
947
|
-
logAccessDenial(id, source, policy.reason,
|
|
949
|
+
logAccessDenial(id, source, policy.reason, aclOp);
|
|
948
950
|
return false;
|
|
949
951
|
}
|
|
950
952
|
}
|
|
@@ -966,7 +968,7 @@ export function deleteMemory(id, source) {
|
|
|
966
968
|
// caller is attributed. Internal source-less deletes (merge/consolidation)
|
|
967
969
|
// are machinery, not user actions, so they're not audited here.
|
|
968
970
|
if (source) {
|
|
969
|
-
logAllowedDelete(id, source, memory.project ?? null);
|
|
971
|
+
logAllowedDelete(id, source, memory.project ?? null, aclOp);
|
|
970
972
|
}
|
|
971
973
|
if (isFeatureEnabled('cloud_sync')) {
|
|
972
974
|
syncMemoryDeleteToCloud(memory);
|
package/dist/server.js
CHANGED
|
@@ -23,6 +23,7 @@ import { checkDatabaseSize } from './database/init.js';
|
|
|
23
23
|
import { queryAuditLogs, getAuditStats, getLifetimeStats } from './defence/audit/index.js';
|
|
24
24
|
import { scanExistingMemories } from './defence/scanner/index.js';
|
|
25
25
|
import { resolveToolSource as resolveToolSourceImpl } from './defence/trust/resolve-tool-source.js';
|
|
26
|
+
import { inferSourceFromEnvironment } from './defence/trust/env-detector.js';
|
|
26
27
|
import { scanToolResponse, shouldScanToolResponse } from './defence/tool-response-scanner.js';
|
|
27
28
|
import { UNTRUSTED_TOOL_TAG } from './defence/tool-response-enforce.js';
|
|
28
29
|
import { guardReadBySensitivity, guardContextSummary } from './defence/trust/read-guard.js';
|
|
@@ -287,8 +288,15 @@ Modes: search (query-based), recent (by time), important (by salience)`, {
|
|
|
287
288
|
confirm: z.boolean().optional().default(false)
|
|
288
289
|
.describe('Confirm bulk delete'),
|
|
289
290
|
source: sourceParam,
|
|
291
|
+
fromSource: z.string().optional()
|
|
292
|
+
.describe('Revoke-by-source: delete all memories written by this source ("type:identifier", or "type:*" for a whole type). Authorised by the trust-hierarchy revoke ACL (own the source or outrank it). Use project:"*" to revoke across all projects.'),
|
|
290
293
|
}, { title: 'Delete Memories', readOnlyHint: false, destructiveHint: true, idempotentHint: false }, withKillSwitchGuard('memory_write', async (args) => {
|
|
291
|
-
|
|
294
|
+
// Delete is destructive, and revoke-by-source grants cross-identity power,
|
|
295
|
+
// so the caller identity MUST be the unspoofable runtime identity — derive
|
|
296
|
+
// it from the environment, NOT the MCP-declared `source` param. Honouring a
|
|
297
|
+
// declared identity would let a caller claim ownership of any peer source's
|
|
298
|
+
// memories (the clamp only caps trust SCORE, not identity).
|
|
299
|
+
const source = inferSourceFromEnvironment().source;
|
|
292
300
|
const result = await executeForget({ ...args, source });
|
|
293
301
|
return {
|
|
294
302
|
content: [{ type: 'text', text: formatForgetResult(result) }],
|
package/dist/tools/forget.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export declare const forgetSchema: z.ZodObject<{
|
|
|
23
23
|
type: "user" | "cli" | "hook" | "email" | "web" | "agent" | "file" | "api" | "tool_response";
|
|
24
24
|
identifier: string;
|
|
25
25
|
}>>;
|
|
26
|
+
fromSource: z.ZodOptional<z.ZodString>;
|
|
26
27
|
}, "strip", z.ZodTypeAny, {
|
|
27
28
|
confirm: boolean;
|
|
28
29
|
dryRun: boolean;
|
|
@@ -36,6 +37,7 @@ export declare const forgetSchema: z.ZodObject<{
|
|
|
36
37
|
query?: string | undefined;
|
|
37
38
|
olderThan?: number | undefined;
|
|
38
39
|
belowSalience?: number | undefined;
|
|
40
|
+
fromSource?: string | undefined;
|
|
39
41
|
}, {
|
|
40
42
|
source?: {
|
|
41
43
|
type: "user" | "cli" | "hook" | "email" | "web" | "agent" | "file" | "api" | "tool_response";
|
|
@@ -49,6 +51,7 @@ export declare const forgetSchema: z.ZodObject<{
|
|
|
49
51
|
olderThan?: number | undefined;
|
|
50
52
|
belowSalience?: number | undefined;
|
|
51
53
|
dryRun?: boolean | undefined;
|
|
54
|
+
fromSource?: string | undefined;
|
|
52
55
|
}>;
|
|
53
56
|
export type ForgetInput = z.infer<typeof forgetSchema>;
|
|
54
57
|
/**
|
package/dist/tools/forget.js
CHANGED
|
@@ -8,6 +8,13 @@ import { deleteMemory, searchMemories, getMemoryById } from '../memory/store.js'
|
|
|
8
8
|
import { getDatabase, withTransaction } from '../database/init.js';
|
|
9
9
|
import { MemoryNotFoundError, BulkDeleteSafetyError, formatErrorForMcp, } from '../errors.js';
|
|
10
10
|
import { resolveProject } from '../context/project-context.js';
|
|
11
|
+
import { isRevokeBySourceEnabled } from '../cloud/config.js';
|
|
12
|
+
/**
|
|
13
|
+
* Upper bound on rows a single revoke-by-source call may delete. Caps the blast
|
|
14
|
+
* radius of the mass-delete primitive — a larger match must be narrowed (by
|
|
15
|
+
* project/category/etc.) or paged.
|
|
16
|
+
*/
|
|
17
|
+
const MAX_REVOKE_ROWS = 500;
|
|
11
18
|
// Input schema for the forget tool
|
|
12
19
|
export const forgetSchema = z.object({
|
|
13
20
|
id: z.number().optional().describe('Specific memory ID to delete'),
|
|
@@ -28,6 +35,8 @@ export const forgetSchema = z.object({
|
|
|
28
35
|
type: z.enum(['user', 'cli', 'hook', 'email', 'web', 'agent', 'file', 'api', 'tool_response']),
|
|
29
36
|
identifier: z.string(),
|
|
30
37
|
}).optional().describe('Caller identity for access control'),
|
|
38
|
+
fromSource: z.string().optional()
|
|
39
|
+
.describe('Revoke-by-source: delete all memories written by this source. Exact "type:identifier", or a "type:*" / "type:" prefix to revoke a whole source type. Authorised by the trust-hierarchy revoke ACL (you must own the source or outrank it). Distinct from `source` (the caller).'),
|
|
31
40
|
});
|
|
32
41
|
/**
|
|
33
42
|
* Execute the forget tool
|
|
@@ -35,6 +44,15 @@ export const forgetSchema = z.object({
|
|
|
35
44
|
export async function executeForget(input) {
|
|
36
45
|
try {
|
|
37
46
|
const db = getDatabase();
|
|
47
|
+
// Revoke-by-source gate: a destructive mass-delete primitive that a hijacked
|
|
48
|
+
// agent must not be able to invoke. OFF by default; only an out-of-band human
|
|
49
|
+
// action (`shieldcortex config --allow-revoke-by-source`) enables it.
|
|
50
|
+
if (input.fromSource !== undefined && !isRevokeBySourceEnabled()) {
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
error: 'revoke-by-source is disabled. Enable it deliberately with `shieldcortex config --allow-revoke-by-source` (an out-of-band action), then re-run.',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
38
56
|
// Resolve project (auto-detect if not provided)
|
|
39
57
|
const resolvedProject = resolveProject(input.project);
|
|
40
58
|
const source = input.source;
|
|
@@ -101,6 +119,28 @@ export async function executeForget(input) {
|
|
|
101
119
|
conditions.push('salience < ?');
|
|
102
120
|
params.push(input.belowSalience);
|
|
103
121
|
}
|
|
122
|
+
// Revoke-by-source: target every memory written by a given source. Exact
|
|
123
|
+
// "type:identifier", or a "type:*" / "type:" prefix for a whole source type.
|
|
124
|
+
// Per-row authorisation is the trust-hierarchy revoke ACL (in deleteMemory
|
|
125
|
+
// via mode:'revoke') — this clause only SELECTS the candidates. Project scope
|
|
126
|
+
// still applies; pass project:"*" to revoke a source across all projects.
|
|
127
|
+
if (input.fromSource !== undefined) {
|
|
128
|
+
const fs = input.fromSource.trim();
|
|
129
|
+
if (!fs || fs === '*' || fs === ':' || fs === ':*') {
|
|
130
|
+
return {
|
|
131
|
+
success: false,
|
|
132
|
+
error: 'fromSource must name a source (e.g. "agent:agent-spawned" or "agent:*"), not a blanket wildcard.',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
if (fs.endsWith(':*') || fs.endsWith(':')) {
|
|
136
|
+
conditions.push('source LIKE ?');
|
|
137
|
+
params.push(`${fs.replace(/:\*?$/, '')}:%`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
conditions.push('source = ?');
|
|
141
|
+
params.push(fs);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
104
144
|
if (conditions.length === 0) {
|
|
105
145
|
return {
|
|
106
146
|
success: false,
|
|
@@ -113,6 +153,15 @@ export async function executeForget(input) {
|
|
|
113
153
|
if (affected.length === 0) {
|
|
114
154
|
return { success: true, deleted: 0, memories: [] };
|
|
115
155
|
}
|
|
156
|
+
// Blast-radius cap on revoke-by-source: refuse a single call that would
|
|
157
|
+
// delete more than MAX_REVOKE_ROWS — narrow it (by project/category/etc.).
|
|
158
|
+
if (input.fromSource !== undefined && affected.length > MAX_REVOKE_ROWS) {
|
|
159
|
+
return {
|
|
160
|
+
success: false,
|
|
161
|
+
wouldDelete: affected.length,
|
|
162
|
+
error: `revoke-by-source matched ${affected.length} memories (cap ${MAX_REVOKE_ROWS}). Narrow the scope (project/category/query) and re-run.`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
116
165
|
// Dry run - just show what would be deleted
|
|
117
166
|
if (input.dryRun) {
|
|
118
167
|
return {
|
|
@@ -138,10 +187,13 @@ export async function executeForget(input) {
|
|
|
138
187
|
// delete, and the dashboard `memory_deleted` event. A low-trust / non-owner
|
|
139
188
|
// caller therefore can't mass-delete protected memories. better-sqlite3 is
|
|
140
189
|
// synchronous, so the per-row loop stays inside one transaction atomically.
|
|
190
|
+
// revoke-by-source uses the trust-hierarchy revoke ACL (own OR outrank);
|
|
191
|
+
// every other bulk forget stays own-only.
|
|
192
|
+
const deleteMode = input.fromSource !== undefined ? 'revoke' : 'delete';
|
|
141
193
|
const deletedMemories = [];
|
|
142
194
|
withTransaction(() => {
|
|
143
195
|
for (const memory of affected) {
|
|
144
|
-
if (deleteMemory(memory.id, source)) {
|
|
196
|
+
if (deleteMemory(memory.id, source, { mode: deleteMode })) {
|
|
145
197
|
deletedMemories.push(memory);
|
|
146
198
|
}
|
|
147
199
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shieldcortex",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.40.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
|