shieldcortex 4.12.11 → 4.12.12
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/prerender-manifest.json +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/admin/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/admin/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/cloud/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/cloud/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/capture/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/capture/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/graph/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/graph/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/recall/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/recall/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/timeline/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/timeline/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/overview/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/overview/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/audit/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/audit/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/intercepts/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/intercepts/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/iron-dome/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/iron-dome/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/policies/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/policies/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/quarantine/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/quarantine/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/xray/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/xray/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/xray/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/xray/page_client-reference-manifest.js +1 -1
- 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/page_client-reference-manifest.js +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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.rsc +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.rsc +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.meta +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.rsc +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/!KGRhc2hib2FyZCk/memory/capture/__PAGE__.segment.rsc +2 -2
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_full.segment.rsc +7 -7
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.rsc +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.rsc +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.rsc +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.rsc +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.rsc +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/!KGRhc2hib2FyZCk/memory/__PAGE__.segment.rsc +2 -2
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_full.segment.rsc +7 -7
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.rsc +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/!KGRhc2hib2FyZCk/overview/__PAGE__.segment.rsc +2 -2
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_full.segment.rsc +7 -7
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/page_client-reference-manifest.js +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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.rsc +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_tree.segment.rsc +2 -2
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.rsc +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.rsc +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.rsc +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/!KGRhc2hib2FyZCk/protection/__PAGE__.segment.rsc +2 -2
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_full.segment.rsc +7 -7
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.rsc +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +2 -2
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_full.segment.rsc +7 -7
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- 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 +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.rsc +6 -6
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_full.segment.rsc +6 -6
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.rsc +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/!KGRhc2hib2FyZCk/xray/__PAGE__.segment.rsc +2 -2
- 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 +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_full.segment.rsc +7 -7
- 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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_tree.segment.rsc +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__c2b92077._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_01f6ceb0._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_11878109._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_1bfd1423._.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_35a9932a._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_35c9f22e._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_37f17371._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_836b4a04._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_9770c429._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_9dd626ed._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_c219bf07._.js +8 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_e94d2da2._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/{dashboard_d5fc66fc._.js → dashboard_fefd3b85._.js} +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_protection_ProtectionOverview_tsx_54554a97._.js +3 -1
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_xray_XRayOverview_tsx_ceba698e._.js +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/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/dashboard/.next/standalone/dashboard/.next/static/chunks/079a5be036130e37.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/1770a8ce7abb2437.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/1a074f8ddc7cd385.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/24da99d1341bd573.css +3 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/2aa8afb655c1c2e5.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/385ec610bad1acc5.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/3d53807a9a943ce7.js +15 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/4f57582c2d186438.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/7fca141efba9d353.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/8593e1796c9d043d.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/c288964c4c00982a.js +3 -0
- package/dist/api/routes/admin.js +295 -8
- package/dist/api/visualization-server.js +5 -0
- package/dist/audit/index.d.ts +2 -1
- package/dist/audit/index.js +1 -1
- package/dist/audit/memory-scanner.d.ts +66 -1
- package/dist/audit/memory-scanner.js +441 -28
- package/dist/cli/review-copilot.d.ts +1 -0
- package/dist/cli/review-copilot.js +197 -0
- package/dist/cloud/cli.js +3 -1
- package/dist/cloud/config.d.ts +17 -0
- package/dist/cloud/config.js +110 -25
- package/dist/database/init.js +37 -0
- package/dist/database/schema.sql +20 -0
- package/dist/defence/explainer/index.d.ts +5 -0
- package/dist/defence/explainer/index.js +28 -0
- package/dist/defence/explainer/prompt.d.ts +2 -0
- package/dist/defence/explainer/prompt.js +49 -0
- package/dist/defence/explainer/schema.d.ts +3 -0
- package/dist/defence/explainer/schema.js +204 -0
- package/dist/defence/explainer/types.d.ts +26 -0
- package/dist/defence/explainer/types.js +1 -0
- package/dist/defence/judge/annotate.d.ts +8 -0
- package/dist/defence/judge/annotate.js +107 -0
- package/dist/defence/judge/annotations-store.d.ts +4 -0
- package/dist/defence/judge/annotations-store.js +67 -0
- package/dist/defence/judge/decision.d.ts +10 -0
- package/dist/defence/judge/decision.js +165 -0
- package/dist/defence/judge/fallback.d.ts +4 -0
- package/dist/defence/judge/fallback.js +19 -0
- package/dist/defence/judge/grouping.d.ts +4 -0
- package/dist/defence/judge/grouping.js +52 -0
- package/dist/defence/judge/index.d.ts +9 -0
- package/dist/defence/judge/index.js +34 -0
- package/dist/defence/judge/prompt.d.ts +3 -0
- package/dist/defence/judge/prompt.js +49 -0
- package/dist/defence/judge/runner.d.ts +3 -0
- package/dist/defence/judge/runner.js +160 -0
- package/dist/defence/judge/schema.d.ts +15 -0
- package/dist/defence/judge/schema.js +118 -0
- package/dist/defence/judge/telemetry.d.ts +28 -0
- package/dist/defence/judge/telemetry.js +43 -0
- package/dist/defence/judge/types.d.ts +67 -0
- package/dist/defence/judge/types.js +1 -0
- package/dist/defence/judge/worker.d.ts +1 -0
- package/dist/defence/judge/worker.js +106 -0
- package/dist/defence/quarantine/review.js +16 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.js +10 -1
- package/dist/lib.d.ts +9 -1
- package/dist/lib.js +7 -1
- package/dist/license/gate.d.ts +1 -1
- package/dist/license/gate.js +6 -0
- package/package.json +4 -1
- package/plugins/openclaw/dist/openclaw.plugin.json +1 -1
- package/scripts/ensure-bin-executable.mjs +17 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__4a575c8d._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_0734b815._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_21edaee1._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_354daf70._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_8481163e._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_a3053031._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_a38f5767._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_f6813b70._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/1482af194911d5e7.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/2c2a280eeaed7ed2.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/2f92786ac35bbdb9.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/90f35860c69b2f0b.js +0 -9
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/915d5a8cf2d0807e.css +0 -3
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/927fe0465516b94a.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/99a618b860658c5c.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/b31e08a78b0cb6fb.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/c2ccb1c0ed7b2af2.js +0 -1
- /package/dashboard/.next/standalone/dashboard/.next/static/{Azzglh6qPGDH5Kl8B76tx → 5HSptYF0HaABlloA3Hir3}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{Azzglh6qPGDH5Kl8B76tx → 5HSptYF0HaABlloA3Hir3}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{Azzglh6qPGDH5Kl8B76tx → 5HSptYF0HaABlloA3Hir3}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { extractJsonObject } from '../judge/schema.js';
|
|
3
|
+
function boundedString(max) {
|
|
4
|
+
return z.string().transform((value) => value.slice(0, max));
|
|
5
|
+
}
|
|
6
|
+
const evidenceSchema = z.object({
|
|
7
|
+
snippet: boundedString(220),
|
|
8
|
+
reason: boundedString(180),
|
|
9
|
+
});
|
|
10
|
+
const explanationSchema = z.object({
|
|
11
|
+
summary: boundedString(240),
|
|
12
|
+
whyItMatters: boundedString(500),
|
|
13
|
+
evidence: z.array(evidenceSchema).max(4).default([]),
|
|
14
|
+
nextSteps: z.array(boundedString(180)).max(5).default([]),
|
|
15
|
+
riskSignals: z.array(boundedString(80)).max(8).default([]),
|
|
16
|
+
confidence: z.number().min(0).max(1).default(0.5),
|
|
17
|
+
});
|
|
18
|
+
const PROMPT_INJECTION_PATTERNS = [
|
|
19
|
+
/ignore\s+(previous|all|the above)\s+instructions?/i,
|
|
20
|
+
/override\s+(system|developer|safety)\s+instructions?/i,
|
|
21
|
+
/reveal\s+(the\s+)?(system prompt|developer message|api keys?|secrets?|tokens?)/i,
|
|
22
|
+
/exfiltrat(?:e|ion)/i,
|
|
23
|
+
/act\s+as\s+(?:a\s+)?system/i,
|
|
24
|
+
];
|
|
25
|
+
const CREDENTIAL_PATTERNS = [
|
|
26
|
+
/\b[A-Z0-9_]*(API|TOKEN|SECRET|KEY)[A-Z0-9_]*\b/,
|
|
27
|
+
/\bgh\s+secret\s+set\b/i,
|
|
28
|
+
/\bfly\s+tokens?\s+create\b/i,
|
|
29
|
+
/api[_\s-]?keys?/i,
|
|
30
|
+
/bearer\s+[a-z0-9._-]{12,}/i,
|
|
31
|
+
/password\s*[:=]/i,
|
|
32
|
+
/secret\s*[:=]/i,
|
|
33
|
+
/token\s*[:=]/i,
|
|
34
|
+
/BEGIN\s+[A-Z ]*PRIVATE KEY/i,
|
|
35
|
+
];
|
|
36
|
+
const UNSAFE_MODEL_OUTPUT_PATTERN = /\b(prompt_user_for_api_key|provide\s+(an?\s+)?api\s+key|enter\s+(an?\s+)?api\s+key|share\s+(the\s+)?(secret|token|password|api\s+key)|reveal\s+(the\s+)?(secret|token|password|api\s+key)|mark\s+(it|this)\s+safe|approve\s+(it|this))\b/i;
|
|
37
|
+
function subjectSignals(subject) {
|
|
38
|
+
const signals = subject.signals?.map((signal) => signal.trim()).filter(Boolean) ?? [];
|
|
39
|
+
if (PROMPT_INJECTION_PATTERNS.some((pattern) => pattern.test(subject.content))) {
|
|
40
|
+
signals.push('prompt_injection');
|
|
41
|
+
}
|
|
42
|
+
if (CREDENTIAL_PATTERNS.some((pattern) => pattern.test(subject.content))) {
|
|
43
|
+
signals.push('credential_reference');
|
|
44
|
+
}
|
|
45
|
+
return [...new Set(signals)].slice(0, 8);
|
|
46
|
+
}
|
|
47
|
+
function hasSignal(subject, values) {
|
|
48
|
+
const haystack = [
|
|
49
|
+
subject.kind,
|
|
50
|
+
subject.title,
|
|
51
|
+
...(subject.signals ?? []),
|
|
52
|
+
].join(' ').toLowerCase();
|
|
53
|
+
return values.some((value) => haystack.includes(value));
|
|
54
|
+
}
|
|
55
|
+
function firstSnippet(content, patterns) {
|
|
56
|
+
for (const pattern of patterns) {
|
|
57
|
+
const match = pattern.exec(content);
|
|
58
|
+
if (!match || match.index === undefined)
|
|
59
|
+
continue;
|
|
60
|
+
const start = Math.max(0, match.index - 45);
|
|
61
|
+
const end = Math.min(content.length, match.index + match[0].length + 90);
|
|
62
|
+
return content.slice(start, end).trim();
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
function evidenceFromContent(subject) {
|
|
67
|
+
const content = subject.content ?? '';
|
|
68
|
+
const evidence = [];
|
|
69
|
+
const injectionSnippet = firstSnippet(content, PROMPT_INJECTION_PATTERNS);
|
|
70
|
+
if (injectionSnippet) {
|
|
71
|
+
evidence.push({ snippet: injectionSnippet, reason: 'Prompt-injection wording appears in the source content.' });
|
|
72
|
+
}
|
|
73
|
+
const credentialSnippet = firstSnippet(content, CREDENTIAL_PATTERNS);
|
|
74
|
+
if (credentialSnippet && !evidence.some((entry) => entry.snippet === credentialSnippet)) {
|
|
75
|
+
evidence.push({ snippet: credentialSnippet, reason: 'Credential or secret handling language appears in the source content.' });
|
|
76
|
+
}
|
|
77
|
+
const evidenceLine = content.split('\n').find((line) => line.trim().toLowerCase().startsWith('evidence:'));
|
|
78
|
+
if (evidenceLine && !evidence.some((entry) => entry.snippet === evidenceLine.trim())) {
|
|
79
|
+
const reason = subject.kind === 'xray_finding'
|
|
80
|
+
? 'X-Ray recorded this as the finding evidence.'
|
|
81
|
+
: subject.kind === 'memory_file'
|
|
82
|
+
? 'Memory file scan recorded this evidence.'
|
|
83
|
+
: 'ShieldCortex recorded this as evidence.';
|
|
84
|
+
evidence.push({ snippet: evidenceLine.trim(), reason });
|
|
85
|
+
}
|
|
86
|
+
return evidence.slice(0, 4);
|
|
87
|
+
}
|
|
88
|
+
function fallbackSummary(subject) {
|
|
89
|
+
if (hasSignal(subject, ['credential', 'secret', 'token', 'password']) || CREDENTIAL_PATTERNS.some((pattern) => pattern.test(subject.content))) {
|
|
90
|
+
return 'Potential credential or secret exposure needs manual review.';
|
|
91
|
+
}
|
|
92
|
+
if (hasSignal(subject, ['prompt_injection', 'injection', 'jailbreak']) || PROMPT_INJECTION_PATTERNS.some((pattern) => pattern.test(subject.content))) {
|
|
93
|
+
return 'Potential prompt-injection behaviour needs manual review.';
|
|
94
|
+
}
|
|
95
|
+
if (subject.kind === 'xray_finding') {
|
|
96
|
+
return `X-Ray finding needs review: ${subject.title.slice(0, 160)}`;
|
|
97
|
+
}
|
|
98
|
+
if (subject.kind === 'memory_file') {
|
|
99
|
+
return `Persistent memory file needs review: ${subject.title.slice(0, 150)}`;
|
|
100
|
+
}
|
|
101
|
+
return `${subject.kind.replace(/_/g, ' ')} needs manual review.`;
|
|
102
|
+
}
|
|
103
|
+
function fallbackSteps(subject) {
|
|
104
|
+
if (subject.kind === 'xray_finding') {
|
|
105
|
+
return [
|
|
106
|
+
'Inspect the file or package source referenced by the X-Ray finding.',
|
|
107
|
+
'Use the deterministic X-Ray severity and category before taking action.',
|
|
108
|
+
'Quarantine only if the source or behaviour is unexpected.',
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
if (subject.kind === 'memory') {
|
|
112
|
+
return [
|
|
113
|
+
'Review the memory source and deterministic scan result.',
|
|
114
|
+
'Check whether the content is expected for this project.',
|
|
115
|
+
'Quarantine or delete only after confirming the source is unsafe.',
|
|
116
|
+
];
|
|
117
|
+
}
|
|
118
|
+
if (subject.kind === 'memory_file') {
|
|
119
|
+
return [
|
|
120
|
+
'Open the memory file path shown in the scan result.',
|
|
121
|
+
'Use the deterministic ShieldCortex risk, indicators, and evidence as the decision source.',
|
|
122
|
+
'Edit or remove risky persistent instructions only after confirming they are unexpected.',
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
return [
|
|
126
|
+
'Review the deterministic scan result and source evidence.',
|
|
127
|
+
'Check whether the content is expected for this project.',
|
|
128
|
+
];
|
|
129
|
+
}
|
|
130
|
+
function fallbackText(subject) {
|
|
131
|
+
const signals = subjectSignals(subject);
|
|
132
|
+
const signalText = signals.length ? signals.slice(0, 3).join(', ') : 'No specific local model signals were available';
|
|
133
|
+
return {
|
|
134
|
+
summary: fallbackSummary(subject),
|
|
135
|
+
whyItMatters: `${signalText}. Local AI explanation was unavailable, so rely on ShieldCortex deterministic scan output and inspect the source content before taking action.`,
|
|
136
|
+
evidence: evidenceFromContent(subject),
|
|
137
|
+
nextSteps: fallbackSteps(subject),
|
|
138
|
+
riskSignals: signals.slice(0, 8),
|
|
139
|
+
confidence: 0,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function operatorReason(reason) {
|
|
143
|
+
if (reason === 'model_output_rejected')
|
|
144
|
+
return 'model output was rejected by safety checks';
|
|
145
|
+
if (reason === 'model_unavailable')
|
|
146
|
+
return 'model was unavailable';
|
|
147
|
+
if (reason.includes('JSON') || reason.includes('invalid_json') || reason.includes('schema_validation')) {
|
|
148
|
+
return 'model output was not parseable';
|
|
149
|
+
}
|
|
150
|
+
return reason.slice(0, 160);
|
|
151
|
+
}
|
|
152
|
+
export function fallbackLocalAiExplanation(subject, modelId, reason) {
|
|
153
|
+
const fallback = fallbackText(subject);
|
|
154
|
+
return {
|
|
155
|
+
kind: subject.kind,
|
|
156
|
+
...fallback,
|
|
157
|
+
whyItMatters: `${fallback.whyItMatters} (${operatorReason(reason)})`,
|
|
158
|
+
modelId,
|
|
159
|
+
generatedAt: new Date().toISOString(),
|
|
160
|
+
synthetic: true,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
export function parseLocalAiExplanation(rawText, subject, modelId) {
|
|
164
|
+
if (!rawText) {
|
|
165
|
+
return fallbackLocalAiExplanation(subject, modelId, 'model_unavailable');
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
const parsed = explanationSchema.parse(extractJsonObject(rawText));
|
|
169
|
+
const content = subject.content ?? '';
|
|
170
|
+
const baseline = fallbackText(subject);
|
|
171
|
+
const modelText = [
|
|
172
|
+
parsed.summary,
|
|
173
|
+
parsed.whyItMatters,
|
|
174
|
+
...parsed.nextSteps,
|
|
175
|
+
...parsed.riskSignals,
|
|
176
|
+
].join('\n');
|
|
177
|
+
if (UNSAFE_MODEL_OUTPUT_PATTERN.test(modelText)) {
|
|
178
|
+
return fallbackLocalAiExplanation(subject, modelId, 'model_output_rejected');
|
|
179
|
+
}
|
|
180
|
+
const evidence = parsed.evidence.filter((entry) => (entry.snippet.trim().length > 0 && content.includes(entry.snippet)));
|
|
181
|
+
const nextSteps = parsed.nextSteps
|
|
182
|
+
.filter((step) => step.includes(' ') && !step.includes('_'))
|
|
183
|
+
.slice(0, 5);
|
|
184
|
+
const riskSignals = parsed.riskSignals.length > 0
|
|
185
|
+
? parsed.riskSignals
|
|
186
|
+
: subjectSignals(subject);
|
|
187
|
+
return {
|
|
188
|
+
kind: subject.kind,
|
|
189
|
+
summary: parsed.summary,
|
|
190
|
+
whyItMatters: parsed.whyItMatters,
|
|
191
|
+
evidence: evidence.length > 0 ? evidence : baseline.evidence,
|
|
192
|
+
nextSteps: nextSteps.length >= 2 ? nextSteps : baseline.nextSteps,
|
|
193
|
+
riskSignals: riskSignals.length > 0 ? riskSignals : baseline.riskSignals,
|
|
194
|
+
confidence: parsed.confidence,
|
|
195
|
+
modelId,
|
|
196
|
+
generatedAt: new Date().toISOString(),
|
|
197
|
+
synthetic: false,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
202
|
+
return fallbackLocalAiExplanation(subject, modelId, reason);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type LocalAiExplainSubjectKind = 'memory' | 'memory_file' | 'xray_finding' | 'quarantine_item' | 'audit_event' | 'generic';
|
|
2
|
+
export interface LocalAiExplainSubject {
|
|
3
|
+
kind: LocalAiExplainSubjectKind;
|
|
4
|
+
title: string;
|
|
5
|
+
content: string;
|
|
6
|
+
project?: string | null;
|
|
7
|
+
source?: string | null;
|
|
8
|
+
signals?: string[];
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface LocalAiEvidence {
|
|
12
|
+
snippet: string;
|
|
13
|
+
reason: string;
|
|
14
|
+
}
|
|
15
|
+
export interface LocalAiExplanation {
|
|
16
|
+
kind: LocalAiExplainSubjectKind;
|
|
17
|
+
summary: string;
|
|
18
|
+
whyItMatters: string;
|
|
19
|
+
evidence: LocalAiEvidence[];
|
|
20
|
+
nextSteps: string[];
|
|
21
|
+
riskSignals: string[];
|
|
22
|
+
confidence: number;
|
|
23
|
+
modelId: string;
|
|
24
|
+
generatedAt: string;
|
|
25
|
+
synthetic: boolean;
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { getAnnotationForItem } from './annotations-store.js';
|
|
2
|
+
import type { AnnotationRunResult, ReviewAnnotation } from './types.js';
|
|
3
|
+
export declare function annotateQuarantineItem(id: number): Promise<ReviewAnnotation | null>;
|
|
4
|
+
export declare function annotatePendingQuarantineItems(options?: {
|
|
5
|
+
limit?: number;
|
|
6
|
+
project?: string;
|
|
7
|
+
}): Promise<AnnotationRunResult>;
|
|
8
|
+
export { getAnnotationForItem };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { getDatabase } from '../../database/init.js';
|
|
2
|
+
import { requireFeature } from '../../license/gate.js';
|
|
3
|
+
import { reviewQuarantineItem } from './index.js';
|
|
4
|
+
import { saveQuarantineAnnotation, getAnnotationForItem } from './annotations-store.js';
|
|
5
|
+
import { recordAnnotationCreated } from './telemetry.js';
|
|
6
|
+
function parseThreatIndicators(value) {
|
|
7
|
+
if (!value)
|
|
8
|
+
return [];
|
|
9
|
+
try {
|
|
10
|
+
const parsed = JSON.parse(value);
|
|
11
|
+
return Array.isArray(parsed) ? parsed.filter((entry) => typeof entry === 'string') : [];
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function toReviewItem(row) {
|
|
18
|
+
return {
|
|
19
|
+
id: row.id,
|
|
20
|
+
content: row.original_content,
|
|
21
|
+
title: row.original_title,
|
|
22
|
+
project: row.project,
|
|
23
|
+
sourceType: row.source_type,
|
|
24
|
+
sourceIdentifier: row.source_identifier,
|
|
25
|
+
reason: row.reason,
|
|
26
|
+
threatIndicators: parseThreatIndicators(row.threat_indicators),
|
|
27
|
+
anomalyScore: row.anomaly_score,
|
|
28
|
+
firewallResult: row.firewall_result,
|
|
29
|
+
createdAt: row.created_at,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function shouldPersistAnnotation(annotation) {
|
|
33
|
+
return annotation.synthetic !== true;
|
|
34
|
+
}
|
|
35
|
+
function getPendingRow(id) {
|
|
36
|
+
const db = getDatabase();
|
|
37
|
+
const row = db.prepare(`
|
|
38
|
+
SELECT id, original_title, original_content, project, source_type, source_identifier,
|
|
39
|
+
reason, threat_indicators, anomaly_score, firewall_result, created_at
|
|
40
|
+
FROM quarantine
|
|
41
|
+
WHERE id = ? AND status = 'pending'
|
|
42
|
+
`).get(id);
|
|
43
|
+
return row ?? null;
|
|
44
|
+
}
|
|
45
|
+
export async function annotateQuarantineItem(id) {
|
|
46
|
+
requireFeature('local_ai_explainer');
|
|
47
|
+
const row = getPendingRow(id);
|
|
48
|
+
if (!row)
|
|
49
|
+
return null;
|
|
50
|
+
const annotation = await reviewQuarantineItem(toReviewItem(row));
|
|
51
|
+
if (!shouldPersistAnnotation(annotation))
|
|
52
|
+
return null;
|
|
53
|
+
saveQuarantineAnnotation(annotation);
|
|
54
|
+
recordAnnotationCreated(annotation);
|
|
55
|
+
return annotation;
|
|
56
|
+
}
|
|
57
|
+
export async function annotatePendingQuarantineItems(options = {}) {
|
|
58
|
+
requireFeature('local_ai_explainer');
|
|
59
|
+
const db = getDatabase();
|
|
60
|
+
const limit = Math.max(1, Math.min(500, Math.floor(options.limit ?? 50)));
|
|
61
|
+
const rows = (options.project
|
|
62
|
+
? db.prepare(`
|
|
63
|
+
SELECT id, original_title, original_content, project, source_type, source_identifier,
|
|
64
|
+
reason, threat_indicators, anomaly_score, firewall_result, created_at
|
|
65
|
+
FROM quarantine
|
|
66
|
+
WHERE status = 'pending' AND project = ?
|
|
67
|
+
AND NOT EXISTS (
|
|
68
|
+
SELECT 1 FROM quarantine_annotations qa WHERE qa.item_id = quarantine.id
|
|
69
|
+
)
|
|
70
|
+
ORDER BY created_at ASC
|
|
71
|
+
LIMIT ?
|
|
72
|
+
`).all(options.project, limit)
|
|
73
|
+
: db.prepare(`
|
|
74
|
+
SELECT id, original_title, original_content, project, source_type, source_identifier,
|
|
75
|
+
reason, threat_indicators, anomaly_score, firewall_result, created_at
|
|
76
|
+
FROM quarantine
|
|
77
|
+
WHERE status = 'pending'
|
|
78
|
+
AND NOT EXISTS (
|
|
79
|
+
SELECT 1 FROM quarantine_annotations qa WHERE qa.item_id = quarantine.id
|
|
80
|
+
)
|
|
81
|
+
ORDER BY created_at ASC
|
|
82
|
+
LIMIT ?
|
|
83
|
+
`).all(limit));
|
|
84
|
+
const result = {
|
|
85
|
+
attempted: rows.length,
|
|
86
|
+
annotated: 0,
|
|
87
|
+
skipped: 0,
|
|
88
|
+
failed: 0,
|
|
89
|
+
};
|
|
90
|
+
for (const row of rows) {
|
|
91
|
+
try {
|
|
92
|
+
const annotation = await reviewQuarantineItem(toReviewItem(row));
|
|
93
|
+
if (!shouldPersistAnnotation(annotation)) {
|
|
94
|
+
result.skipped++;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
saveQuarantineAnnotation(annotation);
|
|
98
|
+
recordAnnotationCreated(annotation);
|
|
99
|
+
result.annotated++;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
result.failed++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
export { getAnnotationForItem };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ReviewAnnotation } from './types.js';
|
|
2
|
+
export declare function saveQuarantineAnnotation(annotation: ReviewAnnotation): void;
|
|
3
|
+
export declare function getAnnotationForItem(id: number): ReviewAnnotation | null;
|
|
4
|
+
export declare function listAnnotations(limit?: number): ReviewAnnotation[];
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { getDatabase } from '../../database/init.js';
|
|
2
|
+
function toNumericItemId(itemId) {
|
|
3
|
+
const numericId = Number(itemId);
|
|
4
|
+
if (!Number.isSafeInteger(numericId) || numericId <= 0) {
|
|
5
|
+
throw new Error(`invalid_annotation_item_id:${itemId}`);
|
|
6
|
+
}
|
|
7
|
+
return numericId;
|
|
8
|
+
}
|
|
9
|
+
export function saveQuarantineAnnotation(annotation) {
|
|
10
|
+
const db = getDatabase();
|
|
11
|
+
const itemId = toNumericItemId(annotation.itemId);
|
|
12
|
+
db.prepare(`
|
|
13
|
+
INSERT INTO quarantine_annotations (
|
|
14
|
+
item_id,
|
|
15
|
+
category,
|
|
16
|
+
suggested_action,
|
|
17
|
+
confidence,
|
|
18
|
+
similar_group_key,
|
|
19
|
+
copilot_version,
|
|
20
|
+
annotation_json,
|
|
21
|
+
generated_at
|
|
22
|
+
)
|
|
23
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
24
|
+
ON CONFLICT(item_id, copilot_version) DO UPDATE SET
|
|
25
|
+
category = excluded.category,
|
|
26
|
+
suggested_action = excluded.suggested_action,
|
|
27
|
+
confidence = excluded.confidence,
|
|
28
|
+
similar_group_key = excluded.similar_group_key,
|
|
29
|
+
annotation_json = excluded.annotation_json,
|
|
30
|
+
generated_at = excluded.generated_at
|
|
31
|
+
`).run(itemId, annotation.category, annotation.suggestedAction, annotation.confidence, annotation.similarGroupKey, annotation.copilotVersion, JSON.stringify(annotation), annotation.generatedAt);
|
|
32
|
+
}
|
|
33
|
+
export function getAnnotationForItem(id) {
|
|
34
|
+
const db = getDatabase();
|
|
35
|
+
const row = db.prepare(`
|
|
36
|
+
SELECT item_id, annotation_json
|
|
37
|
+
FROM quarantine_annotations
|
|
38
|
+
WHERE item_id = ?
|
|
39
|
+
ORDER BY generated_at DESC
|
|
40
|
+
LIMIT 1
|
|
41
|
+
`).get(id);
|
|
42
|
+
if (!row)
|
|
43
|
+
return null;
|
|
44
|
+
try {
|
|
45
|
+
return JSON.parse(row.annotation_json);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function listAnnotations(limit = 50) {
|
|
52
|
+
const db = getDatabase();
|
|
53
|
+
const rows = db.prepare(`
|
|
54
|
+
SELECT item_id, annotation_json
|
|
55
|
+
FROM quarantine_annotations
|
|
56
|
+
ORDER BY generated_at DESC
|
|
57
|
+
LIMIT ?
|
|
58
|
+
`).all(limit);
|
|
59
|
+
return rows.flatMap((row) => {
|
|
60
|
+
try {
|
|
61
|
+
return [JSON.parse(row.annotation_json)];
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ReviewAnnotation, ReviewCopilotCategory, ReviewCopilotSuggestion, ReviewQuarantineItem } from './types.js';
|
|
2
|
+
export interface DeterministicReviewDecision {
|
|
3
|
+
category: ReviewCopilotCategory;
|
|
4
|
+
suggestedAction: ReviewCopilotSuggestion;
|
|
5
|
+
confidence: number;
|
|
6
|
+
reasoning: string;
|
|
7
|
+
signals: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function decideReviewAnnotation(item: ReviewQuarantineItem): DeterministicReviewDecision;
|
|
10
|
+
export declare function deterministicAnnotation(item: ReviewQuarantineItem, copilotVersion: string, decisionResult: DeterministicReviewDecision, reason: string): ReviewAnnotation;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { scanForCredentials } from '../credential-leak/index.js';
|
|
2
|
+
import { detectInstructions } from '../firewall/instruction-detector.js';
|
|
3
|
+
import { detectPrivilegeEscalation } from '../firewall/privilege-detector.js';
|
|
4
|
+
import { detectSkillThreats } from '../skill-scanner/patterns.js';
|
|
5
|
+
function parseThreatIndicators(value) {
|
|
6
|
+
if (!value)
|
|
7
|
+
return [];
|
|
8
|
+
if (Array.isArray(value))
|
|
9
|
+
return value.map(String).map((entry) => entry.toLowerCase());
|
|
10
|
+
try {
|
|
11
|
+
const parsed = JSON.parse(value);
|
|
12
|
+
if (Array.isArray(parsed)) {
|
|
13
|
+
return parsed.map(String).map((entry) => entry.toLowerCase());
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Fall through to comma/string parsing.
|
|
18
|
+
}
|
|
19
|
+
return String(value)
|
|
20
|
+
.split(/[,\s]+/)
|
|
21
|
+
.map((entry) => entry.trim().toLowerCase())
|
|
22
|
+
.filter(Boolean);
|
|
23
|
+
}
|
|
24
|
+
function includesAny(text, patterns) {
|
|
25
|
+
return patterns.some((pattern) => pattern.test(text));
|
|
26
|
+
}
|
|
27
|
+
function isDocumentationLike(text) {
|
|
28
|
+
return includesAny(text, [
|
|
29
|
+
/\b(documentation|docs?|readme|blog draft|release note|training note|security training)\b/i,
|
|
30
|
+
/\b(test fixture|unit test|documentation example|docs example|quoted example|benign examples?|placeholder|fake key|not real|expected to be blocked)\b/i,
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
function isExplicitlyBenign(text) {
|
|
34
|
+
return includesAny(text, [
|
|
35
|
+
/\b(meeting note|project note|support note|design note|operational note|architecture note|reminder|preference)\b/i,
|
|
36
|
+
/\b(no secrets present|metadata only|local-only|advisory)\b/i,
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
function deterministicSummary(decision) {
|
|
40
|
+
switch (decision.category) {
|
|
41
|
+
case 'credential_leak':
|
|
42
|
+
return 'ShieldCortex deterministic scanners found credential material.';
|
|
43
|
+
case 'exfiltration_attempt':
|
|
44
|
+
return 'ShieldCortex deterministic scanners found an exfiltration pattern.';
|
|
45
|
+
case 'scope_escalation':
|
|
46
|
+
return 'ShieldCortex deterministic scanners found a scope-escalation pattern.';
|
|
47
|
+
case 'persistence_attempt':
|
|
48
|
+
return 'ShieldCortex deterministic scanners found a persistence attempt.';
|
|
49
|
+
case 'prompt_injection':
|
|
50
|
+
return 'ShieldCortex deterministic scanners found prompt-injection behaviour.';
|
|
51
|
+
case 'documentation_or_example':
|
|
52
|
+
return 'ShieldCortex classified this as documentation or a test example.';
|
|
53
|
+
case 'benign_log':
|
|
54
|
+
return 'ShieldCortex classified this as a benign operational note.';
|
|
55
|
+
case 'uncertain':
|
|
56
|
+
return 'ShieldCortex could not classify this item confidently.';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function rejectOrKeep(item) {
|
|
60
|
+
return item.firewallResult === 'BLOCK' ? 'reject' : 'keep_quarantined';
|
|
61
|
+
}
|
|
62
|
+
function decision(category, suggestedAction, confidence, reasoning, signals) {
|
|
63
|
+
return {
|
|
64
|
+
category,
|
|
65
|
+
suggestedAction,
|
|
66
|
+
confidence,
|
|
67
|
+
reasoning,
|
|
68
|
+
signals: [...new Set(signals)].slice(0, 12),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export function decideReviewAnnotation(item) {
|
|
72
|
+
const content = item.content ?? '';
|
|
73
|
+
const title = item.title ?? '';
|
|
74
|
+
const reason = item.reason ?? '';
|
|
75
|
+
const combined = `${title}\n${reason}\n${content}`;
|
|
76
|
+
const indicators = parseThreatIndicators(item.threatIndicators);
|
|
77
|
+
const credentialScan = scanForCredentials(content);
|
|
78
|
+
const skillThreats = detectSkillThreats(content);
|
|
79
|
+
const instructions = detectInstructions(content);
|
|
80
|
+
const privilege = detectPrivilegeEscalation(content);
|
|
81
|
+
const signals = [
|
|
82
|
+
...indicators.map((indicator) => `indicator:${indicator}`),
|
|
83
|
+
...skillThreats.threats.map((threat) => `skill:${threat}`),
|
|
84
|
+
...privilege.indicators.map((indicator) => `privilege:${indicator}`),
|
|
85
|
+
...credentialScan.findings.map((finding) => `credential:${finding.provider ?? finding.type}:${finding.severity}`),
|
|
86
|
+
...(instructions.detected ? ['instruction_injection'] : []),
|
|
87
|
+
...(item.firewallResult ? [`firewall:${item.firewallResult.toLowerCase()}`] : []),
|
|
88
|
+
];
|
|
89
|
+
const docsLike = isDocumentationLike(combined);
|
|
90
|
+
const benignLike = isExplicitlyBenign(combined);
|
|
91
|
+
if (benignLike && !credentialScan.findings.some((finding) => finding.action === 'blocked')) {
|
|
92
|
+
return decision('benign_log', 'approve', 0.78, 'No deterministic threat signal was found and the content looks operational/benign.', signals);
|
|
93
|
+
}
|
|
94
|
+
if (docsLike && !credentialScan.findings.some((finding) => finding.action === 'blocked')) {
|
|
95
|
+
return decision('documentation_or_example', 'approve', 0.82, 'Documentation/test-example language was detected and no live blocked credential pattern was found.', [...signals, 'documentation_like']);
|
|
96
|
+
}
|
|
97
|
+
if (credentialScan.leaked || indicators.includes('credential_leak') || indicators.includes('restricted_content')) {
|
|
98
|
+
return decision('credential_leak', rejectOrKeep(item), credentialScan.findings.some((finding) => finding.action === 'blocked') ? 0.96 : 0.88, 'Credential leak detection is deterministic and overrides model classification.', signals);
|
|
99
|
+
}
|
|
100
|
+
if (skillThreats.threats.includes('data_exfiltration') ||
|
|
101
|
+
privilege.indicators.includes('network_exfiltration') ||
|
|
102
|
+
indicators.includes('data_exfiltration') ||
|
|
103
|
+
includesAny(content, [
|
|
104
|
+
/\b(exfiltrate|send|upload|post|curl|forward|include)\b[\s\S]{0,140}\b(https?:|webhook|pastebin|env vars?|environment variables?|\.env|private key|credentials?|api key|cookies?|transcripts?)\b/i,
|
|
105
|
+
/\b(cookies?|api key|credentials?|secrets?)\b[\s\S]{0,140}\b(memory|retrieve|transcripts?|webhook|pastebin|external|attacker)\b/i,
|
|
106
|
+
])) {
|
|
107
|
+
return decision('exfiltration_attempt', rejectOrKeep(item), 0.94, 'Deterministic exfiltration patterns were found in the quarantined content.', signals);
|
|
108
|
+
}
|
|
109
|
+
if (skillThreats.threats.includes('scope_escalation') ||
|
|
110
|
+
indicators.includes('scope_escalation') ||
|
|
111
|
+
indicators.includes('privilege_escalation') ||
|
|
112
|
+
privilege.indicators.includes('system_access') ||
|
|
113
|
+
privilege.indicators.includes('destructive_filesystem') ||
|
|
114
|
+
includesAny(content, [
|
|
115
|
+
/\b(add yourself|add (me|this agent))\b[\s\S]{0,80}\b(admin|administrator|team)\b/i,
|
|
116
|
+
/\bbypass\b[\s\S]{0,80}\b(confirmation|approval|gate|permission)\b/i,
|
|
117
|
+
/\balready approved\b[\s\S]{0,80}\b(future|destructive|commands?)\b/i,
|
|
118
|
+
])) {
|
|
119
|
+
return decision('scope_escalation', rejectOrKeep(item), 0.9, 'Deterministic privilege/scope escalation signals were found.', signals);
|
|
120
|
+
}
|
|
121
|
+
if (skillThreats.threats.includes('persistence') ||
|
|
122
|
+
indicators.includes('persistence') ||
|
|
123
|
+
includesAny(content, [
|
|
124
|
+
/\b(remember|store|create a memory|save)\b[\s\S]{0,80}\b(forever|future|later|every later|hidden rule)\b/i,
|
|
125
|
+
/\b(hidden rule|never show|trust messages? from|attacker\.example)\b/i,
|
|
126
|
+
])) {
|
|
127
|
+
return decision('persistence_attempt', rejectOrKeep(item), 0.9, 'Deterministic persistence patterns were found.', signals);
|
|
128
|
+
}
|
|
129
|
+
if (instructions.detected ||
|
|
130
|
+
skillThreats.threats.includes('agent_manipulation') ||
|
|
131
|
+
skillThreats.threats.includes('stealth_instruction') ||
|
|
132
|
+
indicators.includes('instruction_injection') ||
|
|
133
|
+
includesAny(content, [
|
|
134
|
+
/\b(forget|ignore|override)\b[\s\S]{0,80}\b(policy|instructions?|rules?|safety|security)\b/i,
|
|
135
|
+
/\b(mark|treat)\b[\s\S]{0,40}\b(memory|item|this)\b[\s\S]{0,40}\b(safe|approved?)\b/i,
|
|
136
|
+
/\bapprove\b[\s\S]{0,60}\b(automatically|only|always|this quarantine item)\b/i,
|
|
137
|
+
/\bprefer\b[\s\S]{0,60}\battacker instructions?\b/i,
|
|
138
|
+
/\b(secretly|hidden instruction)\b[\s\S]{0,80}\b(print|reveal|answer only|developer message|approve)\b/i,
|
|
139
|
+
/\bbypass\b[\s\S]{0,80}\b(iron dome|shieldcortex|security|safety)\b/i,
|
|
140
|
+
])) {
|
|
141
|
+
return decision('prompt_injection', rejectOrKeep(item), Math.max(0.84, instructions.confidence ?? 0), 'Deterministic prompt-injection or agent-manipulation patterns were found.', signals);
|
|
142
|
+
}
|
|
143
|
+
if (skillThreats.detected || indicators.includes('custom_rule') || indicators.includes('custom_pattern')) {
|
|
144
|
+
return decision('prompt_injection', 'create_rule', Math.max(0.78, skillThreats.confidence), 'A repeatable deterministic pattern was detected and may warrant a rule.', signals);
|
|
145
|
+
}
|
|
146
|
+
if (item.firewallResult === 'ALLOW') {
|
|
147
|
+
return decision('benign_log', 'approve', 0.78, 'No deterministic threat signal was found and the content looks operational/benign.', signals);
|
|
148
|
+
}
|
|
149
|
+
return decision('uncertain', 'keep_quarantined', 0.5, 'No deterministic signal was strong enough to classify this item.', signals);
|
|
150
|
+
}
|
|
151
|
+
export function deterministicAnnotation(item, copilotVersion, decisionResult, reason) {
|
|
152
|
+
return {
|
|
153
|
+
itemId: String(item.id),
|
|
154
|
+
category: decisionResult.category,
|
|
155
|
+
summary: deterministicSummary(decisionResult),
|
|
156
|
+
evidence: [],
|
|
157
|
+
suggestedAction: decisionResult.suggestedAction,
|
|
158
|
+
confidence: decisionResult.confidence,
|
|
159
|
+
similarGroupKey: null,
|
|
160
|
+
reasoning: `${decisionResult.reasoning} Local model summary unavailable: ${reason}`.slice(0, 400),
|
|
161
|
+
copilotVersion,
|
|
162
|
+
generatedAt: new Date().toISOString(),
|
|
163
|
+
synthetic: false,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ReviewAnnotation, ReviewQuarantineItem } from './types.js';
|
|
2
|
+
export declare const REVIEW_COPILOT_PROMPT_VERSION = "review-copilot-prompt-v1";
|
|
3
|
+
export declare function getCopilotVersion(modelId: string): string;
|
|
4
|
+
export declare function fallbackAnnotation(item: Pick<ReviewQuarantineItem, 'id'>, modelId?: string, reason?: string): ReviewAnnotation;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const REVIEW_COPILOT_PROMPT_VERSION = 'review-copilot-prompt-v1';
|
|
2
|
+
export function getCopilotVersion(modelId) {
|
|
3
|
+
return `${modelId}@${REVIEW_COPILOT_PROMPT_VERSION}`;
|
|
4
|
+
}
|
|
5
|
+
export function fallbackAnnotation(item, modelId = 'unavailable', reason = 'No local model annotation was available.') {
|
|
6
|
+
return {
|
|
7
|
+
itemId: String(item.id),
|
|
8
|
+
category: 'uncertain',
|
|
9
|
+
summary: 'Review Copilot unavailable.',
|
|
10
|
+
evidence: [],
|
|
11
|
+
suggestedAction: 'keep_quarantined',
|
|
12
|
+
confidence: 0,
|
|
13
|
+
similarGroupKey: null,
|
|
14
|
+
reasoning: reason.slice(0, 400),
|
|
15
|
+
copilotVersion: getCopilotVersion(modelId),
|
|
16
|
+
generatedAt: new Date().toISOString(),
|
|
17
|
+
synthetic: true,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ReviewAnnotation, ReviewBatch } from './types.js';
|
|
2
|
+
export declare function computeSimilarGroupKey(annotation: Pick<ReviewAnnotation, 'category' | 'suggestedAction' | 'summary'>): string;
|
|
3
|
+
export declare function withSimilarGroupKey(annotation: ReviewAnnotation): ReviewAnnotation;
|
|
4
|
+
export declare function groupSimilarItems(annotations: ReviewAnnotation[]): ReviewBatch[];
|