shieldcortex 4.28.0 → 4.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dashboard/.next/standalone/dashboard/.next/BUILD_ID +1 -1
- package/dashboard/.next/standalone/dashboard/.next/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/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/replay.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory/replay/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory/replay.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory/review.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline/__PAGE__.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory/timeline.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_full.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_head.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_index.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_tree.segment.rsc +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.html +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/cli/doctor.d.ts +17 -0
- package/dist/cli/doctor.js +44 -0
- package/dist/cli/memory.d.ts +23 -0
- package/dist/cli/memory.js +101 -0
- package/dist/database/init.d.ts +9 -0
- package/dist/database/init.js +32 -4
- package/dist/database/migrations.js +126 -0
- package/dist/license/store.js +42 -2
- package/dist/memory/consolidate.d.ts +82 -6
- package/dist/memory/consolidate.js +287 -117
- package/dist/setup/openclaw.d.ts +26 -0
- package/dist/setup/openclaw.js +61 -0
- package/dist/tools/remember.js +24 -3
- package/hooks/openclaw/cortex-memory/handler.ts +223 -171
- package/hooks/openclaw/cortex-memory/runtime.mjs +64 -0
- package/package.json +1 -1
- package/scripts/lib/dedup.mjs +99 -0
- package/scripts/lib/openclaw-extract.mjs +129 -0
- package/scripts/lib/recall-log.mjs +16 -1
- package/scripts/lib/recall-relevance.mjs +191 -0
- package/scripts/lib/salience.mjs +8 -3
- package/scripts/lib/save-memory.mjs +62 -6
- package/scripts/lib/session-context.mjs +30 -0
- package/scripts/postinstall.mjs +29 -10
- package/scripts/prompt-recall-hook.mjs +118 -15
- package/scripts/session-start-hook.mjs +17 -6
- /package/dashboard/.next/standalone/dashboard/.next/static/{3HiFjAMoQUDn05ZMNC0Ae → 0HpUm8SRvm9fnWVO0OBB2}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{3HiFjAMoQUDn05ZMNC0Ae → 0HpUm8SRvm9fnWVO0OBB2}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{3HiFjAMoQUDn05ZMNC0Ae → 0HpUm8SRvm9fnWVO0OBB2}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--0HpUm8SRvm9fnWVO0OBB2--><html lang="en" class="dark" data-theme="terminal"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/a7d5d0791c8c6223.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/aee9601911b790ca.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/d878b929b21636c4.js"/><script src="/_next/static/chunks/f70f563804550a9c.js" async=""></script><script src="/_next/static/chunks/43d761df92da7cb6.js" async=""></script><script src="/_next/static/chunks/e281719dbabcca1d.js" async=""></script><script src="/_next/static/chunks/9e56d1f8f4d7adcb.js" async=""></script><script src="/_next/static/chunks/turbopack-768a6a8b9db952e0.js" async=""></script><script src="/_next/static/chunks/4ddb24d8ce3b8617.js" async=""></script><script src="/_next/static/chunks/417032eeb2cd875f.js" async=""></script><script src="/_next/static/chunks/d334b69bff7779be.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>ShieldCortex</title><meta name="description" content="AI Memory Security Dashboard — Defence pipeline, audit logs, quarantine review"/><script>
|
|
2
2
|
try {
|
|
3
3
|
var t = localStorage.getItem('sc-theme');
|
|
4
4
|
if (t !== 'glass' && t !== 'terminal') t = 'terminal';
|
|
@@ -6,4 +6,4 @@ try {
|
|
|
6
6
|
} catch (e) {
|
|
7
7
|
document.documentElement.dataset.theme = 'terminal';
|
|
8
8
|
}
|
|
9
|
-
</script><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased bg-slate-950"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[36111,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"Providers\"]\n3:I[57043,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[10445,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\",\"/_next/static/chunks/d334b69bff7779be.js\"],\"default\"]\n5:I[27657,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n6:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\n9:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\nb:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nd:I[30687,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n:HL[\"/_next/static/chunks/a7d5d0791c8c6223.css\",\"style\"]\n:HL[\"/_next/static/chunks/aee9601911b790ca.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"
|
|
9
|
+
</script><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased bg-slate-950"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[36111,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"Providers\"]\n3:I[57043,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[10445,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\",\"/_next/static/chunks/d334b69bff7779be.js\"],\"default\"]\n5:I[27657,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n6:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\n9:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\nb:I[56978,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nd:I[30687,[\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n:HL[\"/_next/static/chunks/a7d5d0791c8c6223.css\",\"style\"]\n:HL[\"/_next/static/chunks/aee9601911b790ca.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"0HpUm8SRvm9fnWVO0OBB2\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/a7d5d0791c8c6223.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/aee9601911b790ca.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/4ddb24d8ce3b8617.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/417032eeb2cd875f.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"data-theme\":\"terminal\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\ntry {\\n var t = localStorage.getItem('sc-theme');\\n if (t !== 'glass' \u0026\u0026 t !== 'terminal') t = 'terminal';\\n document.documentElement.dataset.theme = t;\\n} catch (e) {\\n document.documentElement.dataset.theme = 'terminal';\\n}\\n\"}}]}],[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased bg-slate-950\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$4\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/d334b69bff7779be.js\",\"async\":true}]],\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"8:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"ShieldCortex\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"AI Memory Security Dashboard — Defence pipeline, audit logs, quarantine review\"}]]\n"])</script></body></html>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
2
|
-
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57043,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n3:I[27657,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\n9:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nb:I[30687,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"
|
|
1
|
+
<!DOCTYPE html><!--0HpUm8SRvm9fnWVO0OBB2--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/d878b929b21636c4.js"/><script src="/_next/static/chunks/f70f563804550a9c.js" async=""></script><script src="/_next/static/chunks/43d761df92da7cb6.js" async=""></script><script src="/_next/static/chunks/e281719dbabcca1d.js" async=""></script><script src="/_next/static/chunks/9e56d1f8f4d7adcb.js" async=""></script><script src="/_next/static/chunks/turbopack-768a6a8b9db952e0.js" async=""></script><script src="/_next/static/chunks/102f894cc892994d.js" async=""></script><script src="/_next/static/chunks/417032eeb2cd875f.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
|
|
2
|
+
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/d878b929b21636c4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57043,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n3:I[27657,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n4:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"ViewportBoundary\"]\n9:I[56978,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"MetadataBoundary\"]\nb:I[30687,[\"/_next/static/chunks/102f894cc892994d.js\",\"/_next/static/chunks/417032eeb2cd875f.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"0HpUm8SRvm9fnWVO0OBB2\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/102f894cc892994d.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/417032eeb2cd875f.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"
|
|
1
|
+
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"jZLIs0WELP6DwKdG8xvVcHODhv+RAU6fBpO5cDof1hg=\"\n}"
|
package/dist/cli/doctor.d.ts
CHANGED
|
@@ -132,4 +132,21 @@ export declare function checkOpenClawDuplicateInstalls(openclawDir?: string): Pr
|
|
|
132
132
|
* group; that's the surface this check probes.
|
|
133
133
|
*/
|
|
134
134
|
export declare function checkDefenceCanary(): Promise<CheckResult>;
|
|
135
|
+
/**
|
|
136
|
+
* The cortex-memory hook is installed by FILE COPY into
|
|
137
|
+
* `~/.openclaw/hooks/cortex-memory/` (see src/setup/openclaw.ts). A package
|
|
138
|
+
* update does NOT re-copy it automatically on every install shape — non-global
|
|
139
|
+
* (dependency) installs skip the postinstall auto-refresh, and a documented
|
|
140
|
+
* version-lag (OpenClaw 4.25.x vs a newer global) can leave the installed
|
|
141
|
+
* `handler.ts` / `runtime.mjs` behind the packaged version. A stale hook keeps
|
|
142
|
+
* running the OLD extraction logic, so memory-quality fixes never reach claws.
|
|
143
|
+
*
|
|
144
|
+
* `hookFilesStale()` is the single source of truth (byte-for-byte comparison
|
|
145
|
+
* against the packaged HOOK_SOURCE). Doctor only DETECTS + GUIDES here — it has
|
|
146
|
+
* no auto-repair mode, and re-copying files mid-doctor would be a surprising
|
|
147
|
+
* side effect. The actionable fix is `shieldcortex openclaw install`.
|
|
148
|
+
*
|
|
149
|
+
* `destDir` is injectable for tests; defaults to the standard install dest.
|
|
150
|
+
*/
|
|
151
|
+
export declare function checkOpenClawHookFreshness(destDir?: string): Promise<CheckResult>;
|
|
135
152
|
export declare function runDoctor(): Promise<void>;
|
package/dist/cli/doctor.js
CHANGED
|
@@ -1319,6 +1319,49 @@ async function checkHookTimeouts() {
|
|
|
1319
1319
|
return { label: 'Hook timeouts', status: 'info', message: `check skipped — ${msg}` };
|
|
1320
1320
|
}
|
|
1321
1321
|
}
|
|
1322
|
+
// ── Check: OpenClaw hook freshness (Task 6b) ─────────────
|
|
1323
|
+
/**
|
|
1324
|
+
* The cortex-memory hook is installed by FILE COPY into
|
|
1325
|
+
* `~/.openclaw/hooks/cortex-memory/` (see src/setup/openclaw.ts). A package
|
|
1326
|
+
* update does NOT re-copy it automatically on every install shape — non-global
|
|
1327
|
+
* (dependency) installs skip the postinstall auto-refresh, and a documented
|
|
1328
|
+
* version-lag (OpenClaw 4.25.x vs a newer global) can leave the installed
|
|
1329
|
+
* `handler.ts` / `runtime.mjs` behind the packaged version. A stale hook keeps
|
|
1330
|
+
* running the OLD extraction logic, so memory-quality fixes never reach claws.
|
|
1331
|
+
*
|
|
1332
|
+
* `hookFilesStale()` is the single source of truth (byte-for-byte comparison
|
|
1333
|
+
* against the packaged HOOK_SOURCE). Doctor only DETECTS + GUIDES here — it has
|
|
1334
|
+
* no auto-repair mode, and re-copying files mid-doctor would be a surprising
|
|
1335
|
+
* side effect. The actionable fix is `shieldcortex openclaw install`.
|
|
1336
|
+
*
|
|
1337
|
+
* `destDir` is injectable for tests; defaults to the standard install dest.
|
|
1338
|
+
*/
|
|
1339
|
+
export async function checkOpenClawHookFreshness(destDir) {
|
|
1340
|
+
const label = 'OpenClaw hook';
|
|
1341
|
+
try {
|
|
1342
|
+
const { defaultHookDestDir, hookFilesStale } = await import('../setup/openclaw.js');
|
|
1343
|
+
const dest = destDir ?? defaultHookDestDir();
|
|
1344
|
+
// Only meaningful when a hook copy actually exists on disk. A missing dest
|
|
1345
|
+
// dir means the integration simply isn't installed — that's the domain of
|
|
1346
|
+
// the OpenClaw residue / dup-installs checks, not a staleness warning.
|
|
1347
|
+
if (!fs.existsSync(dest)) {
|
|
1348
|
+
return { label, status: 'info', message: 'skipped (cortex-memory hook not installed)' };
|
|
1349
|
+
}
|
|
1350
|
+
if (hookFilesStale(dest)) {
|
|
1351
|
+
return {
|
|
1352
|
+
label,
|
|
1353
|
+
status: 'warn',
|
|
1354
|
+
message: 'cortex-memory hook is out of date (installed copy differs from packaged version)',
|
|
1355
|
+
fix: 'Run `shieldcortex openclaw install` to refresh the hook',
|
|
1356
|
+
};
|
|
1357
|
+
}
|
|
1358
|
+
return { label, status: 'pass', message: 'cortex-memory hook up to date' };
|
|
1359
|
+
}
|
|
1360
|
+
catch (err) {
|
|
1361
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1362
|
+
return { label, status: 'info', message: `check skipped — ${msg}` };
|
|
1363
|
+
}
|
|
1364
|
+
}
|
|
1322
1365
|
// ── Check 8: Model cache ─────────────────────────────────
|
|
1323
1366
|
async function checkModelCache() {
|
|
1324
1367
|
const cacheDir = path.join(os.homedir(), '.cache', 'shieldcortex', 'models', 'Xenova', 'all-MiniLM-L6-v2');
|
|
@@ -1374,6 +1417,7 @@ export async function runDoctor() {
|
|
|
1374
1417
|
checkDiskUsage,
|
|
1375
1418
|
checkLockFile,
|
|
1376
1419
|
checkOpenClawResidue,
|
|
1420
|
+
checkOpenClawHookFreshness,
|
|
1377
1421
|
checkOpenClawPluginPackage,
|
|
1378
1422
|
checkOpenClawDuplicateInstalls,
|
|
1379
1423
|
checkDefenceCanary,
|
package/dist/cli/memory.d.ts
CHANGED
|
@@ -9,8 +9,31 @@
|
|
|
9
9
|
* shieldcortex memory show <id>
|
|
10
10
|
* shieldcortex memory downvote <id> [--reason <text>]
|
|
11
11
|
* shieldcortex memory list [--purpose <X>] [--category <X>] [--limit N]
|
|
12
|
+
* shieldcortex memory revert-backfill
|
|
12
13
|
*
|
|
13
14
|
* Effective salience is computed via scripts/lib/salience.mjs so this CLI
|
|
14
15
|
* shows the same numbers the recall hook actually ranks by.
|
|
15
16
|
*/
|
|
17
|
+
import type Database from 'better-sqlite3';
|
|
18
|
+
/**
|
|
19
|
+
* Undo the v4.29.0 salience-wall clamp (Task 5).
|
|
20
|
+
*
|
|
21
|
+
* The backfill (src/database/migrations.ts) clamped stale machine-generated
|
|
22
|
+
* `salience > 0.6` rows down to a flat 0.6, after stashing the PRE-clamp
|
|
23
|
+
* salience in the `memories_backfill_backup` table (columns: id, salience,
|
|
24
|
+
* backed_up_at). It is clamp-only, so salience is the ONLY column to restore —
|
|
25
|
+
* the backup carries no category / memory_purpose to put back.
|
|
26
|
+
*
|
|
27
|
+
* This is deliberately STICKY: we do NOT drop `memories_backfill_backup`.
|
|
28
|
+
* That table's existence is also the migration's run-once guard, so keeping it
|
|
29
|
+
* means the next process startup will NOT re-run the clamp and silently undo
|
|
30
|
+
* this revert. To re-enable the backfill, the operator drops the table.
|
|
31
|
+
*
|
|
32
|
+
* Pure + testable: takes the DB handle, returns a summary. No process.exit,
|
|
33
|
+
* no console output — the CLI wrapper owns the user-facing reporting.
|
|
34
|
+
*/
|
|
35
|
+
export declare function revertBackfill(db: Database.Database): {
|
|
36
|
+
reverted: number;
|
|
37
|
+
hadBackup: boolean;
|
|
38
|
+
};
|
|
16
39
|
export declare function handleMemoryCommand(args: string[]): Promise<void>;
|
package/dist/cli/memory.js
CHANGED
|
@@ -9,12 +9,14 @@
|
|
|
9
9
|
* shieldcortex memory show <id>
|
|
10
10
|
* shieldcortex memory downvote <id> [--reason <text>]
|
|
11
11
|
* shieldcortex memory list [--purpose <X>] [--category <X>] [--limit N]
|
|
12
|
+
* shieldcortex memory revert-backfill
|
|
12
13
|
*
|
|
13
14
|
* Effective salience is computed via scripts/lib/salience.mjs so this CLI
|
|
14
15
|
* shows the same numbers the recall hook actually ranks by.
|
|
15
16
|
*/
|
|
16
17
|
import path from 'path';
|
|
17
18
|
import os from 'os';
|
|
19
|
+
import fs from 'fs';
|
|
18
20
|
import { initDatabase, getDatabase } from '../database/init.js';
|
|
19
21
|
// ANSI colours — match doctor.ts conventions.
|
|
20
22
|
const bold = '\x1b[1m';
|
|
@@ -192,6 +194,101 @@ async function cmdList(args) {
|
|
|
192
194
|
}
|
|
193
195
|
return 0;
|
|
194
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Undo the v4.29.0 salience-wall clamp (Task 5).
|
|
199
|
+
*
|
|
200
|
+
* The backfill (src/database/migrations.ts) clamped stale machine-generated
|
|
201
|
+
* `salience > 0.6` rows down to a flat 0.6, after stashing the PRE-clamp
|
|
202
|
+
* salience in the `memories_backfill_backup` table (columns: id, salience,
|
|
203
|
+
* backed_up_at). It is clamp-only, so salience is the ONLY column to restore —
|
|
204
|
+
* the backup carries no category / memory_purpose to put back.
|
|
205
|
+
*
|
|
206
|
+
* This is deliberately STICKY: we do NOT drop `memories_backfill_backup`.
|
|
207
|
+
* That table's existence is also the migration's run-once guard, so keeping it
|
|
208
|
+
* means the next process startup will NOT re-run the clamp and silently undo
|
|
209
|
+
* this revert. To re-enable the backfill, the operator drops the table.
|
|
210
|
+
*
|
|
211
|
+
* Pure + testable: takes the DB handle, returns a summary. No process.exit,
|
|
212
|
+
* no console output — the CLI wrapper owns the user-facing reporting.
|
|
213
|
+
*/
|
|
214
|
+
export function revertBackfill(db) {
|
|
215
|
+
const hasBackup = db
|
|
216
|
+
.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='memories_backfill_backup'")
|
|
217
|
+
.get();
|
|
218
|
+
if (!hasBackup) {
|
|
219
|
+
return { reverted: 0, hadBackup: false };
|
|
220
|
+
}
|
|
221
|
+
// FTS-drift safety, mirroring the migration: rebuild the FTS index FIRST in
|
|
222
|
+
// its own try/catch so the per-row memories_au trigger that fires on the
|
|
223
|
+
// salience UPDATE below cannot throw "database disk image is malformed" on a
|
|
224
|
+
// drifted index. Best-effort — a rebuild failure must not abort the revert.
|
|
225
|
+
try {
|
|
226
|
+
db.exec("INSERT INTO memories_fts(memories_fts) VALUES('rebuild')");
|
|
227
|
+
}
|
|
228
|
+
catch (ftsErr) {
|
|
229
|
+
const msg = ftsErr instanceof Error ? ftsErr.message : String(ftsErr);
|
|
230
|
+
console.error(`[revert-backfill] FTS rebuild skipped (continuing): ${msg}`);
|
|
231
|
+
}
|
|
232
|
+
// Restore ONLY salience, atomically. The 3-column backup has no category /
|
|
233
|
+
// memory_purpose, so we never reference columns that don't exist there.
|
|
234
|
+
//
|
|
235
|
+
// Concurrency note: this uses a plain (deferred) db.transaction(...), NOT the
|
|
236
|
+
// migration's .immediate() variant — deliberately. Revert is an interactive
|
|
237
|
+
// operator command, not the multi-PID startup race the migration guards
|
|
238
|
+
// against, so deferred locking is correct here; don't "fix" it to .immediate().
|
|
239
|
+
//
|
|
240
|
+
// `reverted` is taken from the UPDATE's RunResult.changes — the count of rows
|
|
241
|
+
// ACTUALLY restored — not COUNT(*) of the backup table. If the operator
|
|
242
|
+
// deleted some memories after the clamp, the backup still lists their ids, so
|
|
243
|
+
// the backup count would overstate what changed.
|
|
244
|
+
const run = db.transaction(() => {
|
|
245
|
+
return db.prepare(`
|
|
246
|
+
UPDATE memories
|
|
247
|
+
SET salience = (SELECT b.salience FROM memories_backfill_backup b WHERE b.id = memories.id)
|
|
248
|
+
WHERE id IN (SELECT id FROM memories_backfill_backup)
|
|
249
|
+
`).run();
|
|
250
|
+
});
|
|
251
|
+
const info = run();
|
|
252
|
+
// Intentionally NOT dropping memories_backfill_backup — see the doc comment:
|
|
253
|
+
// retaining it keeps the migration's run-once guard satisfied so the next
|
|
254
|
+
// startup will not re-clamp and undo this revert.
|
|
255
|
+
return { reverted: info.changes, hadBackup: true };
|
|
256
|
+
}
|
|
257
|
+
function cmdRevertBackfill() {
|
|
258
|
+
const dbPath = defaultDbPath();
|
|
259
|
+
const db = openDb();
|
|
260
|
+
const { reverted, hadBackup } = revertBackfill(db);
|
|
261
|
+
if (!hadBackup) {
|
|
262
|
+
console.log('No backfill to revert — this database was never backfilled.');
|
|
263
|
+
return 0;
|
|
264
|
+
}
|
|
265
|
+
console.log(`${green}Reverted${reset} the v4.29.0 salience-wall clamp.`);
|
|
266
|
+
console.log(` Rows restored to their pre-clamp salience: ${bold}${reverted}${reset}`);
|
|
267
|
+
console.log(` ${dim}Backfill guard retained so the migration will not re-apply.${reset}`);
|
|
268
|
+
console.log(` ${dim}To re-enable the backfill, drop the memories_backfill_backup table.${reset}`);
|
|
269
|
+
// Surface the whole-DB file snapshot (if any) as a fuller restore option.
|
|
270
|
+
// We do NOT delete it — the 30-day reaper handles cleanup and the operator
|
|
271
|
+
// may still want it.
|
|
272
|
+
try {
|
|
273
|
+
const dir = path.dirname(dbPath);
|
|
274
|
+
const base = path.basename(dbPath);
|
|
275
|
+
const snapshots = fs
|
|
276
|
+
.readdirSync(dir)
|
|
277
|
+
.filter((name) => name.startsWith(`${base}.pre-backfill-`))
|
|
278
|
+
.sort();
|
|
279
|
+
if (snapshots.length > 0) {
|
|
280
|
+
console.log('');
|
|
281
|
+
console.log(` ${cyan}Full pre-backfill DB snapshot(s) also available:${reset}`);
|
|
282
|
+
for (const name of snapshots) {
|
|
283
|
+
console.log(` ${dim}${path.join(dir, name)}${reset}`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
// Snapshot discovery is a hint only; never let it fail the revert report.
|
|
289
|
+
}
|
|
290
|
+
return 0;
|
|
291
|
+
}
|
|
195
292
|
function printHelp() {
|
|
196
293
|
console.log('Usage: shieldcortex memory <subcommand> [args]');
|
|
197
294
|
console.log('');
|
|
@@ -199,6 +296,7 @@ function printHelp() {
|
|
|
199
296
|
console.log(' show <id> Show a single memory with effective-salience breakdown');
|
|
200
297
|
console.log(' downvote <id> [--reason <text>] Mark a memory unhelpful (reduces effective salience at recall)');
|
|
201
298
|
console.log(' list [--purpose X] [--category X] [--limit N] Table view (default 20 rows)');
|
|
299
|
+
console.log(' revert-backfill Undo the v4.29.0 salience-wall clamp (restores pre-clamp salience)');
|
|
202
300
|
}
|
|
203
301
|
export async function handleMemoryCommand(args) {
|
|
204
302
|
const sub = args[0];
|
|
@@ -213,6 +311,9 @@ export async function handleMemoryCommand(args) {
|
|
|
213
311
|
case 'list':
|
|
214
312
|
code = await cmdList(args.slice(1));
|
|
215
313
|
break;
|
|
314
|
+
case 'revert-backfill':
|
|
315
|
+
code = cmdRevertBackfill();
|
|
316
|
+
break;
|
|
216
317
|
case undefined:
|
|
217
318
|
case '--help':
|
|
218
319
|
case '-h':
|
package/dist/database/init.d.ts
CHANGED
|
@@ -21,6 +21,14 @@ declare function enforceSafeRuntimePath(expandedPath: string, explicitDbPath: bo
|
|
|
21
21
|
declare function inspectDatabaseFile(dbPath: string): DatabaseInspection;
|
|
22
22
|
declare function listHealthyBackups(dbPath: string): BackupCandidate[];
|
|
23
23
|
declare function acquireStartupLock(dbPath: string): void;
|
|
24
|
+
/**
|
|
25
|
+
* Remove stale backup files. Runs once at startup after successful init —
|
|
26
|
+
* prevents unbounded accumulation.
|
|
27
|
+
* - .corrupt.* / .recovery-failed.* — older than 7 days
|
|
28
|
+
* - .pre-backfill-* — older than 30 days (longer TTL so the
|
|
29
|
+
* revert-backfill CLI keeps a usable restore point for a reasonable window)
|
|
30
|
+
*/
|
|
31
|
+
declare function cleanupStaleBackups(dbPath: string): void;
|
|
24
32
|
declare function isLikelyFtsIntegrityIssue(integrityResult: string): boolean;
|
|
25
33
|
declare function attemptFtsRecovery(database: Database.Database): boolean;
|
|
26
34
|
declare function verifyOnDiskIntegrity(dbPath: string): string;
|
|
@@ -33,6 +41,7 @@ export declare const __databaseTestUtils: {
|
|
|
33
41
|
resolveRuntimeInfo: typeof resolveRuntimeInfo;
|
|
34
42
|
enforceSafeRuntimePath: typeof enforceSafeRuntimePath;
|
|
35
43
|
acquireStartupLock: typeof acquireStartupLock;
|
|
44
|
+
cleanupStaleBackups: typeof cleanupStaleBackups;
|
|
36
45
|
};
|
|
37
46
|
/**
|
|
38
47
|
* Initialize the database connection
|
package/dist/database/init.js
CHANGED
|
@@ -307,22 +307,29 @@ function attemptDumpRecovery(dbPath) {
|
|
|
307
307
|
}
|
|
308
308
|
}
|
|
309
309
|
/**
|
|
310
|
-
* Remove
|
|
311
|
-
*
|
|
310
|
+
* Remove stale backup files. Runs once at startup after successful init —
|
|
311
|
+
* prevents unbounded accumulation.
|
|
312
|
+
* - .corrupt.* / .recovery-failed.* — older than 7 days
|
|
313
|
+
* - .pre-backfill-* — older than 30 days (longer TTL so the
|
|
314
|
+
* revert-backfill CLI keeps a usable restore point for a reasonable window)
|
|
312
315
|
*/
|
|
313
316
|
function cleanupStaleBackups(dbPath) {
|
|
314
317
|
const dir = dirname(dbPath);
|
|
315
318
|
const base = basename(dbPath);
|
|
316
319
|
const maxAge = 7 * 24 * 60 * 60 * 1000;
|
|
320
|
+
const preBackfillMaxAge = 30 * 24 * 60 * 60 * 1000;
|
|
317
321
|
const now = Date.now();
|
|
318
322
|
try {
|
|
319
323
|
for (const name of readdirSync(dir)) {
|
|
320
|
-
|
|
324
|
+
const isCorruptOrRecovery = name.startsWith(base + '.corrupt.') || name.startsWith(base + '.recovery-failed.');
|
|
325
|
+
const isPreBackfill = name.startsWith(base + '.pre-backfill-');
|
|
326
|
+
if (!isCorruptOrRecovery && !isPreBackfill)
|
|
321
327
|
continue;
|
|
322
328
|
const filePath = join(dir, name);
|
|
323
329
|
try {
|
|
324
330
|
const age = now - statSync(filePath).mtimeMs;
|
|
325
|
-
|
|
331
|
+
const ttl = isPreBackfill ? preBackfillMaxAge : maxAge;
|
|
332
|
+
if (age > ttl) {
|
|
326
333
|
unlinkSync(filePath);
|
|
327
334
|
}
|
|
328
335
|
}
|
|
@@ -397,6 +404,7 @@ export const __databaseTestUtils = {
|
|
|
397
404
|
resolveRuntimeInfo,
|
|
398
405
|
enforceSafeRuntimePath,
|
|
399
406
|
acquireStartupLock,
|
|
407
|
+
cleanupStaleBackups,
|
|
400
408
|
};
|
|
401
409
|
/**
|
|
402
410
|
* Initialize the database connection
|
|
@@ -520,6 +528,26 @@ export function initDatabase(dbPath) {
|
|
|
520
528
|
db.pragma('wal_autocheckpoint = 100');
|
|
521
529
|
// Register cleanup handlers for graceful shutdown
|
|
522
530
|
registerShutdownHandlers();
|
|
531
|
+
// Pre-backfill file snapshot (v4.29.0, B4): before the one-time salience-wall
|
|
532
|
+
// backfill mutates rows, take an offline restore point of the live file. The
|
|
533
|
+
// in-DB `memories_backfill_backup` shares the fate of the live file that
|
|
534
|
+
// empty-live/corrupt recovery could stash, so this on-disk copy is the
|
|
535
|
+
// independent rollback artefact. Checkpoint WAL first so the main file is
|
|
536
|
+
// current before any count-based recovery can fire. Sentinel-gated: only
|
|
537
|
+
// taken once (before the backfill has run), never on :memory: DBs, and never
|
|
538
|
+
// allowed to block startup.
|
|
539
|
+
try {
|
|
540
|
+
const sentinel = db.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='memories_backfill_backup'").get();
|
|
541
|
+
if (!sentinel && expandedPath !== ':memory:' && existsSync(expandedPath)) {
|
|
542
|
+
db.pragma('wal_checkpoint(TRUNCATE)');
|
|
543
|
+
const snapshotPath = `${expandedPath}.pre-backfill-${Date.now()}`;
|
|
544
|
+
copyFileSync(expandedPath, snapshotPath);
|
|
545
|
+
console.error(`[shieldcortex] pre-backfill snapshot saved: ${snapshotPath}`);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
catch {
|
|
549
|
+
// Best-effort restore point; never block startup.
|
|
550
|
+
}
|
|
523
551
|
// Run migrations FIRST for existing databases
|
|
524
552
|
// This ensures columns exist before schema tries to create indexes on them
|
|
525
553
|
runMigrations(db);
|
|
@@ -528,4 +528,130 @@ export function runMigrations(database) {
|
|
|
528
528
|
catch (err) {
|
|
529
529
|
logIfUnexpectedDdlError(err, 'session_events.sensitivity_level column + index');
|
|
530
530
|
}
|
|
531
|
+
// ---------------------------------------------------------------------------
|
|
532
|
+
// Migration: v4.29.0 — one-time salience-wall backfill (clamp-only).
|
|
533
|
+
//
|
|
534
|
+
// Historically ~80% of stored memories landed at salience=1.0 (the "wall"),
|
|
535
|
+
// collapsing salience as a ranking signal. That stale 1.0 data is all
|
|
536
|
+
// machine-generated (auto / legacy-migrate / plugin captures). Forward-only
|
|
537
|
+
// fixes never cleaned it, so this self-healing auto-migration clamps those
|
|
538
|
+
// rows down to a flat 0.6 on the next process startup after updating.
|
|
539
|
+
//
|
|
540
|
+
// SCOPE IS CLAMP-ONLY. We deliberately do NOT re-derive category or
|
|
541
|
+
// memory_purpose — live data proved the title-prefix heuristic is not
|
|
542
|
+
// authoritative and re-deriving corrupts already-correct labels. The ONLY
|
|
543
|
+
// mutation is lowering salience.
|
|
544
|
+
//
|
|
545
|
+
// Untouched: manual/user rows (explicit user input), pinned rows, and
|
|
546
|
+
// canonical rows. updated_at is intentionally NOT re-stamped — these rows
|
|
547
|
+
// were not user-edited, and re-stamping would trigger a fleet-wide cloud
|
|
548
|
+
// re-sync burst.
|
|
549
|
+
//
|
|
550
|
+
// Run-once guard = existence of `memories_backfill_backup` (NOT user_version,
|
|
551
|
+
// which `.dump`-based disaster recovery does not preserve; the table does).
|
|
552
|
+
// The backup table also powers the revert path (Task 5).
|
|
553
|
+
//
|
|
554
|
+
// This block owns a LOUD catch (NOT logIfUnexpectedDdlError) — a data
|
|
555
|
+
// backfill failure must be visible and retried, not swallowed as idempotent.
|
|
556
|
+
try {
|
|
557
|
+
// Clamp predicate — flat 0.6 for machine rows; manual/user/pinned/canonical
|
|
558
|
+
// untouched. COALESCE guards old fleet DBs with NULL pinned/status.
|
|
559
|
+
const CLAMP_WHERE = `
|
|
560
|
+
salience > 0.6
|
|
561
|
+
AND COALESCE(pinned, 0) = 0
|
|
562
|
+
AND COALESCE(status, 'active') != 'canonical'
|
|
563
|
+
AND capture_method IN ('auto', 'legacy-migrate', 'plugin')`;
|
|
564
|
+
// Run-once guard (outside the txn): if the box already self-healed, bail
|
|
565
|
+
// before doing any FTS or write work.
|
|
566
|
+
const alreadyDone = database.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='memories_backfill_backup'").get();
|
|
567
|
+
if (!alreadyDone) {
|
|
568
|
+
// FTS rebuild FIRST, in its own try/catch (B3). On a drifted-FTS DB the
|
|
569
|
+
// per-row memories_au trigger throws "database disk image is malformed"
|
|
570
|
+
// mid-UPDATE and aborts everything. Repairing the index up front means
|
|
571
|
+
// the trigger firings during the clamp won't throw. A rebuild failure
|
|
572
|
+
// here must NOT abort the backfill, so it is isolated.
|
|
573
|
+
try {
|
|
574
|
+
database.exec("INSERT INTO memories_fts(memories_fts) VALUES('rebuild')");
|
|
575
|
+
}
|
|
576
|
+
catch (ftsErr) {
|
|
577
|
+
const msg = ftsErr instanceof Error ? ftsErr.message : String(ftsErr);
|
|
578
|
+
console.error(`[backfill v4.29.0] FTS rebuild skipped (continuing): ${msg}`);
|
|
579
|
+
}
|
|
580
|
+
// Backup-table creation + the clamp UPDATE in a SINGLE IMMEDIATE
|
|
581
|
+
// transaction (B4). IMMEDIATE grabs the write lock at BEGIN, closing the
|
|
582
|
+
// read-gate -> write race so five concurrent runMigrations processes
|
|
583
|
+
// serialise cleanly. The guard is RE-READ inside the txn: a concurrent
|
|
584
|
+
// winner may have created the table between our outer check and the lock.
|
|
585
|
+
let clamped = 0;
|
|
586
|
+
const run = database.transaction(() => {
|
|
587
|
+
const winnerCreatedTable = database.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='memories_backfill_backup'").get();
|
|
588
|
+
if (winnerCreatedTable) {
|
|
589
|
+
return; // a concurrent winner already created the table; no-op
|
|
590
|
+
}
|
|
591
|
+
// Back up just the mutated column (clamp-only). Doubles as the run-once
|
|
592
|
+
// guard: even a zero-row match creates the (empty) table so the box
|
|
593
|
+
// never re-scans on subsequent startups.
|
|
594
|
+
database.exec(`
|
|
595
|
+
CREATE TABLE IF NOT EXISTS memories_backfill_backup AS
|
|
596
|
+
SELECT id, salience, datetime('now') AS backed_up_at
|
|
597
|
+
FROM memories
|
|
598
|
+
WHERE ${CLAMP_WHERE}
|
|
599
|
+
`);
|
|
600
|
+
const res = database.prepare(`UPDATE memories SET salience = 0.6 WHERE ${CLAMP_WHERE}`).run();
|
|
601
|
+
clamped = res.changes;
|
|
602
|
+
});
|
|
603
|
+
run.immediate();
|
|
604
|
+
// SUCCESS marker (after commit) so the fleet rollout is observable via the
|
|
605
|
+
// existing cloud audit ingest. firewall_result is constrained to
|
|
606
|
+
// ALLOW/BLOCK/QUARANTINE — this is an informational ALLOW marker.
|
|
607
|
+
// ORDERING DEPENDENCY: both markers INSERT into `defence_audit`, which is
|
|
608
|
+
// created earlier in this same function — keep the table migration ahead
|
|
609
|
+
// of this backfill block or the markers will silently no-op (caught below).
|
|
610
|
+
//
|
|
611
|
+
// GATED on clamped > 0: a run that healed nothing (fresh DB, or a box with
|
|
612
|
+
// no stale machine rows) still creates the run-once guard table, but must
|
|
613
|
+
// NOT emit a "healed" telemetry row. An unconditional marker was genuine
|
|
614
|
+
// noise AND tripped the defence-pipeline-bypass invariant (every
|
|
615
|
+
// saveAutoExtractedMemory must produce exactly one defence_audit row —
|
|
616
|
+
// a spurious migration marker made it two).
|
|
617
|
+
if (clamped > 0) {
|
|
618
|
+
try {
|
|
619
|
+
database.prepare(`
|
|
620
|
+
INSERT INTO defence_audit (
|
|
621
|
+
memory_id, project, timestamp,
|
|
622
|
+
source_type, source_identifier,
|
|
623
|
+
trust_score, sensitivity_level, firewall_result,
|
|
624
|
+
anomaly_score, threat_indicators, blocked_patterns,
|
|
625
|
+
reason, fragmentation_score, pipeline_duration_ms
|
|
626
|
+
) VALUES (NULL, NULL, ?, 'migration', 'backfill-v4.29.0', 1.0, 'INTERNAL', 'ALLOW', 0, '[]', '[]', ?, NULL, 0)
|
|
627
|
+
`).run(new Date().toISOString(), JSON.stringify({ status: 'success', clamped, version: 'v4.29.0' }));
|
|
628
|
+
}
|
|
629
|
+
catch {
|
|
630
|
+
// Older schemas may predate the audit columns. The success path itself
|
|
631
|
+
// already committed; the marker is best-effort observability only.
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
catch (err) {
|
|
637
|
+
// LOUD catch — do NOT route through logIfUnexpectedDdlError. Because the
|
|
638
|
+
// guard table is created INSIDE the rolled-back transaction, a failure here
|
|
639
|
+
// leaves NO guard, so the box cleanly retries on next startup.
|
|
640
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
641
|
+
console.error(`[backfill v4.29.0] FAILED, will retry next startup: ${msg}`);
|
|
642
|
+
try {
|
|
643
|
+
database.prepare(`
|
|
644
|
+
INSERT INTO defence_audit (
|
|
645
|
+
memory_id, project, timestamp,
|
|
646
|
+
source_type, source_identifier,
|
|
647
|
+
trust_score, sensitivity_level, firewall_result,
|
|
648
|
+
anomaly_score, threat_indicators, blocked_patterns,
|
|
649
|
+
reason, fragmentation_score, pipeline_duration_ms
|
|
650
|
+
) VALUES (NULL, NULL, ?, 'migration', 'backfill-v4.29.0', 0, 'INTERNAL', 'BLOCK', 0, '[]', '[]', ?, NULL, 0)
|
|
651
|
+
`).run(new Date().toISOString(), JSON.stringify({ status: 'failed', error: msg, version: 'v4.29.0' }));
|
|
652
|
+
}
|
|
653
|
+
catch {
|
|
654
|
+
// Best-effort marker; the stderr line above carries the signal.
|
|
655
|
+
}
|
|
656
|
+
}
|
|
531
657
|
}
|