shieldcortex 4.16.0 → 4.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -0
- package/dashboard/.next/standalone/dashboard/.next/BUILD_ID +1 -1
- package/dashboard/.next/standalone/dashboard/.next/app-path-routes-manifest.json +1 -0
- package/dashboard/.next/standalone/dashboard/.next/build-manifest.json +4 -4
- package/dashboard/.next/standalone/dashboard/.next/prerender-manifest.json +27 -3
- package/dashboard/.next/standalone/dashboard/.next/routes-manifest.json +6 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/admin/page/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/admin/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/cloud/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/capture/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/graph/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/recall/page/next-font-manifest.json +2 -2
- 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/replay/page/app-paths-manifest.json +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/replay/page/build-manifest.json +18 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/replay/page/next-font-manifest.json +11 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/replay/page/react-loadable-manifest.json +1 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/replay/page/server-reference-manifest.json +4 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/replay/page.js +18 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/replay/page.js.map +5 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/replay/page.js.nft.json +1 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/replay/page_client-reference-manifest.js +2 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/review/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/memory/timeline/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/overview/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/audit/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/intercepts/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/iron-dome/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/policies/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/protection/quarantine/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/settings/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/supply-chain/xray/page/next-font-manifest.json +2 -2
- 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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/(dashboard)/xray/page/next-font-manifest.json +2 -2
- 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/page/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error/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/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found/page/next-font-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found/page.js.nft.json +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 +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.rsc +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.rsc +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/admin.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.rsc +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/cloud.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +5 -5
- 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 +5 -5
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.rsc +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/capture.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.rsc +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/graph.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.rsc +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/recall.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.html +9 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.meta +17 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.rsc +31 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory/replay/__PAGE__.segment.rsc +9 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory/replay.segment.rsc +4 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk/memory.segment.rsc +4 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/!KGRhc2hib2FyZCk.segment.rsc +10 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_full.segment.rsc +31 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_head.segment.rsc +5 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_index.segment.rsc +8 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/replay.segments/_tree.segment.rsc +5 -0
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.rsc +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/review.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.rsc +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory/timeline.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.rsc +13 -13
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_full.segment.rsc +13 -13
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/memory.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.rsc +12 -12
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_full.segment.rsc +12 -12
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/overview.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/page/build-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/page/next-font-manifest.json +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/page.js.nft.json +1 -1
- 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 +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/audit.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.rsc +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/intercepts.segments/_tree.segment.rsc +5 -5
- 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 +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/iron-dome.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.rsc +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/policies.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.rsc +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection/quarantine.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.rsc +13 -13
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_full.segment.rsc +13 -13
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/protection.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.rsc +13 -13
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_full.segment.rsc +13 -13
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/settings.segments/_tree.segment.rsc +5 -5
- 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 +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain/xray.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.html +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.rsc +11 -11
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_full.segment.rsc +11 -11
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/supply-chain.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.html +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.rsc +12 -12
- 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 +7 -7
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_full.segment.rsc +12 -12
- 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 +3 -3
- package/dashboard/.next/standalone/dashboard/.next/server/app/xray.segments/_tree.segment.rsc +5 -5
- package/dashboard/.next/standalone/dashboard/.next/server/app-paths-manifest.json +1 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/52d24__next-internal_server_app_(dashboard)_memory_replay_page_actions_b95fee26.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/{9f1d4_@tanstack_68dcbde9._.js → 9f1d4_@tanstack_785e068c._.js} +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/{dashboard_25b568c3._.js → 9f1d4_next_c9fe89e1._.js} +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/{[root-of-the-server]__2de25d56._.js → [root-of-the-server]__60b060b2._.js} +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__7f43774d._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__801e783f._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__8930a320._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_11e120e8._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_2373e047._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_283c47c0._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_2e20858e._.js +4 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_45d60d74._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_5ca514a1._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_5ccb6514._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_609078b2._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/{dashboard_91003e6d._.js → dashboard_92148040._.js} +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_c33b336f._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_fac483f8._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_app_(dashboard)_memory_replay_page_tsx_d2b20535._.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_protection_ProtectionOverview_tsx_54554a97._.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_d191b6dc._.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/middleware-build-manifest.js +2 -2
- package/dashboard/.next/standalone/dashboard/.next/server/next-font-manifest.js +1 -1
- package/dashboard/.next/standalone/dashboard/.next/server/next-font-manifest.json +46 -42
- 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/dashboard/.next/standalone/dashboard/.next/static/chunks/0fa2c109e0d6d832.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/349dace3a1c9af01.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/3505433bf7977a34.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/4d0b86f6afedd8b5.js +3 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/a681787c6c10e4bd.css +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/a7d5d0791c8c6223.css +2 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/afe4beed85ba4fec.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/b2a6e883eaa58507.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/bcfaf98940462e7d.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/f70f563804550a9c.js +1 -0
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/{turbopack-79214717b23f7452.js → turbopack-768a6a8b9db952e0.js} +2 -2
- package/dashboard/.next/standalone/dashboard/.next/static/media/4fa387ec64143e14-s.c36e1862.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/53b9e256198e5412-s.853d50a3.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/5ce348bf30bf5439-s.ebceb24d.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/6306c77e7c8268e4-s.ff4a2084.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/7178b3e590c64307-s.55554cd0.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/797e433ab948586e-s.p.479bea2b.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/7d817b4c03b0c5f1-s.f377b9c4.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/8a480f0b521d4e75-s.ea323500.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/bbc41e54d2fcbd21-s.d1207556.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/caa3a2e1cccd8315-s.p.3b6cae6d.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/fef07dbb0973bf53-s.518e079e.woff2 +0 -0
- package/dist/api/routes/sessions.d.ts +19 -0
- package/dist/api/routes/sessions.js +213 -0
- package/dist/api/visualization-server.js +2 -0
- package/dist/cli/import-jsonl.d.ts +12 -0
- package/dist/cli/import-jsonl.js +83 -0
- package/dist/database/init.js +44 -0
- package/dist/database/schema.sql +31 -0
- package/dist/index.js +8 -0
- package/dist/sessions/capture.d.ts +45 -0
- package/dist/sessions/capture.js +59 -0
- package/dist/sessions/glob.d.ts +38 -0
- package/dist/sessions/glob.js +183 -0
- package/dist/sessions/import-jsonl.d.ts +85 -0
- package/dist/sessions/import-jsonl.js +193 -0
- package/dist/sessions/timeline.d.ts +28 -0
- package/dist/sessions/timeline.js +52 -0
- package/package.json +1 -1
- package/plugins/openclaw/dist/openclaw.plugin.json +1 -1
- package/scripts/lib/session-capture.mjs +102 -0
- package/scripts/pre-compact-hook.mjs +19 -0
- package/scripts/prompt-recall-hook.mjs +30 -4
- package/scripts/session-end-hook.mjs +19 -0
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__521be65c._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__52bd7a9f._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__6f881a23._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_1c5148b9._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_204d1c9e._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_415e5b1b._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_442a0173._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_64f63df9._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_7cb6f257._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_9b8695d8._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_c343baff._.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/2473c16c0c2f6b5f.css +0 -2
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/5f18f98891076bc5.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/b053d5f11418d645.js +0 -3
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/bf725d638cce46d4.css +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/d05e311dfccb5729.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/d9ad4c35fc865415.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/e804a1fda2839550.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/e9f4b8da354f1005.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/chunks/fe6075d947234b5d.js +0 -1
- package/dashboard/.next/standalone/dashboard/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
- package/dashboard/.next/standalone/dashboard/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{6WjF0Utj3STrFgg7vZVPK → 5ueRnXG92g_vRzyK9j89H}/_buildManifest.js +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{6WjF0Utj3STrFgg7vZVPK → 5ueRnXG92g_vRzyK9j89H}/_clientMiddlewareManifest.json +0 -0
- /package/dashboard/.next/standalone/dashboard/.next/static/{6WjF0Utj3STrFgg7vZVPK → 5ueRnXG92g_vRzyK9j89H}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session capture — write side.
|
|
3
|
+
*
|
|
4
|
+
* Hooks (`scripts/prompt-recall-hook.mjs`, `scripts/stop-hook.mjs`,
|
|
5
|
+
* `scripts/session-end-hook.mjs`, etc.) call `recordEvent()` or the
|
|
6
|
+
* batched `recordEvents()` to persist turn-by-turn events into the
|
|
7
|
+
* `session_events` table. The timeline reader in `./timeline.ts`
|
|
8
|
+
* then reassembles them into the replay stream.
|
|
9
|
+
*
|
|
10
|
+
* Distinct from the summary `sessions` table (one row per session)
|
|
11
|
+
* and from `defence_audit` (one row per scan). Captures every event
|
|
12
|
+
* with enough fidelity to scrub/replay.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Six kinds the schema CHECK constraint enforces. Keeping these in
|
|
16
|
+
* sync with `schema.sql` is load-bearing — adding a new kind requires
|
|
17
|
+
* both a schema migration and a code update here.
|
|
18
|
+
*/
|
|
19
|
+
export type SessionEventKind = 'prompt' | 'response' | 'tool_call' | 'tool_result' | 'tool_error' | 'hook_fire';
|
|
20
|
+
export interface SessionEventInput {
|
|
21
|
+
session_id: string;
|
|
22
|
+
/** ISO-8601 timestamp string. Caller-supplied so import order is preserved. */
|
|
23
|
+
ts: string;
|
|
24
|
+
kind: SessionEventKind;
|
|
25
|
+
/**
|
|
26
|
+
* Payload — object (auto-serialised to JSON) or string (stored as-is).
|
|
27
|
+
* Strings are kept verbatim so JSONL importers can pass through raw
|
|
28
|
+
* content without double-encoding.
|
|
29
|
+
*/
|
|
30
|
+
payload: unknown;
|
|
31
|
+
project?: string | null;
|
|
32
|
+
actor?: string | null;
|
|
33
|
+
duration_ms?: number | null;
|
|
34
|
+
audit_id?: number | null;
|
|
35
|
+
}
|
|
36
|
+
/** Insert one event row. Returns the new row id. */
|
|
37
|
+
export declare function recordEvent(input: SessionEventInput): number;
|
|
38
|
+
/**
|
|
39
|
+
* Batched insert wrapped in a single transaction. Used when a hook
|
|
40
|
+
* fires and produces several events at once (e.g. stop-hook emitting
|
|
41
|
+
* a `response` plus N tool_call/tool_result pairs from the just-
|
|
42
|
+
* finished turn). All-or-nothing: a CHECK violation rolls back the
|
|
43
|
+
* lot, so the table never holds half a turn.
|
|
44
|
+
*/
|
|
45
|
+
export declare function recordEvents(inputs: readonly SessionEventInput[]): number[];
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session capture — write side.
|
|
3
|
+
*
|
|
4
|
+
* Hooks (`scripts/prompt-recall-hook.mjs`, `scripts/stop-hook.mjs`,
|
|
5
|
+
* `scripts/session-end-hook.mjs`, etc.) call `recordEvent()` or the
|
|
6
|
+
* batched `recordEvents()` to persist turn-by-turn events into the
|
|
7
|
+
* `session_events` table. The timeline reader in `./timeline.ts`
|
|
8
|
+
* then reassembles them into the replay stream.
|
|
9
|
+
*
|
|
10
|
+
* Distinct from the summary `sessions` table (one row per session)
|
|
11
|
+
* and from `defence_audit` (one row per scan). Captures every event
|
|
12
|
+
* with enough fidelity to scrub/replay.
|
|
13
|
+
*/
|
|
14
|
+
import { getDatabase } from '../database/init.js';
|
|
15
|
+
/**
|
|
16
|
+
* Serialise payload to text. Objects/arrays go through JSON.stringify;
|
|
17
|
+
* strings pass through. This keeps the column NOT NULL constraint
|
|
18
|
+
* satisfied even for empty-object payloads and matches the timeline
|
|
19
|
+
* reader's `JSON.parse` with raw-string fallback.
|
|
20
|
+
*/
|
|
21
|
+
function serialisePayload(payload) {
|
|
22
|
+
if (typeof payload === 'string')
|
|
23
|
+
return payload;
|
|
24
|
+
return JSON.stringify(payload ?? null);
|
|
25
|
+
}
|
|
26
|
+
const INSERT_SQL = `
|
|
27
|
+
INSERT INTO session_events
|
|
28
|
+
(session_id, project, ts, kind, actor, payload, duration_ms, audit_id)
|
|
29
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
30
|
+
`;
|
|
31
|
+
/** Insert one event row. Returns the new row id. */
|
|
32
|
+
export function recordEvent(input) {
|
|
33
|
+
const db = getDatabase();
|
|
34
|
+
const stmt = db.prepare(INSERT_SQL);
|
|
35
|
+
const result = stmt.run(input.session_id, input.project ?? null, input.ts, input.kind, input.actor ?? null, serialisePayload(input.payload), input.duration_ms ?? null, input.audit_id ?? null);
|
|
36
|
+
return Number(result.lastInsertRowid);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Batched insert wrapped in a single transaction. Used when a hook
|
|
40
|
+
* fires and produces several events at once (e.g. stop-hook emitting
|
|
41
|
+
* a `response` plus N tool_call/tool_result pairs from the just-
|
|
42
|
+
* finished turn). All-or-nothing: a CHECK violation rolls back the
|
|
43
|
+
* lot, so the table never holds half a turn.
|
|
44
|
+
*/
|
|
45
|
+
export function recordEvents(inputs) {
|
|
46
|
+
if (inputs.length === 0)
|
|
47
|
+
return [];
|
|
48
|
+
const db = getDatabase();
|
|
49
|
+
const stmt = db.prepare(INSERT_SQL);
|
|
50
|
+
const ids = [];
|
|
51
|
+
const tx = db.transaction((rows) => {
|
|
52
|
+
for (const row of rows) {
|
|
53
|
+
const result = stmt.run(row.session_id, row.project ?? null, row.ts, row.kind, row.actor ?? null, serialisePayload(row.payload), row.duration_ms ?? null, row.audit_id ?? null);
|
|
54
|
+
ids.push(Number(result.lastInsertRowid));
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
tx(inputs);
|
|
58
|
+
return ids;
|
|
59
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal portable glob expansion for the session-capture import flow.
|
|
3
|
+
*
|
|
4
|
+
* Node 22 added `fs.promises.glob`, but ShieldCortex's `engines.node`
|
|
5
|
+
* still declares `>=18.0.0` — using fs/promises.glob would break the
|
|
6
|
+
* CI matrix (Node 20) and any production deployment running an LTS
|
|
7
|
+
* earlier than 22. This module implements the narrow subset of glob
|
|
8
|
+
* semantics the importer actually needs:
|
|
9
|
+
*
|
|
10
|
+
* - Literal paths (no wildcards) — return as-is, caller checks existence.
|
|
11
|
+
* - Shell wildcards `*` `?` `[]` within a single directory segment.
|
|
12
|
+
* - `**` for any-depth recursion (only between `/`-separated segments;
|
|
13
|
+
* `**` inside a filename is treated as a regular `*` `*`).
|
|
14
|
+
*
|
|
15
|
+
* No braces, no extglob, no negation. The JSONL importer doesn't need
|
|
16
|
+
* those and pulling in a full glob package would inflate the install
|
|
17
|
+
* footprint for a single feature.
|
|
18
|
+
*/
|
|
19
|
+
export interface ExpandGlobOptions {
|
|
20
|
+
/**
|
|
21
|
+
* Cap on the number of returned matches. Stops walking once hit so
|
|
22
|
+
* pathological globs against `/` don't lock up the API process.
|
|
23
|
+
*/
|
|
24
|
+
maxMatches?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns `true` when the pattern contains any glob metacharacter the
|
|
28
|
+
* walker treats specially. Used by callers to short-circuit literal
|
|
29
|
+
* paths and skip the walker entirely.
|
|
30
|
+
*/
|
|
31
|
+
export declare function isGlobPattern(pattern: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Expand a glob pattern to absolute file paths. Synchronous because
|
|
34
|
+
* the importer's callsites are already synchronous and the result is
|
|
35
|
+
* always small enough that I/O is not the bottleneck (sessions live
|
|
36
|
+
* on local disk under `~/.claude/projects/`).
|
|
37
|
+
*/
|
|
38
|
+
export declare function expandGlob(pattern: string, options?: ExpandGlobOptions): string[];
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal portable glob expansion for the session-capture import flow.
|
|
3
|
+
*
|
|
4
|
+
* Node 22 added `fs.promises.glob`, but ShieldCortex's `engines.node`
|
|
5
|
+
* still declares `>=18.0.0` — using fs/promises.glob would break the
|
|
6
|
+
* CI matrix (Node 20) and any production deployment running an LTS
|
|
7
|
+
* earlier than 22. This module implements the narrow subset of glob
|
|
8
|
+
* semantics the importer actually needs:
|
|
9
|
+
*
|
|
10
|
+
* - Literal paths (no wildcards) — return as-is, caller checks existence.
|
|
11
|
+
* - Shell wildcards `*` `?` `[]` within a single directory segment.
|
|
12
|
+
* - `**` for any-depth recursion (only between `/`-separated segments;
|
|
13
|
+
* `**` inside a filename is treated as a regular `*` `*`).
|
|
14
|
+
*
|
|
15
|
+
* No braces, no extglob, no negation. The JSONL importer doesn't need
|
|
16
|
+
* those and pulling in a full glob package would inflate the install
|
|
17
|
+
* footprint for a single feature.
|
|
18
|
+
*/
|
|
19
|
+
import { readdirSync, statSync } from 'fs';
|
|
20
|
+
import { join, sep, isAbsolute } from 'path';
|
|
21
|
+
import { homedir } from 'os';
|
|
22
|
+
const DEFAULT_MAX_MATCHES = 10_000;
|
|
23
|
+
/**
|
|
24
|
+
* Returns `true` when the pattern contains any glob metacharacter the
|
|
25
|
+
* walker treats specially. Used by callers to short-circuit literal
|
|
26
|
+
* paths and skip the walker entirely.
|
|
27
|
+
*/
|
|
28
|
+
export function isGlobPattern(pattern) {
|
|
29
|
+
return /[*?[\]]/.test(pattern);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Expand a glob pattern to absolute file paths. Synchronous because
|
|
33
|
+
* the importer's callsites are already synchronous and the result is
|
|
34
|
+
* always small enough that I/O is not the bottleneck (sessions live
|
|
35
|
+
* on local disk under `~/.claude/projects/`).
|
|
36
|
+
*/
|
|
37
|
+
export function expandGlob(pattern, options = {}) {
|
|
38
|
+
const max = options.maxMatches ?? DEFAULT_MAX_MATCHES;
|
|
39
|
+
const expanded = expandHome(pattern);
|
|
40
|
+
if (!isGlobPattern(expanded)) {
|
|
41
|
+
return [expanded];
|
|
42
|
+
}
|
|
43
|
+
const segments = expanded.split(/[\\/]+/);
|
|
44
|
+
// Determine the literal prefix — everything up to the first segment
|
|
45
|
+
// that has a wildcard. Walking starts from there.
|
|
46
|
+
let prefix = isAbsolute(expanded) ? sep : '';
|
|
47
|
+
let i = 0;
|
|
48
|
+
for (; i < segments.length; i++) {
|
|
49
|
+
if (isGlobPattern(segments[i]))
|
|
50
|
+
break;
|
|
51
|
+
prefix = prefix === sep ? sep + segments[i] : prefix ? join(prefix, segments[i]) : segments[i];
|
|
52
|
+
}
|
|
53
|
+
if (prefix === '')
|
|
54
|
+
prefix = '.';
|
|
55
|
+
const remaining = segments.slice(i);
|
|
56
|
+
const matches = [];
|
|
57
|
+
walk(prefix, remaining, matches, max);
|
|
58
|
+
return matches.sort();
|
|
59
|
+
}
|
|
60
|
+
/** Recursive matcher. */
|
|
61
|
+
function walk(currentDir, segments, out, max) {
|
|
62
|
+
if (out.length >= max)
|
|
63
|
+
return;
|
|
64
|
+
if (segments.length === 0)
|
|
65
|
+
return;
|
|
66
|
+
const [head, ...rest] = segments;
|
|
67
|
+
// `**` — match any number of directory levels (including zero).
|
|
68
|
+
if (head === '**') {
|
|
69
|
+
// Zero levels: continue at currentDir with `rest`.
|
|
70
|
+
walk(currentDir, rest, out, max);
|
|
71
|
+
// One-or-more: recurse into every subdirectory with the same `**`.
|
|
72
|
+
let entries = [];
|
|
73
|
+
try {
|
|
74
|
+
entries = readdirSync(currentDir, { withFileTypes: true });
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
for (const entry of entries) {
|
|
80
|
+
if (out.length >= max)
|
|
81
|
+
return;
|
|
82
|
+
if (entry.isDirectory()) {
|
|
83
|
+
walk(join(currentDir, String(entry.name)), segments, out, max);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const regex = segmentToRegex(head);
|
|
89
|
+
const isLastSegment = rest.length === 0;
|
|
90
|
+
let entries = [];
|
|
91
|
+
try {
|
|
92
|
+
entries = readdirSync(currentDir, { withFileTypes: true });
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
for (const entry of entries) {
|
|
98
|
+
if (out.length >= max)
|
|
99
|
+
return;
|
|
100
|
+
const name = String(entry.name);
|
|
101
|
+
if (!regex.test(name))
|
|
102
|
+
continue;
|
|
103
|
+
const full = join(currentDir, name);
|
|
104
|
+
if (isLastSegment) {
|
|
105
|
+
// Only files match a leaf glob — directories aren't useful for the importer.
|
|
106
|
+
if (entry.isFile())
|
|
107
|
+
out.push(full);
|
|
108
|
+
else if (entry.isSymbolicLink()) {
|
|
109
|
+
// Resolve symlinks lazily — a broken link just gets skipped.
|
|
110
|
+
try {
|
|
111
|
+
if (statSync(full).isFile())
|
|
112
|
+
out.push(full);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// ignore
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else if (entry.isDirectory() || entry.isSymbolicLink()) {
|
|
120
|
+
walk(full, rest, out, max);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Convert a single shell-glob path segment to a regex. */
|
|
125
|
+
function segmentToRegex(segment) {
|
|
126
|
+
let pattern = '^';
|
|
127
|
+
let inCharClass = false;
|
|
128
|
+
for (let i = 0; i < segment.length; i++) {
|
|
129
|
+
const c = segment[i];
|
|
130
|
+
if (inCharClass) {
|
|
131
|
+
if (c === ']') {
|
|
132
|
+
inCharClass = false;
|
|
133
|
+
pattern += ']';
|
|
134
|
+
}
|
|
135
|
+
else if (c === '\\') {
|
|
136
|
+
pattern += '\\\\';
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
pattern += escapeForRegex(c);
|
|
140
|
+
}
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
switch (c) {
|
|
144
|
+
case '*':
|
|
145
|
+
pattern += '[^/\\\\]*';
|
|
146
|
+
break;
|
|
147
|
+
case '?':
|
|
148
|
+
pattern += '[^/\\\\]';
|
|
149
|
+
break;
|
|
150
|
+
case '[':
|
|
151
|
+
inCharClass = true;
|
|
152
|
+
pattern += '[';
|
|
153
|
+
break;
|
|
154
|
+
case '.':
|
|
155
|
+
case '+':
|
|
156
|
+
case '(':
|
|
157
|
+
case ')':
|
|
158
|
+
case '{':
|
|
159
|
+
case '}':
|
|
160
|
+
case '|':
|
|
161
|
+
case '^':
|
|
162
|
+
case '$':
|
|
163
|
+
pattern += '\\' + c;
|
|
164
|
+
break;
|
|
165
|
+
default:
|
|
166
|
+
pattern += c;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
pattern += '$';
|
|
170
|
+
return new RegExp(pattern);
|
|
171
|
+
}
|
|
172
|
+
function escapeForRegex(c) {
|
|
173
|
+
return /[.*+?^${}()|[\]\\]/.test(c) ? '\\' + c : c;
|
|
174
|
+
}
|
|
175
|
+
/** Expand a leading `~` to the user's home directory. */
|
|
176
|
+
function expandHome(p) {
|
|
177
|
+
if (p === '~')
|
|
178
|
+
return homedir();
|
|
179
|
+
if (p.startsWith('~/') || p.startsWith('~\\')) {
|
|
180
|
+
return join(homedir(), p.slice(2));
|
|
181
|
+
}
|
|
182
|
+
return p;
|
|
183
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSONL transcript importer for Claude Code session files.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code writes session transcripts to `~/.claude/projects/<slug>/
|
|
5
|
+
* <session-uuid>.jsonl`. Each line is a JSON object. Conversation lines
|
|
6
|
+
* have shape `{type, sessionId, timestamp, message: {role, content}}`
|
|
7
|
+
* where `content` is an Anthropic SDK content-block array
|
|
8
|
+
* (`text|thinking|tool_use|tool_result`).
|
|
9
|
+
*
|
|
10
|
+
* Mapping to `session_events.kind`:
|
|
11
|
+
*
|
|
12
|
+
* user.text → prompt
|
|
13
|
+
* assistant.text → response
|
|
14
|
+
* assistant.tool_use → tool_call
|
|
15
|
+
* user.tool_result → tool_result
|
|
16
|
+
* thinking → (skipped — not user-replayable in v1)
|
|
17
|
+
*
|
|
18
|
+
* Non-conversation lines (`ai-title`, `attachment`, `system`,
|
|
19
|
+
* `queue-operation`, etc.) are skipped. Idempotent on re-import: each
|
|
20
|
+
* row carries a sha256 `content_hash` of `kind|payload`, and the
|
|
21
|
+
* `idx_session_events_dedupe` UNIQUE index drops collisions silently
|
|
22
|
+
* via `INSERT OR IGNORE`.
|
|
23
|
+
*
|
|
24
|
+
* Lossy by design — agentmemory documents the same scope:
|
|
25
|
+
* - Anthropic-internal cache markers, partial-message frames, and
|
|
26
|
+
* non-string tool_result encodings beyond plain text are not
|
|
27
|
+
* preserved.
|
|
28
|
+
* - Things we WILL preserve: prompts, assistant text, tool name +
|
|
29
|
+
* args + result, and timestamps.
|
|
30
|
+
*/
|
|
31
|
+
import type { SessionEventInput } from './capture.js';
|
|
32
|
+
export interface TranscriptLine {
|
|
33
|
+
type?: string;
|
|
34
|
+
sessionId?: string;
|
|
35
|
+
timestamp?: string;
|
|
36
|
+
message?: {
|
|
37
|
+
role?: 'user' | 'assistant';
|
|
38
|
+
content?: ContentBlock[];
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
type ContentBlock = {
|
|
42
|
+
type: 'text';
|
|
43
|
+
text?: string;
|
|
44
|
+
} | {
|
|
45
|
+
type: 'thinking';
|
|
46
|
+
thinking?: string;
|
|
47
|
+
} | {
|
|
48
|
+
type: 'tool_use';
|
|
49
|
+
id?: string;
|
|
50
|
+
name?: string;
|
|
51
|
+
input?: unknown;
|
|
52
|
+
} | {
|
|
53
|
+
type: 'tool_result';
|
|
54
|
+
tool_use_id?: string;
|
|
55
|
+
content?: unknown;
|
|
56
|
+
} | {
|
|
57
|
+
type: string;
|
|
58
|
+
[key: string]: unknown;
|
|
59
|
+
};
|
|
60
|
+
export interface ImportResult {
|
|
61
|
+
sessionId: string | null;
|
|
62
|
+
eventCount: number;
|
|
63
|
+
/** Lines that produced zero events — non-conversation types + parse errors. */
|
|
64
|
+
skipped: number;
|
|
65
|
+
/** Lines whose JSON parsed but were rejected (missing required fields, unknown block types). */
|
|
66
|
+
malformed: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Pure mapper: one transcript line → 0..N `SessionEventInput`s.
|
|
70
|
+
*
|
|
71
|
+
* Exported so unit tests can exercise the mapping in isolation without
|
|
72
|
+
* standing up a database. Returns `[]` for any line that doesn't yield
|
|
73
|
+
* replayable events (thinking blocks, ai-title, missing fields, etc.) —
|
|
74
|
+
* the caller treats an empty array as "skipped".
|
|
75
|
+
*/
|
|
76
|
+
export declare function parseTranscriptLine(line: unknown): SessionEventInput[];
|
|
77
|
+
/**
|
|
78
|
+
* Import one JSONL file. Wraps the whole import in a single transaction
|
|
79
|
+
* so a mid-file error rolls back cleanly — better-sqlite3's transaction
|
|
80
|
+
* helper restores DB state if the callback throws. Malformed lines do
|
|
81
|
+
* NOT throw — they're counted and skipped so a single bad row never
|
|
82
|
+
* blocks the rest of the file.
|
|
83
|
+
*/
|
|
84
|
+
export declare function importJsonlTranscript(path: string): ImportResult;
|
|
85
|
+
export {};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSONL transcript importer for Claude Code session files.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code writes session transcripts to `~/.claude/projects/<slug>/
|
|
5
|
+
* <session-uuid>.jsonl`. Each line is a JSON object. Conversation lines
|
|
6
|
+
* have shape `{type, sessionId, timestamp, message: {role, content}}`
|
|
7
|
+
* where `content` is an Anthropic SDK content-block array
|
|
8
|
+
* (`text|thinking|tool_use|tool_result`).
|
|
9
|
+
*
|
|
10
|
+
* Mapping to `session_events.kind`:
|
|
11
|
+
*
|
|
12
|
+
* user.text → prompt
|
|
13
|
+
* assistant.text → response
|
|
14
|
+
* assistant.tool_use → tool_call
|
|
15
|
+
* user.tool_result → tool_result
|
|
16
|
+
* thinking → (skipped — not user-replayable in v1)
|
|
17
|
+
*
|
|
18
|
+
* Non-conversation lines (`ai-title`, `attachment`, `system`,
|
|
19
|
+
* `queue-operation`, etc.) are skipped. Idempotent on re-import: each
|
|
20
|
+
* row carries a sha256 `content_hash` of `kind|payload`, and the
|
|
21
|
+
* `idx_session_events_dedupe` UNIQUE index drops collisions silently
|
|
22
|
+
* via `INSERT OR IGNORE`.
|
|
23
|
+
*
|
|
24
|
+
* Lossy by design — agentmemory documents the same scope:
|
|
25
|
+
* - Anthropic-internal cache markers, partial-message frames, and
|
|
26
|
+
* non-string tool_result encodings beyond plain text are not
|
|
27
|
+
* preserved.
|
|
28
|
+
* - Things we WILL preserve: prompts, assistant text, tool name +
|
|
29
|
+
* args + result, and timestamps.
|
|
30
|
+
*/
|
|
31
|
+
import { readFileSync, existsSync } from 'fs';
|
|
32
|
+
import { createHash } from 'crypto';
|
|
33
|
+
import { getDatabase } from '../database/init.js';
|
|
34
|
+
/**
|
|
35
|
+
* Pure mapper: one transcript line → 0..N `SessionEventInput`s.
|
|
36
|
+
*
|
|
37
|
+
* Exported so unit tests can exercise the mapping in isolation without
|
|
38
|
+
* standing up a database. Returns `[]` for any line that doesn't yield
|
|
39
|
+
* replayable events (thinking blocks, ai-title, missing fields, etc.) —
|
|
40
|
+
* the caller treats an empty array as "skipped".
|
|
41
|
+
*/
|
|
42
|
+
export function parseTranscriptLine(line) {
|
|
43
|
+
if (!line || typeof line !== 'object')
|
|
44
|
+
return [];
|
|
45
|
+
const l = line;
|
|
46
|
+
// Only conversation lines yield events.
|
|
47
|
+
if (l.type !== 'user' && l.type !== 'assistant')
|
|
48
|
+
return [];
|
|
49
|
+
if (typeof l.sessionId !== 'string' || l.sessionId.length === 0)
|
|
50
|
+
return [];
|
|
51
|
+
if (typeof l.timestamp !== 'string' || l.timestamp.length === 0)
|
|
52
|
+
return [];
|
|
53
|
+
const content = l.message?.content;
|
|
54
|
+
if (!Array.isArray(content) || content.length === 0)
|
|
55
|
+
return [];
|
|
56
|
+
const events = [];
|
|
57
|
+
for (const block of content) {
|
|
58
|
+
const event = blockToEvent(block, l);
|
|
59
|
+
if (event)
|
|
60
|
+
events.push(event);
|
|
61
|
+
}
|
|
62
|
+
return events;
|
|
63
|
+
}
|
|
64
|
+
function blockToEvent(block, line) {
|
|
65
|
+
const session_id = line.sessionId;
|
|
66
|
+
const ts = line.timestamp;
|
|
67
|
+
if (block.type === 'thinking')
|
|
68
|
+
return null;
|
|
69
|
+
if (block.type === 'text' && line.type === 'user') {
|
|
70
|
+
const text = typeof block.text === 'string' ? block.text : '';
|
|
71
|
+
if (!text)
|
|
72
|
+
return null;
|
|
73
|
+
return { session_id, ts, kind: 'prompt', payload: { text } };
|
|
74
|
+
}
|
|
75
|
+
if (block.type === 'text' && line.type === 'assistant') {
|
|
76
|
+
const text = typeof block.text === 'string' ? block.text : '';
|
|
77
|
+
if (!text)
|
|
78
|
+
return null;
|
|
79
|
+
return {
|
|
80
|
+
session_id,
|
|
81
|
+
ts,
|
|
82
|
+
kind: 'response',
|
|
83
|
+
payload: { text },
|
|
84
|
+
actor: 'assistant',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
if (block.type === 'tool_use' && line.type === 'assistant') {
|
|
88
|
+
const toolBlock = block;
|
|
89
|
+
return {
|
|
90
|
+
session_id,
|
|
91
|
+
ts,
|
|
92
|
+
kind: 'tool_call',
|
|
93
|
+
payload: {
|
|
94
|
+
tool_use_id: toolBlock.id ?? null,
|
|
95
|
+
name: toolBlock.name ?? null,
|
|
96
|
+
input: toolBlock.input ?? null,
|
|
97
|
+
},
|
|
98
|
+
actor: 'assistant',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (block.type === 'tool_result' && line.type === 'user') {
|
|
102
|
+
const tr = block;
|
|
103
|
+
return {
|
|
104
|
+
session_id,
|
|
105
|
+
ts,
|
|
106
|
+
kind: 'tool_result',
|
|
107
|
+
payload: {
|
|
108
|
+
tool_use_id: tr.tool_use_id ?? null,
|
|
109
|
+
content: tr.content ?? null,
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
/** SHA-256 of `kind|payload-as-canonical-json`. 64-char hex string. */
|
|
116
|
+
function hashEvent(kind, payload) {
|
|
117
|
+
const canonical = typeof payload === 'string' ? payload : JSON.stringify(payload ?? null);
|
|
118
|
+
return createHash('sha256').update(`${kind}|${canonical}`).digest('hex');
|
|
119
|
+
}
|
|
120
|
+
const INSERT_OR_IGNORE_SQL = `
|
|
121
|
+
INSERT OR IGNORE INTO session_events
|
|
122
|
+
(session_id, project, ts, kind, actor, payload, duration_ms, audit_id, content_hash)
|
|
123
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
124
|
+
`;
|
|
125
|
+
/**
|
|
126
|
+
* Import one JSONL file. Wraps the whole import in a single transaction
|
|
127
|
+
* so a mid-file error rolls back cleanly — better-sqlite3's transaction
|
|
128
|
+
* helper restores DB state if the callback throws. Malformed lines do
|
|
129
|
+
* NOT throw — they're counted and skipped so a single bad row never
|
|
130
|
+
* blocks the rest of the file.
|
|
131
|
+
*/
|
|
132
|
+
export function importJsonlTranscript(path) {
|
|
133
|
+
if (!existsSync(path)) {
|
|
134
|
+
throw new Error(`JSONL transcript not found: ${path}`);
|
|
135
|
+
}
|
|
136
|
+
const raw = readFileSync(path, 'utf-8');
|
|
137
|
+
const lines = raw.split(/\r?\n/);
|
|
138
|
+
const rows = [];
|
|
139
|
+
let sessionId = null;
|
|
140
|
+
let skipped = 0;
|
|
141
|
+
let malformed = 0;
|
|
142
|
+
for (const rawLine of lines) {
|
|
143
|
+
const trimmed = rawLine.trim();
|
|
144
|
+
if (trimmed.length === 0)
|
|
145
|
+
continue; // blank lines aren't skipped — they're just whitespace
|
|
146
|
+
let parsed;
|
|
147
|
+
try {
|
|
148
|
+
parsed = JSON.parse(trimmed);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
malformed++;
|
|
152
|
+
skipped++;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const events = parseTranscriptLine(parsed);
|
|
156
|
+
if (events.length === 0) {
|
|
157
|
+
skipped++;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (sessionId === null && events[0]?.session_id) {
|
|
161
|
+
sessionId = events[0].session_id;
|
|
162
|
+
}
|
|
163
|
+
for (const event of events) {
|
|
164
|
+
rows.push({
|
|
165
|
+
...event,
|
|
166
|
+
content_hash: hashEvent(event.kind, event.payload),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (rows.length === 0) {
|
|
171
|
+
return { sessionId, eventCount: 0, skipped, malformed };
|
|
172
|
+
}
|
|
173
|
+
const db = getDatabase();
|
|
174
|
+
const stmt = db.prepare(INSERT_OR_IGNORE_SQL);
|
|
175
|
+
const before = db.prepare('SELECT COUNT(*) AS c FROM session_events').get().c;
|
|
176
|
+
const tx = db.transaction((batch) => {
|
|
177
|
+
for (const row of batch) {
|
|
178
|
+
stmt.run(row.session_id, row.project ?? null, row.ts, row.kind, row.actor ?? null, typeof row.payload === 'string' ? row.payload : JSON.stringify(row.payload ?? null), row.duration_ms ?? null, row.audit_id ?? null, row.content_hash);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
tx(rows);
|
|
182
|
+
const after = db.prepare('SELECT COUNT(*) AS c FROM session_events').get().c;
|
|
183
|
+
const inserted = after - before;
|
|
184
|
+
// `eventCount` reflects the total events parsed from this file regardless
|
|
185
|
+
// of whether the dedupe index dropped them. Caller can compare to
|
|
186
|
+
// `inserted` (via row count diff) to see how many were duplicates.
|
|
187
|
+
return {
|
|
188
|
+
sessionId,
|
|
189
|
+
eventCount: rows.length,
|
|
190
|
+
skipped: skipped + (rows.length - inserted),
|
|
191
|
+
malformed,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session capture — read side.
|
|
3
|
+
*
|
|
4
|
+
* `getTimeline(sessionId)` returns every event for a session, sorted
|
|
5
|
+
* by `ts` ascending, with payload JSON.parse'd back into a JS value
|
|
6
|
+
* (or surfaced as a raw string when the payload was deliberately
|
|
7
|
+
* stored as plain text). Powers the dashboard replay scrubber.
|
|
8
|
+
*
|
|
9
|
+
* Kept deliberately minimal — pagination, filtering by kind, and
|
|
10
|
+
* cross-session timelines belong on the API route (`./api/routes/
|
|
11
|
+
* sessions.ts`) above, not in this reader.
|
|
12
|
+
*/
|
|
13
|
+
import type { SessionEventKind } from './capture.js';
|
|
14
|
+
export interface SessionEventRow {
|
|
15
|
+
id: number;
|
|
16
|
+
session_id: string;
|
|
17
|
+
project: string | null;
|
|
18
|
+
ts: string;
|
|
19
|
+
kind: SessionEventKind;
|
|
20
|
+
actor: string | null;
|
|
21
|
+
/** Parsed JSON (object/array/primitive) or raw string fall-through. */
|
|
22
|
+
payload: unknown;
|
|
23
|
+
duration_ms: number | null;
|
|
24
|
+
audit_id: number | null;
|
|
25
|
+
created_at: string;
|
|
26
|
+
}
|
|
27
|
+
/** All events for a session, in `ts` ascending order. */
|
|
28
|
+
export declare function getTimeline(sessionId: string): SessionEventRow[];
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session capture — read side.
|
|
3
|
+
*
|
|
4
|
+
* `getTimeline(sessionId)` returns every event for a session, sorted
|
|
5
|
+
* by `ts` ascending, with payload JSON.parse'd back into a JS value
|
|
6
|
+
* (or surfaced as a raw string when the payload was deliberately
|
|
7
|
+
* stored as plain text). Powers the dashboard replay scrubber.
|
|
8
|
+
*
|
|
9
|
+
* Kept deliberately minimal — pagination, filtering by kind, and
|
|
10
|
+
* cross-session timelines belong on the API route (`./api/routes/
|
|
11
|
+
* sessions.ts`) above, not in this reader.
|
|
12
|
+
*/
|
|
13
|
+
import { getDatabase } from '../database/init.js';
|
|
14
|
+
/**
|
|
15
|
+
* Reverse of `capture.serialisePayload`: try JSON.parse, fall back to
|
|
16
|
+
* the raw string if the payload was stored as plain text. We don't
|
|
17
|
+
* throw on un-parseable — the importer may legitimately ingest non-JSON
|
|
18
|
+
* tool output, and a replay viewer that crashes on bad data is useless.
|
|
19
|
+
*/
|
|
20
|
+
function deserialisePayload(text) {
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(text);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return text;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function hydrate(row) {
|
|
29
|
+
return {
|
|
30
|
+
id: row.id,
|
|
31
|
+
session_id: row.session_id,
|
|
32
|
+
project: row.project,
|
|
33
|
+
ts: row.ts,
|
|
34
|
+
kind: row.kind,
|
|
35
|
+
actor: row.actor,
|
|
36
|
+
payload: deserialisePayload(row.payload),
|
|
37
|
+
duration_ms: row.duration_ms,
|
|
38
|
+
audit_id: row.audit_id,
|
|
39
|
+
created_at: row.created_at,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** All events for a session, in `ts` ascending order. */
|
|
43
|
+
export function getTimeline(sessionId) {
|
|
44
|
+
const db = getDatabase();
|
|
45
|
+
const rows = db
|
|
46
|
+
.prepare(`SELECT id, session_id, project, ts, kind, actor, payload, duration_ms, audit_id, created_at
|
|
47
|
+
FROM session_events
|
|
48
|
+
WHERE session_id = ?
|
|
49
|
+
ORDER BY ts ASC, id ASC`)
|
|
50
|
+
.all(sessionId);
|
|
51
|
+
return rows.map(hydrate);
|
|
52
|
+
}
|