shieldcortex 4.15.0 → 4.17.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/README.md +4 -0
- 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/prerender-manifest.json +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk/admin.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk/cloud.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory/graph.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory/recall.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection/audit.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection/intercepts.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection/iron-dome.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection/policies.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection/quarantine.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain/xray.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk/supply-chain.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/pages/404.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/pages/500.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.json +1 -1
- package/dist/api/routes/sessions.d.ts +19 -0
- package/dist/api/routes/sessions.js +153 -0
- package/dist/api/visualization-server.js +2 -0
- package/dist/cli/import-jsonl.d.ts +12 -0
- package/dist/cli/import-jsonl.js +88 -0
- package/dist/cli/migrate-legacy.d.ts +18 -0
- package/dist/cli/migrate-legacy.js +96 -0
- package/dist/database/init.js +65 -0
- package/dist/database/schema.sql +32 -0
- package/dist/database/seed-firewall-rules.d.ts +21 -0
- package/dist/database/seed-firewall-rules.js +105 -0
- package/dist/defence/custom-rules/store.d.ts +4 -1
- package/dist/defence/custom-rules/store.js +7 -3
- package/dist/defence/firewall/instruction-detector.js +15 -0
- package/dist/defence/pipeline.js +19 -13
- package/dist/defence/types.d.ts +1 -1
- package/dist/index.js +8 -0
- package/dist/sessions/capture.d.ts +45 -0
- package/dist/sessions/capture.js +59 -0
- package/dist/sessions/import-jsonl.d.ts +85 -0
- package/dist/sessions/import-jsonl.js +193 -0
- package/dist/sessions/timeline.d.ts +28 -0
- package/dist/sessions/timeline.js +52 -0
- package/hooks/openclaw/cortex-memory/HOOK.md +37 -0
- package/package.json +1 -1
- package/plugins/openclaw/dist/openclaw.plugin.json +1 -1
- package/scripts/lib/extract-memorable-segments.mjs +555 -0
- package/scripts/lib/save-memory.mjs +198 -13
- package/scripts/lib/session-capture.mjs +102 -0
- package/scripts/pre-compact-hook.mjs +38 -375
- package/scripts/prompt-recall-hook.mjs +30 -4
- package/scripts/session-end-hook.mjs +35 -307
- package/scripts/stop-hook.mjs +28 -159
- /package/dashboard/.next/standalone/dashboard/.next/static/{10a_MRwbHFUuDdfr86RUu → 9C0MR5ahRDqnfBA64wKCY}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{10a_MRwbHFUuDdfr86RUu → 9C0MR5ahRDqnfBA64wKCY}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{10a_MRwbHFUuDdfr86RUu → 9C0MR5ahRDqnfBA64wKCY}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSONL transcript importer for Claude Code session files.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code writes session transcripts to `~/.claude/projects/<slug>/
|
|
5
|
+
* <session-uuid>.jsonl`. Each line is a JSON object. Conversation lines
|
|
6
|
+
* have shape `{type, sessionId, timestamp, message: {role, content}}`
|
|
7
|
+
* where `content` is an Anthropic SDK content-block array
|
|
8
|
+
* (`text|thinking|tool_use|tool_result`).
|
|
9
|
+
*
|
|
10
|
+
* Mapping to `session_events.kind`:
|
|
11
|
+
*
|
|
12
|
+
* user.text → prompt
|
|
13
|
+
* assistant.text → response
|
|
14
|
+
* assistant.tool_use → tool_call
|
|
15
|
+
* user.tool_result → tool_result
|
|
16
|
+
* thinking → (skipped — not user-replayable in v1)
|
|
17
|
+
*
|
|
18
|
+
* Non-conversation lines (`ai-title`, `attachment`, `system`,
|
|
19
|
+
* `queue-operation`, etc.) are skipped. Idempotent on re-import: each
|
|
20
|
+
* row carries a sha256 `content_hash` of `kind|payload`, and the
|
|
21
|
+
* `idx_session_events_dedupe` UNIQUE index drops collisions silently
|
|
22
|
+
* via `INSERT OR IGNORE`.
|
|
23
|
+
*
|
|
24
|
+
* Lossy by design — agentmemory documents the same scope:
|
|
25
|
+
* - Anthropic-internal cache markers, partial-message frames, and
|
|
26
|
+
* non-string tool_result encodings beyond plain text are not
|
|
27
|
+
* preserved.
|
|
28
|
+
* - Things we WILL preserve: prompts, assistant text, tool name +
|
|
29
|
+
* args + result, and timestamps.
|
|
30
|
+
*/
|
|
31
|
+
import { readFileSync, existsSync } from 'fs';
|
|
32
|
+
import { createHash } from 'crypto';
|
|
33
|
+
import { getDatabase } from '../database/init.js';
|
|
34
|
+
/**
|
|
35
|
+
* Pure mapper: one transcript line → 0..N `SessionEventInput`s.
|
|
36
|
+
*
|
|
37
|
+
* Exported so unit tests can exercise the mapping in isolation without
|
|
38
|
+
* standing up a database. Returns `[]` for any line that doesn't yield
|
|
39
|
+
* replayable events (thinking blocks, ai-title, missing fields, etc.) —
|
|
40
|
+
* the caller treats an empty array as "skipped".
|
|
41
|
+
*/
|
|
42
|
+
export function parseTranscriptLine(line) {
|
|
43
|
+
if (!line || typeof line !== 'object')
|
|
44
|
+
return [];
|
|
45
|
+
const l = line;
|
|
46
|
+
// Only conversation lines yield events.
|
|
47
|
+
if (l.type !== 'user' && l.type !== 'assistant')
|
|
48
|
+
return [];
|
|
49
|
+
if (typeof l.sessionId !== 'string' || l.sessionId.length === 0)
|
|
50
|
+
return [];
|
|
51
|
+
if (typeof l.timestamp !== 'string' || l.timestamp.length === 0)
|
|
52
|
+
return [];
|
|
53
|
+
const content = l.message?.content;
|
|
54
|
+
if (!Array.isArray(content) || content.length === 0)
|
|
55
|
+
return [];
|
|
56
|
+
const events = [];
|
|
57
|
+
for (const block of content) {
|
|
58
|
+
const event = blockToEvent(block, l);
|
|
59
|
+
if (event)
|
|
60
|
+
events.push(event);
|
|
61
|
+
}
|
|
62
|
+
return events;
|
|
63
|
+
}
|
|
64
|
+
function blockToEvent(block, line) {
|
|
65
|
+
const session_id = line.sessionId;
|
|
66
|
+
const ts = line.timestamp;
|
|
67
|
+
if (block.type === 'thinking')
|
|
68
|
+
return null;
|
|
69
|
+
if (block.type === 'text' && line.type === 'user') {
|
|
70
|
+
const text = typeof block.text === 'string' ? block.text : '';
|
|
71
|
+
if (!text)
|
|
72
|
+
return null;
|
|
73
|
+
return { session_id, ts, kind: 'prompt', payload: { text } };
|
|
74
|
+
}
|
|
75
|
+
if (block.type === 'text' && line.type === 'assistant') {
|
|
76
|
+
const text = typeof block.text === 'string' ? block.text : '';
|
|
77
|
+
if (!text)
|
|
78
|
+
return null;
|
|
79
|
+
return {
|
|
80
|
+
session_id,
|
|
81
|
+
ts,
|
|
82
|
+
kind: 'response',
|
|
83
|
+
payload: { text },
|
|
84
|
+
actor: 'assistant',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
if (block.type === 'tool_use' && line.type === 'assistant') {
|
|
88
|
+
const toolBlock = block;
|
|
89
|
+
return {
|
|
90
|
+
session_id,
|
|
91
|
+
ts,
|
|
92
|
+
kind: 'tool_call',
|
|
93
|
+
payload: {
|
|
94
|
+
tool_use_id: toolBlock.id ?? null,
|
|
95
|
+
name: toolBlock.name ?? null,
|
|
96
|
+
input: toolBlock.input ?? null,
|
|
97
|
+
},
|
|
98
|
+
actor: 'assistant',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (block.type === 'tool_result' && line.type === 'user') {
|
|
102
|
+
const tr = block;
|
|
103
|
+
return {
|
|
104
|
+
session_id,
|
|
105
|
+
ts,
|
|
106
|
+
kind: 'tool_result',
|
|
107
|
+
payload: {
|
|
108
|
+
tool_use_id: tr.tool_use_id ?? null,
|
|
109
|
+
content: tr.content ?? null,
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
/** SHA-256 of `kind|payload-as-canonical-json`. 64-char hex string. */
|
|
116
|
+
function hashEvent(kind, payload) {
|
|
117
|
+
const canonical = typeof payload === 'string' ? payload : JSON.stringify(payload ?? null);
|
|
118
|
+
return createHash('sha256').update(`${kind}|${canonical}`).digest('hex');
|
|
119
|
+
}
|
|
120
|
+
const INSERT_OR_IGNORE_SQL = `
|
|
121
|
+
INSERT OR IGNORE INTO session_events
|
|
122
|
+
(session_id, project, ts, kind, actor, payload, duration_ms, audit_id, content_hash)
|
|
123
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
124
|
+
`;
|
|
125
|
+
/**
|
|
126
|
+
* Import one JSONL file. Wraps the whole import in a single transaction
|
|
127
|
+
* so a mid-file error rolls back cleanly — better-sqlite3's transaction
|
|
128
|
+
* helper restores DB state if the callback throws. Malformed lines do
|
|
129
|
+
* NOT throw — they're counted and skipped so a single bad row never
|
|
130
|
+
* blocks the rest of the file.
|
|
131
|
+
*/
|
|
132
|
+
export function importJsonlTranscript(path) {
|
|
133
|
+
if (!existsSync(path)) {
|
|
134
|
+
throw new Error(`JSONL transcript not found: ${path}`);
|
|
135
|
+
}
|
|
136
|
+
const raw = readFileSync(path, 'utf-8');
|
|
137
|
+
const lines = raw.split(/\r?\n/);
|
|
138
|
+
const rows = [];
|
|
139
|
+
let sessionId = null;
|
|
140
|
+
let skipped = 0;
|
|
141
|
+
let malformed = 0;
|
|
142
|
+
for (const rawLine of lines) {
|
|
143
|
+
const trimmed = rawLine.trim();
|
|
144
|
+
if (trimmed.length === 0)
|
|
145
|
+
continue; // blank lines aren't skipped — they're just whitespace
|
|
146
|
+
let parsed;
|
|
147
|
+
try {
|
|
148
|
+
parsed = JSON.parse(trimmed);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
malformed++;
|
|
152
|
+
skipped++;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const events = parseTranscriptLine(parsed);
|
|
156
|
+
if (events.length === 0) {
|
|
157
|
+
skipped++;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (sessionId === null && events[0]?.session_id) {
|
|
161
|
+
sessionId = events[0].session_id;
|
|
162
|
+
}
|
|
163
|
+
for (const event of events) {
|
|
164
|
+
rows.push({
|
|
165
|
+
...event,
|
|
166
|
+
content_hash: hashEvent(event.kind, event.payload),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (rows.length === 0) {
|
|
171
|
+
return { sessionId, eventCount: 0, skipped, malformed };
|
|
172
|
+
}
|
|
173
|
+
const db = getDatabase();
|
|
174
|
+
const stmt = db.prepare(INSERT_OR_IGNORE_SQL);
|
|
175
|
+
const before = db.prepare('SELECT COUNT(*) AS c FROM session_events').get().c;
|
|
176
|
+
const tx = db.transaction((batch) => {
|
|
177
|
+
for (const row of batch) {
|
|
178
|
+
stmt.run(row.session_id, row.project ?? null, row.ts, row.kind, row.actor ?? null, typeof row.payload === 'string' ? row.payload : JSON.stringify(row.payload ?? null), row.duration_ms ?? null, row.audit_id ?? null, row.content_hash);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
tx(rows);
|
|
182
|
+
const after = db.prepare('SELECT COUNT(*) AS c FROM session_events').get().c;
|
|
183
|
+
const inserted = after - before;
|
|
184
|
+
// `eventCount` reflects the total events parsed from this file regardless
|
|
185
|
+
// of whether the dedupe index dropped them. Caller can compare to
|
|
186
|
+
// `inserted` (via row count diff) to see how many were duplicates.
|
|
187
|
+
return {
|
|
188
|
+
sessionId,
|
|
189
|
+
eventCount: rows.length,
|
|
190
|
+
skipped: skipped + (rows.length - inserted),
|
|
191
|
+
malformed,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session capture — read side.
|
|
3
|
+
*
|
|
4
|
+
* `getTimeline(sessionId)` returns every event for a session, sorted
|
|
5
|
+
* by `ts` ascending, with payload JSON.parse'd back into a JS value
|
|
6
|
+
* (or surfaced as a raw string when the payload was deliberately
|
|
7
|
+
* stored as plain text). Powers the dashboard replay scrubber.
|
|
8
|
+
*
|
|
9
|
+
* Kept deliberately minimal — pagination, filtering by kind, and
|
|
10
|
+
* cross-session timelines belong on the API route (`./api/routes/
|
|
11
|
+
* sessions.ts`) above, not in this reader.
|
|
12
|
+
*/
|
|
13
|
+
import type { SessionEventKind } from './capture.js';
|
|
14
|
+
export interface SessionEventRow {
|
|
15
|
+
id: number;
|
|
16
|
+
session_id: string;
|
|
17
|
+
project: string | null;
|
|
18
|
+
ts: string;
|
|
19
|
+
kind: SessionEventKind;
|
|
20
|
+
actor: string | null;
|
|
21
|
+
/** Parsed JSON (object/array/primitive) or raw string fall-through. */
|
|
22
|
+
payload: unknown;
|
|
23
|
+
duration_ms: number | null;
|
|
24
|
+
audit_id: number | null;
|
|
25
|
+
created_at: string;
|
|
26
|
+
}
|
|
27
|
+
/** All events for a session, in `ts` ascending order. */
|
|
28
|
+
export declare function getTimeline(sessionId: string): SessionEventRow[];
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session capture — read side.
|
|
3
|
+
*
|
|
4
|
+
* `getTimeline(sessionId)` returns every event for a session, sorted
|
|
5
|
+
* by `ts` ascending, with payload JSON.parse'd back into a JS value
|
|
6
|
+
* (or surfaced as a raw string when the payload was deliberately
|
|
7
|
+
* stored as plain text). Powers the dashboard replay scrubber.
|
|
8
|
+
*
|
|
9
|
+
* Kept deliberately minimal — pagination, filtering by kind, and
|
|
10
|
+
* cross-session timelines belong on the API route (`./api/routes/
|
|
11
|
+
* sessions.ts`) above, not in this reader.
|
|
12
|
+
*/
|
|
13
|
+
import { getDatabase } from '../database/init.js';
|
|
14
|
+
/**
|
|
15
|
+
* Reverse of `capture.serialisePayload`: try JSON.parse, fall back to
|
|
16
|
+
* the raw string if the payload was stored as plain text. We don't
|
|
17
|
+
* throw on un-parseable — the importer may legitimately ingest non-JSON
|
|
18
|
+
* tool output, and a replay viewer that crashes on bad data is useless.
|
|
19
|
+
*/
|
|
20
|
+
function deserialisePayload(text) {
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(text);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return text;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function hydrate(row) {
|
|
29
|
+
return {
|
|
30
|
+
id: row.id,
|
|
31
|
+
session_id: row.session_id,
|
|
32
|
+
project: row.project,
|
|
33
|
+
ts: row.ts,
|
|
34
|
+
kind: row.kind,
|
|
35
|
+
actor: row.actor,
|
|
36
|
+
payload: deserialisePayload(row.payload),
|
|
37
|
+
duration_ms: row.duration_ms,
|
|
38
|
+
audit_id: row.audit_id,
|
|
39
|
+
created_at: row.created_at,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** All events for a session, in `ts` ascending order. */
|
|
43
|
+
export function getTimeline(sessionId) {
|
|
44
|
+
const db = getDatabase();
|
|
45
|
+
const rows = db
|
|
46
|
+
.prepare(`SELECT id, session_id, project, ts, kind, actor, payload, duration_ms, audit_id, created_at
|
|
47
|
+
FROM session_events
|
|
48
|
+
WHERE session_id = ?
|
|
49
|
+
ORDER BY ts ASC, id ASC`)
|
|
50
|
+
.all(sessionId);
|
|
51
|
+
return rows.map(hydrate);
|
|
52
|
+
}
|
|
@@ -64,6 +64,43 @@ Say any of these phrases to trigger an instant save to Cortex memory:
|
|
|
64
64
|
|
|
65
65
|
Content after the trigger phrase is extracted and saved as the memory content.
|
|
66
66
|
|
|
67
|
+
## Defence Audit Guarantees
|
|
68
|
+
|
|
69
|
+
Every byte that lands in `memories` from the auto-extract path passes the
|
|
70
|
+
6-layer defence pipeline first. The hook write path is no longer the
|
|
71
|
+
bypass it once was:
|
|
72
|
+
|
|
73
|
+
- **ALLOW** → row inserted into `memories`; a corresponding row appears in
|
|
74
|
+
`defence_audit` with `source_type = 'hook'` and the hook's identifier
|
|
75
|
+
(`session-end-hook` / `pre-compact-hook` / `stop-hook`).
|
|
76
|
+
- **QUARANTINE** → row inserted into `quarantine` (not `memories`), linked
|
|
77
|
+
to the audit row via `audit_id`. Visible in the dashboard for review.
|
|
78
|
+
- **BLOCK** → dropped. The audit row written by the pipeline carries the
|
|
79
|
+
block reason; nothing reaches `memories`.
|
|
80
|
+
- **Pipeline error** → dropped + a synthetic audit row with reason
|
|
81
|
+
`pipeline_error: <msg>`. Never silently lose data.
|
|
82
|
+
|
|
83
|
+
Built-in firewall rules covering instruction injection, hidden
|
|
84
|
+
instruction, imperative tool-call directives ("call X tool now"), command
|
|
85
|
+
injection, and credential leaks (AWS / JWT / private keys) are seeded
|
|
86
|
+
into `firewall_rules` on first run with `built_in = 1`. They are
|
|
87
|
+
evaluated on every tier (the Pro `custom_firewall_rules` gate applies
|
|
88
|
+
only to user-added rules) and excluded from the user-facing 25-rule cap.
|
|
89
|
+
|
|
90
|
+
The chunker also rejects malformed candidates *before* they reach the
|
|
91
|
+
write path: imperative tool-calls, bare-imperative starts ("commit
|
|
92
|
+
secrets" with the negation dropped), email-body bleed, and path-label
|
|
93
|
+
fragments. Auto-extracted memories are now capped at salience 0.6
|
|
94
|
+
(reserved 1.0 for LLM-rated future paths).
|
|
95
|
+
|
|
96
|
+
To audit an existing database for malformed rows accumulated before this
|
|
97
|
+
fix:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
shieldcortex memories purge --malformed --dry-run # preview
|
|
101
|
+
shieldcortex memories purge --malformed --execute # delete (writes a backup first)
|
|
102
|
+
```
|
|
103
|
+
|
|
67
104
|
## Auto-Memory
|
|
68
105
|
|
|
69
106
|
Auto-memory extraction is enabled by default. ShieldCortex complements your existing memory system by capturing decisions, fixes, and learnings with built-in deduplication to avoid noise.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shieldcortex",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.17.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",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "shieldcortex-realtime",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.17.0",
|
|
4
4
|
"name": "ShieldCortex Real-time Scanner",
|
|
5
5
|
"description": "Real-time defence scanning on LLM input, memory extraction on LLM output, and active tool call interception with approval gating.",
|
|
6
6
|
"kind": null,
|